[cfe-commits] r71023 - in /cfe/trunk/lib/CodeGen: CGObjC.cpp CGObjCGNU.cpp CGObjCMac.cpp CGObjCRuntime.h
Fariborz Jahanian
fjahanian at apple.com
Tue May 5 14:37:36 PDT 2009
Author: fjahanian
Date: Tue May 5 16:36:57 2009
New Revision: 71023
URL: http://llvm.org/viewvc/llvm-project?rev=71023&view=rev
Log:
Patch to support Gnu runtime's typed selectors.
Patch by David Chisnall.
Modified:
cfe/trunk/lib/CodeGen/CGObjC.cpp
cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
cfe/trunk/lib/CodeGen/CGObjCMac.cpp
cfe/trunk/lib/CodeGen/CGObjCRuntime.h
Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=71023&r1=71022&r2=71023&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Tue May 5 16:36:57 2009
@@ -95,7 +95,8 @@
Args);
}
return Runtime.GenerateMessageSend(*this, E->getType(), E->getSelector(),
- Receiver, isClassMessage, Args);
+ Receiver, isClassMessage, Args,
+ E->getMethodDecl());
}
/// StartObjCMethod - Begin emission of an ObjCMethod. This generates
Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=71023&r1=71022&r2=71023&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Tue May 5 16:36:57 2009
@@ -106,7 +106,8 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs);
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method);
virtual CodeGen::RValue
GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
QualType ResultType,
@@ -119,6 +120,8 @@
virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID);
virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel);
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
+ *Method);
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
const ObjCContainerDecl *CD);
@@ -160,7 +163,7 @@
static std::string SymbolNameForClass(const std::string &ClassName) {
- return ".objc_class_" + ClassName;
+ return "___objc_class_name_" + ClassName;
}
static std::string SymbolNameForMethod(const std::string &ClassName, const
@@ -218,9 +221,7 @@
return Builder.CreateCall(ClassLookupFn, ClassName);
}
-/// GetSelector - Return the pointer to the unique'd string for this selector.
llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel) {
- // FIXME: uniquing on the string is wasteful, unique on Sel instead!
llvm::GlobalAlias *&US = UntypedSelectors[Sel.getAsString()];
if (US == 0)
US = new llvm::GlobalAlias(llvm::PointerType::getUnqual(SelectorTy),
@@ -229,7 +230,32 @@
NULL, &TheModule);
return Builder.CreateLoad(US);
-
+}
+
+llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
+ *Method) {
+
+ std::string SelName = Method->getSelector().getAsString();
+ std::string SelTypes;
+ CGM.getContext().getObjCEncodingForMethodDecl(Method, SelTypes);
+ // Typed selectors
+ TypedSelector Selector = TypedSelector(SelName,
+ SelTypes);
+
+ // If it's already cached, return it.
+ if (TypedSelectors[Selector])
+ {
+ return Builder.CreateLoad(TypedSelectors[Selector]);
+ }
+
+ // If it isn't, cache it.
+ llvm::GlobalAlias *Sel = new llvm::GlobalAlias(
+ llvm::PointerType::getUnqual(SelectorTy),
+ llvm::GlobalValue::InternalLinkage, SelName,
+ NULL, &TheModule);
+ TypedSelectors[Selector] = Sel;
+
+ return Builder.CreateLoad(Sel);
}
llvm::Constant *CGObjCGNU::MakeConstantString(const std::string &Str,
@@ -360,8 +386,13 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs) {
- llvm::Value *cmd = GetSelector(CGF.Builder, Sel);
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method) {
+ llvm::Value *cmd;
+ if (Method)
+ cmd = GetSelector(CGF.Builder, Method);
+ else
+ cmd = GetSelector(CGF.Builder, Sel);
CallArgList ActualArgs;
ActualArgs.push_back(
Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=71023&r1=71022&r2=71023&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue May 5 16:36:57 2009
@@ -1016,7 +1016,8 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs);
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method);
virtual CodeGen::RValue
GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
@@ -1032,7 +1033,12 @@
const ObjCInterfaceDecl *ID);
virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel);
-
+
+ /// The NeXT/Apple runtimes do not support typed selectors; just emit an
+ /// untyped one.
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
+ const ObjCMethodDecl *Method);
+
virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
@@ -1200,7 +1206,8 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs);
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method);
virtual CodeGen::RValue
GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
@@ -1217,6 +1224,12 @@
virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel)
{ return EmitSelector(Builder, Sel); }
+
+ /// The NeXT/Apple runtimes do not support typed selectors; just emit an
+ /// untyped one.
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
+ const ObjCMethodDecl *Method)
+ { return EmitSelector(Builder, Method->getSelector()); }
virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
@@ -1303,6 +1316,10 @@
llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, Selector Sel) {
return EmitSelector(Builder, Sel);
}
+llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
+ *Method) {
+ return EmitSelector(Builder, Method->getSelector());
+}
/// Generate a constant CFString object.
/*
@@ -1382,7 +1399,8 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs) {
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method) {
return EmitMessageSend(CGF, ResultType, Sel,
Receiver, CGF.getContext().getObjCIdType(),
false, CallArgs);
@@ -4983,7 +5001,8 @@
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs) {
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method) {
return EmitMessageSend(CGF, ResultType, Sel,
Receiver, CGF.getContext().getObjCIdType(),
false, CallArgs);
Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=71023&r1=71022&r2=71023&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
+++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Tue May 5 16:36:57 2009
@@ -17,6 +17,7 @@
#define CLANG_CODEGEN_OBCJRUNTIME_H
#include "clang/Basic/IdentifierTable.h" // Selector
#include "llvm/ADT/SmallVector.h"
+#include "clang/AST/DeclObjC.h"
#include <string>
#include "CGBuilder.h"
@@ -100,6 +101,10 @@
virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
Selector Sel) = 0;
+ /// Get a typed selector.
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
+ const ObjCMethodDecl *Method) = 0;
+
/// Generate a constant string object.
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *) = 0;
@@ -110,14 +115,15 @@
/// Generate a class stucture for this class.
virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0;
- /// Generate an Objective-C message send operation.
+ /// Generate an Objective-C message send operation.
virtual CodeGen::RValue
GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
QualType ResultType,
Selector Sel,
llvm::Value *Receiver,
bool IsClassMessage,
- const CallArgList &CallArgs) = 0;
+ const CallArgList &CallArgs,
+ const ObjCMethodDecl *Method=0) = 0;
/// Generate an Objective-C message send operation to the super
/// class initiated in a method for Class and with the given Self
More information about the cfe-commits
mailing list