blob: ce87d38255c2f6b802b702d9e726e7ecbb6ba973 [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 Dunbar11672ec2009-01-13 18:51:26 +000028 output, outputType, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +000029 extraArgs):
Daniel Dunbar11672ec2009-01-13 18:51:26 +000030 cmd_args = []
31 for arg in arglist.args:
32 if arg.opt.forwardToGCC():
33 cmd_args.extend(arglist.render(arg))
34
35 cmd_args.extend(extraArgs)
Daniel Dunbara5677512009-01-05 19:53:30 +000036 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000037 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000038 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000039 cmd_args.extend(['-o', '-'])
Daniel Dunbara5677512009-01-05 19:53:30 +000040 elif output is None:
Daniel Dunbardb439902009-01-07 18:40:45 +000041 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000042 else:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000043 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000044
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000045 # Only pass -x if gcc will understand it; otherwise hope gcc
46 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000047 # would go wrong in is for linker inputs if they happened to
48 # have an odd suffix; really the only way to get this to
49 # happen is a command like '-x foobar a.c' which will treat
50 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000051 #
52 # FIXME: For the linker case specifically, can we safely
53 # convert inputs into '-Wl,' options?
54 for input in inputs:
55 if input.type.canBeUserSpecified:
56 cmd_args.extend(['-x', input.type.name])
57
58 if isinstance(input.source, Jobs.PipedJob):
59 cmd_args.append('-')
60 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000061 assert isinstance(input.source, Arguments.Arg)
62 # If this is a linker input then assume we can forward
63 # just by rendering.
64 if input.source.opt.isLinkerInput:
65 cmd_args.extend(arglist.render(input.source))
66 else:
67 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000068
69 jobs.addJob(Jobs.Command('gcc', cmd_args))
70
71class GCC_PreprocessTool(GCC_Common_Tool):
72 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000073 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000074 (Tool.eFlagsPipedInput |
75 Tool.eFlagsPipedOutput))
76
77 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +000078 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000079 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +000080 output, outputType, arglist,
Daniel Dunbardb439902009-01-07 18:40:45 +000081 ['-E'])
Daniel Dunbara5677512009-01-05 19:53:30 +000082
83class GCC_CompileTool(GCC_Common_Tool):
84 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000085 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000086 (Tool.eFlagsPipedInput |
87 Tool.eFlagsPipedOutput |
88 Tool.eFlagsIntegratedCPP))
89
90 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +000091 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000092 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +000093 output, outputType, arglist,
Daniel Dunbardb439902009-01-07 18:40:45 +000094 ['-S'])
Daniel Dunbara5677512009-01-05 19:53:30 +000095
96class GCC_PrecompileTool(GCC_Common_Tool):
97 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000098 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +000099 (Tool.eFlagsPipedInput |
100 Tool.eFlagsIntegratedCPP))
101
102 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000103 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000104 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000105 output, outputType, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +0000106 [])
107
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000108class Darwin_AssembleTool(Tool):
109 def __init__(self, toolChain):
110 super(Darwin_AssembleTool, self).__init__('as',
111 Tool.eFlagsPipedInput)
112 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000113
114 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000115 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000116 assert len(inputs) == 1
117 assert outputType is Types.ObjectType
118
119 input = inputs[0]
120
121 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000122
Daniel Dunbar76290532009-01-13 06:25:31 +0000123 # Bit of a hack, this is only used for original inputs.
124 if input.isOriginalInput():
125 if arglist.getLastArg(arglist.parser.gGroup):
126 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000127
128 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000129 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000130 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000131 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000132 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
133 arglist.getLastArg(arglist.parser.staticOption) or
134 arglist.getLastArg(arglist.parser.f_appleKextOption)):
135 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
136 cmd_args.append('-static')
137
138 for arg in arglist.getArgs2(arglist.parser.WaOption,
139 arglist.parser.XassemblerOption):
140 cmd_args.extend(arglist.getValues(arg))
141
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000142 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000143 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000144 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000145 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000146 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000147
148 # asm_final spec is empty.
149
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000150 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
151 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000152
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000153class GCC_AssembleTool(GCC_Common_Tool):
154 def __init__(self):
155 # We can't generally assume the assembler can take or output
156 # on pipes.
157 super(GCC_AssembleTool, self).__init__('gcc (as)')
158
159 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000160 output, outputType, arglist):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000161 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000162 output, outputType, arglist,
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000163 ['-c'])
164
165class GCC_LinkTool(GCC_Common_Tool):
166 def __init__(self):
167 super(GCC_LinkTool, self).__init__('gcc (ld)')
168
169 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000170 output, outputType, arglist):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000171 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000172 output, outputType, arglist,
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000173 [])
174
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000175class Clang_CompileTool(Tool):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000176 def __init__(self):
177 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000178 (Tool.eFlagsPipedInput |
179 Tool.eFlagsPipedOutput |
180 Tool.eFlagsIntegratedCPP))
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000181
182 def constructJob(self, phase, arch, jobs, inputs,
183 output, outputType, arglist):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args = []
185
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000186 patchOutputNameForPTH = False
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000187 if output is None:
188 cmd_args.append('-fsyntax-only')
189 elif outputType is Types.AsmTypeNoPP:
190 cmd_args.append('-S')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000191 elif outputType is Types.PCHType:
192 # No special option needed, driven by -x. However, we
193 # patch the output name to try and not conflict with gcc.
194 patchOutputNameForPTH = True
195
196 # FIXME: This is a total hack. Copy the input header file
197 # to the output, so that it can be -include'd by clang.
198 assert len(inputs) == 1
199 assert not isinstance(output, Jobs.PipedJob)
200 assert not isinstance(inputs[0].source, Jobs.PipedJob)
201 inputPath = arglist.getValue(inputs[0].source)
202 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
203 os.path.basename(inputPath))
204 # Only do copy when the output doesn't exist.
205 if not os.path.exists(outputPath):
206 import shutil
207 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000208 else:
209 raise ValueError,"Unexpected output type for clang tool."
210
211 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000212 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
213 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000214 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
215
216 # Special case debug options to only pass -g to clang. This is
217 # wrong.
218 if arglist.getLastArg(arglist.parser.gGroup):
219 cmd_args.append('-g')
220
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000221 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
222
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000223 # FIXME: Clang isn't going to accept just anything here.
224 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
225
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000226 # Automatically load .pth files which match -include options.
227 for arg in arglist.getArgs(arglist.parser.includeOption):
228 pthPath = arglist.getValue(arg) + '.pth'
229 if os.path.exists(pthPath):
230 cmd_args.append('-token-cache')
231 cmd_args.append(pthPath)
232
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000233 # FIXME: Dehardcode this.
234 cmd_args.append('-fblocks')
235
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000236 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
237 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
238 arglist.addLastArg(cmd_args, arglist.parser.wOption)
239 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
240
241 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
242 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
243 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
244 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
245 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
246 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
247 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
248 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
249 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
250 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
251 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
252
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000253 if arch is not None:
254 cmd_args.extend(arglist.render(arch))
255
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000256 if isinstance(output, Jobs.PipedJob):
257 cmd_args.extend(['-o', '-'])
258 else:
259 if patchOutputNameForPTH:
260 base,suffix = os.path.splitext(arglist.getValue(output))
261 if suffix == '.gch':
262 suffix = '.pth'
263 cmd_args.append('-o')
264 cmd_args.append(base + suffix)
265 else:
266 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000267
268 for input in inputs:
269 cmd_args.append('-x')
270 cmd_args.append(input.type.name)
271 if isinstance(input.source, Jobs.PipedJob):
272 cmd_args.append('-')
273 else:
274 cmd_args.extend(arglist.renderAsInput(input.source))
275
276 jobs.addJob(Jobs.Command('clang', cmd_args))
277
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000278
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000279class Darwin_X86_CompileTool(Tool):
280 def __init__(self, toolChain):
281 super(Darwin_X86_CompileTool, self).__init__('cc1',
282 (Tool.eFlagsPipedInput |
283 Tool.eFlagsPipedOutput |
284 Tool.eFlagsIntegratedCPP))
285 self.toolChain = toolChain
286
Daniel Dunbardff9f502009-01-12 18:51:02 +0000287 def addCPPArgs(self, cmd_args, arch, arglist):
288 # Derived from cpp spec.
289
Daniel Dunbardff9f502009-01-12 18:51:02 +0000290 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000291 # The gcc spec is broken here, it refers to dynamic but
292 # that has been translated. Start by being bug compatible.
293
294 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
295 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000296 else:
297 cmd_args.append('-D__DYNAMIC__')
298
299 if arglist.getLastArg(arglist.parser.pthreadOption):
300 cmd_args.append('-D_REENTRANT')
301
302 def addCC1Args(self, cmd_args, arch, arglist):
303 # Derived from cc1 spec.
304
305 # FIXME: -fapple-kext seems to disable this too. Investigate.
306 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
307 not arglist.getLastArg(arglist.parser.staticOption) and
308 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
309 cmd_args.append('-fPIC')
310
311 # FIXME: Remove mthumb
312 # FIXME: Remove mno-thumb
313
314 # FIXME: As with ld, something else is going on. My best guess
315 # is gcc is faking an -mmacosx-version-min
316 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000317# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
318# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
319# cmd_args.append('-mmacosx-version-min=' +
320# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000321
322 # FIXME: Remove faltivec
323 # FIXME: Remove mno-fused-madd
324 # FIXME: Remove mlong-branch
325 # FIXME: Remove mlongcall
326 # FIXME: Remove mcpu=G4
327 # FIXME: Remove mcpu=G5
328
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000329 if (arglist.getLastArg(arglist.parser.gGroup) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000330 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
331 cmd_args.append('-feliminate-unused-debug-symbols')
332
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000333 def getBaseInputName(self, inputs, arglist):
334 # FIXME: gcc uses a temporary name here when the base
335 # input is stdin, but only in auxbase. Investigate.
336 baseInputValue = arglist.getValue(inputs[0].baseInput)
337 return os.path.basename(baseInputValue)
338
339 def getBaseInputStem(self, inputs, arglist):
340 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
341
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000342 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000343 output, outputType, arglist):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000344 inputType = inputs[0].type
345 assert not [i for i in inputs if i.type != inputType]
346
347 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000348 isCXX = False
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000349 if inputType is Types.CType:
350 cc1Name = 'cc1'
351 usePP = True
352 elif inputType is Types.CTypeNoPP:
353 cc1Name = 'cc1'
354 usePP = False
355 elif inputType is Types.ObjCType:
356 cc1Name = 'cc1obj'
357 usePP = True
358 elif inputType is Types.ObjCTypeNoPP:
359 cc1Name = 'cc1obj'
360 usePP = False
361 elif inputType is Types.CXXType:
362 cc1Name = 'cc1plus'
363 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000364 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000365 elif inputType is Types.CXXTypeNoPP:
366 cc1Name = 'cc1plus'
367 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000368 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000369 elif inputType is Types.ObjCXXType:
370 cc1Name = 'cc1objplus'
371 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000372 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000373 elif inputType is Types.ObjCXXTypeNoPP:
374 cc1Name = 'cc1objplus'
375 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000376 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000377 else:
378 raise RuntimeError,"Unexpected input type for Darwin compile tool."
379
380 cmd_args = []
381 if (arglist.getLastArg(arglist.parser.traditionalOption) or
382 arglist.getLastArg(arglist.parser.f_traditionalOption)):
383 raise ValueError,"-traditional is not supported without -E"
384
385 if usePP:
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000386 # Derived from cpp_options.
387
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000388 # Derived from cpp_unique_options.
389
390 if (arglist.getLastArg(arglist.parser.COption) or
391 arglist.getLastArg(arglist.parser.CCOption)):
392 if not arglist.getLastArg(arglist.parser.EOption):
393 raise ValueError,"-C or -CC is not supported without -E"
394 if not arglist.getLastArg(arglist.parser.QOption):
395 cmd_args.append('-quiet')
396 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
397 arglist.addLastArg(cmd_args, arglist.parser.vOption)
398 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
399 arglist.addLastArg(cmd_args, arglist.parser.POption)
400
401 # FIXME: Handle %I properly.
402 if arglist.getValue(arch) == 'x86_64':
403 cmd_args.append('-imultilib')
404 cmd_args.append('x86_64')
405
406 if arglist.getLastArg(arglist.parser.MDOption):
407 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000408 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000409 outputOpt = arglist.getLastArg(arglist.parser.oOption)
410 if outputOpt:
411 base,ext = os.path.splitext(arglist.getValue(outputOpt))
412 cmd_args.append(base+'.d')
413 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000414 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000415 if arglist.getLastArg(arglist.parser.MMDOption):
416 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000417 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000418 outputOpt = arglist.getLastArg(arglist.parser.oOption)
419 if outputOpt:
420 base,ext = os.path.splitext(arglist.getValue(outputOpt))
421 cmd_args.append(base+'.d')
422 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000423 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000424 arglist.addLastArg(cmd_args, arglist.parser.MOption)
425 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
426 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
427 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
428 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
429 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
430 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
431 if (not arglist.getLastArg(arglist.parser.MOption) and
432 not arglist.getLastArg(arglist.parser.MMOption) and
433 (arglist.getLastArg(arglist.parser.MDOption) or
434 arglist.getLastArg(arglist.parser.MMDOption))):
435 outputOpt = arglist.getLastArg(arglist.parser.oOption)
436 if outputOpt:
437 cmd_args.append('-MQ')
438 cmd_args.append(arglist.getValue(outputOpt))
439
440 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
441 if arglist.getLastArg(arglist.parser.g3Option):
442 cmd_args.append('-dD')
443 arglist.addLastArg(cmd_args, arglist.parser.HOption)
444
Daniel Dunbardff9f502009-01-12 18:51:02 +0000445 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000446
447 arglist.addAllArgs3(cmd_args,
448 arglist.parser.DOption,
449 arglist.parser.UOption,
450 arglist.parser.AOption)
451
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000452 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000453
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000454 for input in inputs:
455 if isinstance(input.source, Jobs.PipedJob):
456 cmd_args.append('-')
457 else:
458 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000459
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000460 for arg in arglist.getArgs2(arglist.parser.WpOption,
461 arglist.parser.XpreprocessorOption):
462 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000463
464 if arglist.getLastArg(arglist.parser.f_mudflapOption):
465 cmd_args.append('-D_MUDFLAP')
466 cmd_args.append('-include')
467 cmd_args.append('mf-runtime.h')
468
469 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
470 cmd_args.append('-D_MUDFLAP')
471 cmd_args.append('-D_MUDFLAPTH')
472 cmd_args.append('-include')
473 cmd_args.append('mf-runtime.h')
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000474
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000475 else:
476 cmd_args.append('-fpreprocessed')
477 # FIXME: There is a spec command to remove
478 # -fpredictive-compilation args here. Investigate.
479
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000480 for input in inputs:
481 if isinstance(input.source, Jobs.PipedJob):
482 cmd_args.append('-')
483 else:
484 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000485
Daniel Dunbar816dd502009-01-12 17:53:19 +0000486 # Derived from cc1_options spec.
487 if (arglist.getLastArg(arglist.parser.fastOption) or
488 arglist.getLastArg(arglist.parser.fastfOption) or
489 arglist.getLastArg(arglist.parser.fastcpOption)):
490 cmd_args.append('-O3')
491
492 if (arglist.getLastArg(arglist.parser.pgOption) and
493 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
494 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
495
Daniel Dunbardff9f502009-01-12 18:51:02 +0000496 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000497
498 if not arglist.getLastArg(arglist.parser.QOption):
499 cmd_args.append('-quiet')
500
501 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000502 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000503
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000504 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000505
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000506 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
507 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000508
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000509 # FIXME: The goal is to use the user provided -o if that is
510 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000511 # name. Find a clean way to go about this.
512 if (arglist.getLastArg(arglist.parser.cOption) or
513 arglist.getLastArg(arglist.parser.SOption)):
514 outputOpt = arglist.getLastArg(arglist.parser.oOption)
515 if outputOpt:
516 cmd_args.append('-auxbase-strip')
517 cmd_args.append(arglist.getValue(outputOpt))
518 else:
519 cmd_args.append('-auxbase')
520 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000521 else:
522 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000523 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000524
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000525 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000526
Daniel Dunbar816dd502009-01-12 17:53:19 +0000527 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
528 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000529 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000530 arglist.addLastArg(cmd_args, arglist.parser.wOption)
531 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
532 if arglist.getLastArg(arglist.parser.vOption):
533 cmd_args.append('-version')
534 if arglist.getLastArg(arglist.parser.pgOption):
535 cmd_args.append('-p')
536 arglist.addLastArg(cmd_args, arglist.parser.pOption)
537
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000538 # ccc treats -fsyntax-only specially.
539 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
540 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000541
542 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
543 if arglist.getLastArg(arglist.parser.QnOption):
544 cmd_args.append('-fno-ident')
545
546 # FIXME: This isn't correct.
547 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
548 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
549
Daniel Dunbar76290532009-01-13 06:25:31 +0000550 # There is no need for this level of compatibility, but it
551 # makes diffing easier.
552 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
553 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000554 if isinstance(output, Jobs.PipedJob):
Daniel Dunbar76290532009-01-13 06:25:31 +0000555 output_args = ['-o', '-']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000556 elif output is None:
Daniel Dunbar76290532009-01-13 06:25:31 +0000557 output_args = ['-o', '/dev/null']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000558 else:
Daniel Dunbar76290532009-01-13 06:25:31 +0000559 output_args = arglist.render(output)
560
561 if not outputAtEnd:
562 cmd_args.extend(output_args)
563
Daniel Dunbar816dd502009-01-12 17:53:19 +0000564 # FIXME: Still don't get what is happening here. Investigate.
565 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
566
567 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
568 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
569 cmd_args.append('-fno-builtin')
570 cmd_args.append('-fno-merge-constants')
571
572 if arglist.getLastArg(arglist.parser.coverageOption):
573 cmd_args.append('-fprofile-arcs')
574 cmd_args.append('-ftest-coverage')
575
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000576 if isCXX:
577 cmd_args.append('-D__private_extern__=extern')
578
Daniel Dunbar76290532009-01-13 06:25:31 +0000579 if outputAtEnd:
580 cmd_args.extend(output_args)
581
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000582 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
583 cmd_args))
584
585
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000586class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000587 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000588 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000589 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000590
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000591 def getMacosxVersionTuple(self, arglist):
592 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
593 if arg:
594 version = arglist.getValue(arg)
595 components = version.split('.')
596 try:
597 return tuple(map(int, components))
598 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000599 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000600 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000601 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000602 return (10, major-4, minor)
603
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000604 def addDarwinArch(self, cmd_args, arch, arglist):
605 # Derived from darwin_arch spec.
606 cmd_args.append('-arch')
607 # FIXME: The actual spec uses -m64 for this, but we want to
608 # respect arch. Figure out what exactly gcc is doing.
609 #if arglist.getLastArg(arglist.parser.m_64Option):
610 if arglist.getValue(arch) == 'x86_64':
611 cmd_args.append('x86_64')
612 else:
613 cmd_args.append('i386')
614
615 def addDarwinSubArch(self, cmd_args, arch, arglist):
616 # Derived from darwin_subarch spec, not sure what the
617 # distinction exists for but at least for this chain it is the same.
618 return self.addDarwinArch(cmd_args, arch, arglist)
619
620 def addLinkArgs(self, cmd_args, arch, arglist):
621 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000622 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
623 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000624 cmd_args.append('-dynamic')
625 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
626 # FIXME: Replace -lobjc in forward args with
627 # -lobjc-gnu. How do we wish to handle such things?
628 pass
629
630 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
631 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
632 self.addDarwinArch(cmd_args, arch, arglist)
633 cmd_args.append('-force_cpusubtype_all')
634 else:
635 self.addDarwinSubArch(cmd_args, arch, arglist)
636
637 if arglist.getLastArg(arglist.parser.ZbundleOption):
638 cmd_args.append('-bundle')
639 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
640 '-bundle_loader')
641 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
642 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
643 # FIXME: Where should diagnostics go?
644 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
645 sys.exit(1)
646 if arglist.getLastArg(arglist.parser.current_versionOption):
647 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
648 sys.exit(1)
649 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
650 cmd_args.append('-force_flat_namespace')
651 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
652 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
653 sys.exit(1)
654 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
655 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
656 else:
657 cmd_args.append('-dylib')
658 if arglist.getLastArg(arglist.parser.ZbundleOption):
659 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
660 sys.exit(1)
661 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
662 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
663 sys.exit(1)
664 if arglist.getLastArg(arglist.parser.client_nameOption):
665 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
666 sys.exit(1)
667 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
668 '-dylib_compatibility_version')
669 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
670 '-dylib_current_version')
671
672 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
673 self.addDarwinArch(cmd_args, arch, arglist)
674 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
675 else:
676 self.addDarwinSubArch(cmd_args, arch, arglist)
677
678 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
679 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
680 sys.exit(1)
681
682 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
683 '-dylib_install_name')
684
685 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
686 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
687 sys.exit(1)
688 if arglist.getLastArg(arglist.parser.private_bundleOption):
689 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
690 sys.exit(1)
691
692 if arglist.getLastArg(arglist.parser.Zall_loadOption):
693 cmd_args.append('-all_load')
694
695 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
696 '-allowable_client')
697
698 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
699 cmd_args.append('-bind_at_load')
700
701 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
702 cmd_args.append('-dead_strip')
703
704 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
705 cmd_args.append('-no_dead_strip_inits_and_terms')
706
707 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
708 '-dylib_file')
709
710 if arglist.getLastArg(arglist.parser.ZdynamicOption):
711 cmd_args.append('-dynamic')
712
713 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
714 '-exported_symbols_list')
715
716 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
717 cmd_args.append('-flat_namespace')
718
719 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
720 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
721 '-image_base')
722 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
723 '-init')
724
725 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
726 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
727 # FIXME: I don't understand what is going on
728 # here. This is supposed to come from
729 # darwin_ld_minversion, but gcc doesn't seem to be
730 # following that; it must be getting over-ridden
731 # somewhere.
732 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000733 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000734 else:
735 # addAll doesn't make sense here but this is what gcc
736 # does.
737 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
738 '-macosx_version_min')
739
740 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
741 '-iphoneos_version_min')
742 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
743
744 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
745 cmd_args.append('-multi_module')
746
747 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
748 cmd_args.append('-single_module')
749
750 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
751 '-multiply_defined')
752
753 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
754 '-multiply_defined_unused')
755
756 if arglist.getLastArg(arglist.parser.f_pieOption):
757 cmd_args.append('-pie')
758
759 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
760 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
761 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
762 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
763 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
764 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
765 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
766 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
767 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
768 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
769 '-segaddr')
770 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
771 '-segs_read_only_addr')
772 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
773 '-segs_read_write_addr')
774 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
775 '-seg_addr_table')
776 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
777 '-fn_seg_addr_table_filename')
778 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
779 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
780 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
781 '-syslibroot')
782 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
783 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
784 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
785 '-umbrella')
786 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
787 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
788 '-unexported_symbols_list')
789 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
790 '-weak_reference_mismatches')
791
792 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
793 cmd_args.append('-weak_reference_mismatches')
794 cmd_args.append('non-weak')
795
796 arglist.addLastArg(cmd_args, arglist.parser.XOption)
797 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
798 arglist.addLastArg(cmd_args, arglist.parser.wOption)
799 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
800 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
801 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
802 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
803 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
804 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
805 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
806 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
807 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
808 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
809 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
810 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000811
812 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000813 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000814 assert outputType is Types.ImageType
815
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000816 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000817 # comes from specs (starting with link_command). Consult gcc
818 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000819
820 # FIXME: gcc's spec controls when this is done; certain things
821 # like -filelist or -Wl, still trigger a link stage. I don't
822 # quite understand how gcc decides to execute the linker,
823 # investigate. Also, the spec references -fdump= which seems
824 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000825 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000826
827 # Not sure why this particular decomposition exists in gcc.
828 self.addLinkArgs(cmd_args, arch, arglist)
829
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000830 # This toolchain never accumlates options in specs, the only
831 # place this gets used is to add -ObjC.
832 if (arglist.getLastArg(arglist.parser.ObjCOption) or
833 arglist.getLastArg(arglist.parser.f_objcOption)):
834 cmd_args.append('-ObjC')
835 if arglist.getLastArg(arglist.parser.ObjCXXOption):
836 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000837
838 # FIXME: gcc has %{x} in here. How could this ever happen?
839 # Cruft?
840 arglist.addLastArg(cmd_args, arglist.parser.dOption)
841 arglist.addLastArg(cmd_args, arglist.parser.tOption)
842 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
843 arglist.addLastArg(cmd_args, arglist.parser.uOption)
844 arglist.addLastArg(cmd_args, arglist.parser.AOption)
845 arglist.addLastArg(cmd_args, arglist.parser.eOption)
846 arglist.addLastArg(cmd_args, arglist.parser.mOption)
847 arglist.addLastArg(cmd_args, arglist.parser.rOption)
848
849 cmd_args.extend(arglist.render(output))
850
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000851 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000852 if (not arglist.getLastArg(arglist.parser.AOption) and
853 not arglist.getLastArg(arglist.parser.nostdlibOption) and
854 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
855 # Derived from startfile spec.
856 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
857 # Derived from darwin_dylib1 spec.
858 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
859 cmd_args.append('-ldylib1.o')
860 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000861 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000862 cmd_args.append('-ldylib1.o')
863 else:
864 cmd_args.append('-ldylib1.10.5.o')
865 else:
866 if arglist.getLastArg(arglist.parser.ZbundleOption):
867 if not arglist.getLastArg(arglist.parser.staticOption):
868 cmd_args.append('-lbundle1.o')
869 else:
870 if arglist.getLastArg(arglist.parser.pgOption):
871 if arglist.getLastArg(arglist.parser.staticOption):
872 cmd_args.append('-lgcrt0.o')
873 else:
874 if arglist.getLastArg(arglist.parser.objectOption):
875 cmd_args.append('-lgcrt0.o')
876 else:
877 if arglist.getLastArg(arglist.parser.preloadOption):
878 cmd_args.append('-lgcrt0.o')
879 else:
880 cmd_args.append('-lgcrt1.o')
881
882 # darwin_crt2 spec is empty.
883 pass
884 else:
885 if arglist.getLastArg(arglist.parser.staticOption):
886 cmd_args.append('-lcrt0.o')
887 else:
888 if arglist.getLastArg(arglist.parser.objectOption):
889 cmd_args.append('-lcrt0.o')
890 else:
891 if arglist.getLastArg(arglist.parser.preloadOption):
892 cmd_args.append('-lcrt0.o')
893 else:
894 # Derived from darwin_crt1 spec.
895 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
896 cmd_args.append('-lcrt1.o')
897 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000898 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000899 cmd_args.append('-lcrt1.o')
900 else:
901 cmd_args.append('-lcrt1.10.5.o')
902
903 # darwin_crt2 spec is empty.
904 pass
905
906 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
907 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000908 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000909 # FIXME: gcc does a library search for this
910 # file, this will be be broken currently.
911 cmd_args.append('crt3.o')
912
913 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
914
915 if arglist.getLastArg(arglist.parser.f_openmpOption):
916 # This is more complicated in gcc...
917 cmd_args.append('-lgomp')
918
919 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000920 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000921 if arglist.getValue(arch) == 'x86_64':
922 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
923 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
924 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
925 "-L/usr/lib/gcc/%s" % tcDir,
926 "-L/usr/lib/gcc/%s" % tcDir,
927 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
928 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000929
Daniel Dunbara5677512009-01-05 19:53:30 +0000930 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000931 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000932
933 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
934 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
935 arglist.getLastArg(arglist.parser.f_createProfileOption) or
936 arglist.getLastArg(arglist.parser.coverageOption)):
937 cmd_args.append('-lgcov')
938
939 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
940 cmd_args.append('-allow_stack_execute')
941
942 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
943 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
944 # link_ssp spec is empty.
945
946 # Derived from libgcc spec.
947 if arglist.getLastArg(arglist.parser.staticOption):
948 cmd_args.append('-lgcc_static')
949 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
950 cmd_args.append('-lgcc_eh')
951 cmd_args.append('-lgcc')
952 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
953 # Derived from darwin_iphoneos_libgcc spec.
954 cmd_args.append('-lgcc_s.10.5')
955 cmd_args.append('-lgcc')
956 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
957 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
958 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000959 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000960 cmd_args.append('-lgcc_s.10.4')
961 else:
962 cmd_args.append('-lgcc_s.10.5')
963 cmd_args.append('-lgcc')
964 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000965 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000966 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000967 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000968 cmd_args.append('-lgcc_s.10.5')
969 cmd_args.append('-lgcc')
970
971 # Derived from lib spec.
972 if not arglist.getLastArg(arglist.parser.staticOption):
973 cmd_args.append('-lSystem')
974
975 if (not arglist.getLastArg(arglist.parser.AOption) and
976 not arglist.getLastArg(arglist.parser.nostdlibOption) and
977 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
978 # endfile_spec is empty.
979 pass
980
981 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
982 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
983
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000984 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
985 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000986
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000987 if (arglist.getLastArg(arglist.parser.gGroup) and
988 not arglist.getLastArg(arglist.parser.gstabsOption) and
989 not arglist.getLastArg(arglist.parser.g0Option)):
990 # FIXME: This is gross, but matches gcc. The test only
991 # considers the suffix (not the -x type), and then only of the
992 # first input.
993 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
994 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
995 '.c++','.cxx','.CPP','.m','.mm'):
996 jobs.addJob(Jobs.Command('dsymutil',
997 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000998
Daniel Dunbara5677512009-01-05 19:53:30 +0000999class LipoTool(Tool):
1000 def __init__(self):
1001 super(LipoTool, self).__init__('lipo')
1002
1003 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +00001004 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +00001005 assert outputType is Types.ImageType
1006
Daniel Dunbardb439902009-01-07 18:40:45 +00001007 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001008 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001009 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001010 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001011 jobs.addJob(Jobs.Command('lipo', cmd_args))