diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGObjCGNU.cpp | 50 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGObjCRuntime.h | 16 | 
3 files changed, 43 insertions, 25 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 53e48c0dbf3..1beaf103db3 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -99,7 +99,7 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) {        OMD->getClassInterface()->getSuperClass()->getName();      return Runtime->GenerateMessageSendSuper(Builder, ConvertType(E->getType()),                                               Receiver, SuperClass, -                                             Receiver, SelPtr, +                                             Receiver, E->getSelector(),                                               &Args[0], Args.size());    }    return Runtime->GenerateMessageSend(Builder, ConvertType(E->getType()), diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 2b8f7edc051..9cbb0ed49c9 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -109,18 +109,20 @@ public:                                             llvm::Value** ArgV,                                             unsigned ArgC);    virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder &Builder, -                                            const llvm::Type *ReturnTy, -                                            llvm::Value *Sender, -                                            const char *SuperClassName, -                                            llvm::Value *Receiver, -                                            llvm::Value *Selector, -                                            llvm::Value** ArgV, -                                            unsigned ArgC); +                                                const llvm::Type *ReturnTy, +                                                llvm::Value *Sender, +                                                const char *SuperClassName, +                                                llvm::Value *Receiver, +                                                Selector Sel, +                                                llvm::Value** ArgV, +                                                unsigned ArgC);    virtual llvm::Value *LookupClass(llvm::IRBuilder &Builder, llvm::Value        *ClassName);    virtual llvm::Value *GetSelector(llvm::IRBuilder &Builder, -      llvm::Value *SelName, -      llvm::Value *SelTypes); +                                   llvm::Value *SelName, +                                   llvm::Value *SelTypes); +  llvm::Value *GetSelector(llvm::IRBuilder &Builder, Selector Sel); +      virtual llvm::Function *MethodPreamble(                                           const std::string &ClassName,                                           const std::string &CategoryName, @@ -219,6 +221,20 @@ llvm::Value *CGObjCGNU::LookupClass(llvm::IRBuilder &Builder,    return Builder.CreateCall(ClassLookupFn, ClassName);  } +/// GetSelector - Return the pointer to the unique'd string for this selector. +llvm::Value *CGObjCGNU::GetSelector(llvm::IRBuilder &Builder, Selector Sel) { +  // FIXME: uniquing on the string is wasteful, unique on Sel instead! +  llvm::GlobalAlias *&US = UntypedSelectors[Sel.getName()]; +  if (US == 0) +    US = new llvm::GlobalAlias(llvm::PointerType::getUnqual(SelectorTy), +                               llvm::GlobalValue::InternalLinkage, +                               ".objc_untyped_selector_alias", +                               NULL, &TheModule); +   +  return Builder.CreateLoad(US); +   +} +  /// Looks up the selector for the specified name / type pair.  // FIXME: Selectors should be statically cached, not looked up on every call.  llvm::Value *CGObjCGNU::GetSelector(llvm::IRBuilder &Builder, @@ -319,17 +335,17 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const char *String, const  ///send to self with special delivery semantics indicating which class's method  ///should be called.  llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder &Builder, -                                            const llvm::Type *ReturnTy, -                                            llvm::Value *Sender, -                                            const char *SuperClassName, -                                            llvm::Value *Receiver, -                                            llvm::Value *Selector, -                                            llvm::Value** ArgV, -                                            unsigned ArgC) { +                                                 const llvm::Type *ReturnTy, +                                                 llvm::Value *Sender, +                                                 const char *SuperClassName, +                                                 llvm::Value *Receiver, +                                                 Selector Sel, +                                                 llvm::Value** ArgV, +                                                 unsigned ArgC) {    // TODO: This should be cached, not looked up every time.    llvm::Value *ReceiverClass = LookupClass(Builder,        MakeConstantString(SuperClassName)); -  llvm::Value *cmd = GetSelector(Builder, Selector, 0); +  llvm::Value *cmd = GetSelector(Builder, Sel);    std::vector<const llvm::Type*> impArgTypes;    impArgTypes.push_back(Receiver->getType());    impArgTypes.push_back(SelectorTy); diff --git a/clang/lib/CodeGen/CGObjCRuntime.h b/clang/lib/CodeGen/CGObjCRuntime.h index cc33982e475..a000dd9e24a 100644 --- a/clang/lib/CodeGen/CGObjCRuntime.h +++ b/clang/lib/CodeGen/CGObjCRuntime.h @@ -28,6 +28,8 @@ namespace llvm {  }  namespace clang { +  class Selector; +    namespace CodeGen {    class CodeGenModule; @@ -82,13 +84,13 @@ public:    virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder &Builder, const char        *ProtocolName) =0;    virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder &Builder, -                                            const llvm::Type *ReturnTy, -                                            llvm::Value *Sender, -                                            const char *SuperClassName, -                                            llvm::Value *Receiver, -                                            llvm::Value *Selector, -                                            llvm::Value** ArgV, -                                            unsigned ArgC) {return NULL;}; +                                                const llvm::Type *ReturnTy, +                                                llvm::Value *Sender, +                                                const char *SuperClassName, +                                                llvm::Value *Receiver, +                                                Selector Sel, +                                                llvm::Value** ArgV, +                                                unsigned ArgC) = 0;    /// Generate the named protocol.  Protocols contain method metadata but no     /// implementations.     virtual void GenerateProtocol(const char *ProtocolName,  | 

