Callee Type Metadata¶
Introduction¶
This !callee_type
metadata is introduced to support the generation of a call graph
section in the object file. The !callee_type
metadata is used
to identify the types of the intended callees of indirect call instructions. The !callee_type
metadata is a
list of one or more generalized !type
metadata objects (See Type Metadata) with each !type
metadata pointing to a callee’s type identifier.
LLVM’s Control Flow Integrity (CFI) also uses the !type
metadata in its implementation.
Type identifier¶
The type for an indirect call target is the callee’s function signature. Mapping from a type to an identifier is an ABI detail. In the current implementation, an identifier of type T is computed as follows:
Obtain the generalized mangled name for “typeinfo name for T”.
Compute MD5 hash of the name as a string.
Reinterpret the first 8 bytes of the hash as a little-endian 64-bit integer.
To avoid mismatched pointer types, generalizations are applied.
Pointers in return and argument types are treated as equivalent as long as the qualifiers for the
type they point to match. For example, char*
, char**
, and int*
are considered equivalent
types. However, char*
and const char*
are considered distinct types.