From 61f13b3f30dfe54c6784179c8fa8a346503684dd Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Sat, 2 Mar 2019 04:55:02 +0000 Subject: [PATCH] [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 llvm-svn: 355263 --- lld/test/wasm/init-fini-gc.ll | 48 +++++++++++++++++++++++++++++++++++ lld/wasm/Writer.cpp | 3 +++ 2 files changed, 51 insertions(+) create mode 100644 lld/test/wasm/init-fini-gc.ll diff --git a/lld/test/wasm/init-fini-gc.ll b/lld/test/wasm/init-fini-gc.ll new file mode 100644 index 000000000000..4b2c14bd6858 --- /dev/null +++ b/lld/test/wasm/init-fini-gc.ll @@ -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 diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 2a9cbe6151f0..879a1595361f 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -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) {