PR 30632 - ld segfaults if linker script includes a STARTUP line.
[binutils-gdb.git] / ld / pdb.h
index ecc26c1c87a9ace399e104487cbba58182ef2cb4..18e18e7111a13ffe0543536b546a8430778cb4e4 100644 (file)
--- a/ld/pdb.h
+++ b/ld/pdb.h
@@ -1,5 +1,5 @@
 /* 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
@@ -102,6 +146,8 @@ struct pdb_tpi_stream_header
 #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
 {
@@ -191,6 +237,7 @@ struct optional_dbg_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
@@ -265,7 +312,7 @@ struct lf_pointer
   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;
@@ -434,7 +481,6 @@ struct lf_bclass
   uint16_t attributes;
   uint32_t base_class_type;
   uint16_t offset;
-  uint16_t padding;
 } ATTRIBUTE_PACKED;
 
 /* lfVFuncTab in cvinfo.h */
@@ -474,6 +520,337 @@ struct lf_nest_type
   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