From: Steve Naroff Date: Wed, 22 Jul 2009 17:14:51 +0000 (+0000) Subject: Fix a couple recent ABI regressions noticed during code review (fallout from the... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9533a7fdb8397421f3be52e879442460a87389f6;p=clang Fix a couple recent ABI regressions noticed during code review (fallout from the ObjC type system rewrite). It's unfortunate that the mangling includes the low-level structs. Nevertheless, we need this for binary compatibility with GCC. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76755 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 174e183d53..705939be72 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2655,8 +2655,19 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, S += '*'; return; } + } else if (const RecordType *RTy = PointeeTy->getAsRecordType()) { + // GCC binary compat: Need to convert "struct objc_class *" to "#". + if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { + S += '#'; + return; + } + // GCC binary compat: Need to convert "struct objc_object *" to "@". + if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { + S += '@'; + return; + } + // fall through... } - S += '^'; getLegacyIntegralTypeEncoding(PointeeTy); diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 5340cd7262..9e389040b8 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -577,8 +577,8 @@ void CXXNameMangler::mangleType(const BuiltinType *T) { case BuiltinType::UndeducedAuto: assert(0 && "Should not see undeduced auto here"); break; - case BuiltinType::ObjCId: Out << "2id"; break; - case BuiltinType::ObjCClass: Out << "5Class"; break; + case BuiltinType::ObjCId: Out << "11objc_object"; break; + case BuiltinType::ObjCClass: Out << "10objc_class"; break; } } diff --git a/test/CodeGenObjC/encode-test.m b/test/CodeGenObjC/encode-test.m index 8d78639e96..ca54a51c3b 100644 --- a/test/CodeGenObjC/encode-test.m +++ b/test/CodeGenObjC/encode-test.m @@ -1,7 +1,7 @@ // RUN: clang-cc -triple=i686-apple-darwin9 -fnext-runtime -emit-llvm -o %t %s && // RUN: grep -e "\^{Innermost=CC}" %t | count 1 && -// RUN: grep -e "{Derived=^{objc_class}ib32b8b3b8sb16b8b8b2b8ccb6}" %t | count 1 && -// RUN: grep -e "{B1=^{objc_class}@c}" %t | count 1 && +// RUN: grep -e "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}" %t | count 1 && +// RUN: grep -e "{B1=#@c}" %t | count 1 && // RUN: grep -e "v12@0:4\[3\[4@]]8" %t | count 1 && // RUN: grep -e "r\^{S=i}" %t | count 1 && // RUN: grep -e "\^{Object=#}" %t | count 1 diff --git a/test/CodeGenObjC/overloadable.m b/test/CodeGenObjC/overloadable.m index fc5c2e4085..7e9cc3d3b3 100644 --- a/test/CodeGenObjC/overloadable.m +++ b/test/CodeGenObjC/overloadable.m @@ -3,7 +3,7 @@ @class C; -// RUN: grep _Z1fP2id %t | count 1 && +// RUN: grep _Z1fP11objc_object %t | count 1 && void __attribute__((overloadable)) f(id c) { } // RUN: grep _Z1fP1C %t | count 1