]> granicus.if.org Git - clang/commitdiff
ccc: Give the Host an opportunity to switch ToolChains when binding
authorDaniel Dunbar <daniel@zuster.org>
Sun, 11 Jan 2009 22:06:22 +0000 (22:06 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sun, 11 Jan 2009 22:06:22 +0000 (22:06 +0000)
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
tools/ccc/ccclib/HostInfo.py

index b9aba39f31a427fc514ebfc2adcdd8af6a533e00..b781479df6dfe1e0e9e9521a9e8613aeee44f512 100644 (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
index 5f681495e1334bf4a67af05f8721a896838d6340..926152c00f9a7187c4a32ed689bce681dddbb22b 100644 (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):