[WebAssembly] Fix crash when __wasm_call_ctor is GCd in programs containing static...
authorSam Clegg <sbc@chromium.org>
Sat, 2 Mar 2019 04:55:02 +0000 (04:55 +0000)
committerSam Clegg <sbc@chromium.org>
Sat, 2 Mar 2019 04:55:02 +0000 (04:55 +0000)
Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58864

llvm-svn: 355263

lld/test/wasm/init-fini-gc.ll [new file with mode: 0644]
lld/wasm/Writer.cpp

diff --git a/lld/test/wasm/init-fini-gc.ll b/lld/test/wasm/init-fini-gc.ll
new file mode 100644 (file)
index 0000000..4b2c14b
--- /dev/null
@@ -0,0 +1,48 @@
+; RUN: llc -filetype=obj -o %t.o %s
+; RUN: wasm-ld %t.o -o %t.wasm
+; RUN: obj2yaml %t.wasm | FileCheck %s
+
+; RUN: wasm-ld %t.o -o %t.wasm
+; RUN: obj2yaml %t.wasm | FileCheck %s
+
+; RUN: wasm-ld --export=__wasm_call_ctors %t.o -o %t.export.wasm
+; RUN: obj2yaml %t.export.wasm | FileCheck %s -check-prefix=EXPORT
+
+; Test that the __wasm_call_ctor function if not referenced
+
+target triple = "wasm32-unknown-unknown"
+
+define hidden void @_start() {
+entry:
+  ret void
+}
+
+define hidden void @func1() {
+entry:
+  ret void
+}
+
+define hidden void @func2() {
+entry:
+  ret void
+}
+
+define i32 @__cxa_atexit(i32 %func, i32 %arg, i32 %dso_handle) {
+  ret i32 0
+}
+
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [
+  { i32, void ()*, i8* } { i32 1, void ()* @func1, i8* null }
+]
+
+@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [
+  { i32, void ()*, i8* } { i32 1, void ()* @func2, i8* null }
+]
+
+; CHECK-NOT: __cxa_atexit
+; CHECK-NOT: __wasm_call_ctors
+
+; EXPORT: __wasm_call_ctors
+; EXPORT: func1
+; EXPORT: func2
+; EXPORT: __cxa_atexit
index 2a9cbe6..879a159 100644 (file)
@@ -1168,6 +1168,9 @@ void Writer::createCtorFunction() {
 // This is then used either when creating the output linking section or to
 // synthesize the "__wasm_call_ctors" function.
 void Writer::calculateInitFunctions() {
+  if (!Config->Relocatable && !WasmSym::CallCtors->isLive())
+    return;
+
   for (ObjFile *File : Symtab->ObjectFiles) {
     const WasmLinkingData &L = File->getWasmObj()->linkingData();
     for (const WasmInitFunc &F : L.InitFunctions) {