blob: fa1a5abfaf42b03a164db66d05d95f1afecd5b03 [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
6import Types
7
8class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +00009 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000010
11 eFlagsPipedInput = 1 << 0
12 eFlagsPipedOutput = 1 << 1
13 eFlagsIntegratedCPP = 1 << 2
14
15 def __init__(self, name, flags = 0):
16 self.name = name
17 self.flags = flags
18
19 def acceptsPipedInput(self):
20 return not not (self.flags & Tool.eFlagsPipedInput)
21 def canPipeOutput(self):
22 return not not (self.flags & Tool.eFlagsPipedOutput)
23 def hasIntegratedCPP(self):
24 return not not (self.flags & Tool.eFlagsIntegratedCPP)
25
26class GCC_Common_Tool(Tool):
27 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000028 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +000029 extraArgs):
Daniel Dunbardb439902009-01-07 18:40:45 +000030 cmd_args = sum(map(arglist.render, args),[]) + extraArgs
Daniel Dunbara5677512009-01-05 19:53:30 +000031 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000032 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000033 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000034 cmd_args.extend(['-o', '-'])
Daniel Dunbara5677512009-01-05 19:53:30 +000035 elif output is None:
Daniel Dunbardb439902009-01-07 18:40:45 +000036 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000037 else:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000038 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000039
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000040 # Only pass -x if gcc will understand it; otherwise hope gcc
41 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000042 # would go wrong in is for linker inputs if they happened to
43 # have an odd suffix; really the only way to get this to
44 # happen is a command like '-x foobar a.c' which will treat
45 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000046 #
47 # FIXME: For the linker case specifically, can we safely
48 # convert inputs into '-Wl,' options?
49 for input in inputs:
50 if input.type.canBeUserSpecified:
51 cmd_args.extend(['-x', input.type.name])
52
53 if isinstance(input.source, Jobs.PipedJob):
54 cmd_args.append('-')
55 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000056 assert isinstance(input.source, Arguments.Arg)
57 # If this is a linker input then assume we can forward
58 # just by rendering.
59 if input.source.opt.isLinkerInput:
60 cmd_args.extend(arglist.render(input.source))
61 else:
62 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000063
64 jobs.addJob(Jobs.Command('gcc', cmd_args))
65
66class GCC_PreprocessTool(GCC_Common_Tool):
67 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000068 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000069 (Tool.eFlagsPipedInput |
70 Tool.eFlagsPipedOutput))
71
72 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000073 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000074 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000075 output, outputType, args, arglist,
76 ['-E'])
Daniel Dunbara5677512009-01-05 19:53:30 +000077
78class GCC_CompileTool(GCC_Common_Tool):
79 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000080 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000081 (Tool.eFlagsPipedInput |
82 Tool.eFlagsPipedOutput |
83 Tool.eFlagsIntegratedCPP))
84
85 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000086 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000087 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000088 output, outputType, args, arglist,
89 ['-S'])
Daniel Dunbara5677512009-01-05 19:53:30 +000090
91class GCC_PrecompileTool(GCC_Common_Tool):
92 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000093 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +000094 (Tool.eFlagsPipedInput |
95 Tool.eFlagsIntegratedCPP))
96
97 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000098 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000099 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000100 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +0000101 [])
102
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000103class Darwin_AssembleTool(Tool):
104 def __init__(self, toolChain):
105 super(Darwin_AssembleTool, self).__init__('as',
106 Tool.eFlagsPipedInput)
107 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000108
109 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000110 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000111 assert len(inputs) == 1
112 assert outputType is Types.ObjectType
113
114 input = inputs[0]
115
116 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000117
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000118 if (arglist.getLastArg(arglist.parser.gOption) or
119 arglist.getLastArg(arglist.parser.g3Option)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000120 cmd_args.append('--gstabs')
121
122 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000123 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000124 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000125 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000126 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
127 arglist.getLastArg(arglist.parser.staticOption) or
128 arglist.getLastArg(arglist.parser.f_appleKextOption)):
129 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
130 cmd_args.append('-static')
131
132 for arg in arglist.getArgs2(arglist.parser.WaOption,
133 arglist.parser.XassemblerOption):
134 cmd_args.extend(arglist.getValues(arg))
135
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000136 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000137 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000138 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000139 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000140 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000141
142 # asm_final spec is empty.
143
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000144 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
145 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000146
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000147class GCC_AssembleTool(GCC_Common_Tool):
148 def __init__(self):
149 # We can't generally assume the assembler can take or output
150 # on pipes.
151 super(GCC_AssembleTool, self).__init__('gcc (as)')
152
153 def constructJob(self, phase, arch, jobs, inputs,
154 output, outputType, args, arglist):
155 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
156 output, outputType, args, arglist,
157 ['-c'])
158
159class GCC_LinkTool(GCC_Common_Tool):
160 def __init__(self):
161 super(GCC_LinkTool, self).__init__('gcc (ld)')
162
163 def constructJob(self, phase, arch, jobs, inputs,
164 output, outputType, args, arglist):
165 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
166 output, outputType, args, arglist,
167 [])
168
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000169class Darwin_X86_CompileTool(Tool):
170 def __init__(self, toolChain):
171 super(Darwin_X86_CompileTool, self).__init__('cc1',
172 (Tool.eFlagsPipedInput |
173 Tool.eFlagsPipedOutput |
174 Tool.eFlagsIntegratedCPP))
175 self.toolChain = toolChain
176
Daniel Dunbardff9f502009-01-12 18:51:02 +0000177 def addCPPArgs(self, cmd_args, arch, arglist):
178 # Derived from cpp spec.
179
180 # FIXME: The gcc spec is broken here, it refers to dynamic but
181 # that has been translated.
182 if arglist.getLastArg(arglist.parser.staticOption):
183 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
184 cmd_args.append('-D__STATIC__')
185 else:
186 cmd_args.append('-D__DYNAMIC__')
187
188 if arglist.getLastArg(arglist.parser.pthreadOption):
189 cmd_args.append('-D_REENTRANT')
190
191 def addCC1Args(self, cmd_args, arch, arglist):
192 # Derived from cc1 spec.
193
194 # FIXME: -fapple-kext seems to disable this too. Investigate.
195 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
196 not arglist.getLastArg(arglist.parser.staticOption) and
197 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
198 cmd_args.append('-fPIC')
199
200 # FIXME: Remove mthumb
201 # FIXME: Remove mno-thumb
202
203 # FIXME: As with ld, something else is going on. My best guess
204 # is gcc is faking an -mmacosx-version-min
205 # somewhere. Investigate.
206 if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
207 not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
208 cmd_args.append('-mmacosx-version-min=' +
209 self.toolChain.getMacosxVersionMin())
210
211 # FIXME: Remove faltivec
212 # FIXME: Remove mno-fused-madd
213 # FIXME: Remove mlong-branch
214 # FIXME: Remove mlongcall
215 # FIXME: Remove mcpu=G4
216 # FIXME: Remove mcpu=G5
217
218 if (arglist.getLastArg(arglist.parser.gOption) and
219 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
220 cmd_args.append('-feliminate-unused-debug-symbols')
221
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000222 def constructJob(self, phase, arch, jobs, inputs,
223 output, outputType, args, arglist):
224 inputType = inputs[0].type
225 assert not [i for i in inputs if i.type != inputType]
226
227 usePP = False
228 if inputType is Types.CType:
229 cc1Name = 'cc1'
230 usePP = True
231 elif inputType is Types.CTypeNoPP:
232 cc1Name = 'cc1'
233 usePP = False
234 elif inputType is Types.ObjCType:
235 cc1Name = 'cc1obj'
236 usePP = True
237 elif inputType is Types.ObjCTypeNoPP:
238 cc1Name = 'cc1obj'
239 usePP = False
240 elif inputType is Types.CXXType:
241 cc1Name = 'cc1plus'
242 usePP = True
243 elif inputType is Types.CXXTypeNoPP:
244 cc1Name = 'cc1plus'
245 usePP = False
246 elif inputType is Types.ObjCXXType:
247 cc1Name = 'cc1objplus'
248 usePP = True
249 elif inputType is Types.ObjCXXTypeNoPP:
250 cc1Name = 'cc1objplus'
251 usePP = False
252 else:
253 raise RuntimeError,"Unexpected input type for Darwin compile tool."
254
255 cmd_args = []
256 if (arglist.getLastArg(arglist.parser.traditionalOption) or
257 arglist.getLastArg(arglist.parser.f_traditionalOption)):
258 raise ValueError,"-traditional is not supported without -E"
259
260 if usePP:
261 # Derived from cpp_unique_options.
262
263 if (arglist.getLastArg(arglist.parser.COption) or
264 arglist.getLastArg(arglist.parser.CCOption)):
265 if not arglist.getLastArg(arglist.parser.EOption):
266 raise ValueError,"-C or -CC is not supported without -E"
267 if not arglist.getLastArg(arglist.parser.QOption):
268 cmd_args.append('-quiet')
269 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
270 arglist.addLastArg(cmd_args, arglist.parser.vOption)
271 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
272 arglist.addLastArg(cmd_args, arglist.parser.POption)
273
274 # FIXME: Handle %I properly.
275 if arglist.getValue(arch) == 'x86_64':
276 cmd_args.append('-imultilib')
277 cmd_args.append('x86_64')
278
279 if arglist.getLastArg(arglist.parser.MDOption):
280 cmd_args.append('-MD')
281 outputOpt = arglist.getLastArg(arglist.parser.oOption)
282 if outputOpt:
283 base,ext = os.path.splitext(arglist.getValue(outputOpt))
284 cmd_args.append(base+'.d')
285 else:
286 # FIXME: Get correct basename.
287 cmd_args.append('FIXME.d')
288 if arglist.getLastArg(arglist.parser.MMDOption):
289 cmd_args.append('-MMD')
290 outputOpt = arglist.getLastArg(arglist.parser.oOption)
291 if outputOpt:
292 base,ext = os.path.splitext(arglist.getValue(outputOpt))
293 cmd_args.append(base+'.d')
294 else:
295 # FIXME: Get correct basename.
296 cmd_args.append('FIXME.d')
297 arglist.addLastArg(cmd_args, arglist.parser.MOption)
298 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
299 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
300 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
301 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
302 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
303 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
304 if (not arglist.getLastArg(arglist.parser.MOption) and
305 not arglist.getLastArg(arglist.parser.MMOption) and
306 (arglist.getLastArg(arglist.parser.MDOption) or
307 arglist.getLastArg(arglist.parser.MMDOption))):
308 outputOpt = arglist.getLastArg(arglist.parser.oOption)
309 if outputOpt:
310 cmd_args.append('-MQ')
311 cmd_args.append(arglist.getValue(outputOpt))
312
313 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
314 if arglist.getLastArg(arglist.parser.g3Option):
315 cmd_args.append('-dD')
316 arglist.addLastArg(cmd_args, arglist.parser.HOption)
317
Daniel Dunbardff9f502009-01-12 18:51:02 +0000318 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000319
320 arglist.addAllArgs3(cmd_args,
321 arglist.parser.DOption,
322 arglist.parser.UOption,
323 arglist.parser.AOption)
324
325 # FIXME: Add i*
326
327 # FIXME: %Z
328
329 # FIXME: %i
330
331 if arglist.getLastArg(arglist.parser.f_mudflapOption):
332 cmd_args.append('-D_MUDFLAP')
333 cmd_args.append('-include')
334 cmd_args.append('mf-runtime.h')
335
336 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
337 cmd_args.append('-D_MUDFLAP')
338 cmd_args.append('-D_MUDFLAPTH')
339 cmd_args.append('-include')
340 cmd_args.append('mf-runtime.h')
341 else:
342 cmd_args.append('-fpreprocessed')
343 # FIXME: There is a spec command to remove
344 # -fpredictive-compilation args here. Investigate.
345
Daniel Dunbar816dd502009-01-12 17:53:19 +0000346 # FIXME: This is from previously & not part of the spec,
347 # integrate properly.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000348 for input in inputs:
349 if isinstance(input.source, Jobs.PipedJob):
350 cmd_args.append('-')
351 else:
352 cmd_args.extend(arglist.renderAsInput(input.source))
353
Daniel Dunbar816dd502009-01-12 17:53:19 +0000354 # Derived from cc1_options spec.
355 if (arglist.getLastArg(arglist.parser.fastOption) or
356 arglist.getLastArg(arglist.parser.fastfOption) or
357 arglist.getLastArg(arglist.parser.fastcpOption)):
358 cmd_args.append('-O3')
359
360 if (arglist.getLastArg(arglist.parser.pgOption) and
361 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
362 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
363
Daniel Dunbardff9f502009-01-12 18:51:02 +0000364 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000365
366 if not arglist.getLastArg(arglist.parser.QOption):
367 cmd_args.append('-quiet')
368
369 cmd_args.append('-dumpbase')
370 # FIXME: Get correct basename.
371 cmd_args.append('FIXME')
372
373 # FIXME: d*
374 # FIXME: m*
375 # FIXME: a*
376
377 # FIXME: This is wrong, what is supposed to happen is we
378 # should be using the immediate output if we have a "named
379 # output" from the user, and otherwise derive one from the
380 # input name.
381 outputOpt = arglist.getLastArg(arglist.parser.oOption)
382 if outputOpt:
383 cmd_args.append('-auxbase-strip')
384 cmd_args.append(arglist.getValue(outputOpt))
385 else:
386 cmd_args.append('-auxbase')
387 # FIXME: Add proper basename.
388 cmd_args.append('FIXME')
389
390 # FIXME: g*
391
392 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
393 # FIXME: -Wall is getting some special treatment. Investigate.
394 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
395 arglist.addLastArg(cmd_args, arglist.parser.wOption)
396 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
397 if arglist.getLastArg(arglist.parser.vOption):
398 cmd_args.append('-version')
399 if arglist.getLastArg(arglist.parser.pgOption):
400 cmd_args.append('-p')
401 arglist.addLastArg(cmd_args, arglist.parser.pOption)
402
403 # FIXME: f*
404
405 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
406 if arglist.getLastArg(arglist.parser.QnOption):
407 cmd_args.append('-fno-ident')
408
409 # FIXME: This isn't correct.
410 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
411 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
412
413 if isinstance(output, Jobs.PipedJob):
414 cmd_args.extend(['-o', '-'])
415 elif output is None:
416 cmd_args.extend(['-o', '/dev/null'])
417 else:
418 cmd_args.extend(arglist.render(output))
419
420 # FIXME: Still don't get what is happening here. Investigate.
421 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
422
423 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
424 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
425 cmd_args.append('-fno-builtin')
426 cmd_args.append('-fno-merge-constants')
427
428 if arglist.getLastArg(arglist.parser.coverageOption):
429 cmd_args.append('-fprofile-arcs')
430 cmd_args.append('-ftest-coverage')
431
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000432 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
433 cmd_args))
434
435
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000436class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000437 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000438 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000439 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000440
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000441 def getMacosxVersionTuple(self, arglist):
442 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
443 if arg:
444 version = arglist.getValue(arg)
445 components = version.split('.')
446 try:
447 return tuple(map(int, components))
448 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000449 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000450 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000451 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000452 return (10, major-4, minor)
453
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000454 def addDarwinArch(self, cmd_args, arch, arglist):
455 # Derived from darwin_arch spec.
456 cmd_args.append('-arch')
457 # FIXME: The actual spec uses -m64 for this, but we want to
458 # respect arch. Figure out what exactly gcc is doing.
459 #if arglist.getLastArg(arglist.parser.m_64Option):
460 if arglist.getValue(arch) == 'x86_64':
461 cmd_args.append('x86_64')
462 else:
463 cmd_args.append('i386')
464
465 def addDarwinSubArch(self, cmd_args, arch, arglist):
466 # Derived from darwin_subarch spec, not sure what the
467 # distinction exists for but at least for this chain it is the same.
468 return self.addDarwinArch(cmd_args, arch, arglist)
469
470 def addLinkArgs(self, cmd_args, arch, arglist):
471 # Derived from link spec.
472 if arglist.getLastArg(arglist.parser.staticOption):
473 cmd_args.append('-static')
474 else:
475 cmd_args.append('-dynamic')
476 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
477 # FIXME: Replace -lobjc in forward args with
478 # -lobjc-gnu. How do we wish to handle such things?
479 pass
480
481 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
482 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
483 self.addDarwinArch(cmd_args, arch, arglist)
484 cmd_args.append('-force_cpusubtype_all')
485 else:
486 self.addDarwinSubArch(cmd_args, arch, arglist)
487
488 if arglist.getLastArg(arglist.parser.ZbundleOption):
489 cmd_args.append('-bundle')
490 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
491 '-bundle_loader')
492 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
493 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
494 # FIXME: Where should diagnostics go?
495 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
496 sys.exit(1)
497 if arglist.getLastArg(arglist.parser.current_versionOption):
498 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
499 sys.exit(1)
500 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
501 cmd_args.append('-force_flat_namespace')
502 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
503 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
504 sys.exit(1)
505 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
506 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
507 else:
508 cmd_args.append('-dylib')
509 if arglist.getLastArg(arglist.parser.ZbundleOption):
510 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
511 sys.exit(1)
512 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
513 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
514 sys.exit(1)
515 if arglist.getLastArg(arglist.parser.client_nameOption):
516 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
517 sys.exit(1)
518 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
519 '-dylib_compatibility_version')
520 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
521 '-dylib_current_version')
522
523 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
524 self.addDarwinArch(cmd_args, arch, arglist)
525 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
526 else:
527 self.addDarwinSubArch(cmd_args, arch, arglist)
528
529 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
530 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
531 sys.exit(1)
532
533 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
534 '-dylib_install_name')
535
536 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
537 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
538 sys.exit(1)
539 if arglist.getLastArg(arglist.parser.private_bundleOption):
540 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
541 sys.exit(1)
542
543 if arglist.getLastArg(arglist.parser.Zall_loadOption):
544 cmd_args.append('-all_load')
545
546 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
547 '-allowable_client')
548
549 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
550 cmd_args.append('-bind_at_load')
551
552 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
553 cmd_args.append('-dead_strip')
554
555 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
556 cmd_args.append('-no_dead_strip_inits_and_terms')
557
558 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
559 '-dylib_file')
560
561 if arglist.getLastArg(arglist.parser.ZdynamicOption):
562 cmd_args.append('-dynamic')
563
564 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
565 '-exported_symbols_list')
566
567 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
568 cmd_args.append('-flat_namespace')
569
570 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
571 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
572 '-image_base')
573 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
574 '-init')
575
576 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
577 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
578 # FIXME: I don't understand what is going on
579 # here. This is supposed to come from
580 # darwin_ld_minversion, but gcc doesn't seem to be
581 # following that; it must be getting over-ridden
582 # somewhere.
583 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000584 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000585 else:
586 # addAll doesn't make sense here but this is what gcc
587 # does.
588 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
589 '-macosx_version_min')
590
591 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
592 '-iphoneos_version_min')
593 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
594
595 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
596 cmd_args.append('-multi_module')
597
598 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
599 cmd_args.append('-single_module')
600
601 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
602 '-multiply_defined')
603
604 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
605 '-multiply_defined_unused')
606
607 if arglist.getLastArg(arglist.parser.f_pieOption):
608 cmd_args.append('-pie')
609
610 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
611 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
612 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
613 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
614 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
615 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
616 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
617 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
618 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
619 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
620 '-segaddr')
621 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
622 '-segs_read_only_addr')
623 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
624 '-segs_read_write_addr')
625 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
626 '-seg_addr_table')
627 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
628 '-fn_seg_addr_table_filename')
629 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
630 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
631 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
632 '-syslibroot')
633 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
634 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
635 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
636 '-umbrella')
637 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
638 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
639 '-unexported_symbols_list')
640 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
641 '-weak_reference_mismatches')
642
643 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
644 cmd_args.append('-weak_reference_mismatches')
645 cmd_args.append('non-weak')
646
647 arglist.addLastArg(cmd_args, arglist.parser.XOption)
648 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
649 arglist.addLastArg(cmd_args, arglist.parser.wOption)
650 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
651 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
652 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
653 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
654 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
655 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
656 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
657 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
658 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
659 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
660 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
661 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000662
663 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000664 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000665 assert outputType is Types.ImageType
666
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000667 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000668 # comes from specs (starting with link_command). Consult gcc
669 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000670
671 # FIXME: gcc's spec controls when this is done; certain things
672 # like -filelist or -Wl, still trigger a link stage. I don't
673 # quite understand how gcc decides to execute the linker,
674 # investigate. Also, the spec references -fdump= which seems
675 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000676 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000677
678 # Not sure why this particular decomposition exists in gcc.
679 self.addLinkArgs(cmd_args, arch, arglist)
680
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000681 # This toolchain never accumlates options in specs, the only
682 # place this gets used is to add -ObjC.
683 if (arglist.getLastArg(arglist.parser.ObjCOption) or
684 arglist.getLastArg(arglist.parser.f_objcOption)):
685 cmd_args.append('-ObjC')
686 if arglist.getLastArg(arglist.parser.ObjCXXOption):
687 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000688
689 # FIXME: gcc has %{x} in here. How could this ever happen?
690 # Cruft?
691 arglist.addLastArg(cmd_args, arglist.parser.dOption)
692 arglist.addLastArg(cmd_args, arglist.parser.tOption)
693 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
694 arglist.addLastArg(cmd_args, arglist.parser.uOption)
695 arglist.addLastArg(cmd_args, arglist.parser.AOption)
696 arglist.addLastArg(cmd_args, arglist.parser.eOption)
697 arglist.addLastArg(cmd_args, arglist.parser.mOption)
698 arglist.addLastArg(cmd_args, arglist.parser.rOption)
699
700 cmd_args.extend(arglist.render(output))
701
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000702 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000703 if (not arglist.getLastArg(arglist.parser.AOption) and
704 not arglist.getLastArg(arglist.parser.nostdlibOption) and
705 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
706 # Derived from startfile spec.
707 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
708 # Derived from darwin_dylib1 spec.
709 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
710 cmd_args.append('-ldylib1.o')
711 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000712 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000713 cmd_args.append('-ldylib1.o')
714 else:
715 cmd_args.append('-ldylib1.10.5.o')
716 else:
717 if arglist.getLastArg(arglist.parser.ZbundleOption):
718 if not arglist.getLastArg(arglist.parser.staticOption):
719 cmd_args.append('-lbundle1.o')
720 else:
721 if arglist.getLastArg(arglist.parser.pgOption):
722 if arglist.getLastArg(arglist.parser.staticOption):
723 cmd_args.append('-lgcrt0.o')
724 else:
725 if arglist.getLastArg(arglist.parser.objectOption):
726 cmd_args.append('-lgcrt0.o')
727 else:
728 if arglist.getLastArg(arglist.parser.preloadOption):
729 cmd_args.append('-lgcrt0.o')
730 else:
731 cmd_args.append('-lgcrt1.o')
732
733 # darwin_crt2 spec is empty.
734 pass
735 else:
736 if arglist.getLastArg(arglist.parser.staticOption):
737 cmd_args.append('-lcrt0.o')
738 else:
739 if arglist.getLastArg(arglist.parser.objectOption):
740 cmd_args.append('-lcrt0.o')
741 else:
742 if arglist.getLastArg(arglist.parser.preloadOption):
743 cmd_args.append('-lcrt0.o')
744 else:
745 # Derived from darwin_crt1 spec.
746 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
747 cmd_args.append('-lcrt1.o')
748 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000749 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000750 cmd_args.append('-lcrt1.o')
751 else:
752 cmd_args.append('-lcrt1.10.5.o')
753
754 # darwin_crt2 spec is empty.
755 pass
756
757 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
758 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000759 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000760 # FIXME: gcc does a library search for this
761 # file, this will be be broken currently.
762 cmd_args.append('crt3.o')
763
764 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
765
766 if arglist.getLastArg(arglist.parser.f_openmpOption):
767 # This is more complicated in gcc...
768 cmd_args.append('-lgomp')
769
770 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000771 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000772 if arglist.getValue(arch) == 'x86_64':
773 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
774 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
775 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
776 "-L/usr/lib/gcc/%s" % tcDir,
777 "-L/usr/lib/gcc/%s" % tcDir,
778 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
779 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000780
Daniel Dunbara5677512009-01-05 19:53:30 +0000781 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000782 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000783
784 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
785 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
786 arglist.getLastArg(arglist.parser.f_createProfileOption) or
787 arglist.getLastArg(arglist.parser.coverageOption)):
788 cmd_args.append('-lgcov')
789
790 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
791 cmd_args.append('-allow_stack_execute')
792
793 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
794 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
795 # link_ssp spec is empty.
796
797 # Derived from libgcc spec.
798 if arglist.getLastArg(arglist.parser.staticOption):
799 cmd_args.append('-lgcc_static')
800 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
801 cmd_args.append('-lgcc_eh')
802 cmd_args.append('-lgcc')
803 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
804 # Derived from darwin_iphoneos_libgcc spec.
805 cmd_args.append('-lgcc_s.10.5')
806 cmd_args.append('-lgcc')
807 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
808 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
809 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000810 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000811 cmd_args.append('-lgcc_s.10.4')
812 else:
813 cmd_args.append('-lgcc_s.10.5')
814 cmd_args.append('-lgcc')
815 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000816 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000817 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000818 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000819 cmd_args.append('-lgcc_s.10.5')
820 cmd_args.append('-lgcc')
821
822 # Derived from lib spec.
823 if not arglist.getLastArg(arglist.parser.staticOption):
824 cmd_args.append('-lSystem')
825
826 if (not arglist.getLastArg(arglist.parser.AOption) and
827 not arglist.getLastArg(arglist.parser.nostdlibOption) and
828 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
829 # endfile_spec is empty.
830 pass
831
832 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
833 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
834
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000835 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
836 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000837
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000838 # FIXME: We need to add a dsymutil job here in some particular
839 # cases (basically whenever we have a c-family input we are
840 # compiling, I think). Find out why this is the condition, and
841 # implement. See link_command spec for more details.
842
Daniel Dunbara5677512009-01-05 19:53:30 +0000843class LipoTool(Tool):
844 def __init__(self):
845 super(LipoTool, self).__init__('lipo')
846
847 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000848 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000849 assert outputType is Types.ImageType
850
Daniel Dunbardb439902009-01-07 18:40:45 +0000851 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000852 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000853 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000854 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000855 jobs.addJob(Jobs.Command('lipo', cmd_args))