ccc: Recognize -emit-llvm [-S].
- Unlike llvm-gcc, this doesn't yet treat -emit-llvm output as a
linker input.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63014 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/ccc/ccclib/Arguments.py b/tools/ccc/ccclib/Arguments.py
index 8f3e282..e936aec 100644
--- a/tools/ccc/ccclib/Arguments.py
+++ b/tools/ccc/ccclib/Arguments.py
@@ -689,7 +689,7 @@
self.addOption(JoinedOption('-i', self.iGroup))
- # Where are these coming from? I can't find them...
+ self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py
index 9a393f1..0fe5806 100644
--- a/tools/ccc/ccclib/Driver.py
+++ b/tools/ccc/ccclib/Driver.py
@@ -336,6 +336,7 @@
def buildNormalPipeline(self, args):
hasAnalyze = args.getLastArg(self.parser.analyzeOption)
hasCombine = args.getLastArg(self.parser.combineOption)
+ hasEmitLLVM = args.getLastArg(self.parser.emitLLVMOption)
hasSyntaxOnly = args.getLastArg(self.parser.syntaxOnlyOption)
hasDashC = args.getLastArg(self.parser.cOption)
hasDashE = args.getLastArg(self.parser.EOption)
@@ -368,7 +369,7 @@
# worth doing, since the tool presumably does this
# anyway, and this just adds an extra stat to the
# equation, but this is gcc compatible.
- if not os.path.exists(inputValue):
+ if inputValue != '-' and not os.path.exists(inputValue):
self.warning("%s: No such file or directory" % inputValue)
else:
inputs.append((klass, a))
@@ -408,15 +409,11 @@
if hasDashE or hasDashM or hasDashMM:
finalPhase = Phases.Phase.eOrderPreprocess
finalPhaseOpt = hasDashE
- elif hasAnalyze:
+ elif (hasAnalyze or hasSyntaxOnly or
+ hasEmitLLVM or hasDashS):
finalPhase = Phases.Phase.eOrderCompile
- finalPhaseOpt = hasAnalyze
- elif hasSyntaxOnly:
- finalPhase = Phases.Phase.eOrderCompile
- finalPhaseOpt = hasSyntaxOnly
- elif hasDashS:
- finalPhase = Phases.Phase.eOrderCompile
- finalPhaseOpt = hasDashS
+ finalPhaseOpt = (hasAnalyze or hasSyntaxOnly or
+ hasEmitLLVM or hasDashS)
elif hasDashC:
finalPhase = Phases.Phase.eOrderAssemble
finalPhaseOpt = hasDashC
@@ -464,6 +461,8 @@
sequence.append(Phases.AnalyzePhase())
elif hasSyntaxOnly:
sequence.append(Phases.SyntaxOnlyPhase())
+ elif hasEmitLLVM:
+ sequence.append(Phases.EmitLLVMPhase())
else:
sequence.extend([Phases.CompilePhase(),
Phases.AssemblePhase(),
@@ -506,6 +505,14 @@
current = Phases.JobAction(transition,
[current],
output)
+ elif isinstance(transition, Phases.EmitLLVMPhase):
+ if hasDashS:
+ output = Types.LLVMAsmType
+ else:
+ output = Types.LLVMBCType
+ current = Phases.JobAction(transition,
+ [current],
+ output)
elif isinstance(transition, Phases.CompilePhase):
output = Types.AsmTypeNoPP
current = Phases.JobAction(transition,
diff --git a/tools/ccc/ccclib/Phases.py b/tools/ccc/ccclib/Phases.py
index 160e72c..a126027 100644
--- a/tools/ccc/ccclib/Phases.py
+++ b/tools/ccc/ccclib/Phases.py
@@ -76,6 +76,10 @@
def __init__(self):
super(SyntaxOnlyPhase, self).__init__("syntax-only", Phase.eOrderCompile)
+class EmitLLVMPhase(Phase):
+ def __init__(self):
+ super(EmitLLVMPhase, self).__init__("emit-llvm", Phase.eOrderCompile)
+
class CompilePhase(Phase):
def __init__(self):
super(CompilePhase, self).__init__("compiler", Phase.eOrderCompile)
diff --git a/tools/ccc/ccclib/ToolChain.py b/tools/ccc/ccclib/ToolChain.py
index d0c1fe1..564b617 100644
--- a/tools/ccc/ccclib/ToolChain.py
+++ b/tools/ccc/ccclib/ToolChain.py
@@ -64,12 +64,14 @@
self.archName = archName
self.clangTool = Tools.Clang_CompileTool(self)
+ cc = Tools.Darwin_X86_CompileTool(self)
self.toolMap = {
Phases.PreprocessPhase : Tools.Darwin_X86_PreprocessTool(self),
Phases.AnalyzePhase : self.clangTool,
- Phases.SyntaxOnlyPhase : Tools.Darwin_X86_CompileTool(self),
- Phases.CompilePhase : Tools.Darwin_X86_CompileTool(self),
- Phases.PrecompilePhase : Tools.Darwin_X86_CompileTool(self),
+ Phases.SyntaxOnlyPhase : cc,
+ Phases.EmitLLVMPhase : cc,
+ Phases.CompilePhase : cc,
+ Phases.PrecompilePhase : cc,
Phases.AssemblePhase : Tools.Darwin_AssembleTool(self),
Phases.LinkPhase : Tools.Darwin_X86_LinkTool(self),
Phases.LipoPhase : Tools.LipoTool(),
@@ -110,7 +112,9 @@
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)):
+ (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
@@ -200,11 +204,13 @@
def __init__(self, driver):
super(Generic_GCC_ToolChain, self).__init__(driver)
+ cc = Tools.GCC_CompileTool()
self.toolMap = {
Phases.PreprocessPhase : Tools.GCC_PreprocessTool(),
Phases.AnalyzePhase : Tools.Clang_CompileTool(self),
- Phases.SyntaxOnlyPhase : Tools.GCC_CompileTool(),
- Phases.CompilePhase : Tools.GCC_CompileTool(),
+ Phases.SyntaxOnlyPhase : cc,
+ Phases.EmitLLVMPhase : cc,
+ Phases.CompilePhase : cc,
Phases.PrecompilePhase : Tools.GCC_PrecompileTool(),
Phases.AssemblePhase : Tools.GCC_AssembleTool(),
Phases.LinkPhase : Tools.GCC_LinkTool(),
diff --git a/tools/ccc/ccclib/Tools.py b/tools/ccc/ccclib/Tools.py
index 8b3ee74..0dcd52e 100644
--- a/tools/ccc/ccclib/Tools.py
+++ b/tools/ccc/ccclib/Tools.py
@@ -179,9 +179,15 @@
patchOutputNameForPTH = False
if isinstance(phase.phase, Phases.AnalyzePhase):
+ assert outputType is Types.PlistType
cmd_args.append('-analyze')
elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
+ assert outputType is Types.NothingType
cmd_args.append('-fsyntax-only')
+ elif outputType is Types.LLVMAsmType:
+ cmd_args.append('-emit-llvm')
+ elif outputType is Types.LLVMBCType:
+ cmd_args.append('-emit-llvm-bc')
elif outputType is Types.AsmTypeNoPP:
cmd_args.append('-S')
elif outputType is Types.PCHType:
@@ -688,6 +694,15 @@
raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
if outputType is Types.PCHType:
+ pass
+ elif outputType is Types.AsmTypeNoPP:
+ pass
+ elif outputType is Types.LLVMAsmType:
+ cmd_args.append('-emit-llvm')
+ elif outputType is Types.LLVMBCType:
+ cmd_args.append('-emit-llvm-bc')
+
+ if outputType is Types.PCHType:
output_args = []
else:
output_args = self.getOutputArgs(arglist, output)
diff --git a/tools/ccc/ccclib/Types.py b/tools/ccc/ccclib/Types.py
index c04e61d..4af0767 100644
--- a/tools/ccc/ccclib/Types.py
+++ b/tools/ccc/ccclib/Types.py
@@ -69,6 +69,8 @@
JavaType = InputType('java', canBeUserSpecified=True)
# Misc.
+LLVMAsmType = InputType('llvm-asm', tempSuffix='ll')
+LLVMBCType = InputType('llvm-bc', tempSuffix='bc')
PlistType = InputType('plist', tempSuffix='plist')
PCHType = InputType('precompiled-header', tempSuffix='gch')
ObjectType = InputType('object', tempSuffix='o')