aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/Mangle.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-03-10 17:07:44 +0000
committerAnders Carlsson <andersca@mac.com>2009-03-10 17:07:44 +0000
commit4843e584b54460973b8445d38907bab0401ebb0c (patch)
tree80cd1853ab6b65f189d9a6151350f457a720da20 /lib/CodeGen/Mangle.cpp
parenta5a10c37a02ac65f88624a29d1f7ad1d196fc7ea (diff)
Address Doug's comments wrt the mangler and fix Eli's test case
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66549 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r--lib/CodeGen/Mangle.cpp30
1 files changed, 10 insertions, 20 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp
index 34c88fbba5..92eeb5db14 100644
--- a/lib/CodeGen/Mangle.cpp
+++ b/lib/CodeGen/Mangle.cpp
@@ -43,7 +43,6 @@ namespace {
void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity);
void mangleCVQualifiers(unsigned Quals);
void mangleType(QualType T);
- void mangleType(const TypedefType *T);
void mangleType(const BuiltinType *T);
void mangleType(const FunctionType *T);
void mangleBareFunctionType(const FunctionType *T, bool MangleReturnType);
@@ -330,15 +329,16 @@ void CXXNameMangler::mangleCVQualifiers(unsigned Quals) {
}
void CXXNameMangler::mangleType(QualType T) {
+ // Only operate on the canonical type!
+ T = Context.getCanonicalType(T);
+
// FIXME: Should we have a TypeNodes.def to make this easier? (YES!)
// <type> ::= <CV-qualifiers> <type>
mangleCVQualifiers(T.getCVRQualifiers());
- if (const TypedefType *TT = dyn_cast<TypedefType>(T.getTypePtr()))
- mangleType(TT);
// ::= <builtin-type>
- else if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
+ if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
mangleType(BT);
// ::= <function-type>
else if (const FunctionType *FT = dyn_cast<FunctionType>(T.getTypePtr()))
@@ -382,27 +382,13 @@ void CXXNameMangler::mangleType(QualType T) {
} else if (const ObjCInterfaceType *IT =
dyn_cast<ObjCInterfaceType>(T.getTypePtr())) {
mangleType(IT);
- }
+ }
// FIXME: ::= G <type> # imaginary (C 2000)
// FIXME: ::= U <source-name> <type> # vendor extended type qualifier
else
assert(false && "Cannot mangle unknown type");
}
-void CXXNameMangler::mangleType(const TypedefType *T) {
- QualType DeclTy = T->getDecl()->getUnderlyingType();
-
- if (const TagType *TT = dyn_cast<TagType>(DeclTy)) {
- // If the tag type is anonymous, use the name of the typedef.
- if (!TT->getDecl()->getIdentifier()) {
- mangleName(T->getDecl());
- return;
- }
- }
-
- mangleType(DeclTy);
-}
-
void CXXNameMangler::mangleType(const BuiltinType *T) {
// <builtin-type> ::= v # void
// ::= w # wchar_t
@@ -488,7 +474,11 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionType *T,
void CXXNameMangler::mangleType(const TagType *T) {
// <class-enum-type> ::= <name>
- mangleName(T->getDecl());
+
+ if (!T->getDecl()->getIdentifier())
+ mangleName(T->getDecl()->getTypedefForAnonDecl());
+ else
+ mangleName(T->getDecl());
}
void CXXNameMangler::mangleType(const ArrayType *T) {