diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index d1df4d87514c..5ba737379daf 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -78,18 +78,18 @@ public: bool CCCPrintBindings : 1; private: - /// Don't use clang for any tasks. - bool CCCNoClang : 1; + /// Use the clang compiler where possible. + bool CCCUseClang : 1; - /// Don't use clang for handling C++ and Objective-C++ inputs. - bool CCCNoClangCXX : 1; + /// Use clang for handling C++ and Objective-C++ inputs. + bool CCCUseClangCXX : 1; - /// Don't use clang as a preprocessor (clang's preprocessor will - /// still be used where an integrated CPP would). - bool CCCNoClangCPP : 1; + /// Use clang as a preprocessor (clang's preprocessor will still be + /// used where an integrated CPP would). + bool CCCUseClangCPP : 1; - /// Only use clang for the given architectures. Only used when - /// non-empty. + /// Only use clang for the given architectures (only used when + /// non-empty). std::set CCCClangArchs; /// Certain options suppress the 'no input files' warning. diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 1e10ac5c8f9d..4411ac6fd20a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -43,9 +43,12 @@ Driver::Driver(const char *_Name, const char *_Dir, DefaultImageName(_DefaultImageName), Host(0), CCCIsCXX(false), CCCEcho(false), CCCPrintBindings(false), - CCCNoClang(false), CCCNoClangCXX(false), CCCNoClangCPP(false), + CCCUseClang(true), CCCUseClangCXX(false), CCCUseClangCPP(true), SuppressMissingInputWarning(false) { + // Only use clang on i386 and x86_64 by default. + CCCClangArchs.insert("i386"); + CCCClangArchs.insert("x86_64"); } Driver::~Driver() { @@ -132,24 +135,27 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) { } else if (!strcmp(Opt, "echo")) { CCCEcho = true; + } else if (!strcmp(Opt, "clang-cxx")) { + CCCUseClangCXX = true; } else if (!strcmp(Opt, "no-clang")) { - CCCNoClang = true; - } else if (!strcmp(Opt, "no-clang-cxx")) { - CCCNoClangCXX = true; + CCCUseClang = false; } else if (!strcmp(Opt, "no-clang-cpp")) { - CCCNoClangCPP = true; + CCCUseClangCPP = false; } else if (!strcmp(Opt, "clang-archs")) { assert(Start+1 < End && "FIXME: -ccc- argument handling."); const char *Cur = *++Start; + CCCClangArchs.clear(); for (;;) { const char *Next = strchr(Cur, ','); if (Next) { - CCCClangArchs.insert(std::string(Cur, Next)); + if (Cur != Next) + CCCClangArchs.insert(std::string(Cur, Next)); Cur = Next + 1; } else { - CCCClangArchs.insert(std::string(Cur)); + if (*Cur != '\0') + CCCClangArchs.insert(std::string(Cur)); break; } } @@ -986,19 +992,19 @@ bool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA, const std::string &ArchName) const { // Check if user requested no clang, or clang doesn't understand // this type (we only handle single inputs for now). - if (CCCNoClang || JA.size() != 1 || + if (!CCCUseClang || JA.size() != 1 || !types::isAcceptedByClang((*JA.begin())->getType())) return false; - // Otherwise make sure this is an action clang undertands. + // Otherwise make sure this is an action clang understands. if (isa(JA)) { - if (CCCNoClangCPP) + if (!CCCUseClangCPP) return false; } else if (!isa(JA) && !isa(JA)) return false; - // Avoid CXX if the user requested. - if (CCCNoClangCXX && types::isCXX((*JA.begin())->getType())) + // Use clang for C++? + if (!CCCUseClangCXX && types::isCXX((*JA.begin())->getType())) return false; // Finally, don't use clang if this isn't one of the user specified diff --git a/clang/test/Driver/bindings.c b/clang/test/Driver/bindings.c index 0e5623f0b81c..9495eb2fba25 100644 --- a/clang/test/Driver/bindings.c +++ b/clang/test/Driver/bindings.c @@ -30,16 +30,23 @@ // RUN: grep 'bind - "clang", inputs: \[".*bindings.c"\], output: (nothing)' %t && // RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-print-bindings -ccc-no-clang -fsyntax-only %s 2> %t && // RUN: grep 'bind - "gcc::Compile", inputs: \[".*bindings.c"\], output: (nothing)' %t && -// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-print-bindings -ccc-no-clang-cxx -fsyntax-only -x c++ %s 2> %t && +// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-print-bindings -fsyntax-only -x c++ %s 2> %t && // RUN: grep 'bind - "gcc::Compile", inputs: \[".*bindings.c"\], output: (nothing)' %t && -// RUN: clang -ccc-print-bindings -ccc-no-clang-cpp -fsyntax-only -no-integrated-cpp -x c++ %s 2> %t && -// RUN: grep 'bind - "gcc::Preprocess", inputs: \[".*bindings.c"\], output: ".*\.ii"' %t && -// RUN: grep 'bind - "clang", inputs: \[".*\.ii"\], output: (nothing)' %t && -// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-host-triple i386-apple-darwin9 -ccc-print-bindings -ccc-clang-archs i386 %s -S -arch ppc 2> %t && +// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-print-bindings -ccc-clang-cxx -fsyntax-only -x c++ %s 2> %t && +// RUN: grep 'bind - "clang", inputs: \[".*bindings.c"\], output: (nothing)' %t && +// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-print-bindings -ccc-no-clang-cpp -fsyntax-only -no-integrated-cpp %s 2> %t && +// RUN: grep 'bind - "gcc::Preprocess", inputs: \[".*bindings.c"\], output: ".*\.i"' %t && +// RUN: grep 'bind - "clang", inputs: \[".*\.i"\], output: (nothing)' %t && +// RUN: clang -ccc-host-triple i386-apple-darwin9 -ccc-print-bindings -ccc-clang-archs i386 %s -S -arch ppc 2> %t && // RUN: grep 'bind - "gcc::Compile", inputs: \[".*bindings.c"\], output: "bindings.s"' %t && -// RUN: clang -ccc-host-triple i386-unknown-unknown -ccc-host-triple i386-apple-darwin9 -ccc-print-bindings -ccc-clang-archs ppc %s -S -arch ppc 2> %t && +// RUN: clang -ccc-host-triple i386-apple-darwin9 -ccc-print-bindings -ccc-clang-archs ppc %s -S -arch ppc 2> %t && // RUN: grep 'bind - "clang", inputs: \[".*bindings.c"\], output: "bindings.s"' %t && +// RUN: clang -ccc-host-triple powerpc-unknown-unknown -ccc-print-bindings -ccc-clang-archs "" %s -S 2> %t && +// RUN: grep 'bind - "clang", inputs: \[".*bindings.c"\], output: "bindings.s"' %t && +// RUN: clang -ccc-host-triple powerpc-unknown-unknown -ccc-print-bindings %s -S 2> %t && +// RUN: grep 'bind - "gcc::Compile", inputs: \[".*bindings.c"\], output: "bindings.s"' %t && + // Darwin bindings // RUN: clang -ccc-host-triple i386-apple-darwin9 -ccc-print-bindings %s 2> %t && // RUN: grep 'bind - "clang", inputs: \[".*bindings.c"\], output: ".*\.s"' %t &&