forked from OSchip/llvm-project
Revamp the "ConstantStruct::get" methods. Previously, these were scattered
all over the place in different styles and variants. Standardize on two preferred entrypoints: one that takes a StructType and ArrayRef, and one that takes StructType and varargs. In cases where there isn't a struct type convenient, we now add a ConstantStruct::getAnon method (whose name will make more sense after a few more patches land). It would be "really really nice" if the ConstantStruct::get and ConstantVector::get methods didn't make temporary std::vectors. llvm-svn: 133412
This commit is contained in:
parent
789adbb3ed
commit
cc19efaa97
|
@ -422,14 +422,29 @@ protected:
|
|||
ConstantStruct(const StructType *T, const std::vector<Constant*> &Val);
|
||||
public:
|
||||
// ConstantStruct accessors
|
||||
static Constant *get(const StructType *T, const std::vector<Constant*> &V);
|
||||
static Constant *get(LLVMContext &Context,
|
||||
const std::vector<Constant*> &V, bool Packed);
|
||||
static Constant *get(LLVMContext &Context,
|
||||
Constant *const *Vals, unsigned NumVals, bool Packed);
|
||||
static Constant *get(LLVMContext &Context, bool Packed,
|
||||
Constant * Val, ...) END_WITH_NULL;
|
||||
static Constant *get(const StructType *T, ArrayRef<Constant*> V);
|
||||
static Constant *get(const StructType *T, ...) END_WITH_NULL;
|
||||
|
||||
/// getAnon - Return an anonymous struct that has the specified
|
||||
/// elements. If the struct is possibly empty, then you must specify a
|
||||
/// context.
|
||||
static Constant *getAnon(ArrayRef<Constant*> V, bool Packed = false) {
|
||||
return get(getTypeForElements(V, Packed), V);
|
||||
}
|
||||
static Constant *getAnon(LLVMContext &Ctx,
|
||||
ArrayRef<Constant*> V, bool Packed = false) {
|
||||
return get(getTypeForElements(Ctx, V, Packed), V);
|
||||
}
|
||||
|
||||
/// getTypeForElements - Return an anonymous struct type to use for a constant
|
||||
/// with the specified set of elements. The list must not be empty.
|
||||
static StructType *getTypeForElements(ArrayRef<Constant*> V,
|
||||
bool Packed = false);
|
||||
/// getTypeForElements - This version of the method allows an empty list.
|
||||
static StructType *getTypeForElements(LLVMContext &Ctx,
|
||||
ArrayRef<Constant*> V,
|
||||
bool Packed = false);
|
||||
|
||||
/// Transparently provide more efficient getOperand methods.
|
||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
|
||||
|
||||
|
|
|
@ -1399,7 +1399,7 @@ llvm::ConstantFoldCall(Function *F,
|
|||
ConstantInt::get(F->getContext(), Res),
|
||||
ConstantInt::get(Type::getInt1Ty(F->getContext()), Overflow)
|
||||
};
|
||||
return ConstantStruct::get(F->getContext(), Ops, 2, false);
|
||||
return ConstantStruct::get(cast<StructType>(F->getReturnType()), Ops);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1987,8 +1987,8 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
|
|||
ParseToken(lltok::rbrace, "expected end of struct constant"))
|
||||
return true;
|
||||
|
||||
ID.ConstantVal = ConstantStruct::get(Context, Elts.data(),
|
||||
Elts.size(), false);
|
||||
// FIXME: Get this type from context instead of reconstructing it!
|
||||
ID.ConstantVal = ConstantStruct::getAnon(Context, Elts);
|
||||
ID.Kind = ValID::t_Constant;
|
||||
return false;
|
||||
}
|
||||
|
@ -2007,8 +2007,8 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
|
|||
return true;
|
||||
|
||||
if (isPackedStruct) {
|
||||
ID.ConstantVal =
|
||||
ConstantStruct::get(Context, Elts.data(), Elts.size(), true);
|
||||
// FIXME: Get this type from context instead of reconstructing it!
|
||||
ID.ConstantVal = ConstantStruct::getAnon(Context, Elts, true);
|
||||
ID.Kind = ValID::t_Constant;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -292,11 +292,9 @@ void BitcodeReaderValueList::ResolveConstantForwardRefs() {
|
|||
// Make the new constant.
|
||||
Constant *NewC;
|
||||
if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) {
|
||||
NewC = ConstantArray::get(UserCA->getType(), &NewOps[0],
|
||||
NewOps.size());
|
||||
NewC = ConstantArray::get(UserCA->getType(), &NewOps[0], NewOps.size());
|
||||
} else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) {
|
||||
NewC = ConstantStruct::get(Context, &NewOps[0], NewOps.size(),
|
||||
UserCS->getType()->isPacked());
|
||||
NewC = ConstantStruct::get(UserCS->getType(), NewOps);
|
||||
} else if (isa<ConstantVector>(UserC)) {
|
||||
NewC = ConstantVector::get(NewOps);
|
||||
} else {
|
||||
|
|
|
@ -194,7 +194,7 @@ Constant *ShadowStackGC::GetFrameMap(Function &F) {
|
|||
|
||||
// Truncate the ShadowStackDescriptor if some metadata is null.
|
||||
unsigned NumMeta = 0;
|
||||
SmallVector<Constant*,16> Metadata;
|
||||
SmallVector<Constant*, 16> Metadata;
|
||||
for (unsigned I = 0; I != Roots.size(); ++I) {
|
||||
Constant *C = cast<Constant>(Roots[I].first->getArgOperand(1));
|
||||
if (!C->isNullValue())
|
||||
|
@ -202,19 +202,23 @@ Constant *ShadowStackGC::GetFrameMap(Function &F) {
|
|||
Metadata.push_back(ConstantExpr::getBitCast(C, VoidPtr));
|
||||
}
|
||||
|
||||
const Type *Int32Ty = Type::getInt32Ty(F.getContext());
|
||||
|
||||
Constant *BaseElts[] = {
|
||||
ConstantInt::get(Type::getInt32Ty(F.getContext()), Roots.size(), false),
|
||||
ConstantInt::get(Type::getInt32Ty(F.getContext()), NumMeta, false),
|
||||
ConstantInt::get(Int32Ty, Roots.size(), false),
|
||||
ConstantInt::get(Int32Ty, NumMeta, false),
|
||||
};
|
||||
|
||||
Constant *DescriptorElts[] = {
|
||||
ConstantStruct::get(F.getContext(), BaseElts, 2, false),
|
||||
ConstantStruct::get(StructType::get(Int32Ty, Int32Ty, NULL), BaseElts),
|
||||
ConstantArray::get(ArrayType::get(VoidPtr, NumMeta),
|
||||
Metadata.begin(), NumMeta)
|
||||
};
|
||||
|
||||
Constant *FrameMap = ConstantStruct::get(F.getContext(), DescriptorElts, 2,
|
||||
false);
|
||||
Constant *FrameMap =
|
||||
ConstantStruct::get(StructType::get(DescriptorElts[0]->getType(),
|
||||
DescriptorElts[1]->getType(), NULL),
|
||||
DescriptorElts);
|
||||
|
||||
std::string TypeName("gc_map.");
|
||||
TypeName += utostr(NumMeta);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
||||
// 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);
|
||||
|
||||
if (Init->getType()->isArrayTy())
|
||||
return ConstantArray::get(cast<ArrayType>(InitTy), Elts);
|
||||
return ConstantVector::get(Elts);
|
||||
return ConstantStruct::get(STy, Elts);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
// 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);
|
||||
|
||||
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
|
||||
|
|
|
@ -412,7 +412,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(LHS->getType()),
|
||||
ConstantInt::getTrue(II->getContext())
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
const StructType *ST = cast<StructType>(II->getType());
|
||||
Constant *Struct = ConstantStruct::get(ST, V);
|
||||
return InsertValueInst::Create(Struct, Add, 0);
|
||||
}
|
||||
|
||||
|
@ -425,7 +426,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(LHS->getType()),
|
||||
ConstantInt::getFalse(II->getContext())
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
const StructType *ST = cast<StructType>(II->getType());
|
||||
Constant *Struct = ConstantStruct::get(ST, V);
|
||||
return InsertValueInst::Create(Struct, Add, 0);
|
||||
}
|
||||
}
|
||||
|
@ -452,7 +454,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(II->getArgOperand(0)->getType()),
|
||||
ConstantInt::getFalse(II->getContext())
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
Constant *Struct =
|
||||
ConstantStruct::get(cast<StructType>(II->getType()), V);
|
||||
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
|
||||
}
|
||||
}
|
||||
|
@ -472,7 +475,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(II->getArgOperand(0)->getType()),
|
||||
ConstantInt::getFalse(II->getContext())
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
Constant *Struct =
|
||||
ConstantStruct::get(cast<StructType>(II->getType()), V);
|
||||
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
|
||||
}
|
||||
}
|
||||
|
@ -503,7 +507,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(LHS->getType()),
|
||||
Builder->getFalse()
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
Constant *Struct = ConstantStruct::get(cast<StructType>(II->getType()),V);
|
||||
return InsertValueInst::Create(Struct, Mul, 0);
|
||||
}
|
||||
} // FALL THROUGH
|
||||
|
@ -532,7 +536,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
UndefValue::get(II->getArgOperand(0)->getType()),
|
||||
ConstantInt::getFalse(II->getContext())
|
||||
};
|
||||
Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false);
|
||||
Constant *Struct =
|
||||
ConstantStruct::get(cast<StructType>(II->getType()), V);
|
||||
return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -164,7 +164,8 @@ void llvm::InsertProfilingShutdownCall(Function *Callee, Module *Mod) {
|
|||
GlobalVariable *GlobalDtors = new GlobalVariable(
|
||||
*Mod, ArrayType::get(GlobalDtorElemTy, 1), false,
|
||||
GlobalValue::AppendingLinkage, NULL, "llvm.global_dtors");
|
||||
dtors.push_back(ConstantStruct::get(Mod->getContext(), Elem, 2, false));
|
||||
|
||||
dtors.push_back(ConstantStruct::get(GlobalDtorElemTy, Elem));
|
||||
GlobalDtors->setInitializer(ConstantArray::get(
|
||||
cast<ArrayType>(GlobalDtors->getType()->getElementType()), dtors));
|
||||
}
|
||||
|
|
|
@ -942,7 +942,7 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
|
|||
}
|
||||
|
||||
if (const StructType* ST = dyn_cast<StructType>(AggTy))
|
||||
return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
|
||||
return ConstantStruct::get(ST, Ops);
|
||||
return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
|
||||
}
|
||||
|
||||
|
@ -973,7 +973,7 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
|
|||
}
|
||||
|
||||
if (const StructType *ST = dyn_cast<StructType>(AggTy))
|
||||
return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
|
||||
return ConstantStruct::get(ST, Ops);
|
||||
return ConstantArray::get(cast<ArrayType>(AggTy), Ops);
|
||||
}
|
||||
|
||||
|
@ -988,7 +988,7 @@ Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg,
|
|||
}
|
||||
|
||||
if (const StructType* ST = dyn_cast<StructType>(Agg->getType()))
|
||||
return ConstantStruct::get(ST->getContext(), Ops, ST->isPacked());
|
||||
return ConstantStruct::get(ST, Ops);
|
||||
return ConstantArray::get(cast<ArrayType>(Agg->getType()), Ops);
|
||||
}
|
||||
|
||||
|
|
|
@ -621,6 +621,27 @@ Constant *ConstantArray::get(LLVMContext &Context, StringRef Str,
|
|||
return get(ATy, ElementVals);
|
||||
}
|
||||
|
||||
/// getTypeForElements - Return an anonymous struct type to use for a constant
|
||||
/// with the specified set of elements. The list must not be empty.
|
||||
StructType *ConstantStruct::getTypeForElements(LLVMContext &Context,
|
||||
ArrayRef<Constant*> V,
|
||||
bool Packed) {
|
||||
SmallVector<const Type*, 16> EltTypes;
|
||||
for (unsigned i = 0, e = V.size(); i != e; ++i)
|
||||
EltTypes.push_back(V[i]->getType());
|
||||
|
||||
return StructType::get(Context, EltTypes, Packed);
|
||||
}
|
||||
|
||||
|
||||
StructType *ConstantStruct::getTypeForElements(ArrayRef<Constant*> V,
|
||||
bool Packed) {
|
||||
assert(!V.empty() &&
|
||||
"ConstantStruct::getTypeForElements cannot be called on empty list");
|
||||
return getTypeForElements(V[0]->getContext(), V, Packed);
|
||||
}
|
||||
|
||||
|
||||
ConstantStruct::ConstantStruct(const StructType *T,
|
||||
const std::vector<Constant*> &V)
|
||||
: Constant(T, ConstantStructVal,
|
||||
|
@ -639,45 +660,28 @@ ConstantStruct::ConstantStruct(const StructType *T,
|
|||
}
|
||||
|
||||
// ConstantStruct accessors.
|
||||
Constant *ConstantStruct::get(const StructType* T,
|
||||
const std::vector<Constant*>& V) {
|
||||
LLVMContextImpl* pImpl = T->getContext().pImpl;
|
||||
Constant *ConstantStruct::get(const StructType *ST, ArrayRef<Constant*> V) {
|
||||
assert(ST->getNumElements() == V.size() &&
|
||||
"Incorrect # elements specified to ConstantStruct::get");
|
||||
|
||||
// Create a ConstantAggregateZero value if all elements are zeros...
|
||||
// Create a ConstantAggregateZero value if all elements are zeros.
|
||||
for (unsigned i = 0, e = V.size(); i != e; ++i)
|
||||
if (!V[i]->isNullValue())
|
||||
return pImpl->StructConstants.getOrCreate(T, V);
|
||||
if (!V[i]->isNullValue()) {
|
||||
// FIXME: Eliminate temporary std::vector here!
|
||||
return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V.vec());
|
||||
}
|
||||
|
||||
return ConstantAggregateZero::get(T);
|
||||
return ConstantAggregateZero::get(ST);
|
||||
}
|
||||
|
||||
Constant *ConstantStruct::get(LLVMContext &Context,
|
||||
const std::vector<Constant*>& V, bool packed) {
|
||||
std::vector<const Type*> StructEls;
|
||||
StructEls.reserve(V.size());
|
||||
for (unsigned i = 0, e = V.size(); i != e; ++i)
|
||||
StructEls.push_back(V[i]->getType());
|
||||
return get(StructType::get(Context, StructEls, packed), V);
|
||||
}
|
||||
|
||||
Constant *ConstantStruct::get(LLVMContext &Context,
|
||||
Constant *const *Vals, unsigned NumVals,
|
||||
bool Packed) {
|
||||
// FIXME: make this the primary ctor method.
|
||||
return get(Context, std::vector<Constant*>(Vals, Vals+NumVals), Packed);
|
||||
}
|
||||
|
||||
Constant* ConstantStruct::get(LLVMContext &Context, bool Packed,
|
||||
Constant * Val, ...) {
|
||||
Constant* ConstantStruct::get(const StructType *T, ...) {
|
||||
va_list ap;
|
||||
std::vector<Constant*> Values;
|
||||
va_start(ap, Val);
|
||||
while (Val) {
|
||||
SmallVector<Constant*, 8> Values;
|
||||
va_start(ap, T);
|
||||
while (Constant *Val = va_arg(ap, llvm::Constant*))
|
||||
Values.push_back(Val);
|
||||
Val = va_arg(ap, llvm::Constant*);
|
||||
}
|
||||
va_end(ap);
|
||||
return get(Context, Values, Packed);
|
||||
return get(T, Values);
|
||||
}
|
||||
|
||||
ConstantVector::ConstantVector(const VectorType *T,
|
||||
|
|
|
@ -612,9 +612,10 @@ LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
|
|||
LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
|
||||
LLVMValueRef *ConstantVals,
|
||||
unsigned Count, LLVMBool Packed) {
|
||||
return wrap(ConstantStruct::get(*unwrap(C),
|
||||
unwrap<Constant>(ConstantVals, Count),
|
||||
Count, Packed != 0));
|
||||
Constant **Elements = unwrap<Constant>(ConstantVals, Count);
|
||||
return wrap(ConstantStruct::getAnon(*unwrap(C),
|
||||
ArrayRef<Constant*>(Elements, Count),
|
||||
Packed != 0));
|
||||
}
|
||||
|
||||
LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
|
||||
|
|
|
@ -175,13 +175,16 @@ void llvm::DeleteFunctionBody(Function *F) {
|
|||
static Constant *GetTorInit(std::vector<std::pair<Function*, int> > &TorList) {
|
||||
assert(!TorList.empty() && "Don't create empty tor list!");
|
||||
std::vector<Constant*> ArrayElts;
|
||||
const Type *Int32Ty = Type::getInt32Ty(TorList[0].first->getContext());
|
||||
|
||||
const StructType *STy =
|
||||
StructType::get(Int32Ty, TorList[0].first->getType(), NULL);
|
||||
for (unsigned i = 0, e = TorList.size(); i != e; ++i) {
|
||||
std::vector<Constant*> Elts;
|
||||
Elts.push_back(ConstantInt::get(
|
||||
Type::getInt32Ty(TorList[i].first->getContext()), TorList[i].second));
|
||||
Elts.push_back(TorList[i].first);
|
||||
ArrayElts.push_back(ConstantStruct::get(TorList[i].first->getContext(),
|
||||
Elts, false));
|
||||
Constant *Elts[] = {
|
||||
ConstantInt::get(Int32Ty, TorList[i].second),
|
||||
TorList[i].first
|
||||
};
|
||||
ArrayElts.push_back(ConstantStruct::get(STy, Elts));
|
||||
}
|
||||
return ConstantArray::get(ArrayType::get(ArrayElts[0]->getType(),
|
||||
ArrayElts.size()),
|
||||
|
|
|
@ -60,7 +60,7 @@ static void PR7658() {
|
|||
v2.push_back(ConstantPointerNull::get(p4));
|
||||
}
|
||||
|
||||
WeakVH CS = ConstantStruct::get(ctx, v2, false); // { i32 14, opaque* null, opaque* null}
|
||||
WeakVH CS = ConstantStruct::getAnon(ctx, v2, false); // { i32 14, opaque* null, opaque* null}
|
||||
|
||||
StructType *s2 = StructType::get(ctx, t2);
|
||||
PATypeHolder h2(s2);
|
||||
|
|
Loading…
Reference in New Issue