+
+ case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n, n x value number]
+ if (Record.empty() || Record.size() < Record[0]+1)
+ return Error("Invalid CST_AGGREGATE record");
+
+ unsigned Size = Record[0];
+ std::vector<Constant*> Elts;
+
+ if (const StructType *STy = dyn_cast<StructType>(CurTy)) {
+ for (unsigned i = 0; i != Size; ++i)
+ Elts.push_back(ValueList.getConstantFwdRef(Record[i+1],
+ STy->getElementType(i)));
+ V = ConstantStruct::get(STy, Elts);
+ } else if (const ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) {
+ const Type *EltTy = ATy->getElementType();
+ for (unsigned i = 0; i != Size; ++i)
+ Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
+ V = ConstantArray::get(ATy, Elts);
+ } else if (const VectorType *VTy = dyn_cast<VectorType>(CurTy)) {
+ const Type *EltTy = VTy->getElementType();
+ for (unsigned i = 0; i != Size; ++i)
+ Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
+ V = ConstantVector::get(Elts);
+ } else {
+ V = UndefValue::get(CurTy);
+ }
+ }
+ }
+
+ if (NextCstNo == ValueList.size())
+ ValueList.push_back(V);
+ else if (ValueList[NextCstNo] == 0)
+ ValueList.initVal(NextCstNo, V);
+ else {
+ // If there was a forward reference to this constant,
+ Value *OldV = ValueList[NextCstNo];
+ ValueList.setOperand(NextCstNo, V);
+ OldV->replaceAllUsesWith(V);
+ delete OldV;