diff options
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 15 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-extreme.cpp | 6 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-subst.cpp | 16 |
3 files changed, 25 insertions, 12 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 9b5fd74ad5..8241ad61d0 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -55,9 +55,7 @@ namespace { void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type); private: - bool mangleSubstitution(const NamedDecl *ND) { - return mangleSubstitution(reinterpret_cast<uintptr_t>(ND)); - } + bool mangleSubstitution(const NamedDecl *ND); bool mangleSubstitution(QualType T); bool mangleSubstitution(uintptr_t Ptr); @@ -432,6 +430,10 @@ void CXXNameMangler::manglePrefix(const DeclContext *DC) { // ::= # empty // ::= <substitution> // FIXME: We only handle mangling of namespaces and classes at the moment. + + if (mangleSubstitution(cast<NamedDecl>(DC))) + return; + if (!DC->getParent()->isTranslationUnit()) manglePrefix(DC->getParent()); @@ -444,6 +446,8 @@ void CXXNameMangler::manglePrefix(const DeclContext *DC) { } else mangleSourceName(Record->getIdentifier()); } + + addSubstitution(cast<NamedDecl>(DC)); } void @@ -922,6 +926,11 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { // <substitution> ::= S <seq-id> _ // ::= S_ + +bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { + return mangleSubstitution(reinterpret_cast<uintptr_t>(ND)); +} + bool CXXNameMangler::mangleSubstitution(QualType T) { uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); diff --git a/test/CodeGenCXX/mangle-extreme.cpp b/test/CodeGenCXX/mangle-extreme.cpp index eb4be7acc5..77558d29d8 100644 --- a/test/CodeGenCXX/mangle-extreme.cpp +++ b/test/CodeGenCXX/mangle-extreme.cpp @@ -1,8 +1,8 @@ -// RUN: clang-cc -emit-llvm %s -o %t -triple=x86_64-apple-darwin10 && +// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s struct X { }; -// RUN: grep "define void @_Z1fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP1XS13_S12_S11_S10_SZ_SY_SX_SW_SV_SU_ST_SS_SR_SQ_SP_SO_SN_SM_SL_SK_SJ_SI_SH_SG_SF_SE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S3_S2_S1_S0_S_(" %t && +// CHECK: define void @_Z1fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP1XS13_S12_S11_S10_SZ_SY_SX_SW_SV_SU_ST_SS_SR_SQ_SP_SO_SN_SM_SL_SK_SJ_SI_SH_SG_SF_SE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S3_S2_S1_S0_S_( void f(X****************************************, X****************************************, X***************************************, @@ -45,5 +45,3 @@ void f(X****************************************, X**, X*, X) { } - -// RUN: true diff --git a/test/CodeGenCXX/mangle-subst.cpp b/test/CodeGenCXX/mangle-subst.cpp index fbe4479248..fb0e990902 100644 --- a/test/CodeGenCXX/mangle-subst.cpp +++ b/test/CodeGenCXX/mangle-subst.cpp @@ -2,19 +2,25 @@ struct X {}; -// CHECK: define void @_Z1f1XS_ +// CHECK: define void @_Z1f1XS_( void f(X, X) { } -// CHECK: define void @_Z1fR1XS0_ +// CHECK: define void @_Z1fR1XS0_( void f(X&, X&) { } -// CHECK: define void @_Z1fRK1XS1_ +// CHECK: define void @_Z1fRK1XS1_( void f(const X&, const X&) { } typedef void T(); struct S {}; -// CHECK: define void @_Z1fPFvvEM1SFvvE +// CHECK: define void @_Z1fPFvvEM1SFvvE( void f(T*, T (S::*)) {} -// RUN: true +namespace A { + struct A { }; + struct B { }; +}; + +// CHECK: define void @_Z1fN1A1AENS_1BE( +void f(A::A a, A::B b) { } |