1 ; RUN: llc -filetype=obj %s -o %t.o 2 ; RUN: obj2yaml %t.o | FileCheck %s 3 ; RUN: llvm-objdump -t %t.o | FileCheck --check-prefix=CHECK-SYMS %s 4 5 target triple = "wasm32-unknown-unknown" 6 7 ; 'foo_alias()' is weak alias of function 'foo()' 8 ; 'bar_alias' is weak alias of global variable 'bar' 9 ; Generates two exports of the same function, one of them weak 10 11 @bar = global i32 7, align 8 12 @bar_alias = weak hidden alias i32, i32* @bar 13 @foo_alias = weak hidden alias i32 (), i32 ()* @foo 14 15 @direct_address = global i32()* @foo, align 8 16 @alias_address = global i32()* @foo_alias, align 8 17 18 define hidden i32 @foo() #0 { 19 entry: 20 ret i32 0 21 } 22 23 define hidden i32 @call_direct() #0 { 24 entry: 25 %call = call i32 @foo() 26 ret i32 %call 27 } 28 29 define hidden i32 @call_alias() #0 { 30 entry: 31 %call = call i32 @foo_alias() 32 ret i32 %call 33 } 34 35 define hidden i32 @call_direct_ptr() #0 { 36 entry: 37 %0 = load i32 ()*, i32 ()** @direct_address, align 8 38 %call = call i32 %0() 39 ret i32 %call 40 } 41 42 define hidden i32 @call_alias_ptr() #0 { 43 entry: 44 %0 = load i32 ()*, i32 ()** @alias_address, align 8 45 %call = call i32 %0() 46 ret i32 %call 47 } 48 49 ; CHECK: - Type: TYPE 50 ; CHECK-NEXT: Signatures: 51 ; CHECK-NEXT: - Index: 0 52 ; CHECK-NEXT: ReturnType: I32 53 ; CHECK-NEXT: ParamTypes: 54 ; CHECK-NEXT: - Type: IMPORT 55 ; CHECK-NEXT: Imports: 56 ; CHECK-NEXT: - Module: env 57 ; CHECK-NEXT: Field: __linear_memory 58 ; CHECK-NEXT: Kind: MEMORY 59 ; CHECK-NEXT: Memory: 60 ; CHECK-NEXT: Initial: 0x00000001 61 ; CHECK-NEXT: - Module: env 62 ; CHECK-NEXT: Field: __indirect_function_table 63 ; CHECK-NEXT: Kind: TABLE 64 ; CHECK-NEXT: Table: 65 ; CHECK-NEXT: ElemType: ANYFUNC 66 ; CHECK-NEXT: Limits: 67 ; CHECK-NEXT: Initial: 0x00000001 68 ; CHECK-NEXT: - Type: FUNCTION 69 ; CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ] 70 ; CHECK-NEXT: - Type: ELEM 71 ; CHECK-NEXT: Segments: 72 ; CHECK-NEXT: - Offset: 73 ; CHECK-NEXT: Opcode: I32_CONST 74 ; CHECK-NEXT: Value: 1 75 ; CHECK-NEXT: Functions: [ 0 ] 76 ; CHECK-NEXT: - Type: CODE 77 ; CHECK-NEXT: Relocations: 78 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB 79 ; CHECK-NEXT: Index: 0 80 ; CHECK-NEXT: Offset: 0x00000009 81 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB 82 ; CHECK-NEXT: Index: 3 83 ; CHECK-NEXT: Offset: 0x00000012 84 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB 85 ; CHECK-NEXT: Index: 5 86 ; CHECK-NEXT: Offset: 0x0000001E 87 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_TYPE_INDEX_LEB 88 ; CHECK-NEXT: Index: 0 89 ; CHECK-NEXT: Offset: 0x00000024 90 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_LEB 91 ; CHECK-NEXT: Index: 7 92 ; CHECK-NEXT: Offset: 0x00000031 93 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_TYPE_INDEX_LEB 94 ; CHECK-NEXT: Index: 0 95 ; CHECK-NEXT: Offset: 0x00000037 96 ; CHECK-NEXT: Functions: 97 ; CHECK-NEXT: - Index: 0 98 ; CHECK-NEXT: Locals: 99 ; CHECK-NEXT: Body: 41000B 100 ; CHECK-NEXT: - Index: 1 101 ; CHECK-NEXT: Locals: 102 ; CHECK-NEXT: Body: 1080808080000B 103 ; CHECK-NEXT: - Index: 2 104 ; CHECK-NEXT: Locals: 105 ; CHECK-NEXT: Body: 1080808080000B 106 ; CHECK-NEXT: - Index: 3 107 ; CHECK-NEXT: Locals: 108 ; CHECK-NEXT: Body: 410028028880808000118080808000000B 109 ; CHECK-NEXT: - Index: 4 110 ; CHECK-NEXT: Locals: 111 ; CHECK-NEXT: Body: 410028029080808000118080808000000B 112 ; CHECK-NEXT: - Type: DATA 113 ; CHECK-NEXT: Relocations: 114 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_I32 115 ; CHECK-NEXT: Index: 0 116 ; CHECK-NEXT: Offset: 0x0000000F 117 ; CHECK-NEXT: - Type: R_WEBASSEMBLY_TABLE_INDEX_I32 118 ; CHECK-NEXT: Index: 3 119 ; CHECK-NEXT: Offset: 0x00000018 120 ; CHECK-NEXT: Segments: 121 ; CHECK-NEXT: - SectionOffset: 6 122 ; CHECK-NEXT: MemoryIndex: 0 123 ; CHECK-NEXT: Offset: 124 ; CHECK-NEXT: Opcode: I32_CONST 125 ; CHECK-NEXT: Value: 0 126 ; CHECK-NEXT: Content: '07000000' 127 ; CHECK-NEXT: - SectionOffset: 15 128 ; CHECK-NEXT: MemoryIndex: 0 129 ; CHECK-NEXT: Offset: 130 ; CHECK-NEXT: Opcode: I32_CONST 131 ; CHECK-NEXT: Value: 8 132 ; CHECK-NEXT: Content: '01000000' 133 ; CHECK-NEXT: - SectionOffset: 24 134 ; CHECK-NEXT: MemoryIndex: 0 135 ; CHECK-NEXT: Offset: 136 ; CHECK-NEXT: Opcode: I32_CONST 137 ; CHECK-NEXT: Value: 16 138 ; CHECK-NEXT: Content: '01000000' 139 ; CHECK-NEXT: - Type: CUSTOM 140 ; CHECK-NEXT: Name: linking 141 ; CHECK-NEXT: Version: 1 142 ; CHECK-NEXT: SymbolTable: 143 ; CHECK-NEXT: - Index: 0 144 ; CHECK-NEXT: Kind: FUNCTION 145 ; CHECK-NEXT: Name: foo 146 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] 147 ; CHECK-NEXT: Function: 0 148 ; CHECK-NEXT: - Index: 1 149 ; CHECK-NEXT: Kind: FUNCTION 150 ; CHECK-NEXT: Name: call_direct 151 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] 152 ; CHECK-NEXT: Function: 1 153 ; CHECK-NEXT: - Index: 2 154 ; CHECK-NEXT: Kind: FUNCTION 155 ; CHECK-NEXT: Name: call_alias 156 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] 157 ; CHECK-NEXT: Function: 2 158 ; CHECK-NEXT: - Index: 3 159 ; CHECK-NEXT: Kind: FUNCTION 160 ; CHECK-NEXT: Name: foo_alias 161 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] 162 ; CHECK-NEXT: Function: 0 163 ; CHECK-NEXT: - Index: 4 164 ; CHECK-NEXT: Kind: FUNCTION 165 ; CHECK-NEXT: Name: call_direct_ptr 166 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] 167 ; CHECK-NEXT: Function: 3 168 ; CHECK-NEXT: - Index: 5 169 ; CHECK-NEXT: Kind: DATA 170 ; CHECK-NEXT: Name: direct_address 171 ; CHECK-NEXT: Flags: [ ] 172 ; CHECK-NEXT: Segment: 1 173 ; CHECK-NEXT: Size: 4 174 ; CHECK-NEXT: - Index: 6 175 ; CHECK-NEXT: Kind: FUNCTION 176 ; CHECK-NEXT: Name: call_alias_ptr 177 ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] 178 ; CHECK-NEXT: Function: 4 179 ; CHECK-NEXT: - Index: 7 180 ; CHECK-NEXT: Kind: DATA 181 ; CHECK-NEXT: Name: alias_address 182 ; CHECK-NEXT: Flags: [ ] 183 ; CHECK-NEXT: Segment: 2 184 ; CHECK-NEXT: Size: 4 185 ; CHECK-NEXT: - Index: 8 186 ; CHECK-NEXT: Kind: DATA 187 ; CHECK-NEXT: Name: bar 188 ; CHECK-NEXT: Flags: [ ] 189 ; CHECK-NEXT: Segment: 0 190 ; CHECK-NEXT: Size: 4 191 ; CHECK-NEXT: - Index: 9 192 ; CHECK-NEXT: Kind: DATA 193 ; CHECK-NEXT: Name: bar_alias 194 ; CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] 195 ; CHECK-NEXT: Segment: 0 196 ; CHECK-NEXT: Size: 4 197 ; CHECK-NEXT: SegmentInfo: 198 ; CHECK-NEXT: - Index: 0 199 ; CHECK-NEXT: Name: .data.bar 200 ; CHECK-NEXT: Alignment: 8 201 ; CHECK-NEXT: Flags: [ ] 202 ; CHECK-NEXT: - Index: 1 203 ; CHECK-NEXT: Name: .data.direct_address 204 ; CHECK-NEXT: Alignment: 8 205 ; CHECK-NEXT: Flags: [ ] 206 ; CHECK-NEXT: - Index: 2 207 ; CHECK-NEXT: Name: .data.alias_address 208 ; CHECK-NEXT: Alignment: 8 209 ; CHECK-NEXT: Flags: [ ] 210 ; CHECK-NEXT: ... 211 212 ; CHECK-SYMS: SYMBOL TABLE: 213 ; CHECK-SYMS-NEXT: 00000000 g F CODE .hidden foo 214 ; CHECK-SYMS-NEXT: 00000001 g F CODE .hidden call_direct 215 ; CHECK-SYMS-NEXT: 00000002 g F CODE .hidden call_alias 216 ; CHECK-SYMS-NEXT: 00000000 gw F CODE .hidden foo_alias 217 ; CHECK-SYMS-NEXT: 00000003 g F CODE .hidden call_direct_ptr 218 ; CHECK-SYMS-NEXT: 00000008 g DATA direct_address 219 ; CHECK-SYMS-NEXT: 00000004 g F CODE .hidden call_alias_ptr 220 ; CHECK-SYMS-NEXT: 00000010 g DATA alias_address 221 ; CHECK-SYMS-NEXT: 00000000 g DATA bar 222 ; CHECK-SYMS-NEXT: 00000000 gw DATA .hidden bar_alias 223