[PDB Docs] Add skeleton of documentation for CodeView symbols.

llvm-svn: 358197
This commit is contained in:
Zachary Turner 2019-04-11 17:29:48 +00:00
parent e7f2cbe45a
commit 4afa6dcabe
2 changed files with 258 additions and 27 deletions

View File

@ -2,3 +2,234 @@
CodeView Symbol Records
=====================================
.. contents::
:local:
.. _symbols_intro:
Introduction
============
This document describes the usage and serialization format of the various
CodeView symbol records that LLVM understands. Like
:doc:`CodeView Type Records <CodeViewTypes>`, we describe only the important
types which are generated by modern C++ toolchains.
Record Categories
=================
Symbol records share one major similarity with :doc:`type records <CodeViewTypes>`:
They start with the same :ref:`record prefix <leaf_types>`, which we will not describe
again (refer to the previous link for a description). As a result of this, a sequence
of symbol records can be processed with largely the same code as that which processes
type records. There are several important differences between symbol and type records:
* Symbol records only appear in the :doc:`PublicStream`, :doc:`GlobalStream`, and
:doc:`Module Info Streams <ModiStream>`.
* Type records only appear in the :doc:`TPI & IPI streams <TpiStream>`.
* While types are referenced from other CodeView records via :ref:`type indices <type_indices>`,
symbol records are referenced by the byte offset of the record in the stream that it appears
in.
* Types can reference types (via type indices), and symbols can reference both types (via type
indices) and symbols (via offsets), but types can never reference symbols.
* There is no notion of :ref:`Leaf Records <leaf_types>` and :ref:`Member Records <member_types>`
as there are with types. Every symbol record describes is own length.
* Certain special symbol records begin a "scope". For these records, all following records
up until the next ``S_END`` record are "children" of this symbol record. For example,
given a symbol record which describes a certain function, all local variables of this
function would appear following the function up until the corresponding ``S_END`` record.
Finally, there are three general categories of symbol record, grouped by where they are legal
to appear in a PDB file. Public Symbols (which appear only in the
:doc:`publics stream <PublicStream>`), Global Symbols (which appear only in the
:doc:`globals stream <GlobalStream>`) and module symbols (which appear in the
:doc:`module info stream <ModiStream>`).
.. _public_symbols:
Public Symbols
--------------
S_PUB32 (0x110e)
^^^^^^^^^^^^^^^^
.. _global_symbols:
Global Symbols
--------------
S_GDATA32
^^^^^^^^^^
S_GTHREAD32 (0x1113)
^^^^^^^^^^^^^^^^^^^^
S_PROCREF (0x1125)
^^^^^^^^^^^^^^^^^^
S_LPROCREF (0x1127)
^^^^^^^^^^^^^^^^^^^
S_GMANDATA (0x111d)
^^^^^^^^^^^^^^^^^^^
.. _module_symbols:
Module Symbols
--------------
S_END (0x0006)
^^^^^^^^^^^^^^
S_FRAMEPROC (0x1012)
^^^^^^^^^^^^^^^^^^^^
S_OBJNAME (0x1101)
^^^^^^^^^^^^^^^^^^
S_THUNK32 (0x1102)
^^^^^^^^^^^^^^^^^^
S_BLOCK32 (0x1103)
^^^^^^^^^^^^^^^^^^
S_LABEL32 (0x1105)
^^^^^^^^^^^^^^^^^^
S_REGISTER (0x1106)
^^^^^^^^^^^^^^^^^^^
S_BPREL32 (0x110b)
^^^^^^^^^^^^^^^^^^
S_LPROC32 (0x110f)
^^^^^^^^^^^^^^^^^^
S_GPROC32 (0x1110)
^^^^^^^^^^^^^^^^^^
S_REGREL32 (0x1111)
^^^^^^^^^^^^^^^^^^^
S_COMPILE2 (0x1116)
^^^^^^^^^^^^^^^^^^^
S_UNAMESPACE (0x1124)
^^^^^^^^^^^^^^^^^^^^^
S_TRAMPOLINE (0x112c)
^^^^^^^^^^^^^^^^^^^^^
S_SECTION (0x1136)
^^^^^^^^^^^^^^^^^^
S_COFFGROUP (0x1137)
^^^^^^^^^^^^^^^^^^^^
S_EXPORT (0x1138)
^^^^^^^^^^^^^^^^^
S_CALLSITEINFO (0x1139)
^^^^^^^^^^^^^^^^^^^^^^^
S_FRAMECOOKIE (0x113a)
^^^^^^^^^^^^^^^^^^^^^^
S_COMPILE3 (0x113c)
^^^^^^^^^^^^^^^^^^^
S_ENVBLOCK (0x113d)
^^^^^^^^^^^^^^^^^^^
S_LOCAL (0x113e)
^^^^^^^^^^^^^^^^
S_DEFRANGE (0x113f)
^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_SUBFIELD (0x1140)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_REGISTER (0x1141)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_FRAMEPOINTER_REL (0x1142)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_SUBFIELD_REGISTER (0x1143)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE (0x1144)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_DEFRANGE_REGISTER_REL (0x1145)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
S_LPROC32_ID (0x1146)
^^^^^^^^^^^^^^^^^^^^^
S_GPROC32_ID (0x1147)
^^^^^^^^^^^^^^^^^^^^^
S_BUILDINFO (0x114c)
^^^^^^^^^^^^^^^^^^^^
S_INLINESITE (0x114d)
^^^^^^^^^^^^^^^^^^^^^
S_INLINESITE_END (0x114e)
^^^^^^^^^^^^^^^^^^^^^^^^^
S_PROC_ID_END (0x114f)
^^^^^^^^^^^^^^^^^^^^^^
S_FILESTATIC (0x1153)
^^^^^^^^^^^^^^^^^^^^^
S_LPROC32_DPC (0x1155)
^^^^^^^^^^^^^^^^^^^^^^
S_LPROC32_DPC_ID (0x1156)
^^^^^^^^^^^^^^^^^^^^^^^^^
S_CALLEES (0x115a)
^^^^^^^^^^^^^^^^^^
S_CALLERS (0x115b)
^^^^^^^^^^^^^^^^^^
S_HEAPALLOCSITE (0x115e)
^^^^^^^^^^^^^^^^^^^^^^^^
S_FASTLINK (0x1167)
^^^^^^^^^^^^^^^^^^^
S_INLINEES (0x1168)
^^^^^^^^^^^^^^^^^^^
.. _module_and_global_symbols:
Symbols which can go in either/both of the module info stream & global stream
-----------------------------------------------------------------------------
S_CONSTANT (0x1107)
^^^^^^^^^^^^^^^^^^^
S_UDT (0x1108)
^^^^^^^^^^^^^^
S_LDATA32 (0x110c)
^^^^^^^^^^^^^^^^^^
S_LTHREAD32 (0x1112)
^^^^^^^^^^^^^^^^^^^^
S_LMANDATA (0x111c)
^^^^^^^^^^^^^^^^^^^
S_MANCONSTANT (0x112d)
^^^^^^^^^^^^^^^^^^^^^^