Substitute "::std::" as "St".

llvm-svn: 82874
This commit is contained in:
Anders Carlsson 2009-09-26 20:53:44 +00:00
parent fd5438edee
commit aa9e3c8793
2 changed files with 31 additions and 1 deletions

View File

@ -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<uintptr_t>(ND));
}
@ -1070,8 +1072,11 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) {
// <substitution> ::= S <seq-id> _
// ::= S_
bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
// Try one of the standard substitutions first.
if (mangleStandardSubstitution(ND))
return true;
return mangleSubstitution(reinterpret_cast<uintptr_t>(ND));
}
@ -1120,6 +1125,22 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
return true;
}
bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) {
// <substitution> ::= St # ::std::
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(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<RecordType>()) {

View File

@ -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() { }
};