ccc: Give the Host an opportunity to switch ToolChains when binding
archs (as a driver driver). llvm-svn: 62053
This commit is contained in:
parent
10d5adf031
commit
adf3e5bdbc
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue