[cfe-commits] r44642 - /cfe/trunk/Driver/clang.cpp

Ted Kremenek kremenek at apple.com
Wed Dec 5 15:49:09 PST 2007


Author: kremenek
Date: Wed Dec  5 17:49:08 2007
New Revision: 44642

URL: http://llvm.org/viewvc/llvm-project?rev=44642&view=rev
Log:
Subdivided the function InitializeBaseLanguage into InitializeBaseLanguage,
GetLanguage, and InitializeLangOptions.  The goal is to break up this logic
into atomic units of functionality that can later be refactored into better
driver logic that is capable of handling a mixture of source files of
different languages.

Modified:
    cfe/trunk/Driver/clang.cpp

Modified: cfe/trunk/Driver/clang.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=44642&r1=44641&r2=44642&view=diff

==============================================================================
--- cfe/trunk/Driver/clang.cpp (original)
+++ cfe/trunk/Driver/clang.cpp Wed Dec  5 17:49:08 2007
@@ -159,50 +159,56 @@
 LangObjCXX("ObjC++", llvm::cl::desc("Set base language to Objective-C++"),
            llvm::cl::Hidden);
 
-/// InitializeBaseLanguage - Handle the -x foo options or infer a base language
-/// from the input filename.
-static void InitializeBaseLanguage(LangOptions &Options,
-                                   const std::string &Filename) {
-  if (BaseLang == langkind_unspecified) {
-    std::string::size_type DotPos = Filename.rfind('.');
-    if (LangObjC) {
-      BaseLang = langkind_objc;
-    } else if (LangObjCXX) {
-      BaseLang = langkind_objcxx;
-    } else if (DotPos == std::string::npos) {
-      BaseLang = langkind_c;  // Default to C if no extension.
-    } else {
-      std::string Ext = std::string(Filename.begin()+DotPos+1, Filename.end());
-      // C header: .h
-      // C++ header: .hh or .H;
-      // assembler no preprocessing: .s
-      // assembler: .S
-      if (Ext == "c")
-        BaseLang = langkind_c;
-      else if (Ext == "i")
-        BaseLang = langkind_c_cpp;
-      else if (Ext == "ii")
-        BaseLang = langkind_cxx_cpp;
-      else if (Ext == "m")
-        BaseLang = langkind_objc;
-      else if (Ext == "mi")
-        BaseLang = langkind_objc_cpp;
-      else if (Ext == "mm" || Ext == "M")
-        BaseLang = langkind_objcxx;
-      else if (Ext == "mii")
-        BaseLang = langkind_objcxx_cpp;
-      else if (Ext == "C" || Ext == "cc" || Ext == "cpp" || Ext == "CPP" ||
-               Ext == "c++" || Ext == "cp" || Ext == "cxx")
-        BaseLang = langkind_cxx;
-      else
-        BaseLang = langkind_c;
-    }
-  }
-  
+/// InitializeBaseLanguage - Handle the -x foo options.
+static void InitializeBaseLanguage() {
+  if (LangObjC)
+    BaseLang = langkind_objc;
+  else if (LangObjCXX)
+    BaseLang = langkind_objcxx;
+}
+
+static LangKind GetLanguage(const std::string &Filename) {
+  if (BaseLang != langkind_unspecified)
+    return BaseLang;
+  
+  std::string::size_type DotPos = Filename.rfind('.');
+
+  if (DotPos == std::string::npos) {
+    BaseLang = langkind_c;  // Default to C if no extension.
+  }
+  
+  std::string Ext = std::string(Filename.begin()+DotPos+1, Filename.end());
+  // C header: .h
+  // C++ header: .hh or .H;
+  // assembler no preprocessing: .s
+  // assembler: .S
+  if (Ext == "c")
+    return langkind_c;
+  else if (Ext == "i")
+    return langkind_c_cpp;
+  else if (Ext == "ii")
+    return langkind_cxx_cpp;
+  else if (Ext == "m")
+    return langkind_objc;
+  else if (Ext == "mi")
+    return langkind_objc_cpp;
+  else if (Ext == "mm" || Ext == "M")
+    return langkind_objcxx;
+  else if (Ext == "mii")
+    return langkind_objcxx_cpp;
+  else if (Ext == "C" || Ext == "cc" || Ext == "cpp" || Ext == "CPP" ||
+           Ext == "c++" || Ext == "cp" || Ext == "cxx")
+    return langkind_cxx;
+  else
+    return langkind_c;
+}
+
+
+static void InitializeLangOptions(LangOptions &Options, LangKind LK) {
   // FIXME: implement -fpreprocessed mode.
   bool NoPreprocess = false;
   
-  switch (BaseLang) {
+  switch (LK) {
   default: assert(0 && "Unknown language kind!");
   case langkind_c_cpp:
     NoPreprocess = true;
@@ -294,10 +300,10 @@
 //   -trigraphs
 //   -fdollars-in-identifiers
 //   -fpascal-strings
-static void InitializeLanguageStandard(LangOptions &Options) {
+static void InitializeLanguageStandard(LangOptions &Options, LangKind LK) {
   if (LangStd == lang_unspecified) {
     // Based on the base language, pick one.
-    switch (BaseLang) {
+    switch (LK) {
     default: assert(0 && "Unknown base language");
     case langkind_c:
     case langkind_c_cpp:
@@ -968,8 +974,10 @@
   // FIXME: This infers info from the first file, we should clump by language
   // to handle 'x.c y.c a.cpp b.cpp'.
   LangOptions LangInfo;
-  InitializeBaseLanguage(LangInfo, InputFilenames[0]);
-  InitializeLanguageStandard(LangInfo);
+  InitializeBaseLanguage();
+  LangKind LK = GetLanguage(InputFilenames[0]);
+  InitializeLangOptions(LangInfo, LK);
+  InitializeLanguageStandard(LangInfo, LK);
 
   std::auto_ptr<TextDiagnostics> DiagClient;
   if (!VerifyDiagnostics) {





More information about the cfe-commits mailing list