diff --git a/llvm/include/llvm/Target/TargetLibraryInfo.h b/llvm/include/llvm/Target/TargetLibraryInfo.h index 3fe22b94a04e46f7b4928de239241e9d8673f96c..70e26bf3c5a4c474996aa81d217ad576c7095090 100644 --- a/llvm/include/llvm/Target/TargetLibraryInfo.h +++ b/llvm/include/llvm/Target/TargetLibraryInfo.h @@ -199,6 +199,15 @@ namespace llvm { truncf, /// long double truncl(long double x); truncl, + /// int __cxa_atexit(void (*f)(void *), void *p, void *d); + cxa_atexit, + /// void __cxa_guard_abort(guard_t *guard); + /// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi. + cxa_guard_abort, + /// int __cxa_guard_acquire(guard_t *guard); + cxa_guard_acquire, + /// void __cxa_guard_release(guard_t *guard); + cxa_guard_release, NumLibFuncs }; diff --git a/llvm/lib/Target/TargetLibraryInfo.cpp b/llvm/lib/Target/TargetLibraryInfo.cpp index 2119c4ee3a2ae5aa3c391b04712735c8882d8d30..269958fd7f17bfd3e092aac6a42df297b03cf54f 100644 --- a/llvm/lib/Target/TargetLibraryInfo.cpp +++ b/llvm/lib/Target/TargetLibraryInfo.cpp @@ -113,7 +113,11 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "tanhf", "trunc", "truncf", - "truncl" + "truncl", + "__cxa_atexit", + "__cxa_guard_abort", + "__cxa_guard_acquire", + "__cxa_guard_release" }; /// initialize - Initialize the set of available library functions based on the diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 175d0d046f7ee373dee8a0c0d080a727b40975d5..60a8b1cbb14a6876e6edea045306c5bd7646afc1 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1938,8 +1938,6 @@ bool GlobalOpt::OptimizeGlobalVars(Module &M) { // Simplify the initializer. if (GV->hasInitializer()) if (ConstantExpr *CE = dyn_cast(GV->getInitializer())) { - TargetData *TD = getAnalysisIfAvailable(); - TargetLibraryInfo *TLI = &getAnalysis(); Constant *New = ConstantFoldConstantExpression(CE, TD, TLI); if (New && New != CE) GV->setInitializer(New); @@ -2645,9 +2643,6 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) { bool MadeChange = false; if (Ctors.empty()) return false; - const TargetData *TD = getAnalysisIfAvailable(); - const TargetLibraryInfo *TLI = &getAnalysis(); - // Loop over global ctors, optimizing them when we can. for (unsigned i = 0; i != Ctors.size(); ++i) { Function *F = Ctors[i]; @@ -2737,12 +2732,15 @@ bool GlobalOpt::OptimizeGlobalAliases(Module &M) { return Changed; } -static Function *FindCXAAtExit(Module &M) { - Function *Fn = M.getFunction("__cxa_atexit"); +static Function *FindCXAAtExit(Module &M, TargetLibraryInfo *TLI) { + if (!TLI->has(LibFunc::cxa_atexit)) + return false; + + Function *Fn = M.getFunction(TLI->getName(LibFunc::cxa_atexit)); if (!Fn) return 0; - + FunctionType *FTy = Fn->getFunctionType(); // Checking that the function has the right return type, the right number of @@ -2854,12 +2852,12 @@ bool GlobalOpt::runOnModule(Module &M) { bool Changed = false; TD = getAnalysisIfAvailable(); - TLI = getAnalysisIfAvailable(); + TLI = &getAnalysis(); // Try to find the llvm.globalctors list. GlobalVariable *GlobalCtors = FindGlobalCtors(M); - Function *CXAAtExitFn = FindCXAAtExit(M); + Function *CXAAtExitFn = FindCXAAtExit(M, TLI); bool LocalChange = true; while (LocalChange) {