[cfe-commits] r60943 - in /cfe/trunk/lib/CodeGen: CGDecl.cpp CGExprScalar.cpp

Daniel Dunbar daniel at zuster.org
Fri Dec 12 11:35:45 PST 2008


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 <andersca at mac.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list