From: Anders Carlsson Date: Thu, 17 Sep 2009 04:16:28 +0000 (+0000) Subject: Substitution for prefixes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6862fc720b8e35ee4408822b2390020f263646b2;p=clang Substitution for prefixes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82122 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(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 // ::= // FIXME: We only handle mangling of namespaces and classes at the moment. + + if (mangleSubstitution(cast(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(DC)); } void @@ -922,6 +926,11 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { // ::= S _ // ::= S_ + +bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { + return mangleSubstitution(reinterpret_cast(ND)); +} + bool CXXNameMangler::mangleSubstitution(QualType T) { uintptr_t TypePtr = reinterpret_cast(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) { }