aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-03-30 23:25:33 +0000
committerChris Lattner <sabre@nondot.org>2008-03-30 23:25:33 +0000
commitce5605ecf76d8cde6372138f830bb144d174ced9 (patch)
treef3aa9a95602ec48d6fa560d2c4c1599d543a9ed6
parent391d77a26382dddf25da73e29fc1fa5aaaea4c6f (diff)
some cleanups on top of David's patch. There are still two
remaining open issues I've communicated to him: 1) self can be assigned to, and his patch didn't handle it correctly. 2) CollectObjCIvarTypes is N^2 (because each subclass reprocesses all parent class ivars) and flattens classes. If A derives from B, and both have an int, I'd expect to get { {i32}, i32}, not { i32, i32}. David, please review. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48970 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGExpr.cpp41
-rw-r--r--lib/CodeGen/CGExprScalar.cpp26
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp12
-rw-r--r--lib/CodeGen/CodeGenModule.cpp12
-rw-r--r--lib/CodeGen/CodeGenTypes.cpp19
5 files changed, 46 insertions, 64 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 12900e8b9d..66aeea3540 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -82,7 +82,7 @@ RValue CodeGenFunction::EmitAnyExpr(const Expr *E, llvm::Value *AggLoc,
LValue CodeGenFunction::EmitLValue(const Expr *E) {
switch (E->getStmtClass()) {
default: {
- printf("Statement class: %d\n", E->getStmtClass());
+ printf("Statement class: %d\n", E->getStmtClass());
WarnUnsupported(E, "l-value expression");
llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType()));
return LValue::MakeAddr(llvm::UndefValue::get(Ty));
@@ -566,32 +566,27 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
// a class without recompiling all of the subclasses. If this is the case
// then the CGObjCRuntime subclass must return true to LateBoundIvars and
// implement the lookup itself.
- if(CGM.getObjCRuntime()->LateBoundIVars()) {
+ if (CGM.getObjCRuntime()->LateBoundIVars()) {
assert(0 && "FIXME: Implement support for late-bound instance variables");
return LValue(); // Not reached.
}
- else {
- // Get a structure type for the object
- QualType ExprTy = E->getBase()->getType();
- const llvm::Type *ObjectType = ConvertType(ExprTy);
- //TODO: Add a special case for isa (index 0)
- // Work out which index the ivar is
- const ObjCIvarDecl *Decl = E->getDecl();
- unsigned Index = CGM.getTypes().getLLVMFieldNo(Decl);
+
+ // Get a structure type for the object
+ QualType ExprTy = E->getBase()->getType();
+ const llvm::Type *ObjectType = ConvertType(ExprTy);
+ // TODO: Add a special case for isa (index 0)
+ // Work out which index the ivar is
+ const ObjCIvarDecl *Decl = E->getDecl();
+ unsigned Index = CGM.getTypes().getLLVMFieldNo(Decl);
- // Get object pointer
- llvm::Value * Object = EmitLValue(E->getBase()).getAddress();
- // Coerce object pointer to correct type.
- if (Object->getType() != ObjectType) {
- Object = Builder.CreateBitCast(Object, ObjectType);
- }
- // Get the correct element
- llvm::Value * Element = Builder.CreateStructGEP(Object,
- Index,
- Decl->getName());
- // Element = Builder.CreateLoad(Element);
- return LValue::MakeAddr(Element);
- }
+ // Get object pointer and coerce object pointer to correct type.
+ llvm::Value *Object = EmitLValue(E->getBase()).getAddress();
+ if (Object->getType() != ObjectType)
+ Object = Builder.CreateBitCast(Object, ObjectType);
+
+ // Return a pointer to the right element.
+ return LValue::MakeAddr(Builder.CreateStructGEP(Object, Index,
+ Decl->getName()));
}
RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType,
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 6c5326105f..9497ece6fb 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -19,7 +19,6 @@
#include "llvm/GlobalVariable.h"
#include "llvm/Intrinsics.h"
#include "llvm/Support/Compiler.h"
-#include "llvm/ValueSymbolTable.h"
#include <cstdarg>
using namespace clang;
@@ -51,7 +50,6 @@ public:
Builder(CGF.Builder),
Runtime(CGF.CGM.getObjCRuntime()) {
}
-
//===--------------------------------------------------------------------===//
// Utilities
@@ -127,7 +125,7 @@ public:
return EmitLoadOfLValue(E);
}
Value *VisitObjCMessageExpr(ObjCMessageExpr *E);
- Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
+ Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { return EmitLoadOfLValue(E);}
Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
Value *VisitMemberExpr(Expr *E) { return EmitLoadOfLValue(E); }
Value *VisitOCUVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
@@ -451,22 +449,18 @@ Value *ScalarExprEmitter::VisitExpr(Expr *E) {
return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
}
-Value *ScalarExprEmitter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
- return Builder.CreateLoad(CGF.EmitObjCIvarRefLValue(E).getAddress());
-}
-
Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
// Only the lookup mechanism and first two arguments of the method
// implementation vary between runtimes. We can get the receiver and
// arguments in generic code.
// Find the receiver
- llvm::Value * Receiver = CGF.EmitScalarExpr(E->getReceiver());
+ llvm::Value *Receiver = CGF.EmitScalarExpr(E->getReceiver());
// Process the arguments
- unsigned int ArgC = E->getNumArgs();
+ unsigned ArgC = E->getNumArgs();
llvm::SmallVector<llvm::Value*, 16> Args;
- for(unsigned i=0 ; i<ArgC ; i++) {
+ for (unsigned i = 0; i != ArgC; ++i) {
Expr *ArgExpr = E->getArg(i);
QualType ArgTy = ArgExpr->getType();
if (!CGF.hasAggregateLLVMType(ArgTy)) {
@@ -489,13 +483,11 @@ Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
llvm::Constant *Selector = CGF.CGM.GetAddrOfConstantString(SelStr);
llvm::Value *SelPtr = Builder.CreateStructGEP(Selector, 0);
- return Runtime->generateMessageSend(Builder,
- ConvertType(E->getType()),
- CGF.CurFn->getValueSymbolTable().lookup("self"),
- Receiver,
- SelPtr,
- &Args[0],
- Args.size());
+ return Runtime->generateMessageSend(Builder, ConvertType(E->getType()),
+ // FIXME: Self can be assigned to!
+ CGF.CurFn->arg_begin(),
+ Receiver, SelPtr,
+ &Args[0], Args.size());
}
Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 3e811a73b7..5f47bb78c6 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -26,7 +26,7 @@ using namespace CodeGen;
CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
: CGM(cgm), Target(CGM.getContext().Target), SwitchInsn(NULL),
- CaseRangeBlock(NULL) {}
+ CaseRangeBlock(NULL) {}
ASTContext &CodeGenFunction::getContext() const {
return CGM.getContext();
@@ -64,11 +64,11 @@ void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
for (unsigned i=0 ; i<OMD->param_size() ; i++) {
ParamTypes.push_back(ConvertType(OMD->getParamDecl(i)->getType()));
}
- CurFn = CGM.getObjCRuntime()->MethodPreamble(ConvertType(OMD->getResultType()),
- llvm::PointerType::getUnqual(llvm::Type::Int32Ty),
- ParamTypes.begin(),
- OMD->param_size(),
- OMD->isVariadic());
+ CurFn =CGM.getObjCRuntime()->MethodPreamble(ConvertType(OMD->getResultType()),
+ llvm::PointerType::getUnqual(llvm::Type::Int32Ty),
+ ParamTypes.begin(),
+ OMD->param_size(),
+ OMD->isVariadic());
llvm::BasicBlock *EntryBB = new llvm::BasicBlock("entry", CurFn);
// Create a marker to make it easy to insert allocas into the entryblock
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 8374f2bab6..21b372b347 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -41,9 +41,8 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
CodeGenModule::~CodeGenModule() {
llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction();
- if (ObjCInitFunction) {
+ if (ObjCInitFunction)
AddGlobalCtor(ObjCInitFunction);
- }
EmitGlobalCtors();
delete Runtime;
}
@@ -80,15 +79,15 @@ void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor) {
/// called on module load, if any have been registered with AddGlobalCtor.
void CodeGenModule::EmitGlobalCtors() {
if (GlobalCtors.empty()) return;
+
// Get the type of @llvm.global_ctors
std::vector<const llvm::Type*> CtorFields;
CtorFields.push_back(llvm::IntegerType::get(32));
// Constructor function type
std::vector<const llvm::Type*> VoidArgs;
- llvm::FunctionType* CtorFuncTy = llvm::FunctionType::get(
- llvm::Type::VoidTy,
- VoidArgs,
- false);
+ llvm::FunctionType* CtorFuncTy =
+ llvm::FunctionType::get(llvm::Type::VoidTy, VoidArgs, false);
+
// i32, function type pair
const llvm::Type *FPType = llvm::PointerType::getUnqual(CtorFuncTy);
llvm::StructType* CtorStructTy =
@@ -120,7 +119,6 @@ void CodeGenModule::EmitGlobalCtors() {
GlobalCtorsVal->setInitializer(llvm::ConstantArray::get(GlobalCtorsTy,
CtorValues));
-
}
diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp
index afa20e4110..a16543eebe 100644
--- a/lib/CodeGen/CodeGenTypes.cpp
+++ b/lib/CodeGen/CodeGenTypes.cpp
@@ -148,16 +148,14 @@ void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
/// Objective-C object, in the order that they appear. Used to create LLVM
/// structures corresponding to Objective-C objects.
void CodeGenTypes::CollectObjCIvarTypes(ObjCInterfaceDecl *ObjCClass,
- std::vector<const llvm::Type*> &IvarTypes) {
+ std::vector<const llvm::Type*> &IvarTypes) {
ObjCInterfaceDecl *SuperClass = ObjCClass->getSuperClass();
- if(SuperClass) {
+ if (SuperClass)
CollectObjCIvarTypes(SuperClass, IvarTypes);
- }
- for(ObjCInterfaceDecl::ivar_iterator ivar=ObjCClass->ivar_begin() ;
- ivar != ObjCClass->ivar_end() ;
- ivar++) {
- IvarTypes.push_back(ConvertType((*ivar)->getType()));
- ObjCIvarInfo[*ivar] = IvarTypes.size() - 1;
+ for (ObjCInterfaceDecl::ivar_iterator I = ObjCClass->ivar_begin(),
+ E = ObjCClass->ivar_end(); I != E; ++I) {
+ IvarTypes.push_back(ConvertType((*I)->getType()));
+ ObjCIvarInfo[*I] = IvarTypes.size() - 1;
}
}
@@ -420,8 +418,7 @@ const llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) {
/// getLLVMFieldNo - Return llvm::StructType element number
/// that corresponds to the field FD.
unsigned CodeGenTypes::getLLVMFieldNo(const FieldDecl *FD) {
- llvm::DenseMap<const FieldDecl *, unsigned>::iterator
- I = FieldInfo.find(FD);
+ llvm::DenseMap<const FieldDecl*, unsigned>::iterator I = FieldInfo.find(FD);
assert (I != FieldInfo.end() && "Unable to find field info");
return I->second;
}
@@ -429,7 +426,7 @@ unsigned CodeGenTypes::getLLVMFieldNo(const FieldDecl *FD) {
unsigned CodeGenTypes::getLLVMFieldNo(const ObjCIvarDecl *OID) {
llvm::DenseMap<const ObjCIvarDecl*, unsigned>::iterator
I = ObjCIvarInfo.find(OID);
- assert (I != ObjCIvarInfo.end() && "Unable to find field info");
+ assert(I != ObjCIvarInfo.end() && "Unable to find field info");
return I->second;
}