[cfe-commits] r54838 - in /cfe/trunk/lib/CodeGen: CGDecl.cpp CGObjC.cpp CGObjCGNU.cpp CGObjCMac.cpp CodeGenFunction.h CodeGenModule.cpp

Daniel Dunbar daniel at zuster.org
Fri Aug 15 20:19:20 PDT 2008


Author: ddunbar
Date: Fri Aug 15 22:19:19 2008
New Revision: 54838

URL: http://llvm.org/viewvc/llvm-project?rev=54838&view=rev
Log:
Add NeXT runtime support for generating methods.

Change CodeGenFunction::EmitParmDecl to take either a ParmVarDecl or an
  ImplicitParamDecl.

Drop hasAggregateLLVMType from CodeGenModule.cpp (use version in
  CodeGenFunction).

Change the Objective-C method generation to use EmitParmDecl for
  implicit parameters.

Modified:
    cfe/trunk/lib/CodeGen/CGDecl.cpp
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Fri Aug 15 22:19:19 2008
@@ -191,7 +191,10 @@
 
 /// Emit an alloca (or GlobalValue depending on target) 
 /// for the specified parameter and set up LocalDeclMap.
-void CodeGenFunction::EmitParmDecl(const ParmVarDecl &D, llvm::Value *Arg) {
+void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
+  // FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
+  assert(isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) &&
+         "Invalid argument to EmitParmDecl");
   QualType Ty = D.getType();
   
   llvm::Value *DeclPtr;

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Fri Aug 15 22:19:19 2008
@@ -124,45 +124,31 @@
   // Emit allocs for param decls.  Give the LLVM Argument nodes names.
   llvm::Function::arg_iterator AI = CurFn->arg_begin();
   
+  // Name the struct return argument.
   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.
+  EmitParmDecl(*OMD->getSelfDecl(), AI); 
+  ++AI;
 
-  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;
+  EmitParmDecl(*OMD->getCmdDecl(), AI); 
   ++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);
   }
-  
+  assert(AI == CurFn->arg_end() && "Argument mismatch");
+
   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;
+llvm::Value *CodeGenFunction::LoadObjCSelf(void) {
+  const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
+  return Builder.CreateLoad(LocalDeclMap[OMD->getSelfDecl()], "self");
 }
 
 CGObjCRuntime::~CGObjCRuntime() {}

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Fri Aug 15 22:19:19 2008
@@ -951,16 +951,6 @@
       llvm::GlobalValue::InternalLinkage,
       FunctionName,
       &TheModule);
-  llvm::Function::arg_iterator AI = Method->arg_begin();
-  // Name the struct return argument.
-  // FIXME: This is probably the wrong test.
-  if (!ReturnTy->isFirstClassType() && ReturnTy != llvm::Type::VoidTy) {
-    AI->setName("agg.result");
-    ++AI;
-  }
-  AI->setName("self");
-  ++AI;
-  AI->setName("_cmd");
   return Method;
 }
 

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Fri Aug 15 22:19:19 2008
@@ -14,6 +14,7 @@
 #include "CGObjCRuntime.h"
 
 #include "CodeGenModule.h"
+#include "CodeGenFunction.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclObjC.h"
@@ -22,6 +23,7 @@
 #include "llvm/Module.h"
 #include "llvm/Support/IRBuilder.h"
 #include "llvm/Target/TargetData.h"
+#include <sstream>
 
 using namespace clang;
 
@@ -194,6 +196,11 @@
   /// the name.
   llvm::Constant *GetMethodVarType(ObjCMethodDecl *D);
 
+  /// GetNameForMethod - Return a name for the given method.
+  /// \param[out] NameOut - The return value.
+  void GetNameForMethod(const ObjCMethodDecl *OMD,
+                        std::string &NameOut);
+
 public:
   CGObjCMac(CodeGen::CodeGenModule &cgm);
   virtual llvm::Constant *GenerateConstantString(const std::string &String);
@@ -606,7 +613,57 @@
 }
 
 void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ClassDecl) {
-  assert(0 && "Cannot generate class for Mac runtime.");
+  //assert(0 && "Cannot generate class for Mac runtime.");
+}
+
+llvm::Function *CGObjCMac::GenerateMethod(const ObjCMethodDecl *OMD) { 
+  const llvm::Type *ReturnTy = 
+    CGM.getTypes().ConvertReturnType(OMD->getResultType());
+  const llvm::Type *SelfTy = 
+    CGM.getTypes().ConvertType(OMD->getSelfDecl()->getType());
+
+  std::vector<const llvm::Type*> ArgTys;
+  ArgTys.reserve(1 + 2 + OMD->param_size());
+
+  // FIXME: This is not something we should have to be dealing with
+  // here.
+  bool useStructRet = 
+    CodeGen::CodeGenFunction::hasAggregateLLVMType(OMD->getResultType());
+  if (useStructRet) {
+    ArgTys.push_back(llvm::PointerType::getUnqual(ReturnTy));
+    ReturnTy = llvm::Type::VoidTy;
+  }
+
+  // Implicit arguments
+  ArgTys.push_back(SelfTy);
+  ArgTys.push_back(ObjCTypes.SelectorPtrTy);
+
+  for (ObjCMethodDecl::param_const_iterator 
+         i = OMD->param_begin(), e = OMD->param_end();
+       i != e; ++i) {
+    const llvm::Type *Ty = CGM.getTypes().ConvertType((*i)->getType());
+    if (Ty->isFirstClassType()) {
+      ArgTys.push_back(Ty);
+    } else {
+      ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
+    }
+  }
+
+  std::string Name;
+  GetNameForMethod(OMD, Name);
+
+  llvm::Function *Method = 
+    llvm::Function::Create(llvm::FunctionType::get(ReturnTy,
+                                                   ArgTys,
+                                                   OMD->isVariadic()),
+                           llvm::GlobalValue::InternalLinkage,
+                           Name,
+                           &CGM.getModule());
+
+  if (useStructRet)
+    Method->addParamAttr(1, llvm::ParamAttr::StructRet);
+
+  return Method;
 }
 
 llvm::Function *CGObjCMac::ModuleInitFunction() { 
@@ -616,11 +673,6 @@
   return NULL;
 }
 
-llvm::Function *CGObjCMac::GenerateMethod(const ObjCMethodDecl *OMD) {
-  assert(0 && "Cannot generate method preamble for Mac runtime.");
-  return 0;
-}
-
 /* *** Private Interface *** */
 
 /// EmitImageInfo - Emit the image info marker used to encode some module
@@ -786,6 +838,19 @@
   return getConstantGEP(Entry, 0, 0);
 }
 
+void CGObjCMac::GetNameForMethod(const ObjCMethodDecl *D, 
+                                 std::string &NameOut) {
+  // FIXME: Find the mangling GCC uses.
+  std::stringstream s;
+  s << (D->isInstance() ? "-" : "+");
+  s << "[";
+  s << D->getClassInterface()->getName();
+  s << " ";
+  s << D->getSelector().getName();
+  s << "]";
+  NameOut = s.str();
+}
+
 void CGObjCMac::FinishModule() {
   EmitModuleInfo();
 

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Aug 15 22:19:19 2008
@@ -298,6 +298,8 @@
   
   const llvm::Type *ConvertType(QualType T);
 
+  /// LoadObjCSelf - Load the value of self. This function is only
+  /// valid while generating code for an Objective-C method.
   llvm::Value *LoadObjCSelf();
 
   /// isObjCPointerType - Return true if the specificed AST type will map onto
@@ -368,7 +370,9 @@
   void EmitBlockVarDecl(const VarDecl &D);
   void EmitLocalBlockVarDecl(const VarDecl &D);
   void EmitStaticBlockVarDecl(const VarDecl &D);
-  void EmitParmDecl(const ParmVarDecl &D, llvm::Value *Arg);
+
+  /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
+  void EmitParmDecl(const VarDecl &D, llvm::Value *Arg);
   
   //===--------------------------------------------------------------------===//
   //                             Statement Emission

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Aug 15 22:19:19 2008
@@ -166,11 +166,6 @@
   gv->setSection("llvm.metadata");
 }
 
-bool hasAggregateLLVMType(QualType T) {
-  return !T->isRealType() && !T->isPointerLikeType() &&
-         !T->isVoidType() && !T->isVectorType() && !T->isFunctionType();
-}
-
 void CodeGenModule::SetGlobalValueAttributes(const FunctionDecl *FD,
                                              llvm::GlobalValue *GV) {
   // TODO: Set up linkage and many other things.  Note, this is a simple 
@@ -208,7 +203,7 @@
   if (FuncAttrs)
     ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
   // Note that there is parallel code in CodeGenFunction::EmitCallExpr
-  bool AggregateReturn = hasAggregateLLVMType(FD->getResultType());
+  bool AggregateReturn = CodeGenFunction::hasAggregateLLVMType(FD->getResultType());
   if (AggregateReturn)
     ParamAttrList.push_back(
         llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet));





More information about the cfe-commits mailing list