blob: 26200f1b9fc8818fce98c61752fe811807c9b304 [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)
194 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
195 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
196 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
197 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
198 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
199 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
200 arglist.addAllArgs(cmd_args, arglist.parser.stdOption)
201 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
202
203 # Special case debug options to only pass -g to clang. This is
204 # wrong.
205 if arglist.getLastArg(arglist.parser.gGroup):
206 cmd_args.append('-g')
207
208 # FIXME: Clang isn't going to accept just anything here.
209 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
210
211 # FIXME: Dehardcode this.
212 cmd_args.append('-fblocks')
213
214 if arch is not None:
215 cmd_args.extend(arglist.render(arch))
216
217 cmd_args.extend(arglist.render(output))
218
219 for input in inputs:
220 cmd_args.append('-x')
221 cmd_args.append(input.type.name)
222 if isinstance(input.source, Jobs.PipedJob):
223 cmd_args.append('-')
224 else:
225 cmd_args.extend(arglist.renderAsInput(input.source))
226
227 jobs.addJob(Jobs.Command('clang', cmd_args))
228
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000229
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000230class Darwin_X86_CompileTool(Tool):
231 def __init__(self, toolChain):
232 super(Darwin_X86_CompileTool, self).__init__('cc1',
233 (Tool.eFlagsPipedInput |
234 Tool.eFlagsPipedOutput |
235 Tool.eFlagsIntegratedCPP))
236 self.toolChain = toolChain
237
Daniel Dunbardff9f502009-01-12 18:51:02 +0000238 def addCPPArgs(self, cmd_args, arch, arglist):
239 # Derived from cpp spec.
240
Daniel Dunbardff9f502009-01-12 18:51:02 +0000241 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000242 # The gcc spec is broken here, it refers to dynamic but
243 # that has been translated. Start by being bug compatible.
244
245 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
246 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000247 else:
248 cmd_args.append('-D__DYNAMIC__')
249
250 if arglist.getLastArg(arglist.parser.pthreadOption):
251 cmd_args.append('-D_REENTRANT')
252
253 def addCC1Args(self, cmd_args, arch, arglist):
254 # Derived from cc1 spec.
255
256 # FIXME: -fapple-kext seems to disable this too. Investigate.
257 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
258 not arglist.getLastArg(arglist.parser.staticOption) and
259 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
260 cmd_args.append('-fPIC')
261
262 # FIXME: Remove mthumb
263 # FIXME: Remove mno-thumb
264
265 # FIXME: As with ld, something else is going on. My best guess
266 # is gcc is faking an -mmacosx-version-min
267 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000268# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
269# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
270# cmd_args.append('-mmacosx-version-min=' +
271# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000272
273 # FIXME: Remove faltivec
274 # FIXME: Remove mno-fused-madd
275 # FIXME: Remove mlong-branch
276 # FIXME: Remove mlongcall
277 # FIXME: Remove mcpu=G4
278 # FIXME: Remove mcpu=G5
279
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000280 if (arglist.getLastArg(arglist.parser.gGroup) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000281 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
282 cmd_args.append('-feliminate-unused-debug-symbols')
283
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000284 def getBaseInputName(self, inputs, arglist):
285 # FIXME: gcc uses a temporary name here when the base
286 # input is stdin, but only in auxbase. Investigate.
287 baseInputValue = arglist.getValue(inputs[0].baseInput)
288 return os.path.basename(baseInputValue)
289
290 def getBaseInputStem(self, inputs, arglist):
291 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
292
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000293 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000294 output, outputType, arglist):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000295 inputType = inputs[0].type
296 assert not [i for i in inputs if i.type != inputType]
297
298 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000299 isCXX = False
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000300 if inputType is Types.CType:
301 cc1Name = 'cc1'
302 usePP = True
303 elif inputType is Types.CTypeNoPP:
304 cc1Name = 'cc1'
305 usePP = False
306 elif inputType is Types.ObjCType:
307 cc1Name = 'cc1obj'
308 usePP = True
309 elif inputType is Types.ObjCTypeNoPP:
310 cc1Name = 'cc1obj'
311 usePP = False
312 elif inputType is Types.CXXType:
313 cc1Name = 'cc1plus'
314 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000315 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000316 elif inputType is Types.CXXTypeNoPP:
317 cc1Name = 'cc1plus'
318 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000319 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000320 elif inputType is Types.ObjCXXType:
321 cc1Name = 'cc1objplus'
322 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000323 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000324 elif inputType is Types.ObjCXXTypeNoPP:
325 cc1Name = 'cc1objplus'
326 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000327 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000328 else:
329 raise RuntimeError,"Unexpected input type for Darwin compile tool."
330
331 cmd_args = []
332 if (arglist.getLastArg(arglist.parser.traditionalOption) or
333 arglist.getLastArg(arglist.parser.f_traditionalOption)):
334 raise ValueError,"-traditional is not supported without -E"
335
336 if usePP:
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000337 # Derived from cpp_options.
338
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000339 # Derived from cpp_unique_options.
340
341 if (arglist.getLastArg(arglist.parser.COption) or
342 arglist.getLastArg(arglist.parser.CCOption)):
343 if not arglist.getLastArg(arglist.parser.EOption):
344 raise ValueError,"-C or -CC is not supported without -E"
345 if not arglist.getLastArg(arglist.parser.QOption):
346 cmd_args.append('-quiet')
347 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
348 arglist.addLastArg(cmd_args, arglist.parser.vOption)
349 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
350 arglist.addLastArg(cmd_args, arglist.parser.POption)
351
352 # FIXME: Handle %I properly.
353 if arglist.getValue(arch) == 'x86_64':
354 cmd_args.append('-imultilib')
355 cmd_args.append('x86_64')
356
357 if arglist.getLastArg(arglist.parser.MDOption):
358 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000359 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000360 outputOpt = arglist.getLastArg(arglist.parser.oOption)
361 if outputOpt:
362 base,ext = os.path.splitext(arglist.getValue(outputOpt))
363 cmd_args.append(base+'.d')
364 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000365 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000366 if arglist.getLastArg(arglist.parser.MMDOption):
367 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000368 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000369 outputOpt = arglist.getLastArg(arglist.parser.oOption)
370 if outputOpt:
371 base,ext = os.path.splitext(arglist.getValue(outputOpt))
372 cmd_args.append(base+'.d')
373 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000374 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000375 arglist.addLastArg(cmd_args, arglist.parser.MOption)
376 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
377 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
378 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
379 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
380 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
381 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
382 if (not arglist.getLastArg(arglist.parser.MOption) and
383 not arglist.getLastArg(arglist.parser.MMOption) and
384 (arglist.getLastArg(arglist.parser.MDOption) or
385 arglist.getLastArg(arglist.parser.MMDOption))):
386 outputOpt = arglist.getLastArg(arglist.parser.oOption)
387 if outputOpt:
388 cmd_args.append('-MQ')
389 cmd_args.append(arglist.getValue(outputOpt))
390
391 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
392 if arglist.getLastArg(arglist.parser.g3Option):
393 cmd_args.append('-dD')
394 arglist.addLastArg(cmd_args, arglist.parser.HOption)
395
Daniel Dunbardff9f502009-01-12 18:51:02 +0000396 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000397
398 arglist.addAllArgs3(cmd_args,
399 arglist.parser.DOption,
400 arglist.parser.UOption,
401 arglist.parser.AOption)
402
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000403 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000404
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000405 for input in inputs:
406 if isinstance(input.source, Jobs.PipedJob):
407 cmd_args.append('-')
408 else:
409 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000410
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000411 for arg in arglist.getArgs2(arglist.parser.WpOption,
412 arglist.parser.XpreprocessorOption):
413 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000414
415 if arglist.getLastArg(arglist.parser.f_mudflapOption):
416 cmd_args.append('-D_MUDFLAP')
417 cmd_args.append('-include')
418 cmd_args.append('mf-runtime.h')
419
420 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
421 cmd_args.append('-D_MUDFLAP')
422 cmd_args.append('-D_MUDFLAPTH')
423 cmd_args.append('-include')
424 cmd_args.append('mf-runtime.h')
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000425
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000426 else:
427 cmd_args.append('-fpreprocessed')
428 # FIXME: There is a spec command to remove
429 # -fpredictive-compilation args here. Investigate.
430
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000431 for input in inputs:
432 if isinstance(input.source, Jobs.PipedJob):
433 cmd_args.append('-')
434 else:
435 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000436
Daniel Dunbar816dd502009-01-12 17:53:19 +0000437 # Derived from cc1_options spec.
438 if (arglist.getLastArg(arglist.parser.fastOption) or
439 arglist.getLastArg(arglist.parser.fastfOption) or
440 arglist.getLastArg(arglist.parser.fastcpOption)):
441 cmd_args.append('-O3')
442
443 if (arglist.getLastArg(arglist.parser.pgOption) and
444 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
445 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
446
Daniel Dunbardff9f502009-01-12 18:51:02 +0000447 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000448
449 if not arglist.getLastArg(arglist.parser.QOption):
450 cmd_args.append('-quiet')
451
452 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000453 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000454
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000455 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000456
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000457 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
458 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000459
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000460 # FIXME: The goal is to use the user provided -o if that is
461 # our final output, otherwise to drive from the original input
462 # name.
463 #
464 # This implementation is close, but gcc also does this for -S
465 # which is broken, and it would be nice to find a cleaner way
466 # which doesn't introduce a dependency on the output argument
467 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000468 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbar1e0ead42009-01-12 22:19:59 +0000469 if outputOpt and outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000470 cmd_args.append('-auxbase-strip')
471 cmd_args.append(arglist.getValue(outputOpt))
472 else:
473 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000474 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000475
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000476 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000477
478 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
479 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000480 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000481 arglist.addLastArg(cmd_args, arglist.parser.wOption)
482 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
483 if arglist.getLastArg(arglist.parser.vOption):
484 cmd_args.append('-version')
485 if arglist.getLastArg(arglist.parser.pgOption):
486 cmd_args.append('-p')
487 arglist.addLastArg(cmd_args, arglist.parser.pOption)
488
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000489 # ccc treats -fsyntax-only specially.
490 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
491 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000492
493 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
494 if arglist.getLastArg(arglist.parser.QnOption):
495 cmd_args.append('-fno-ident')
496
497 # FIXME: This isn't correct.
498 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
499 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
500
Daniel Dunbar76290532009-01-13 06:25:31 +0000501 # There is no need for this level of compatibility, but it
502 # makes diffing easier.
503 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
504 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000505 if isinstance(output, Jobs.PipedJob):
Daniel Dunbar76290532009-01-13 06:25:31 +0000506 output_args = ['-o', '-']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000507 elif output is None:
Daniel Dunbar76290532009-01-13 06:25:31 +0000508 output_args = ['-o', '/dev/null']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000509 else:
Daniel Dunbar76290532009-01-13 06:25:31 +0000510 output_args = arglist.render(output)
511
512 if not outputAtEnd:
513 cmd_args.extend(output_args)
514
Daniel Dunbar816dd502009-01-12 17:53:19 +0000515 # FIXME: Still don't get what is happening here. Investigate.
516 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
517
518 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
519 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
520 cmd_args.append('-fno-builtin')
521 cmd_args.append('-fno-merge-constants')
522
523 if arglist.getLastArg(arglist.parser.coverageOption):
524 cmd_args.append('-fprofile-arcs')
525 cmd_args.append('-ftest-coverage')
526
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000527 if isCXX:
528 cmd_args.append('-D__private_extern__=extern')
529
Daniel Dunbar76290532009-01-13 06:25:31 +0000530 if outputAtEnd:
531 cmd_args.extend(output_args)
532
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000533 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
534 cmd_args))
535
536
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000537class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000538 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000539 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000540 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000541
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000542 def getMacosxVersionTuple(self, arglist):
543 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
544 if arg:
545 version = arglist.getValue(arg)
546 components = version.split('.')
547 try:
548 return tuple(map(int, components))
549 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000550 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000551 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000552 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000553 return (10, major-4, minor)
554
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000555 def addDarwinArch(self, cmd_args, arch, arglist):
556 # Derived from darwin_arch spec.
557 cmd_args.append('-arch')
558 # FIXME: The actual spec uses -m64 for this, but we want to
559 # respect arch. Figure out what exactly gcc is doing.
560 #if arglist.getLastArg(arglist.parser.m_64Option):
561 if arglist.getValue(arch) == 'x86_64':
562 cmd_args.append('x86_64')
563 else:
564 cmd_args.append('i386')
565
566 def addDarwinSubArch(self, cmd_args, arch, arglist):
567 # Derived from darwin_subarch spec, not sure what the
568 # distinction exists for but at least for this chain it is the same.
569 return self.addDarwinArch(cmd_args, arch, arglist)
570
571 def addLinkArgs(self, cmd_args, arch, arglist):
572 # Derived from link spec.
573 if arglist.getLastArg(arglist.parser.staticOption):
574 cmd_args.append('-static')
575 else:
576 cmd_args.append('-dynamic')
577 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
578 # FIXME: Replace -lobjc in forward args with
579 # -lobjc-gnu. How do we wish to handle such things?
580 pass
581
582 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
583 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
584 self.addDarwinArch(cmd_args, arch, arglist)
585 cmd_args.append('-force_cpusubtype_all')
586 else:
587 self.addDarwinSubArch(cmd_args, arch, arglist)
588
589 if arglist.getLastArg(arglist.parser.ZbundleOption):
590 cmd_args.append('-bundle')
591 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
592 '-bundle_loader')
593 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
594 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
595 # FIXME: Where should diagnostics go?
596 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
597 sys.exit(1)
598 if arglist.getLastArg(arglist.parser.current_versionOption):
599 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
600 sys.exit(1)
601 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
602 cmd_args.append('-force_flat_namespace')
603 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
604 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
605 sys.exit(1)
606 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
607 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
608 else:
609 cmd_args.append('-dylib')
610 if arglist.getLastArg(arglist.parser.ZbundleOption):
611 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
612 sys.exit(1)
613 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
614 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
615 sys.exit(1)
616 if arglist.getLastArg(arglist.parser.client_nameOption):
617 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
618 sys.exit(1)
619 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
620 '-dylib_compatibility_version')
621 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
622 '-dylib_current_version')
623
624 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
625 self.addDarwinArch(cmd_args, arch, arglist)
626 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
627 else:
628 self.addDarwinSubArch(cmd_args, arch, arglist)
629
630 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
631 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
632 sys.exit(1)
633
634 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
635 '-dylib_install_name')
636
637 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
638 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
639 sys.exit(1)
640 if arglist.getLastArg(arglist.parser.private_bundleOption):
641 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
642 sys.exit(1)
643
644 if arglist.getLastArg(arglist.parser.Zall_loadOption):
645 cmd_args.append('-all_load')
646
647 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
648 '-allowable_client')
649
650 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
651 cmd_args.append('-bind_at_load')
652
653 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
654 cmd_args.append('-dead_strip')
655
656 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
657 cmd_args.append('-no_dead_strip_inits_and_terms')
658
659 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
660 '-dylib_file')
661
662 if arglist.getLastArg(arglist.parser.ZdynamicOption):
663 cmd_args.append('-dynamic')
664
665 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
666 '-exported_symbols_list')
667
668 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
669 cmd_args.append('-flat_namespace')
670
671 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
672 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
673 '-image_base')
674 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
675 '-init')
676
677 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
678 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
679 # FIXME: I don't understand what is going on
680 # here. This is supposed to come from
681 # darwin_ld_minversion, but gcc doesn't seem to be
682 # following that; it must be getting over-ridden
683 # somewhere.
684 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000685 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000686 else:
687 # addAll doesn't make sense here but this is what gcc
688 # does.
689 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
690 '-macosx_version_min')
691
692 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
693 '-iphoneos_version_min')
694 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
695
696 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
697 cmd_args.append('-multi_module')
698
699 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
700 cmd_args.append('-single_module')
701
702 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
703 '-multiply_defined')
704
705 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
706 '-multiply_defined_unused')
707
708 if arglist.getLastArg(arglist.parser.f_pieOption):
709 cmd_args.append('-pie')
710
711 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
712 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
713 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
714 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
715 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
716 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
717 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
718 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
719 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
720 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
721 '-segaddr')
722 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
723 '-segs_read_only_addr')
724 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
725 '-segs_read_write_addr')
726 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
727 '-seg_addr_table')
728 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
729 '-fn_seg_addr_table_filename')
730 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
731 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
732 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
733 '-syslibroot')
734 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
735 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
736 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
737 '-umbrella')
738 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
739 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
740 '-unexported_symbols_list')
741 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
742 '-weak_reference_mismatches')
743
744 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
745 cmd_args.append('-weak_reference_mismatches')
746 cmd_args.append('non-weak')
747
748 arglist.addLastArg(cmd_args, arglist.parser.XOption)
749 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
750 arglist.addLastArg(cmd_args, arglist.parser.wOption)
751 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
752 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
753 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
754 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
755 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
756 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
757 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
758 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
759 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
760 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
761 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
762 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000763
764 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000765 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000766 assert outputType is Types.ImageType
767
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000768 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000769 # comes from specs (starting with link_command). Consult gcc
770 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000771
772 # FIXME: gcc's spec controls when this is done; certain things
773 # like -filelist or -Wl, still trigger a link stage. I don't
774 # quite understand how gcc decides to execute the linker,
775 # investigate. Also, the spec references -fdump= which seems
776 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000777 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000778
779 # Not sure why this particular decomposition exists in gcc.
780 self.addLinkArgs(cmd_args, arch, arglist)
781
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000782 # This toolchain never accumlates options in specs, the only
783 # place this gets used is to add -ObjC.
784 if (arglist.getLastArg(arglist.parser.ObjCOption) or
785 arglist.getLastArg(arglist.parser.f_objcOption)):
786 cmd_args.append('-ObjC')
787 if arglist.getLastArg(arglist.parser.ObjCXXOption):
788 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000789
790 # FIXME: gcc has %{x} in here. How could this ever happen?
791 # Cruft?
792 arglist.addLastArg(cmd_args, arglist.parser.dOption)
793 arglist.addLastArg(cmd_args, arglist.parser.tOption)
794 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
795 arglist.addLastArg(cmd_args, arglist.parser.uOption)
796 arglist.addLastArg(cmd_args, arglist.parser.AOption)
797 arglist.addLastArg(cmd_args, arglist.parser.eOption)
798 arglist.addLastArg(cmd_args, arglist.parser.mOption)
799 arglist.addLastArg(cmd_args, arglist.parser.rOption)
800
801 cmd_args.extend(arglist.render(output))
802
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000803 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000804 if (not arglist.getLastArg(arglist.parser.AOption) and
805 not arglist.getLastArg(arglist.parser.nostdlibOption) and
806 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
807 # Derived from startfile spec.
808 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
809 # Derived from darwin_dylib1 spec.
810 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
811 cmd_args.append('-ldylib1.o')
812 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000813 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000814 cmd_args.append('-ldylib1.o')
815 else:
816 cmd_args.append('-ldylib1.10.5.o')
817 else:
818 if arglist.getLastArg(arglist.parser.ZbundleOption):
819 if not arglist.getLastArg(arglist.parser.staticOption):
820 cmd_args.append('-lbundle1.o')
821 else:
822 if arglist.getLastArg(arglist.parser.pgOption):
823 if arglist.getLastArg(arglist.parser.staticOption):
824 cmd_args.append('-lgcrt0.o')
825 else:
826 if arglist.getLastArg(arglist.parser.objectOption):
827 cmd_args.append('-lgcrt0.o')
828 else:
829 if arglist.getLastArg(arglist.parser.preloadOption):
830 cmd_args.append('-lgcrt0.o')
831 else:
832 cmd_args.append('-lgcrt1.o')
833
834 # darwin_crt2 spec is empty.
835 pass
836 else:
837 if arglist.getLastArg(arglist.parser.staticOption):
838 cmd_args.append('-lcrt0.o')
839 else:
840 if arglist.getLastArg(arglist.parser.objectOption):
841 cmd_args.append('-lcrt0.o')
842 else:
843 if arglist.getLastArg(arglist.parser.preloadOption):
844 cmd_args.append('-lcrt0.o')
845 else:
846 # Derived from darwin_crt1 spec.
847 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
848 cmd_args.append('-lcrt1.o')
849 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000850 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000851 cmd_args.append('-lcrt1.o')
852 else:
853 cmd_args.append('-lcrt1.10.5.o')
854
855 # darwin_crt2 spec is empty.
856 pass
857
858 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
859 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000860 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000861 # FIXME: gcc does a library search for this
862 # file, this will be be broken currently.
863 cmd_args.append('crt3.o')
864
865 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
866
867 if arglist.getLastArg(arglist.parser.f_openmpOption):
868 # This is more complicated in gcc...
869 cmd_args.append('-lgomp')
870
871 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000872 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000873 if arglist.getValue(arch) == 'x86_64':
874 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
875 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
876 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
877 "-L/usr/lib/gcc/%s" % tcDir,
878 "-L/usr/lib/gcc/%s" % tcDir,
879 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
880 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000881
Daniel Dunbara5677512009-01-05 19:53:30 +0000882 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000883 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000884
885 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
886 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
887 arglist.getLastArg(arglist.parser.f_createProfileOption) or
888 arglist.getLastArg(arglist.parser.coverageOption)):
889 cmd_args.append('-lgcov')
890
891 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
892 cmd_args.append('-allow_stack_execute')
893
894 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
895 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
896 # link_ssp spec is empty.
897
898 # Derived from libgcc spec.
899 if arglist.getLastArg(arglist.parser.staticOption):
900 cmd_args.append('-lgcc_static')
901 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
902 cmd_args.append('-lgcc_eh')
903 cmd_args.append('-lgcc')
904 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
905 # Derived from darwin_iphoneos_libgcc spec.
906 cmd_args.append('-lgcc_s.10.5')
907 cmd_args.append('-lgcc')
908 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
909 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
910 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000911 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000912 cmd_args.append('-lgcc_s.10.4')
913 else:
914 cmd_args.append('-lgcc_s.10.5')
915 cmd_args.append('-lgcc')
916 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000917 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000918 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000919 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000920 cmd_args.append('-lgcc_s.10.5')
921 cmd_args.append('-lgcc')
922
923 # Derived from lib spec.
924 if not arglist.getLastArg(arglist.parser.staticOption):
925 cmd_args.append('-lSystem')
926
927 if (not arglist.getLastArg(arglist.parser.AOption) and
928 not arglist.getLastArg(arglist.parser.nostdlibOption) and
929 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
930 # endfile_spec is empty.
931 pass
932
933 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
934 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
935
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000936 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
937 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000938
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000939 if (arglist.getLastArg(arglist.parser.gGroup) and
940 not arglist.getLastArg(arglist.parser.gstabsOption) and
941 not arglist.getLastArg(arglist.parser.g0Option)):
942 # FIXME: This is gross, but matches gcc. The test only
943 # considers the suffix (not the -x type), and then only of the
944 # first input.
945 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
946 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
947 '.c++','.cxx','.CPP','.m','.mm'):
948 jobs.addJob(Jobs.Command('dsymutil',
949 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000950
Daniel Dunbara5677512009-01-05 19:53:30 +0000951class LipoTool(Tool):
952 def __init__(self):
953 super(LipoTool, self).__init__('lipo')
954
955 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000956 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000957 assert outputType is Types.ImageType
958
Daniel Dunbardb439902009-01-07 18:40:45 +0000959 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000960 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000961 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000962 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000963 jobs.addJob(Jobs.Command('lipo', cmd_args))