From aa9e3c879305823745e3de2ff83ad562f5f45c99 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 26 Sep 2009 20:53:44 +0000 Subject: [PATCH] Substitute "::std::" as "St". llvm-svn: 82874 --- clang/lib/CodeGen/Mangle.cpp | 23 +++++++++++++++++++++- clang/test/CodeGenCXX/mangle-subst-std.cpp | 9 +++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenCXX/mangle-subst-std.cpp diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index e07c38fd11b7..c07d9039c014 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -59,6 +59,8 @@ namespace { bool mangleSubstitution(QualType T); bool mangleSubstitution(uintptr_t Ptr); + bool mangleStandardSubstitution(const NamedDecl *ND); + void addSubstitution(const NamedDecl *ND) { addSubstitution(reinterpret_cast(ND)); } @@ -1070,8 +1072,11 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { // ::= S _ // ::= S_ - bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { + // Try one of the standard substitutions first. + if (mangleStandardSubstitution(ND)) + return true; + return mangleSubstitution(reinterpret_cast(ND)); } @@ -1120,6 +1125,22 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { return true; } +bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { + // ::= St # ::std:: + + const NamespaceDecl *NS = dyn_cast(ND); + if (!NS) + return false; + if (!NS->getParent()->isTranslationUnit()) + return false; + + if (!NS->getOriginalNamespace()->getIdentifier()->isStr("std")) + return false; + + Out << "St"; + return true; +} + void CXXNameMangler::addSubstitution(QualType T) { if (!T.getCVRQualifiers()) { if (const RecordType *RT = T->getAs()) { diff --git a/clang/test/CodeGenCXX/mangle-subst-std.cpp b/clang/test/CodeGenCXX/mangle-subst-std.cpp new file mode 100644 index 000000000000..a5ba3ab7d08d --- /dev/null +++ b/clang/test/CodeGenCXX/mangle-subst-std.cpp @@ -0,0 +1,9 @@ +// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s + +namespace std { + struct A { A(); }; + + // CHECK: define void @_ZNSt1AC1Ev + // CHECK: define void @_ZNSt1AC2Ev + A::A() { } +};