/* pdb.h - header file for generating PDB CodeView debugging files.
- Copyright (C) 2022 Free Software Foundation, Inc.
+ Copyright (C) 2022-2023 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
#define LF_METHOD 0x150f
#define LF_NESTTYPE 0x1510
#define LF_ONEMETHOD 0x1511
+#define LF_VFTABLE 0x151d
+#define LF_FUNC_ID 0x1601
+#define LF_MFUNC_ID 0x1602
+#define LF_BUILDINFO 0x1603
+#define LF_SUBSTR_LIST 0x1604
+#define LF_STRING_ID 0x1605
+#define LF_UDT_SRC_LINE 0x1606
+#define LF_UDT_MOD_SRC_LINE 0x1607
#define LF_CHAR 0x8000
#define LF_SHORT 0x8001
#define LF_QUADWORD 0x8009
#define LF_UQUADWORD 0x800a
+#define S_END 0x0006
+#define S_FRAMEPROC 0x1012
+#define S_OBJNAME 0x1101
+#define S_THUNK32 0x1102
+#define S_BLOCK32 0x1103
+#define S_LABEL32 0x1105
+#define S_REGISTER 0x1106
+#define S_CONSTANT 0x1107
+#define S_UDT 0x1108
+#define S_BPREL32 0x110b
+#define S_LDATA32 0x110c
+#define S_GDATA32 0x110d
#define S_PUB32 0x110e
+#define S_LPROC32 0x110f
+#define S_GPROC32 0x1110
+#define S_REGREL32 0x1111
+#define S_LTHREAD32 0x1112
+#define S_GTHREAD32 0x1113
+#define S_UNAMESPACE 0x1124
+#define S_PROCREF 0x1125
+#define S_LPROCREF 0x1127
+#define S_FRAMECOOKIE 0x113a
+#define S_COMPILE3 0x113c
+#define S_ENVBLOCK 0x113d
+#define S_LOCAL 0x113e
+#define S_DEFRANGE_REGISTER 0x1141
+#define S_DEFRANGE_FRAMEPOINTER_REL 0x1142
+#define S_DEFRANGE_SUBFIELD_REGISTER 0x1143
+#define S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144
+#define S_DEFRANGE_REGISTER_REL 0x1145
+#define S_LPROC32_ID 0x1146
+#define S_GPROC32_ID 0x1147
+#define S_BUILDINFO 0x114c
+#define S_INLINESITE 0x114d
+#define S_INLINESITE_END 0x114e
+#define S_PROC_ID_END 0x114f
+#define S_HEAPALLOCSITE 0x115e
/* PDBStream70 in pdb1.h */
struct pdb_stream_70
#define TPI_FIRST_INDEX 0x1000
#define NUM_TPI_HASH_BUCKETS 0x3ffff
+#define NUM_GLOBALS_HASH_BUCKETS 4096
+
/* NewDBIHdr in dbi.h */
struct pdb_dbi_stream_header
{
#define CV_SIGNATURE_C13 4
+#define DEBUG_S_SYMBOLS 0xf1
#define DEBUG_S_LINES 0xf2
#define DEBUG_S_STRINGTABLE 0xf3
#define DEBUG_S_FILECHKSMS 0xf4
uint32_t attributes;
} ATTRIBUTE_PACKED;
-/* lfArgList in cvinfo.h */
+/* lfArgList in cvinfo.h (used for both LF_ARGLIST and LF_SUBSTR_LIST) */
struct lf_arglist
{
uint16_t size;
uint16_t attributes;
uint32_t base_class_type;
uint16_t offset;
- uint16_t padding;
} ATTRIBUTE_PACKED;
/* lfVFuncTab in cvinfo.h */
char name[];
} ATTRIBUTE_PACKED;
+/* lfStringId in cvinfo.h */
+struct lf_string_id
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t substring;
+ char string[];
+} ATTRIBUTE_PACKED;
+
+/* lfBuildInfo in cvinfo.h */
+struct lf_build_info
+{
+ uint16_t size;
+ uint16_t kind;
+ uint16_t count;
+ uint32_t strings[];
+} ATTRIBUTE_PACKED;
+
+/* lfFuncId in cvinfo.h */
+struct lf_func_id
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent_scope;
+ uint32_t function_type;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* lfMFuncId in cvinfo.h */
+struct lf_mfunc_id
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent_type;
+ uint32_t function_type;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* lfUdtSrcLine in cvinfo.h */
+struct lf_udt_src_line
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint32_t source_file_type;
+ uint32_t line_no;
+} ATTRIBUTE_PACKED;
+
+/* lfUdtModSrcLine in cvinfo.h */
+struct lf_udt_mod_src_line
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint32_t source_file_string;
+ uint32_t line_no;
+ uint16_t module_no;
+} ATTRIBUTE_PACKED;
+
+/* lfVftable in cvinfo.h */
+struct lf_vftable
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint32_t base_vftable;
+ uint32_t offset;
+ uint32_t names_len;
+ char names[];
+} ATTRIBUTE_PACKED;
+
+/* DATASYM32 in cvinfo.h */
+struct datasym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint32_t offset;
+ uint16_t section;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* PROCSYM32 in cvinfo.h */
+struct procsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent;
+ uint32_t end;
+ uint32_t next;
+ uint32_t proc_len;
+ uint32_t debug_start;
+ uint32_t debug_end;
+ uint32_t type;
+ uint32_t offset;
+ uint16_t section;
+ uint8_t flags;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* REFSYM2 in cvinfo.h */
+struct refsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t sum_name;
+ uint32_t symbol_offset;
+ uint16_t mod;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* UDTSYM in cvinfo.h */
+struct udtsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* CONSTSYM in cvinfo.h */
+struct constsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint16_t value;
+ /* then actual value if value >= 0x8000 */
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* BUILDINFOSYM in cvinfo.h */
+struct buildinfosym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+} ATTRIBUTE_PACKED;
+
+/* BLOCKSYM32 in cvinfo.h */
+struct blocksym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent;
+ uint32_t end;
+ uint32_t len;
+ uint32_t offset;
+ uint16_t section;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* BPRELSYM32 in cvinfo.h */
+struct bprelsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t bp_offset;
+ uint32_t type;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* REGSYM in cvinfo.h */
+struct regsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint16_t reg;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* REGREL32 in cvinfo.h */
+struct regrel
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t offset;
+ uint32_t type;
+ uint16_t reg;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* LOCALSYM in cvinfo.h */
+struct localsym
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t type;
+ uint16_t flags;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* CV_LVAR_ADDR_RANGE in cvinfo.h */
+struct lvar_addr_range
+{
+ uint32_t offset;
+ uint16_t section;
+ uint16_t length;
+} ATTRIBUTE_PACKED;
+
+/* CV_LVAR_ADDR_GAP in cvinfo.h */
+struct lvar_addr_gap {
+ uint16_t offset;
+ uint16_t length;
+} ATTRIBUTE_PACKED;
+
+/* DEFRANGESYMREGISTERREL in cvinfo.h */
+struct defrange_register_rel
+{
+ uint16_t size;
+ uint16_t kind;
+ uint16_t reg;
+ uint16_t offset_parent;
+ uint32_t offset_register;
+ struct lvar_addr_range range;
+ struct lvar_addr_gap gaps[];
+} ATTRIBUTE_PACKED;
+
+/* DEFRANGESYMFRAMEPOINTERREL in cvinfo.h */
+struct defrange_framepointer_rel
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t offset;
+ struct lvar_addr_range range;
+ struct lvar_addr_gap gaps[];
+} ATTRIBUTE_PACKED;
+
+/* DEFRANGESYMSUBFIELDREGISTER in cvinfo.h */
+struct defrange_subfield_register
+{
+ uint16_t size;
+ uint16_t kind;
+ uint16_t reg;
+ uint16_t attributes;
+ uint32_t offset_parent;
+ struct lvar_addr_range range;
+ struct lvar_addr_gap gaps[];
+} ATTRIBUTE_PACKED;
+
+/* DEFRANGESYMREGISTER in cvinfo.h */
+struct defrange_register
+{
+ uint16_t size;
+ uint16_t kind;
+ uint16_t reg;
+ uint16_t attributes;
+ struct lvar_addr_range range;
+ struct lvar_addr_gap gaps[];
+} ATTRIBUTE_PACKED;
+
+/* INLINESITESYM in cvinfo.h */
+struct inline_site
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent;
+ uint32_t end;
+ uint32_t inlinee;
+ uint8_t binary_annotations[];
+} ATTRIBUTE_PACKED;
+
+/* THUNKSYM32 in cvinfo.h */
+struct thunk
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t parent;
+ uint32_t end;
+ uint32_t next;
+ uint32_t offset;
+ uint16_t section;
+ uint16_t length;
+ uint8_t thunk_type;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+/* HEAPALLOCSITE in cvinfo.h */
+struct heap_alloc_site
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t offset;
+ uint16_t section;
+ uint16_t length;
+ uint32_t type;
+} ATTRIBUTE_PACKED;
+
+/* OBJNAMESYM in cvinfo.h */
+struct objname
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t signature;
+ char name[];
+} ATTRIBUTE_PACKED;
+
+#define CV_CFL_80386 0x03
+#define CV_CFL_X64 0xD0
+#define CV_CFL_ARM64 0xF6
+
+#define CV_CFL_LINK 0x07
+
+/* COMPILESYM3 in cvinfo.h */
+struct compile3
+{
+ uint16_t size;
+ uint16_t kind;
+ uint32_t flags;
+ uint16_t machine;
+ uint16_t frontend_major;
+ uint16_t frontend_minor;
+ uint16_t frontend_build;
+ uint16_t frontend_qfe;
+ uint16_t backend_major;
+ uint16_t backend_minor;
+ uint16_t backend_build;
+ uint16_t backend_qfe;
+ char compiler[];
+} ATTRIBUTE_PACKED;
+
+/* ENVBLOCKSYM in cvinfo.h */
+struct envblock
+{
+ uint16_t size;
+ uint16_t kind;
+ uint8_t flags;
+ char strings[];
+} ATTRIBUTE_PACKED;
+
extern bool create_pdb_file (bfd *, const char *, const unsigned char *);
#endif