[lld] r355263 - [WebAssembly] Fix crash when __wasm_call_ctor is GCd in programs containing static init/fini

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 1 20:55:02 PST 2019


Author: sbc
Date: Fri Mar  1 20:55:02 2019
New Revision: 355263

URL: http://llvm.org/viewvc/llvm-project?rev=355263&view=rev
Log:
[WebAssembly] Fix crash when __wasm_call_ctor is GCd in programs containing static init/fini

Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits

Tags: #llvm

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

Added:
    lld/trunk/test/wasm/init-fini-gc.ll
Modified:
    lld/trunk/wasm/Writer.cpp

Added: lld/trunk/test/wasm/init-fini-gc.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/init-fini-gc.ll?rev=355263&view=auto
==============================================================================
--- lld/trunk/test/wasm/init-fini-gc.ll (added)
+++ lld/trunk/test/wasm/init-fini-gc.ll Fri Mar  1 20:55:02 2019
@@ -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
+}
+
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [
+  { i32, void ()*, i8* } { i32 1, void ()* @func1, i8* null }
+]
+
+ at 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

Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=355263&r1=355262&r2=355263&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Fri Mar  1 20:55:02 2019
@@ -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) {




More information about the llvm-commits mailing list