ccc: Add generic assembler & linker tools which effectively shell out

to gcc.

llvm-svn: 62020
This commit is contained in:
Daniel Dunbar 2009-01-10 02:00:04 +00:00
parent 96977ae536
commit eacf5b174d
1 changed files with 43 additions and 15 deletions

View File

@ -24,10 +24,6 @@ class GCC_Common_Tool(Tool):
def constructJob(self, phase, arch, jobs, inputs, def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args, arglist, output, outputType, args, arglist,
extraArgs): extraArgs):
assert len(inputs) == 1
input = inputs[0]
cmd_args = sum(map(arglist.render, args),[]) + extraArgs cmd_args = sum(map(arglist.render, args),[]) + extraArgs
if arch: if arch:
cmd_args.extend(arglist.render(arch)) cmd_args.extend(arglist.render(arch))
@ -38,17 +34,27 @@ class GCC_Common_Tool(Tool):
else: else:
cmd_args.extend(arglist.render(output)) cmd_args.extend(arglist.render(output))
cmd_args.extend(['-x', input.type.name]) # Only pass -x if gcc will understand it; otherwise hope gcc
if isinstance(input.source, Jobs.PipedJob): # understands the suffix correctly. The main use case this
cmd_args.append('-') # would go wrong in is for linker inputs, say if the user
else: # tried to make an executable named 'a.c'.
cmd_args.append(arglist.getValue(input.source)) #
# FIXME: For the linker case specifically, can we safely
# convert inputs into '-Wl,' options?
for input in inputs:
if input.type.canBeUserSpecified:
cmd_args.extend(['-x', input.type.name])
if isinstance(input.source, Jobs.PipedJob):
cmd_args.append('-')
else:
cmd_args.append(arglist.getValue(input.source))
jobs.addJob(Jobs.Command('gcc', cmd_args)) jobs.addJob(Jobs.Command('gcc', cmd_args))
class GCC_PreprocessTool(GCC_Common_Tool): class GCC_PreprocessTool(GCC_Common_Tool):
def __init__(self): def __init__(self):
super(GCC_PreprocessTool, self).__init__('gcc', super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
(Tool.eFlagsPipedInput | (Tool.eFlagsPipedInput |
Tool.eFlagsPipedOutput)) Tool.eFlagsPipedOutput))
@ -60,7 +66,7 @@ class GCC_PreprocessTool(GCC_Common_Tool):
class GCC_CompileTool(GCC_Common_Tool): class GCC_CompileTool(GCC_Common_Tool):
def __init__(self): def __init__(self):
super(GCC_CompileTool, self).__init__('gcc', super(GCC_CompileTool, self).__init__('gcc (cc1)',
(Tool.eFlagsPipedInput | (Tool.eFlagsPipedInput |
Tool.eFlagsPipedOutput | Tool.eFlagsPipedOutput |
Tool.eFlagsIntegratedCPP)) Tool.eFlagsIntegratedCPP))
@ -73,7 +79,7 @@ class GCC_CompileTool(GCC_Common_Tool):
class GCC_PrecompileTool(GCC_Common_Tool): class GCC_PrecompileTool(GCC_Common_Tool):
def __init__(self): def __init__(self):
super(GCC_PrecompileTool, self).__init__('gcc', super(GCC_PrecompileTool, self).__init__('gcc (pch)',
(Tool.eFlagsPipedInput | (Tool.eFlagsPipedInput |
Tool.eFlagsIntegratedCPP)) Tool.eFlagsIntegratedCPP))
@ -83,10 +89,10 @@ class GCC_PrecompileTool(GCC_Common_Tool):
output, outputType, args, arglist, output, outputType, args, arglist,
[]) [])
class DarwinAssemblerTool(Tool): class DarwinAssembleTool(Tool):
def __init__(self): def __init__(self):
super(DarwinAssemblerTool, self).__init__('as', super(DarwinAssembleTool, self).__init__('as',
Tool.eFlagsPipedInput) Tool.eFlagsPipedInput)
def constructJob(self, phase, arch, jobs, inputs, def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args, arglist): output, outputType, args, arglist):
@ -106,6 +112,28 @@ class DarwinAssemblerTool(Tool):
cmd_args.append(arglist.getValue(input.source)) cmd_args.append(arglist.getValue(input.source))
jobs.addJob(Jobs.Command('as', cmd_args)) jobs.addJob(Jobs.Command('as', cmd_args))
class GCC_AssembleTool(GCC_Common_Tool):
def __init__(self):
# We can't generally assume the assembler can take or output
# on pipes.
super(GCC_AssembleTool, self).__init__('gcc (as)')
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args, arglist):
return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
output, outputType, args, arglist,
['-c'])
class GCC_LinkTool(GCC_Common_Tool):
def __init__(self):
super(GCC_LinkTool, self).__init__('gcc (ld)')
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args, arglist):
return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
output, outputType, args, arglist,
[])
class Collect2Tool(Tool): class Collect2Tool(Tool):
kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2' kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2'
def __init__(self): def __init__(self):