From: Daniel Dunbar Date: Wed, 3 Feb 2010 20:11:42 +0000 (+0000) Subject: Revert "Numerous changes to selector handling:", this breaks a whole bunch of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6d5a1c28593443f3973ef38f8fa042d59182412d;p=clang 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/include/clang/AST/ExprObjC.h b/include/clang/AST/ExprObjC.h index 3a625273ad..0b0cd64ad7 100644 --- a/include/clang/AST/ExprObjC.h +++ b/include/clang/AST/ExprObjC.h @@ -96,22 +96,18 @@ public: /// ObjCSelectorExpr used for @selector in Objective-C. class ObjCSelectorExpr : public Expr { Selector SelName; - ObjCMethodDecl *Method; SourceLocation AtLoc, RParenLoc; public: ObjCSelectorExpr(QualType T, Selector selInfo, SourceLocation at, SourceLocation rp) - : Expr(ObjCSelectorExprClass, T, false, false), SelName(selInfo), Method(0), - AtLoc(at), RParenLoc(rp){} + : Expr(ObjCSelectorExprClass, T, false, false), SelName(selInfo), AtLoc(at), + RParenLoc(rp){} explicit ObjCSelectorExpr(EmptyShell Empty) : Expr(ObjCSelectorExprClass, Empty) {} Selector getSelector() const { return SelName; } void setSelector(Selector S) { SelName = S; } - ObjCMethodDecl *getMethodDecl() const { return Method; } - void setMethodDecl(ObjCMethodDecl *M) { Method = M; } - SourceLocation getAtLoc() const { return AtLoc; } SourceLocation getRParenLoc() const { return RParenLoc; } void setAtLoc(SourceLocation L) { AtLoc = L; } diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 4811a6954a..50ddc9156a 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1454,7 +1454,6 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const { case StringLiteralClass: case ObjCStringLiteralClass: case ObjCEncodeExprClass: - case ObjCSelectorExprClass: return true; case CompoundLiteralExprClass: { // This handles gcc's extension that allows global initializers like diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index ca775bf050..81209da6c6 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -701,14 +701,6 @@ public: 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 e4421670ff..896d2207ea 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -38,11 +38,7 @@ llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) { // 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 e068b68b3f..ace38960b0 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -156,17 +156,9 @@ public: 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((GetConstantSelector(Sel))); - } - llvm::Value *GetSelector(CGBuilderTy &Builder, - const ObjCMethodDecl *Method) { - return cast(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 @@ llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder, 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 @@ llvm::Constant *CGObjCGNU::GetConstantTypedSelector(const ObjCMethodDecl // 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 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { // Now that all of the static selectors exist, create pointers to them. int index = 0; - llvm::SmallVector, 16> selectors; for (std::map::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((*iter).second, SelPtr)); + (*iter).second->setAliasee(SelPtr); } for (llvm::StringMap::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((*iter).second, SelPtr)); - } - for (llvm::SmallVectorImpl >::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 361afbc58e..0dcbe829e2 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -953,14 +953,6 @@ public: 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 2c27c14031..ff5d40bfbc 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/lib/CodeGen/CGObjCRuntime.h @@ -95,12 +95,6 @@ public: /// 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(). diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 8ce782b961..85956c3e7e 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -140,20 +140,7 @@ Sema::ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, Diag(SelLoc, diag::warn_undeclared_selector) << Sel; QualType Ty = Context.getObjCSelType(); - ObjCSelectorExpr *E = - new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc); - // Make sure that we have seen this selector. There are lots of checks we - // should be doing on this selector. For example, when this is passed as the - // second argument to objc_msgSend() on the Mac runtime, or as the selector - // argument to the -performSelector:. We can do these checks at run time - // with the GNU runtimes, but the Apple runtimes let you sneak stack - // corruption in easily by passing the wrong selector to these functions if - // there is no static checking. - // - // Only log a warning on the GNU runtime. - E->setMethodDecl(LookupInstanceMethodInGlobalPool(Sel, - SourceRange(LParenLoc, LParenLoc), !LangOpts.NeXTRuntime)); - return E; + return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc); } Sema::ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId,