aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2018-07-24 19:34:37 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2018-07-24 19:34:37 +0000
commit5df3f9e0708ca0f36e3e879801a9a51ec95278b1 (patch)
treef48abcfbd8e09d0211a6caf495dbb37714531a37
parentf48b4d01aaa614b1553bf1489b4f276ed46ea224 (diff)
Put "built-in" function definitions in global Used list, for LTO. (fix bug 34169)
When building with LTO, builtin functions that are defined but whose calls have not been inserted yet, get internalized. The Global Dead Code Elimination phase in the new LTO implementation then removes these function definitions. Later optimizations add calls to those functions, and the linker then dies complaining that there are no definitions. This CL fixes the new LTO implementation to check if a function is builtin, and if so, to not internalize (and later DCE) the function. As part of this fix I needed to move the RuntimeLibcalls.{def,h} files from the CodeGen subidrectory to the IR subdirectory. I have updated all the files that accessed those two files to access their new location. Fixes PR34169 Patch by Caroline Tice! Differential Revision: https://reviews.llvm.org/D49434 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337847 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/RuntimeLibcalls.h2
-rw-r--r--include/llvm/IR/RuntimeLibcalls.def (renamed from include/llvm/CodeGen/RuntimeLibcalls.def)0
-rw-r--r--include/llvm/module.modulemap2
-rw-r--r--lib/CodeGen/TargetLoweringBase.cpp2
-rw-r--r--lib/Object/IRSymtab.cpp14
-rw-r--r--lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp2
6 files changed, 17 insertions, 5 deletions
diff --git a/include/llvm/CodeGen/RuntimeLibcalls.h b/include/llvm/CodeGen/RuntimeLibcalls.h
index 016bef1702c..28567a1ce43 100644
--- a/include/llvm/CodeGen/RuntimeLibcalls.h
+++ b/include/llvm/CodeGen/RuntimeLibcalls.h
@@ -29,7 +29,7 @@ namespace RTLIB {
///
enum Libcall {
#define HANDLE_LIBCALL(code, name) code,
- #include "RuntimeLibcalls.def"
+ #include "llvm/IR/RuntimeLibcalls.def"
#undef HANDLE_LIBCALL
};
diff --git a/include/llvm/CodeGen/RuntimeLibcalls.def b/include/llvm/IR/RuntimeLibcalls.def
index 7ed90d959f0..7ed90d959f0 100644
--- a/include/llvm/CodeGen/RuntimeLibcalls.def
+++ b/include/llvm/IR/RuntimeLibcalls.def
diff --git a/include/llvm/module.modulemap b/include/llvm/module.modulemap
index 6fc728295f6..649cdf3b0a8 100644
--- a/include/llvm/module.modulemap
+++ b/include/llvm/module.modulemap
@@ -26,7 +26,6 @@ module LLVM_Backend {
// These are intended for (repeated) textual inclusion.
textual header "CodeGen/CommandFlags.inc"
textual header "CodeGen/DIEValue.def"
- textual header "CodeGen/RuntimeLibcalls.def"
}
module Target {
@@ -222,6 +221,7 @@ module LLVM_IR {
textual header "IR/Instruction.def"
textual header "IR/Metadata.def"
textual header "IR/Value.def"
+ textual header "IR/RuntimeLibcalls.def"
}
module LLVM_IRReader { requires cplusplus umbrella "IRReader" module * { export * } }
diff --git a/lib/CodeGen/TargetLoweringBase.cpp b/lib/CodeGen/TargetLoweringBase.cpp
index 96e03388d5c..43f4bad595e 100644
--- a/lib/CodeGen/TargetLoweringBase.cpp
+++ b/lib/CodeGen/TargetLoweringBase.cpp
@@ -118,7 +118,7 @@ static cl::opt<int> MinPercentageForPredictableBranch(
void TargetLoweringBase::InitLibcalls(const Triple &TT) {
#define HANDLE_LIBCALL(code, name) \
setLibcallName(RTLIB::code, name);
-#include "llvm/CodeGen/RuntimeLibcalls.def"
+#include "llvm/IR/RuntimeLibcalls.def"
#undef HANDLE_LIBCALL
// Initialize calling conventions to their default.
for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC)
diff --git a/lib/Object/IRSymtab.cpp b/lib/Object/IRSymtab.cpp
index 51081d8b5e6..344d565349c 100644
--- a/lib/Object/IRSymtab.cpp
+++ b/lib/Object/IRSymtab.cpp
@@ -42,6 +42,12 @@
using namespace llvm;
using namespace irsymtab;
+static const char *LibcallRoutineNames[] = {
+#define HANDLE_LIBCALL(code, name) name,
+#include "llvm/IR/RuntimeLibcalls.def"
+#undef HANDLE_LIBCALL
+};
+
namespace {
const char *getExpectedProducerName() {
@@ -226,7 +232,13 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab,
setStr(Sym.IRName, GV->getName());
- if (Used.count(GV))
+ bool IsBuiltinFunc = false;
+
+ for (const char *LibcallName : LibcallRoutineNames)
+ if (GV->getName() == LibcallName)
+ IsBuiltinFunc = true;
+
+ if (Used.count(GV) || IsBuiltinFunc)
Sym.Flags |= 1 << storage::Symbol::FB_used;
if (GV->isThreadLocal())
Sym.Flags |= 1 << storage::Symbol::FB_tls;
diff --git a/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp b/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp
index e5180ad7f2e..fe8a5e4c06f 100644
--- a/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp
+++ b/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp
@@ -470,7 +470,7 @@ struct StaticLibcallNameMap {
StaticLibcallNameMap() {
static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
-#include "llvm/CodeGen/RuntimeLibcalls.def"
+#include "llvm/IR/RuntimeLibcalls.def"
#undef HANDLE_LIBCALL
};
for (const auto &NameLibcall : NameLibcalls) {