forked from OSchip/llvm-project
parent
dcba4a7713
commit
ccbe9200f9
|
@ -401,3 +401,30 @@ llvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty)
|
|||
return AddrTyped;
|
||||
}
|
||||
|
||||
llvm::Value *CodeGenFunction::GetVLASize(const VariableArrayType *VAT)
|
||||
{
|
||||
llvm::Value *&SizeEntry = VLASizeMap[VAT];
|
||||
|
||||
if (!SizeEntry) {
|
||||
// Get the element size;
|
||||
llvm::Value *ElemSize;
|
||||
|
||||
QualType ElemTy = VAT->getElementType();
|
||||
|
||||
if (const VariableArrayType *ElemVAT =
|
||||
getContext().getAsVariableArrayType(ElemTy))
|
||||
ElemSize = GetVLASize(ElemVAT);
|
||||
else {
|
||||
// FIXME: We use Int32Ty here because the alloca instruction takes a
|
||||
// 32-bit integer. What should we do about overflow?
|
||||
ElemSize = llvm::ConstantInt::get(llvm::Type::Int32Ty,
|
||||
getContext().getTypeSize(ElemTy) / 8);
|
||||
}
|
||||
|
||||
llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
|
||||
|
||||
SizeEntry = Builder.CreateMul(ElemSize, NumElements);
|
||||
}
|
||||
|
||||
return SizeEntry;
|
||||
}
|
||||
|
|
|
@ -166,6 +166,11 @@ private:
|
|||
/// statement range in current switch instruction.
|
||||
llvm::BasicBlock *CaseRangeBlock;
|
||||
|
||||
// VLASizeMap - This keeps track of the associated size for each VLA type
|
||||
// FIXME: Maybe this could be a stack of maps that is pushed/popped as
|
||||
// we enter/leave scopes.
|
||||
llvm::DenseMap<const VariableArrayType*, llvm::Value*> VLASizeMap;
|
||||
|
||||
/// StackSaveValues - A stack(!) of stack save values. When a new scope is
|
||||
/// entered, a null is pushed on this stack. If a VLA is emitted, then
|
||||
/// the return value of llvm.stacksave() is stored at the top of this stack.
|
||||
|
@ -344,6 +349,10 @@ public:
|
|||
// instruction in LLVM instead once it works well enough.
|
||||
llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty);
|
||||
|
||||
// GetVLASize - Returns an LLVM value that corresponds to the size in bytes
|
||||
// of a variable length array type.
|
||||
llvm::Value *GetVLASize(const VariableArrayType *);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Declaration Emission
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue