summaryrefslogtreecommitdiffstats
path: root/clang/tools/ccc/ccclib/Tools.py
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools/ccc/ccclib/Tools.py')
-rw-r--r--clang/tools/ccc/ccclib/Tools.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/clang/tools/ccc/ccclib/Tools.py b/clang/tools/ccc/ccclib/Tools.py
new file mode 100644
index 00000000000..ddfb02916e5
--- /dev/null
+++ b/clang/tools/ccc/ccclib/Tools.py
@@ -0,0 +1,169 @@
+import Arguments
+import Jobs
+import Types
+
+class Tool(object):
+ """Tool - A concrete implementation of a phase."""
+
+ eFlagsPipedInput = 1 << 0
+ eFlagsPipedOutput = 1 << 1
+ eFlagsIntegratedCPP = 1 << 2
+
+ def __init__(self, name, flags = 0):
+ self.name = name
+ self.flags = flags
+
+ def acceptsPipedInput(self):
+ return not not (self.flags & Tool.eFlagsPipedInput)
+ def canPipeOutput(self):
+ return not not (self.flags & Tool.eFlagsPipedOutput)
+ def hasIntegratedCPP(self):
+ return not not (self.flags & Tool.eFlagsIntegratedCPP)
+
+class GCC_Common_Tool(Tool):
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args,
+ extraArgs):
+ assert len(inputs) == 1
+
+ input = inputs[0]
+
+ cmd_args = args + extraArgs
+ if arch:
+ # FIXME: Clean this up.
+ if isinstance(arch, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-arch'),
+ arch])
+ else:
+ cmd_args.append(arch)
+ if isinstance(output, Jobs.PipedJob):
+ cmd_args.extend([Arguments.DerivedArg('-o'), Arguments.DerivedArg('-')])
+ elif output is None:
+ cmd_args.append(Arguments.DerivedArg('-fsyntax-only'))
+ else:
+ # FIXME: Ditch this hack.
+ if isinstance(output, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-o'), output])
+ else:
+ cmd_args.append(output)
+
+ cmd_args.extend([Arguments.DerivedArg('-x'),
+ Arguments.DerivedArg(input.type.name)])
+ if isinstance(input.source, Jobs.PipedJob):
+ cmd_args.append(Arguments.DerivedArg('-'))
+ else:
+ cmd_args.append(input.source)
+
+ jobs.addJob(Jobs.Command('gcc', cmd_args))
+
+class GCC_PreprocessTool(GCC_Common_Tool):
+ def __init__(self):
+ super(GCC_PreprocessTool, self).__init__('gcc',
+ (Tool.eFlagsPipedInput |
+ Tool.eFlagsPipedOutput))
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
+ output, outputType, args,
+ [Arguments.DerivedArg('-E')])
+
+class GCC_CompileTool(GCC_Common_Tool):
+ def __init__(self):
+ super(GCC_CompileTool, self).__init__('gcc',
+ (Tool.eFlagsPipedInput |
+ Tool.eFlagsPipedOutput |
+ Tool.eFlagsIntegratedCPP))
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
+ output, outputType, args,
+ [Arguments.DerivedArg('-S')])
+
+class GCC_PrecompileTool(GCC_Common_Tool):
+ def __init__(self):
+ super(GCC_PrecompileTool, self).__init__('gcc',
+ (Tool.eFlagsPipedInput |
+ Tool.eFlagsIntegratedCPP))
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
+ output, outputType, args,
+ [])
+
+class DarwinAssemblerTool(Tool):
+ def __init__(self):
+ super(DarwinAssemblerTool, self).__init__('as',
+ Tool.eFlagsPipedInput)
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ assert len(inputs) == 1
+ assert outputType is Types.ObjectType
+
+ input = inputs[0]
+
+ cmd_args = []
+ if arch:
+ # FIXME: Clean this up.
+ if isinstance(arch, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-arch'),
+ arch])
+ else:
+ cmd_args.append(arch)
+ cmd_args.append(Arguments.DerivedArg('-force_cpusubtype_ALL'))
+ if isinstance(output, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-o'), output])
+ else:
+ cmd_args.append(output)
+ if isinstance(input.source, Jobs.PipedJob):
+ cmd_args.append(Arguments.DerivedArg('-'))
+ else:
+ cmd_args.append(input.source)
+ jobs.addJob(Jobs.Command('as', cmd_args))
+
+class Collect2Tool(Tool):
+ kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2'
+ def __init__(self):
+ super(Collect2Tool, self).__init__('collect2')
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ assert outputType is Types.ImageType
+
+ cmd_args = []
+ for arg in args:
+ if arg.opt:
+ if arg.opt.name in ('-framework',):
+ cmd_args.append(arg)
+ for input in inputs:
+ cmd_args.append(input.source)
+ if isinstance(output, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-o'), output])
+ else:
+ cmd_args.append(output)
+ cmd_args.extend([Arguments.DerivedArg('-L/usr/lib/gcc/i686-apple-darwin10/4.2.1'),
+ Arguments.DerivedArg('-lcrt1.10.5.o'),
+ Arguments.DerivedArg('-lgcc_s.10.5'),
+ Arguments.DerivedArg('-lgcc'),
+ Arguments.DerivedArg('-lSystem')])
+ jobs.addJob(Jobs.Command(self.kCollect2Path, cmd_args))
+
+class LipoTool(Tool):
+ def __init__(self):
+ super(LipoTool, self).__init__('lipo')
+
+ def constructJob(self, phase, arch, jobs, inputs,
+ output, outputType, args):
+ assert outputType is Types.ImageType
+
+ cmd_args = [Arguments.DerivedArg('-create')]
+ if isinstance(output, Arguments.DerivedArg):
+ cmd_args.extend([Arguments.DerivedArg('-o'), output])
+ else:
+ cmd_args.append(output)
+ for input in inputs:
+ cmd_args.append(input.source)
+ jobs.addJob(Jobs.Command('lipo', cmd_args))
OpenPOWER on IntegriCloud