Objective-C++ ARC: do not mangle __unsafe_unretained lifetime

qualifiers, so that an __unsafe_unretained-qualified type T in ARC code
will have the same mangling as T in non-ARC code, improving ABI
interoperability. This works now because we infer or require a
lifetime qualifier everywhere one can appear in an external
interface. Another part of <rdar://problem/9595486>.

llvm-svn: 133306
This commit is contained in:
Douglas Gregor 2011-06-17 22:26:49 +00:00
parent c3dfb5fa89
commit b5176a5328
2 changed files with 9 additions and 4 deletions

View File

@ -1472,7 +1472,6 @@ void CXXNameMangler::mangleQualifiers(Qualifiers Quals) {
// <type> ::= U "__strong"
// <type> ::= U "__weak"
// <type> ::= U "__autoreleasing"
// <type> ::= U "__unsafe_unretained"
case Qualifiers::OCL_None:
break;
@ -1489,7 +1488,13 @@ void CXXNameMangler::mangleQualifiers(Qualifiers Quals) {
break;
case Qualifiers::OCL_ExplicitNone:
LifetimeName = "__unsafe_unretained";
// The __unsafe_unretained qualifier is *not* mangled, so that
// __unsafe_unretained types in ARC produce the same manglings as the
// equivalent (but, naturally, unqualified) types in non-ARC, providing
// better ABI compatibility.
//
// It's safe to do this because unqualified 'id' won't show up
// in any type signatures that need to be mangled.
break;
}
if (!LifetimeName.empty())

View File

@ -6,7 +6,7 @@ void f(__strong id *) {}
void f(__weak id *) {}
// CHECK: define void @_Z1fPU15__autoreleasingP11objc_object(i8**)
void f(__autoreleasing id *) {}
// CHECK: define void @_Z1fPU19__unsafe_unretainedP11objc_object(i8**)
// CHECK: define void @_Z1fPP11objc_object(i8**)
void f(__unsafe_unretained id *) {}
// CHECK: define void @_Z1fPKU8__strongP11objc_object(i8**)
void f(const __strong id *) {}
@ -14,7 +14,7 @@ void f(const __strong id *) {}
void f(const __weak id *) {}
// CHECK: define void @_Z1fPKU15__autoreleasingP11objc_object(i8**)
void f(const __autoreleasing id *) {}
// CHECK: define void @_Z1fPKU19__unsafe_unretainedP11objc_object(i8**)
// CHECK: define void @_Z1fPKP11objc_object(i8**)
void f(const __unsafe_unretained id *) {}