Make mangling work with anonymous tag types. Doug, please review

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66353 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp
index 490936f..34c88fb 100644
--- a/lib/CodeGen/Mangle.cpp
+++ b/lib/CodeGen/Mangle.cpp
@@ -43,6 +43,7 @@
     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);
@@ -329,16 +330,15 @@
 }
 
 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>
-  if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
+  else if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
     mangleType(BT);
   //         ::= <function-type>
   else if (const FunctionType *FT = dyn_cast<FunctionType>(T.getTypePtr()))
@@ -382,13 +382,27 @@
   } 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