forked from OSchip/llvm-project
479 lines
14 KiB
ArmAsm
479 lines
14 KiB
ArmAsm
# 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"
|