|
@@ -1999,9 +1999,13 @@ static std::vector<Function*> ParseGlobalCtors(GlobalVariable *GV) {
|
|
|
static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
|
|
|
const std::vector<Function*> &Ctors) {
|
|
|
// If we made a change, reassemble the initializer list.
|
|
|
- std::vector<Constant*> CSVals;
|
|
|
- CSVals.push_back(ConstantInt::get(Type::getInt32Ty(GCL->getContext()),65535));
|
|
|
- CSVals.push_back(0);
|
|
|
+ Constant *CSVals[2];
|
|
|
+ CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()), 65535);
|
|
|
+ CSVals[1] = 0;
|
|
|
+
|
|
|
+ const StructType *StructTy =
|
|
|
+ cast <StructType>(
|
|
|
+ cast<ArrayType>(GCL->getType()->getElementType())->getElementType());
|
|
|
|
|
|
// Create the new init list.
|
|
|
std::vector<Constant*> CAList;
|
|
@@ -2016,12 +2020,10 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
|
|
|
CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()),
|
|
|
0x7fffffff);
|
|
|
}
|
|
|
- CAList.push_back(ConstantStruct::get(GCL->getContext(), CSVals, false));
|
|
|
+ CAList.push_back(ConstantStruct::get(StructTy, CSVals));
|
|
|
}
|
|
|
|
|
|
// Create the array initializer.
|
|
|
- const Type *StructTy =
|
|
|
- cast<ArrayType>(GCL->getType()->getElementType())->getElementType();
|
|
|
Constant *CA = ConstantArray::get(ArrayType::get(StructTy,
|
|
|
CAList.size()), CAList);
|
|
|
|
|
@@ -2218,42 +2220,40 @@ static Constant *EvaluateStoreInto(Constant *Init, Constant *Val,
|
|
|
Elts[Idx] = EvaluateStoreInto(Elts[Idx], Val, Addr, OpNo+1);
|
|
|
|
|
|
// Return the modified struct.
|
|
|
- return ConstantStruct::get(Init->getContext(), &Elts[0], Elts.size(),
|
|
|
- STy->isPacked());
|
|
|
- } else {
|
|
|
- ConstantInt *CI = cast<ConstantInt>(Addr->getOperand(OpNo));
|
|
|
- const SequentialType *InitTy = cast<SequentialType>(Init->getType());
|
|
|
-
|
|
|
- uint64_t NumElts;
|
|
|
- if (const ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
|
|
|
- NumElts = ATy->getNumElements();
|
|
|
- else
|
|
|
- NumElts = cast<VectorType>(InitTy)->getNumElements();
|
|
|
-
|
|
|
+ return ConstantStruct::get(STy, Elts);
|
|
|
+ }
|
|
|
+
|
|
|
+ ConstantInt *CI = cast<ConstantInt>(Addr->getOperand(OpNo));
|
|
|
+ const SequentialType *InitTy = cast<SequentialType>(Init->getType());
|
|
|
|
|
|
- // Break up the array into elements.
|
|
|
- if (ConstantArray *CA = dyn_cast<ConstantArray>(Init)) {
|
|
|
- for (User::op_iterator i = CA->op_begin(), e = CA->op_end(); i != e; ++i)
|
|
|
- Elts.push_back(cast<Constant>(*i));
|
|
|
- } else if (ConstantVector *CV = dyn_cast<ConstantVector>(Init)) {
|
|
|
- for (User::op_iterator i = CV->op_begin(), e = CV->op_end(); i != e; ++i)
|
|
|
- Elts.push_back(cast<Constant>(*i));
|
|
|
- } else if (isa<ConstantAggregateZero>(Init)) {
|
|
|
- Elts.assign(NumElts, Constant::getNullValue(InitTy->getElementType()));
|
|
|
- } else {
|
|
|
- assert(isa<UndefValue>(Init) && "This code is out of sync with "
|
|
|
- " ConstantFoldLoadThroughGEPConstantExpr");
|
|
|
- Elts.assign(NumElts, UndefValue::get(InitTy->getElementType()));
|
|
|
- }
|
|
|
+ uint64_t NumElts;
|
|
|
+ if (const ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
|
|
|
+ NumElts = ATy->getNumElements();
|
|
|
+ else
|
|
|
+ NumElts = cast<VectorType>(InitTy)->getNumElements();
|
|
|
+
|
|
|
+ // Break up the array into elements.
|
|
|
+ if (ConstantArray *CA = dyn_cast<ConstantArray>(Init)) {
|
|
|
+ for (User::op_iterator i = CA->op_begin(), e = CA->op_end(); i != e; ++i)
|
|
|
+ Elts.push_back(cast<Constant>(*i));
|
|
|
+ } else if (ConstantVector *CV = dyn_cast<ConstantVector>(Init)) {
|
|
|
+ for (User::op_iterator i = CV->op_begin(), e = CV->op_end(); i != e; ++i)
|
|
|
+ Elts.push_back(cast<Constant>(*i));
|
|
|
+ } else if (isa<ConstantAggregateZero>(Init)) {
|
|
|
+ Elts.assign(NumElts, Constant::getNullValue(InitTy->getElementType()));
|
|
|
+ } else {
|
|
|
+ assert(isa<UndefValue>(Init) && "This code is out of sync with "
|
|
|
+ " ConstantFoldLoadThroughGEPConstantExpr");
|
|
|
+ Elts.assign(NumElts, UndefValue::get(InitTy->getElementType()));
|
|
|
+ }
|
|
|
|
|
|
- assert(CI->getZExtValue() < NumElts);
|
|
|
- Elts[CI->getZExtValue()] =
|
|
|
- EvaluateStoreInto(Elts[CI->getZExtValue()], Val, Addr, OpNo+1);
|
|
|
+ assert(CI->getZExtValue() < NumElts);
|
|
|
+ Elts[CI->getZExtValue()] =
|
|
|
+ EvaluateStoreInto(Elts[CI->getZExtValue()], Val, Addr, OpNo+1);
|
|
|
|
|
|
- if (Init->getType()->isArrayTy())
|
|
|
- return ConstantArray::get(cast<ArrayType>(InitTy), Elts);
|
|
|
- return ConstantVector::get(Elts);
|
|
|
- }
|
|
|
+ if (Init->getType()->isArrayTy())
|
|
|
+ return ConstantArray::get(cast<ArrayType>(InitTy), Elts);
|
|
|
+ return ConstantVector::get(Elts);
|
|
|
}
|
|
|
|
|
|
/// CommitValueTo - We have decided that Addr (which satisfies the predicate
|