blob: 989b472b72e48571848b11d9b32a7ce856b72ead [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 Dunbar76290532009-01-13 06:25:31 +0000118 # Bit of a hack, this is only used for original inputs.
119 if input.isOriginalInput():
120 if arglist.getLastArg(arglist.parser.gGroup):
121 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000122
123 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000124 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000125 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000126 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000127 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
128 arglist.getLastArg(arglist.parser.staticOption) or
129 arglist.getLastArg(arglist.parser.f_appleKextOption)):
130 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
131 cmd_args.append('-static')
132
133 for arg in arglist.getArgs2(arglist.parser.WaOption,
134 arglist.parser.XassemblerOption):
135 cmd_args.extend(arglist.getValues(arg))
136
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000137 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000138 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000139 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000140 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000141 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000142
143 # asm_final spec is empty.
144
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000145 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
146 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000147
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000148class GCC_AssembleTool(GCC_Common_Tool):
149 def __init__(self):
150 # We can't generally assume the assembler can take or output
151 # on pipes.
152 super(GCC_AssembleTool, self).__init__('gcc (as)')
153
154 def constructJob(self, phase, arch, jobs, inputs,
155 output, outputType, args, arglist):
156 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
157 output, outputType, args, arglist,
158 ['-c'])
159
160class GCC_LinkTool(GCC_Common_Tool):
161 def __init__(self):
162 super(GCC_LinkTool, self).__init__('gcc (ld)')
163
164 def constructJob(self, phase, arch, jobs, inputs,
165 output, outputType, args, arglist):
166 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
167 output, outputType, args, arglist,
168 [])
169
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000170class Darwin_X86_CompileTool(Tool):
171 def __init__(self, toolChain):
172 super(Darwin_X86_CompileTool, self).__init__('cc1',
173 (Tool.eFlagsPipedInput |
174 Tool.eFlagsPipedOutput |
175 Tool.eFlagsIntegratedCPP))
176 self.toolChain = toolChain
177
Daniel Dunbardff9f502009-01-12 18:51:02 +0000178 def addCPPArgs(self, cmd_args, arch, arglist):
179 # Derived from cpp spec.
180
Daniel Dunbardff9f502009-01-12 18:51:02 +0000181 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000182 # The gcc spec is broken here, it refers to dynamic but
183 # that has been translated. Start by being bug compatible.
184
185 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
186 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000187 else:
188 cmd_args.append('-D__DYNAMIC__')
189
190 if arglist.getLastArg(arglist.parser.pthreadOption):
191 cmd_args.append('-D_REENTRANT')
192
193 def addCC1Args(self, cmd_args, arch, arglist):
194 # Derived from cc1 spec.
195
196 # FIXME: -fapple-kext seems to disable this too. Investigate.
197 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
198 not arglist.getLastArg(arglist.parser.staticOption) and
199 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
200 cmd_args.append('-fPIC')
201
202 # FIXME: Remove mthumb
203 # FIXME: Remove mno-thumb
204
205 # FIXME: As with ld, something else is going on. My best guess
206 # is gcc is faking an -mmacosx-version-min
207 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000208# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
209# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
210# cmd_args.append('-mmacosx-version-min=' +
211# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000212
213 # FIXME: Remove faltivec
214 # FIXME: Remove mno-fused-madd
215 # FIXME: Remove mlong-branch
216 # FIXME: Remove mlongcall
217 # FIXME: Remove mcpu=G4
218 # FIXME: Remove mcpu=G5
219
220 if (arglist.getLastArg(arglist.parser.gOption) and
221 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
222 cmd_args.append('-feliminate-unused-debug-symbols')
223
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000224 def getBaseInputName(self, inputs, arglist):
225 # FIXME: gcc uses a temporary name here when the base
226 # input is stdin, but only in auxbase. Investigate.
227 baseInputValue = arglist.getValue(inputs[0].baseInput)
228 return os.path.basename(baseInputValue)
229
230 def getBaseInputStem(self, inputs, arglist):
231 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
232
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000233 def constructJob(self, phase, arch, jobs, inputs,
234 output, outputType, args, arglist):
235 inputType = inputs[0].type
236 assert not [i for i in inputs if i.type != inputType]
237
238 usePP = False
239 if inputType is Types.CType:
240 cc1Name = 'cc1'
241 usePP = True
242 elif inputType is Types.CTypeNoPP:
243 cc1Name = 'cc1'
244 usePP = False
245 elif inputType is Types.ObjCType:
246 cc1Name = 'cc1obj'
247 usePP = True
248 elif inputType is Types.ObjCTypeNoPP:
249 cc1Name = 'cc1obj'
250 usePP = False
251 elif inputType is Types.CXXType:
252 cc1Name = 'cc1plus'
253 usePP = True
254 elif inputType is Types.CXXTypeNoPP:
255 cc1Name = 'cc1plus'
256 usePP = False
257 elif inputType is Types.ObjCXXType:
258 cc1Name = 'cc1objplus'
259 usePP = True
260 elif inputType is Types.ObjCXXTypeNoPP:
261 cc1Name = 'cc1objplus'
262 usePP = False
263 else:
264 raise RuntimeError,"Unexpected input type for Darwin compile tool."
265
266 cmd_args = []
267 if (arglist.getLastArg(arglist.parser.traditionalOption) or
268 arglist.getLastArg(arglist.parser.f_traditionalOption)):
269 raise ValueError,"-traditional is not supported without -E"
270
271 if usePP:
272 # Derived from cpp_unique_options.
273
274 if (arglist.getLastArg(arglist.parser.COption) or
275 arglist.getLastArg(arglist.parser.CCOption)):
276 if not arglist.getLastArg(arglist.parser.EOption):
277 raise ValueError,"-C or -CC is not supported without -E"
278 if not arglist.getLastArg(arglist.parser.QOption):
279 cmd_args.append('-quiet')
280 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
281 arglist.addLastArg(cmd_args, arglist.parser.vOption)
282 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
283 arglist.addLastArg(cmd_args, arglist.parser.POption)
284
285 # FIXME: Handle %I properly.
286 if arglist.getValue(arch) == 'x86_64':
287 cmd_args.append('-imultilib')
288 cmd_args.append('x86_64')
289
290 if arglist.getLastArg(arglist.parser.MDOption):
291 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000292 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000293 outputOpt = arglist.getLastArg(arglist.parser.oOption)
294 if outputOpt:
295 base,ext = os.path.splitext(arglist.getValue(outputOpt))
296 cmd_args.append(base+'.d')
297 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000298 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000299 if arglist.getLastArg(arglist.parser.MMDOption):
300 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000301 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000302 outputOpt = arglist.getLastArg(arglist.parser.oOption)
303 if outputOpt:
304 base,ext = os.path.splitext(arglist.getValue(outputOpt))
305 cmd_args.append(base+'.d')
306 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000307 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000308 arglist.addLastArg(cmd_args, arglist.parser.MOption)
309 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
310 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
311 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
312 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
313 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
314 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
315 if (not arglist.getLastArg(arglist.parser.MOption) and
316 not arglist.getLastArg(arglist.parser.MMOption) and
317 (arglist.getLastArg(arglist.parser.MDOption) or
318 arglist.getLastArg(arglist.parser.MMDOption))):
319 outputOpt = arglist.getLastArg(arglist.parser.oOption)
320 if outputOpt:
321 cmd_args.append('-MQ')
322 cmd_args.append(arglist.getValue(outputOpt))
323
324 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
325 if arglist.getLastArg(arglist.parser.g3Option):
326 cmd_args.append('-dD')
327 arglist.addLastArg(cmd_args, arglist.parser.HOption)
328
Daniel Dunbardff9f502009-01-12 18:51:02 +0000329 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000330
331 arglist.addAllArgs3(cmd_args,
332 arglist.parser.DOption,
333 arglist.parser.UOption,
334 arglist.parser.AOption)
335
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000336 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000337
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000338 for input in inputs:
339 if isinstance(input.source, Jobs.PipedJob):
340 cmd_args.append('-')
341 else:
342 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000343
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000344 for arg in arglist.getArgs2(arglist.parser.WpOption,
345 arglist.parser.XpreprocessorOption):
346 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000347
348 if arglist.getLastArg(arglist.parser.f_mudflapOption):
349 cmd_args.append('-D_MUDFLAP')
350 cmd_args.append('-include')
351 cmd_args.append('mf-runtime.h')
352
353 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
354 cmd_args.append('-D_MUDFLAP')
355 cmd_args.append('-D_MUDFLAPTH')
356 cmd_args.append('-include')
357 cmd_args.append('mf-runtime.h')
358 else:
359 cmd_args.append('-fpreprocessed')
360 # FIXME: There is a spec command to remove
361 # -fpredictive-compilation args here. Investigate.
362
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000363 for input in inputs:
364 if isinstance(input.source, Jobs.PipedJob):
365 cmd_args.append('-')
366 else:
367 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000368
Daniel Dunbar816dd502009-01-12 17:53:19 +0000369 # Derived from cc1_options spec.
370 if (arglist.getLastArg(arglist.parser.fastOption) or
371 arglist.getLastArg(arglist.parser.fastfOption) or
372 arglist.getLastArg(arglist.parser.fastcpOption)):
373 cmd_args.append('-O3')
374
375 if (arglist.getLastArg(arglist.parser.pgOption) and
376 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
377 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
378
Daniel Dunbardff9f502009-01-12 18:51:02 +0000379 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000380
381 if not arglist.getLastArg(arglist.parser.QOption):
382 cmd_args.append('-quiet')
383
384 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000385 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000386
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000387 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000388
389 # FIXME: Figure out where these are coming from and
390 # dehardcode.
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000391 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
Daniel Dunbar11505a92009-01-13 04:51:51 +0000392 cmd_args.append('-mmacosx-version-min=' +
393 self.toolChain.getMacosxVersionMin())
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000394 if (not arglist.getLastArg(arglist.parser.m_32Option) and
395 not arglist.getLastArg(arglist.parser.m_64Option)):
396 if arglist.getValue(arch) == 'x86_64':
397 cmd_args.append('-m64')
398 else:
399 cmd_args.append('-m32')
400 if not arglist.getLastArg(arglist.parser.m_tuneOption):
401 cmd_args.append('-mtune=core2')
Daniel Dunbar11505a92009-01-13 04:51:51 +0000402
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000403 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
404 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000405
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000406 # FIXME: The goal is to use the user provided -o if that is
407 # our final output, otherwise to drive from the original input
408 # name.
409 #
410 # This implementation is close, but gcc also does this for -S
411 # which is broken, and it would be nice to find a cleaner way
412 # which doesn't introduce a dependency on the output argument
413 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000414 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbar1e0ead42009-01-12 22:19:59 +0000415 if outputOpt and outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000416 cmd_args.append('-auxbase-strip')
417 cmd_args.append(arglist.getValue(outputOpt))
418 else:
419 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000420 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000421
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000422 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000423
424 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
425 # FIXME: -Wall is getting some special treatment. Investigate.
426 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
427 arglist.addLastArg(cmd_args, arglist.parser.wOption)
428 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
429 if arglist.getLastArg(arglist.parser.vOption):
430 cmd_args.append('-version')
431 if arglist.getLastArg(arglist.parser.pgOption):
432 cmd_args.append('-p')
433 arglist.addLastArg(cmd_args, arglist.parser.pOption)
434
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000435 # ccc treats -fsyntax-only specially.
436 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
437 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000438
439 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
440 if arglist.getLastArg(arglist.parser.QnOption):
441 cmd_args.append('-fno-ident')
442
443 # FIXME: This isn't correct.
444 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
445 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
446
Daniel Dunbar76290532009-01-13 06:25:31 +0000447 # There is no need for this level of compatibility, but it
448 # makes diffing easier.
449 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
450 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000451 if isinstance(output, Jobs.PipedJob):
Daniel Dunbar76290532009-01-13 06:25:31 +0000452 output_args = ['-o', '-']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000453 elif output is None:
Daniel Dunbar76290532009-01-13 06:25:31 +0000454 output_args = ['-o', '/dev/null']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000455 else:
Daniel Dunbar76290532009-01-13 06:25:31 +0000456 output_args = arglist.render(output)
457
458 if not outputAtEnd:
459 cmd_args.extend(output_args)
460
Daniel Dunbar816dd502009-01-12 17:53:19 +0000461 # FIXME: Still don't get what is happening here. Investigate.
462 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
463
464 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
465 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
466 cmd_args.append('-fno-builtin')
467 cmd_args.append('-fno-merge-constants')
468
469 if arglist.getLastArg(arglist.parser.coverageOption):
470 cmd_args.append('-fprofile-arcs')
471 cmd_args.append('-ftest-coverage')
472
Daniel Dunbar76290532009-01-13 06:25:31 +0000473 if outputAtEnd:
474 cmd_args.extend(output_args)
475
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000476 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
477 cmd_args))
478
479
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000480class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000481 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000482 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000483 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000484
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000485 def getMacosxVersionTuple(self, arglist):
486 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
487 if arg:
488 version = arglist.getValue(arg)
489 components = version.split('.')
490 try:
491 return tuple(map(int, components))
492 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000493 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000494 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000495 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000496 return (10, major-4, minor)
497
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000498 def addDarwinArch(self, cmd_args, arch, arglist):
499 # Derived from darwin_arch spec.
500 cmd_args.append('-arch')
501 # FIXME: The actual spec uses -m64 for this, but we want to
502 # respect arch. Figure out what exactly gcc is doing.
503 #if arglist.getLastArg(arglist.parser.m_64Option):
504 if arglist.getValue(arch) == 'x86_64':
505 cmd_args.append('x86_64')
506 else:
507 cmd_args.append('i386')
508
509 def addDarwinSubArch(self, cmd_args, arch, arglist):
510 # Derived from darwin_subarch spec, not sure what the
511 # distinction exists for but at least for this chain it is the same.
512 return self.addDarwinArch(cmd_args, arch, arglist)
513
514 def addLinkArgs(self, cmd_args, arch, arglist):
515 # Derived from link spec.
516 if arglist.getLastArg(arglist.parser.staticOption):
517 cmd_args.append('-static')
518 else:
519 cmd_args.append('-dynamic')
520 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
521 # FIXME: Replace -lobjc in forward args with
522 # -lobjc-gnu. How do we wish to handle such things?
523 pass
524
525 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
526 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
527 self.addDarwinArch(cmd_args, arch, arglist)
528 cmd_args.append('-force_cpusubtype_all')
529 else:
530 self.addDarwinSubArch(cmd_args, arch, arglist)
531
532 if arglist.getLastArg(arglist.parser.ZbundleOption):
533 cmd_args.append('-bundle')
534 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
535 '-bundle_loader')
536 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
537 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
538 # FIXME: Where should diagnostics go?
539 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
540 sys.exit(1)
541 if arglist.getLastArg(arglist.parser.current_versionOption):
542 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
543 sys.exit(1)
544 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
545 cmd_args.append('-force_flat_namespace')
546 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
547 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
548 sys.exit(1)
549 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
550 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
551 else:
552 cmd_args.append('-dylib')
553 if arglist.getLastArg(arglist.parser.ZbundleOption):
554 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
555 sys.exit(1)
556 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
557 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
558 sys.exit(1)
559 if arglist.getLastArg(arglist.parser.client_nameOption):
560 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
561 sys.exit(1)
562 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
563 '-dylib_compatibility_version')
564 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
565 '-dylib_current_version')
566
567 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
568 self.addDarwinArch(cmd_args, arch, arglist)
569 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
570 else:
571 self.addDarwinSubArch(cmd_args, arch, arglist)
572
573 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
574 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
575 sys.exit(1)
576
577 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
578 '-dylib_install_name')
579
580 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
581 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
582 sys.exit(1)
583 if arglist.getLastArg(arglist.parser.private_bundleOption):
584 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
585 sys.exit(1)
586
587 if arglist.getLastArg(arglist.parser.Zall_loadOption):
588 cmd_args.append('-all_load')
589
590 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
591 '-allowable_client')
592
593 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
594 cmd_args.append('-bind_at_load')
595
596 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
597 cmd_args.append('-dead_strip')
598
599 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
600 cmd_args.append('-no_dead_strip_inits_and_terms')
601
602 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
603 '-dylib_file')
604
605 if arglist.getLastArg(arglist.parser.ZdynamicOption):
606 cmd_args.append('-dynamic')
607
608 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
609 '-exported_symbols_list')
610
611 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
612 cmd_args.append('-flat_namespace')
613
614 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
615 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
616 '-image_base')
617 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
618 '-init')
619
620 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
621 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
622 # FIXME: I don't understand what is going on
623 # here. This is supposed to come from
624 # darwin_ld_minversion, but gcc doesn't seem to be
625 # following that; it must be getting over-ridden
626 # somewhere.
627 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000628 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000629 else:
630 # addAll doesn't make sense here but this is what gcc
631 # does.
632 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
633 '-macosx_version_min')
634
635 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
636 '-iphoneos_version_min')
637 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
638
639 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
640 cmd_args.append('-multi_module')
641
642 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
643 cmd_args.append('-single_module')
644
645 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
646 '-multiply_defined')
647
648 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
649 '-multiply_defined_unused')
650
651 if arglist.getLastArg(arglist.parser.f_pieOption):
652 cmd_args.append('-pie')
653
654 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
655 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
656 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
657 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
658 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
659 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
660 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
661 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
662 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
663 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
664 '-segaddr')
665 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
666 '-segs_read_only_addr')
667 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
668 '-segs_read_write_addr')
669 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
670 '-seg_addr_table')
671 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
672 '-fn_seg_addr_table_filename')
673 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
674 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
675 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
676 '-syslibroot')
677 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
678 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
679 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
680 '-umbrella')
681 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
682 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
683 '-unexported_symbols_list')
684 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
685 '-weak_reference_mismatches')
686
687 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
688 cmd_args.append('-weak_reference_mismatches')
689 cmd_args.append('non-weak')
690
691 arglist.addLastArg(cmd_args, arglist.parser.XOption)
692 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
693 arglist.addLastArg(cmd_args, arglist.parser.wOption)
694 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
695 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
696 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
697 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
698 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
699 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
700 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
701 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
702 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
703 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
704 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
705 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000706
707 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000708 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000709 assert outputType is Types.ImageType
710
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000711 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000712 # comes from specs (starting with link_command). Consult gcc
713 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000714
715 # FIXME: gcc's spec controls when this is done; certain things
716 # like -filelist or -Wl, still trigger a link stage. I don't
717 # quite understand how gcc decides to execute the linker,
718 # investigate. Also, the spec references -fdump= which seems
719 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000720 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000721
722 # Not sure why this particular decomposition exists in gcc.
723 self.addLinkArgs(cmd_args, arch, arglist)
724
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000725 # This toolchain never accumlates options in specs, the only
726 # place this gets used is to add -ObjC.
727 if (arglist.getLastArg(arglist.parser.ObjCOption) or
728 arglist.getLastArg(arglist.parser.f_objcOption)):
729 cmd_args.append('-ObjC')
730 if arglist.getLastArg(arglist.parser.ObjCXXOption):
731 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000732
733 # FIXME: gcc has %{x} in here. How could this ever happen?
734 # Cruft?
735 arglist.addLastArg(cmd_args, arglist.parser.dOption)
736 arglist.addLastArg(cmd_args, arglist.parser.tOption)
737 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
738 arglist.addLastArg(cmd_args, arglist.parser.uOption)
739 arglist.addLastArg(cmd_args, arglist.parser.AOption)
740 arglist.addLastArg(cmd_args, arglist.parser.eOption)
741 arglist.addLastArg(cmd_args, arglist.parser.mOption)
742 arglist.addLastArg(cmd_args, arglist.parser.rOption)
743
744 cmd_args.extend(arglist.render(output))
745
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000746 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000747 if (not arglist.getLastArg(arglist.parser.AOption) and
748 not arglist.getLastArg(arglist.parser.nostdlibOption) and
749 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
750 # Derived from startfile spec.
751 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
752 # Derived from darwin_dylib1 spec.
753 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
754 cmd_args.append('-ldylib1.o')
755 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000756 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000757 cmd_args.append('-ldylib1.o')
758 else:
759 cmd_args.append('-ldylib1.10.5.o')
760 else:
761 if arglist.getLastArg(arglist.parser.ZbundleOption):
762 if not arglist.getLastArg(arglist.parser.staticOption):
763 cmd_args.append('-lbundle1.o')
764 else:
765 if arglist.getLastArg(arglist.parser.pgOption):
766 if arglist.getLastArg(arglist.parser.staticOption):
767 cmd_args.append('-lgcrt0.o')
768 else:
769 if arglist.getLastArg(arglist.parser.objectOption):
770 cmd_args.append('-lgcrt0.o')
771 else:
772 if arglist.getLastArg(arglist.parser.preloadOption):
773 cmd_args.append('-lgcrt0.o')
774 else:
775 cmd_args.append('-lgcrt1.o')
776
777 # darwin_crt2 spec is empty.
778 pass
779 else:
780 if arglist.getLastArg(arglist.parser.staticOption):
781 cmd_args.append('-lcrt0.o')
782 else:
783 if arglist.getLastArg(arglist.parser.objectOption):
784 cmd_args.append('-lcrt0.o')
785 else:
786 if arglist.getLastArg(arglist.parser.preloadOption):
787 cmd_args.append('-lcrt0.o')
788 else:
789 # Derived from darwin_crt1 spec.
790 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
791 cmd_args.append('-lcrt1.o')
792 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000793 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000794 cmd_args.append('-lcrt1.o')
795 else:
796 cmd_args.append('-lcrt1.10.5.o')
797
798 # darwin_crt2 spec is empty.
799 pass
800
801 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
802 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000803 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000804 # FIXME: gcc does a library search for this
805 # file, this will be be broken currently.
806 cmd_args.append('crt3.o')
807
808 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
809
810 if arglist.getLastArg(arglist.parser.f_openmpOption):
811 # This is more complicated in gcc...
812 cmd_args.append('-lgomp')
813
814 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000815 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000816 if arglist.getValue(arch) == 'x86_64':
817 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
818 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
819 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
820 "-L/usr/lib/gcc/%s" % tcDir,
821 "-L/usr/lib/gcc/%s" % tcDir,
822 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
823 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000824
Daniel Dunbara5677512009-01-05 19:53:30 +0000825 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000826 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000827
828 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
829 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
830 arglist.getLastArg(arglist.parser.f_createProfileOption) or
831 arglist.getLastArg(arglist.parser.coverageOption)):
832 cmd_args.append('-lgcov')
833
834 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
835 cmd_args.append('-allow_stack_execute')
836
837 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
838 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
839 # link_ssp spec is empty.
840
841 # Derived from libgcc spec.
842 if arglist.getLastArg(arglist.parser.staticOption):
843 cmd_args.append('-lgcc_static')
844 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
845 cmd_args.append('-lgcc_eh')
846 cmd_args.append('-lgcc')
847 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
848 # Derived from darwin_iphoneos_libgcc spec.
849 cmd_args.append('-lgcc_s.10.5')
850 cmd_args.append('-lgcc')
851 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
852 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
853 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000854 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000855 cmd_args.append('-lgcc_s.10.4')
856 else:
857 cmd_args.append('-lgcc_s.10.5')
858 cmd_args.append('-lgcc')
859 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000860 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000861 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000862 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000863 cmd_args.append('-lgcc_s.10.5')
864 cmd_args.append('-lgcc')
865
866 # Derived from lib spec.
867 if not arglist.getLastArg(arglist.parser.staticOption):
868 cmd_args.append('-lSystem')
869
870 if (not arglist.getLastArg(arglist.parser.AOption) and
871 not arglist.getLastArg(arglist.parser.nostdlibOption) and
872 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
873 # endfile_spec is empty.
874 pass
875
876 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
877 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
878
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000879 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
880 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000881
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000882 if (arglist.getLastArg(arglist.parser.gGroup) and
883 not arglist.getLastArg(arglist.parser.gstabsOption) and
884 not arglist.getLastArg(arglist.parser.g0Option)):
885 # FIXME: This is gross, but matches gcc. The test only
886 # considers the suffix (not the -x type), and then only of the
887 # first input.
888 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
889 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
890 '.c++','.cxx','.CPP','.m','.mm'):
891 jobs.addJob(Jobs.Command('dsymutil',
892 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000893
Daniel Dunbara5677512009-01-05 19:53:30 +0000894class LipoTool(Tool):
895 def __init__(self):
896 super(LipoTool, self).__init__('lipo')
897
898 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000899 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000900 assert outputType is Types.ImageType
901
Daniel Dunbardb439902009-01-07 18:40:45 +0000902 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000903 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000904 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000905 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000906 jobs.addJob(Jobs.Command('lipo', cmd_args))