Chromium Code Reviews

Unified Diff: lib/Transforms/NaCl/ExpandCtors.cpp

Issue 15659005: PNaCl: Fix ExpandCtors to handle an empty list case (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: lib/Transforms/NaCl/ExpandCtors.cpp
diff --git a/lib/Transforms/NaCl/ExpandCtors.cpp b/lib/Transforms/NaCl/ExpandCtors.cpp
index 30d56fee6bf4aa7a15c1c5e4ee570910d77172e5..fd38e2f0f1ebaa5a9daf7be47072bb038962d32c 100644
--- a/lib/Transforms/NaCl/ExpandCtors.cpp
+++ b/lib/Transforms/NaCl/ExpandCtors.cpp
@@ -73,6 +73,39 @@ static bool compareEntries(FuncArrayEntry Entry1, FuncArrayEntry Entry2) {
return Entry1.priority < Entry2.priority;
}
+static void readFuncList(GlobalVariable *Array, std::vector<Constant*> *Funcs) {
+ if (!Array->hasInitializer())
+ return;
+ Constant *Init = Array->getInitializer();
+ ArrayType *Ty = dyn_cast<ArrayType>(Init->getType());
+ if (!Ty) {
+ errs() << "Initializer: " << *Array->getInitializer() << "\n";
+ report_fatal_error("ExpandCtors: Initializer is not of array type");
+ }
+ if (Ty->getNumElements() == 0)
+ return;
+ ConstantArray *InitList = dyn_cast<ConstantArray>(Init);
+ if (!InitList) {
+ errs() << "Initializer: " << *Array->getInitializer() << "\n";
+ report_fatal_error("ExpandCtors: Unexpected initializer ConstantExpr");
+ }
+ std::vector<FuncArrayEntry> FuncsToSort;
+ for (unsigned Index = 0; Index < InitList->getNumOperands(); ++Index) {
+ ConstantStruct *CS = cast<ConstantStruct>(InitList->getOperand(Index));
+ FuncArrayEntry Entry;
+ Entry.priority = cast<ConstantInt>(CS->getOperand(0))->getZExtValue();
+ Entry.func = CS->getOperand(1);
+ FuncsToSort.push_back(Entry);
+ }
+
+ std::sort(FuncsToSort.begin(), FuncsToSort.end(), compareEntries);
+ for (std::vector<FuncArrayEntry>::iterator Iter = FuncsToSort.begin();
+ Iter != FuncsToSort.end();
+ ++Iter) {
+ Funcs->push_back(Iter->func);
+ }
+}
+
static void defineFuncArray(Module &M, const char *LlvmArrayName,
const char *StartSymbol,
const char *EndSymbol) {
@@ -80,24 +113,7 @@ static void defineFuncArray(Module &M, const char *LlvmArrayName,
GlobalVariable *Array = M.getNamedGlobal(LlvmArrayName);
if (Array) {
- if (Array->hasInitializer() && !Array->getInitializer()->isNullValue()) {
- ConstantArray *InitList = cast<ConstantArray>(Array->getInitializer());
- std::vector<FuncArrayEntry> FuncsToSort;
- for (unsigned Index = 0; Index < InitList->getNumOperands(); ++Index) {
- ConstantStruct *CS = cast<ConstantStruct>(InitList->getOperand(Index));
- FuncArrayEntry Entry;
- Entry.priority = cast<ConstantInt>(CS->getOperand(0))->getZExtValue();
- Entry.func = CS->getOperand(1);
- FuncsToSort.push_back(Entry);
- }
-
- std::sort(FuncsToSort.begin(), FuncsToSort.end(), compareEntries);
- for (std::vector<FuncArrayEntry>::iterator Iter = FuncsToSort.begin();
- Iter != FuncsToSort.end();
- ++Iter) {
- Funcs.push_back(Iter->func);
- }
- }
+ readFuncList(Array, &Funcs);
// No code should be referencing global_ctors/global_dtors,
// because this symbol is internal to LLVM.
Array->eraseFromParent();
« no previous file with comments | « no previous file | test/Transforms/NaCl/expand-ctors-emptylist.ll » ('j') | test/Transforms/NaCl/expand-ctors-emptylist.ll » ('J')

Powered by Google App Engine