From d99edc44300b36732a14c294c93899ba28d479ea Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 26 Sep 2009 03:55:37 +0000 Subject: [PATCH] Mangle record types as decls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82843 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/Mangle.cpp | 18 +++++++++++++- .../PR5050-constructor-conversion.cpp | 4 ++-- test/CodeGenCXX/constructor-default-arg.cpp | 12 +++++----- test/CodeGenCXX/copy-assign-synthesis-1.cpp | 24 +++++++++---------- .../CodeGenCXX/copy-constructor-synthesis.cpp | 12 +++++----- test/CodeGenCXX/mangle-subst.cpp | 7 ++++++ test/CodeGenCXX/member-functions.cpp | 2 +- 7 files changed, 51 insertions(+), 28 deletions(-) diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index f03f029198..629b46bf94 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -456,7 +456,7 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { void CXXNameMangler::mangleNestedName(const NamedDecl *ND) { // ::= N [] E // ::= N [] E - // FIXME: no class template support + Out << 'N'; if (const CXXMethodDecl *Method = dyn_cast(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()) + return mangleSubstitution(RT->getDecl()); + } + uintptr_t TypePtr = reinterpret_cast(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()) { + addSubstitution(RT->getDecl()); + return; + } + } + uintptr_t TypePtr = reinterpret_cast(T.getAsOpaquePtr()); addSubstitution(TypePtr); } @@ -1144,6 +1156,10 @@ namespace clang { assert(!isa(D) && "Use mangleCXXDtor for destructor decls!"); + PrettyStackTraceDecl CrashInfo(const_cast(D), SourceLocation(), + Context.getSourceManager(), + "Mangling declaration"); + CXXNameMangler Mangler(Context, os); if (!Mangler.mangle(D)) return false; diff --git a/test/CodeGenCXX/PR5050-constructor-conversion.cpp b/test/CodeGenCXX/PR5050-constructor-conversion.cpp index 7c7068742d..e5f722c513 100644 --- a/test/CodeGenCXX/PR5050-constructor-conversion.cpp +++ b/test/CodeGenCXX/PR5050-constructor-conversion.cpp @@ -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 diff --git a/test/CodeGenCXX/constructor-default-arg.cpp b/test/CodeGenCXX/constructor-default-arg.cpp index 6691912b6f..7e6a7cd8f7 100644 --- a/test/CodeGenCXX/constructor-default-arg.cpp +++ b/test/CodeGenCXX/constructor-default-arg.cpp @@ -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 diff --git a/test/CodeGenCXX/copy-assign-synthesis-1.cpp b/test/CodeGenCXX/copy-assign-synthesis-1.cpp index 3c24b12752..d4a93afefb 100644 --- a/test/CodeGenCXX/copy-assign-synthesis-1.cpp +++ b/test/CodeGenCXX/copy-assign-synthesis-1.cpp @@ -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_: diff --git a/test/CodeGenCXX/copy-constructor-synthesis.cpp b/test/CodeGenCXX/copy-constructor-synthesis.cpp index 37550c4219..47971afe61 100644 --- a/test/CodeGenCXX/copy-constructor-synthesis.cpp +++ b/test/CodeGenCXX/copy-constructor-synthesis.cpp @@ -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_: diff --git a/test/CodeGenCXX/mangle-subst.cpp b/test/CodeGenCXX/mangle-subst.cpp index fb0e990902..2ff375e711 100644 --- a/test/CodeGenCXX/mangle-subst.cpp +++ b/test/CodeGenCXX/mangle-subst.cpp @@ -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&) { } diff --git a/test/CodeGenCXX/member-functions.cpp b/test/CodeGenCXX/member-functions.cpp index 8ada907117..29629d5bf8 100644 --- a/test/CodeGenCXX/member-functions.cpp +++ b/test/CodeGenCXX/member-functions.cpp @@ -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; } -- 2.40.0