1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -filetype=obj < %s | llvm-dwarfdump -v - | \
; RUN: FileCheck --check-prefix=DEFAULT --check-prefix=BOTH %s
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -filetype=obj -generate-type-units < %s | \
; RUN: llvm-dwarfdump -v - | FileCheck --check-prefix=TYPEUNITS --check-prefix=BOTH %s
;
; Check that we generate the DWARF v5 string offsets section correctly when we
; have multiple compile and type units. All units share one contribution to
; the string offsets section.
;
; Constructed from the following sources with
; clang -gdwarf-5 -emit-llvm -S a.cpp
; clang -gdwarf-5 -emit-llvm -S b.cpp
; clang -gdwarf-5 -emit-llvm -S c.cpp
; llvm-link a.ll b.ll c.ll -o test.bc
; llvm-dis test.bc -o test.ll
;
; a.cpp:
; enum E1 {a, b, c};
; E1 glob1;
;
; b.cpp:
; enum E2 {d, e, f};
; E2 glob2;
;
; c.cpp:
; enum E3 {g, h, i};
; E3 glob3;
;
; Check that all 3 compile units have the correct DW_AT_str_offsets_base attributes
; with the correct offsets. Check that strings referenced by compile units 2 and 3
; are displayed correctly.
;
; BOTH: .debug_info contents:
;
; Verify that all 3 type units have the proper DW_AT_str_offsets_base attribute.
; TYPEUNITS-NOT: contents:
; TYPEUNITS: DW_TAG_type_unit
; TYPEUNITS-NOT: {{DW_TAG|NULL}}
; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF:[0-9a-f]+]])
; TYPEUNITS-NOT: NULL
; TYPEUNITS: DW_TAG_enumerator
; TYPEUNITS-NOT: NULL
; TYPEUNITS: DW_TAG_enumerator
; TYPEUNITS-NOT: {{DW_TAG|NULL}}
; TYPEUNITS: DW_AT_name [DW_FORM_strx1] (indexed (00000005) string = "b")
; TYPEUNITS-NOT: contents:
; TYPEUNITS: DW_TAG_type_unit
; TYPEUNITS-NOT: {{DW_TAG|NULL}}
; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]])
; TYPEUNITS-NOT: NULL
; TYPEUNITS: DW_TAG_enumeration_type
; TYPEUNITS: DW_AT_name [DW_FORM_strx1] (indexed (0000000d) string = "E2")
; TYPEUNITS-NOT: contents:
; TYPEUNITS: DW_TAG_type_unit
; TYPEUNITS-NOT: {{DW_TAG|NULL}}
; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]])
; TYPEUNITS-NOT: NULL
; TYPEUNITS: DW_TAG_enumeration_type
; TYPEUNITS: DW_AT_name [DW_FORM_strx1] (indexed (00000013) string = "E3")
; CU 1
; BOTH-NOT: .contents:
; BOTH: DW_TAG_compile_unit
; BOTH-NOT: {{DW_TAG|NULL}}
; DEFAULT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF:[0-9a-f]+]])
; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]])
;
; CU 2
; BOTH-NOT: contents:
; BOTH: DW_TAG_compile_unit
; BOTH-NOT: {{DW_TAG|NULL}}
; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]])
; BOTH-NOT: NULL
; BOTH: DW_TAG_variable
; BOTH-NOT: {{DW_TAG|NULL}}
; BOTH: DW_AT_name [DW_FORM_strx1] (indexed (00000009) string = "glob2")
;
; CU 3
; BOTH-NOT: contents:
; BOTH: DW_TAG_compile_unit
; BOTH-NOT: {{DW_TAG|NULL}}
; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]])
; BOTH-NOT: NULL
; BOTH: DW_TAG_variable
; BOTH-NOT: {{DW_TAG|NULL}}
; BOTH: DW_AT_name [DW_FORM_strx1] (indexed (0000000f) string = "glob3")
;
; Extract the offset of a string to verify that it is referenced in the string
; offsets section.
; BOTH: .debug_str contents:
; BOTH-NOT: contents:
; BOTH: 0x[[GLOB2OFF:[0-9a-f]+]]: "glob2"
;
; Check the .debug_str_offsets section header and make sure the referenced string
; has the correct offset.
; BOTH: .debug_str_offsets contents:
; BOTH-NEXT: 0x00000000: Contribution size = 84, Format = DWARF32, Version = 5
; BOTH-NEXT: 0x[[CU1_STROFF]]:
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; BOTH-NEXT: {{.*:}}
; The string with index 9 should be "glob2"
; BOTH-NEXT: {{.*:}} [[GLOB2OFF]]
;
; ModuleID = 'test.bc'
source_filename = "llvm-link"
@glob1 = global i32 0, align 4, !dbg !0
@glob2 = global i32 0, align 4, !dbg !11
@glob3 = global i32 0, align 4, !dbg !22
!llvm.dbg.cu = !{!2, !13, !24}
!llvm.ident = !{!33, !33, !33}
!llvm.module.flags = !{!34, !35, !36}
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
!1 = distinct !DIGlobalVariable(name: "glob1", scope: !2, file: !3, line: 2, type: !5, isLocal: false, isDefinition: true)
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (trunk 322415)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !10)
!3 = !DIFile(filename: "a1.cpp", directory: "/home/test", checksumkind: CSK_MD5, checksum: "2ca3eeed18355d6ebbae671eafda5aae")
!4 = !{!5}
!5 = distinct !DICompositeType(tag: DW_TAG_enumeration_type, name: "E1", file: !3, line: 1, size: 32, elements: !6, identifier: "_ZTS2E1")
!6 = !{!7, !8, !9}
!7 = !DIEnumerator(name: "a", value: 0)
!8 = !DIEnumerator(name: "b", value: 1)
!9 = !DIEnumerator(name: "c", value: 2)
!10 = !{!0}
!11 = !DIGlobalVariableExpression(var: !12, expr: !DIExpression())
!12 = distinct !DIGlobalVariable(name: "glob2", scope: !13, file: !14, line: 2, type: !16, isLocal: false, isDefinition: true)
!13 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !14, producer: "clang version 7.0.0 (trunk 322415)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !15, globals: !21)
!14 = !DIFile(filename: "b.cpp", directory: "/home/test", checksumkind: CSK_MD5, checksum: "0e254f89617ecb6c4e5473546a99435c")
!15 = !{!16}
!16 = distinct !DICompositeType(tag: DW_TAG_enumeration_type, name: "E2", file: !14, line: 1, size: 32, elements: !17, identifier: "_ZTS2E2")
!17 = !{!18, !19, !20}
!18 = !DIEnumerator(name: "d", value: 0)
!19 = !DIEnumerator(name: "e", value: 1)
!20 = !DIEnumerator(name: "f", value: 2)
!21 = !{!11}
!22 = !DIGlobalVariableExpression(var: !23, expr: !DIExpression())
!23 = distinct !DIGlobalVariable(name: "glob3", scope: !24, file: !25, line: 2, type: !27, isLocal: false, isDefinition: true)
!24 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !25, producer: "clang version 7.0.0 (trunk 322415)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !26, globals: !32)
!25 = !DIFile(filename: "c.cpp", directory: "/home/test", checksumkind: CSK_MD5, checksum: "7835aaaa683fa09d295adef0e934d392")
!26 = !{!27}
!27 = distinct !DICompositeType(tag: DW_TAG_enumeration_type, name: "E3", file: !25, line: 1, size: 32, elements: !28, identifier: "_ZTS2E3")
!28 = !{!29, !30, !31}
!29 = !DIEnumerator(name: "g", value: 0)
!30 = !DIEnumerator(name: "h", value: 1)
!31 = !DIEnumerator(name: "i", value: 2)
!32 = !{!22}
!33 = !{!"clang version 7.0.0 (trunk 322415)"}
!34 = !{i32 2, !"Dwarf Version", i32 5}
!35 = !{i32 2, !"Debug Info Version", i32 3}
!36 = !{i32 1, !"wchar_size", i32 4}
|