From: Eli Friedman Date: Sat, 9 Feb 2008 08:50:58 +0000 (+0000) Subject: Expose the logic for field address codegen; it is needed for aggregate X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=472778eb4fce241721c563280886e98389bc7219;p=clang Expose the logic for field address codegen; it is needed for aggregate initializers, and I don't want to duplicate the bitfield-handling code. (I'll send a patch for aggregate initializers to the mailing list sometime soon.) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46904 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp index 9c7876830c..6baf17fb10 100644 --- a/CodeGen/CGExpr.cpp +++ b/CodeGen/CGExpr.cpp @@ -454,7 +454,6 @@ EmitOCUVectorElementExpr(const OCUVectorElementExpr *E) { } LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { - llvm::Value *V; bool isUnion = false; Expr *BaseExpr = E->getBase(); llvm::Value *BaseValue = NULL; @@ -476,8 +475,15 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { } FieldDecl *Field = E->getMemberDecl(); - unsigned idx = CGM.getTypes().getLLVMFieldNo(Field); + return EmitLValueForField(BaseValue, Field, isUnion); +} +LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, + FieldDecl* Field, + bool isUnion) +{ + llvm::Value *V; + unsigned idx = CGM.getTypes().getLLVMFieldNo(Field); if (Field->isBitField()) { const llvm::Type * FieldTy = ConvertType(Field->getType()); @@ -568,7 +574,7 @@ RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType, for (unsigned i = 0, e = NumArgs; i != e; ++i) { QualType ArgTy = ArgExprs[i]->getType(); - + if (!hasAggregateLLVMType(ArgTy)) { // Scalar argument is passed by-value. Args.push_back(EmitScalarExpr(ArgExprs[i])); diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h index c741071d00..e885752933 100644 --- a/CodeGen/CodeGenFunction.h +++ b/CodeGen/CodeGenFunction.h @@ -71,6 +71,7 @@ namespace clang { class BlockVarDecl; class EnumConstantDecl; class ParmVarDecl; + class FieldDecl; namespace CodeGen { class CodeGenModule; class CodeGenTypes; @@ -415,6 +416,9 @@ public: LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E); LValue EmitOCUVectorElementExpr(const OCUVectorElementExpr *E); LValue EmitMemberExpr(const MemberExpr *E); + + LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field, + bool isUnion); //===--------------------------------------------------------------------===// // Scalar Expression Emission