Add some enum goodness as requested by Chris. Now instead of storing the
active C++ ABI as a raw string, we store it as an enum. This should improve
performance somewhat.

And yes, this time, I started from a clean build directory, and
all the tests passed. :)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111507 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index f53a50e..95893a4 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -137,10 +137,12 @@
 
 CXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
   if (!LangOpts.CPlusPlus) return NULL;
-  if (T.getCXXABI() == "microsoft")
-    return CreateMicrosoftCXXABI(*this);
-  else
+  switch (T.getCXXABI()) {
+  default:
     return CreateItaniumCXXABI(*this);
+  case CXXABI_Microsoft:
+    return CreateMicrosoftCXXABI(*this);
+  }
 }
 
 ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 907c359..ff77561 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -1463,8 +1463,6 @@
 
 // This class implements layout specific to the Microsoft ABI.
 class MSRecordLayoutBuilder: public RecordLayoutBuilder {
-  friend class ASTContext;
-
 public:
   MSRecordLayoutBuilder(ASTContext& Ctx, EmptySubobjectMap *EmptySubobjects):
     RecordLayoutBuilder(Ctx, EmptySubobjects) {}
@@ -1514,10 +1512,13 @@
 
     // When compiling for Microsoft, use the special MS builder.
     RecordLayoutBuilder *Builder;
-    if (Target.getCXXABI() == "microsoft")
-      Builder = new MSRecordLayoutBuilder(*this, &EmptySubobjects);
-    else
+    switch (Target.getCXXABI()) {
+    default:
       Builder = new RecordLayoutBuilder(*this, &EmptySubobjects);
+      break;
+    case CXXABI_Microsoft:
+      Builder = new MSRecordLayoutBuilder(*this, &EmptySubobjects);
+    }
     Builder->Layout(RD);
 
     // FIXME: This is not always correct. See the part about bitfields at
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 72ec584..c0df55b 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -90,10 +90,13 @@
 }
 
 void CodeGenModule::createCXXABI() {
-  if (Context.Target.getCXXABI() == "microsoft")
-    ABI = CreateMicrosoftCXXABI(*this);
-  else
+  switch (Context.Target.getCXXABI()) {
+  default:
     ABI = CreateItaniumCXXABI(*this);
+    break;
+  case CXXABI_Microsoft:
+    ABI = CreateMicrosoftCXXABI(*this);
+  }
 }
 
 void CodeGenModule::Release() {
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp
index e3628c1..1fdb17f 100644
--- a/lib/Sema/SemaType.cpp
+++ b/lib/Sema/SemaType.cpp
@@ -897,7 +897,7 @@
   // type. In such cases, the compiler makes a worst-case assumption.
   // We make no such assumption right now, so emit an error if the
   // class isn't a complete type.
-  if (Context.Target.getCXXABI() == "microsoft" &&
+  if (Context.Target.getCXXABI() == CXXABI_Microsoft &&
       RequireCompleteType(Loc, Class, diag::err_incomplete_type))
     return QualType();