From bee1f0d43924aa1ce6a56a803236f57d5641cb3c Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sun, 11 Jan 2009 22:06:22 +0000 Subject: [PATCH] ccc: Give the Host an opportunity to switch ToolChains when binding archs (as a driver driver). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62053 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/ccc/ccclib/Driver.py | 13 ++++++++----- tools/ccc/ccclib/HostInfo.py | 14 +++++++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py index b9aba39f31..b781479df6 100644 --- a/tools/ccc/ccclib/Driver.py +++ b/tools/ccc/ccclib/Driver.py @@ -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 diff --git a/tools/ccc/ccclib/HostInfo.py b/tools/ccc/ccclib/HostInfo.py index 5f681495e1..926152c00f 100644 --- a/tools/ccc/ccclib/HostInfo.py +++ b/tools/ccc/ccclib/HostInfo.py @@ -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): -- 2.40.0