blob: 3341287a85dc6abb8d84b520ef22cec88d329d4f [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
186 if output is None:
187 cmd_args.append('-fsyntax-only')
188 elif outputType is Types.AsmTypeNoPP:
189 cmd_args.append('-S')
190 else:
191 raise ValueError,"Unexpected output type for clang tool."
192
193 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000194 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
195 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000196 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
197
198 # Special case debug options to only pass -g to clang. This is
199 # wrong.
200 if arglist.getLastArg(arglist.parser.gGroup):
201 cmd_args.append('-g')
202
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000203 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
204
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000205 # FIXME: Clang isn't going to accept just anything here.
206 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
207
208 # FIXME: Dehardcode this.
209 cmd_args.append('-fblocks')
210
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000211 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
212 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
213 arglist.addLastArg(cmd_args, arglist.parser.wOption)
214 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
215
216 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
217 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
218 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
219 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
220 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
221 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
222 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
223 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
224 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
225 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
226 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
227
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000228 if arch is not None:
229 cmd_args.extend(arglist.render(arch))
230
231 cmd_args.extend(arglist.render(output))
232
233 for input in inputs:
234 cmd_args.append('-x')
235 cmd_args.append(input.type.name)
236 if isinstance(input.source, Jobs.PipedJob):
237 cmd_args.append('-')
238 else:
239 cmd_args.extend(arglist.renderAsInput(input.source))
240
241 jobs.addJob(Jobs.Command('clang', cmd_args))
242
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000243
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000244class Darwin_X86_CompileTool(Tool):
245 def __init__(self, toolChain):
246 super(Darwin_X86_CompileTool, self).__init__('cc1',
247 (Tool.eFlagsPipedInput |
248 Tool.eFlagsPipedOutput |
249 Tool.eFlagsIntegratedCPP))
250 self.toolChain = toolChain
251
Daniel Dunbardff9f502009-01-12 18:51:02 +0000252 def addCPPArgs(self, cmd_args, arch, arglist):
253 # Derived from cpp spec.
254
Daniel Dunbardff9f502009-01-12 18:51:02 +0000255 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000256 # The gcc spec is broken here, it refers to dynamic but
257 # that has been translated. Start by being bug compatible.
258
259 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
260 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000261 else:
262 cmd_args.append('-D__DYNAMIC__')
263
264 if arglist.getLastArg(arglist.parser.pthreadOption):
265 cmd_args.append('-D_REENTRANT')
266
267 def addCC1Args(self, cmd_args, arch, arglist):
268 # Derived from cc1 spec.
269
270 # FIXME: -fapple-kext seems to disable this too. Investigate.
271 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
272 not arglist.getLastArg(arglist.parser.staticOption) and
273 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
274 cmd_args.append('-fPIC')
275
276 # FIXME: Remove mthumb
277 # FIXME: Remove mno-thumb
278
279 # FIXME: As with ld, something else is going on. My best guess
280 # is gcc is faking an -mmacosx-version-min
281 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000282# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
283# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
284# cmd_args.append('-mmacosx-version-min=' +
285# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000286
287 # FIXME: Remove faltivec
288 # FIXME: Remove mno-fused-madd
289 # FIXME: Remove mlong-branch
290 # FIXME: Remove mlongcall
291 # FIXME: Remove mcpu=G4
292 # FIXME: Remove mcpu=G5
293
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000294 if (arglist.getLastArg(arglist.parser.gGroup) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000295 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
296 cmd_args.append('-feliminate-unused-debug-symbols')
297
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000298 def getBaseInputName(self, inputs, arglist):
299 # FIXME: gcc uses a temporary name here when the base
300 # input is stdin, but only in auxbase. Investigate.
301 baseInputValue = arglist.getValue(inputs[0].baseInput)
302 return os.path.basename(baseInputValue)
303
304 def getBaseInputStem(self, inputs, arglist):
305 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
306
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000307 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000308 output, outputType, arglist):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000309 inputType = inputs[0].type
310 assert not [i for i in inputs if i.type != inputType]
311
312 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000313 isCXX = False
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000314 if inputType is Types.CType:
315 cc1Name = 'cc1'
316 usePP = True
317 elif inputType is Types.CTypeNoPP:
318 cc1Name = 'cc1'
319 usePP = False
320 elif inputType is Types.ObjCType:
321 cc1Name = 'cc1obj'
322 usePP = True
323 elif inputType is Types.ObjCTypeNoPP:
324 cc1Name = 'cc1obj'
325 usePP = False
326 elif inputType is Types.CXXType:
327 cc1Name = 'cc1plus'
328 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000329 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000330 elif inputType is Types.CXXTypeNoPP:
331 cc1Name = 'cc1plus'
332 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000333 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000334 elif inputType is Types.ObjCXXType:
335 cc1Name = 'cc1objplus'
336 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000337 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000338 elif inputType is Types.ObjCXXTypeNoPP:
339 cc1Name = 'cc1objplus'
340 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000341 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000342 else:
343 raise RuntimeError,"Unexpected input type for Darwin compile tool."
344
345 cmd_args = []
346 if (arglist.getLastArg(arglist.parser.traditionalOption) or
347 arglist.getLastArg(arglist.parser.f_traditionalOption)):
348 raise ValueError,"-traditional is not supported without -E"
349
350 if usePP:
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000351 # Derived from cpp_options.
352
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000353 # Derived from cpp_unique_options.
354
355 if (arglist.getLastArg(arglist.parser.COption) or
356 arglist.getLastArg(arglist.parser.CCOption)):
357 if not arglist.getLastArg(arglist.parser.EOption):
358 raise ValueError,"-C or -CC is not supported without -E"
359 if not arglist.getLastArg(arglist.parser.QOption):
360 cmd_args.append('-quiet')
361 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
362 arglist.addLastArg(cmd_args, arglist.parser.vOption)
363 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
364 arglist.addLastArg(cmd_args, arglist.parser.POption)
365
366 # FIXME: Handle %I properly.
367 if arglist.getValue(arch) == 'x86_64':
368 cmd_args.append('-imultilib')
369 cmd_args.append('x86_64')
370
371 if arglist.getLastArg(arglist.parser.MDOption):
372 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000373 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000374 outputOpt = arglist.getLastArg(arglist.parser.oOption)
375 if outputOpt:
376 base,ext = os.path.splitext(arglist.getValue(outputOpt))
377 cmd_args.append(base+'.d')
378 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000379 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000380 if arglist.getLastArg(arglist.parser.MMDOption):
381 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000382 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000383 outputOpt = arglist.getLastArg(arglist.parser.oOption)
384 if outputOpt:
385 base,ext = os.path.splitext(arglist.getValue(outputOpt))
386 cmd_args.append(base+'.d')
387 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000388 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000389 arglist.addLastArg(cmd_args, arglist.parser.MOption)
390 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
391 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
392 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
393 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
394 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
395 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
396 if (not arglist.getLastArg(arglist.parser.MOption) and
397 not arglist.getLastArg(arglist.parser.MMOption) and
398 (arglist.getLastArg(arglist.parser.MDOption) or
399 arglist.getLastArg(arglist.parser.MMDOption))):
400 outputOpt = arglist.getLastArg(arglist.parser.oOption)
401 if outputOpt:
402 cmd_args.append('-MQ')
403 cmd_args.append(arglist.getValue(outputOpt))
404
405 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
406 if arglist.getLastArg(arglist.parser.g3Option):
407 cmd_args.append('-dD')
408 arglist.addLastArg(cmd_args, arglist.parser.HOption)
409
Daniel Dunbardff9f502009-01-12 18:51:02 +0000410 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000411
412 arglist.addAllArgs3(cmd_args,
413 arglist.parser.DOption,
414 arglist.parser.UOption,
415 arglist.parser.AOption)
416
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000417 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000418
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000419 for input in inputs:
420 if isinstance(input.source, Jobs.PipedJob):
421 cmd_args.append('-')
422 else:
423 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000424
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000425 for arg in arglist.getArgs2(arglist.parser.WpOption,
426 arglist.parser.XpreprocessorOption):
427 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000428
429 if arglist.getLastArg(arglist.parser.f_mudflapOption):
430 cmd_args.append('-D_MUDFLAP')
431 cmd_args.append('-include')
432 cmd_args.append('mf-runtime.h')
433
434 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
435 cmd_args.append('-D_MUDFLAP')
436 cmd_args.append('-D_MUDFLAPTH')
437 cmd_args.append('-include')
438 cmd_args.append('mf-runtime.h')
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000439
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000440 else:
441 cmd_args.append('-fpreprocessed')
442 # FIXME: There is a spec command to remove
443 # -fpredictive-compilation args here. Investigate.
444
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000445 for input in inputs:
446 if isinstance(input.source, Jobs.PipedJob):
447 cmd_args.append('-')
448 else:
449 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000450
Daniel Dunbar816dd502009-01-12 17:53:19 +0000451 # Derived from cc1_options spec.
452 if (arglist.getLastArg(arglist.parser.fastOption) or
453 arglist.getLastArg(arglist.parser.fastfOption) or
454 arglist.getLastArg(arglist.parser.fastcpOption)):
455 cmd_args.append('-O3')
456
457 if (arglist.getLastArg(arglist.parser.pgOption) and
458 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
459 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
460
Daniel Dunbardff9f502009-01-12 18:51:02 +0000461 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000462
463 if not arglist.getLastArg(arglist.parser.QOption):
464 cmd_args.append('-quiet')
465
466 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000467 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000468
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000469 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000470
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000471 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
472 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000473
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000474 # FIXME: The goal is to use the user provided -o if that is
475 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000476 # name. Find a clean way to go about this.
477 if (arglist.getLastArg(arglist.parser.cOption) or
478 arglist.getLastArg(arglist.parser.SOption)):
479 outputOpt = arglist.getLastArg(arglist.parser.oOption)
480 if outputOpt:
481 cmd_args.append('-auxbase-strip')
482 cmd_args.append(arglist.getValue(outputOpt))
483 else:
484 cmd_args.append('-auxbase')
485 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000486 else:
487 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000488 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000489
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000490 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000491
Daniel Dunbar816dd502009-01-12 17:53:19 +0000492 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
493 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000494 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000495 arglist.addLastArg(cmd_args, arglist.parser.wOption)
496 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
497 if arglist.getLastArg(arglist.parser.vOption):
498 cmd_args.append('-version')
499 if arglist.getLastArg(arglist.parser.pgOption):
500 cmd_args.append('-p')
501 arglist.addLastArg(cmd_args, arglist.parser.pOption)
502
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000503 # ccc treats -fsyntax-only specially.
504 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
505 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000506
507 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
508 if arglist.getLastArg(arglist.parser.QnOption):
509 cmd_args.append('-fno-ident')
510
511 # FIXME: This isn't correct.
512 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
513 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
514
Daniel Dunbar76290532009-01-13 06:25:31 +0000515 # There is no need for this level of compatibility, but it
516 # makes diffing easier.
517 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
518 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000519 if isinstance(output, Jobs.PipedJob):
Daniel Dunbar76290532009-01-13 06:25:31 +0000520 output_args = ['-o', '-']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000521 elif output is None:
Daniel Dunbar76290532009-01-13 06:25:31 +0000522 output_args = ['-o', '/dev/null']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000523 else:
Daniel Dunbar76290532009-01-13 06:25:31 +0000524 output_args = arglist.render(output)
525
526 if not outputAtEnd:
527 cmd_args.extend(output_args)
528
Daniel Dunbar816dd502009-01-12 17:53:19 +0000529 # FIXME: Still don't get what is happening here. Investigate.
530 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
531
532 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
533 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
534 cmd_args.append('-fno-builtin')
535 cmd_args.append('-fno-merge-constants')
536
537 if arglist.getLastArg(arglist.parser.coverageOption):
538 cmd_args.append('-fprofile-arcs')
539 cmd_args.append('-ftest-coverage')
540
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000541 if isCXX:
542 cmd_args.append('-D__private_extern__=extern')
543
Daniel Dunbar76290532009-01-13 06:25:31 +0000544 if outputAtEnd:
545 cmd_args.extend(output_args)
546
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000547 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
548 cmd_args))
549
550
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000551class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000552 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000553 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000554 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000555
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000556 def getMacosxVersionTuple(self, arglist):
557 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
558 if arg:
559 version = arglist.getValue(arg)
560 components = version.split('.')
561 try:
562 return tuple(map(int, components))
563 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000564 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000565 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000566 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000567 return (10, major-4, minor)
568
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000569 def addDarwinArch(self, cmd_args, arch, arglist):
570 # Derived from darwin_arch spec.
571 cmd_args.append('-arch')
572 # FIXME: The actual spec uses -m64 for this, but we want to
573 # respect arch. Figure out what exactly gcc is doing.
574 #if arglist.getLastArg(arglist.parser.m_64Option):
575 if arglist.getValue(arch) == 'x86_64':
576 cmd_args.append('x86_64')
577 else:
578 cmd_args.append('i386')
579
580 def addDarwinSubArch(self, cmd_args, arch, arglist):
581 # Derived from darwin_subarch spec, not sure what the
582 # distinction exists for but at least for this chain it is the same.
583 return self.addDarwinArch(cmd_args, arch, arglist)
584
585 def addLinkArgs(self, cmd_args, arch, arglist):
586 # Derived from link spec.
587 if arglist.getLastArg(arglist.parser.staticOption):
588 cmd_args.append('-static')
589 else:
590 cmd_args.append('-dynamic')
591 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
592 # FIXME: Replace -lobjc in forward args with
593 # -lobjc-gnu. How do we wish to handle such things?
594 pass
595
596 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
597 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
598 self.addDarwinArch(cmd_args, arch, arglist)
599 cmd_args.append('-force_cpusubtype_all')
600 else:
601 self.addDarwinSubArch(cmd_args, arch, arglist)
602
603 if arglist.getLastArg(arglist.parser.ZbundleOption):
604 cmd_args.append('-bundle')
605 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
606 '-bundle_loader')
607 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
608 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
609 # FIXME: Where should diagnostics go?
610 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
611 sys.exit(1)
612 if arglist.getLastArg(arglist.parser.current_versionOption):
613 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
614 sys.exit(1)
615 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
616 cmd_args.append('-force_flat_namespace')
617 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
618 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
619 sys.exit(1)
620 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
621 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
622 else:
623 cmd_args.append('-dylib')
624 if arglist.getLastArg(arglist.parser.ZbundleOption):
625 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
626 sys.exit(1)
627 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
628 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
629 sys.exit(1)
630 if arglist.getLastArg(arglist.parser.client_nameOption):
631 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
632 sys.exit(1)
633 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
634 '-dylib_compatibility_version')
635 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
636 '-dylib_current_version')
637
638 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
639 self.addDarwinArch(cmd_args, arch, arglist)
640 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
641 else:
642 self.addDarwinSubArch(cmd_args, arch, arglist)
643
644 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
645 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
646 sys.exit(1)
647
648 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
649 '-dylib_install_name')
650
651 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
652 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
653 sys.exit(1)
654 if arglist.getLastArg(arglist.parser.private_bundleOption):
655 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
656 sys.exit(1)
657
658 if arglist.getLastArg(arglist.parser.Zall_loadOption):
659 cmd_args.append('-all_load')
660
661 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
662 '-allowable_client')
663
664 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
665 cmd_args.append('-bind_at_load')
666
667 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
668 cmd_args.append('-dead_strip')
669
670 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
671 cmd_args.append('-no_dead_strip_inits_and_terms')
672
673 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
674 '-dylib_file')
675
676 if arglist.getLastArg(arglist.parser.ZdynamicOption):
677 cmd_args.append('-dynamic')
678
679 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
680 '-exported_symbols_list')
681
682 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
683 cmd_args.append('-flat_namespace')
684
685 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
686 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
687 '-image_base')
688 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
689 '-init')
690
691 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
692 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
693 # FIXME: I don't understand what is going on
694 # here. This is supposed to come from
695 # darwin_ld_minversion, but gcc doesn't seem to be
696 # following that; it must be getting over-ridden
697 # somewhere.
698 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000699 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000700 else:
701 # addAll doesn't make sense here but this is what gcc
702 # does.
703 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
704 '-macosx_version_min')
705
706 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
707 '-iphoneos_version_min')
708 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
709
710 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
711 cmd_args.append('-multi_module')
712
713 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
714 cmd_args.append('-single_module')
715
716 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
717 '-multiply_defined')
718
719 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
720 '-multiply_defined_unused')
721
722 if arglist.getLastArg(arglist.parser.f_pieOption):
723 cmd_args.append('-pie')
724
725 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
726 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
727 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
728 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
729 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
730 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
731 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
732 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
733 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
734 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
735 '-segaddr')
736 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
737 '-segs_read_only_addr')
738 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
739 '-segs_read_write_addr')
740 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
741 '-seg_addr_table')
742 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
743 '-fn_seg_addr_table_filename')
744 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
745 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
746 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
747 '-syslibroot')
748 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
749 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
750 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
751 '-umbrella')
752 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
753 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
754 '-unexported_symbols_list')
755 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
756 '-weak_reference_mismatches')
757
758 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
759 cmd_args.append('-weak_reference_mismatches')
760 cmd_args.append('non-weak')
761
762 arglist.addLastArg(cmd_args, arglist.parser.XOption)
763 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
764 arglist.addLastArg(cmd_args, arglist.parser.wOption)
765 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
766 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
767 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
768 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
769 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
770 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
771 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
772 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
773 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
774 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
775 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
776 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000777
778 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000779 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000780 assert outputType is Types.ImageType
781
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000782 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000783 # comes from specs (starting with link_command). Consult gcc
784 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000785
786 # FIXME: gcc's spec controls when this is done; certain things
787 # like -filelist or -Wl, still trigger a link stage. I don't
788 # quite understand how gcc decides to execute the linker,
789 # investigate. Also, the spec references -fdump= which seems
790 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000791 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792
793 # Not sure why this particular decomposition exists in gcc.
794 self.addLinkArgs(cmd_args, arch, arglist)
795
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000796 # This toolchain never accumlates options in specs, the only
797 # place this gets used is to add -ObjC.
798 if (arglist.getLastArg(arglist.parser.ObjCOption) or
799 arglist.getLastArg(arglist.parser.f_objcOption)):
800 cmd_args.append('-ObjC')
801 if arglist.getLastArg(arglist.parser.ObjCXXOption):
802 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000803
804 # FIXME: gcc has %{x} in here. How could this ever happen?
805 # Cruft?
806 arglist.addLastArg(cmd_args, arglist.parser.dOption)
807 arglist.addLastArg(cmd_args, arglist.parser.tOption)
808 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
809 arglist.addLastArg(cmd_args, arglist.parser.uOption)
810 arglist.addLastArg(cmd_args, arglist.parser.AOption)
811 arglist.addLastArg(cmd_args, arglist.parser.eOption)
812 arglist.addLastArg(cmd_args, arglist.parser.mOption)
813 arglist.addLastArg(cmd_args, arglist.parser.rOption)
814
815 cmd_args.extend(arglist.render(output))
816
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000817 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000818 if (not arglist.getLastArg(arglist.parser.AOption) and
819 not arglist.getLastArg(arglist.parser.nostdlibOption) and
820 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
821 # Derived from startfile spec.
822 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
823 # Derived from darwin_dylib1 spec.
824 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
825 cmd_args.append('-ldylib1.o')
826 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000827 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000828 cmd_args.append('-ldylib1.o')
829 else:
830 cmd_args.append('-ldylib1.10.5.o')
831 else:
832 if arglist.getLastArg(arglist.parser.ZbundleOption):
833 if not arglist.getLastArg(arglist.parser.staticOption):
834 cmd_args.append('-lbundle1.o')
835 else:
836 if arglist.getLastArg(arglist.parser.pgOption):
837 if arglist.getLastArg(arglist.parser.staticOption):
838 cmd_args.append('-lgcrt0.o')
839 else:
840 if arglist.getLastArg(arglist.parser.objectOption):
841 cmd_args.append('-lgcrt0.o')
842 else:
843 if arglist.getLastArg(arglist.parser.preloadOption):
844 cmd_args.append('-lgcrt0.o')
845 else:
846 cmd_args.append('-lgcrt1.o')
847
848 # darwin_crt2 spec is empty.
849 pass
850 else:
851 if arglist.getLastArg(arglist.parser.staticOption):
852 cmd_args.append('-lcrt0.o')
853 else:
854 if arglist.getLastArg(arglist.parser.objectOption):
855 cmd_args.append('-lcrt0.o')
856 else:
857 if arglist.getLastArg(arglist.parser.preloadOption):
858 cmd_args.append('-lcrt0.o')
859 else:
860 # Derived from darwin_crt1 spec.
861 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
862 cmd_args.append('-lcrt1.o')
863 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000864 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000865 cmd_args.append('-lcrt1.o')
866 else:
867 cmd_args.append('-lcrt1.10.5.o')
868
869 # darwin_crt2 spec is empty.
870 pass
871
872 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
873 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000874 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000875 # FIXME: gcc does a library search for this
876 # file, this will be be broken currently.
877 cmd_args.append('crt3.o')
878
879 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
880
881 if arglist.getLastArg(arglist.parser.f_openmpOption):
882 # This is more complicated in gcc...
883 cmd_args.append('-lgomp')
884
885 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000886 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000887 if arglist.getValue(arch) == 'x86_64':
888 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
889 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
890 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
891 "-L/usr/lib/gcc/%s" % tcDir,
892 "-L/usr/lib/gcc/%s" % tcDir,
893 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
894 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000895
Daniel Dunbara5677512009-01-05 19:53:30 +0000896 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000897 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000898
899 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
900 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
901 arglist.getLastArg(arglist.parser.f_createProfileOption) or
902 arglist.getLastArg(arglist.parser.coverageOption)):
903 cmd_args.append('-lgcov')
904
905 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
906 cmd_args.append('-allow_stack_execute')
907
908 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
909 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
910 # link_ssp spec is empty.
911
912 # Derived from libgcc spec.
913 if arglist.getLastArg(arglist.parser.staticOption):
914 cmd_args.append('-lgcc_static')
915 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
916 cmd_args.append('-lgcc_eh')
917 cmd_args.append('-lgcc')
918 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
919 # Derived from darwin_iphoneos_libgcc spec.
920 cmd_args.append('-lgcc_s.10.5')
921 cmd_args.append('-lgcc')
922 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
923 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
924 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000925 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000926 cmd_args.append('-lgcc_s.10.4')
927 else:
928 cmd_args.append('-lgcc_s.10.5')
929 cmd_args.append('-lgcc')
930 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000931 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000932 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000933 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000934 cmd_args.append('-lgcc_s.10.5')
935 cmd_args.append('-lgcc')
936
937 # Derived from lib spec.
938 if not arglist.getLastArg(arglist.parser.staticOption):
939 cmd_args.append('-lSystem')
940
941 if (not arglist.getLastArg(arglist.parser.AOption) and
942 not arglist.getLastArg(arglist.parser.nostdlibOption) and
943 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
944 # endfile_spec is empty.
945 pass
946
947 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
948 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
949
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000950 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
951 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000952
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000953 if (arglist.getLastArg(arglist.parser.gGroup) and
954 not arglist.getLastArg(arglist.parser.gstabsOption) and
955 not arglist.getLastArg(arglist.parser.g0Option)):
956 # FIXME: This is gross, but matches gcc. The test only
957 # considers the suffix (not the -x type), and then only of the
958 # first input.
959 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
960 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
961 '.c++','.cxx','.CPP','.m','.mm'):
962 jobs.addJob(Jobs.Command('dsymutil',
963 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000964
Daniel Dunbara5677512009-01-05 19:53:30 +0000965class LipoTool(Tool):
966 def __init__(self):
967 super(LipoTool, self).__init__('lipo')
968
969 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000970 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000971 assert outputType is Types.ImageType
972
Daniel Dunbardb439902009-01-07 18:40:45 +0000973 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000974 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000975 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000976 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000977 jobs.addJob(Jobs.Command('lipo', cmd_args))