1 ; RUN: llc -filetype=obj %s -o - | llvm-readobj -r -s -symbols | FileCheck %s 2 3 ; CHECK: Format: WASM 4 ; CHECK-NEXT:Arch: wasm32 5 ; CHECK-NEXT:AddressSize: 32bit 6 ; CHECK-NEXT:Sections [ 7 ; CHECK-NEXT: Section { 8 ; CHECK-NEXT: Type: TYPE (0x1) 9 ; CHECK-NEXT: Size: 4 10 ; CHECK-NEXT: Offset: 8 11 ; CHECK-NEXT: } 12 ; CHECK-NEXT: Section { 13 ; CHECK-NEXT: Type: IMPORT (0x2) 14 ; CHECK-NEXT: Size: 58 15 ; CHECK-NEXT: Offset: 18 16 ; CHECK-NEXT: } 17 ; CHECK-NEXT: Section { 18 ; CHECK-NEXT: Type: FUNCTION (0x3) 19 ; CHECK-NEXT: Size: 2 20 ; CHECK-NEXT: Offset: 82 21 ; CHECK-NEXT: } 22 ; CHECK-NEXT: Section { 23 ; CHECK-NEXT: Type: ELEM (0x9) 24 ; CHECK-NEXT: Size: 7 25 ; CHECK-NEXT: Offset: 90 26 ; CHECK-NEXT: } 27 ; CHECK-NEXT: Section { 28 ; CHECK-NEXT: Type: CODE (0xA) 29 ; CHECK-NEXT: Size: 4 30 ; CHECK-NEXT: Offset: 103 31 ; CHECK-NEXT: } 32 ; CHECK-NEXT: Section { 33 ; CHECK-NEXT: Type: DATA (0xB) 34 ; CHECK-NEXT: Size: 19 35 ; CHECK-NEXT: Offset: 113 36 ; CHECK-NEXT: Segments [ 37 ; CHECK-NEXT: Segment { 38 ; CHECK-NEXT: Name: .data.foo 39 ; CHECK-NEXT: Size: 4 40 ; CHECK-NEXT: Offset: 0 41 ; CHECK-NEXT: } 42 ; CHECK-NEXT: Segment { 43 ; CHECK-NEXT: Name: .data.ptr2 44 ; CHECK-NEXT: Size: 4 45 ; CHECK-NEXT: Offset: 4 46 ; CHECK-NEXT: } 47 ; CHECK-NEXT: ] 48 ; CHECK-NEXT: } 49 ; CHECK-NEXT: Section { 50 ; CHECK-NEXT: Type: CUSTOM (0x0) 51 ; CHECK-NEXT: Size: 121 52 ; CHECK-NEXT: Offset: 138 53 ; CHECK-NEXT: Name: .debug_str 54 ; CHECK-NEXT: } 55 ; CHECK-NEXT: Section { 56 ; CHECK-NEXT: Type: CUSTOM (0x0) 57 ; CHECK-NEXT: Size: 84 58 ; CHECK-NEXT: Offset: 276 59 ; CHECK-NEXT: Name: .debug_abbrev 60 ; CHECK-NEXT: } 61 ; CHECK-NEXT: Section { 62 ; CHECK-NEXT: Type: CUSTOM (0x0) 63 ; CHECK-NEXT: Size: 106 64 ; CHECK-NEXT: Offset: 380 65 ; CHECK-NEXT: Name: .debug_info 66 ; CHECK-NEXT: } 67 ; CHECK-NEXT: Section { 68 ; CHECK-NEXT: Type: CUSTOM (0x0) 69 ; CHECK-NEXT: Size: 1 70 ; CHECK-NEXT: Offset: 504 71 ; CHECK-NEXT: Name: .debug_macinfo 72 ; CHECK-NEXT: } 73 ; CHECK-NEXT: Section { 74 ; CHECK-NEXT: Type: CUSTOM (0x0) 75 ; CHECK-NEXT: Size: 42 76 ; CHECK-NEXT: Offset: 526 77 ; CHECK-NEXT: Name: .debug_pubnames 78 ; CHECK-NEXT: } 79 ; CHECK-NEXT: Section { 80 ; CHECK-NEXT: Type: CUSTOM (0x0) 81 ; CHECK-NEXT: Size: 26 82 ; CHECK-NEXT: Offset: 590 83 ; CHECK-NEXT: Name: .debug_pubtypes 84 ; CHECK-NEXT: } 85 ; CHECK-NEXT: Section { 86 ; CHECK-NEXT: Type: CUSTOM (0x0) 87 ; CHECK-NEXT: Size: 57 88 ; CHECK-NEXT: Offset: 638 89 ; CHECK-NEXT: Name: .debug_line 90 ; CHECK-NEXT: } 91 ; CHECK-NEXT: Section { 92 ; CHECK-NEXT: Type: CUSTOM (0x0) 93 ; CHECK-NEXT: Size: 88 94 ; CHECK-NEXT: Offset: 713 95 ; CHECK-NEXT: Name: linking 96 ; CHECK-NEXT: } 97 ; CHECK-NEXT: Section { 98 ; CHECK-NEXT: Type: CUSTOM (0x0) 99 ; CHECK-NEXT: Size: 9 100 ; CHECK-NEXT: Offset: 815 101 ; CHECK-NEXT: Name: reloc.DATA 102 ; CHECK-NEXT: } 103 ; CHECK-NEXT: Section { 104 ; CHECK-NEXT: Type: CUSTOM (0x0) 105 ; CHECK-NEXT: Size: 58 106 ; CHECK-NEXT: Offset: 841 107 ; CHECK-NEXT: Name: reloc..debug_info 108 ; CHECK-NEXT: } 109 ; CHECK-NEXT: Section { 110 ; CHECK-NEXT: Type: CUSTOM (0x0) 111 ; CHECK-NEXT: Size: 6 112 ; CHECK-NEXT: Offset: 923 113 ; CHECK-NEXT: Name: reloc..debug_pubnames 114 ; CHECK-NEXT: } 115 ; CHECK-NEXT: Section { 116 ; CHECK-NEXT: Type: CUSTOM (0x0) 117 ; CHECK-NEXT: Size: 6 118 ; CHECK-NEXT: Offset: 957 119 ; CHECK-NEXT: Name: reloc..debug_pubtypes 120 ; CHECK-NEXT: } 121 ; CHECK-NEXT: Section { 122 ; CHECK-NEXT: Type: CUSTOM (0x0) 123 ; CHECK-NEXT: Size: 6 124 ; CHECK-NEXT: Offset: 991 125 ; CHECK-NEXT: Name: reloc..debug_line 126 ; CHECK-NEXT: } 127 ; CHECK-NEXT:] 128 ; CHECK-NEXT:Relocations [ 129 ; CHECK-NEXT: Section (6) DATA { 130 ; CHECK-NEXT: 0x6 R_WEBASSEMBLY_MEMORY_ADDR_I32 myextern 0 131 ; CHECK-NEXT: 0xF R_WEBASSEMBLY_TABLE_INDEX_I32 f2 132 ; CHECK-NEXT: } 133 ; CHECK-NEXT: Section (9) .debug_info { 134 ; CHECK-NEXT: 0x6 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_abbrev 0 135 ; CHECK-NEXT: 0xC R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 0 136 ; CHECK-NEXT: 0x12 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 55 137 ; CHECK-NEXT: 0x16 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_line 0 138 ; CHECK-NEXT: 0x1A R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 62 139 ; CHECK-NEXT: 0x1E R_WEBASSEMBLY_FUNCTION_OFFSET_I32 f2 0 140 ; CHECK-NEXT: 0x27 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 105 141 ; CHECK-NEXT: 0x33 R_WEBASSEMBLY_MEMORY_ADDR_I32 foo 0 142 ; CHECK-NEXT: 0x3D R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 109 143 ; CHECK-NEXT: 0x44 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 113 144 ; CHECK-NEXT: 0x50 R_WEBASSEMBLY_MEMORY_ADDR_I32 ptr2 0 145 ; CHECK-NEXT: 0x5B R_WEBASSEMBLY_FUNCTION_OFFSET_I32 f2 0 146 ; CHECK-NEXT: 0x63 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_str 118 147 ; CHECK-NEXT: } 148 ; CHECK-NEXT: Section (11) .debug_pubnames { 149 ; CHECK-NEXT: 0x6 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_info 0 150 ; CHECK-NEXT: } 151 ; CHECK-NEXT: Section (12) .debug_pubtypes { 152 ; CHECK-NEXT: 0x6 R_WEBASSEMBLY_SECTION_OFFSET_I32 .debug_info 0 153 ; CHECK-NEXT: } 154 ; CHECK-NEXT: Section (13) .debug_line { 155 ; CHECK-NEXT: 0x2B R_WEBASSEMBLY_FUNCTION_OFFSET_I32 f2 0 156 ; CHECK-NEXT: } 157 ; CHECK-NEXT:] 158 ; CHECK-NEXT:Symbols [ 159 ; CHECK-NEXT: Symbol { 160 ; CHECK-NEXT: Name: f2 161 ; CHECK-NEXT: Type: FUNCTION (0x0) 162 ; CHECK-NEXT: Flags: 0x4 163 ; CHECK-NEXT: } 164 ; CHECK-NEXT: Symbol { 165 ; CHECK-NEXT: Name: foo 166 ; CHECK-NEXT: Type: DATA (0x1) 167 ; CHECK-NEXT: Flags: 0x4 168 ; CHECK-NEXT: } 169 ; CHECK-NEXT: Symbol { 170 ; CHECK-NEXT: Name: myextern 171 ; CHECK-NEXT: Type: DATA (0x1) 172 ; CHECK-NEXT: Flags: 0x10 173 ; CHECK-NEXT: } 174 ; CHECK-NEXT: Symbol { 175 ; CHECK-NEXT: Name: ptr2 176 ; CHECK-NEXT: Type: DATA (0x1) 177 ; CHECK-NEXT: Flags: 0x4 178 ; CHECK-NEXT: } 179 ; CHECK-NEXT: Symbol { 180 ; CHECK-NEXT: Name: .debug_str 181 ; CHECK-NEXT: Type: SECTION (0x3) 182 ; CHECK-NEXT: Flags: 0x2 183 ; CHECK-NEXT: } 184 ; CHECK-NEXT: Symbol { 185 ; CHECK-NEXT: Name: .debug_abbrev 186 ; CHECK-NEXT: Type: SECTION (0x3) 187 ; CHECK-NEXT: Flags: 0x2 188 ; CHECK-NEXT: } 189 ; CHECK-NEXT: Symbol { 190 ; CHECK-NEXT: Name: .debug_info 191 ; CHECK-NEXT: Type: SECTION (0x3) 192 ; CHECK-NEXT: Flags: 0x2 193 ; CHECK-NEXT: } 194 ; CHECK-NEXT: Symbol { 195 ; CHECK-NEXT: Name: .debug_line 196 ; CHECK-NEXT: Type: SECTION (0x3) 197 ; CHECK-NEXT: Flags: 0x2 198 ; CHECK-NEXT: } 199 ; CHECK-NEXT:] 200 201 ; generated from the following C code using: clang --target=wasm32 -g -O0 -S -emit-llvm test.c 202 ; extern int myextern; 203 ; void f2(void) { return; } 204 ; 205 ; int* foo = &myextern; 206 ; void (*ptr2)(void) = f2; 207 208 target triple = "wasm32-unknown-unknown" 209 210 source_filename = "test.c" 211 212 @myextern = external global i32, align 4 213 @foo = hidden global i32* @myextern, align 4, !dbg !0 214 @ptr2 = hidden global void ()* @f2, align 4, !dbg !6 215 216 ; Function Attrs: noinline nounwind optnone 217 define hidden void @f2() #0 !dbg !17 { 218 entry: 219 ret void, !dbg !18 220 } 221 222 attributes #0 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="generic" "unsafe-fp-math"="false" "use-soft-float"="false" } 223 224 !llvm.dbg.cu = !{!2} 225 !llvm.module.flags = !{!13, !14, !15} 226 !llvm.ident = !{!16} 227 228 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) 229 !1 = distinct !DIGlobalVariable(name: "foo", scope: !2, file: !3, line: 4, type: !11, isLocal: false, isDefinition: true) 230 !2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 7.0.0 (trunk 332303) (llvm/trunk 332406)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5) 231 !3 = !DIFile(filename: "test.c", directory: "/usr/local/google/home/sbc/dev/wasm/simple") 232 !4 = !{} 233 !5 = !{!0, !6} 234 !6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) 235 !7 = distinct !DIGlobalVariable(name: "ptr2", scope: !2, file: !3, line: 5, type: !8, isLocal: false, isDefinition: true) 236 !8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 32) 237 !9 = !DISubroutineType(types: !10) 238 !10 = !{null} 239 !11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 32) 240 !12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 241 !13 = !{i32 2, !"Dwarf Version", i32 4} 242 !14 = !{i32 2, !"Debug Info Version", i32 3} 243 !15 = !{i32 1, !"wchar_size", i32 4} 244 !16 = !{!"clang version 7.0.0 (trunk 332303) (llvm/trunk 332406)"} 245 !17 = distinct !DISubprogram(name: "f2", scope: !3, file: !3, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !2, retainedNodes: !4) 246 !18 = !DILocation(line: 2, column: 17, scope: !17) 247