| ; RUN: llc < %s | FileCheck %s --check-prefix=ASM |
| ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s --check-prefix=OBJ |
| ; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s --check-prefix=OBJ |
| ; RUN: llc < %s -filetype=obj | obj2yaml | FileCheck %s --check-prefix=YAML |
| |
| ; C++ source to regenerate: |
| ; $ cat t.cpp |
| ; int first; |
| ; template <typename T> struct A { static const int comdat = 3; }; |
| ; const int *middle = &A<void>::comdat; |
| ; int last; |
| ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll |
| |
| ; ASM: .section .debug$S,"dr" |
| ; ASM: .p2align 2 |
| ; ASM: .long 4 # Debug section magic |
| |
| ; ASM: .short {{.*-.*}} # Record length |
| ; ASM: .short 4364 # Record kind: S_LDATA32 |
| ; ASM: .long 116 # Type |
| ; ASM: .secrel32 "?first@@3HA" # DataOffset |
| ; ASM: .secidx "?first@@3HA" # Segment |
| ; ASM: .asciz "first" # Name |
| |
| ; ASM: .short {{.*-.*}} # Record length |
| ; ASM: .short 4371 # Record kind: S_GTHREAD32 |
| ; ASM: .long 4097 # Type |
| ; ASM: .secrel32 "?middle@@3PEBHEB" # DataOffset |
| ; ASM: .secidx "?middle@@3PEBHEB" # Segment |
| ; ASM: .asciz "middle" # Name |
| |
| ; ASM: .short {{.*-.*}} # Record length |
| ; ASM: .short 4365 # Record kind: S_GDATA32 |
| ; ASM: .long 116 # Type |
| ; ASM: .secrel32 "?last@@3HA" # DataOffset |
| ; ASM: .secidx "?last@@3HA" # Segment |
| ; ASM: .asciz "last" # Name |
| |
| ; ASM: .section .debug$S,"dr",associative,"?comdat@?$A@X@@2HB" |
| ; ASM: .p2align 2 |
| ; ASM: .long 4 # Debug section magic |
| |
| ; ASM: .short {{.*-.*}} # Record length |
| ; ASM: .short 4365 # Record kind: S_GDATA32 |
| ; ASM: .long 4096 # Type |
| ; ASM: .secrel32 "?comdat@?$A@X@@2HB" # DataOffset |
| ; ASM: .secidx "?comdat@?$A@X@@2HB" # Segment |
| ; ASM: .asciz "comdat" # Name |
| |
| ; OBJ: CodeViewTypes [ |
| ; OBJ: Section: .debug$T |
| ; OBJ: Magic: 0x4 |
| ; OBJ: Modifier (0x1000) { |
| ; OBJ: TypeLeafKind: LF_MODIFIER (0x1001) |
| ; OBJ: ModifiedType: int (0x74) |
| ; OBJ: Modifiers [ (0x1) |
| ; OBJ: Const (0x1) |
| ; OBJ: ] |
| ; OBJ: } |
| ; OBJ: Pointer (0x1001) { |
| ; OBJ: TypeLeafKind: LF_POINTER (0x1002) |
| ; OBJ: PointeeType: const int (0x1000) |
| ; OBJ: PtrType: Near64 (0xC) |
| ; OBJ: PtrMode: Pointer (0x0) |
| ; OBJ: IsFlat: 0 |
| ; OBJ: IsConst: 0 |
| ; OBJ: IsVolatile: 0 |
| ; OBJ: IsUnaligned: 0 |
| ; OBJ: } |
| ; OBJ: ] |
| |
| ; OBJ: CodeViewDebugInfo [ |
| ; OBJ: Section: .debug$S |
| ; OBJ: Magic: 0x4 |
| ; OBJ: Subsection [ |
| ; OBJ: SubSectionType: Symbols (0xF1) |
| ; OBJ: DataSym { |
| ; OBJ: Kind: S_LDATA32 (0x110C) |
| ; OBJ: DataOffset: ?first@@3HA+0x0 |
| ; OBJ: Type: int (0x74) |
| ; OBJ: DisplayName: first |
| ; OBJ: LinkageName: ?first@@3HA |
| ; OBJ: } |
| ; OBJ: GlobalTLS { |
| ; OBJ: DataOffset: ?middle@@3PEBHEB+0x0 |
| ; OBJ: Type: const int* (0x1001) |
| ; OBJ: DisplayName: middle |
| ; OBJ: LinkageName: ?middle@@3PEBHEB |
| ; OBJ: } |
| ; OBJ: GlobalData { |
| ; OBJ: Kind: S_GDATA32 (0x110D) |
| ; OBJ: DataOffset: ?last@@3HA+0x0 |
| ; OBJ: Type: int (0x74) |
| ; OBJ: DisplayName: last |
| ; OBJ: LinkageName: ?last@@3HA |
| ; OBJ: } |
| ; OBJ: ] |
| ; OBJ: ] |
| ; OBJ: CodeViewDebugInfo [ |
| ; OBJ: Section: .debug$S |
| ; OBJ: Magic: 0x4 |
| ; OBJ: Subsection [ |
| ; OBJ: SubSectionType: Symbols (0xF1) |
| ; OBJ: GlobalData { |
| ; OBJ: DataOffset: ?comdat@?$A@X@@2HB+0x0 |
| ; OBJ: Type: const int (0x1000) |
| ; OBJ: DisplayName: comdat |
| ; OBJ: LinkageName: ?comdat@?$A@X@@2HB |
| ; OBJ: } |
| ; OBJ: ] |
| ; OBJ: ] |
| |
| ; YAML-LABEL: - Name: '.debug$S' |
| ; YAML: Subsections: |
| ; YAML: - !Symbols |
| ; YAML: Records: |
| ; YAML: - Kind: S_COMPILE3 |
| ; YAML: Compile3Sym: |
| ; YAML: - !Symbols |
| ; YAML: Records: |
| ; YAML: - Kind: S_LDATA32 |
| ; YAML: DataSym: |
| ; YAML-NOT: Segment |
| ; YAML: Type: 116 |
| ; YAML-NOT: Segment |
| ; YAML: DisplayName: first |
| ; YAML-NOT: Segment |
| ; YAML: - Kind: S_GTHREAD32 |
| ; YAML: ThreadLocalDataSym: |
| ; YAML: Type: 4097 |
| ; YAML: DisplayName: middle |
| ; YAML: - Kind: S_GDATA32 |
| ; YAML: DataSym: |
| ; YAML-NOT: Segment |
| ; YAML: Type: 116 |
| ; YAML-NOT: Offset |
| ; YAML-NOT: Segment |
| ; YAML: DisplayName: last |
| ; YAML-NOT: Segment |
| |
| ; The missing offsets are represented as relocations against this section. |
| ; YAML: Relocations: |
| ; YAML: - VirtualAddress: 92 |
| ; YAML: SymbolName: '?first@@3HA' |
| ; YAML: Type: IMAGE_REL_AMD64_SECREL |
| ; YAML: - VirtualAddress: 96 |
| ; YAML: SymbolName: '?first@@3HA' |
| ; YAML: Type: IMAGE_REL_AMD64_SECTION |
| |
| ; ModuleID = 't.cpp' |
| source_filename = "t.cpp" |
| target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-pc-windows-msvc19.0.23918" |
| |
| $"\01?comdat@?$A@X@@2HB" = comdat any |
| |
| @"\01?first@@3HA" = internal global i32 0, align 4, !dbg !0 |
| @"\01?comdat@?$A@X@@2HB" = linkonce_odr constant i32 3, comdat, align 4, !dbg !6 |
| @"\01?middle@@3PEBHEB" = thread_local global i32* @"\01?comdat@?$A@X@@2HB", align 8, !dbg !15 |
| @"\01?last@@3HA" = global i32 0, align 4, !dbg !18 |
| |
| !llvm.dbg.cu = !{!2} |
| !llvm.module.flags = !{!20, !21, !22} |
| !llvm.ident = !{!23} |
| |
| !0 = distinct !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) |
| !1 = !DIGlobalVariable(name: "first", linkageName: "\01?first@@3HA", scope: !2, file: !3, line: 1, type: !9, isLocal: true, isDefinition: true) |
| !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 3.9.0 (trunk 271937)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5) |
| !3 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild") |
| !4 = !{} |
| !5 = !{!0, !6, !15, !18} |
| !6 = distinct !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) |
| !7 = !DIGlobalVariable(name: "comdat", linkageName: "\01?comdat@?$A@X@@2HB", scope: !2, file: !3, line: 2, type: !8, isLocal: false, isDefinition: true, declaration: !10) |
| !8 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !9) |
| !9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) |
| !10 = !DIDerivedType(tag: DW_TAG_member, name: "comdat", scope: !11, file: !3, line: 2, baseType: !8, flags: DIFlagStaticMember, extraData: i32 3) |
| !11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A<void>", file: !3, line: 2, size: 8, align: 8, elements: !12, templateParams: !13) |
| !12 = !{!10} |
| !13 = !{!14} |
| !14 = !DITemplateTypeParameter(name: "T", type: null) |
| !15 = distinct !DIGlobalVariableExpression(var: !16, expr: !DIExpression()) |
| !16 = !DIGlobalVariable(name: "middle", linkageName: "\01?middle@@3PEBHEB", scope: !2, file: !3, line: 3, type: !17, isLocal: false, isDefinition: true) |
| !17 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 64, align: 64) |
| !18 = distinct !DIGlobalVariableExpression(var: !19, expr: !DIExpression()) |
| !19 = !DIGlobalVariable(name: "last", linkageName: "\01?last@@3HA", scope: !2, file: !3, line: 4, type: !9, isLocal: false, isDefinition: true) |
| !20 = !{i32 2, !"CodeView", i32 1} |
| !21 = !{i32 2, !"Debug Info Version", i32 3} |
| !22 = !{i32 1, !"PIC Level", i32 2} |
| !23 = !{!"clang version 3.9.0 (trunk 271937)"} |
| |