Mangle record types as decls.

llvm-svn: 82843
This commit is contained in:
Anders Carlsson 2009-09-26 03:55:37 +00:00
parent 7226af69cb
commit 296f8dc52f
7 changed files with 51 additions and 28 deletions

View File

@ -456,7 +456,7 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
void CXXNameMangler::mangleNestedName(const NamedDecl *ND) {
// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
// FIXME: no class template support
Out << 'N';
if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND))
mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers()));
@ -1077,6 +1077,11 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
}
bool CXXNameMangler::mangleSubstitution(QualType T) {
if (!T.getCVRQualifiers()) {
if (const RecordType *RT = T->getAs<RecordType>())
return mangleSubstitution(RT->getDecl());
}
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
return mangleSubstitution(TypePtr);
@ -1117,6 +1122,13 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
}
void CXXNameMangler::addSubstitution(QualType T) {
if (!T.getCVRQualifiers()) {
if (const RecordType *RT = T->getAs<RecordType>()) {
addSubstitution(RT->getDecl());
return;
}
}
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
addSubstitution(TypePtr);
}
@ -1144,6 +1156,10 @@ namespace clang {
assert(!isa<CXXDestructorDecl>(D) &&
"Use mangleCXXDtor for destructor decls!");
PrettyStackTraceDecl CrashInfo(const_cast<NamedDecl *>(D), SourceLocation(),
Context.getSourceManager(),
"Mangling declaration");
CXXNameMangler Mangler(Context, os);
if (!Mangler.mangle(D))
return false;

View File

@ -12,8 +12,8 @@ A f(const B &b) {
return b;
}
// CHECK-LP64: call __ZN1AC1ERK1Ai
// CHECK-LP64: call __ZN1AC1ERKS_i
// CHECK-LP32: call L__ZN1AC1ERK1Ai
// CHECK-LP32: call L__ZN1AC1ERKS_i

View File

@ -31,10 +31,10 @@ int main() {
X d(a, 5, 6);
}
// CHECK-LP64: call __ZN1XC1ERK1Xiii
// CHECK-LP64: call __ZN1XC1ERK1Xiii
// CHECK-LP64: call __ZN1XC1ERK1Xiii
// CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
// CHECK-LP32: call L__ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERKS_iii

View File

@ -93,17 +93,17 @@ int main() {
dstY.pr();
}
// CHECK-LP64: .globl __ZN1XaSERK1X
// CHECK-LP64: .weak_definition __ZN1XaSERK1X
// CHECK-LP64: __ZN1XaSERK1X:
// CHECK-LP64: .globl __ZN1QaSERK1Q
// CHECK-LP64: .weak_definition __ZN1QaSERK1Q
// CHECK-LP64: __ZN1QaSERK1Q:
// CHECK-LP64: .globl __ZN1XaSERKS_
// CHECK-LP64: .weak_definition __ZN1XaSERKS_
// CHECK-LP64: __ZN1XaSERKS_:
// CHECK-LP64: .globl __ZN1QaSERKS_
// CHECK-LP64: .weak_definition __ZN1QaSERKS_
// CHECK-LP64: __ZN1QaSERKS_:
// CHECK-LP32: .globl __ZN1XaSERK1X
// CHECK-LP32: .weak_definition __ZN1XaSERK1X
// CHECK-LP32: __ZN1XaSERK1X:
// CHECK-LP32: .globl __ZN1QaSERK1Q
// CHECK-LP32: .weak_definition __ZN1QaSERK1Q
// CHECK-LP32: __ZN1QaSERK1Q:
// CHECK-LP32: .globl __ZN1XaSERKS_
// CHECK-LP32: .weak_definition __ZN1XaSERKS_
// CHECK-LP32: __ZN1XaSERKS_:
// CHECK-LP32: .globl __ZN1QaSERKS_
// CHECK-LP32: .weak_definition __ZN1QaSERKS_
// CHECK-LP32: __ZN1QaSERKS_:

View File

@ -101,10 +101,10 @@ int main() {
m1.pr();
}
// CHECK-LP64: .globl __ZN1XC1ERK1X
// CHECK-LP64: .weak_definition __ZN1XC1ERK1X
// CHECK-LP64: __ZN1XC1ERK1X:
// CHECK-LP64: .globl __ZN1XC1ERKS_
// CHECK-LP64: .weak_definition __ZN1XC1ERKS_
// CHECK-LP64: __ZN1XC1ERKS_:
// CHECK-LP32: .globl __ZN1XC1ERK1X
// CHECK-LP32: .weak_definition __ZN1XC1ERK1X
// CHECK-LP32: __ZN1XC1ERK1X:
// CHECK-LP32: .globl __ZN1XC1ERKS_
// CHECK-LP32: .weak_definition __ZN1XC1ERKS_
// CHECK-LP32: __ZN1XC1ERKS_:

View File

@ -24,3 +24,10 @@ namespace A {
// CHECK: define void @_Z1fN1A1AENS_1BE(
void f(A::A a, A::B b) { }
struct C {
struct D { };
};
// CHECK: define void @_Z1fN1C1DERS_PS_S1_(
void f(C::D, C&, C*, C&) { }

View File

@ -58,6 +58,6 @@ struct T {
void test3() {
T t1, t2;
// RUN: grep "call void @_ZN1TpsERK1T" %t
// RUN: grep "call void @_ZN1TpsERKS_" %t
T result = t1 + t2;
}