diff options
-rw-r--r-- | tools/ccc/ccclib/Driver.py | 25 | ||||
-rw-r--r-- | tools/ccc/ccclib/ToolChain.py | 61 | ||||
-rw-r--r-- | tools/ccc/ccclib/Tools.py | 3 | ||||
-rw-r--r-- | tools/ccc/ccclib/Types.py | 16 | ||||
-rw-r--r-- | tools/ccc/test/ccc/Xarch.c | 2 | ||||
-rw-r--r-- | tools/ccc/test/ccc/aliases.c | 8 | ||||
-rw-r--r-- | tools/ccc/test/ccc/darwin-hello.m | 8 | ||||
-rw-r--r-- | tools/ccc/test/ccc/darwin-x86-cc1.m | 8 | ||||
-rw-r--r-- | tools/ccc/test/ccc/hello.c | 6 | ||||
-rw-r--r-- | tools/ccc/test/ccc/hello.m | 4 | ||||
-rw-r--r-- | tools/ccc/test/ccc/universal-hello.c | 4 |
11 files changed, 93 insertions, 52 deletions
diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py index 6749dae132..bdcdcb731c 100644 --- a/tools/ccc/ccclib/Driver.py +++ b/tools/ccc/ccclib/Driver.py @@ -28,9 +28,10 @@ class Driver(object): self.cccHostBits = self.cccHostMachine = None self.cccHostSystem = self.cccHostRelease = None self.cccCXX = False - self.cccClang = False self.cccEcho = False self.cccFallback = False + self.cccNoClang = self.cccNoClangCXX = self.cccNoClangPreprocessor = False + self.cccClangArchs = None # Certain options suppress the 'no input files' warning. self.suppressMissingInputWarning = False @@ -115,12 +116,10 @@ class Driver(object): # FIXME: How to handle override of host? ccc specific options? # Abuse -b? - if self.getenvBool('CCC_CLANG'): - self.cccClang = True - if self.getenvBool('CCC_ECHO'): - self.cccEcho = True - if self.getenvBool('CCC_FALLBACK'): - self.cccFallback = True + arg = os.getenv('CCC_ADD_ARGS') + if arg: + args = filter(None, map(str.strip, arg.split(','))) + argv = args + argv while argv and argv[0].startswith('-ccc-'): fullOpt,argv = argv[0],argv[1:] @@ -132,12 +131,20 @@ class Driver(object): cccPrintPhases = True elif opt == 'cxx': self.cccCXX = True - elif opt == 'clang': - self.cccClang = True elif opt == 'echo': self.cccEcho = True elif opt == 'fallback': self.cccFallback = True + + elif opt == 'no-clang': + self.cccNoClang = True + elif opt == 'no-clang-cxx': + self.cccNoClangCXX = True + elif opt == 'no-clang-cpp': + self.cccNoClangPreprocessor = True + elif opt == 'clang-archs': + self.cccClangArchs,argv = argv[0].split(','),argv[1:] + elif opt == 'host-bits': self.cccHostBits,argv = argv[0],argv[1:] elif opt == 'host-machine': diff --git a/tools/ccc/ccclib/ToolChain.py b/tools/ccc/ccclib/ToolChain.py index 73b0127e14..6ce6ebc341 100644 --- a/tools/ccc/ccclib/ToolChain.py +++ b/tools/ccc/ccclib/ToolChain.py @@ -54,6 +54,28 @@ class ToolChain(object): else: return args + def shouldUseClangCompiler(self, action): + # If user requested no clang, or this isn't a "compile" phase, + # or this isn't a C family option, then don't use clang. + if (self.driver.cccNoClang or + not isinstance(action.phase, (Phases.PreprocessPhase, + Phases.CompilePhase, + Phases.SyntaxOnlyPhase, + Phases.EmitLLVMPhase, + Phases.PrecompilePhase)) or + action.inputs[0].type not in Types.cTypesSet): + return False + + if self.driver.cccNoClangPreprocessor: + if isinstance(action.phase, Phases.PreprocessPhase): + return False + + if self.driver.cccNoClangCXX: + if action.inputs[0].type in Types.cxxTypesSet: + return False + + return True + class Darwin_X86_ToolChain(ToolChain): def __init__(self, driver, darwinVersion, gccVersion, archName): super(Darwin_X86_ToolChain, self).__init__(driver) @@ -106,20 +128,23 @@ class Darwin_X86_ToolChain(ToolChain): major,minor,minorminor = self.darwinVersion return '%d.%d.%d' % (10, major-4, minor) + def shouldUseClangCompiler(self, action): + if not super(Darwin_X86_ToolChain, self).shouldUseClangCompiler(action): + return False + + # Only use clang if user didn't override archs, or this is one + # of the ones they provided. + if (not self.driver.cccClangArchs or + self.archName in self.driver.cccClangArchs): + return True + + return False + def selectTool(self, action): assert isinstance(action, Phases.JobAction) - if self.driver.cccClang and self.archName == 'i386': - if (action.inputs[0].type in (Types.CType, Types.CTypeNoPP, - Types.ObjCType, Types.ObjCTypeNoPP) and - (isinstance(action.phase, Phases.CompilePhase) or - isinstance(action.phase, Phases.SyntaxOnlyPhase) or - isinstance(action.phase, Phases.EmitLLVMPhase))): - return self.clangTool - elif (action.inputs[0].type in (Types.CHeaderType, Types.CHeaderNoPPType, - Types.ObjCHeaderType, Types.ObjCHeaderNoPPType) and - isinstance(action.phase, Phases.PrecompilePhase)): - return self.clangTool + if self.shouldUseClangCompiler(action): + return self.clangTool return self.toolMap[action.phase.__class__] @@ -220,17 +245,7 @@ class Generic_GCC_ToolChain(ToolChain): def selectTool(self, action): assert isinstance(action, Phases.JobAction) - if self.driver.cccClang: - if (action.inputs[0].type in (Types.CType, Types.CTypeNoPP, - Types.ObjCType, Types.ObjCTypeNoPP) and - (isinstance(action.phase, Phases.PreprocessPhase) or - isinstance(action.phase, Phases.CompilePhase) or - isinstance(action.phase, Phases.SyntaxOnlyPhase) or - isinstance(action.phase, Phases.EmitLLVMPhase))): - return self.clangTool - elif (action.inputs[0].type in (Types.CHeaderType, Types.CHeaderNoPPType, - Types.ObjCHeaderType, Types.ObjCHeaderNoPPType) and - isinstance(action.phase, Phases.PrecompilePhase)): - return self.clangTool + if self.shouldUseClangCompiler(action): + return self.clangTool return self.toolMap[action.phase.__class__] diff --git a/tools/ccc/ccclib/Tools.py b/tools/ccc/ccclib/Tools.py index a24255c652..61d6a24d34 100644 --- a/tools/ccc/ccclib/Tools.py +++ b/tools/ccc/ccclib/Tools.py @@ -190,6 +190,9 @@ class Clang_CompileTool(Tool): cmd_args.append('-emit-llvm-bc') elif outputType is Types.AsmTypeNoPP: cmd_args.append('-S') + elif (inputs[0].type.preprocess and + outputType is inputs[0].type.preprocess): + cmd_args.append('-E') elif outputType is Types.PCHType: # No special option needed, driven by -x. However, we # patch the output name to try and not conflict with gcc. diff --git a/tools/ccc/ccclib/Types.py b/tools/ccc/ccclib/Types.py index 4af0767914..1dd3ed9011 100644 --- a/tools/ccc/ccclib/Types.py +++ b/tools/ccc/ccclib/Types.py @@ -146,6 +146,22 @@ kTypeSpecifierMap = { 'treelang' : TreelangType, } +# Set of C family types. +cTypesSet = set([CType, CTypeNoPP, + ObjCType, ObjCTypeNoPP, + CXXType, CXXTypeNoPP, + ObjCXXType, ObjCXXTypeNoPP, + CHeaderType, CHeaderNoPPType, + ObjCHeaderType, ObjCHeaderNoPPType, + CXXHeaderType, CXXHeaderNoPPType, + ObjCXXHeaderType, ObjCXXHeaderNoPPType]) + +# Set of C++ family types. +cxxTypesSet = set([CXXType, CXXTypeNoPP, + ObjCXXType, ObjCXXTypeNoPP, + CXXHeaderType, CXXHeaderNoPPType, + ObjCXXHeaderType, ObjCXXHeaderNoPPType]) + # Check that the type specifier map at least matches what the types # believe to be true. assert not [name for name,type in kTypeSpecifierMap.items() diff --git a/tools/ccc/test/ccc/Xarch.c b/tools/ccc/test/ccc/Xarch.c index 0c0eee0121..5c3a1f954d 100644 --- a/tools/ccc/test/ccc/Xarch.c +++ b/tools/ccc/test/ccc/Xarch.c @@ -1,4 +1,4 @@ -// RUN: xcc -### -fsyntax-only -Xarch_i386 -Wall -Xarch_ppc -Wunused -arch i386 -arch ppc %s &> %t && +// RUN: xcc -ccc-no-clang -### -fsyntax-only -Xarch_i386 -Wall -Xarch_ppc -Wunused -arch i386 -arch ppc %s &> %t && // RUN: grep '"-Xarch"' %t | count 0 && // RUN: grep '"-Wall"' %t | count 1 && // RUN: grep 'i686-apple' %t | grep -v '"-m64"' | count 1 && diff --git a/tools/ccc/test/ccc/aliases.c b/tools/ccc/test/ccc/aliases.c index f9b89a14d4..101c4e7a25 100644 --- a/tools/ccc/test/ccc/aliases.c +++ b/tools/ccc/test/ccc/aliases.c @@ -1,13 +1,13 @@ -// RUN: xcc -### -S --all-warnings %s &> %t && +// RUN: xcc -ccc-no-clang -### -S --all-warnings %s &> %t && // RUN: grep -- '"-Wall"' %t && -// RUN: xcc -### -S --ansi %s &> %t && +// RUN: xcc -ccc-no-clang -### -S --ansi %s &> %t && // RUN: grep -- '"-ansi"' %t && -// RUN: xcc -### -S --assert foo --assert=foo %s &> %t && +// RUN: xcc -ccc-no-clang -### -S --assert foo --assert=foo %s &> %t && // RUN: grep -- '"-A" "foo" "-A" "foo"' %t && -// RUN: xcc -### -S --classpath foo --classpath=foo %s &> %t && +// RUN: xcc -ccc-no-clang -### -S --classpath foo --classpath=foo %s &> %t && // RUN: grep -- '"-fclasspath=foo" "-fclasspath=foo"' %t && // RUN: true diff --git a/tools/ccc/test/ccc/darwin-hello.m b/tools/ccc/test/ccc/darwin-hello.m index 73289e99cf..51dea654dc 100644 --- a/tools/ccc/test/ccc/darwin-hello.m +++ b/tools/ccc/test/ccc/darwin-hello.m @@ -1,11 +1,11 @@ // Check that object files compiled with -mdynamic-no-pic can be // linked. // -// RUN: xcc -ccc-clang -m32 -mdynamic-no-pic %s -c -o %t.o && -// RUN: xcc -ccc-clang -m32 %t.o -o %t && +// RUN: xcc -m32 -mdynamic-no-pic %s -c -o %t.o && +// RUN: xcc -m32 %t.o -o %t && // RUN: %t | grep "Hello, World" && -// RUN: xcc -ccc-clang -m64 -mdynamic-no-pic %s -c -o %t.o && -// RUN: xcc -ccc-clang -m64 %t.o -o %t && +// RUN: xcc -m64 -mdynamic-no-pic %s -c -o %t.o && +// RUN: xcc -m64 %t.o -o %t && // RUN: %t | grep "Hello, World" && // RUN: true diff --git a/tools/ccc/test/ccc/darwin-x86-cc1.m b/tools/ccc/test/ccc/darwin-x86-cc1.m index 6c097d3a74..d00f85554f 100644 --- a/tools/ccc/test/ccc/darwin-x86-cc1.m +++ b/tools/ccc/test/ccc/darwin-x86-cc1.m @@ -1,14 +1,14 @@ -// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -x objective-c -arch i386 -fmessage-length=0 -Wno-trigraphs -fpascal-strings -fasm-blocks -Os -mdynamic-no-pic -DUSER_DEFINE_0 -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2 -IINCLUDE_PATH_0 -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-four-char-constants -Wno-unknown-pragmas -Wno-format-y2k -Wpointer-arith -Wreturn-type -Wwrite-strings -Wswitch -Wcast-align -Wchar-subscripts -Winline -Wnested-externs -Wint-to-pointer-cast -Wpointer-to-int-cast -Wshorten-64-to-32 -FFRAMEWORK_0 -IINCLUDE_PATH_1 -FFRAMEWORK_1 -include USER_INCLUDE_0 -c %s -o %t.out &> %t.opts && +// RUN: xcc -ccc-no-clang -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -x objective-c -arch i386 -fmessage-length=0 -Wno-trigraphs -fpascal-strings -fasm-blocks -Os -mdynamic-no-pic -DUSER_DEFINE_0 -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2 -IINCLUDE_PATH_0 -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-four-char-constants -Wno-unknown-pragmas -Wno-format-y2k -Wpointer-arith -Wreturn-type -Wwrite-strings -Wswitch -Wcast-align -Wchar-subscripts -Winline -Wnested-externs -Wint-to-pointer-cast -Wpointer-to-int-cast -Wshorten-64-to-32 -FFRAMEWORK_0 -IINCLUDE_PATH_1 -FFRAMEWORK_1 -include USER_INCLUDE_0 -c %s -o %t.out &> %t.opts && // RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1obj" "-quiet" "-IINCLUDE_PATH_0" "-FFRAMEWORK_0" "-IINCLUDE_PATH_1" "-FFRAMEWORK_1" "-D__DYNAMIC__" "-DUSER_DEFINE_0" "-include" "USER_INCLUDE_0" ".*" "-quiet" "-dumpbase" "darwin-x86-cc1.m" "-mpascal-strings" "-mdynamic-no-pic" "-mmacosx-version-min=10.5" "-mtune=core2" "-auxbase-strip" ".*" "-gdwarf-2" "-Os" "-Wno-trigraphs" "-Wall" "-Wextra" "-Wno-missing-field-initializers" "-Wno-unused-parameter" "-Wno-four-char-constants" "-Wno-unknown-pragmas" "-Wno-format-y2k" "-Wpointer-arith" "-Wreturn-type" "-Wwrite-strings" "-Wswitch" "-Wcast-align" "-Wchar-subscripts" "-Winline" "-Wnested-externs" "-Wint-to-pointer-cast" "-Wpointer-to-int-cast" "-Wshorten-64-to-32" "-fmessage-length=0" "-fasm-blocks" "-fvisibility=hidden" "-o"' %t.opts && // RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "i386" "-force_cpusubtype_ALL" "-o"' %t.opts && -// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -v -E -dM -arch i386 -xobjective-c -c %s &> %t.opts && +// RUN: xcc -ccc-no-clang -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -v -E -dM -arch i386 -xobjective-c -c %s &> %t.opts && // RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1obj" "-E" "-quiet" "-v" "-D__DYNAMIC__" ".*" "-fPIC" "-mmacosx-version-min=10.6.5" "-mtune=core2" "-dM"' %t.opts && -// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -m32 -S -x cpp-output %s &> %t.opts && +// RUN: xcc -ccc-no-clang -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -m32 -S -x cpp-output %s &> %t.opts && // RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-fpreprocessed" ".*darwin-x86-cc1.m" "-fPIC" "-quiet" "-dumpbase" "darwin-x86-cc1.m" "-mmacosx-version-min=10.6.5" "-m32" "-mtune=core2" "-auxbase" "darwin-x86-cc1" "-o" ".*"' %t.opts && -// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -x objective-c-header %s -o /tmp/x.gch &> %t.opts && +// RUN: xcc -ccc-no-clang -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### -x objective-c-header %s -o /tmp/x.gch &> %t.opts && // RUN: grep ' "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1obj" "-quiet" "-D__DYNAMIC__" ".*darwin-x86-cc1.m" "-fPIC" "-quiet" "-dumpbase" "darwin-x86-cc1.m" "-mmacosx-version-min=10.6.5" "-mtune=core2" "-auxbase" ".*" "-o" "/dev/null" "--output-pch=" "/tmp/x.gch"' %t.opts && // RUN: true diff --git a/tools/ccc/test/ccc/hello.c b/tools/ccc/test/ccc/hello.c index 6b857b519a..120db1a630 100644 --- a/tools/ccc/test/ccc/hello.c +++ b/tools/ccc/test/ccc/hello.c @@ -1,8 +1,8 @@ -// RUN: xcc %s -o %t && +// RUN: xcc -ccc-no-clang %s -o %t && // RUN: %t | grep "Hello, World" && -// RUN: xcc %s -o %t -pipe && +// RUN: xcc -ccc-no-clang %s -o %t -pipe && // RUN: %t | grep "Hello, World" && -// RUN: xcc -ccc-clang %s -o %t && +// RUN: xcc %s -o %t && // RUN: %t | grep "Hello, World" int main() { diff --git a/tools/ccc/test/ccc/hello.m b/tools/ccc/test/ccc/hello.m index 9563fd04fe..b1bcaeb251 100644 --- a/tools/ccc/test/ccc/hello.m +++ b/tools/ccc/test/ccc/hello.m @@ -1,6 +1,6 @@ -// RUN: xcc %s -o %t && +// RUN: xcc -ccc-no-clang %s -o %t && // RUN: %t | grep "Hello, World" && -// RUN: xcc -ccc-clang %s -o %t && +// RUN: xcc %s -o %t && // RUN: %t | grep "Hello, World" int main() { diff --git a/tools/ccc/test/ccc/universal-hello.c b/tools/ccc/test/ccc/universal-hello.c index 7702b38229..654c43507a 100644 --- a/tools/ccc/test/ccc/universal-hello.c +++ b/tools/ccc/test/ccc/universal-hello.c @@ -1,7 +1,7 @@ -// RUN: xcc -arch ppc -arch i386 -arch x86_64 %s -o %t && +// RUN: xcc -ccc-no-clang -arch ppc -arch i386 -arch x86_64 %s -o %t && // RUN: %t | grep "Hello, World" && -// RUN: xcc -pipe -arch ppc -arch i386 -arch x86_64 %s -o %t && +// RUN: xcc -ccc-no-clang -pipe -arch ppc -arch i386 -arch x86_64 %s -o %t && // RUN: %t | grep "Hello, World" && // Check that multiple archs are handled properly. |