[PATCH] D72727: [lld][WebAssembly] Fail if bitcode objects are pulled in after LTO
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 14 11:42:07 PST 2020
sbc100 created this revision.
Herald added subscribers: llvm-commits, dexonsmith, steven_wu, sunfish, aheejin, hiraditya, jgravelle-google, inglorion, mehdi_amini, dschuff.
Herald added a project: LLVM.
This can happen if lto::LTO::getRuntimeLibcallSymbols doesn't return
an complete/accurate list of libcalls. In this case new bitcode
object can be linked in after LTO.
For example the WebAssembly backend currently calls:
setLibcallName(RTLIB::FPROUND_F32_F16, "__truncsfhf2");
But `__truncsfhf2` is not part of `getRuntimeLibcallSymbols` so if
this symbol is generated during LTO the link will currently fail.
Without this change the linker crashes because the bitcode symbol
makes it all the way to the output phase.
See: https://bugs.llvm.org/show_bug.cgi?id=44353
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D72727
Files:
lld/test/wasm/lto/Inputs/libcall-truncsfhf2.ll
lld/test/wasm/lto/libcall-truncsfhf2.ll
lld/wasm/Driver.cpp
lld/wasm/InputFiles.cpp
lld/wasm/InputFiles.h
lld/wasm/SymbolTable.cpp
Index: lld/wasm/SymbolTable.cpp
===================================================================
--- lld/wasm/SymbolTable.cpp
+++ lld/wasm/SymbolTable.cpp
@@ -65,6 +65,9 @@
// Because all bitcode files that the program consists of are passed
// to the compiler at once, it can do whole-program optimization.
void SymbolTable::addCombinedLTOObject() {
+ // Prevent further LTO objects being included
+ BitcodeFile::doneLTO = true;
+
if (bitcodeFiles.empty())
return;
Index: lld/wasm/InputFiles.h
===================================================================
--- lld/wasm/InputFiles.h
+++ lld/wasm/InputFiles.h
@@ -160,6 +160,10 @@
void parse();
std::unique_ptr<llvm::lto::InputFile> obj;
+
+ // Set to true once LTO is complete in order prevent further bitcode objects
+ // being added.
+ static bool doneLTO;
};
inline bool isBitcode(MemoryBufferRef mb) {
Index: lld/wasm/InputFiles.cpp
===================================================================
--- lld/wasm/InputFiles.cpp
+++ lld/wasm/InputFiles.cpp
@@ -536,7 +536,16 @@
return symtab->addDefinedData(name, flags, &f, nullptr, 0, 0);
}
+bool BitcodeFile::doneLTO = false;
+
void BitcodeFile::parse() {
+ if (doneLTO) {
+ error(toString(mb.getBufferIdentifier()) +
+ ": attempt to add bitcode file after LTO.");
+ error("This is most often caused by builtin functions into LTO objects.");
+ return;
+ }
+
obj = check(lto::InputFile::create(MemoryBufferRef(
mb.getBuffer(), saver.save(archiveName + mb.getBufferIdentifier()))));
Triple t(obj->getTargetTriple());
Index: lld/wasm/Driver.cpp
===================================================================
--- lld/wasm/Driver.cpp
+++ lld/wasm/Driver.cpp
@@ -735,6 +735,8 @@
// This works like --undefined but also exports the symbol if its found
for (auto *arg : args.filtered(OPT_export))
handleUndefined(arg->getValue());
+ if (errorCount())
+ return;
Symbol *entrySym = nullptr;
if (!config->relocatable && !config->entry.empty()) {
Index: lld/test/wasm/lto/libcall-truncsfhf2.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/lto/libcall-truncsfhf2.ll
@@ -0,0 +1,20 @@
+; RUN: llvm-as %s -o %t.o
+; RUN: llvm-as %p/Inputs/libcall-truncsfhf2.ll -o %t.truncsfhf2.o
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t.truncsfhf2.o
+; RUN: not wasm-ld --export-all %t.o %t.a -o %t.wasm 2>&1 | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+ at g_float = global float 0.0
+ at g_half = global half 0.0
+
+define void @_start() {
+ %val1 = load float, float* @g_float
+ %v0 = fptrunc float %val1 to half
+ store half %v0, half* @g_half
+ ret void
+}
+
+; CHECK: wasm-ld: error: {{.*}}truncsfhf2.o: attempt to add bitcode file after LTO.
Index: lld/test/wasm/lto/Inputs/libcall-truncsfhf2.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/lto/Inputs/libcall-truncsfhf2.ll
@@ -0,0 +1,6 @@
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+define half @__truncsfhf2(float) {
+ ret half 0.0
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72727.238056.patch
Type: text/x-patch
Size: 3221 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200114/96b48549/attachment.bin>
More information about the llvm-commits
mailing list