[PATCH] D71091: Make sure that the implicit arguments for direct methods have been setup
Pierre Habouzit via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 5 15:36:00 PST 2019
MadCoder updated this revision to Diff 232460.
MadCoder added a comment.
Fix the fact that the hashmap of direct method was indexed by Declarations instead of names (and depending on code ordering, the declaration used at codegen time may be the one from the @interface or from the @implementation leading to name collisions and llvm "helpfully" adding `.1`'s everywhere
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D71091/new/
https://reviews.llvm.org/D71091
Files:
clang/lib/CodeGen/CGObjCMac.cpp
clang/lib/Sema/SemaDeclObjC.cpp
clang/test/CodeGenObjC/direct-method.m
Index: clang/test/CodeGenObjC/direct-method.m
===================================================================
--- clang/test/CodeGenObjC/direct-method.m
+++ clang/test/CodeGenObjC/direct-method.m
@@ -11,6 +11,7 @@
__attribute__((objc_root_class))
@interface Root
+- (int)getInt __attribute__((objc_direct));
@end
@implementation Root
@@ -173,3 +174,9 @@
// CHECK-LABEL: define hidden void @"\01-[Foo setGetDynamic_setDirect:]"(
// CHECK-LABEL: define internal void @"\01-[Foo .cxx_destruct]"(
@end
+
+int useRoot(Root *r) {
+ // CHEC-LABEL: define i32 @useRoot
+ // CHECK: %call = call i32 bitcast {{.*}} @"\01-[Root getInt]"
+ return [r getInt];
+}
Index: clang/lib/Sema/SemaDeclObjC.cpp
===================================================================
--- clang/lib/Sema/SemaDeclObjC.cpp
+++ clang/lib/Sema/SemaDeclObjC.cpp
@@ -4836,6 +4836,8 @@
cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
}
+ ObjCMethod->createImplicitParams(Context, ObjCMethod->getClassInterface());
+
if (PrevMethod) {
// You can never have two method definitions with the same name.
Diag(ObjCMethod->getLocation(), diag::err_duplicate_method_decl)
Index: clang/lib/CodeGen/CGObjCMac.cpp
===================================================================
--- clang/lib/CodeGen/CGObjCMac.cpp
+++ clang/lib/CodeGen/CGObjCMac.cpp
@@ -876,7 +876,7 @@
/// DirectMethodDefinitions - map of direct methods which have been defined in
/// this translation unit.
- llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> DirectMethodDefinitions;
+ llvm::DenseMap<llvm::StringRef, llvm::Function*> DirectMethodDefinitions;
/// PropertyNames - uniqued method variable names.
llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
@@ -4027,20 +4027,20 @@
llvm::Function *
CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD,
const ObjCContainerDecl *CD) {
- auto I = DirectMethodDefinitions.find(OMD);
- if (I != DirectMethodDefinitions.end())
- return I->second;
-
SmallString<256> Name;
GetNameForMethod(OMD, CD, Name);
+ auto I = DirectMethodDefinitions.find(Name);
+ if (I != DirectMethodDefinitions.end())
+ return I->second;
+
CodeGenTypes &Types = CGM.getTypes();
llvm::FunctionType *MethodTy =
Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
llvm::Function *Method =
llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
Name.str(), &CGM.getModule());
- DirectMethodDefinitions.insert(std::make_pair(OMD, Method));
+ DirectMethodDefinitions.insert(std::make_pair(Method->getName(), Method));
return Method;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71091.232460.patch
Type: text/x-patch
Size: 2723 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191205/72c5da4f/attachment.bin>
More information about the cfe-commits
mailing list