binutils-gdb/ld/testsuite/ld-pe/pdb-syms1b.s
Mark Harmstone 9a02fbd198 ld: Add pdb support to aarch64-w64-mingw32
This extends PDB support to the aarch64 PE targets.

The changes to the test files are just to make it so they can be assembled as
either x86, x86_64, or aarch64, mainly by changing the comment style.
The only actual code change here is in adding the architecture constants
to pdb.c.
2023-01-25 22:26:18 +00:00

738 lines
14 KiB
ArmAsm

.equ CV_SIGNATURE_C13, 4
.equ DEBUG_S_SYMBOLS, 0xf1
.equ T_VOID, 0x0003
.equ T_UQUAD, 0x0023
.equ T_UINT4, 0x0075
.equ LF_MODIFIER, 0x1001
.equ LF_POINTER, 0x1002
.equ LF_PROCEDURE, 0x1008
.equ LF_MFUNCTION, 0x1009
.equ LF_ARGLIST, 0x1201
.equ LF_FIELDLIST, 0x1203
.equ LF_CLASS, 0x1504
.equ LF_STRUCTURE, 0x1505
.equ LF_MEMBER, 0x150d
.equ LF_ONEMETHOD, 0x1511
.equ LF_FUNC_ID, 0x1601
.equ LF_MFUNC_ID, 0x1602
.equ LF_UQUADWORD, 0x800a
.equ S_END, 0x0006
.equ S_CONSTANT, 0x1107
.equ S_UDT, 0x1108
.equ S_LDATA32, 0x110c
.equ S_GDATA32, 0x110d
.equ S_LPROC32, 0x110f
.equ S_GPROC32, 0x1110
.equ S_LTHREAD32, 0x1112
.equ S_GTHREAD32, 0x1113
.equ S_LPROC32_ID, 0x1146
.equ S_GPROC32_ID, 0x1147
.equ S_PROC_ID_END, 0x114f
.equ CV_PTR_64, 0xc
.section ".debug$S", "rn"
.long CV_SIGNATURE_C13
.long DEBUG_S_SYMBOLS
.long .syms_end - .syms_start
.syms_start:
.ldata1:
.short .ldata1a - .ldata1 - 2
.short S_LDATA32
.long 0x1000 /* const uint32_t */
.secrel32 lvar1
.secidx lvar1
.asciz "lvar1"
.ldata1a: /* duplicate with same address */
.short .ldata1b - .ldata1a - 2
.short S_LDATA32
.long 0x1000 /* const uint32_t */
.secrel32 lvar1
.secidx lvar1
.asciz "lvar1"
.ldata1b: /* duplicate with different address */
.short .ldata2 - .ldata1b - 2
.short S_LDATA32
.long 0x1000 /* const uint32_t */
.secrel32 lvar1a
.secidx lvar1a
.asciz "lvar1"
.ldata2:
.short .gdata1 - .ldata2 - 2
.short S_LDATA32
.long 0x1000 /* const uint32_t */
.secrel32 lvar2
.secidx lvar2
.asciz "lvar2"
.gdata1:
.short .gdata2 - .gdata1 - 2
.short S_GDATA32
.long 0x1000 /* const uint32_t */
.secrel32 gvar1
.secidx gvar1
.asciz "gvar1"
.gdata2:
.short .gproc1 - .gdata2 - 2
.short S_GDATA32
.long 0x1000 /* const uint32_t */
.secrel32 gvar2
.secidx gvar2
.asciz "gvar2"
.gproc1:
.short .gproc1_end - .gproc1 - 2
.short S_GPROC32
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc1_end - proc1 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1002 /* type */
.secrel32 proc1
.secidx proc1
.byte 0 /* flags */
.asciz "proc1"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc1_end:
.short .gproc2 - .gproc1_end - 2
.short S_END
.gproc2:
.short .udt1 - .gproc2 - 2
.short S_GPROC32
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc2_end - proc2 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1002 /* type */
.secrel32 proc2
.secidx proc2
.byte 0 /* flags */
.asciz "proc2"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.udt1:
.short .ldata3 - .udt1 - 2
.short S_UDT
.long 0x1011 /* struct bar */
.asciz "bar"
.ldata3:
.short .lthread1 - .ldata3 - 2
.short S_LDATA32
.long 0x1000 /* const uint32_t */
.secrel32 lvar3
.secidx lvar3
.asciz "lvar3"
.lthread1:
.short .gproc2_end - .lthread1 - 2
.short S_LTHREAD32
.long 0x1000 /* const uint32_t */
.secrel32 lvar4
.secidx lvar4
.asciz "lvar4"
.gproc2_end:
.short .gproc3 - .gproc2_end - 2
.short S_END
.gproc3:
.short .gproc3_end - .gproc3 - 2
.short S_LPROC32
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc3_end - proc3 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1002 /* type */
.secrel32 proc3
.secidx proc3
.byte 0 /* flags */
.asciz "proc3"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc3_end:
.short .gproc4 - .gproc3_end - 2
.short S_END
.gproc4:
.short .gproc4_end - .gproc4 - 2
.short S_LPROC32
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc4_end - proc4 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1002 /* type */
.secrel32 proc4
.secidx proc4
.byte 0 /* flags */
.asciz "proc4"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc4_end:
.short .gproc5 - .gproc4_end - 2
.short S_END
.gproc5:
.short .gproc5_end - .gproc5 - 2
.short S_GPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc5_end - proc5 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1003 /* func ID */
.secrel32 proc5
.secidx proc5
.byte 0 /* flags */
.asciz "proc5"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc5_end:
.short .gproc6 - .gproc5_end - 2
.short S_PROC_ID_END
.gproc6:
.short .gproc6_end - .gproc6 - 2
.short S_GPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc6_end - proc6 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x1004 /* func ID */
.secrel32 proc6
.secidx proc6
.byte 0 /* flags */
.asciz "proc6"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc6_end:
.short .gproc7 - .gproc6_end - 2
.short S_PROC_ID_END
.gproc7:
.short .gproc7_end - .gproc7 - 2
.short S_GPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc7_end - proc7 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100a /* func ID */
.secrel32 proc7
.secidx proc7
.byte 0 /* flags */
.asciz "foo::method"
.byte 0xf1 /* padding */
.gproc7_end:
.short .gproc8 - .gproc7_end - 2
.short S_PROC_ID_END
.gproc8:
.short .gproc8_end - .gproc8 - 2
.short S_GPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc8_end - proc8 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100b /* func ID */
.secrel32 proc8
.secidx proc8
.byte 0 /* flags */
.asciz "foo::method2"
.gproc8_end:
.short .gproc9 - .gproc8_end - 2
.short S_PROC_ID_END
.gproc9:
.short .gproc9_end - .gproc9 - 2
.short S_LPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc9_end - proc9 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100c /* func ID */
.secrel32 proc9
.secidx proc9
.byte 0 /* flags */
.asciz "proc9"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc9_end:
.short .gproc10 - .gproc9_end - 2
.short S_PROC_ID_END
.gproc10:
.short .gproc10_end - .gproc10 - 2
.short S_GPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc10_end - proc10 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100d /* func ID */
.secrel32 proc10
.secidx proc10
.byte 0 /* flags */
.asciz "proc10"
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.gproc10_end:
.short .gproc11 - .gproc10_end - 2
.short S_PROC_ID_END
.gproc11:
.short .gproc11_end - .gproc11 - 2
.short S_LPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc11_end - proc11 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100e /* func ID */
.secrel32 proc11
.secidx proc11
.byte 0 /* flags */
.asciz "foo::method3"
.gproc11_end:
.short .gproc12 - .gproc11_end - 2
.short S_PROC_ID_END
.gproc12:
.short .gproc12_end - .gproc12 - 2
.short S_LPROC32_ID
.long 0 /* parent */
.long 0 /* end */
.long 0 /* next symbol */
.long .proc12_end - proc12 /* length */
.long 0 /* debug start offset */
.long 0 /* debug end offset */
.long 0x100f /* func ID */
.secrel32 proc12
.secidx proc12
.byte 0 /* flags */
.asciz "foo::method4"
.gproc12_end:
.short .udt2 - .gproc12_end - 2
.short S_PROC_ID_END
.udt2:
.short .constant1 - .udt2 - 2
.short S_UDT
.long 0x1009 /* class foo */
.asciz "foo"
.constant1:
.short .constant2 - .constant1 - 2
.short S_CONSTANT
.long T_UINT4
.short 42
.asciz "answer"
.byte 0xf3 /* padding */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.constant2:
.short .lthread2 - .constant2 - 2
.short S_CONSTANT
.long T_UQUAD
.short LF_UQUADWORD
.quad 0x0123456789abcdef
.asciz "answer2"
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.lthread2:
.short .lthread3 - .lthread2 - 2
.short S_LTHREAD32
.long 0x1000 /* const uint32_t */
.secrel32 lvar5
.secidx lvar5
.asciz "lvar5"
.lthread3:
.short .gthread1 - .lthread3 - 2
.short S_LTHREAD32
.long 0x1000 /* const uint32_t */
.secrel32 lvar6
.secidx lvar6
.asciz "lvar6"
.gthread1:
.short .gthread2 - .gthread1 - 2
.short S_GTHREAD32
.long 0x1000 /* const uint32_t */
.secrel32 gvar3
.secidx gvar3
.asciz "gvar3"
.gthread2:
.short .syms_end - .gthread2 - 2
.short S_GTHREAD32
.long 0x1000 /* const uint32_t */
.secrel32 gvar4
.secidx gvar4
.asciz "gvar4"
.p2align 2
.syms_end:
.section ".debug$T", "rn"
.long CV_SIGNATURE_C13
/* Type 1000, const uint32_t */
.mod1:
.short .arglist1 - .mod1 - 2
.short LF_MODIFIER
.long T_UINT4
.short 1 /* const */
.p2align 2
/* Type 1001, arglist (uint32_t) */
.arglist1:
.short .proctype1 - .arglist1 - 2
.short LF_ARGLIST
.long 1 /* no. entries */
.long T_UINT4
/* Type 1002, procedure (return type T_VOID, arglist 1001) */
.proctype1:
.short .funcid1 - .proctype1 - 2
.short LF_PROCEDURE
.long T_VOID
.byte 0 /* calling convention */
.byte 0 /* attributes */
.short 1 /* no. parameters */
.long 0x1001
/* Type 1003, func ID for proc5 */
.funcid1:
.short .funcid2 - .funcid1 - 2
.short LF_FUNC_ID
.long 0 /* parent scope */
.long 0x1002 /* type */
.asciz "proc5"
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
/* Type 1004, func ID for proc6 */
.funcid2:
.short .class1 - .funcid2 - 2
.short LF_FUNC_ID
.long 0 /* parent scope */
.long 0x1002 /* type */
.asciz "proc6"
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
/* Type 1005, forward declaration of class foo */
.class1:
.short .ptr1 - .class1 - 2
.short LF_CLASS
.short 0 /* no. members */
.short 0x80 /* property (forward declaration) */
.long 0 /* field list */
.long 0 /* type derived from */
.long 0 /* type of vshape table */
.short 0 /* size */
.asciz "foo" /* name */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
/* Type 1006, pointer to 1005 */
.ptr1:
.short .mfunction1 - .ptr1 - 2
.short LF_POINTER
.long 0x1005
.long (8 << 13) | CV_PTR_64
/* Type 1007, member function of 1005, return type void, arg list 1001 */
.mfunction1:
.short .fieldlist1 - .mfunction1 - 2
.short LF_MFUNCTION
.long T_VOID
.long 0x1005
.long 0x1006 /* type of "this" pointer */
.byte 0 /* calling convention */
.byte 0 /* attributes */
.short 1 /* no. parameters */
.long 0x1001 /* arg list */
.long 0 /* "this" adjustment */
/* Type 1008, field list for class foo */
.fieldlist1:
.short .class2 - .fieldlist1 - 2
.short LF_FIELDLIST
.short LF_ONEMETHOD
.short 0 /* method attribute */
.long 0x1007 /* method type */
.asciz "method"
.byte 0xf1 /* padding */
.short LF_ONEMETHOD
.short 0 /* method attribute */
.long 0x1007 /* method type */
.asciz "method2"
.short LF_ONEMETHOD
.short 0 /* method attribute */
.long 0x1007 /* method type */
.asciz "method3"
.short LF_ONEMETHOD
.short 0 /* method attribute */
.long 0x1007 /* method type */
.asciz "method4"
/* Type 1009, actual declaration of class foo */
.class2:
.short .mfunc1 - .class2 - 2
.short LF_CLASS
.short 0 /* no. members */
.short 0 /* property */
.long 0x1008 /* field list */
.long 0 /* type derived from */
.long 0 /* type of vshape table */
.short 0 /* size */
.asciz "foo" /* name */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
/* Type 100a, function "method" within class "foo" */
.mfunc1:
.short .mfunc2 - .mfunc1 - 2
.short LF_MFUNC_ID
.long 0x1009 /* parent class */
.long 0x1002 /* function type */
.asciz "method"
.byte 0xf1 /* padding */
/* Type 100b, function "method2" within class "foo" */
.mfunc2:
.short .funcid3 - .mfunc2 - 2
.short LF_MFUNC_ID
.long 0x1009 /* parent class */
.long 0x1002 /* function type */
.asciz "method2"
/* Type 100c, func ID for proc9 */
.funcid3:
.short .funcid4 - .funcid3 - 2
.short LF_FUNC_ID
.long 0 /* parent scope */
.long 0x1002 /* type */
.asciz "proc9"
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
/* Type 100d, func ID for proc10 */
.funcid4:
.short .mfunc3 - .funcid4 - 2
.short LF_FUNC_ID
.long 0 /* parent scope */
.long 0x1002 /* type */
.asciz "proc10"
.byte 0xf1 /* padding */
/* Type 100e, function "method3" within class "foo" */
.mfunc3:
.short .mfunc4 - .mfunc3 - 2
.short LF_MFUNC_ID
.long 0x1009 /* parent class */
.long 0x1002 /* function type */
.asciz "method3"
/* Type 100f, function "method4" within class "foo" */
.mfunc4:
.short .fieldlist2 - .mfunc4 - 2
.short LF_MFUNC_ID
.long 0x1009 /* parent class */
.long 0x1002 /* function type */
.asciz "method4"
/* Type 1010, field list for struct bar */
.fieldlist2:
.short .struct1 - .fieldlist2 - 2
.short LF_FIELDLIST
.short LF_MEMBER
.short 3 /* public */
.long T_UINT4
.short 0 /* offset */
.asciz "num1"
.byte 0xf1 /* padding */
/* Type 1011, declaration of struct bar */
.struct1:
.short .types_end - .struct1 - 2
.short LF_STRUCTURE
.short 1 /* no. members */
.short 0 /* property */
.long 0x1010 /* field list */
.long 0 /* type derived from */
.long 0 /* type of vshape table */
.short 4 /* size */
.asciz "bar" /* name */
.byte 0xf2 /* padding */
.byte 0xf1 /* padding */
.types_end:
.data
.long 0x12345678
.long 0x12345678
lvar1:
.long 42
lvar1a:
.long 0x12345678
lvar3:
.long 84
lvar4:
.long 85
.global gvar1
gvar1:
.long 43
.global gvar3
gvar3:
.long 41
lvar5:
.long 86
.text
.global main
main:
.short 0
.secrel32 .data
.global proc2
proc2:
.byte 0
.proc2_end:
.global proc4
proc4:
.byte 0
.proc4_end:
.global proc6
proc6:
.byte 0
.proc6_end:
.global proc8
proc8:
.byte 0
.proc8_end:
.global proc10
proc10:
.byte 0
.proc10_end:
.global proc12
proc12:
.byte 0
.proc12_end:
.section "gcsect"
lvar2:
.long 84
.global gvar2
gvar2:
.long 85
.global gvar4
gvar4:
.long 86
.global proc1
proc1:
.byte 0
.proc1_end:
.global proc3
proc3:
.byte 0
.proc3_end:
.global proc5
proc5:
.byte 0
.proc5_end:
.global proc7
proc7:
.byte 0
.proc7_end:
.global proc9
proc9:
.byte 0
.proc9_end:
.global proc11
proc11:
.byte 0
.proc11_end:
lvar6:
.long 86