From 7d8e58f38425692e203edc45e87dcf3dcd65dae6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 26 Sep 2005 02:19:27 +0000 Subject: [PATCH] Make the global opt optimizer work on modules with a null terminator, by accepting the null even with a non-65535 init prio git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23434 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/GlobalOpt.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 03f8bf0d386..b0163146530 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -1144,15 +1144,17 @@ GlobalVariable *GlobalOpt::FindGlobalCtors(Module &M) { if (!CA) return 0; for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) if (ConstantStruct *CS = dyn_cast(CA->getOperand(i))) { + if (isa(CS->getOperand(1))) + continue; + + // Must have a function or null ptr. + if (!isa(CS->getOperand(1))) + return 0; + // Init priority must be standard. ConstantInt *CI = dyn_cast(CS->getOperand(0)); if (!CI || CI->getRawValue() != 65535) return 0; - - // Must have a function or null ptr. - if (!isa(CS->getOperand(1)) && - !isa(CS->getOperand(1))) - return 0; } else { return 0; } @@ -1185,9 +1187,11 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) { Function *F = Ctors[i]; // Found a null terminator in the middle of the list, prune off the rest of // the list. - if (F == 0 && i != Ctors.size()-1) { - Ctors.resize(i+1); - MadeChange = true; + if (F == 0) { + if (i != Ctors.size()-1) { + Ctors.resize(i+1); + MadeChange = true; + } break; } @@ -1217,6 +1221,7 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) { std::vector(), false); const PointerType *PFTy = PointerType::get(FTy); CSVals[1] = Constant::getNullValue(PFTy); + CSVals[0] = ConstantSInt::get(Type::IntTy, 2147483647); } CAList.push_back(ConstantStruct::get(CSVals)); }