forked from OSchip/llvm-project
parent
7226af69cb
commit
296f8dc52f
|
@ -456,7 +456,7 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
|
||||||
void CXXNameMangler::mangleNestedName(const NamedDecl *ND) {
|
void CXXNameMangler::mangleNestedName(const NamedDecl *ND) {
|
||||||
// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
|
// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
|
||||||
// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
|
// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
|
||||||
// FIXME: no class template support
|
|
||||||
Out << 'N';
|
Out << 'N';
|
||||||
if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND))
|
if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND))
|
||||||
mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers()));
|
mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers()));
|
||||||
|
@ -1077,6 +1077,11 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CXXNameMangler::mangleSubstitution(QualType T) {
|
bool CXXNameMangler::mangleSubstitution(QualType T) {
|
||||||
|
if (!T.getCVRQualifiers()) {
|
||||||
|
if (const RecordType *RT = T->getAs<RecordType>())
|
||||||
|
return mangleSubstitution(RT->getDecl());
|
||||||
|
}
|
||||||
|
|
||||||
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
|
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
|
||||||
|
|
||||||
return mangleSubstitution(TypePtr);
|
return mangleSubstitution(TypePtr);
|
||||||
|
@ -1117,6 +1122,13 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CXXNameMangler::addSubstitution(QualType T) {
|
void CXXNameMangler::addSubstitution(QualType T) {
|
||||||
|
if (!T.getCVRQualifiers()) {
|
||||||
|
if (const RecordType *RT = T->getAs<RecordType>()) {
|
||||||
|
addSubstitution(RT->getDecl());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
|
uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
|
||||||
addSubstitution(TypePtr);
|
addSubstitution(TypePtr);
|
||||||
}
|
}
|
||||||
|
@ -1144,6 +1156,10 @@ namespace clang {
|
||||||
assert(!isa<CXXDestructorDecl>(D) &&
|
assert(!isa<CXXDestructorDecl>(D) &&
|
||||||
"Use mangleCXXDtor for destructor decls!");
|
"Use mangleCXXDtor for destructor decls!");
|
||||||
|
|
||||||
|
PrettyStackTraceDecl CrashInfo(const_cast<NamedDecl *>(D), SourceLocation(),
|
||||||
|
Context.getSourceManager(),
|
||||||
|
"Mangling declaration");
|
||||||
|
|
||||||
CXXNameMangler Mangler(Context, os);
|
CXXNameMangler Mangler(Context, os);
|
||||||
if (!Mangler.mangle(D))
|
if (!Mangler.mangle(D))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -12,8 +12,8 @@ A f(const B &b) {
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LP64: call __ZN1AC1ERK1Ai
|
// CHECK-LP64: call __ZN1AC1ERKS_i
|
||||||
|
|
||||||
// CHECK-LP32: call L__ZN1AC1ERK1Ai
|
// CHECK-LP32: call L__ZN1AC1ERKS_i
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,10 +31,10 @@ int main() {
|
||||||
X d(a, 5, 6);
|
X d(a, 5, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LP64: call __ZN1XC1ERK1Xiii
|
// CHECK-LP64: call __ZN1XC1ERKS_iii
|
||||||
// CHECK-LP64: call __ZN1XC1ERK1Xiii
|
// CHECK-LP64: call __ZN1XC1ERKS_iii
|
||||||
// CHECK-LP64: call __ZN1XC1ERK1Xiii
|
// CHECK-LP64: call __ZN1XC1ERKS_iii
|
||||||
|
|
||||||
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
|
// CHECK-LP32: call L__ZN1XC1ERKS_iii
|
||||||
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
|
// CHECK-LP32: call L__ZN1XC1ERKS_iii
|
||||||
// CHECK-LP32: call L__ZN1XC1ERK1Xiii
|
// CHECK-LP32: call L__ZN1XC1ERKS_iii
|
||||||
|
|
|
@ -93,17 +93,17 @@ int main() {
|
||||||
dstY.pr();
|
dstY.pr();
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LP64: .globl __ZN1XaSERK1X
|
// CHECK-LP64: .globl __ZN1XaSERKS_
|
||||||
// CHECK-LP64: .weak_definition __ZN1XaSERK1X
|
// CHECK-LP64: .weak_definition __ZN1XaSERKS_
|
||||||
// CHECK-LP64: __ZN1XaSERK1X:
|
// CHECK-LP64: __ZN1XaSERKS_:
|
||||||
// CHECK-LP64: .globl __ZN1QaSERK1Q
|
// CHECK-LP64: .globl __ZN1QaSERKS_
|
||||||
// CHECK-LP64: .weak_definition __ZN1QaSERK1Q
|
// CHECK-LP64: .weak_definition __ZN1QaSERKS_
|
||||||
// CHECK-LP64: __ZN1QaSERK1Q:
|
// CHECK-LP64: __ZN1QaSERKS_:
|
||||||
|
|
||||||
// CHECK-LP32: .globl __ZN1XaSERK1X
|
// CHECK-LP32: .globl __ZN1XaSERKS_
|
||||||
// CHECK-LP32: .weak_definition __ZN1XaSERK1X
|
// CHECK-LP32: .weak_definition __ZN1XaSERKS_
|
||||||
// CHECK-LP32: __ZN1XaSERK1X:
|
// CHECK-LP32: __ZN1XaSERKS_:
|
||||||
// CHECK-LP32: .globl __ZN1QaSERK1Q
|
// CHECK-LP32: .globl __ZN1QaSERKS_
|
||||||
// CHECK-LP32: .weak_definition __ZN1QaSERK1Q
|
// CHECK-LP32: .weak_definition __ZN1QaSERKS_
|
||||||
// CHECK-LP32: __ZN1QaSERK1Q:
|
// CHECK-LP32: __ZN1QaSERKS_:
|
||||||
|
|
||||||
|
|
|
@ -101,10 +101,10 @@ int main() {
|
||||||
m1.pr();
|
m1.pr();
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LP64: .globl __ZN1XC1ERK1X
|
// CHECK-LP64: .globl __ZN1XC1ERKS_
|
||||||
// CHECK-LP64: .weak_definition __ZN1XC1ERK1X
|
// CHECK-LP64: .weak_definition __ZN1XC1ERKS_
|
||||||
// CHECK-LP64: __ZN1XC1ERK1X:
|
// CHECK-LP64: __ZN1XC1ERKS_:
|
||||||
|
|
||||||
// CHECK-LP32: .globl __ZN1XC1ERK1X
|
// CHECK-LP32: .globl __ZN1XC1ERKS_
|
||||||
// CHECK-LP32: .weak_definition __ZN1XC1ERK1X
|
// CHECK-LP32: .weak_definition __ZN1XC1ERKS_
|
||||||
// CHECK-LP32: __ZN1XC1ERK1X:
|
// CHECK-LP32: __ZN1XC1ERKS_:
|
||||||
|
|
|
@ -24,3 +24,10 @@ namespace A {
|
||||||
|
|
||||||
// CHECK: define void @_Z1fN1A1AENS_1BE(
|
// CHECK: define void @_Z1fN1A1AENS_1BE(
|
||||||
void f(A::A a, A::B b) { }
|
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&) { }
|
||||||
|
|
|
@ -58,6 +58,6 @@ struct T {
|
||||||
void test3() {
|
void test3() {
|
||||||
T t1, t2;
|
T t1, t2;
|
||||||
|
|
||||||
// RUN: grep "call void @_ZN1TpsERK1T" %t
|
// RUN: grep "call void @_ZN1TpsERKS_" %t
|
||||||
T result = t1 + t2;
|
T result = t1 + t2;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue