From e06bac4796bffed2b80649497afaadfb67d767cf Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 24 Jul 2018 19:34:37 +0000 Subject: [PATCH] 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 llvm-svn: 337847 --- llvm/include/llvm/CodeGen/RuntimeLibcalls.h | 2 +- llvm/include/llvm/{CodeGen => IR}/RuntimeLibcalls.def | 0 llvm/include/llvm/module.modulemap | 2 +- llvm/lib/CodeGen/TargetLoweringBase.cpp | 2 +- llvm/lib/Object/IRSymtab.cpp | 14 +++++++++++++- .../WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp | 2 +- 6 files changed, 17 insertions(+), 5 deletions(-) rename llvm/include/llvm/{CodeGen => IR}/RuntimeLibcalls.def (100%) diff --git a/llvm/include/llvm/CodeGen/RuntimeLibcalls.h b/llvm/include/llvm/CodeGen/RuntimeLibcalls.h index 016bef1..28567a1 100644 --- a/llvm/include/llvm/CodeGen/RuntimeLibcalls.h +++ b/llvm/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/llvm/include/llvm/CodeGen/RuntimeLibcalls.def b/llvm/include/llvm/IR/RuntimeLibcalls.def similarity index 100% rename from llvm/include/llvm/CodeGen/RuntimeLibcalls.def rename to llvm/include/llvm/IR/RuntimeLibcalls.def diff --git a/llvm/include/llvm/module.modulemap b/llvm/include/llvm/module.modulemap index 6fc7282..649cdf3 100644 --- a/llvm/include/llvm/module.modulemap +++ b/llvm/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/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 96e0338..43f4bad 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -118,7 +118,7 @@ static cl::opt 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/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp index 51081d8..344d565 100644 --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/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/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp index e5180ad..fe8a5e4 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp @@ -470,7 +470,7 @@ struct StaticLibcallNameMap { StaticLibcallNameMap() { static const std::pair 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) { -- 2.7.4