brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 0f218db Raw
273 lines · plain
1=====================================2CodeView Symbol Records3=====================================4 5 6.. contents::7   :local:8 9.. _symbols_intro:10 11Introduction12============13 14This document describes the usage and serialization format of the various15CodeView symbol records that LLVM understands.  Like16:doc:`CodeView Type Records <CodeViewTypes>`, we describe only the important17types which are generated by modern C++ toolchains.18 19Record Categories20=================21 22Symbol records share one major similarity with :doc:`type records <CodeViewTypes>`:23They start with the same :ref:`record prefix <leaf_types>`, which we will not describe24again (refer to the previous link for a description).  As a result of this, a sequence25of symbol records can be processed with largely the same code as that which processes26type records.  There are several important differences between symbol and type records:27 28* Symbol records only appear in the :doc:`PublicStream`, :doc:`GlobalStream`, and29  :doc:`Module Info Streams <ModiStream>`.30* Type records only appear in the :doc:`TPI & IPI streams <TpiStream>`.31* While types are referenced from other CodeView records via :ref:`type indices <type_indices>`,32  symbol records are referenced by the byte offset of the record in the stream that it appears33  in.34* Types can reference types (via type indices), and symbols can reference both types (via type35  indices) and symbols (via offsets), but types can never reference symbols.36* There is no notion of :ref:`Leaf Records <leaf_types>` and :ref:`Member Records <member_types>`37  as there are with types.  Every symbol record describes is own length.38* Certain special symbol records begin a "scope".  For these records, all following records39  up until the next ``S_END`` record are "children" of this symbol record.  For example,40  given a symbol record which describes a certain function, all local variables of this41  function would appear following the function up until the corresponding ``S_END`` record.42 43Finally, there are three general categories of symbol record, grouped by where they are legal44to appear in a PDB file.  Public Symbols (which appear only in the45:doc:`publics stream <PublicStream>`), Global Symbols (which appear only in the46:doc:`globals stream <GlobalStream>`) and module symbols (which appear in the47:doc:`module info stream <ModiStream>`).48 49 50.. _public_symbols:51 52Public Symbols53--------------54 55Public symbols are the CodeView equivalent of DWARF ``.debug_pubnames``.  There56is one public symbol record for every function or variable in the program that57has a mangled name.  The :doc:`Publics Stream <PublicStream>`, which contains these58records, additionally contains a hash table that allows one to quickly locate a59record by mangled name.60 61S_PUB32 (0x110e)62^^^^^^^^^^^^^^^^63 64There is only type of public symbol, an ``S_PUB32`` which describes a mangled65name, a flag indicating what kind of symbol it is (e.g. function, variable), and66the symbol's address.  The :ref:`dbi_section_map_substream` of the67:doc:`DBI Stream <DbiStream>` can be consulted to determine what module this address68corresponds to, and from there that module's :doc:`module debug stream <ModiStream>`69can be consulted to locate full information for the symbol with the given address.70 71.. _global_symbols:72 73Global Symbols74--------------75 76While there is one :ref:`public symbol <public_symbols>` for every symbol in the77program with `external` linkage, there is one global symbol for every symbol in the78program with linkage (including internal linkage).  As a result, global symbols do79not describe a mangled name *or* an address, since symbols with internal linkage80need not have any mangling at all, and also may not have an address.  Thus, all81global symbols simply refer directly to the full symbol record via a module/offset82combination.83 84Similarly to :ref:`public symbols <public_symbols>`, all global symbols are contained85in a single :doc:`Globals Stream <GlobalStream>`, which contains a hash table mapping86fully qualified name to the corresponding record in the globals stream (which as87mentioned, then contains information allowing one to locate the full record in the88corresponding module symbol stream).89 90Note that a consequence and limitation of this design is that program-wide lookup91by anything other than an exact textually matching fully-qualified name of whatever92the compiler decided to emit is impractical.  This differs from DWARF, where even93though we don't necessarily have O(1) lookup by basename within a given scope (including94O(1) scope, we at least have O(n) access within a given scope).95 96.. important::97   Program-wide lookup of names by anything other than an exact textually matching fully98   qualified name is not possible.99 100 101S_GDATA32102^^^^^^^^^^103 104S_GTHREAD32 (0x1113)105^^^^^^^^^^^^^^^^^^^^106 107S_PROCREF (0x1125)108^^^^^^^^^^^^^^^^^^109 110S_LPROCREF (0x1127)111^^^^^^^^^^^^^^^^^^^112 113S_GMANDATA (0x111d)114^^^^^^^^^^^^^^^^^^^115 116.. _module_symbols:117 118Module Symbols119--------------120 121S_END (0x0006)122^^^^^^^^^^^^^^123 124S_FRAMEPROC (0x1012)125^^^^^^^^^^^^^^^^^^^^126 127S_OBJNAME (0x1101)128^^^^^^^^^^^^^^^^^^129 130S_THUNK32 (0x1102)131^^^^^^^^^^^^^^^^^^132 133S_BLOCK32 (0x1103)134^^^^^^^^^^^^^^^^^^135 136S_LABEL32 (0x1105)137^^^^^^^^^^^^^^^^^^138 139S_REGISTER (0x1106)140^^^^^^^^^^^^^^^^^^^141 142S_BPREL32 (0x110b)143^^^^^^^^^^^^^^^^^^144 145S_LPROC32 (0x110f)146^^^^^^^^^^^^^^^^^^147 148S_GPROC32 (0x1110)149^^^^^^^^^^^^^^^^^^150 151S_REGREL32 (0x1111)152^^^^^^^^^^^^^^^^^^^153 154S_COMPILE2 (0x1116)155^^^^^^^^^^^^^^^^^^^156 157S_UNAMESPACE (0x1124)158^^^^^^^^^^^^^^^^^^^^^159 160S_TRAMPOLINE (0x112c)161^^^^^^^^^^^^^^^^^^^^^162 163S_SECTION (0x1136)164^^^^^^^^^^^^^^^^^^165 166S_COFFGROUP (0x1137)167^^^^^^^^^^^^^^^^^^^^168 169S_EXPORT (0x1138)170^^^^^^^^^^^^^^^^^171 172S_CALLSITEINFO (0x1139)173^^^^^^^^^^^^^^^^^^^^^^^174 175S_FRAMECOOKIE (0x113a)176^^^^^^^^^^^^^^^^^^^^^^177 178S_COMPILE3 (0x113c)179^^^^^^^^^^^^^^^^^^^180 181S_ENVBLOCK (0x113d)182^^^^^^^^^^^^^^^^^^^183 184S_LOCAL (0x113e)185^^^^^^^^^^^^^^^^186 187S_DEFRANGE (0x113f)188^^^^^^^^^^^^^^^^^^^189 190S_DEFRANGE_SUBFIELD (0x1140)191^^^^^^^^^^^^^^^^^^^^^^^^^^^^192 193S_DEFRANGE_REGISTER (0x1141)194^^^^^^^^^^^^^^^^^^^^^^^^^^^^195 196S_DEFRANGE_FRAMEPOINTER_REL (0x1142)197^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^198 199S_DEFRANGE_SUBFIELD_REGISTER (0x1143)200^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^201 202S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE (0x1144)203^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^204 205S_DEFRANGE_REGISTER_REL (0x1145)206^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^207 208S_LPROC32_ID (0x1146)209^^^^^^^^^^^^^^^^^^^^^210 211S_GPROC32_ID (0x1147)212^^^^^^^^^^^^^^^^^^^^^213 214S_BUILDINFO (0x114c)215^^^^^^^^^^^^^^^^^^^^216 217S_INLINESITE (0x114d)218^^^^^^^^^^^^^^^^^^^^^219 220S_INLINESITE_END (0x114e)221^^^^^^^^^^^^^^^^^^^^^^^^^222 223S_PROC_ID_END (0x114f)224^^^^^^^^^^^^^^^^^^^^^^225 226S_FILESTATIC (0x1153)227^^^^^^^^^^^^^^^^^^^^^228 229S_LPROC32_DPC (0x1155)230^^^^^^^^^^^^^^^^^^^^^^231 232S_LPROC32_DPC_ID (0x1156)233^^^^^^^^^^^^^^^^^^^^^^^^^234 235S_CALLEES (0x115a)236^^^^^^^^^^^^^^^^^^237 238S_CALLERS (0x115b)239^^^^^^^^^^^^^^^^^^240 241S_HEAPALLOCSITE (0x115e)242^^^^^^^^^^^^^^^^^^^^^^^^243 244S_FASTLINK (0x1167)245^^^^^^^^^^^^^^^^^^^246 247S_INLINEES (0x1168)248^^^^^^^^^^^^^^^^^^^249 250.. _module_and_global_symbols:251 252Symbols which can go in either/both of the module info stream & global stream253-----------------------------------------------------------------------------254 255S_CONSTANT (0x1107)256^^^^^^^^^^^^^^^^^^^257 258S_UDT (0x1108)259^^^^^^^^^^^^^^260 261S_LDATA32 (0x110c)262^^^^^^^^^^^^^^^^^^263 264S_LTHREAD32 (0x1112)265^^^^^^^^^^^^^^^^^^^^266 267S_LMANDATA (0x111c)268^^^^^^^^^^^^^^^^^^^269 270S_MANCONSTANT (0x112d)271^^^^^^^^^^^^^^^^^^^^^^272 273