Revert "Numerous changes to selector handling:", this breaks a whole bunch of
working code, for no apparent reason.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95244 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index ca775bf..81209da 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -701,14 +701,6 @@
CGM.GetStringForStringLiteral(E), false);
}
- llvm::Constant *VisitObjCSelectorExpr(const ObjCSelectorExpr *E) {
- ObjCMethodDecl *OMD = E->getMethodDecl();
- if (OMD)
- return CGM.getObjCRuntime().GetConstantTypedSelector(OMD);
- else
- return CGM.getObjCRuntime().GetConstantSelector(E->getSelector());
- }
-
llvm::Constant *VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
// This must be an @encode initializing an array in a static initializer.
// Don't emit it as the address of the string, emit the string data itself
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index e442167..896d220 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -38,11 +38,7 @@
// Note that this implementation allows for non-constant strings to be passed
// as arguments to @selector(). Currently, the only thing preventing this
// behaviour is the type checking in the front end.
- ObjCMethodDecl *OMD = E->getMethodDecl();
- if (OMD)
- return CGM.getObjCRuntime().GetSelector(Builder, OMD);
- else
- return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector());
+ return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector());
}
llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) {
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index e068b68..ace3896 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -156,17 +156,9 @@
const ObjCMethodDecl *Method);
virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID);
- virtual llvm::Constant *GetConstantSelector(Selector Sel);
- virtual llvm::Constant *GetConstantTypedSelector(
- const ObjCMethodDecl *Method);
- llvm::Value *GetSelector(CGBuilderTy &Builder,
- Selector Sel) {
- return cast<llvm::Constant>((GetConstantSelector(Sel)));
- }
- llvm::Value *GetSelector(CGBuilderTy &Builder,
- const ObjCMethodDecl *Method) {
- return cast<llvm::Constant>(GetConstantTypedSelector(Method));
- }
+ 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);
@@ -347,18 +339,18 @@
return Builder.CreateCall(ClassLookupFn, ClassName);
}
-llvm::Constant *CGObjCGNU::GetConstantSelector(Selector Sel) {
+llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel) {
llvm::GlobalAlias *&US = UntypedSelectors[Sel.getAsString()];
if (US == 0)
- US = new llvm::GlobalAlias(SelectorTy,
+ US = new llvm::GlobalAlias(llvm::PointerType::getUnqual(SelectorTy),
llvm::GlobalValue::PrivateLinkage,
".objc_untyped_selector_alias"+Sel.getAsString(),
NULL, &TheModule);
- return US;
+ return Builder.CreateLoad(US);
}
-llvm::Constant *CGObjCGNU::GetConstantTypedSelector(const ObjCMethodDecl
+llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
*Method) {
std::string SelName = Method->getSelector().getAsString();
@@ -370,17 +362,17 @@
// If it's already cached, return it.
if (TypedSelectors[Selector]) {
- return TypedSelectors[Selector];
+ return Builder.CreateLoad(TypedSelectors[Selector]);
}
// If it isn't, cache it.
llvm::GlobalAlias *Sel = new llvm::GlobalAlias(
- SelectorTy,
+ llvm::PointerType::getUnqual(SelectorTy),
llvm::GlobalValue::PrivateLinkage, ".objc_selector_alias" + SelName,
NULL, &TheModule);
TypedSelectors[Selector] = Sel;
- return Sel;
+ return Builder.CreateLoad(Sel);
}
llvm::Constant *CGObjCGNU::MakeConstantString(const std::string &Str,
@@ -1537,43 +1529,40 @@
// Now that all of the static selectors exist, create pointers to them.
int index = 0;
- llvm::SmallVector<std::pair<llvm::GlobalAlias*,llvm::Value*>, 16> selectors;
for (std::map<TypedSelector, llvm::GlobalAlias*>::iterator
iter=TypedSelectors.begin(), iterEnd =TypedSelectors.end();
iter != iterEnd; ++iter) {
llvm::Constant *Idxs[] = {Zeros[0],
llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), index++), Zeros[0]};
- llvm::Constant *SelPtr =
- llvm::ConstantExpr::getGetElementPtr(SelectorList, Idxs, 2);
+ llvm::Constant *SelPtr = new llvm::GlobalVariable(TheModule, SelStructPtrTy,
+ true, llvm::GlobalValue::InternalLinkage,
+ llvm::ConstantExpr::getGetElementPtr(SelectorList, Idxs, 2),
+ ".objc_sel_ptr");
// If selectors are defined as an opaque type, cast the pointer to this
// type.
if (isSelOpaque) {
- SelPtr = llvm::ConstantExpr::getBitCast(SelPtr,SelectorTy);
+ SelPtr = llvm::ConstantExpr::getBitCast(SelPtr,
+ llvm::PointerType::getUnqual(SelectorTy));
}
- selectors.push_back(
- std::pair<llvm::GlobalAlias*,llvm::Value*>((*iter).second, SelPtr));
+ (*iter).second->setAliasee(SelPtr);
}
for (llvm::StringMap<llvm::GlobalAlias*>::iterator
iter=UntypedSelectors.begin(), iterEnd = UntypedSelectors.end();
iter != iterEnd; iter++) {
llvm::Constant *Idxs[] = {Zeros[0],
llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), index++), Zeros[0]};
- llvm::Constant *SelPtr =
- llvm::ConstantExpr::getGetElementPtr(SelectorList, Idxs, 2);
+ llvm::Constant *SelPtr = new llvm::GlobalVariable
+ (TheModule, SelStructPtrTy,
+ true, llvm::GlobalValue::InternalLinkage,
+ llvm::ConstantExpr::getGetElementPtr(SelectorList, Idxs, 2),
+ ".objc_sel_ptr");
// If selectors are defined as an opaque type, cast the pointer to this
// type.
if (isSelOpaque) {
- SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, SelectorTy);
+ SelPtr = llvm::ConstantExpr::getBitCast(SelPtr,
+ llvm::PointerType::getUnqual(SelectorTy));
}
- selectors.push_back(
- std::pair<llvm::GlobalAlias*,llvm::Value*>((*iter).second, SelPtr));
- }
- for (llvm::SmallVectorImpl<std::pair<
- llvm::GlobalAlias*,llvm::Value*> >::iterator
- iter=selectors.begin(), iterEnd =selectors.end();
- iter != iterEnd; ++iter) {
- iter->first->replaceAllUsesWith(iter->second);
- iter->first->eraseFromParent();
+ (*iter).second->setAliasee(SelPtr);
}
// Number of classes defined.
Elements.push_back(llvm::ConstantInt::get(llvm::Type::getInt16Ty(VMContext),
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 361afbc..0dcbe82 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -953,14 +953,6 @@
CGObjCCommonMac(CodeGen::CodeGenModule &cgm) :
CGM(cgm), VMContext(cgm.getLLVMContext()) { }
- virtual llvm::Constant *GetConstantSelector(Selector Sel) {
- assert(0 && "Constant Selectors are not yet supported on the Mac runtimes");
- return 0;
- }
- virtual llvm::Constant *GetConstantTypedSelector(
- const ObjCMethodDecl *Method) {
- return GetConstantSelector(Method->getSelector());
- }
virtual llvm::Constant *GenerateConstantString(const StringLiteral *SL);
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h
index 2c27c14..ff5d40b 100644
--- a/lib/CodeGen/CGObjCRuntime.h
+++ b/lib/CodeGen/CGObjCRuntime.h
@@ -95,12 +95,6 @@
/// this compilation unit with the runtime library.
virtual llvm::Function *ModuleInitFunction() = 0;
- virtual llvm::Constant *GetConstantSelector(Selector Sel) = 0;
-
- /// Get a typed selector.
- virtual llvm::Constant *GetConstantTypedSelector(
- const ObjCMethodDecl *Method) = 0;
-
/// Get a selector for the specified name and type values. The
/// return value should have the LLVM type for pointer-to
/// ASTContext::getObjCSelType().