summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-12-05 23:49:08 +0000
committerTed Kremenek <kremenek@apple.com>2007-12-05 23:49:08 +0000
commit260d01d6e6aa8f1285e3f691873229d784e74efe (patch)
treedb6e94c46d706bbd99e2c492c13d6638159bd81c
parent6a04fcb2f412681d197c9c28191ddc651eb5571f (diff)
downloadbcm5719-llvm-260d01d6e6aa8f1285e3f691873229d784e74efe.tar.gz
bcm5719-llvm-260d01d6e6aa8f1285e3f691873229d784e74efe.zip
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. llvm-svn: 44642
-rw-r--r--clang/Driver/clang.cpp94
1 files changed, 51 insertions, 43 deletions
diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp
index 7de87594ceb..5fa83ff71f7 100644
--- a/clang/Driver/clang.cpp
+++ b/clang/Driver/clang.cpp
@@ -159,50 +159,56 @@ static llvm::cl::opt<bool>
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 @@ LaxVectorConversions("flax-vector-conversions",
// -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 @@ int main(int argc, char **argv) {
// 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) {
OpenPOWER on IntegriCloud