ccc: Give the Host an opportunity to switch ToolChains when binding

archs (as a driver driver).

llvm-svn: 62053
This commit is contained in:
Daniel Dunbar 2009-01-11 22:06:22 +00:00
parent 10d5adf031
commit adf3e5bdbc
2 changed files with 21 additions and 6 deletions

View File

@ -565,12 +565,13 @@ class Driver(object):
return '%s(%r, %r, %r)' % (self.__class__.__name__,
self.source, self.type, self.baseInput)
def createJobs(phase, forwardArgs,
def createJobs(tc, phase, forwardArgs,
canAcceptPipe=False, atTopLevel=False, arch=None):
if isinstance(phase, Phases.InputAction):
return InputInfo(phase.filename, phase.type, phase.filename)
elif isinstance(phase, Phases.BindArchAction):
archName = args.getValue(phase.arch)
tc = self.hostInfo.getToolChainForArch(archName)
filteredArgs = []
for arg in forwardArgs:
if arg.opt is self.parser.archOption:
@ -588,11 +589,11 @@ class Driver(object):
else:
filteredArgs.append(arg)
return createJobs(phase.inputs[0], filteredArgs,
return createJobs(tc, phase.inputs[0], filteredArgs,
canAcceptPipe, atTopLevel, phase.arch)
assert isinstance(phase, Phases.JobAction)
tool = self.toolChain.selectTool(phase)
tool = tc.selectTool(phase)
# See if we should use an integrated CPP. We only use an
# integrated cpp when we have exactly one input, since this is
@ -609,7 +610,8 @@ class Driver(object):
# Only try to use pipes when exactly one input.
canAcceptPipe = len(inputList) == 1 and tool.acceptsPipedInput()
inputs = [createJobs(p, forwardArgs, canAcceptPipe, False, arch) for p in inputList]
inputs = [createJobs(tc, p, forwardArgs, canAcceptPipe, False, arch)
for p in inputList]
# Determine if we should output to a pipe.
canOutputToPipe = canAcceptPipe and tool.canPipeOutput()
@ -679,6 +681,7 @@ class Driver(object):
raise ValueError,"Cannot specify -o when generating multiple files."
for phase in phases:
createJobs(phase, forward, canAcceptPipe=True, atTopLevel=True)
createJobs(self.toolChain, phase, forward,
canAcceptPipe=True, atTopLevel=True)
return jobs

View File

@ -14,6 +14,12 @@ class HostInfo(object):
def useDriverDriver(self):
abstract
def getToolChain(self):
abstract
def getToolChainForArch(self, arch):
raise RuntimeError,"getToolChainForArch() unsupported on this host."
# Darwin
class DarwinHostInfo(HostInfo):
@ -21,7 +27,13 @@ class DarwinHostInfo(HostInfo):
return True
def getToolChain(self):
return ToolChain.Darwin_ToolChain(self.driver)
return self.getToolChainForArch(self.getArchName())
def getToolChainForArch(self, arch):
if arch in ('i386', 'x86_64'):
return ToolChain.Darwin_ToolChain(self.driver)
return ToolChain.Generic_GCC_ToolChain(self.driver)
class DarwinPPCHostInfo(DarwinHostInfo):
def getArchName(self):