I am seeing: test/CodeGen//unsupported.c as failing. I'm not sure what commit triggered this but I think it may be this one.
- Daniel On Thu, Dec 11, 2008 at 11:38 PM, Anders Carlsson <[email protected]> wrote: > Author: andersca > Date: Fri Dec 12 01:38:43 2008 > New Revision: 60943 > > URL: http://llvm.org/viewvc/llvm-project?rev=60943&view=rev > Log: > Implement allocation and sizeof VLAs. This is very basic for now. > > Modified: > cfe/trunk/lib/CodeGen/CGDecl.cpp > cfe/trunk/lib/CodeGen/CGExprScalar.cpp > > Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=60943&r1=60942&r2=60943&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Fri Dec 12 01:38:43 2008 > @@ -20,6 +20,7 @@ > #include "clang/Basic/SourceManager.h" > #include "clang/Basic/TargetInfo.h" > #include "llvm/GlobalVariable.h" > +#include "llvm/Intrinsics.h" > #include "llvm/Type.h" > using namespace clang; > using namespace CodeGen; > @@ -160,13 +161,37 @@ > DeclPtr = GenerateStaticBlockVarDecl(D, true, Class); > } > } else { > - CGM.ErrorUnsupported(&D, "variable-length array"); > + const VariableArrayType *VAT = getContext().getAsVariableArrayType(Ty); > + > + if (!StackSaveValues.back()) { > + // Save the stack. > + const llvm::Type *LTy = > llvm::PointerType::getUnqual(llvm::Type::Int8Ty); > + llvm::Value *Stack = CreateTempAlloca(LTy, "saved_stack"); > + > + llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stacksave); > + llvm::Value *V = Builder.CreateCall(F); > + > + Builder.CreateStore(V, Stack); > + > + StackSaveValues.back() = Stack; > + } > + // Get the element type. > + const llvm::Type *LElemTy = ConvertType(Ty); > + const llvm::Type *LElemPtrTy = > + llvm::PointerType::get(LElemTy, D.getType().getAddressSpace()); > + > + llvm::Value *VLASize = GetVLASize(VAT); > + > + // Allocate memory for the array. > + llvm::Value *VLA = Builder.CreateAlloca(llvm::Type::Int8Ty, VLASize, > "vla"); > + VLA = Builder.CreateBitCast(VLA, LElemPtrTy, "tmp"); > > - // FIXME: VLA: Add VLA support. For now just make up enough to let > - // the compile go through. > - const llvm::Type *LTy = ConvertType(Ty); > llvm::AllocaInst *Alloc = > - CreateTempAlloca(LTy, D.getIdentifier()->getName()); > + CreateTempAlloca(LElemPtrTy, D.getIdentifier()->getName()); > + > + // FIXME: Volatile? > + Builder.CreateStore(VLA, Alloc); > + > DeclPtr = Alloc; > } > > > Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=60943&r1=60942&r2=60943&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Fri Dec 12 01:38:43 2008 > @@ -663,7 +663,14 @@ > if (TypeToSize->isVoidType() || TypeToSize->isFunctionType()) > return llvm::ConstantInt::get(llvm::APInt(ResultWidth, 1)); > > - /// FIXME: This doesn't handle VLAs yet! > + if (const VariableArrayType *VAT = > + CGF.getContext().getAsVariableArrayType(TypeToSize)) { > + if (E->isSizeOf()) > + return CGF.GetVLASize(VAT); > + else > + assert(0 && "alignof VLAs not implemented yet"); > + } > + > std::pair<uint64_t, unsigned> Info = > CGF.getContext().getTypeInfo(TypeToSize); > > uint64_t Val = E->isSizeOf() ? Info.first : Info.second; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
