Introduce `callee_type` metadata which will be attached to the indirect call instructions. The `callee_type` metadata will be used to generate `.callgraph` section described in this RFC: https://lists.llvm.org/pipermail/llvm-dev/2021-July/151739.html Reviewers: morehouse, petrhosek, nikic, ilovepi Reviewed By: nikic, ilovepi Pull Request: https://github.com/llvm/llvm-project/pull/87573
34 lines
1.5 KiB
ReStructuredText
34 lines
1.5 KiB
ReStructuredText
====================
|
|
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 :doc:`TypeMetadata`) with each ``!type``
|
|
metadata pointing to a callee's :ref:`type identifier <calleetype-type-identifier>`.
|
|
LLVM's `Control Flow Integrity (CFI)`_ also uses the ``!type`` metadata in its implementation.
|
|
|
|
.. _Control Flow Integrity (CFI): https://clang.llvm.org/docs/ControlFlowIntegrity.html
|
|
|
|
.. _calleetype-type-identifier:
|
|
|
|
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.
|