blob: a12c84a155188b85e49879972b84294f460f66eb [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.
622 if arglist.getLastArg(arglist.parser.staticOption):
623 cmd_args.append('-static')
624 else:
625 cmd_args.append('-dynamic')
626 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
627 # FIXME: Replace -lobjc in forward args with
628 # -lobjc-gnu. How do we wish to handle such things?
629 pass
630
631 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
632 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
633 self.addDarwinArch(cmd_args, arch, arglist)
634 cmd_args.append('-force_cpusubtype_all')
635 else:
636 self.addDarwinSubArch(cmd_args, arch, arglist)
637
638 if arglist.getLastArg(arglist.parser.ZbundleOption):
639 cmd_args.append('-bundle')
640 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
641 '-bundle_loader')
642 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
643 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
644 # FIXME: Where should diagnostics go?
645 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
646 sys.exit(1)
647 if arglist.getLastArg(arglist.parser.current_versionOption):
648 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
649 sys.exit(1)
650 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
651 cmd_args.append('-force_flat_namespace')
652 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
653 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
654 sys.exit(1)
655 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
656 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
657 else:
658 cmd_args.append('-dylib')
659 if arglist.getLastArg(arglist.parser.ZbundleOption):
660 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
661 sys.exit(1)
662 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
663 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
664 sys.exit(1)
665 if arglist.getLastArg(arglist.parser.client_nameOption):
666 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
667 sys.exit(1)
668 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
669 '-dylib_compatibility_version')
670 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
671 '-dylib_current_version')
672
673 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
674 self.addDarwinArch(cmd_args, arch, arglist)
675 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
676 else:
677 self.addDarwinSubArch(cmd_args, arch, arglist)
678
679 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
680 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
681 sys.exit(1)
682
683 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
684 '-dylib_install_name')
685
686 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
687 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
688 sys.exit(1)
689 if arglist.getLastArg(arglist.parser.private_bundleOption):
690 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
691 sys.exit(1)
692
693 if arglist.getLastArg(arglist.parser.Zall_loadOption):
694 cmd_args.append('-all_load')
695
696 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
697 '-allowable_client')
698
699 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
700 cmd_args.append('-bind_at_load')
701
702 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
703 cmd_args.append('-dead_strip')
704
705 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
706 cmd_args.append('-no_dead_strip_inits_and_terms')
707
708 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
709 '-dylib_file')
710
711 if arglist.getLastArg(arglist.parser.ZdynamicOption):
712 cmd_args.append('-dynamic')
713
714 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
715 '-exported_symbols_list')
716
717 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
718 cmd_args.append('-flat_namespace')
719
720 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
721 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
722 '-image_base')
723 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
724 '-init')
725
726 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
727 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
728 # FIXME: I don't understand what is going on
729 # here. This is supposed to come from
730 # darwin_ld_minversion, but gcc doesn't seem to be
731 # following that; it must be getting over-ridden
732 # somewhere.
733 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000734 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000735 else:
736 # addAll doesn't make sense here but this is what gcc
737 # does.
738 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
739 '-macosx_version_min')
740
741 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
742 '-iphoneos_version_min')
743 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
744
745 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
746 cmd_args.append('-multi_module')
747
748 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
749 cmd_args.append('-single_module')
750
751 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
752 '-multiply_defined')
753
754 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
755 '-multiply_defined_unused')
756
757 if arglist.getLastArg(arglist.parser.f_pieOption):
758 cmd_args.append('-pie')
759
760 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
761 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
762 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
763 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
764 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
765 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
766 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
767 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
768 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
769 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
770 '-segaddr')
771 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
772 '-segs_read_only_addr')
773 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
774 '-segs_read_write_addr')
775 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
776 '-seg_addr_table')
777 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
778 '-fn_seg_addr_table_filename')
779 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
780 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
781 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
782 '-syslibroot')
783 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
784 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
785 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
786 '-umbrella')
787 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
788 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
789 '-unexported_symbols_list')
790 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
791 '-weak_reference_mismatches')
792
793 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
794 cmd_args.append('-weak_reference_mismatches')
795 cmd_args.append('non-weak')
796
797 arglist.addLastArg(cmd_args, arglist.parser.XOption)
798 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
799 arglist.addLastArg(cmd_args, arglist.parser.wOption)
800 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
801 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
802 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
803 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
804 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
805 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
806 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
807 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
808 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
809 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
810 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
811 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000812
813 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000814 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000815 assert outputType is Types.ImageType
816
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000817 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000818 # comes from specs (starting with link_command). Consult gcc
819 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000820
821 # FIXME: gcc's spec controls when this is done; certain things
822 # like -filelist or -Wl, still trigger a link stage. I don't
823 # quite understand how gcc decides to execute the linker,
824 # investigate. Also, the spec references -fdump= which seems
825 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000826 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000827
828 # Not sure why this particular decomposition exists in gcc.
829 self.addLinkArgs(cmd_args, arch, arglist)
830
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000831 # This toolchain never accumlates options in specs, the only
832 # place this gets used is to add -ObjC.
833 if (arglist.getLastArg(arglist.parser.ObjCOption) or
834 arglist.getLastArg(arglist.parser.f_objcOption)):
835 cmd_args.append('-ObjC')
836 if arglist.getLastArg(arglist.parser.ObjCXXOption):
837 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000838
839 # FIXME: gcc has %{x} in here. How could this ever happen?
840 # Cruft?
841 arglist.addLastArg(cmd_args, arglist.parser.dOption)
842 arglist.addLastArg(cmd_args, arglist.parser.tOption)
843 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
844 arglist.addLastArg(cmd_args, arglist.parser.uOption)
845 arglist.addLastArg(cmd_args, arglist.parser.AOption)
846 arglist.addLastArg(cmd_args, arglist.parser.eOption)
847 arglist.addLastArg(cmd_args, arglist.parser.mOption)
848 arglist.addLastArg(cmd_args, arglist.parser.rOption)
849
850 cmd_args.extend(arglist.render(output))
851
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000852 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000853 if (not arglist.getLastArg(arglist.parser.AOption) and
854 not arglist.getLastArg(arglist.parser.nostdlibOption) and
855 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
856 # Derived from startfile spec.
857 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
858 # Derived from darwin_dylib1 spec.
859 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
860 cmd_args.append('-ldylib1.o')
861 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000862 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000863 cmd_args.append('-ldylib1.o')
864 else:
865 cmd_args.append('-ldylib1.10.5.o')
866 else:
867 if arglist.getLastArg(arglist.parser.ZbundleOption):
868 if not arglist.getLastArg(arglist.parser.staticOption):
869 cmd_args.append('-lbundle1.o')
870 else:
871 if arglist.getLastArg(arglist.parser.pgOption):
872 if arglist.getLastArg(arglist.parser.staticOption):
873 cmd_args.append('-lgcrt0.o')
874 else:
875 if arglist.getLastArg(arglist.parser.objectOption):
876 cmd_args.append('-lgcrt0.o')
877 else:
878 if arglist.getLastArg(arglist.parser.preloadOption):
879 cmd_args.append('-lgcrt0.o')
880 else:
881 cmd_args.append('-lgcrt1.o')
882
883 # darwin_crt2 spec is empty.
884 pass
885 else:
886 if arglist.getLastArg(arglist.parser.staticOption):
887 cmd_args.append('-lcrt0.o')
888 else:
889 if arglist.getLastArg(arglist.parser.objectOption):
890 cmd_args.append('-lcrt0.o')
891 else:
892 if arglist.getLastArg(arglist.parser.preloadOption):
893 cmd_args.append('-lcrt0.o')
894 else:
895 # Derived from darwin_crt1 spec.
896 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
897 cmd_args.append('-lcrt1.o')
898 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000899 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000900 cmd_args.append('-lcrt1.o')
901 else:
902 cmd_args.append('-lcrt1.10.5.o')
903
904 # darwin_crt2 spec is empty.
905 pass
906
907 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
908 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000909 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000910 # FIXME: gcc does a library search for this
911 # file, this will be be broken currently.
912 cmd_args.append('crt3.o')
913
914 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
915
916 if arglist.getLastArg(arglist.parser.f_openmpOption):
917 # This is more complicated in gcc...
918 cmd_args.append('-lgomp')
919
920 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000921 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000922 if arglist.getValue(arch) == 'x86_64':
923 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
924 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
925 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
926 "-L/usr/lib/gcc/%s" % tcDir,
927 "-L/usr/lib/gcc/%s" % tcDir,
928 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
929 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000930
Daniel Dunbara5677512009-01-05 19:53:30 +0000931 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000932 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000933
934 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
935 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
936 arglist.getLastArg(arglist.parser.f_createProfileOption) or
937 arglist.getLastArg(arglist.parser.coverageOption)):
938 cmd_args.append('-lgcov')
939
940 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
941 cmd_args.append('-allow_stack_execute')
942
943 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
944 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
945 # link_ssp spec is empty.
946
947 # Derived from libgcc spec.
948 if arglist.getLastArg(arglist.parser.staticOption):
949 cmd_args.append('-lgcc_static')
950 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
951 cmd_args.append('-lgcc_eh')
952 cmd_args.append('-lgcc')
953 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
954 # Derived from darwin_iphoneos_libgcc spec.
955 cmd_args.append('-lgcc_s.10.5')
956 cmd_args.append('-lgcc')
957 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
958 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
959 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000960 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000961 cmd_args.append('-lgcc_s.10.4')
962 else:
963 cmd_args.append('-lgcc_s.10.5')
964 cmd_args.append('-lgcc')
965 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000966 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000967 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000968 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000969 cmd_args.append('-lgcc_s.10.5')
970 cmd_args.append('-lgcc')
971
972 # Derived from lib spec.
973 if not arglist.getLastArg(arglist.parser.staticOption):
974 cmd_args.append('-lSystem')
975
976 if (not arglist.getLastArg(arglist.parser.AOption) and
977 not arglist.getLastArg(arglist.parser.nostdlibOption) and
978 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
979 # endfile_spec is empty.
980 pass
981
982 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
983 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
984
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000985 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
986 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000987
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000988 if (arglist.getLastArg(arglist.parser.gGroup) and
989 not arglist.getLastArg(arglist.parser.gstabsOption) and
990 not arglist.getLastArg(arglist.parser.g0Option)):
991 # FIXME: This is gross, but matches gcc. The test only
992 # considers the suffix (not the -x type), and then only of the
993 # first input.
994 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
995 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
996 '.c++','.cxx','.CPP','.m','.mm'):
997 jobs.addJob(Jobs.Command('dsymutil',
998 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000999
Daniel Dunbara5677512009-01-05 19:53:30 +00001000class LipoTool(Tool):
1001 def __init__(self):
1002 super(LipoTool, self).__init__('lipo')
1003
1004 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +00001005 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +00001006 assert outputType is Types.ImageType
1007
Daniel Dunbardb439902009-01-07 18:40:45 +00001008 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001009 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001010 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001011 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001012 jobs.addJob(Jobs.Command('lipo', cmd_args))