aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-02-09 08:50:58 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-02-09 08:50:58 +0000
commit472778eb4fce241721c563280886e98389bc7219 (patch)
treeb33b88e8322f4dc1ddb5d91b3e848cf5c6b8b142
parentefe7f36f4d87b6e64b87128a81018350b2f21987 (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.cpp12
-rw-r--r--CodeGen/CodeGenFunction.h4
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