[PATCH] D71632: [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 Dec 17 14:50:55 PST 2019


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.
sbc100 added a reviewer: dschuff.

This can happen if compiler-rt is itself compiled as bitcode.  The
builtins within compiler-rt may not be referenced until LTO occurs
by which time the linker will already have passed over them and chosen
not to include them in LTO.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71632

Files:
  lld/test/wasm/lto/Inputs/builtins.ll
  lld/test/wasm/lto/builtins.ll
  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;
 };
 
 // Will report a fatal() error if the input buffer is not a valid bitcode
Index: lld/wasm/InputFiles.cpp
===================================================================
--- lld/wasm/InputFiles.cpp
+++ lld/wasm/InputFiles.cpp
@@ -537,7 +537,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/test/wasm/lto/builtins.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/lto/builtins.ll
@@ -0,0 +1,26 @@
+; References to builtin symbols can be created for the first time during LTO.
+; If those builtins are implemented themselved in lazy LTO objects there are
+; otherwise not referenced this can result in bitfiles being added to the link
+; *after* LTO, which will not work.
+; Veriftr that we detect this and report a meaningful error.
+
+; RUN: llvm-as %s -o %t.o
+; RUN: llvm-as %p/Inputs/builtins.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/builtins.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/lto/Inputs/builtins.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: D71632.234395.patch
Type: text/x-patch
Size: 3091 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191217/5575ec3f/attachment.bin>


More information about the llvm-commits mailing list