diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-02-03 20:11:42 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-02-03 20:11:42 +0000 |
commit | 6d5a1c28593443f3973ef38f8fa042d59182412d (patch) | |
tree | 46e6fccc3752d6a3b82faa450161cdc54adff20e /lib/CodeGen/CGObjCGNU.cpp | |
parent | 22c92406f4b043bd872b53761f6a157fcc105594 (diff) |
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
Diffstat (limited to 'lib/CodeGen/CGObjCGNU.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 61 |
1 files changed, 25 insertions, 36 deletions
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<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 @@ 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<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), |