[cfe-commits] r52422 - in /cfe/trunk: Driver/ include/clang/AST/ include/clang/Analysis/Visitors/ lib/AST/ lib/Analysis/ lib/CodeGen/ lib/Sema/

Chris Lattner sabre at nondot.org
Tue Jun 17 11:05:58 PDT 2008


Author: lattner
Date: Tue Jun 17 13:05:57 2008
New Revision: 52422

URL: http://llvm.org/viewvc/llvm-project?rev=52422&view=rev
Log:
Change self/_cmd to be instances of ImplicitParamDecl instead of ParmVarDecl.
Patch by David Chisnall!

Modified:
    cfe/trunk/Driver/RewriteObjC.cpp
    cfe/trunk/include/clang/AST/Decl.h
    cfe/trunk/include/clang/AST/DeclBase.h
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
    cfe/trunk/lib/AST/Decl.cpp
    cfe/trunk/lib/AST/DeclBase.cpp
    cfe/trunk/lib/AST/Expr.cpp
    cfe/trunk/lib/Analysis/GRExprEngine.cpp
    cfe/trunk/lib/Analysis/LiveVariables.cpp
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h
    cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
    cfe/trunk/lib/CodeGen/CodeGenTypes.h
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/Driver/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteObjC.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteObjC.cpp (original)
+++ cfe/trunk/Driver/RewriteObjC.cpp Tue Jun 17 13:05:57 2008
@@ -1975,9 +1975,10 @@
       llvm::SmallVector<Expr*, 4> InitExprs;
       
       // set the receiver to self, the first argument to all methods.
-      InitExprs.push_back(new DeclRefExpr(CurMethodDecl->getSelfDecl(), 
-                                          Context->getObjCIdType(),
-                                          SourceLocation())); 
+      InitExprs.push_back(new DeclRefExpr(
+            CurMethodDecl->getSelfDecl(), 
+            Context->getObjCIdType(),
+            SourceLocation())); 
       llvm::SmallVector<Expr*, 8> ClsExprs;
       QualType argType = Context->getPointerType(Context->CharTy);
       ClsExprs.push_back(new StringLiteral(SuperDecl->getIdentifier()->getName(), 

Modified: cfe/trunk/include/clang/AST/Decl.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Decl.h (original)
+++ cfe/trunk/include/clang/AST/Decl.h Tue Jun 17 13:05:57 2008
@@ -308,6 +308,20 @@
   static VarDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
 };
 
+class ImplicitParamDecl : public VarDecl {
+protected:
+  ImplicitParamDecl(Kind DK, DeclContext *DC, SourceLocation L,
+            IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl) 
+    : VarDecl(DK, DC, L, Id, T, VarDecl::None, PrevDecl) {}
+public:
+  static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
+                         SourceLocation L, IdentifierInfo *Id,
+                         QualType T, ScopedDecl *PrevDecl);
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const ImplicitParamDecl *D) { return true; }
+  static bool classof(const Decl *D) { return D->getKind() == ImplicitParam; }
+};
+
 /// ParmVarDecl - Represent a parameter to a function.
 class ParmVarDecl : public VarDecl {
   // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum

Modified: cfe/trunk/include/clang/AST/DeclBase.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclBase.h (original)
+++ cfe/trunk/include/clang/AST/DeclBase.h Tue Jun 17 13:05:57 2008
@@ -69,6 +69,7 @@
                Function,  // [DeclContext]
                  CXXMethod,
                Var,
+                 ImplicitParam,
                  CXXClassVar,
                  ParmVar,
          ObjCInterface,  // [DeclContext]
@@ -172,6 +173,7 @@
   IdentifierNamespace getIdentifierNamespace() const {
     switch (DeclKind) {
     default: assert(0 && "Unknown decl kind!");
+    case ImplicitParam:
     case Typedef:
     case Function:
     case Var:

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Tue Jun 17 13:05:57 2008
@@ -91,7 +91,9 @@
   // The following are only used for method definitions, null otherwise.
   // FIXME: space savings opportunity, consider a sub-class.
   Stmt *Body;
-  ParmVarDecl *SelfDecl;
+  // Decls for implicit parameters
+  ImplicitParamDecl *SelfDecl;
+  ImplicitParamDecl *CmdDecl;
   
   ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
                  Selector SelInfo, QualType T,
@@ -107,8 +109,8 @@
     DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
     MethodContext(static_cast<NamedDecl*>(contextDecl)),
     SelName(SelInfo), MethodDeclType(T), 
-    ParamInfo(0), NumMethodParams(0),
-    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
+    ParamInfo(0), NumMethodParams(0), MethodAttrs(M), 
+    EndLoc(endLoc), Body(0), SelfDecl(0), CmdDecl(0) {}
 
   virtual ~ObjCMethodDecl();
   
@@ -164,6 +166,11 @@
     ParamInfo[i] = pDecl;
   }  
   void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
+
+  ImplicitParamDecl * getSelfDecl() const { return SelfDecl; }
+  void setSelfDecl(ImplicitParamDecl *decl) { SelfDecl = decl; }
+  ImplicitParamDecl * getCmdDecl() const { return CmdDecl; }
+  void setCmdDecl(ImplicitParamDecl *decl) { CmdDecl = decl; }
   
   AttributeList *getMethodAttrs() const {return MethodAttrs;}
   bool isInstance() const { return IsInstance; }
@@ -182,10 +189,6 @@
   const Stmt *getBody() const { return Body; }
   void setBody(Stmt *B) { Body = B; }
 
-  const ParmVarDecl *getSelfDecl() const { return SelfDecl; }
-  ParmVarDecl *getSelfDecl() { return SelfDecl; }
-  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
-  
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { return D->getKind() == ObjCMethod; }
   static bool classof(const ObjCMethodDecl *D) { return true; }

Modified: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (original)
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h Tue Jun 17 13:05:57 2008
@@ -56,6 +56,7 @@
         DISPATCH_CASE(Function,FunctionDecl)
         DISPATCH_CASE(Var,VarDecl)
         DISPATCH_CASE(ParmVar,ParmVarDecl)       // FIXME: (same)
+        DISPATCH_CASE(ImplicitParam,ImplicitParamDecl)
         DISPATCH_CASE(EnumConstant,EnumConstantDecl)
         DISPATCH_CASE(Typedef,TypedefDecl)
         DISPATCH_CASE(Struct,RecordDecl)    // FIXME: Refine.  VisitStructDecl?
@@ -70,6 +71,7 @@
   DEFAULT_DISPATCH(VarDecl)
   DEFAULT_DISPATCH(FunctionDecl)
   DEFAULT_DISPATCH_VARDECL(ParmVarDecl)
+  DEFAULT_DISPATCH(ImplicitParamDecl)
   DEFAULT_DISPATCH(EnumConstantDecl)
   DEFAULT_DISPATCH(TypedefDecl)
   DEFAULT_DISPATCH(RecordDecl)

Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Tue Jun 17 13:05:57 2008
@@ -40,6 +40,12 @@
 }
 
 
+ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
+    SourceLocation L, IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl) {
+  void *Mem = C.getAllocator().Allocate<ImplicitParamDecl>();
+  return new (Mem) ImplicitParamDecl(ImplicitParam, DC, L, Id, T, PrevDecl);
+}
+
 VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC,
                          SourceLocation L,
                          IdentifierInfo *Id, QualType T,

Modified: cfe/trunk/lib/AST/DeclBase.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclBase.cpp (original)
+++ cfe/trunk/lib/AST/DeclBase.cpp Tue Jun 17 13:05:57 2008
@@ -206,6 +206,7 @@
   case ObjCPropertyImpl:    nObjCPropertyImplDecl++; break;
   case LinkageSpec:         nLinkageSpecDecl++; break;
   case FileScopeAsm:        nFileScopeAsmDecl++; break;
+  case ImplicitParam:
   case TranslationUnit:     break;
 
   // FIXME: Statistics for C++ decls.

Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Tue Jun 17 13:05:57 2008
@@ -389,10 +389,12 @@
     if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType())
       return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue();
     return LV_Valid;
-  case DeclRefExprClass: // C99 6.5.1p2
-    if (isa<VarDecl>(cast<DeclRefExpr>(this)->getDecl()))
+  case DeclRefExprClass: { // C99 6.5.1p2
+    const Decl *RefdDecl = cast<DeclRefExpr>(this)->getDecl();
+    if (isa<VarDecl>(RefdDecl) || isa<ImplicitParamDecl>(RefdDecl))
       return LV_Valid;
     break;
+  }
   case MemberExprClass: { // C99 6.5.2.3p4
     const MemberExpr *m = cast<MemberExpr>(this);
     return m->isArrow() ? LV_Valid : m->getBase()->isLvalue();

Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Tue Jun 17 13:05:57 2008
@@ -144,12 +144,18 @@
   
   for (LVDataTy::decl_iterator I=D.begin_decl(), E=D.end_decl(); I != E; ++I) {
     
-    VarDecl* VD = cast<VarDecl>(const_cast<ScopedDecl*>(I->first));
-    
-    if (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD)) {
-      RVal X = RVal::GetSymbolValue(SymMgr, VD);
-      StateMgr.BindVar(StateImpl, VD, X);
+    ScopedDecl *SD = const_cast<ScopedDecl*>(I->first);
+    if (VarDecl* VD = dyn_cast<VarDecl>(SD)) {
+      if (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD)) {
+        RVal X = RVal::GetSymbolValue(SymMgr, VD);
+        StateMgr.BindVar(StateImpl, VD, X);
+      }
+    } else if (ImplicitParamDecl *IPD = dyn_cast<ImplicitParamDecl>(SD)) {
+        RVal X = RVal::GetSymbolValue(SymMgr, IPD);
+        StateMgr.BindVar(StateImpl, IPD, X);
     }
+      
+
   }
   
   return StateMgr.getPersistentState(StateImpl);

Modified: cfe/trunk/lib/Analysis/LiveVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/LiveVariables.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/LiveVariables.cpp (original)
+++ cfe/trunk/lib/Analysis/LiveVariables.cpp Tue Jun 17 13:05:57 2008
@@ -60,6 +60,11 @@
       AD.AlwaysLive(*I, AD) = Alive;      
   }
 
+  void VisitImplicitParamDecl(ImplicitParamDecl* IPD) {
+    // Register the VarDecl for tracking.
+    AD.Register(IPD);
+  }
+
   void VisitVarDecl(VarDecl* VD) {
     // Register the VarDecl for tracking.
     AD.Register(VD);

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Jun 17 13:05:57 2008
@@ -370,7 +370,8 @@
 LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
   const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
   
-  if (VD && (VD->isBlockVarDecl() || isa<ParmVarDecl>(VD))) {
+  if (VD && (VD->isBlockVarDecl() || isa<ParmVarDecl>(VD) ||
+        isa<ImplicitParamDecl>(VD))) {
     if (VD->getStorageClass() == VarDecl::Extern)
       return LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD, false),
                               E->getType().getCVRQualifiers());
@@ -386,6 +387,12 @@
     return LValue::MakeAddr(CGM.GetAddrOfFunctionDecl(FD, false),
                             E->getType().getCVRQualifiers());
   }
+  else 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, E->getType().getCVRQualifiers());
+  }
   assert(0 && "Unimp declref");
   //an invalid LValue, but the assert will
   //ensure that this point is never reached.

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Tue Jun 17 13:05:57 2008
@@ -16,6 +16,8 @@
 #include "CodeGenModule.h"
 #include "clang/AST/ExprObjC.h"
 #include "llvm/Constant.h"
+#include "llvm/Function.h"
+
 using namespace clang;
 using namespace CodeGen;
 
@@ -24,4 +26,91 @@
   return CGM.GetAddrOfConstantCFString(S);
 }
 
+/// Generate an Objective-C method.  An Objective-C method is a C function with
+/// its pointer, name, and types registered in the class struture.  
+void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
+
+  llvm::SmallVector<const llvm::Type *, 16> ParamTypes;
+  for (unsigned i=0 ; i<OMD->param_size() ; i++) {
+    const llvm::Type *Ty = ConvertType(OMD->getParamDecl(i)->getType());
+    if (Ty->isFirstClassType())
+      ParamTypes.push_back(Ty);
+    else
+      ParamTypes.push_back(llvm::PointerType::getUnqual(Ty));
+  }
+  std::string CategoryName = "";
+  if (ObjCCategoryImplDecl *OCD =
+      dyn_cast<ObjCCategoryImplDecl>(OMD->getMethodContext())) {
+    CategoryName = OCD->getName();
+  }
+  const llvm::Type *ReturnTy = CGM.getTypes().ConvertReturnType(OMD->getResultType());
+  CurFn = CGM.getObjCRuntime()->MethodPreamble(
+                                              OMD->getClassInterface()->getName(),
+                                              CategoryName,
+                                              OMD->getSelector().getName(),
+                                              ReturnTy,
+                                              llvm::PointerType::getUnqual(
+                                              llvm::Type::Int32Ty),
+                                              ParamTypes.begin(),
+                                              OMD->param_size(),
+                                              !OMD->isInstance(),
+                                              OMD->isVariadic());
+  llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn);
+  
+  // Create a marker to make it easy to insert allocas into the entryblock
+  // later.  Don't create this with the builder, because we don't want it
+  // folded.
+  llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty);
+  AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt",
+                                         EntryBB);
+
+  FnRetTy = OMD->getResultType();
+  CurFuncDecl = OMD;
+
+  Builder.SetInsertPoint(EntryBB);
+  
+  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
+  llvm::Function::arg_iterator AI = CurFn->arg_begin();
+  
+  if (hasAggregateLLVMType(OMD->getResultType())) {
+    ++AI;
+  }
+  // Add implicit parameters to the decl map.
+  // TODO: Add something to AST to let the runtime specify the names and types
+  // of these.
+
+  llvm::Value *&SelfEntry = LocalDeclMap[OMD->getSelfDecl()];
+  const llvm::Type *IPTy = AI->getType();
+  llvm::Value *DeclPtr = new llvm::AllocaInst(IPTy, 0, AI->getName() +
+      ".addr", AllocaInsertPt);
+  // Store the initial value into the alloca.
+  Builder.CreateStore(AI, DeclPtr);
+  SelfEntry = DeclPtr;
+  ++AI;
+  llvm::Value *&CmdEntry = LocalDeclMap[OMD->getCmdDecl()];
+  IPTy = AI->getType();
+  DeclPtr = new llvm::AllocaInst(IPTy, 0, AI->getName() +
+      ".addr", AllocaInsertPt);
+  // Store the initial value into the alloca.
+  Builder.CreateStore(AI, DeclPtr);
+  CmdEntry = DeclPtr;
+
+  for (unsigned i = 0, e = OMD->getNumParams(); i != e; ++i, ++AI) {
+    assert(AI != CurFn->arg_end() && "Argument mismatch!");
+    EmitParmDecl(*OMD->getParamDecl(i), AI);
+  }
+  
+  GenerateFunction(OMD->getBody());
+}
+
+llvm::Value *CodeGenFunction::LoadObjCSelf(void)
+{
+  if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(CurFuncDecl)) {
+    ValueDecl *Decl = OMD->getSelfDecl();
+    llvm::Value *SelfPtr = LocalDeclMap[&(*(Decl))];
+    return Builder.CreateLoad(SelfPtr, "self");
+  }
+  return NULL;
+}
+
 CGObjCRuntime::~CGObjCRuntime() {}

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Jun 17 13:05:57 2008
@@ -27,7 +27,10 @@
 
 CodeGenFunction::CodeGenFunction(CodeGenModule &cgm) 
   : CGM(cgm), Target(CGM.getContext().Target), SwitchInsn(NULL), 
-    CaseRangeBlock(NULL) {}
+    CaseRangeBlock(NULL) {
+    LLVMIntTy = ConvertType(getContext().IntTy);
+    LLVMPointerWidth = Target.getPointerWidth(0);
+}
 
 ASTContext &CodeGenFunction::getContext() const {
   return CGM.getContext();
@@ -51,82 +54,20 @@
   return CGM.getTypes().ConvertType(T);
 }
 
-bool CodeGenFunction::hasAggregateLLVMType(QualType T) {
-  return !T->isRealType() && !T->isPointerLikeType() &&
-         !T->isVoidType() && !T->isVectorType() && !T->isFunctionType();
+bool CodeGenFunction::isObjCPointerType(QualType T) {
+  // All Objective-C types are pointers.
+  return T->isObjCInterfaceType() ||
+    T->isObjCQualifiedInterfaceType() || T->isObjCQualifiedIdType();
 }
 
-/// Generate an Objective-C method.  An Objective-C method is a C function with
-/// its pointer, name, and types registered in the class struture.  
-// FIXME: This method contains a lot of code copied and pasted from
-// GenerateCode.  This should be factored out.
-void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
-  llvm::SmallVector<const llvm::Type *, 16> ParamTypes;
-  for (unsigned i=0 ; i<OMD->param_size() ; i++) {
-    ParamTypes.push_back(ConvertType(OMD->getParamDecl(i)->getType()));
-  }
-  std::string CategoryName = "";
-  if (ObjCCategoryImplDecl *OCD =
-    dyn_cast<ObjCCategoryImplDecl>(OMD->getMethodContext())) {
-    CategoryName = OCD->getName();
-  }
-
-  CurFn =CGM.getObjCRuntime()->MethodPreamble(
-                            OMD->getClassInterface()->getName(),
-                            CategoryName,
-                            OMD->getSelector().getName(),
-                            ConvertType(OMD->getResultType()),
-                            llvm::PointerType::getUnqual(llvm::Type::Int32Ty),
-                            ParamTypes.begin(),
-                            OMD->param_size(),
-                            !OMD->isInstance(),
-                            OMD->isVariadic());
-  llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn);
-  
-  // Create a marker to make it easy to insert allocas into the entryblock
-  // later.  Don't create this with the builder, because we don't want it
-  // folded.
-  llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty);
-  AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt",
-                                         EntryBB);
-
-  FnRetTy = OMD->getResultType();
-
-  Builder.SetInsertPoint(EntryBB);
-  
-  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
-  llvm::Function::arg_iterator AI = CurFn->arg_begin();
-  
-  // Name the struct return argument.
-  // FIXME: Probably should be in the runtime, or it will trample the other
-  // hidden arguments.
-  if (hasAggregateLLVMType(OMD->getResultType())) {
-    AI->setName("agg.result");
-    ++AI;
-  }
-
-  // Add implicit parameters to the decl map.
-  // TODO: Add something to AST to let the runtime specify the names and types
-  // of these.
-  llvm::Value *&DMEntry = LocalDeclMap[&(*OMD->getSelfDecl())];
-  const llvm::Type *SelfTy = AI->getType();
-  llvm::Value *DeclPtr = new llvm::AllocaInst(SelfTy, 0, "self.addr",
-                                   AllocaInsertPt);
-
-  // Store the initial value into the alloca.
-  // FIXME: volatility
-  Builder.CreateStore(AI, DeclPtr);
-  DMEntry = DeclPtr;
-  ++AI; ++AI;
-
+bool CodeGenFunction::hasAggregateLLVMType(QualType T) {
+  return !isObjCPointerType(T) &&!T->isRealType() && !T->isPointerLikeType() &&
+    !T->isVoidType() && !T->isVectorType() && !T->isFunctionType();
+}
 
-  for (unsigned i = 0, e = OMD->getNumParams(); i != e; ++i, ++AI) {
-    assert(AI != CurFn->arg_end() && "Argument mismatch!");
-    EmitParmDecl(*OMD->getParamDecl(i), AI);
-  }
-  
+void CodeGenFunction::GenerateFunction(const Stmt *Body) {
   // Emit the function body.
-  EmitStmt(OMD->getBody());
+  EmitStmt(Body);
   
   // Emit a return for code that falls off the end. If insert point
   // is a dummy block with no predecessors then remove the block itself.
@@ -134,6 +75,7 @@
   if (isDummyBlock(BB))
     BB->eraseFromParent();
   else {
+    // FIXME: if this is C++ main, this should return 0.
     if (CurFn->getReturnType() == llvm::Type::VoidTy)
       Builder.CreateRetVoid();
     else
@@ -145,28 +87,14 @@
   // Remove the AllocaInsertPt instruction, which is just a convenience for us.
   AllocaInsertPt->eraseFromParent();
   AllocaInsertPt = 0;
+  
   // Verify that the function is well formed.
-  assert(!verifyFunction(*CurFn) && "Generated method is not well formed.");
-}
-
-llvm::Value *CodeGenFunction::LoadObjCSelf(void)
-{
-  if(const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(CurFuncDecl)) {
-    llvm::Value *SelfPtr = LocalDeclMap[&(*OMD->getSelfDecl())];
-    // FIXME: Volatility
-    return Builder.CreateLoad(SelfPtr, "self");
-  }
-  return NULL;
+  assert(!verifyFunction(*CurFn) && "Generated function is not well formed.");
 }
 
 void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
-  LLVMIntTy = ConvertType(getContext().IntTy);
-  LLVMPointerWidth = static_cast<unsigned>(
-    getContext().getTypeSize(getContext().getPointerType(getContext().VoidTy)));
-  
   CurFuncDecl = FD;
-  FnRetTy = FD->getType()->getAsFunctionType()->getResultType();
-
+  FnRetTy = FD->getResultType();
   CurFn = cast<llvm::Function>(CGM.GetAddrOfFunctionDecl(FD, true));
   assert(CurFn->isDeclaration() && "Function already has body?");
 
@@ -180,16 +108,7 @@
                                          EntryBB);
   
   Builder.SetInsertPoint(EntryBB);
-
-  CGDebugInfo *DI = CGM.getDebugInfo();
-  if (DI) {
-    CompoundStmt* body = cast<CompoundStmt>(CurFuncDecl->getBody());
-    if (body->getLBracLoc().isValid()) {
-      DI->setLocation(body->getLBracLoc());
-    }
-    DI->EmitFunctionStart(FD, CurFn, Builder);
-  }
-
+  
   // Emit allocs for param decls.  Give the LLVM Argument nodes names.
   llvm::Function::arg_iterator AI = CurFn->arg_begin();
   
@@ -203,39 +122,7 @@
     assert(AI != CurFn->arg_end() && "Argument mismatch!");
     EmitParmDecl(*FD->getParamDecl(i), AI);
   }
-  
-  // Emit the function body.
-  EmitStmt(FD->getBody());
-  
-  if (DI) {
-    CompoundStmt* body = cast<CompoundStmt>(CurFuncDecl->getBody());
-    if (body->getRBracLoc().isValid()) {
-      DI->setLocation(body->getRBracLoc());
-    }
-    DI->EmitRegionEnd(CurFn, Builder);
-  }
-
-  // Emit a return for code that falls off the end. If insert point
-  // is a dummy block with no predecessors then remove the block itself.
-  llvm::BasicBlock *BB = Builder.GetInsertBlock();
-  if (isDummyBlock(BB))
-    BB->eraseFromParent();
-  else {
-    // FIXME: if this is C++ main, this should return 0.
-    if (CurFn->getReturnType() == llvm::Type::VoidTy)
-      Builder.CreateRetVoid();
-    else
-      Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType()));
-  }
-  assert(BreakContinueStack.empty() &&
-         "mismatched push/pop in break/continue stack!");
-  
-  // Remove the AllocaInsertPt instruction, which is just a convenience for us.
-  AllocaInsertPt->eraseFromParent();
-  AllocaInsertPt = 0;
-  
-  // Verify that the function is well formed.
-  assert(!verifyFunction(*CurFn) && "Generated function is not well formed.");
+  GenerateFunction(FD->getBody());
 }
 
 /// isDummyBlock - Return true if BB is an empty basic block

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Jun 17 13:05:57 2008
@@ -232,7 +232,7 @@
   llvm::IRBuilder Builder;
   
   // Holds the Decl for the current function or method
-  const FunctionDecl *CurFuncDecl;
+  const Decl *CurFuncDecl;
   QualType FnRetTy;
   llvm::Function *CurFn;
 
@@ -277,11 +277,16 @@
 
   void GenerateObjCMethod(const ObjCMethodDecl *OMD);
   void GenerateCode(const FunctionDecl *FD);
+  void GenerateFunction(const Stmt *Body);
   
   const llvm::Type *ConvertType(QualType T);
 
   llvm::Value *LoadObjCSelf();
-  
+
+  /// isObjCPointerType - Return true if the specificed AST type will map onto
+  /// some Objective-C pointer type.
+  static bool isObjCPointerType(QualType T);
+
   /// hasAggregateLLVMType - Return true if the specified AST type will map into
   /// an aggregate LLVM type or is void.
   static bool hasAggregateLLVMType(QualType T);

Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenTypes.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenTypes.cpp Tue Jun 17 13:05:57 2008
@@ -161,6 +161,13 @@
   }
 }
 
+const llvm::Type *CodeGenTypes::ConvertReturnType(QualType T) {
+  if (T->isVoidType())
+    return llvm::Type::VoidTy;    // Result of function uses llvm void.
+  else
+    return ConvertType(T);
+}
+
 static const llvm::Type* getTypeForFormat(const llvm::fltSemantics * format) {
   if (format == &llvm::APFloat::IEEEsingle)
     return llvm::Type::FloatTy;

Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenTypes.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenTypes.h Tue Jun 17 13:05:57 2008
@@ -132,6 +132,9 @@
   /// ConvertType - Convert type T into a llvm::Type.  
   const llvm::Type *ConvertType(QualType T);
   const llvm::Type *ConvertTypeRecursive(QualType T);
+  /// ConvertReturnType - Convert T into an llvm::Type assuming that it will be
+  /// used as a function return type.
+  const llvm::Type *ConvertReturnType(QualType T);
   
   /// ConvertTypeForMem - Convert type T into a llvm::Type.  This differs from
   /// ConvertType in that it is used to convert to the memory representation for
@@ -143,6 +146,8 @@
       std::vector<const llvm::Type*> &IvarTypes);
   
   const CGRecordLayout *getCGRecordLayout(const TagDecl*) const;
+  /// Returns a StructType representing an Objective-C object
+  const llvm::Type *ConvertObjCInterfaceToStruct(const ObjCInterfaceDecl *OID);
   
   /// getLLVMFieldNo - Return llvm::StructType element number
   /// that corresponds to the field FD.

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Tue Jun 17 13:05:57 2008
@@ -277,7 +277,7 @@
 
   /// Helpers for dealing with function parameters
   bool CheckParmsForFunctionDef(FunctionDecl *FD);
-  ParmVarDecl *CreateImplicitParameter(Scope *S, IdentifierInfo *Id, 
+  ImplicitParamDecl *CreateImplicitParameter(Scope *S, IdentifierInfo *Id, 
                                        SourceLocation IdLoc, QualType Type);
   void CheckCXXDefaultArguments(FunctionDecl *FD);
   void CheckExtraCXXDefaultArguments(Declarator &D);

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Jun 17 13:05:57 2008
@@ -480,11 +480,11 @@
 /// in the scope S and with the given type. This routine is used, for
 /// example, to create the implicit "self" parameter in an Objective-C
 /// method.
-ParmVarDecl *
+ImplicitParamDecl *
 Sema::CreateImplicitParameter(Scope *S, IdentifierInfo *Id, 
                               SourceLocation IdLoc, QualType Type) {
-  ParmVarDecl *New = ParmVarDecl::Create(Context, CurContext, IdLoc, Id, Type, 
-                                         VarDecl::None, 0, 0);
+  ImplicitParamDecl *New = ImplicitParamDecl::Create(Context, CurContext,
+      IdLoc, Id, Type, 0);
   if (Id)
     PushOnScopeChains(New, S);
 

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=52422&r1=52421&r2=52422&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Tue Jun 17 13:05:57 2008
@@ -53,12 +53,12 @@
     }
   } else // we have a factory method.
     selfTy = Context.getObjCClassType();
-  CurMethodDecl->setSelfDecl(CreateImplicitParameter(FnBodyScope, PI.Ident, 
-                                                     PI.IdentLoc, selfTy));
+  CurMethodDecl->setSelfDecl(CreateImplicitParameter(FnBodyScope,
+        PI.Ident, PI.IdentLoc, selfTy));
   
   PI.Ident = &Context.Idents.get("_cmd");
-  CreateImplicitParameter(FnBodyScope, PI.Ident, PI.IdentLoc, 
-                          Context.getObjCSelType());
+  CurMethodDecl->setCmdDecl(CreateImplicitParameter(FnBodyScope,
+        PI.Ident, PI.IdentLoc, Context.getObjCSelType()));
 
   // Introduce all of the other parameters into this scope.
   for (unsigned i = 0, e = MDecl->getNumParams(); i != e; ++i) {





More information about the cfe-commits mailing list