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

View File

@ -12,8 +12,8 @@ A f(const B &b) {
return 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); X d(a, 5, 6);
} }
// CHECK-LP64: call __ZN1XC1ERK1Xiii // CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP64: call __ZN1XC1ERK1Xiii // CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP64: call __ZN1XC1ERK1Xiii // CHECK-LP64: call __ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii // CHECK-LP32: call L__ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii // CHECK-LP32: call L__ZN1XC1ERKS_iii
// CHECK-LP32: call L__ZN1XC1ERK1Xiii // CHECK-LP32: call L__ZN1XC1ERKS_iii

View File

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

View File

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

View File

@ -24,3 +24,10 @@ namespace A {
// CHECK: define void @_Z1fN1A1AENS_1BE( // CHECK: define void @_Z1fN1A1AENS_1BE(
void f(A::A a, A::B b) { } 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() { void test3() {
T t1, t2; T t1, t2;
// RUN: grep "call void @_ZN1TpsERK1T" %t // RUN: grep "call void @_ZN1TpsERKS_" %t
T result = t1 + t2; T result = t1 + t2;
} }