Change CXTranslationUnit to not directly cast to an ASTUnit*,
but to wrap both an ASTUnit and a "string pool"
that will be used for fast USR generation.

This requires a bunch of mechanical changes, as
there was a ton of code that assumed that CXTranslationUnit
and ASTUnit* were the same.

Along with this change, introduce CXStringBuf,
which provides an llvm::SmallVector<char> backing
for repeatedly generating CXStrings without a huge
amount of malloc() traffic.  This requires making
some changes to the representation of CXString
by renaming a few fields (but keeping the size
of the object the same).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119337 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp
index 45a5bed..90c6658 100644
--- a/tools/libclang/CXType.cpp
+++ b/tools/libclang/CXType.cpp
@@ -89,7 +89,7 @@
 }
 
 
-CXType cxtype::MakeCXType(QualType T, ASTUnit *TU) {
+CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
   CXTypeKind TK = GetTypeKind(T);
   CXType CT = { TK, { TK == CXType_Invalid ? 0 : T.getAsOpaquePtr(), TU }};
   return CT;
@@ -101,8 +101,8 @@
   return QualType::getFromOpaquePtr(CT.data[0]);
 }
 
-static inline ASTUnit* GetASTU(CXType CT) {
-  return static_cast<ASTUnit*>(CT.data[1]);
+static inline CXTranslationUnit GetTU(CXType CT) {
+  return static_cast<CXTranslationUnit>(CT.data[1]);
 }
 
 extern "C" {
@@ -110,27 +110,26 @@
 CXType clang_getCursorType(CXCursor C) {
   using namespace cxcursor;
   
-  ASTUnit *AU = cxcursor::getCursorASTUnit(C);
-
+  CXTranslationUnit TU = cxcursor::getCursorTU(C);
   if (clang_isExpression(C.kind)) {
     QualType T = cxcursor::getCursorExpr(C)->getType();
-    return MakeCXType(T, AU);
+    return MakeCXType(T, TU);
   }
 
   if (clang_isDeclaration(C.kind)) {
     Decl *D = cxcursor::getCursorDecl(C);
 
     if (TypeDecl *TD = dyn_cast<TypeDecl>(D))
-      return MakeCXType(QualType(TD->getTypeForDecl(), 0), AU);
+      return MakeCXType(QualType(TD->getTypeForDecl(), 0), TU);
     if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
-      return MakeCXType(QualType(ID->getTypeForDecl(), 0), AU);
+      return MakeCXType(QualType(ID->getTypeForDecl(), 0), TU);
     if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
-      return MakeCXType(VD->getType(), AU);
+      return MakeCXType(VD->getType(), TU);
     if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
-      return MakeCXType(PD->getType(), AU);
+      return MakeCXType(PD->getType(), TU);
     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
-      return MakeCXType(FD->getType(), AU);
-    return MakeCXType(QualType(), AU);
+      return MakeCXType(FD->getType(), TU);
+    return MakeCXType(QualType(), TU);
   }
   
   if (clang_isReference(C.kind)) {
@@ -139,21 +138,21 @@
       return MakeCXType(
                 QualType(getCursorObjCSuperClassRef(C).first->getTypeForDecl(), 
                          0), 
-                        AU);
+                        TU);
       
     case CXCursor_ObjCClassRef:
       return MakeCXType(
                       QualType(getCursorObjCClassRef(C).first->getTypeForDecl(), 
                                0), 
-                        AU);
+                        TU);
       
     case CXCursor_TypeRef:
       return MakeCXType(QualType(getCursorTypeRef(C).first->getTypeForDecl(), 
                                  0), 
-                        AU);
+                        TU);
       
     case CXCursor_CXXBaseSpecifier:
-      return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), AU);
+      return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU);
       
     case CXCursor_ObjCProtocolRef:        
     case CXCursor_TemplateRef:
@@ -164,10 +163,10 @@
       break;
     }
     
-    return MakeCXType(QualType(), AU);
+    return MakeCXType(QualType(), TU);
   }
 
-  return MakeCXType(QualType(), AU);
+  return MakeCXType(QualType(), TU);
 }
 
 CXType clang_getCanonicalType(CXType CT) {
@@ -175,12 +174,13 @@
     return CT;
 
   QualType T = GetQualType(CT);
+  CXTranslationUnit TU = GetTU(CT);
 
   if (T.isNull())
-    return MakeCXType(QualType(), GetASTU(CT));
+    return MakeCXType(QualType(), GetTU(CT));
 
-  ASTUnit *AU = GetASTU(CT);
-  return MakeCXType(AU->getASTContext().getCanonicalType(T), AU);
+  ASTUnit *AU = static_cast<ASTUnit*>(TU->TUData);
+  return MakeCXType(AU->getASTContext().getCanonicalType(T), TU);
 }
 
 CXType clang_getPointeeType(CXType CT) {
@@ -188,7 +188,7 @@
   Type *TP = T.getTypePtr();
   
   if (!TP)
-    return MakeCXType(QualType(), GetASTU(CT));
+    return MakeCXType(QualType(), GetTU(CT));
   
   switch (TP->getTypeClass()) {
     case Type::Pointer:
@@ -208,7 +208,7 @@
       T = QualType();
       break;
   }
-  return MakeCXType(T, GetASTU(CT));
+  return MakeCXType(T, GetTU(CT));
 }
 
 CXCursor clang_getTypeDeclaration(CXType CT) {
@@ -263,7 +263,7 @@
   if (!D)
     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
 
-  return cxcursor::MakeCXCursor(D, GetASTU(CT));
+  return cxcursor::MakeCXCursor(D, GetTU(CT));
 }
 
 CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
@@ -324,24 +324,24 @@
 CXType clang_getResultType(CXType X) {
   QualType T = GetQualType(X);
   if (!T.getTypePtr())
-    return MakeCXType(QualType(), GetASTU(X));
+    return MakeCXType(QualType(), GetTU(X));
   
   if (const FunctionType *FD = T->getAs<FunctionType>())
-    return MakeCXType(FD->getResultType(), GetASTU(X));
+    return MakeCXType(FD->getResultType(), GetTU(X));
   
-  return MakeCXType(QualType(), GetASTU(X));
+  return MakeCXType(QualType(), GetTU(X));
 }
 
 CXType clang_getCursorResultType(CXCursor C) {
   if (clang_isDeclaration(C.kind)) {
     Decl *D = cxcursor::getCursorDecl(C);
     if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
-      return MakeCXType(MD->getResultType(), cxcursor::getCursorASTUnit(C));
+      return MakeCXType(MD->getResultType(), cxcursor::getCursorTU(C));
 
     return clang_getResultType(clang_getCursorType(C));
   }
 
-  return MakeCXType(QualType(), cxcursor::getCursorASTUnit(C));
+  return MakeCXType(QualType(), cxcursor::getCursorTU(C));
 }
 
 unsigned clang_isPODType(CXType X) {