diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-02-09 08:50:58 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-02-09 08:50:58 +0000 |
commit | 472778eb4fce241721c563280886e98389bc7219 (patch) | |
tree | b33b88e8322f4dc1ddb5d91b3e848cf5c6b8b142 | |
parent | efe7f36f4d87b6e64b87128a81018350b2f21987 (diff) |
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
-rw-r--r-- | CodeGen/CGExpr.cpp | 12 | ||||
-rw-r--r-- | CodeGen/CodeGenFunction.h | 4 |
2 files changed, 13 insertions, 3 deletions
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 |