blob: 6edb2a380317fc82fd3afe2440421ba0cb29264c [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
177 def constructJob(self, phase, arch, jobs, inputs,
178 output, outputType, args, arglist):
179 inputType = inputs[0].type
180 assert not [i for i in inputs if i.type != inputType]
181
182 usePP = False
183 if inputType is Types.CType:
184 cc1Name = 'cc1'
185 usePP = True
186 elif inputType is Types.CTypeNoPP:
187 cc1Name = 'cc1'
188 usePP = False
189 elif inputType is Types.ObjCType:
190 cc1Name = 'cc1obj'
191 usePP = True
192 elif inputType is Types.ObjCTypeNoPP:
193 cc1Name = 'cc1obj'
194 usePP = False
195 elif inputType is Types.CXXType:
196 cc1Name = 'cc1plus'
197 usePP = True
198 elif inputType is Types.CXXTypeNoPP:
199 cc1Name = 'cc1plus'
200 usePP = False
201 elif inputType is Types.ObjCXXType:
202 cc1Name = 'cc1objplus'
203 usePP = True
204 elif inputType is Types.ObjCXXTypeNoPP:
205 cc1Name = 'cc1objplus'
206 usePP = False
207 else:
208 raise RuntimeError,"Unexpected input type for Darwin compile tool."
209
210 cmd_args = []
211 if (arglist.getLastArg(arglist.parser.traditionalOption) or
212 arglist.getLastArg(arglist.parser.f_traditionalOption)):
213 raise ValueError,"-traditional is not supported without -E"
214
215 if usePP:
216 # Derived from cpp_unique_options.
217
218 if (arglist.getLastArg(arglist.parser.COption) or
219 arglist.getLastArg(arglist.parser.CCOption)):
220 if not arglist.getLastArg(arglist.parser.EOption):
221 raise ValueError,"-C or -CC is not supported without -E"
222 if not arglist.getLastArg(arglist.parser.QOption):
223 cmd_args.append('-quiet')
224 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
225 arglist.addLastArg(cmd_args, arglist.parser.vOption)
226 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
227 arglist.addLastArg(cmd_args, arglist.parser.POption)
228
229 # FIXME: Handle %I properly.
230 if arglist.getValue(arch) == 'x86_64':
231 cmd_args.append('-imultilib')
232 cmd_args.append('x86_64')
233
234 if arglist.getLastArg(arglist.parser.MDOption):
235 cmd_args.append('-MD')
236 outputOpt = arglist.getLastArg(arglist.parser.oOption)
237 if outputOpt:
238 base,ext = os.path.splitext(arglist.getValue(outputOpt))
239 cmd_args.append(base+'.d')
240 else:
241 # FIXME: Get correct basename.
242 cmd_args.append('FIXME.d')
243 if arglist.getLastArg(arglist.parser.MMDOption):
244 cmd_args.append('-MMD')
245 outputOpt = arglist.getLastArg(arglist.parser.oOption)
246 if outputOpt:
247 base,ext = os.path.splitext(arglist.getValue(outputOpt))
248 cmd_args.append(base+'.d')
249 else:
250 # FIXME: Get correct basename.
251 cmd_args.append('FIXME.d')
252 arglist.addLastArg(cmd_args, arglist.parser.MOption)
253 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
254 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
255 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
256 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
257 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
258 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
259 if (not arglist.getLastArg(arglist.parser.MOption) and
260 not arglist.getLastArg(arglist.parser.MMOption) and
261 (arglist.getLastArg(arglist.parser.MDOption) or
262 arglist.getLastArg(arglist.parser.MMDOption))):
263 outputOpt = arglist.getLastArg(arglist.parser.oOption)
264 if outputOpt:
265 cmd_args.append('-MQ')
266 cmd_args.append(arglist.getValue(outputOpt))
267
268 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
269 if arglist.getLastArg(arglist.parser.g3Option):
270 cmd_args.append('-dD')
271 arglist.addLastArg(cmd_args, arglist.parser.HOption)
272
273 # FIXME: %C
274
275 arglist.addAllArgs3(cmd_args,
276 arglist.parser.DOption,
277 arglist.parser.UOption,
278 arglist.parser.AOption)
279
280 # FIXME: Add i*
281
282 # FIXME: %Z
283
284 # FIXME: %i
285
286 if arglist.getLastArg(arglist.parser.f_mudflapOption):
287 cmd_args.append('-D_MUDFLAP')
288 cmd_args.append('-include')
289 cmd_args.append('mf-runtime.h')
290
291 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
292 cmd_args.append('-D_MUDFLAP')
293 cmd_args.append('-D_MUDFLAPTH')
294 cmd_args.append('-include')
295 cmd_args.append('mf-runtime.h')
296 else:
297 cmd_args.append('-fpreprocessed')
298 # FIXME: There is a spec command to remove
299 # -fpredictive-compilation args here. Investigate.
300
301 # FIXME: cc1_options
302
303 if arch:
304 cmd_args.extend(arglist.render(arch))
305 if isinstance(output, Jobs.PipedJob):
306 cmd_args.extend(['-o', '-'])
307 elif output is None:
308 cmd_args.append('-fsyntax-only')
309 else:
310 cmd_args.extend(arglist.render(output))
311
312 for input in inputs:
313 if isinstance(input.source, Jobs.PipedJob):
314 cmd_args.append('-')
315 else:
316 cmd_args.extend(arglist.renderAsInput(input.source))
317
318 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
319 cmd_args))
320
321
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000322class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000323 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000324 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000325 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000326
327 def getMacosxVersionMin(self):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000328 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000329 return '%d.%d.%d' % (10, major-4, minor)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000330
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000331 def getMacosxVersionTuple(self, arglist):
332 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
333 if arg:
334 version = arglist.getValue(arg)
335 components = version.split('.')
336 try:
337 return tuple(map(int, components))
338 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000339 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000340 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000341 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000342 return (10, major-4, minor)
343
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000344 def addDarwinArch(self, cmd_args, arch, arglist):
345 # Derived from darwin_arch spec.
346 cmd_args.append('-arch')
347 # FIXME: The actual spec uses -m64 for this, but we want to
348 # respect arch. Figure out what exactly gcc is doing.
349 #if arglist.getLastArg(arglist.parser.m_64Option):
350 if arglist.getValue(arch) == 'x86_64':
351 cmd_args.append('x86_64')
352 else:
353 cmd_args.append('i386')
354
355 def addDarwinSubArch(self, cmd_args, arch, arglist):
356 # Derived from darwin_subarch spec, not sure what the
357 # distinction exists for but at least for this chain it is the same.
358 return self.addDarwinArch(cmd_args, arch, arglist)
359
360 def addLinkArgs(self, cmd_args, arch, arglist):
361 # Derived from link spec.
362 if arglist.getLastArg(arglist.parser.staticOption):
363 cmd_args.append('-static')
364 else:
365 cmd_args.append('-dynamic')
366 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
367 # FIXME: Replace -lobjc in forward args with
368 # -lobjc-gnu. How do we wish to handle such things?
369 pass
370
371 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
372 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
373 self.addDarwinArch(cmd_args, arch, arglist)
374 cmd_args.append('-force_cpusubtype_all')
375 else:
376 self.addDarwinSubArch(cmd_args, arch, arglist)
377
378 if arglist.getLastArg(arglist.parser.ZbundleOption):
379 cmd_args.append('-bundle')
380 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
381 '-bundle_loader')
382 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
383 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
384 # FIXME: Where should diagnostics go?
385 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
386 sys.exit(1)
387 if arglist.getLastArg(arglist.parser.current_versionOption):
388 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
389 sys.exit(1)
390 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
391 cmd_args.append('-force_flat_namespace')
392 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
393 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
394 sys.exit(1)
395 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
396 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
397 else:
398 cmd_args.append('-dylib')
399 if arglist.getLastArg(arglist.parser.ZbundleOption):
400 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
401 sys.exit(1)
402 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
403 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
404 sys.exit(1)
405 if arglist.getLastArg(arglist.parser.client_nameOption):
406 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
407 sys.exit(1)
408 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
409 '-dylib_compatibility_version')
410 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
411 '-dylib_current_version')
412
413 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
414 self.addDarwinArch(cmd_args, arch, arglist)
415 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
416 else:
417 self.addDarwinSubArch(cmd_args, arch, arglist)
418
419 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
420 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
421 sys.exit(1)
422
423 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
424 '-dylib_install_name')
425
426 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
427 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
428 sys.exit(1)
429 if arglist.getLastArg(arglist.parser.private_bundleOption):
430 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
431 sys.exit(1)
432
433 if arglist.getLastArg(arglist.parser.Zall_loadOption):
434 cmd_args.append('-all_load')
435
436 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
437 '-allowable_client')
438
439 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
440 cmd_args.append('-bind_at_load')
441
442 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
443 cmd_args.append('-dead_strip')
444
445 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
446 cmd_args.append('-no_dead_strip_inits_and_terms')
447
448 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
449 '-dylib_file')
450
451 if arglist.getLastArg(arglist.parser.ZdynamicOption):
452 cmd_args.append('-dynamic')
453
454 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
455 '-exported_symbols_list')
456
457 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
458 cmd_args.append('-flat_namespace')
459
460 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
461 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
462 '-image_base')
463 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
464 '-init')
465
466 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
467 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
468 # FIXME: I don't understand what is going on
469 # here. This is supposed to come from
470 # darwin_ld_minversion, but gcc doesn't seem to be
471 # following that; it must be getting over-ridden
472 # somewhere.
473 cmd_args.append('-macosx_version_min')
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000474 cmd_args.append(self.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000475 else:
476 # addAll doesn't make sense here but this is what gcc
477 # does.
478 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
479 '-macosx_version_min')
480
481 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
482 '-iphoneos_version_min')
483 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
484
485 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
486 cmd_args.append('-multi_module')
487
488 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
489 cmd_args.append('-single_module')
490
491 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
492 '-multiply_defined')
493
494 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
495 '-multiply_defined_unused')
496
497 if arglist.getLastArg(arglist.parser.f_pieOption):
498 cmd_args.append('-pie')
499
500 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
501 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
502 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
503 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
504 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
505 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
506 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
507 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
508 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
509 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
510 '-segaddr')
511 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
512 '-segs_read_only_addr')
513 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
514 '-segs_read_write_addr')
515 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
516 '-seg_addr_table')
517 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
518 '-fn_seg_addr_table_filename')
519 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
520 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
521 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
522 '-syslibroot')
523 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
524 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
525 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
526 '-umbrella')
527 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
528 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
529 '-unexported_symbols_list')
530 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
531 '-weak_reference_mismatches')
532
533 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
534 cmd_args.append('-weak_reference_mismatches')
535 cmd_args.append('non-weak')
536
537 arglist.addLastArg(cmd_args, arglist.parser.XOption)
538 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
539 arglist.addLastArg(cmd_args, arglist.parser.wOption)
540 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
541 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
542 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
543 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
544 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
545 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
546 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
547 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
548 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
549 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
550 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
551 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000552
553 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000554 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000555 assert outputType is Types.ImageType
556
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000557 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000558 # comes from specs (starting with link_command). Consult gcc
559 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000560
561 # FIXME: gcc's spec controls when this is done; certain things
562 # like -filelist or -Wl, still trigger a link stage. I don't
563 # quite understand how gcc decides to execute the linker,
564 # investigate. Also, the spec references -fdump= which seems
565 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000566 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000567
568 # Not sure why this particular decomposition exists in gcc.
569 self.addLinkArgs(cmd_args, arch, arglist)
570
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000571 # This toolchain never accumlates options in specs, the only
572 # place this gets used is to add -ObjC.
573 if (arglist.getLastArg(arglist.parser.ObjCOption) or
574 arglist.getLastArg(arglist.parser.f_objcOption)):
575 cmd_args.append('-ObjC')
576 if arglist.getLastArg(arglist.parser.ObjCXXOption):
577 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000578
579 # FIXME: gcc has %{x} in here. How could this ever happen?
580 # Cruft?
581 arglist.addLastArg(cmd_args, arglist.parser.dOption)
582 arglist.addLastArg(cmd_args, arglist.parser.tOption)
583 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
584 arglist.addLastArg(cmd_args, arglist.parser.uOption)
585 arglist.addLastArg(cmd_args, arglist.parser.AOption)
586 arglist.addLastArg(cmd_args, arglist.parser.eOption)
587 arglist.addLastArg(cmd_args, arglist.parser.mOption)
588 arglist.addLastArg(cmd_args, arglist.parser.rOption)
589
590 cmd_args.extend(arglist.render(output))
591
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000592 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000593 if (not arglist.getLastArg(arglist.parser.AOption) and
594 not arglist.getLastArg(arglist.parser.nostdlibOption) and
595 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
596 # Derived from startfile spec.
597 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
598 # Derived from darwin_dylib1 spec.
599 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
600 cmd_args.append('-ldylib1.o')
601 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000602 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000603 cmd_args.append('-ldylib1.o')
604 else:
605 cmd_args.append('-ldylib1.10.5.o')
606 else:
607 if arglist.getLastArg(arglist.parser.ZbundleOption):
608 if not arglist.getLastArg(arglist.parser.staticOption):
609 cmd_args.append('-lbundle1.o')
610 else:
611 if arglist.getLastArg(arglist.parser.pgOption):
612 if arglist.getLastArg(arglist.parser.staticOption):
613 cmd_args.append('-lgcrt0.o')
614 else:
615 if arglist.getLastArg(arglist.parser.objectOption):
616 cmd_args.append('-lgcrt0.o')
617 else:
618 if arglist.getLastArg(arglist.parser.preloadOption):
619 cmd_args.append('-lgcrt0.o')
620 else:
621 cmd_args.append('-lgcrt1.o')
622
623 # darwin_crt2 spec is empty.
624 pass
625 else:
626 if arglist.getLastArg(arglist.parser.staticOption):
627 cmd_args.append('-lcrt0.o')
628 else:
629 if arglist.getLastArg(arglist.parser.objectOption):
630 cmd_args.append('-lcrt0.o')
631 else:
632 if arglist.getLastArg(arglist.parser.preloadOption):
633 cmd_args.append('-lcrt0.o')
634 else:
635 # Derived from darwin_crt1 spec.
636 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
637 cmd_args.append('-lcrt1.o')
638 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000639 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000640 cmd_args.append('-lcrt1.o')
641 else:
642 cmd_args.append('-lcrt1.10.5.o')
643
644 # darwin_crt2 spec is empty.
645 pass
646
647 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
648 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000649 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000650 # FIXME: gcc does a library search for this
651 # file, this will be be broken currently.
652 cmd_args.append('crt3.o')
653
654 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
655
656 if arglist.getLastArg(arglist.parser.f_openmpOption):
657 # This is more complicated in gcc...
658 cmd_args.append('-lgomp')
659
660 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000661 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000662 if arglist.getValue(arch) == 'x86_64':
663 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
664 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
665 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
666 "-L/usr/lib/gcc/%s" % tcDir,
667 "-L/usr/lib/gcc/%s" % tcDir,
668 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
669 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000670
Daniel Dunbara5677512009-01-05 19:53:30 +0000671 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000672 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000673
674 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
675 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
676 arglist.getLastArg(arglist.parser.f_createProfileOption) or
677 arglist.getLastArg(arglist.parser.coverageOption)):
678 cmd_args.append('-lgcov')
679
680 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
681 cmd_args.append('-allow_stack_execute')
682
683 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
684 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
685 # link_ssp spec is empty.
686
687 # Derived from libgcc spec.
688 if arglist.getLastArg(arglist.parser.staticOption):
689 cmd_args.append('-lgcc_static')
690 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
691 cmd_args.append('-lgcc_eh')
692 cmd_args.append('-lgcc')
693 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
694 # Derived from darwin_iphoneos_libgcc spec.
695 cmd_args.append('-lgcc_s.10.5')
696 cmd_args.append('-lgcc')
697 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
698 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
699 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000700 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000701 cmd_args.append('-lgcc_s.10.4')
702 else:
703 cmd_args.append('-lgcc_s.10.5')
704 cmd_args.append('-lgcc')
705 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000706 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000707 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000708 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000709 cmd_args.append('-lgcc_s.10.5')
710 cmd_args.append('-lgcc')
711
712 # Derived from lib spec.
713 if not arglist.getLastArg(arglist.parser.staticOption):
714 cmd_args.append('-lSystem')
715
716 if (not arglist.getLastArg(arglist.parser.AOption) and
717 not arglist.getLastArg(arglist.parser.nostdlibOption) and
718 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
719 # endfile_spec is empty.
720 pass
721
722 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
723 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
724
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000725 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
726 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000727
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000728 # FIXME: We need to add a dsymutil job here in some particular
729 # cases (basically whenever we have a c-family input we are
730 # compiling, I think). Find out why this is the condition, and
731 # implement. See link_command spec for more details.
732
Daniel Dunbara5677512009-01-05 19:53:30 +0000733class LipoTool(Tool):
734 def __init__(self):
735 super(LipoTool, self).__init__('lipo')
736
737 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000738 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000739 assert outputType is Types.ImageType
740
Daniel Dunbardb439902009-01-07 18:40:45 +0000741 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000742 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000743 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000744 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000745 jobs.addJob(Jobs.Command('lipo', cmd_args))