| # REQUIRES: x86 |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc < %s > %t.obj |
| # RUN: lld-link /DEBUG:FULL /nodefaultlib /entry:main %t.obj /PDB:%t.pdb /OUT:%t.exe |
| # RUN: llvm-pdbutil dump -types -globals -symbols -modi=0 %t.pdb | FileCheck %s |
| # RUN: lld-link /DEBUG:FULL /debug:ghash /nodefaultlib /entry:main %t.obj /PDB:%t.pdb /OUT:%t.exe |
| # RUN: llvm-pdbutil dump -types -globals -symbols -modi=0 %t.pdb | FileCheck %s |
| |
| # CHECK: Types (TPI Stream) |
| # CHECK-NEXT: ============================================================ |
| # CHECK: 0x1003 | LF_STRUCTURE [size = 44] `Struct` |
| # CHECK-NEXT: unique name: `.?AUStruct@@` |
| # CHECK-NEXT: vtable: <no type>, base list: <no type>, field list: <no type> |
| # CHECK-NEXT: options: forward ref (-> 0x1006) | has unique name, sizeof 0 |
| # CHECK-NEXT: 0x1004 | LF_POINTER [size = 12] |
| # CHECK-NEXT: referent = 0x1003, mode = pointer, opts = None, kind = ptr64 |
| # CHECK: 0x1006 | LF_STRUCTURE [size = 44] `Struct` |
| # CHECK-NEXT: unique name: `.?AUStruct@@` |
| # CHECK-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1005 |
| # CHECK-NEXT: options: has unique name, sizeof 4 |
| # CHECK: Global Symbols |
| # CHECK-NEXT: ============================================================ |
| # CHECK: {{.*}} | S_UDT [size = 24] `StructTypedef` |
| # CHECK: original type = 0x1003 |
| # CHECK: {{.*}} | S_UDT [size = 16] `Struct` |
| # CHECK: original type = 0x1006 |
| # CHECK: {{.*}} | S_UDT [size = 20] `IntTypedef` |
| # CHECK: original type = 0x0074 (int) |
| # CHECK: Symbols |
| # CHECK-NEXT: ============================================================ |
| # CHECK: {{.*}} | S_GPROC32 [size = 44] `main` |
| # CHECK-NEXT: parent = 0, end = 252, addr = 0001:0000, code size = 52 |
| # CHECK-NEXT: type = `0x1002 (int (int, char**))`, debug start = 0, debug end = 0, flags = none |
| # CHECK-NOT: {{.*}} | S_END |
| # CHECK: {{.*}} | S_UDT [size = 28] `main::LocalTypedef` |
| # CHECK-NEXT: original type = 0x1004 |
| # CHECK: {{.*}} | S_END [size = 4] |
| |
| # source code to re-generate: |
| # clang-cl /Z7 /GS- /GR- /c foo.cpp |
| # |
| # struct Struct { |
| # int x; |
| # }; |
| # |
| # using IntTypedef = int; |
| # using StructTypedef = Struct; |
| # Struct S; |
| # StructTypedef SS; |
| # IntTypedef I; |
| # |
| # int main(int argc, char **argv) { |
| # using LocalTypedef = Struct*; |
| # LocalTypedef SPtr; |
| # return I + S.x + SS.x + SPtr->x; |
| # } |
| |
| .text |
| .def @feat.00; |
| .scl 3; |
| .type 0; |
| .endef |
| .globl @feat.00 |
| .set @feat.00, 0 |
| .intel_syntax noprefix |
| .def main; |
| .scl 2; |
| .type 32; |
| .endef |
| .globl main # -- Begin function main |
| .p2align 4, 0x90 |
| main: # @main |
| .Lfunc_begin0: |
| .cv_func_id 0 |
| .cv_file 1 "D:\\src\\llvmbuild\\cl\\Debug\\x64\\foo.cpp" "2B62298EE3EEF94E1D81FDFE18BD46A6" 1 |
| .cv_loc 0 1 12 0 # foo.cpp:12:0 |
| .seh_proc main |
| # %bb.0: # %entry |
| sub rsp, 32 |
| .seh_stackalloc 32 |
| .seh_endprologue |
| mov dword ptr [rsp + 28], 0 |
| mov qword ptr [rsp + 16], rdx |
| mov dword ptr [rsp + 12], ecx |
| .Ltmp0: |
| .cv_loc 0 1 15 0 # foo.cpp:15:0 |
| mov ecx, dword ptr [rip + "?I@@3HA"] |
| add ecx, dword ptr [rip + "?S@@3UStruct@@A"] |
| add ecx, dword ptr [rip + "?SS@@3UStruct@@A"] |
| mov rdx, qword ptr [rsp] |
| add ecx, dword ptr [rdx] |
| mov eax, ecx |
| add rsp, 32 |
| ret |
| .Ltmp1: |
| .Lfunc_end0: |
| .seh_handlerdata |
| .text |
| .seh_endproc |
| # -- End function |
| .bss |
| .globl "?S@@3UStruct@@A" # @"?S@@3UStruct@@A" |
| .p2align 2 |
| "?S@@3UStruct@@A": |
| .zero 4 |
| |
| .globl "?SS@@3UStruct@@A" # @"?SS@@3UStruct@@A" |
| .p2align 2 |
| "?SS@@3UStruct@@A": |
| .zero 4 |
| |
| .globl "?I@@3HA" # @"?I@@3HA" |
| .p2align 2 |
| "?I@@3HA": |
| .long 0 # 0x0 |
| |
| .section .drectve,"yn" |
| .ascii " /DEFAULTLIB:libcmt.lib" |
| .ascii " /DEFAULTLIB:oldnames.lib" |
| .section .debug$S,"dr" |
| .p2align 2 |
| .long 4 # Debug section magic |
| .long 241 |
| .long .Ltmp3-.Ltmp2 # Subsection size |
| .Ltmp2: |
| .short .Ltmp5-.Ltmp4 # Record length |
| .Ltmp4: |
| .short 4412 # Record kind: S_COMPILE3 |
| .long 1 # Flags and language |
| .short 208 # CPUType |
| .short 8 # Frontend version |
| .short 0 |
| .short 0 |
| .short 0 |
| .short 8000 # Backend version |
| .short 0 |
| .short 0 |
| .short 0 |
| .asciz "clang version 8.0.0 " # Null-terminated compiler version string |
| .Ltmp5: |
| .Ltmp3: |
| .p2align 2 |
| .long 241 # Symbol subsection for main |
| .long .Ltmp7-.Ltmp6 # Subsection size |
| .Ltmp6: |
| .short .Ltmp9-.Ltmp8 # Record length |
| .Ltmp8: |
| .short 4423 # Record kind: S_GPROC32_ID |
| .long 0 # PtrParent |
| .long 0 # PtrEnd |
| .long 0 # PtrNext |
| .long .Lfunc_end0-main # Code size |
| .long 0 # Offset after prologue |
| .long 0 # Offset before epilogue |
| .long 4099 # Function type index |
| .secrel32 main # Function section relative address |
| .secidx main # Function section index |
| .byte 0 # Flags |
| .asciz "main" # Function name |
| .Ltmp9: |
| .short .Ltmp11-.Ltmp10 # Record length |
| .Ltmp10: |
| .short 4114 # Record kind: S_FRAMEPROC |
| .long 32 # FrameSize |
| .long 0 # Padding |
| .long 0 # Offset of padding |
| .long 0 # Bytes of callee saved registers |
| .long 0 # Exception handler offset |
| .short 0 # Exception handler section |
| .long 81920 # Flags (defines frame register) |
| .Ltmp11: |
| .short .Ltmp13-.Ltmp12 # Record length |
| .Ltmp12: |
| .short 4414 # Record kind: S_LOCAL |
| .long 116 # TypeIndex |
| .short 1 # Flags |
| .asciz "argc" |
| .Ltmp13: |
| .cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 12 |
| .short .Ltmp15-.Ltmp14 # Record length |
| .Ltmp14: |
| .short 4414 # Record kind: S_LOCAL |
| .long 4096 # TypeIndex |
| .short 1 # Flags |
| .asciz "argv" |
| .Ltmp15: |
| .cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 16 |
| .short .Ltmp17-.Ltmp16 # Record length |
| .Ltmp16: |
| .short 4414 # Record kind: S_LOCAL |
| .long 4101 # TypeIndex |
| .short 0 # Flags |
| .asciz "SPtr" |
| .Ltmp17: |
| .cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 0 |
| .short .Ltmp19-.Ltmp18 # Record length |
| .Ltmp18: |
| .short 4360 # Record kind: S_UDT |
| .long 4101 # Type |
| .asciz "main::LocalTypedef" |
| .Ltmp19: |
| .short 2 # Record length |
| .short 4431 # Record kind: S_PROC_ID_END |
| .Ltmp7: |
| .p2align 2 |
| .cv_linetable 0, main, .Lfunc_end0 |
| .long 241 # Symbol subsection for globals |
| .long .Ltmp21-.Ltmp20 # Subsection size |
| .Ltmp20: |
| .short .Ltmp23-.Ltmp22 # Record length |
| .Ltmp22: |
| .short 4365 # Record kind: S_GDATA32 |
| .long 4103 # Type |
| .secrel32 "?S@@3UStruct@@A" # DataOffset |
| .secidx "?S@@3UStruct@@A" # Segment |
| .asciz "S" # Name |
| .Ltmp23: |
| .short .Ltmp25-.Ltmp24 # Record length |
| .Ltmp24: |
| .short 4365 # Record kind: S_GDATA32 |
| .long 4100 # Type |
| .secrel32 "?SS@@3UStruct@@A" # DataOffset |
| .secidx "?SS@@3UStruct@@A" # Segment |
| .asciz "SS" # Name |
| .Ltmp25: |
| .short .Ltmp27-.Ltmp26 # Record length |
| .Ltmp26: |
| .short 4365 # Record kind: S_GDATA32 |
| .long 116 # Type |
| .secrel32 "?I@@3HA" # DataOffset |
| .secidx "?I@@3HA" # Segment |
| .asciz "I" # Name |
| .Ltmp27: |
| .Ltmp21: |
| .p2align 2 |
| .long 241 |
| .long .Ltmp29-.Ltmp28 # Subsection size |
| .Ltmp28: |
| .short .Ltmp31-.Ltmp30 # Record length |
| .Ltmp30: |
| .short 4360 # Record kind: S_UDT |
| .long 4103 # Type |
| .asciz "Struct" |
| .Ltmp31: |
| .short .Ltmp33-.Ltmp32 # Record length |
| .Ltmp32: |
| .short 4360 # Record kind: S_UDT |
| .long 4100 # Type |
| .asciz "StructTypedef" |
| .Ltmp33: |
| .short .Ltmp35-.Ltmp34 # Record length |
| .Ltmp34: |
| .short 4360 # Record kind: S_UDT |
| .long 116 # Type |
| .asciz "IntTypedef" |
| .Ltmp35: |
| .Ltmp29: |
| .p2align 2 |
| .cv_filechecksums # File index to string table offset subsection |
| .cv_stringtable # String table |
| .long 241 |
| .long .Ltmp37-.Ltmp36 # Subsection size |
| .Ltmp36: |
| .short 6 # Record length |
| .short 4428 # Record kind: S_BUILDINFO |
| .long 4108 # LF_BUILDINFO index |
| .Ltmp37: |
| .p2align 2 |
| .section .debug$T,"dr" |
| .p2align 2 |
| .long 4 # Debug section magic |
| # Pointer (0x1000) { |
| # TypeLeafKind: LF_POINTER (0x1002) |
| # PointeeType: char* (0x670) |
| # PtrType: Near64 (0xC) |
| # PtrMode: Pointer (0x0) |
| # IsFlat: 0 |
| # IsConst: 0 |
| # IsVolatile: 0 |
| # IsUnaligned: 0 |
| # IsRestrict: 0 |
| # IsThisPtr&: 0 |
| # IsThisPtr&&: 0 |
| # SizeOf: 8 |
| # } |
| .byte 0x0a, 0x00, 0x02, 0x10 |
| .byte 0x70, 0x06, 0x00, 0x00 |
| .byte 0x0c, 0x00, 0x01, 0x00 |
| # ArgList (0x1001) { |
| # TypeLeafKind: LF_ARGLIST (0x1201) |
| # NumArgs: 2 |
| # Arguments [ |
| # ArgType: int (0x74) |
| # ArgType: char** (0x1000) |
| # ] |
| # } |
| .byte 0x0e, 0x00, 0x01, 0x12 |
| .byte 0x02, 0x00, 0x00, 0x00 |
| .byte 0x74, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x10, 0x00, 0x00 |
| # Procedure (0x1002) { |
| # TypeLeafKind: LF_PROCEDURE (0x1008) |
| # ReturnType: int (0x74) |
| # CallingConvention: NearC (0x0) |
| # FunctionOptions [ (0x0) |
| # ] |
| # NumParameters: 2 |
| # ArgListType: (int, char**) (0x1001) |
| # } |
| .byte 0x0e, 0x00, 0x08, 0x10 |
| .byte 0x74, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x02, 0x00 |
| .byte 0x01, 0x10, 0x00, 0x00 |
| # FuncId (0x1003) { |
| # TypeLeafKind: LF_FUNC_ID (0x1601) |
| # ParentScope: 0x0 |
| # FunctionType: int (int, char**) (0x1002) |
| # Name: main |
| # } |
| .byte 0x12, 0x00, 0x01, 0x16 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x02, 0x10, 0x00, 0x00 |
| .byte 0x6d, 0x61, 0x69, 0x6e |
| .byte 0x00, 0xf3, 0xf2, 0xf1 |
| # Struct (0x1004) { |
| # TypeLeafKind: LF_STRUCTURE (0x1505) |
| # MemberCount: 0 |
| # Properties [ (0x280) |
| # ForwardReference (0x80) |
| # HasUniqueName (0x200) |
| # ] |
| # FieldList: 0x0 |
| # DerivedFrom: 0x0 |
| # VShape: 0x0 |
| # SizeOf: 0 |
| # Name: Struct |
| # LinkageName: .?AUStruct@@ |
| # } |
| .byte 0x2a, 0x00, 0x05, 0x15 |
| .byte 0x00, 0x00, 0x80, 0x02 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x53, 0x74 |
| .byte 0x72, 0x75, 0x63, 0x74 |
| .byte 0x00, 0x2e, 0x3f, 0x41 |
| .byte 0x55, 0x53, 0x74, 0x72 |
| .byte 0x75, 0x63, 0x74, 0x40 |
| .byte 0x40, 0x00, 0xf2, 0xf1 |
| # Pointer (0x1005) { |
| # TypeLeafKind: LF_POINTER (0x1002) |
| # PointeeType: Struct (0x1004) |
| # PtrType: Near64 (0xC) |
| # PtrMode: Pointer (0x0) |
| # IsFlat: 0 |
| # IsConst: 0 |
| # IsVolatile: 0 |
| # IsUnaligned: 0 |
| # IsRestrict: 0 |
| # IsThisPtr&: 0 |
| # IsThisPtr&&: 0 |
| # SizeOf: 8 |
| # } |
| .byte 0x0a, 0x00, 0x02, 0x10 |
| .byte 0x04, 0x10, 0x00, 0x00 |
| .byte 0x0c, 0x00, 0x01, 0x00 |
| # FieldList (0x1006) { |
| # TypeLeafKind: LF_FIELDLIST (0x1203) |
| # DataMember { |
| # TypeLeafKind: LF_MEMBER (0x150D) |
| # AccessSpecifier: Public (0x3) |
| # Type: int (0x74) |
| # FieldOffset: 0x0 |
| # Name: x |
| # } |
| # } |
| .byte 0x0e, 0x00, 0x03, 0x12 |
| .byte 0x0d, 0x15, 0x03, 0x00 |
| .byte 0x74, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x78, 0x00 |
| # Struct (0x1007) { |
| # TypeLeafKind: LF_STRUCTURE (0x1505) |
| # MemberCount: 1 |
| # Properties [ (0x200) |
| # HasUniqueName (0x200) |
| # ] |
| # FieldList: <field list> (0x1006) |
| # DerivedFrom: 0x0 |
| # VShape: 0x0 |
| # SizeOf: 4 |
| # Name: Struct |
| # LinkageName: .?AUStruct@@ |
| # } |
| .byte 0x2a, 0x00, 0x05, 0x15 |
| .byte 0x01, 0x00, 0x00, 0x02 |
| .byte 0x06, 0x10, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x04, 0x00, 0x53, 0x74 |
| .byte 0x72, 0x75, 0x63, 0x74 |
| .byte 0x00, 0x2e, 0x3f, 0x41 |
| .byte 0x55, 0x53, 0x74, 0x72 |
| .byte 0x75, 0x63, 0x74, 0x40 |
| .byte 0x40, 0x00, 0xf2, 0xf1 |
| # StringId (0x1008) { |
| # TypeLeafKind: LF_STRING_ID (0x1605) |
| # Id: 0x0 |
| # StringData: D:\src\llvmbuild\cl\Debug\x64\foo.cpp |
| # } |
| .byte 0x2e, 0x00, 0x05, 0x16 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x44, 0x3a, 0x5c, 0x73 |
| .byte 0x72, 0x63, 0x5c, 0x6c |
| .byte 0x6c, 0x76, 0x6d, 0x62 |
| .byte 0x75, 0x69, 0x6c, 0x64 |
| .byte 0x5c, 0x63, 0x6c, 0x5c |
| .byte 0x44, 0x65, 0x62, 0x75 |
| .byte 0x67, 0x5c, 0x78, 0x36 |
| .byte 0x34, 0x5c, 0x66, 0x6f |
| .byte 0x6f, 0x2e, 0x63, 0x70 |
| .byte 0x70, 0x00, 0xf2, 0xf1 |
| # UdtSourceLine (0x1009) { |
| # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) |
| # UDT: Struct (0x1007) |
| # SourceFile: D:\src\llvmbuild\cl\Debug\x64\foo.cpp (0x1008) |
| # LineNumber: 1 |
| # } |
| .byte 0x0e, 0x00, 0x06, 0x16 |
| .byte 0x07, 0x10, 0x00, 0x00 |
| .byte 0x08, 0x10, 0x00, 0x00 |
| .byte 0x01, 0x00, 0x00, 0x00 |
| # StringId (0x100A) { |
| # TypeLeafKind: LF_STRING_ID (0x1605) |
| # Id: 0x0 |
| # StringData: D:\\src\\llvmbuild\\cl\\Debug\\x64 |
| # } |
| .byte 0x2a, 0x00, 0x05, 0x16 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x44, 0x3a, 0x5c, 0x5c |
| .byte 0x73, 0x72, 0x63, 0x5c |
| .byte 0x5c, 0x6c, 0x6c, 0x76 |
| .byte 0x6d, 0x62, 0x75, 0x69 |
| .byte 0x6c, 0x64, 0x5c, 0x5c |
| .byte 0x63, 0x6c, 0x5c, 0x5c |
| .byte 0x44, 0x65, 0x62, 0x75 |
| .byte 0x67, 0x5c, 0x5c, 0x78 |
| .byte 0x36, 0x34, 0x00, 0xf1 |
| # StringId (0x100B) { |
| # TypeLeafKind: LF_STRING_ID (0x1605) |
| # Id: 0x0 |
| # StringData: foo.cpp |
| # } |
| .byte 0x0e, 0x00, 0x05, 0x16 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x66, 0x6f, 0x6f, 0x2e |
| .byte 0x63, 0x70, 0x70, 0x00 |
| # BuildInfo (0x100C) { |
| # TypeLeafKind: LF_BUILDINFO (0x1603) |
| # NumArgs: 5 |
| # Arguments [ |
| # ArgType: D:\\src\\llvmbuild\\cl\\Debug\\x64 (0x100A) |
| # ArgType: 0x0 |
| # ArgType: foo.cpp (0x100B) |
| # ArgType: 0x0 |
| # ArgType: 0x0 |
| # ] |
| # } |
| .byte 0x1a, 0x00, 0x03, 0x16 |
| .byte 0x05, 0x00, 0x0a, 0x10 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x0b, 0x10 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0x00, 0x00 |
| .byte 0x00, 0x00, 0xf2, 0xf1 |
| |
| .addrsig |
| .addrsig_sym "?S@@3UStruct@@A" |
| .addrsig_sym "?SS@@3UStruct@@A" |
| .addrsig_sym "?I@@3HA" |