blob: dc349be50e2c7b1e2ca6816ba88b385dc6074b1a [file] [log] [blame]
Daniel Dunbar6325fcf2009-01-12 09:23:15 +00001import os
Daniel Dunbar9c199a02009-01-11 23:13:15 +00002import sys # FIXME: Shouldn't be needed.
3
Daniel Dunbara5677512009-01-05 19:53:30 +00004import Arguments
5import Jobs
Daniel Dunbarde388a52009-01-21 01:07:49 +00006import Phases
Daniel Dunbara5677512009-01-05 19:53:30 +00007import Types
8
9class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +000010 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000011
12 eFlagsPipedInput = 1 << 0
13 eFlagsPipedOutput = 1 << 1
14 eFlagsIntegratedCPP = 1 << 2
15
Daniel Dunbar5e187a12009-02-20 01:30:38 +000016 def __init__(self, name, toolChain, flags = 0):
Daniel Dunbara5677512009-01-05 19:53:30 +000017 self.name = name
Daniel Dunbar5e187a12009-02-20 01:30:38 +000018 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +000019 self.flags = flags
20
21 def acceptsPipedInput(self):
22 return not not (self.flags & Tool.eFlagsPipedInput)
23 def canPipeOutput(self):
24 return not not (self.flags & Tool.eFlagsPipedOutput)
25 def hasIntegratedCPP(self):
26 return not not (self.flags & Tool.eFlagsIntegratedCPP)
27
28class GCC_Common_Tool(Tool):
Daniel Dunbar7c584962009-01-20 21:29:14 +000029 def getGCCExtraArgs(self):
30 return []
31
Daniel Dunbara5677512009-01-05 19:53:30 +000032 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +000033 output, outputType, arglist, linkingOutput):
Daniel Dunbar11672ec2009-01-13 18:51:26 +000034 cmd_args = []
35 for arg in arglist.args:
36 if arg.opt.forwardToGCC():
37 cmd_args.extend(arglist.render(arg))
38
Daniel Dunbar7c584962009-01-20 21:29:14 +000039 cmd_args.extend(self.getGCCExtraArgs())
Daniel Dunbara5677512009-01-05 19:53:30 +000040 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000041 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000042 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000043 cmd_args.extend(['-o', '-'])
Daniel Dunbarde388a52009-01-21 01:07:49 +000044 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbardb439902009-01-07 18:40:45 +000045 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000046 else:
Daniel Dunbarde388a52009-01-21 01:07:49 +000047 assert output
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000048 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000049
Daniel Dunbar7c584962009-01-20 21:29:14 +000050 if (isinstance(self, GCC_LinkTool) and
51 linkingOutput):
52 cmd_args.append('-Wl,-arch_multiple')
53 cmd_args.append('-Wl,-final_output,' +
54 arglist.getValue(linkingOutput))
55
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000056 # Only pass -x if gcc will understand it; otherwise hope gcc
57 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000058 # would go wrong in is for linker inputs if they happened to
59 # have an odd suffix; really the only way to get this to
60 # happen is a command like '-x foobar a.c' which will treat
61 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000062 #
63 # FIXME: For the linker case specifically, can we safely
64 # convert inputs into '-Wl,' options?
65 for input in inputs:
66 if input.type.canBeUserSpecified:
67 cmd_args.extend(['-x', input.type.name])
68
69 if isinstance(input.source, Jobs.PipedJob):
70 cmd_args.append('-')
71 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000072 assert isinstance(input.source, Arguments.Arg)
73 # If this is a linker input then assume we can forward
74 # just by rendering.
75 if input.source.opt.isLinkerInput:
76 cmd_args.extend(arglist.render(input.source))
77 else:
78 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000079
80 jobs.addJob(Jobs.Command('gcc', cmd_args))
81
82class GCC_PreprocessTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +000083 def __init__(self, toolChain):
84 super(GCC_PreprocessTool, self).__init__('gcc (cpp)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +000085 (Tool.eFlagsPipedInput |
86 Tool.eFlagsPipedOutput))
87
Daniel Dunbar7c584962009-01-20 21:29:14 +000088 def getGCCExtraArgs(self):
89 return ['-E']
Daniel Dunbara5677512009-01-05 19:53:30 +000090
91class GCC_CompileTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +000092 def __init__(self, toolChain):
93 super(GCC_CompileTool, self).__init__('gcc (cc1)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +000094 (Tool.eFlagsPipedInput |
95 Tool.eFlagsPipedOutput |
96 Tool.eFlagsIntegratedCPP))
97
Daniel Dunbar7c584962009-01-20 21:29:14 +000098 def getGCCExtraArgs(self):
99 return ['-S']
Daniel Dunbara5677512009-01-05 19:53:30 +0000100
101class GCC_PrecompileTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000102 def __init__(self, toolChain):
103 super(GCC_PrecompileTool, self).__init__('gcc (pch)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +0000104 (Tool.eFlagsPipedInput |
105 Tool.eFlagsIntegratedCPP))
106
Daniel Dunbar7c584962009-01-20 21:29:14 +0000107 def getGCCExtraArgs(self):
108 return []
109
110class GCC_AssembleTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000111 def __init__(self, toolChain):
Daniel Dunbar48d0d612009-02-17 18:10:15 +0000112 # Assume that gcc will do any magic necessary to let the
113 # assembler take piped input.
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000114 super(GCC_AssembleTool, self).__init__('gcc (as)', toolChain,
Daniel Dunbar48d0d612009-02-17 18:10:15 +0000115 Tool.eFlagsPipedInput)
Daniel Dunbar7c584962009-01-20 21:29:14 +0000116
117 def getGCCExtraArgs(self):
118 return ['-c']
119
120class GCC_LinkTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000121 def __init__(self, toolChain):
122 super(GCC_LinkTool, self).__init__('gcc (ld)', toolChain)
Daniel Dunbara5677512009-01-05 19:53:30 +0000123
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000124class Darwin_AssembleTool(Tool):
125 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000126 super(Darwin_AssembleTool, self).__init__('as', toolChain,
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000127 Tool.eFlagsPipedInput)
Daniel Dunbara5677512009-01-05 19:53:30 +0000128
129 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000130 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000131 assert len(inputs) == 1
132 assert outputType is Types.ObjectType
133
134 input = inputs[0]
135
136 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000137
Daniel Dunbar76290532009-01-13 06:25:31 +0000138 # Bit of a hack, this is only used for original inputs.
139 if input.isOriginalInput():
140 if arglist.getLastArg(arglist.parser.gGroup):
141 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000142
143 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000144 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000145 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000146 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000147 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
148 arglist.getLastArg(arglist.parser.staticOption) or
149 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000150 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000151 cmd_args.append('-static')
152
153 for arg in arglist.getArgs2(arglist.parser.WaOption,
154 arglist.parser.XassemblerOption):
155 cmd_args.extend(arglist.getValues(arg))
156
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000157 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000158 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000159 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000160 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000161 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000162
163 # asm_final spec is empty.
164
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000165 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
166 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000167
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000168class Clang_CompileTool(Tool):
Daniel Dunbarde388a52009-01-21 01:07:49 +0000169 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000170 super(Clang_CompileTool, self).__init__('clang', toolChain,
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000171 (Tool.eFlagsPipedInput |
172 Tool.eFlagsPipedOutput |
173 Tool.eFlagsIntegratedCPP))
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000174
175 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000176 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000177 cmd_args = []
178
Daniel Dunbarde388a52009-01-21 01:07:49 +0000179 if isinstance(phase.phase, Phases.AnalyzePhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000180 assert outputType is Types.PlistType
Daniel Dunbarde388a52009-01-21 01:07:49 +0000181 cmd_args.append('-analyze')
182 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000183 assert outputType is Types.NothingType
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args.append('-fsyntax-only')
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000185 elif outputType is Types.LLVMAsmType:
186 cmd_args.append('-emit-llvm')
187 elif outputType is Types.LLVMBCType:
188 cmd_args.append('-emit-llvm-bc')
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000189 elif outputType is Types.AsmTypeNoPP:
190 cmd_args.append('-S')
Daniel Dunbar350b5d42009-01-29 23:54:06 +0000191 elif (inputs[0].type.preprocess and
192 outputType is inputs[0].type.preprocess):
193 cmd_args.append('-E')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000194 elif outputType is Types.PCHType:
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000195 # No special option needed, driven by -x.
196 #
197 # FIXME: Don't drive this by -x, that is gross.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000198
199 # FIXME: This is a total hack. Copy the input header file
200 # to the output, so that it can be -include'd by clang.
201 assert len(inputs) == 1
202 assert not isinstance(output, Jobs.PipedJob)
203 assert not isinstance(inputs[0].source, Jobs.PipedJob)
204 inputPath = arglist.getValue(inputs[0].source)
205 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
206 os.path.basename(inputPath))
207 # Only do copy when the output doesn't exist.
208 if not os.path.exists(outputPath):
209 import shutil
210 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000211 else:
212 raise ValueError,"Unexpected output type for clang tool."
213
Daniel Dunbar87a7b282009-02-17 18:07:00 +0000214 # The make clang go fast button.
215 cmd_args.append('-disable-free')
216
Daniel Dunbarde388a52009-01-21 01:07:49 +0000217 if isinstance(phase.phase, Phases.AnalyzePhase):
218 # Add default argument set.
219 #
220 # FIXME: Move into clang?
221 cmd_args.extend(['-warn-dead-stores',
222 '-checker-cfref',
223 '-warn-objc-methodsigs',
224 '-warn-objc-missing-dealloc',
225 '-warn-objc-unused-ivars'])
226
Ted Kremenekbe1fe1e2009-02-17 04:27:41 +0000227 cmd_args.append('-analyzer-output=plist')
Daniel Dunbarde388a52009-01-21 01:07:49 +0000228
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000229 # Add -Xanalyzer arguments when running as analyzer.
230 for arg in arglist.getArgs(arglist.parser.XanalyzerOption):
231 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000232 else:
233 # Perform argument translation for LLVM backend. This
Daniel Dunbar6262cc42009-01-27 20:42:58 +0000234 # takes some care in reconciling with llvm-gcc. The
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000235 # issue is that llvm-gcc translates these options based on
236 # the values in cc1, whereas we are processing based on
237 # the driver arguments.
238 #
239 # FIXME: This is currently broken for -f flags when -fno
240 # variants are present.
241
242 # This comes from the default translation the driver + cc1
243 # would do to enable flag_pic.
244 #
245 # FIXME: Centralize this code.
246 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
247 arglist.getLastArg(arglist.parser.f_picOption) or
248 arglist.getLastArg(arglist.parser.f_PIEOption) or
249 arglist.getLastArg(arglist.parser.f_pieOption) or
250 (not arglist.getLastArg(arglist.parser.m_kernelOption) and
251 not arglist.getLastArg(arglist.parser.staticOption) and
252 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)))
253
Daniel Dunbar2d43e3b2009-01-29 06:12:22 +0000254 # FIXME: This needs to tie into a platform hook.
255 if arch:
256 archName = arglist.getValue(arch)
257 if (archName == 'x86_64' or
258 picEnabled):
259 cmd_args.append('--relocation-model=pic')
260 elif not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
261 cmd_args.append('--relocation-model=static')
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000262
263 if arglist.getLastArg(arglist.parser.f_timeReportOption):
264 cmd_args.append('--time-passes')
265 # FIXME: Set --enable-unsafe-fp-math.
266 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
267 cmd_args.append('--disable-fp-elim')
268 if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption):
269 cmd_args.append('--nozero-initialized-in-bss')
270 if arglist.getLastArg(arglist.parser.dAOption):
271 cmd_args.append('--asm-verbose')
272 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
273 cmd_args.append('--debug-pass=Structure')
274 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
275 cmd_args.append('--debug-pass=Arguments')
276 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
277 if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
278 cmd_args.append('--unwind-tables')
279
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000280 if arglist.hasFFlag(arglist.parser.f_mathErrnoOption,
281 arglist.parser.f_noMathErrnoOption,
282 self.toolChain.isMathErrnoDefault()):
283 cmd_args.append('--fmath-errno=1')
284 else:
285 cmd_args.append('--fmath-errno=0')
286
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000287 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
288 if arg:
289 cmd_args.append('--limit-float-precision')
290 cmd_args.append(arglist.getValue(arg))
291
292 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbarde388a52009-01-21 01:07:49 +0000293
Daniel Dunbard563e522009-02-17 19:02:12 +0000294 arglist.addLastArg(cmd_args, arglist.parser.MDOption)
295 arglist.addLastArg(cmd_args, arglist.parser.MMDOption)
296 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
297 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
298 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
299
300 unsupported = (arglist.getLastArg(arglist.parser.MOption) or
301 arglist.getLastArg(arglist.parser.MMOption) or
302 arglist.getLastArg(arglist.parser.MGOption) or
303 arglist.getLastArg(arglist.parser.MQOption))
304 if unsupported:
305 raise NotImplementedError('clang support for "%s"' % unsupported.opt.name)
306
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000307 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000308 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000309 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar41577f12009-02-15 05:59:37 +0000310 arglist.addLastArg(cmd_args, arglist.parser.POption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000311 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
312
313 # Special case debug options to only pass -g to clang. This is
314 # wrong.
315 if arglist.getLastArg(arglist.parser.gGroup):
316 cmd_args.append('-g')
317
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000318 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
319
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000320 # FIXME: Clang isn't going to accept just anything here.
321 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
322
Daniel Dunbarf0846632009-02-19 22:01:23 +0000323 # Automatically load .pth or .gch files which match -include
324 # options. It's wonky, but we include looking for .gch so we
325 # can support seamless replacement into a build system already
326 # set up to be generating .gch files.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000327 for arg in arglist.getArgs(arglist.parser.includeOption):
Daniel Dunbarf0846632009-02-19 22:01:23 +0000328 for suffix in ('.pth','.gch'):
329 pthPath = arglist.getValue(arg) + suffix
330 if os.path.exists(pthPath):
331 cmd_args.append('-token-cache')
332 cmd_args.append(pthPath)
333 break
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000334
Mike Stumpb55cc632009-01-30 08:22:07 +0000335 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000336
Daniel Dunbarc1212a32009-02-05 02:43:38 +0000337 # Manually translate -O to -O1; let clang reject others.
338 arg = arglist.getLastArg(arglist.parser.OOption)
339 if arg:
340 if arglist.getValue(arg) == '':
341 cmd_args.append('-O1')
342 else:
343 cmd_args.extend(arglist.render(arg))
344
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000345 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
346 arglist.addLastArg(cmd_args, arglist.parser.wOption)
347 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
348
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000349 arglist.addAllArgs(cmd_args, arglist.parser.Clang_fGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000350
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000351 arglist.addLastArg(cmd_args, arglist.parser.dMOption)
352
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000353 for arg in arglist.getArgs(arglist.parser.XclangOption):
354 cmd_args.extend(arglist.getValues(arg))
355
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000356 if arch is not None:
357 cmd_args.extend(arglist.render(arch))
358
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000359 if isinstance(output, Jobs.PipedJob):
360 cmd_args.extend(['-o', '-'])
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000361 elif output:
362 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000363
364 for input in inputs:
365 cmd_args.append('-x')
366 cmd_args.append(input.type.name)
367 if isinstance(input.source, Jobs.PipedJob):
368 cmd_args.append('-')
369 else:
370 cmd_args.extend(arglist.renderAsInput(input.source))
371
Daniel Dunbar768be1c2009-01-21 02:03:52 +0000372 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
373 cmd_args))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000374
Daniel Dunbar06172d62009-01-20 00:47:24 +0000375class Darwin_X86_CC1Tool(Tool):
376 def getCC1Name(self, type):
377 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000378
Daniel Dunbar06172d62009-01-20 00:47:24 +0000379 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000380 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000381 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000382 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000383 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000384 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000385 return 'cc1obj',True,False
Daniel Dunbar2910dfa2009-01-23 00:04:43 +0000386 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000387 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000388 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000389 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000390 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000391 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000392 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000393 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000394 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000395 return 'cc1objplus',False,True
396 else:
397 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000398
399 def addCC1Args(self, cmd_args, arch, arglist):
400 # Derived from cc1 spec.
401
402 # FIXME: -fapple-kext seems to disable this too. Investigate.
403 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
404 not arglist.getLastArg(arglist.parser.staticOption) and
405 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
406 cmd_args.append('-fPIC')
407
408 # FIXME: Remove mthumb
409 # FIXME: Remove mno-thumb
410
411 # FIXME: As with ld, something else is going on. My best guess
412 # is gcc is faking an -mmacosx-version-min
413 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000414# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
415# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
416# cmd_args.append('-mmacosx-version-min=' +
417# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000418
419 # FIXME: Remove faltivec
420 # FIXME: Remove mno-fused-madd
421 # FIXME: Remove mlong-branch
422 # FIXME: Remove mlongcall
423 # FIXME: Remove mcpu=G4
424 # FIXME: Remove mcpu=G5
425
Daniel Dunbar105132e2009-01-16 21:07:21 +0000426 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000427 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
428 cmd_args.append('-feliminate-unused-debug-symbols')
429
Daniel Dunbar06172d62009-01-20 00:47:24 +0000430 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000431 # Derived from cc1_options spec.
432 if (arglist.getLastArg(arglist.parser.fastOption) or
433 arglist.getLastArg(arglist.parser.fastfOption) or
434 arglist.getLastArg(arglist.parser.fastcpOption)):
435 cmd_args.append('-O3')
436
437 if (arglist.getLastArg(arglist.parser.pgOption) and
438 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000439 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000440
Daniel Dunbardff9f502009-01-12 18:51:02 +0000441 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000442
443 if not arglist.getLastArg(arglist.parser.QOption):
444 cmd_args.append('-quiet')
445
446 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000447 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000448
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000449 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000450
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000451 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
452 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000453
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000454 # FIXME: The goal is to use the user provided -o if that is
455 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000456 # name. Find a clean way to go about this.
457 if (arglist.getLastArg(arglist.parser.cOption) or
458 arglist.getLastArg(arglist.parser.SOption)):
459 outputOpt = arglist.getLastArg(arglist.parser.oOption)
460 if outputOpt:
461 cmd_args.append('-auxbase-strip')
462 cmd_args.append(arglist.getValue(outputOpt))
463 else:
464 cmd_args.append('-auxbase')
465 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000466 else:
467 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000468 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000469
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000470 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000471
Daniel Dunbar816dd502009-01-12 17:53:19 +0000472 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
473 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000474 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000475 arglist.addLastArg(cmd_args, arglist.parser.wOption)
476 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
477 if arglist.getLastArg(arglist.parser.vOption):
478 cmd_args.append('-version')
479 if arglist.getLastArg(arglist.parser.pgOption):
480 cmd_args.append('-p')
481 arglist.addLastArg(cmd_args, arglist.parser.pOption)
482
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000483 # ccc treats -fsyntax-only specially.
484 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
485 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000486 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000487
Daniel Dunbar06172d62009-01-20 00:47:24 +0000488 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000489 if arglist.getLastArg(arglist.parser.QnOption):
490 cmd_args.append('-fno-ident')
491
492 # FIXME: This isn't correct.
493 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
494 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
495
Daniel Dunbar06172d62009-01-20 00:47:24 +0000496 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000497 cmd_args.extend(output_args)
498
Daniel Dunbar816dd502009-01-12 17:53:19 +0000499 # FIXME: Still don't get what is happening here. Investigate.
500 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
501
502 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
503 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
504 cmd_args.append('-fno-builtin')
505 cmd_args.append('-fno-merge-constants')
506
507 if arglist.getLastArg(arglist.parser.coverageOption):
508 cmd_args.append('-fprofile-arcs')
509 cmd_args.append('-ftest-coverage')
510
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000511 if isCXX:
512 cmd_args.append('-D__private_extern__=extern')
513
Daniel Dunbar06172d62009-01-20 00:47:24 +0000514 def getBaseInputName(self, inputs, arglist):
515 # FIXME: gcc uses a temporary name here when the base
516 # input is stdin, but only in auxbase. Investigate.
517 baseInputValue = arglist.getValue(inputs[0].baseInput)
518 return os.path.basename(baseInputValue)
519
520 def getBaseInputStem(self, inputs, arglist):
521 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
522
523 def getOutputArgs(self, arglist, output, isCPP=False):
524 if isinstance(output, Jobs.PipedJob):
525 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000526 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000527 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000528 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000529 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000530 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000531 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000532 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000533
534 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
535 output_args, isCXX):
536 # Derived from cpp_options.
537 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
538
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000539 cmd_args.extend(output_args)
540
Daniel Dunbar06172d62009-01-20 00:47:24 +0000541 self.addCC1Args(cmd_args, arch, arglist)
542
543 # NOTE: The code below has some commonality with cpp_options,
544 # but in classic gcc style ends up sending things in different
545 # orders. This may be a good merge candidate once we drop
546 # pedantic compatibility.
547
548 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
549 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
550 arglist.parser.ansiOption,
551 arglist.parser.trigraphsOption)
552 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
553 arglist.parser.pedanticGroup)
554 arglist.addLastArg(cmd_args, arglist.parser.wOption)
555
556 # ccc treats -fsyntax-only specially.
557 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
558 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000559 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000560
561 if (arglist.getLastArg(arglist.parser.gGroup) and
562 not arglist.getLastArg(arglist.parser.g0Option) and
563 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
564 cmd_args.append('-fworking-directory')
565
566 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
567 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
568 if arglist.getLastArg(arglist.parser.saveTempsOption):
569 cmd_args.append('-fpch-preprocess')
570
571 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
572 # Derived from cpp_unique_options.
573
574 if (arglist.getLastArg(arglist.parser.COption) or
575 arglist.getLastArg(arglist.parser.CCOption)):
576 if not arglist.getLastArg(arglist.parser.EOption):
577 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
578 if not arglist.getLastArg(arglist.parser.QOption):
579 cmd_args.append('-quiet')
580 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
581 arglist.addLastArg(cmd_args, arglist.parser.vOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000582 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000583 arglist.addLastArg(cmd_args, arglist.parser.POption)
584
585 # FIXME: Handle %I properly.
586 if arglist.getValue(arch) == 'x86_64':
587 cmd_args.append('-imultilib')
588 cmd_args.append('x86_64')
589
590 if arglist.getLastArg(arglist.parser.MDOption):
591 cmd_args.append('-MD')
592 # FIXME: Think about this more.
593 outputOpt = arglist.getLastArg(arglist.parser.oOption)
594 if outputOpt:
595 base,ext = os.path.splitext(arglist.getValue(outputOpt))
596 cmd_args.append(base+'.d')
597 else:
598 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
599 if arglist.getLastArg(arglist.parser.MMDOption):
600 cmd_args.append('-MMD')
601 # FIXME: Think about this more.
602 outputOpt = arglist.getLastArg(arglist.parser.oOption)
603 if outputOpt:
604 base,ext = os.path.splitext(arglist.getValue(outputOpt))
605 cmd_args.append(base+'.d')
606 else:
607 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
608 arglist.addLastArg(cmd_args, arglist.parser.MOption)
609 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
610 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
611 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
612 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
613 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
614 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
615 if (not arglist.getLastArg(arglist.parser.MOption) and
616 not arglist.getLastArg(arglist.parser.MMOption) and
617 (arglist.getLastArg(arglist.parser.MDOption) or
618 arglist.getLastArg(arglist.parser.MMDOption))):
619 outputOpt = arglist.getLastArg(arglist.parser.oOption)
620 if outputOpt:
621 cmd_args.append('-MQ')
622 cmd_args.append(arglist.getValue(outputOpt))
623
624 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
625 if arglist.getLastArg(arglist.parser.g3Option):
626 cmd_args.append('-dD')
627 arglist.addLastArg(cmd_args, arglist.parser.HOption)
628
629 self.addCPPArgs(cmd_args, arch, arglist)
630
631 arglist.addAllArgs3(cmd_args,
632 arglist.parser.DOption,
633 arglist.parser.UOption,
634 arglist.parser.AOption)
635
636 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
637
638 for input in inputs:
639 if isinstance(input.source, Jobs.PipedJob):
640 cmd_args.append('-')
641 else:
642 cmd_args.extend(arglist.renderAsInput(input.source))
643
644 for arg in arglist.getArgs2(arglist.parser.WpOption,
645 arglist.parser.XpreprocessorOption):
646 cmd_args.extend(arglist.getValues(arg))
647
648 if arglist.getLastArg(arglist.parser.f_mudflapOption):
649 cmd_args.append('-D_MUDFLAP')
650 cmd_args.append('-include')
651 cmd_args.append('mf-runtime.h')
652
653 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
654 cmd_args.append('-D_MUDFLAP')
655 cmd_args.append('-D_MUDFLAPTH')
656 cmd_args.append('-include')
657 cmd_args.append('mf-runtime.h')
658
659 def addCPPArgs(self, cmd_args, arch, arglist):
660 # Derived from cpp spec.
661
662 if arglist.getLastArg(arglist.parser.staticOption):
663 # The gcc spec is broken here, it refers to dynamic but
664 # that has been translated. Start by being bug compatible.
665
666 # if not arglist.getLastArg(arglist.parser.dynamicOption):
667 cmd_args.append('-D__STATIC__')
668 else:
669 cmd_args.append('-D__DYNAMIC__')
670
671 if arglist.getLastArg(arglist.parser.pthreadOption):
672 cmd_args.append('-D_REENTRANT')
673
674class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
675 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000676 super(Darwin_X86_PreprocessTool, self).__init__('cpp', toolChain,
Daniel Dunbar06172d62009-01-20 00:47:24 +0000677 (Tool.eFlagsPipedInput |
678 Tool.eFlagsPipedOutput))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000679
680 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000681 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000682 inputType = inputs[0].type
683 assert not [i for i in inputs if i.type != inputType]
684
685 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
686
687 cmd_args = ['-E']
688 if (arglist.getLastArg(arglist.parser.traditionalOption) or
689 arglist.getLastArg(arglist.parser.f_traditionalOption) or
690 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
691 cmd_args.append('-traditional-cpp')
692
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000693 output_args = self.getOutputArgs(arglist, output,
694 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000695 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000696 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000697
698 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
699
700 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
701 cmd_args))
702
703class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
704 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000705 super(Darwin_X86_CompileTool, self).__init__('cc1', toolChain,
Daniel Dunbar06172d62009-01-20 00:47:24 +0000706 (Tool.eFlagsPipedInput |
707 Tool.eFlagsPipedOutput |
708 Tool.eFlagsIntegratedCPP))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000709
710 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000711 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000712 inputType = inputs[0].type
713 assert not [i for i in inputs if i.type != inputType]
714
715 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
716
717 cmd_args = []
718 if (arglist.getLastArg(arglist.parser.traditionalOption) or
719 arglist.getLastArg(arglist.parser.f_traditionalOption)):
720 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
721
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000722 if outputType is Types.PCHType:
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000723 pass
724 elif outputType is Types.AsmTypeNoPP:
725 pass
726 elif outputType is Types.LLVMAsmType:
727 cmd_args.append('-emit-llvm')
728 elif outputType is Types.LLVMBCType:
729 cmd_args.append('-emit-llvm-bc')
730
731 if outputType is Types.PCHType:
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000732 output_args = []
733 else:
734 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000735
736 # There is no need for this level of compatibility, but it
737 # makes diffing easier.
738 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
739 not arglist.getLastArg(arglist.parser.SOption)):
740 early_output_args, end_output_args = [], output_args
741 else:
742 early_output_args, end_output_args = output_args, []
743
Daniel Dunbar06172d62009-01-20 00:47:24 +0000744 if usePP:
745 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
746 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
747 early_output_args, isCXX)
748 cmd_args.extend(end_output_args)
749 else:
750 cmd_args.append('-fpreprocessed')
751
752 # FIXME: There is a spec command to remove
753 # -fpredictive-compilation args here. Investigate.
754
755 for input in inputs:
756 if isinstance(input.source, Jobs.PipedJob):
757 cmd_args.append('-')
758 else:
759 cmd_args.extend(arglist.renderAsInput(input.source))
760
761 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
762 early_output_args, isCXX)
763 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000764
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000765 if outputType is Types.PCHType:
766 assert output is not None and not isinstance(output, Jobs.PipedJob)
767
768 cmd_args.append('-o')
769 # NOTE: gcc uses a temp .s file for this, but there
770 # doesn't seem to be a good reason.
771 cmd_args.append('/dev/null')
772
773 cmd_args.append('--output-pch=')
774 cmd_args.append(arglist.getValue(output))
775
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000776 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
777 cmd_args))
778
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000779class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000780 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000781 super(Darwin_X86_LinkTool, self).__init__('collect2', toolChain)
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000782
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000783 def getMacosxVersionTuple(self, arglist):
784 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
785 if arg:
786 version = arglist.getValue(arg)
787 components = version.split('.')
788 try:
789 return tuple(map(int, components))
790 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000791 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000792 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000793 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000794 return (10, major-4, minor)
795
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000796 def addDarwinArch(self, cmd_args, arch, arglist):
797 # Derived from darwin_arch spec.
798 cmd_args.append('-arch')
799 # FIXME: The actual spec uses -m64 for this, but we want to
800 # respect arch. Figure out what exactly gcc is doing.
801 #if arglist.getLastArg(arglist.parser.m_64Option):
802 if arglist.getValue(arch) == 'x86_64':
803 cmd_args.append('x86_64')
804 else:
805 cmd_args.append('i386')
806
807 def addDarwinSubArch(self, cmd_args, arch, arglist):
808 # Derived from darwin_subarch spec, not sure what the
809 # distinction exists for but at least for this chain it is the same.
810 return self.addDarwinArch(cmd_args, arch, arglist)
811
812 def addLinkArgs(self, cmd_args, arch, arglist):
813 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000814 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
815 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000816 cmd_args.append('-dynamic')
817 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
818 # FIXME: Replace -lobjc in forward args with
819 # -lobjc-gnu. How do we wish to handle such things?
820 pass
821
Daniel Dunbar470104e2009-01-17 00:53:19 +0000822 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
823 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000824 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000825 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000826 else:
827 self.addDarwinSubArch(cmd_args, arch, arglist)
828
Daniel Dunbar470104e2009-01-17 00:53:19 +0000829 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000830 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000831 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000832 '-bundle_loader')
833 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
834 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
835 # FIXME: Where should diagnostics go?
836 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
837 sys.exit(1)
838 if arglist.getLastArg(arglist.parser.current_versionOption):
839 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
840 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000841 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000842 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000843 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000844 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
845 sys.exit(1)
846 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
847 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
848 else:
849 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000850 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000851 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
852 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000853 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000854 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
855 sys.exit(1)
856 if arglist.getLastArg(arglist.parser.client_nameOption):
857 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
858 sys.exit(1)
859 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
860 '-dylib_compatibility_version')
861 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
862 '-dylib_current_version')
863
Daniel Dunbar470104e2009-01-17 00:53:19 +0000864 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000865 self.addDarwinArch(cmd_args, arch, arglist)
866 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
867 else:
868 self.addDarwinSubArch(cmd_args, arch, arglist)
869
Daniel Dunbar470104e2009-01-17 00:53:19 +0000870 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000871 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
872 sys.exit(1)
873
Daniel Dunbar470104e2009-01-17 00:53:19 +0000874 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000875 '-dylib_install_name')
876
877 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
878 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
879 sys.exit(1)
880 if arglist.getLastArg(arglist.parser.private_bundleOption):
881 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
882 sys.exit(1)
883
Daniel Dunbar470104e2009-01-17 00:53:19 +0000884 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000885 cmd_args.append('-all_load')
886
Daniel Dunbar470104e2009-01-17 00:53:19 +0000887 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000888 '-allowable_client')
889
Daniel Dunbar470104e2009-01-17 00:53:19 +0000890 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000891 cmd_args.append('-bind_at_load')
892
Daniel Dunbar470104e2009-01-17 00:53:19 +0000893 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000894 cmd_args.append('-dead_strip')
895
Daniel Dunbar470104e2009-01-17 00:53:19 +0000896 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000897 cmd_args.append('-no_dead_strip_inits_and_terms')
898
Daniel Dunbar470104e2009-01-17 00:53:19 +0000899 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000900 '-dylib_file')
901
Daniel Dunbar470104e2009-01-17 00:53:19 +0000902 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000903 cmd_args.append('-dynamic')
904
Daniel Dunbar470104e2009-01-17 00:53:19 +0000905 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000906 '-exported_symbols_list')
907
Daniel Dunbar470104e2009-01-17 00:53:19 +0000908 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000909 cmd_args.append('-flat_namespace')
910
911 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000912 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000913 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000914 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000915 '-init')
916
917 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
918 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
919 # FIXME: I don't understand what is going on
920 # here. This is supposed to come from
921 # darwin_ld_minversion, but gcc doesn't seem to be
922 # following that; it must be getting over-ridden
923 # somewhere.
924 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000925 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000926 else:
927 # addAll doesn't make sense here but this is what gcc
928 # does.
929 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
930 '-macosx_version_min')
931
932 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
933 '-iphoneos_version_min')
934 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
935
Daniel Dunbar470104e2009-01-17 00:53:19 +0000936 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000937 cmd_args.append('-multi_module')
938
Daniel Dunbar470104e2009-01-17 00:53:19 +0000939 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000940 cmd_args.append('-single_module')
941
Daniel Dunbar470104e2009-01-17 00:53:19 +0000942 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000943 '-multiply_defined')
944
Daniel Dunbar470104e2009-01-17 00:53:19 +0000945 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000946 '-multiply_defined_unused')
947
948 if arglist.getLastArg(arglist.parser.f_pieOption):
949 cmd_args.append('-pie')
950
951 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
952 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
953 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
954 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
955 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
956 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
957 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
958 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
959 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000960 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000961 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000962 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000963 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000964 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000965 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000966 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000967 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000968 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
969 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000970 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
971 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
972 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
973 '-syslibroot')
974 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
975 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000976 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000977 '-umbrella')
978 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000979 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000980 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000981 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000982 '-weak_reference_mismatches')
983
Daniel Dunbar470104e2009-01-17 00:53:19 +0000984 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000985 cmd_args.append('-weak_reference_mismatches')
986 cmd_args.append('non-weak')
987
988 arglist.addLastArg(cmd_args, arglist.parser.XOption)
989 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
990 arglist.addLastArg(cmd_args, arglist.parser.wOption)
991 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
992 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
993 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
994 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
995 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
996 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
997 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
998 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
999 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
1000 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
1001 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
1002 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +00001003
1004 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001005 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001006 assert outputType is Types.ImageType
1007
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001008 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001009 # comes from specs (starting with link_command). Consult gcc
1010 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001011
1012 # FIXME: gcc's spec controls when this is done; certain things
1013 # like -filelist or -Wl, still trigger a link stage. I don't
1014 # quite understand how gcc decides to execute the linker,
1015 # investigate. Also, the spec references -fdump= which seems
1016 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +00001017 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001018
1019 # Not sure why this particular decomposition exists in gcc.
1020 self.addLinkArgs(cmd_args, arch, arglist)
1021
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001022 # This toolchain never accumlates options in specs, the only
1023 # place this gets used is to add -ObjC.
1024 if (arglist.getLastArg(arglist.parser.ObjCOption) or
1025 arglist.getLastArg(arglist.parser.f_objcOption)):
1026 cmd_args.append('-ObjC')
1027 if arglist.getLastArg(arglist.parser.ObjCXXOption):
1028 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001029
1030 # FIXME: gcc has %{x} in here. How could this ever happen?
1031 # Cruft?
Daniel Dunbarb644be32009-01-23 00:39:52 +00001032 arglist.addAllArgs(cmd_args, arglist.parser.dOption)
1033 arglist.addAllArgs(cmd_args, arglist.parser.sOption)
1034 arglist.addAllArgs(cmd_args, arglist.parser.tOption)
1035 arglist.addAllArgs(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +00001036 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001037 arglist.addAllArgs(cmd_args, arglist.parser.AOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001038 arglist.addLastArg(cmd_args, arglist.parser.eOption)
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001039 arglist.addAllArgs(cmd_args, arglist.parser.mSeparate)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001040 arglist.addAllArgs(cmd_args, arglist.parser.rOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001041
1042 cmd_args.extend(arglist.render(output))
1043
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001044 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001045 if (not arglist.getLastArg(arglist.parser.AOption) and
1046 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1047 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1048 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +00001049 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001050 # Derived from darwin_dylib1 spec.
1051 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1052 cmd_args.append('-ldylib1.o')
1053 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001054 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001055 cmd_args.append('-ldylib1.o')
1056 else:
1057 cmd_args.append('-ldylib1.10.5.o')
1058 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +00001059 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001060 if not arglist.getLastArg(arglist.parser.staticOption):
1061 cmd_args.append('-lbundle1.o')
1062 else:
1063 if arglist.getLastArg(arglist.parser.pgOption):
1064 if arglist.getLastArg(arglist.parser.staticOption):
1065 cmd_args.append('-lgcrt0.o')
1066 else:
1067 if arglist.getLastArg(arglist.parser.objectOption):
1068 cmd_args.append('-lgcrt0.o')
1069 else:
1070 if arglist.getLastArg(arglist.parser.preloadOption):
1071 cmd_args.append('-lgcrt0.o')
1072 else:
1073 cmd_args.append('-lgcrt1.o')
1074
1075 # darwin_crt2 spec is empty.
1076 pass
1077 else:
1078 if arglist.getLastArg(arglist.parser.staticOption):
1079 cmd_args.append('-lcrt0.o')
1080 else:
1081 if arglist.getLastArg(arglist.parser.objectOption):
1082 cmd_args.append('-lcrt0.o')
1083 else:
1084 if arglist.getLastArg(arglist.parser.preloadOption):
1085 cmd_args.append('-lcrt0.o')
1086 else:
1087 # Derived from darwin_crt1 spec.
1088 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1089 cmd_args.append('-lcrt1.o')
1090 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001091 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001092 cmd_args.append('-lcrt1.o')
1093 else:
1094 cmd_args.append('-lcrt1.10.5.o')
1095
1096 # darwin_crt2 spec is empty.
1097 pass
1098
1099 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1100 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001101 if macosxVersion < (10,5):
Daniel Dunbar70230822009-01-21 17:18:19 +00001102 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001103
1104 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1105
1106 if arglist.getLastArg(arglist.parser.f_openmpOption):
1107 # This is more complicated in gcc...
1108 cmd_args.append('-lgomp')
1109
1110 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001111 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001112 if arglist.getValue(arch) == 'x86_64':
1113 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1114 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1115 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1116 "-L/usr/lib/gcc/%s" % tcDir,
1117 "-L/usr/lib/gcc/%s" % tcDir,
1118 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1119 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001120
Daniel Dunbara5677512009-01-05 19:53:30 +00001121 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001122 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001123
Daniel Dunbar7c584962009-01-20 21:29:14 +00001124 if linkingOutput:
1125 cmd_args.append('-arch_multiple')
1126 cmd_args.append('-final_output')
1127 cmd_args.append(arglist.getValue(linkingOutput))
1128
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001129 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1130 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1131 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1132 arglist.getLastArg(arglist.parser.coverageOption)):
1133 cmd_args.append('-lgcov')
1134
1135 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1136 cmd_args.append('-allow_stack_execute')
1137
1138 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1139 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1140 # link_ssp spec is empty.
1141
1142 # Derived from libgcc spec.
1143 if arglist.getLastArg(arglist.parser.staticOption):
1144 cmd_args.append('-lgcc_static')
1145 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1146 cmd_args.append('-lgcc_eh')
1147 cmd_args.append('-lgcc')
1148 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1149 # Derived from darwin_iphoneos_libgcc spec.
1150 cmd_args.append('-lgcc_s.10.5')
1151 cmd_args.append('-lgcc')
1152 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1153 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1154 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001155 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001156 cmd_args.append('-lgcc_s.10.4')
1157 else:
1158 cmd_args.append('-lgcc_s.10.5')
1159 cmd_args.append('-lgcc')
1160 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001161 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001162 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001163 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001164 cmd_args.append('-lgcc_s.10.5')
1165 cmd_args.append('-lgcc')
1166
1167 # Derived from lib spec.
1168 if not arglist.getLastArg(arglist.parser.staticOption):
1169 cmd_args.append('-lSystem')
1170
1171 if (not arglist.getLastArg(arglist.parser.AOption) and
1172 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1173 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1174 # endfile_spec is empty.
1175 pass
1176
1177 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1178 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1179
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001180 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1181 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001182
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001183 if (arglist.getLastArg(arglist.parser.gGroup) and
1184 not arglist.getLastArg(arglist.parser.gstabsOption) and
1185 not arglist.getLastArg(arglist.parser.g0Option)):
1186 # FIXME: This is gross, but matches gcc. The test only
1187 # considers the suffix (not the -x type), and then only of the
1188 # first input.
1189 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1190 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1191 '.c++','.cxx','.CPP','.m','.mm'):
1192 jobs.addJob(Jobs.Command('dsymutil',
1193 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001194
Daniel Dunbara5677512009-01-05 19:53:30 +00001195class LipoTool(Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +00001196 def __init__(self, toolChain):
1197 super(LipoTool, self).__init__('lipo', toolChain)
Daniel Dunbara5677512009-01-05 19:53:30 +00001198
1199 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001200 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001201 assert outputType is Types.ImageType
1202
Daniel Dunbardb439902009-01-07 18:40:45 +00001203 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001204 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001205 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001206 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001207 jobs.addJob(Jobs.Command('lipo', cmd_args))