[cfe-dev] Objective-C Message Send Generation
    Chris Lattner 
    clattner at apple.com
       
    Fri Feb 29 09:22:00 PST 2008
    
    
  
On Feb 29, 2008, at 7:16 AM, David Chisnall wrote:
> I'll keep these in my local copy because they let me compile simple  
> Objective-C programs without hitting aborts, and add the missing  
> bits, but I've removed them from the diff.
Ok!  Thanks again for working on this by the way.
Here are some more picky details :)
--- CGObjCRuntime.h	(revision 0)
+++ CGObjCRuntime.h	(revision 0)
@@ -0,0 +1,46 @@
+#ifndef __CODEGENOBJC_H_INCLUDED__
+#define __CODEGENOBJC_H_INCLUDED__
Please use a name that isn't in the implementation namespace, for  
example CLANG_CODEGEN_OBCJRUNTIME_H like the other headers.
+#include "clang/AST/AST.h"
+#include "clang/AST/Expr.h"
+
+#include "llvm/Constants.h"
+#include "llvm/Function.h"
+#include "llvm/GlobalVariable.h"
+#include "llvm/Intrinsics.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/LLVMBuilder.h"
+#include "llvm/Module.h"
Please don't #include headers redundantly (Module.h pulls in  
function.h, for example).  Also, please use forward definitions of  
classes to avoid #including as much as possible.  In this case, you  
should be able to fwd declare all the llvm classes you use.
+using llvm::Value;
Headers shouldn't have "using", this pollutes the namespace of the  
file that includes it.
+  //TODO: Make this selectable at runtime
+  Runtime = ObjCDefaultRuntime(M);
+}
This object needs to be deleted in ~CodeGenModule().
+  Function *SelFunction = TheModule.getFunction("sel_get_uid");
+  // If we haven't got the selector lookup function, look it up now.
+  // TODO: Factor this out and use it to implement @selector() too.
+  if(SelFunction == 0) {
+    std::vector<const llvm::Type*> Str(1,
....
+  }
This code can be simplified through the use of the  
Module::getOrInsertFunction method.  Something like this should work:
PtrToInt8Ty = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
llvm::Constant *SelFunction =  
TheModule.getOrInsertFunction("sel_get_uid", PtrToInt8Ty, NULL);
A similar approach can simplify creation of the objc_msg_lookup  
function.
+  // Call the method
+  for(size_t i=0 ; i<ArgC ; i++) {
+    lookupArgs.push_back(ArgV[i]);
+  }
This loop can be replaced with:
lookupArgs.insert(lookupArgs.end(), ArgV, ArgV+ArgC);
Otherwise, looks great!  Thanks for working on this David!
-Chris
    
    
More information about the cfe-dev
mailing list