Skip to content

Commit 0cb776e

Browse files
committed
[WebAssembly] Fix null pointer in createInitTLSFunction
Summary: `createSyntheticSymbols`, which creates `WasmSym::InitTLS`, is only called when `!config->relocatable`, but this condition is not checked when calling `createInitTLSFunction`. This diff checks `!config->relocatable` before calling `createInitTLSFunction`. Fixes emscripten-core/emscripten#9155. Reviewers: tlively, aheejin, kripken, sbc100 Subscribers: dschuff, jgravelle-google, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65785 llvm-svn: 368078
1 parent 53e9c2d commit 0cb776e

File tree

2 files changed

+186
-176
lines changed

2 files changed

+186
-176
lines changed

lld/test/wasm/relocatable.ll

Lines changed: 185 additions & 175 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
; RUN: llc -filetype=obj %p/Inputs/hello.ll -o %t.hello.o
22
; RUN: llc -filetype=obj %s -o %t.o
33
; RUN: wasm-ld -r -o %t.wasm %t.hello.o %t.o
4-
; RUN: obj2yaml %t.wasm | FileCheck %s
4+
; RUN: obj2yaml %t.wasm | FileCheck %s --check-prefixes CHECK,NORMAL
5+
6+
; RUN: llc -filetype=obj %p/Inputs/hello.ll -o %t.hello.bm.o -mattr=+bulk-memory
7+
; RUN: llc -filetype=obj %s -o %t.bm.o -mattr=+bulk-memory
8+
; RUN: wasm-ld -r -o %t.mt.wasm %t.hello.bm.o %t.bm.o --shared-memory --max-memory=131072
9+
; RUN: obj2yaml %t.mt.wasm | FileCheck %s --check-prefixes CHECK,SHARED
510

611
target triple = "wasm32-unknown-unknown"
712

@@ -70,13 +75,18 @@ entry:
7075
; CHECK-NEXT: Maximum: 0x00000004
7176
; CHECK-NEXT: - Type: MEMORY
7277
; CHECK-NEXT: Memories:
73-
; CHECK-NEXT: - Initial: 0x00000001
78+
; NORMAL-NEXT: - Initial: 0x00000001
79+
; SHARED-NEXT: - Flags: [ HAS_MAX, IS_SHARED ]
80+
; SHARED-NEXT: Initial: 0x00000001
81+
; SHARED-NEXT: Maximum: 0x00000002
7482
; CHECK-NEXT: - Type: ELEM
7583
; CHECK-NEXT: Segments:
7684
; CHECK-NEXT: - Offset:
7785
; CHECK-NEXT: Opcode: I32_CONST
7886
; CHECK-NEXT: Value: 1
7987
; CHECK-NEXT: Functions: [ 4, 1, 2 ]
88+
; SHARED-NEXT: - Type: DATACOUNT
89+
; SHARED-NEXT: Count: 6
8090
; CHECK-NEXT: - Type: CODE
8191
; CHECK-NEXT: Relocations:
8292
; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_SLEB
@@ -104,176 +114,176 @@ entry:
104114
; CHECK-NEXT: - Index: 5
105115
; CHECK-NEXT: Locals:
106116
; CHECK-NEXT: Body: 419C808080000B
107-
; CHECK-NEXT: - Type: DATA
108-
; CHECK-NEXT: Relocations:
109-
; CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32
110-
; CHECK-NEXT: Index: 3
111-
; CHECK-NEXT: Offset: 0x00000012
112-
; CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32
113-
; CHECK-NEXT: Index: 4
114-
; CHECK-NEXT: Offset: 0x0000001B
115-
; CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32
116-
; CHECK-NEXT: Index: 5
117-
; CHECK-NEXT: Offset: 0x00000024
118-
; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
119-
; CHECK-NEXT: Index: 12
120-
; CHECK-NEXT: Offset: 0x0000002D
121-
; CHECK-NEXT: Segments:
122-
; CHECK-NEXT: - SectionOffset: 6
123-
; CHECK-NEXT: InitFlags: 0
124-
; CHECK-NEXT: Offset:
125-
; CHECK-NEXT: Opcode: I32_CONST
126-
; CHECK-NEXT: Value: 0
127-
; CHECK-NEXT: Content: 68656C6C6F0A00
128-
; CHECK-NEXT: - SectionOffset: 18
129-
; CHECK-NEXT: InitFlags: 0
130-
; CHECK-NEXT: Offset:
131-
; CHECK-NEXT: Opcode: I32_CONST
132-
; CHECK-NEXT: Value: 8
133-
; CHECK-NEXT: Content: '01000000'
134-
; CHECK-NEXT: - SectionOffset: 27
135-
; CHECK-NEXT: InitFlags: 0
136-
; CHECK-NEXT: Offset:
137-
; CHECK-NEXT: Opcode: I32_CONST
138-
; CHECK-NEXT: Value: 12
139-
; CHECK-NEXT: Content: '02000000'
140-
; CHECK-NEXT: - SectionOffset: 36
141-
; CHECK-NEXT: InitFlags: 0
142-
; CHECK-NEXT: Offset:
143-
; CHECK-NEXT: Opcode: I32_CONST
144-
; CHECK-NEXT: Value: 16
145-
; CHECK-NEXT: Content: '03000000'
146-
; CHECK-NEXT: - SectionOffset: 45
147-
; CHECK-NEXT: InitFlags: 0
148-
; CHECK-NEXT: Offset:
149-
; CHECK-NEXT: Opcode: I32_CONST
150-
; CHECK-NEXT: Value: 24
151-
; CHECK-NEXT: Content: '00000000'
152-
; CHECK-NEXT: - SectionOffset: 54
153-
; CHECK-NEXT: InitFlags: 0
154-
; CHECK-NEXT: Offset:
155-
; CHECK-NEXT: Opcode: I32_CONST
156-
; CHECK-NEXT: Value: 28
157-
; CHECK-NEXT: Content: '616263'
158-
; CHECK-NEXT: - Type: CUSTOM
159-
; CHECK-NEXT: Name: linking
160-
; CHECK-NEXT: Version: 2
161-
; CHECK-NEXT: SymbolTable:
162-
; CHECK-NEXT: - Index: 0
163-
; CHECK-NEXT: Kind: FUNCTION
164-
; CHECK-NEXT: Name: hello
165-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
166-
; CHECK-NEXT: Function: 3
167-
; CHECK-NEXT: - Index: 1
168-
; CHECK-NEXT: Kind: DATA
169-
; CHECK-NEXT: Name: hello_str
170-
; CHECK-NEXT: Flags: [ ]
171-
; CHECK-NEXT: Segment: 0
172-
; CHECK-NEXT: Size: 7
173-
; CHECK-NEXT: - Index: 2
174-
; CHECK-NEXT: Kind: FUNCTION
175-
; CHECK-NEXT: Name: puts
176-
; CHECK-NEXT: Flags: [ UNDEFINED ]
177-
; CHECK-NEXT: Function: 0
178-
; CHECK-NEXT: - Index: 3
179-
; CHECK-NEXT: Kind: FUNCTION
180-
; CHECK-NEXT: Name: my_func
181-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
182-
; CHECK-NEXT: Function: 4
183-
; CHECK-NEXT: - Index: 4
184-
; CHECK-NEXT: Kind: FUNCTION
185-
; CHECK-NEXT: Name: foo_import
186-
; CHECK-NEXT: Flags: [ UNDEFINED ]
187-
; CHECK-NEXT: Function: 1
188-
; CHECK-NEXT: - Index: 5
189-
; CHECK-NEXT: Kind: FUNCTION
190-
; CHECK-NEXT: Name: bar_import
191-
; CHECK-NEXT: Flags: [ BINDING_WEAK, UNDEFINED ]
192-
; CHECK-NEXT: Function: 2
193-
; CHECK-NEXT: - Index: 6
194-
; CHECK-NEXT: Kind: FUNCTION
195-
; CHECK-NEXT: Name: func_comdat
196-
; CHECK-NEXT: Flags: [ BINDING_WEAK ]
197-
; CHECK-NEXT: Function: 5
198-
; CHECK-NEXT: - Index: 7
199-
; CHECK-NEXT: Kind: DATA
200-
; CHECK-NEXT: Name: data_comdat
201-
; CHECK-NEXT: Flags: [ BINDING_WEAK ]
202-
; CHECK-NEXT: Segment: 5
203-
; CHECK-NEXT: Size: 3
204-
; CHECK-NEXT: - Index: 8
205-
; CHECK-NEXT: Kind: DATA
206-
; CHECK-NEXT: Name: func_addr1
207-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
208-
; CHECK-NEXT: Segment: 1
209-
; CHECK-NEXT: Size: 4
210-
; CHECK-NEXT: - Index: 9
211-
; CHECK-NEXT: Kind: DATA
212-
; CHECK-NEXT: Name: func_addr2
213-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
214-
; CHECK-NEXT: Segment: 2
215-
; CHECK-NEXT: Size: 4
216-
; CHECK-NEXT: - Index: 10
217-
; CHECK-NEXT: Kind: DATA
218-
; CHECK-NEXT: Name: func_addr3
219-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
220-
; CHECK-NEXT: Segment: 3
221-
; CHECK-NEXT: Size: 4
222-
; CHECK-NEXT: - Index: 11
223-
; CHECK-NEXT: Kind: DATA
224-
; CHECK-NEXT: Name: data_addr1
225-
; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ]
226-
; CHECK-NEXT: Segment: 4
227-
; CHECK-NEXT: Size: 4
228-
; CHECK-NEXT: - Index: 12
229-
; CHECK-NEXT: Kind: DATA
230-
; CHECK-NEXT: Name: data_import
231-
; CHECK-NEXT: Flags: [ UNDEFINED ]
232-
; CHECK-NEXT: SegmentInfo:
233-
; CHECK-NEXT: - Index: 0
234-
; CHECK-NEXT: Name: .rodata.hello_str
235-
; CHECK-NEXT: Alignment: 0
236-
; CHECK-NEXT: Flags: [ ]
237-
; CHECK-NEXT: - Index: 1
238-
; CHECK-NEXT: Name: .data.func_addr1
239-
; CHECK-NEXT: Alignment: 2
240-
; CHECK-NEXT: Flags: [ ]
241-
; CHECK-NEXT: - Index: 2
242-
; CHECK-NEXT: Name: .data.func_addr2
243-
; CHECK-NEXT: Alignment: 2
244-
; CHECK-NEXT: Flags: [ ]
245-
; CHECK-NEXT: - Index: 3
246-
; CHECK-NEXT: Name: .data.func_addr3
247-
; CHECK-NEXT: Alignment: 2
248-
; CHECK-NEXT: Flags: [ ]
249-
; CHECK-NEXT: - Index: 4
250-
; CHECK-NEXT: Name: .data.data_addr1
251-
; CHECK-NEXT: Alignment: 3
252-
; CHECK-NEXT: Flags: [ ]
253-
; CHECK-NEXT: - Index: 5
254-
; CHECK-NEXT: Name: .rodata.data_comdat
255-
; CHECK-NEXT: Alignment: 0
256-
; CHECK-NEXT: Flags: [ ]
257-
; CHECK-NEXT: Comdats:
258-
; CHECK-NEXT: - Name: func_comdat
259-
; CHECK-NEXT: Entries:
260-
; CHECK-NEXT: - Kind: FUNCTION
261-
; CHECK-NEXT: Index: 5
262-
; CHECK-NEXT: - Kind: DATA
263-
; CHECK-NEXT: Index: 5
264-
; CHECK-NEXT: - Type: CUSTOM
265-
; CHECK-NEXT: Name: name
266-
; CHECK-NEXT: FunctionNames:
267-
; CHECK-NEXT: - Index: 0
268-
; CHECK-NEXT: Name: puts
269-
; CHECK-NEXT: - Index: 1
270-
; CHECK-NEXT: Name: foo_import
271-
; CHECK-NEXT: - Index: 2
272-
; CHECK-NEXT: Name: bar_import
273-
; CHECK-NEXT: - Index: 3
274-
; CHECK-NEXT: Name: hello
275-
; CHECK-NEXT: - Index: 4
276-
; CHECK-NEXT: Name: my_func
277-
; CHECK-NEXT: - Index: 5
278-
; CHECK-NEXT: Name: func_comdat
279-
; CHECK-NEXT: ...
117+
; NORMAL-NEXT: - Type: DATA
118+
; NORMAL-NEXT: Relocations:
119+
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
120+
; NORMAL-NEXT: Index: 3
121+
; NORMAL-NEXT: Offset: 0x00000012
122+
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
123+
; NORMAL-NEXT: Index: 4
124+
; NORMAL-NEXT: Offset: 0x0000001B
125+
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
126+
; NORMAL-NEXT: Index: 5
127+
; NORMAL-NEXT: Offset: 0x00000024
128+
; NORMAL-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
129+
; NORMAL-NEXT: Index: 12
130+
; NORMAL-NEXT: Offset: 0x0000002D
131+
; NORMAL-NEXT: Segments:
132+
; NORMAL-NEXT: - SectionOffset: 6
133+
; NORMAL-NEXT: InitFlags: 0
134+
; NORMAL-NEXT: Offset:
135+
; NORMAL-NEXT: Opcode: I32_CONST
136+
; NORMAL-NEXT: Value: 0
137+
; NORMAL-NEXT: Content: 68656C6C6F0A00
138+
; NORMAL-NEXT: - SectionOffset: 18
139+
; NORMAL-NEXT: InitFlags: 0
140+
; NORMAL-NEXT: Offset:
141+
; NORMAL-NEXT: Opcode: I32_CONST
142+
; NORMAL-NEXT: Value: 8
143+
; NORMAL-NEXT: Content: '01000000'
144+
; NORMAL-NEXT: - SectionOffset: 27
145+
; NORMAL-NEXT: InitFlags: 0
146+
; NORMAL-NEXT: Offset:
147+
; NORMAL-NEXT: Opcode: I32_CONST
148+
; NORMAL-NEXT: Value: 12
149+
; NORMAL-NEXT: Content: '02000000'
150+
; NORMAL-NEXT: - SectionOffset: 36
151+
; NORMAL-NEXT: InitFlags: 0
152+
; NORMAL-NEXT: Offset:
153+
; NORMAL-NEXT: Opcode: I32_CONST
154+
; NORMAL-NEXT: Value: 16
155+
; NORMAL-NEXT: Content: '03000000'
156+
; NORMAL-NEXT: - SectionOffset: 45
157+
; NORMAL-NEXT: InitFlags: 0
158+
; NORMAL-NEXT: Offset:
159+
; NORMAL-NEXT: Opcode: I32_CONST
160+
; NORMAL-NEXT: Value: 24
161+
; NORMAL-NEXT: Content: '00000000'
162+
; NORMAL-NEXT: - SectionOffset: 54
163+
; NORMAL-NEXT: InitFlags: 0
164+
; NORMAL-NEXT: Offset:
165+
; NORMAL-NEXT: Opcode: I32_CONST
166+
; NORMAL-NEXT: Value: 28
167+
; NORMAL-NEXT: Content: '616263'
168+
; NORMAL-NEXT: - Type: CUSTOM
169+
; NORMAL-NEXT: Name: linking
170+
; NORMAL-NEXT: Version: 2
171+
; NORMAL-NEXT: SymbolTable:
172+
; NORMAL-NEXT: - Index: 0
173+
; NORMAL-NEXT: Kind: FUNCTION
174+
; NORMAL-NEXT: Name: hello
175+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
176+
; NORMAL-NEXT: Function: 3
177+
; NORMAL-NEXT: - Index: 1
178+
; NORMAL-NEXT: Kind: DATA
179+
; NORMAL-NEXT: Name: hello_str
180+
; NORMAL-NEXT: Flags: [ ]
181+
; NORMAL-NEXT: Segment: 0
182+
; NORMAL-NEXT: Size: 7
183+
; NORMAL-NEXT: - Index: 2
184+
; NORMAL-NEXT: Kind: FUNCTION
185+
; NORMAL-NEXT: Name: puts
186+
; NORMAL-NEXT: Flags: [ UNDEFINED ]
187+
; NORMAL-NEXT: Function: 0
188+
; NORMAL-NEXT: - Index: 3
189+
; NORMAL-NEXT: Kind: FUNCTION
190+
; NORMAL-NEXT: Name: my_func
191+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
192+
; NORMAL-NEXT: Function: 4
193+
; NORMAL-NEXT: - Index: 4
194+
; NORMAL-NEXT: Kind: FUNCTION
195+
; NORMAL-NEXT: Name: foo_import
196+
; NORMAL-NEXT: Flags: [ UNDEFINED ]
197+
; NORMAL-NEXT: Function: 1
198+
; NORMAL-NEXT: - Index: 5
199+
; NORMAL-NEXT: Kind: FUNCTION
200+
; NORMAL-NEXT: Name: bar_import
201+
; NORMAL-NEXT: Flags: [ BINDING_WEAK, UNDEFINED ]
202+
; NORMAL-NEXT: Function: 2
203+
; NORMAL-NEXT: - Index: 6
204+
; NORMAL-NEXT: Kind: FUNCTION
205+
; NORMAL-NEXT: Name: func_comdat
206+
; NORMAL-NEXT: Flags: [ BINDING_WEAK ]
207+
; NORMAL-NEXT: Function: 5
208+
; NORMAL-NEXT: - Index: 7
209+
; NORMAL-NEXT: Kind: DATA
210+
; NORMAL-NEXT: Name: data_comdat
211+
; NORMAL-NEXT: Flags: [ BINDING_WEAK ]
212+
; NORMAL-NEXT: Segment: 5
213+
; NORMAL-NEXT: Size: 3
214+
; NORMAL-NEXT: - Index: 8
215+
; NORMAL-NEXT: Kind: DATA
216+
; NORMAL-NEXT: Name: func_addr1
217+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
218+
; NORMAL-NEXT: Segment: 1
219+
; NORMAL-NEXT: Size: 4
220+
; NORMAL-NEXT: - Index: 9
221+
; NORMAL-NEXT: Kind: DATA
222+
; NORMAL-NEXT: Name: func_addr2
223+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
224+
; NORMAL-NEXT: Segment: 2
225+
; NORMAL-NEXT: Size: 4
226+
; NORMAL-NEXT: - Index: 10
227+
; NORMAL-NEXT: Kind: DATA
228+
; NORMAL-NEXT: Name: func_addr3
229+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
230+
; NORMAL-NEXT: Segment: 3
231+
; NORMAL-NEXT: Size: 4
232+
; NORMAL-NEXT: - Index: 11
233+
; NORMAL-NEXT: Kind: DATA
234+
; NORMAL-NEXT: Name: data_addr1
235+
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
236+
; NORMAL-NEXT: Segment: 4
237+
; NORMAL-NEXT: Size: 4
238+
; NORMAL-NEXT: - Index: 12
239+
; NORMAL-NEXT: Kind: DATA
240+
; NORMAL-NEXT: Name: data_import
241+
; NORMAL-NEXT: Flags: [ UNDEFINED ]
242+
; NORMAL-NEXT: SegmentInfo:
243+
; NORMAL-NEXT: - Index: 0
244+
; NORMAL-NEXT: Name: .rodata.hello_str
245+
; NORMAL-NEXT: Alignment: 0
246+
; NORMAL-NEXT: Flags: [ ]
247+
; NORMAL-NEXT: - Index: 1
248+
; NORMAL-NEXT: Name: .data.func_addr1
249+
; NORMAL-NEXT: Alignment: 2
250+
; NORMAL-NEXT: Flags: [ ]
251+
; NORMAL-NEXT: - Index: 2
252+
; NORMAL-NEXT: Name: .data.func_addr2
253+
; NORMAL-NEXT: Alignment: 2
254+
; NORMAL-NEXT: Flags: [ ]
255+
; NORMAL-NEXT: - Index: 3
256+
; NORMAL-NEXT: Name: .data.func_addr3
257+
; NORMAL-NEXT: Alignment: 2
258+
; NORMAL-NEXT: Flags: [ ]
259+
; NORMAL-NEXT: - Index: 4
260+
; NORMAL-NEXT: Name: .data.data_addr1
261+
; NORMAL-NEXT: Alignment: 3
262+
; NORMAL-NEXT: Flags: [ ]
263+
; NORMAL-NEXT: - Index: 5
264+
; NORMAL-NEXT: Name: .rodata.data_comdat
265+
; NORMAL-NEXT: Alignment: 0
266+
; NORMAL-NEXT: Flags: [ ]
267+
; NORMAL-NEXT: Comdats:
268+
; NORMAL-NEXT: - Name: func_comdat
269+
; NORMAL-NEXT: Entries:
270+
; NORMAL-NEXT: - Kind: FUNCTION
271+
; NORMAL-NEXT: Index: 5
272+
; NORMAL-NEXT: - Kind: DATA
273+
; NORMAL-NEXT: Index: 5
274+
; NORMAL-NEXT: - Type: CUSTOM
275+
; NORMAL-NEXT: Name: name
276+
; NORMAL-NEXT: FunctionNames:
277+
; NORMAL-NEXT: - Index: 0
278+
; NORMAL-NEXT: Name: puts
279+
; NORMAL-NEXT: - Index: 1
280+
; NORMAL-NEXT: Name: foo_import
281+
; NORMAL-NEXT: - Index: 2
282+
; NORMAL-NEXT: Name: bar_import
283+
; NORMAL-NEXT: - Index: 3
284+
; NORMAL-NEXT: Name: hello
285+
; NORMAL-NEXT: - Index: 4
286+
; NORMAL-NEXT: Name: my_func
287+
; NORMAL-NEXT: - Index: 5
288+
; NORMAL-NEXT: Name: func_comdat
289+
; NORMAL-NEXT:...

lld/wasm/Writer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ void Writer::run() {
901901
createCallCtorsFunction();
902902
}
903903

904-
if (config->sharedMemory && !config->shared)
904+
if (!config->relocatable && config->sharedMemory && !config->shared)
905905
createInitTLSFunction();
906906

907907
if (errorCount())

0 commit comments

Comments
 (0)