diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-07 22:53:10 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-07 22:53:10 +0000 |
commit | 2ff6395ddcd153a25daa282624b9c58993a6a318 (patch) | |
tree | e12060b9da28b331cd642093aeffc412d2df61ca /clang/lib/CodeGen/CGExpr.cpp | |
parent | 6eee97276b53736826c22d3717be4e272ae2afeb (diff) | |
download | bcm5719-llvm-2ff6395ddcd153a25daa282624b9c58993a6a318.tar.gz bcm5719-llvm-2ff6395ddcd153a25daa282624b9c58993a6a318.zip |
More cleanup, the code is much easier to follow now.
llvm-svn: 86412
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 1a3fcc180a3..1a06226bb28 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -814,12 +814,13 @@ static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E, } LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { - const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()); + const NamedDecl *ND = E->getDecl(); - if (VD && (VD->isBlockVarDecl() || isa<ParmVarDecl>(VD) || - isa<ImplicitParamDecl>(VD))) { + if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) { LValue LV; - if (VD->hasExternalStorage()) { + + // Check if this is a global variable. + if (VD->hasExternalStorage() || VD->isFileVarDecl()) { llvm::Value *V = CGM.GetAddrOfGlobalVar(VD); if (VD->getType()->isReferenceType()) V = Builder.CreateLoad(V, "tmp"); @@ -852,16 +853,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { return LV; } - if (VD && VD->isFileVarDecl()) { - llvm::Value *V = CGM.GetAddrOfGlobalVar(VD); - if (VD->getType()->isReferenceType()) - V = Builder.CreateLoad(V, "tmp"); - LValue LV = LValue::MakeAddr(V, MakeQualifiers(E->getType())); - setObjCGCLValueClass(getContext(), E, LV); - return LV; - } - - if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) { + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) { llvm::Value* V = CGM.GetAddrOfFunction(FD); if (!FD->hasPrototype()) { if (const FunctionProtoType *Proto = @@ -878,20 +870,15 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { return LValue::MakeAddr(V, MakeQualifiers(E->getType())); } - if (const ImplicitParamDecl *IPD = dyn_cast<ImplicitParamDecl>(E->getDecl())){ - llvm::Value *V = LocalDeclMap[IPD]; - assert(V && "BlockVarDecl not entered in LocalDeclMap?"); - return LValue::MakeAddr(V, MakeQualifiers(E->getType())); - } - if (E->getQualifier()) { // FIXME: the qualifier check does not seem sufficient here - return EmitPointerToDataMemberLValue(cast<FieldDecl>(E->getDecl())); + return EmitPointerToDataMemberLValue(cast<FieldDecl>(ND)); } - assert(0 && "Unimp declref"); - //an invalid LValue, but the assert will - //ensure that this point is never reached. + assert(false && "Unhandled DeclRefExpr"); + + // an invalid LValue, but the assert will + // ensure that this point is never reached. return LValue(); } |