blob: f4b8683837e18d59df6a2121c225a047d956d1bd [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 Dunbara8051352009-02-20 01:48:01 +000040
41 # If using a driver driver, force the arch.
42 if self.toolChain.driver.hostInfo.useDriverDriver():
43 # FIXME: Remove this branch once ok.
44 cmd_args.append('-arch')
45 cmd_args.append(self.toolChain.archName)
46
Daniel Dunbara5677512009-01-05 19:53:30 +000047 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000048 cmd_args.extend(['-o', '-'])
Daniel Dunbarde388a52009-01-21 01:07:49 +000049 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbardb439902009-01-07 18:40:45 +000050 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000051 else:
Daniel Dunbarde388a52009-01-21 01:07:49 +000052 assert output
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000053 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000054
Daniel Dunbar7c584962009-01-20 21:29:14 +000055 if (isinstance(self, GCC_LinkTool) and
56 linkingOutput):
57 cmd_args.append('-Wl,-arch_multiple')
58 cmd_args.append('-Wl,-final_output,' +
59 arglist.getValue(linkingOutput))
60
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000061 # Only pass -x if gcc will understand it; otherwise hope gcc
62 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000063 # would go wrong in is for linker inputs if they happened to
64 # have an odd suffix; really the only way to get this to
65 # happen is a command like '-x foobar a.c' which will treat
66 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000067 #
68 # FIXME: For the linker case specifically, can we safely
69 # convert inputs into '-Wl,' options?
70 for input in inputs:
71 if input.type.canBeUserSpecified:
72 cmd_args.extend(['-x', input.type.name])
73
74 if isinstance(input.source, Jobs.PipedJob):
75 cmd_args.append('-')
76 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000077 assert isinstance(input.source, Arguments.Arg)
78 # If this is a linker input then assume we can forward
79 # just by rendering.
80 if input.source.opt.isLinkerInput:
81 cmd_args.extend(arglist.render(input.source))
82 else:
83 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000084
85 jobs.addJob(Jobs.Command('gcc', cmd_args))
86
87class GCC_PreprocessTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +000088 def __init__(self, toolChain):
89 super(GCC_PreprocessTool, self).__init__('gcc (cpp)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +000090 (Tool.eFlagsPipedInput |
91 Tool.eFlagsPipedOutput))
92
Daniel Dunbar7c584962009-01-20 21:29:14 +000093 def getGCCExtraArgs(self):
94 return ['-E']
Daniel Dunbara5677512009-01-05 19:53:30 +000095
96class GCC_CompileTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +000097 def __init__(self, toolChain):
98 super(GCC_CompileTool, self).__init__('gcc (cc1)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +000099 (Tool.eFlagsPipedInput |
100 Tool.eFlagsPipedOutput |
101 Tool.eFlagsIntegratedCPP))
102
Daniel Dunbar7c584962009-01-20 21:29:14 +0000103 def getGCCExtraArgs(self):
104 return ['-S']
Daniel Dunbara5677512009-01-05 19:53:30 +0000105
106class GCC_PrecompileTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000107 def __init__(self, toolChain):
108 super(GCC_PrecompileTool, self).__init__('gcc (pch)', toolChain,
Daniel Dunbara5677512009-01-05 19:53:30 +0000109 (Tool.eFlagsPipedInput |
110 Tool.eFlagsIntegratedCPP))
111
Daniel Dunbar7c584962009-01-20 21:29:14 +0000112 def getGCCExtraArgs(self):
113 return []
114
115class GCC_AssembleTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000116 def __init__(self, toolChain):
Daniel Dunbar48d0d612009-02-17 18:10:15 +0000117 # Assume that gcc will do any magic necessary to let the
118 # assembler take piped input.
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000119 super(GCC_AssembleTool, self).__init__('gcc (as)', toolChain,
Daniel Dunbar48d0d612009-02-17 18:10:15 +0000120 Tool.eFlagsPipedInput)
Daniel Dunbar7c584962009-01-20 21:29:14 +0000121
122 def getGCCExtraArgs(self):
123 return ['-c']
124
125class GCC_LinkTool(GCC_Common_Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000126 def __init__(self, toolChain):
127 super(GCC_LinkTool, self).__init__('gcc (ld)', toolChain)
Daniel Dunbara5677512009-01-05 19:53:30 +0000128
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000129class Darwin_AssembleTool(Tool):
130 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000131 super(Darwin_AssembleTool, self).__init__('as', toolChain,
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000132 Tool.eFlagsPipedInput)
Daniel Dunbara5677512009-01-05 19:53:30 +0000133
134 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000135 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000136 assert len(inputs) == 1
137 assert outputType is Types.ObjectType
138
139 input = inputs[0]
140
141 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000142
Daniel Dunbar76290532009-01-13 06:25:31 +0000143 # Bit of a hack, this is only used for original inputs.
144 if input.isOriginalInput():
145 if arglist.getLastArg(arglist.parser.gGroup):
146 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000147
148 # Derived from asm spec.
Daniel Dunbara8051352009-02-20 01:48:01 +0000149 cmd_args.append('-arch')
150 cmd_args.append(self.toolChain.archName)
151
Daniel Dunbardb439902009-01-07 18:40:45 +0000152 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000153 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
154 arglist.getLastArg(arglist.parser.staticOption) or
155 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000156 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000157 cmd_args.append('-static')
158
159 for arg in arglist.getArgs2(arglist.parser.WaOption,
160 arglist.parser.XassemblerOption):
161 cmd_args.extend(arglist.getValues(arg))
162
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000163 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000164 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000165 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000166 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000167 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000168
169 # asm_final spec is empty.
170
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000171 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
172 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000173
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000174class Clang_CompileTool(Tool):
Daniel Dunbarde388a52009-01-21 01:07:49 +0000175 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000176 super(Clang_CompileTool, self).__init__('clang', toolChain,
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000177 (Tool.eFlagsPipedInput |
178 Tool.eFlagsPipedOutput |
179 Tool.eFlagsIntegratedCPP))
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000180
181 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000182 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000183 cmd_args = []
184
Daniel Dunbarde388a52009-01-21 01:07:49 +0000185 if isinstance(phase.phase, Phases.AnalyzePhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000186 assert outputType is Types.PlistType
Daniel Dunbarde388a52009-01-21 01:07:49 +0000187 cmd_args.append('-analyze')
188 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000189 assert outputType is Types.NothingType
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000190 cmd_args.append('-fsyntax-only')
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000191 elif outputType is Types.LLVMAsmType:
192 cmd_args.append('-emit-llvm')
193 elif outputType is Types.LLVMBCType:
194 cmd_args.append('-emit-llvm-bc')
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000195 elif outputType is Types.AsmTypeNoPP:
Daniel Dunbar105e9d72009-03-11 23:07:54 +0000196 # FIXME: This is hackish, it would be better if we had the
197 # action instead of just looking at types.
198 assert len(inputs) == 1
199 if inputs[0].type is Types.AsmType:
200 cmd_args.append('-E')
201 else:
202 cmd_args.append('-S')
Daniel Dunbar350b5d42009-01-29 23:54:06 +0000203 elif (inputs[0].type.preprocess and
204 outputType is inputs[0].type.preprocess):
205 cmd_args.append('-E')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000206 elif outputType is Types.PCHType:
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000207 # No special option needed, driven by -x.
208 #
209 # FIXME: Don't drive this by -x, that is gross.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000210
211 # FIXME: This is a total hack. Copy the input header file
212 # to the output, so that it can be -include'd by clang.
213 assert len(inputs) == 1
214 assert not isinstance(output, Jobs.PipedJob)
215 assert not isinstance(inputs[0].source, Jobs.PipedJob)
216 inputPath = arglist.getValue(inputs[0].source)
217 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
218 os.path.basename(inputPath))
219 # Only do copy when the output doesn't exist.
220 if not os.path.exists(outputPath):
221 import shutil
222 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000223 else:
224 raise ValueError,"Unexpected output type for clang tool."
225
Daniel Dunbar87a7b282009-02-17 18:07:00 +0000226 # The make clang go fast button.
227 cmd_args.append('-disable-free')
228
Daniel Dunbarde388a52009-01-21 01:07:49 +0000229 if isinstance(phase.phase, Phases.AnalyzePhase):
230 # Add default argument set.
231 #
232 # FIXME: Move into clang?
233 cmd_args.extend(['-warn-dead-stores',
234 '-checker-cfref',
235 '-warn-objc-methodsigs',
Ted Kremenekd76c6a32009-02-25 21:08:30 +0000236 # Do not enable the missing -dealloc check.
237 # '-warn-objc-missing-dealloc',
Daniel Dunbarde388a52009-01-21 01:07:49 +0000238 '-warn-objc-unused-ivars'])
239
Ted Kremenekbe1fe1e2009-02-17 04:27:41 +0000240 cmd_args.append('-analyzer-output=plist')
Daniel Dunbarde388a52009-01-21 01:07:49 +0000241
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000242 # Add -Xanalyzer arguments when running as analyzer.
243 for arg in arglist.getArgs(arglist.parser.XanalyzerOption):
244 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000245 else:
246 # Perform argument translation for LLVM backend. This
Daniel Dunbar6262cc42009-01-27 20:42:58 +0000247 # takes some care in reconciling with llvm-gcc. The
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000248 # issue is that llvm-gcc translates these options based on
249 # the values in cc1, whereas we are processing based on
250 # the driver arguments.
251 #
252 # FIXME: This is currently broken for -f flags when -fno
253 # variants are present.
254
255 # This comes from the default translation the driver + cc1
256 # would do to enable flag_pic.
257 #
258 # FIXME: Centralize this code.
259 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
260 arglist.getLastArg(arglist.parser.f_picOption) or
261 arglist.getLastArg(arglist.parser.f_PIEOption) or
Daniel Dunbarc4556d12009-02-20 06:48:26 +0000262 arglist.getLastArg(arglist.parser.f_pieOption))
263 picDisabled = (arglist.getLastArg(arglist.parser.m_kernelOption) or
264 arglist.getLastArg(arglist.parser.staticOption))
Daniel Dunbar2b91d502009-02-20 20:52:47 +0000265 model = self.toolChain.getForcedPicModel()
266 if not model:
267 if arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
268 model = 'dynamic-no-pic'
269 elif picDisabled:
270 model = 'static'
271 elif picEnabled:
272 model = 'pic'
273 else:
274 model = self.toolChain.getDefaultRelocationModel()
Daniel Dunbarc4556d12009-02-20 06:48:26 +0000275 cmd_args.append('--relocation-model=%s' % model)
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000276
277 if arglist.getLastArg(arglist.parser.f_timeReportOption):
278 cmd_args.append('--time-passes')
279 # FIXME: Set --enable-unsafe-fp-math.
280 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
281 cmd_args.append('--disable-fp-elim')
Daniel Dunbar3639b4d2009-03-04 19:17:10 +0000282 if not arglist.hasFFlag(arglist.parser.f_zeroInitializedInBssOption,
283 arglist.parser.f_noZeroInitializedInBssOption,
284 True):
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000285 cmd_args.append('--nozero-initialized-in-bss')
286 if arglist.getLastArg(arglist.parser.dAOption):
287 cmd_args.append('--asm-verbose')
288 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
289 cmd_args.append('--debug-pass=Structure')
290 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
291 cmd_args.append('--debug-pass=Arguments')
292 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
Daniel Dunbar4311e452009-02-20 07:35:04 +0000293 cmd_args.append('--unwind-tables=%d' %
294 arglist.hasFFlag(arglist.parser.f_unwindTablesOption,
295 arglist.parser.f_noUnwindTablesOption,
296 self.toolChain.isUnwindTablesDefault()))
297 if not arglist.hasFFlag(arglist.parser.m_redZoneOption,
298 arglist.parser.m_noRedZoneOption,
299 True):
300 cmd_args.append('--disable-red-zone')
301 if arglist.hasFFlag(arglist.parser.m_softFloatOption,
302 arglist.parser.m_noSoftFloatOption,
303 False):
304 cmd_args.append('--soft-float')
305
306 # FIXME: Need target hooks.
307 if self.toolChain.driver.getHostSystemName() == 'darwin':
308 if self.toolChain.archName == 'x86_64':
309 cmd_args.append('--mcpu=core2')
310 elif self.toolChain.archName == 'i386':
311 cmd_args.append('--mcpu=yonah')
312 else:
313 pass
314
315 # FIXME: Ignores ordering
316 attrs = []
317 for pos,neg,flag in [(arglist.parser.m_mmxOption,
318 arglist.parser.m_noMmxOption,
319 'mmx'),
320 (arglist.parser.m_sseOption,
321 arglist.parser.m_noSseOption,
322 'sse'),
323 (arglist.parser.m_sse2Option,
324 arglist.parser.m_noSse2Option,
325 'sse2'),
326 (arglist.parser.m_sse3Option,
327 arglist.parser.m_noSse3Option,
328 'sse3'),
329 (arglist.parser.m_ssse3Option,
330 arglist.parser.m_noSsse3Option,
331 'ssse3'),
332 (arglist.parser.m_sse41Option,
333 arglist.parser.m_noSse41Option,
334 'sse41'),
335 (arglist.parser.m_sse42Option,
336 arglist.parser.m_noSse42Option,
337 'sse42'),
338 (arglist.parser.m_sse4aOption,
339 arglist.parser.m_noSse4aOption,
340 'sse4a'),
341 (arglist.parser.m_3dnowOption,
342 arglist.parser.m_no3dnowOption,
343 '3dnow'),
344 (arglist.parser.m_3dnowaOption,
345 arglist.parser.m_no3dnowaOption,
346 '3dnowa'),
347 ]:
348 if arglist.getLastArg(pos):
349 attrs.append('+' + flag)
350 elif arglist.getLastArg(neg):
351 attrs.append('-' + flag)
352 if attrs:
Daniel Dunbar3198be82009-02-20 07:47:48 +0000353 cmd_args.append('--mattr=%s' % ','.join(attrs))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000354
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000355 if arglist.hasFFlag(arglist.parser.f_mathErrnoOption,
356 arglist.parser.f_noMathErrnoOption,
357 self.toolChain.isMathErrnoDefault()):
358 cmd_args.append('--fmath-errno=1')
359 else:
360 cmd_args.append('--fmath-errno=0')
361
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000362 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
363 if arg:
364 cmd_args.append('--limit-float-precision')
365 cmd_args.append(arglist.getValue(arg))
366
367 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbarde388a52009-01-21 01:07:49 +0000368
Daniel Dunbard563e522009-02-17 19:02:12 +0000369 arglist.addLastArg(cmd_args, arglist.parser.MDOption)
370 arglist.addLastArg(cmd_args, arglist.parser.MMDOption)
371 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
372 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
373 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
374
375 unsupported = (arglist.getLastArg(arglist.parser.MOption) or
376 arglist.getLastArg(arglist.parser.MMOption) or
377 arglist.getLastArg(arglist.parser.MGOption) or
378 arglist.getLastArg(arglist.parser.MQOption))
379 if unsupported:
380 raise NotImplementedError('clang support for "%s"' % unsupported.opt.name)
381
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000382 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000383 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000384 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar41577f12009-02-15 05:59:37 +0000385 arglist.addLastArg(cmd_args, arglist.parser.POption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000386 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
387
388 # Special case debug options to only pass -g to clang. This is
389 # wrong.
390 if arglist.getLastArg(arglist.parser.gGroup):
391 cmd_args.append('-g')
392
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000393 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
394
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000395 # FIXME: Clang isn't going to accept just anything here.
396 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
397
Daniel Dunbarf0846632009-02-19 22:01:23 +0000398 # Automatically load .pth or .gch files which match -include
399 # options. It's wonky, but we include looking for .gch so we
400 # can support seamless replacement into a build system already
401 # set up to be generating .gch files.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000402 for arg in arglist.getArgs(arglist.parser.includeOption):
Daniel Dunbarf0846632009-02-19 22:01:23 +0000403 for suffix in ('.pth','.gch'):
404 pthPath = arglist.getValue(arg) + suffix
405 if os.path.exists(pthPath):
406 cmd_args.append('-token-cache')
407 cmd_args.append(pthPath)
408 break
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000409
Mike Stumpb55cc632009-01-30 08:22:07 +0000410 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000411
Daniel Dunbarc1212a32009-02-05 02:43:38 +0000412 # Manually translate -O to -O1; let clang reject others.
413 arg = arglist.getLastArg(arglist.parser.OOption)
414 if arg:
415 if arglist.getValue(arg) == '':
416 cmd_args.append('-O1')
417 else:
418 cmd_args.extend(arglist.render(arg))
419
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000420 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
421 arglist.addLastArg(cmd_args, arglist.parser.wOption)
422 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
423
Daniel Dunbar9db8f5d2009-03-10 00:35:30 +0000424 arg = arglist.getLastArg(arglist.parser.f_templateDepthOption)
425 if arg:
426 cmd_args.append('-ftemplate-depth')
427 cmd_args.append(arglist.getValue(arg))
428
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000429 arglist.addAllArgs(cmd_args, arglist.parser.Clang_fGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000430
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000431 arglist.addLastArg(cmd_args, arglist.parser.dMOption)
432
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000433 for arg in arglist.getArgs(arglist.parser.XclangOption):
434 cmd_args.extend(arglist.getValues(arg))
435
Daniel Dunbara8051352009-02-20 01:48:01 +0000436 # FIXME: We should always pass this once it is always known.
437 if self.toolChain.archName:
438 cmd_args.append('-arch')
439 cmd_args.append(self.toolChain.archName)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000440
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000441 if isinstance(output, Jobs.PipedJob):
442 cmd_args.extend(['-o', '-'])
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000443 elif output:
444 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000445
446 for input in inputs:
447 cmd_args.append('-x')
448 cmd_args.append(input.type.name)
449 if isinstance(input.source, Jobs.PipedJob):
450 cmd_args.append('-')
451 else:
452 cmd_args.extend(arglist.renderAsInput(input.source))
453
Daniel Dunbar768be1c2009-01-21 02:03:52 +0000454 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
455 cmd_args))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000456
Daniel Dunbar06172d62009-01-20 00:47:24 +0000457class Darwin_X86_CC1Tool(Tool):
458 def getCC1Name(self, type):
459 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000460
Daniel Dunbar06172d62009-01-20 00:47:24 +0000461 # FIXME: Get bool results from elsewhere.
Daniel Dunbar105e9d72009-03-11 23:07:54 +0000462 if type is Types.AsmType:
463 return 'cc1',True,False
464 elif type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000465 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000466 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000467 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000468 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000469 return 'cc1obj',True,False
Daniel Dunbar2910dfa2009-01-23 00:04:43 +0000470 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000471 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000472 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000473 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000474 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000475 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000476 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000477 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000478 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000479 return 'cc1objplus',False,True
480 else:
481 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000482
483 def addCC1Args(self, cmd_args, arch, arglist):
484 # Derived from cc1 spec.
485
486 # FIXME: -fapple-kext seems to disable this too. Investigate.
487 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
488 not arglist.getLastArg(arglist.parser.staticOption) and
489 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
490 cmd_args.append('-fPIC')
491
492 # FIXME: Remove mthumb
493 # FIXME: Remove mno-thumb
494
495 # FIXME: As with ld, something else is going on. My best guess
496 # is gcc is faking an -mmacosx-version-min
497 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000498# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
499# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
500# cmd_args.append('-mmacosx-version-min=' +
501# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000502
503 # FIXME: Remove faltivec
504 # FIXME: Remove mno-fused-madd
505 # FIXME: Remove mlong-branch
506 # FIXME: Remove mlongcall
507 # FIXME: Remove mcpu=G4
508 # FIXME: Remove mcpu=G5
509
Daniel Dunbar105132e2009-01-16 21:07:21 +0000510 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000511 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
512 cmd_args.append('-feliminate-unused-debug-symbols')
513
Daniel Dunbar06172d62009-01-20 00:47:24 +0000514 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000515 # Derived from cc1_options spec.
516 if (arglist.getLastArg(arglist.parser.fastOption) or
517 arglist.getLastArg(arglist.parser.fastfOption) or
518 arglist.getLastArg(arglist.parser.fastcpOption)):
519 cmd_args.append('-O3')
520
521 if (arglist.getLastArg(arglist.parser.pgOption) and
522 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000523 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000524
Daniel Dunbardff9f502009-01-12 18:51:02 +0000525 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000526
527 if not arglist.getLastArg(arglist.parser.QOption):
528 cmd_args.append('-quiet')
529
530 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000531 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000532
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000533 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000534
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000535 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
536 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000537
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000538 # FIXME: The goal is to use the user provided -o if that is
539 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000540 # name. Find a clean way to go about this.
541 if (arglist.getLastArg(arglist.parser.cOption) or
542 arglist.getLastArg(arglist.parser.SOption)):
543 outputOpt = arglist.getLastArg(arglist.parser.oOption)
544 if outputOpt:
545 cmd_args.append('-auxbase-strip')
546 cmd_args.append(arglist.getValue(outputOpt))
547 else:
548 cmd_args.append('-auxbase')
549 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000550 else:
551 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000552 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000553
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000554 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000555
Daniel Dunbar816dd502009-01-12 17:53:19 +0000556 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
557 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000558 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000559 arglist.addLastArg(cmd_args, arglist.parser.wOption)
560 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
561 if arglist.getLastArg(arglist.parser.vOption):
562 cmd_args.append('-version')
563 if arglist.getLastArg(arglist.parser.pgOption):
564 cmd_args.append('-p')
565 arglist.addLastArg(cmd_args, arglist.parser.pOption)
566
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000567 # ccc treats -fsyntax-only specially.
568 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
569 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000570 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000571
Daniel Dunbar06172d62009-01-20 00:47:24 +0000572 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000573 if arglist.getLastArg(arglist.parser.QnOption):
574 cmd_args.append('-fno-ident')
575
576 # FIXME: This isn't correct.
577 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
578 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
579
Daniel Dunbar06172d62009-01-20 00:47:24 +0000580 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000581 cmd_args.extend(output_args)
582
Daniel Dunbar816dd502009-01-12 17:53:19 +0000583 # FIXME: Still don't get what is happening here. Investigate.
584 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
585
586 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
587 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
588 cmd_args.append('-fno-builtin')
589 cmd_args.append('-fno-merge-constants')
590
591 if arglist.getLastArg(arglist.parser.coverageOption):
592 cmd_args.append('-fprofile-arcs')
593 cmd_args.append('-ftest-coverage')
594
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000595 if isCXX:
596 cmd_args.append('-D__private_extern__=extern')
597
Daniel Dunbar06172d62009-01-20 00:47:24 +0000598 def getBaseInputName(self, inputs, arglist):
599 # FIXME: gcc uses a temporary name here when the base
600 # input is stdin, but only in auxbase. Investigate.
601 baseInputValue = arglist.getValue(inputs[0].baseInput)
602 return os.path.basename(baseInputValue)
603
604 def getBaseInputStem(self, inputs, arglist):
605 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
606
607 def getOutputArgs(self, arglist, output, isCPP=False):
608 if isinstance(output, Jobs.PipedJob):
609 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000610 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000611 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000612 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000613 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000614 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000615 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000616 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000617
618 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
619 output_args, isCXX):
620 # Derived from cpp_options.
621 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
622
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000623 cmd_args.extend(output_args)
624
Daniel Dunbar06172d62009-01-20 00:47:24 +0000625 self.addCC1Args(cmd_args, arch, arglist)
626
627 # NOTE: The code below has some commonality with cpp_options,
628 # but in classic gcc style ends up sending things in different
629 # orders. This may be a good merge candidate once we drop
630 # pedantic compatibility.
631
632 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
633 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
634 arglist.parser.ansiOption,
635 arglist.parser.trigraphsOption)
636 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
637 arglist.parser.pedanticGroup)
638 arglist.addLastArg(cmd_args, arglist.parser.wOption)
639
640 # ccc treats -fsyntax-only specially.
641 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
642 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000643 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000644
645 if (arglist.getLastArg(arglist.parser.gGroup) and
646 not arglist.getLastArg(arglist.parser.g0Option) and
647 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
648 cmd_args.append('-fworking-directory')
649
650 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
651 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
652 if arglist.getLastArg(arglist.parser.saveTempsOption):
653 cmd_args.append('-fpch-preprocess')
654
655 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
656 # Derived from cpp_unique_options.
657
658 if (arglist.getLastArg(arglist.parser.COption) or
659 arglist.getLastArg(arglist.parser.CCOption)):
660 if not arglist.getLastArg(arglist.parser.EOption):
661 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
662 if not arglist.getLastArg(arglist.parser.QOption):
663 cmd_args.append('-quiet')
664 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
665 arglist.addLastArg(cmd_args, arglist.parser.vOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000666 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000667 arglist.addLastArg(cmd_args, arglist.parser.POption)
668
669 # FIXME: Handle %I properly.
Daniel Dunbara8051352009-02-20 01:48:01 +0000670 if self.toolChain.archName == 'x86_64':
Daniel Dunbar06172d62009-01-20 00:47:24 +0000671 cmd_args.append('-imultilib')
672 cmd_args.append('x86_64')
673
674 if arglist.getLastArg(arglist.parser.MDOption):
675 cmd_args.append('-MD')
676 # FIXME: Think about this more.
677 outputOpt = arglist.getLastArg(arglist.parser.oOption)
678 if outputOpt:
679 base,ext = os.path.splitext(arglist.getValue(outputOpt))
680 cmd_args.append(base+'.d')
681 else:
682 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
683 if arglist.getLastArg(arglist.parser.MMDOption):
684 cmd_args.append('-MMD')
685 # FIXME: Think about this more.
686 outputOpt = arglist.getLastArg(arglist.parser.oOption)
687 if outputOpt:
688 base,ext = os.path.splitext(arglist.getValue(outputOpt))
689 cmd_args.append(base+'.d')
690 else:
691 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
692 arglist.addLastArg(cmd_args, arglist.parser.MOption)
693 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
694 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
695 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
696 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
697 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
698 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
699 if (not arglist.getLastArg(arglist.parser.MOption) and
700 not arglist.getLastArg(arglist.parser.MMOption) and
701 (arglist.getLastArg(arglist.parser.MDOption) or
702 arglist.getLastArg(arglist.parser.MMDOption))):
703 outputOpt = arglist.getLastArg(arglist.parser.oOption)
704 if outputOpt:
705 cmd_args.append('-MQ')
706 cmd_args.append(arglist.getValue(outputOpt))
707
708 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
709 if arglist.getLastArg(arglist.parser.g3Option):
710 cmd_args.append('-dD')
711 arglist.addLastArg(cmd_args, arglist.parser.HOption)
712
713 self.addCPPArgs(cmd_args, arch, arglist)
714
715 arglist.addAllArgs3(cmd_args,
716 arglist.parser.DOption,
717 arglist.parser.UOption,
718 arglist.parser.AOption)
719
720 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
721
722 for input in inputs:
723 if isinstance(input.source, Jobs.PipedJob):
724 cmd_args.append('-')
725 else:
726 cmd_args.extend(arglist.renderAsInput(input.source))
727
728 for arg in arglist.getArgs2(arglist.parser.WpOption,
729 arglist.parser.XpreprocessorOption):
730 cmd_args.extend(arglist.getValues(arg))
731
732 if arglist.getLastArg(arglist.parser.f_mudflapOption):
733 cmd_args.append('-D_MUDFLAP')
734 cmd_args.append('-include')
735 cmd_args.append('mf-runtime.h')
736
737 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
738 cmd_args.append('-D_MUDFLAP')
739 cmd_args.append('-D_MUDFLAPTH')
740 cmd_args.append('-include')
741 cmd_args.append('mf-runtime.h')
742
743 def addCPPArgs(self, cmd_args, arch, arglist):
744 # Derived from cpp spec.
745
746 if arglist.getLastArg(arglist.parser.staticOption):
747 # The gcc spec is broken here, it refers to dynamic but
748 # that has been translated. Start by being bug compatible.
749
750 # if not arglist.getLastArg(arglist.parser.dynamicOption):
751 cmd_args.append('-D__STATIC__')
752 else:
753 cmd_args.append('-D__DYNAMIC__')
754
755 if arglist.getLastArg(arglist.parser.pthreadOption):
756 cmd_args.append('-D_REENTRANT')
757
758class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
759 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000760 super(Darwin_X86_PreprocessTool, self).__init__('cpp', toolChain,
Daniel Dunbar06172d62009-01-20 00:47:24 +0000761 (Tool.eFlagsPipedInput |
762 Tool.eFlagsPipedOutput))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000763
764 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000765 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000766 inputType = inputs[0].type
767 assert not [i for i in inputs if i.type != inputType]
768
769 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
770
771 cmd_args = ['-E']
772 if (arglist.getLastArg(arglist.parser.traditionalOption) or
773 arglist.getLastArg(arglist.parser.f_traditionalOption) or
774 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
775 cmd_args.append('-traditional-cpp')
776
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000777 output_args = self.getOutputArgs(arglist, output,
778 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000779 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000780 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000781
782 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
783
784 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
785 cmd_args))
786
787class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
788 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000789 super(Darwin_X86_CompileTool, self).__init__('cc1', toolChain,
Daniel Dunbar06172d62009-01-20 00:47:24 +0000790 (Tool.eFlagsPipedInput |
791 Tool.eFlagsPipedOutput |
792 Tool.eFlagsIntegratedCPP))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000793
794 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000795 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000796 inputType = inputs[0].type
797 assert not [i for i in inputs if i.type != inputType]
798
799 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
800
801 cmd_args = []
802 if (arglist.getLastArg(arglist.parser.traditionalOption) or
803 arglist.getLastArg(arglist.parser.f_traditionalOption)):
804 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
805
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000806 if outputType is Types.PCHType:
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000807 pass
808 elif outputType is Types.AsmTypeNoPP:
809 pass
810 elif outputType is Types.LLVMAsmType:
811 cmd_args.append('-emit-llvm')
812 elif outputType is Types.LLVMBCType:
813 cmd_args.append('-emit-llvm-bc')
814
815 if outputType is Types.PCHType:
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000816 output_args = []
817 else:
818 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000819
820 # There is no need for this level of compatibility, but it
821 # makes diffing easier.
822 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
823 not arglist.getLastArg(arglist.parser.SOption)):
824 early_output_args, end_output_args = [], output_args
825 else:
826 early_output_args, end_output_args = output_args, []
827
Daniel Dunbar06172d62009-01-20 00:47:24 +0000828 if usePP:
829 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
830 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
831 early_output_args, isCXX)
832 cmd_args.extend(end_output_args)
833 else:
834 cmd_args.append('-fpreprocessed')
835
836 # FIXME: There is a spec command to remove
837 # -fpredictive-compilation args here. Investigate.
838
839 for input in inputs:
840 if isinstance(input.source, Jobs.PipedJob):
841 cmd_args.append('-')
842 else:
843 cmd_args.extend(arglist.renderAsInput(input.source))
844
845 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
846 early_output_args, isCXX)
847 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000848
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000849 if outputType is Types.PCHType:
850 assert output is not None and not isinstance(output, Jobs.PipedJob)
851
852 cmd_args.append('-o')
853 # NOTE: gcc uses a temp .s file for this, but there
854 # doesn't seem to be a good reason.
855 cmd_args.append('/dev/null')
856
857 cmd_args.append('--output-pch=')
858 cmd_args.append(arglist.getValue(output))
859
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000860 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
861 cmd_args))
862
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000863class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000864 def __init__(self, toolChain):
Daniel Dunbar5e187a12009-02-20 01:30:38 +0000865 super(Darwin_X86_LinkTool, self).__init__('collect2', toolChain)
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000866
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000867 def getMacosxVersionTuple(self, arglist):
868 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
869 if arg:
870 version = arglist.getValue(arg)
871 components = version.split('.')
872 try:
873 return tuple(map(int, components))
874 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000875 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000876 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000877 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000878 return (10, major-4, minor)
879
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000880 def addDarwinArch(self, cmd_args, arch, arglist):
881 # Derived from darwin_arch spec.
882 cmd_args.append('-arch')
Daniel Dunbara8051352009-02-20 01:48:01 +0000883 cmd_args.append(self.toolChain.archName)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000884
885 def addDarwinSubArch(self, cmd_args, arch, arglist):
886 # Derived from darwin_subarch spec, not sure what the
887 # distinction exists for but at least for this chain it is the same.
888 return self.addDarwinArch(cmd_args, arch, arglist)
889
890 def addLinkArgs(self, cmd_args, arch, arglist):
891 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000892 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
893 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000894 cmd_args.append('-dynamic')
895 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
896 # FIXME: Replace -lobjc in forward args with
897 # -lobjc-gnu. How do we wish to handle such things?
898 pass
899
Daniel Dunbar470104e2009-01-17 00:53:19 +0000900 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
901 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000902 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000903 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000904 else:
905 self.addDarwinSubArch(cmd_args, arch, arglist)
906
Daniel Dunbar470104e2009-01-17 00:53:19 +0000907 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000908 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000909 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000910 '-bundle_loader')
911 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
912 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
913 # FIXME: Where should diagnostics go?
914 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
915 sys.exit(1)
916 if arglist.getLastArg(arglist.parser.current_versionOption):
917 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
918 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000919 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000920 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000921 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000922 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
923 sys.exit(1)
924 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
925 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
926 else:
927 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000928 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000929 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
930 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000931 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000932 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
933 sys.exit(1)
934 if arglist.getLastArg(arglist.parser.client_nameOption):
935 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
936 sys.exit(1)
937 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
938 '-dylib_compatibility_version')
939 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
940 '-dylib_current_version')
941
Daniel Dunbar470104e2009-01-17 00:53:19 +0000942 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000943 self.addDarwinArch(cmd_args, arch, arglist)
944 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
945 else:
946 self.addDarwinSubArch(cmd_args, arch, arglist)
947
Daniel Dunbar470104e2009-01-17 00:53:19 +0000948 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000949 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
950 sys.exit(1)
951
Daniel Dunbar470104e2009-01-17 00:53:19 +0000952 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000953 '-dylib_install_name')
954
955 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
956 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
957 sys.exit(1)
958 if arglist.getLastArg(arglist.parser.private_bundleOption):
959 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
960 sys.exit(1)
961
Daniel Dunbar470104e2009-01-17 00:53:19 +0000962 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000963 cmd_args.append('-all_load')
964
Daniel Dunbar470104e2009-01-17 00:53:19 +0000965 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000966 '-allowable_client')
967
Daniel Dunbar470104e2009-01-17 00:53:19 +0000968 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000969 cmd_args.append('-bind_at_load')
970
Daniel Dunbar470104e2009-01-17 00:53:19 +0000971 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000972 cmd_args.append('-dead_strip')
973
Daniel Dunbar470104e2009-01-17 00:53:19 +0000974 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000975 cmd_args.append('-no_dead_strip_inits_and_terms')
976
Daniel Dunbar470104e2009-01-17 00:53:19 +0000977 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000978 '-dylib_file')
979
Daniel Dunbar470104e2009-01-17 00:53:19 +0000980 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000981 cmd_args.append('-dynamic')
982
Daniel Dunbar470104e2009-01-17 00:53:19 +0000983 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000984 '-exported_symbols_list')
985
Daniel Dunbar470104e2009-01-17 00:53:19 +0000986 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000987 cmd_args.append('-flat_namespace')
988
989 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000990 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000991 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000992 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000993 '-init')
994
995 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
996 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
997 # FIXME: I don't understand what is going on
998 # here. This is supposed to come from
999 # darwin_ld_minversion, but gcc doesn't seem to be
1000 # following that; it must be getting over-ridden
1001 # somewhere.
1002 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +00001003 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001004 else:
1005 # addAll doesn't make sense here but this is what gcc
1006 # does.
1007 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
1008 '-macosx_version_min')
1009
1010 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
1011 '-iphoneos_version_min')
1012 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
1013
Daniel Dunbar470104e2009-01-17 00:53:19 +00001014 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001015 cmd_args.append('-multi_module')
1016
Daniel Dunbar470104e2009-01-17 00:53:19 +00001017 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001018 cmd_args.append('-single_module')
1019
Daniel Dunbar470104e2009-01-17 00:53:19 +00001020 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001021 '-multiply_defined')
1022
Daniel Dunbar470104e2009-01-17 00:53:19 +00001023 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001024 '-multiply_defined_unused')
1025
1026 if arglist.getLastArg(arglist.parser.f_pieOption):
1027 cmd_args.append('-pie')
1028
1029 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
1030 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
1031 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
1032 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
1033 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
1034 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
1035 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
1036 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
1037 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +00001038 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001039 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +00001040 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001041 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +00001042 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001043 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +00001044 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001045 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +00001046 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
1047 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001048 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
1049 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
1050 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
1051 '-syslibroot')
1052 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
1053 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +00001054 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001055 '-umbrella')
1056 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +00001057 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001058 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +00001059 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001060 '-weak_reference_mismatches')
1061
Daniel Dunbar470104e2009-01-17 00:53:19 +00001062 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001063 cmd_args.append('-weak_reference_mismatches')
1064 cmd_args.append('non-weak')
1065
1066 arglist.addLastArg(cmd_args, arglist.parser.XOption)
1067 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
1068 arglist.addLastArg(cmd_args, arglist.parser.wOption)
1069 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
1070 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
1071 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
1072 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
1073 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
1074 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
1075 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
1076 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
1077 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
1078 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
1079 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
1080 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +00001081
1082 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001083 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001084 assert outputType is Types.ImageType
1085
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001086 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001087 # comes from specs (starting with link_command). Consult gcc
1088 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001089
1090 # FIXME: gcc's spec controls when this is done; certain things
1091 # like -filelist or -Wl, still trigger a link stage. I don't
1092 # quite understand how gcc decides to execute the linker,
1093 # investigate. Also, the spec references -fdump= which seems
1094 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +00001095 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001096
1097 # Not sure why this particular decomposition exists in gcc.
1098 self.addLinkArgs(cmd_args, arch, arglist)
1099
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001100 # This toolchain never accumlates options in specs, the only
1101 # place this gets used is to add -ObjC.
1102 if (arglist.getLastArg(arglist.parser.ObjCOption) or
1103 arglist.getLastArg(arglist.parser.f_objcOption)):
1104 cmd_args.append('-ObjC')
1105 if arglist.getLastArg(arglist.parser.ObjCXXOption):
1106 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001107
1108 # FIXME: gcc has %{x} in here. How could this ever happen?
1109 # Cruft?
Daniel Dunbarb644be32009-01-23 00:39:52 +00001110 arglist.addAllArgs(cmd_args, arglist.parser.dOption)
1111 arglist.addAllArgs(cmd_args, arglist.parser.sOption)
1112 arglist.addAllArgs(cmd_args, arglist.parser.tOption)
1113 arglist.addAllArgs(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +00001114 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001115 arglist.addAllArgs(cmd_args, arglist.parser.AOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001116 arglist.addLastArg(cmd_args, arglist.parser.eOption)
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001117 arglist.addAllArgs(cmd_args, arglist.parser.mSeparate)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001118 arglist.addAllArgs(cmd_args, arglist.parser.rOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001119
1120 cmd_args.extend(arglist.render(output))
1121
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001122 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001123 if (not arglist.getLastArg(arglist.parser.AOption) and
1124 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1125 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1126 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +00001127 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001128 # Derived from darwin_dylib1 spec.
1129 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1130 cmd_args.append('-ldylib1.o')
1131 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001132 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001133 cmd_args.append('-ldylib1.o')
1134 else:
1135 cmd_args.append('-ldylib1.10.5.o')
1136 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +00001137 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001138 if not arglist.getLastArg(arglist.parser.staticOption):
1139 cmd_args.append('-lbundle1.o')
1140 else:
1141 if arglist.getLastArg(arglist.parser.pgOption):
1142 if arglist.getLastArg(arglist.parser.staticOption):
1143 cmd_args.append('-lgcrt0.o')
1144 else:
1145 if arglist.getLastArg(arglist.parser.objectOption):
1146 cmd_args.append('-lgcrt0.o')
1147 else:
1148 if arglist.getLastArg(arglist.parser.preloadOption):
1149 cmd_args.append('-lgcrt0.o')
1150 else:
1151 cmd_args.append('-lgcrt1.o')
1152
1153 # darwin_crt2 spec is empty.
1154 pass
1155 else:
1156 if arglist.getLastArg(arglist.parser.staticOption):
1157 cmd_args.append('-lcrt0.o')
1158 else:
1159 if arglist.getLastArg(arglist.parser.objectOption):
1160 cmd_args.append('-lcrt0.o')
1161 else:
1162 if arglist.getLastArg(arglist.parser.preloadOption):
1163 cmd_args.append('-lcrt0.o')
1164 else:
1165 # Derived from darwin_crt1 spec.
1166 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1167 cmd_args.append('-lcrt1.o')
1168 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001169 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001170 cmd_args.append('-lcrt1.o')
1171 else:
1172 cmd_args.append('-lcrt1.10.5.o')
1173
1174 # darwin_crt2 spec is empty.
1175 pass
1176
1177 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1178 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001179 if macosxVersion < (10,5):
Daniel Dunbar70230822009-01-21 17:18:19 +00001180 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001181
1182 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1183
1184 if arglist.getLastArg(arglist.parser.f_openmpOption):
1185 # This is more complicated in gcc...
1186 cmd_args.append('-lgomp')
1187
1188 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001189 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbara8051352009-02-20 01:48:01 +00001190 if self.toolChain.archName == 'x86_64':
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001191 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1192 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1193 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1194 "-L/usr/lib/gcc/%s" % tcDir,
1195 "-L/usr/lib/gcc/%s" % tcDir,
1196 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1197 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001198
Daniel Dunbara5677512009-01-05 19:53:30 +00001199 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001200 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001201
Daniel Dunbar7c584962009-01-20 21:29:14 +00001202 if linkingOutput:
1203 cmd_args.append('-arch_multiple')
1204 cmd_args.append('-final_output')
1205 cmd_args.append(arglist.getValue(linkingOutput))
1206
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001207 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1208 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1209 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1210 arglist.getLastArg(arglist.parser.coverageOption)):
1211 cmd_args.append('-lgcov')
1212
1213 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1214 cmd_args.append('-allow_stack_execute')
1215
1216 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1217 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1218 # link_ssp spec is empty.
1219
1220 # Derived from libgcc spec.
1221 if arglist.getLastArg(arglist.parser.staticOption):
1222 cmd_args.append('-lgcc_static')
1223 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1224 cmd_args.append('-lgcc_eh')
1225 cmd_args.append('-lgcc')
1226 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1227 # Derived from darwin_iphoneos_libgcc spec.
1228 cmd_args.append('-lgcc_s.10.5')
1229 cmd_args.append('-lgcc')
1230 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1231 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1232 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001233 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001234 cmd_args.append('-lgcc_s.10.4')
1235 else:
1236 cmd_args.append('-lgcc_s.10.5')
1237 cmd_args.append('-lgcc')
1238 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001239 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001240 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001241 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001242 cmd_args.append('-lgcc_s.10.5')
1243 cmd_args.append('-lgcc')
1244
1245 # Derived from lib spec.
1246 if not arglist.getLastArg(arglist.parser.staticOption):
1247 cmd_args.append('-lSystem')
1248
1249 if (not arglist.getLastArg(arglist.parser.AOption) and
1250 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1251 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1252 # endfile_spec is empty.
1253 pass
1254
Daniel Dunbarcad3df82009-03-09 17:43:51 +00001255 arglist.addAllArgs(cmd_args, arglist.parser.TGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001256 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1257
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001258 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1259 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001260
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001261 if (arglist.getLastArg(arglist.parser.gGroup) and
1262 not arglist.getLastArg(arglist.parser.gstabsOption) and
1263 not arglist.getLastArg(arglist.parser.g0Option)):
1264 # FIXME: This is gross, but matches gcc. The test only
1265 # considers the suffix (not the -x type), and then only of the
1266 # first input.
1267 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1268 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1269 '.c++','.cxx','.CPP','.m','.mm'):
1270 jobs.addJob(Jobs.Command('dsymutil',
1271 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001272
Daniel Dunbara5677512009-01-05 19:53:30 +00001273class LipoTool(Tool):
Daniel Dunbar5e187a12009-02-20 01:30:38 +00001274 def __init__(self, toolChain):
1275 super(LipoTool, self).__init__('lipo', toolChain)
Daniel Dunbara5677512009-01-05 19:53:30 +00001276
1277 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001278 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001279 assert outputType is Types.ImageType
1280
Daniel Dunbardb439902009-01-07 18:40:45 +00001281 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001282 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001283 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001284 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001285 jobs.addJob(Jobs.Command('lipo', cmd_args))