blob: f47d3aa6a5b103283d853524efb5f05f9d72dc8a [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 Dunbar33a5d612009-01-14 01:03:36 +0000175class Clang_CompileTool(GCC_Common_Tool):
176 def __init__(self):
177 super(Clang_CompileTool, self).__init__('clang',
178 (Tool.eFlagsPipedInput |
179 Tool.eFlagsPipedOutput |
180 Tool.eFlagsIntegratedCPP))
181
182 def constructJob(self, phase, arch, jobs, inputs,
183 output, outputType, arglist):
184 return super(Clang_CompileTool, self).constructJob(phase, arch, jobs, inputs,
185 output, outputType, arglist,
186 ['-S'])
187
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000188class Darwin_X86_CompileTool(Tool):
189 def __init__(self, toolChain):
190 super(Darwin_X86_CompileTool, self).__init__('cc1',
191 (Tool.eFlagsPipedInput |
192 Tool.eFlagsPipedOutput |
193 Tool.eFlagsIntegratedCPP))
194 self.toolChain = toolChain
195
Daniel Dunbardff9f502009-01-12 18:51:02 +0000196 def addCPPArgs(self, cmd_args, arch, arglist):
197 # Derived from cpp spec.
198
Daniel Dunbardff9f502009-01-12 18:51:02 +0000199 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000200 # The gcc spec is broken here, it refers to dynamic but
201 # that has been translated. Start by being bug compatible.
202
203 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
204 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000205 else:
206 cmd_args.append('-D__DYNAMIC__')
207
208 if arglist.getLastArg(arglist.parser.pthreadOption):
209 cmd_args.append('-D_REENTRANT')
210
211 def addCC1Args(self, cmd_args, arch, arglist):
212 # Derived from cc1 spec.
213
214 # FIXME: -fapple-kext seems to disable this too. Investigate.
215 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
216 not arglist.getLastArg(arglist.parser.staticOption) and
217 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
218 cmd_args.append('-fPIC')
219
220 # FIXME: Remove mthumb
221 # FIXME: Remove mno-thumb
222
223 # FIXME: As with ld, something else is going on. My best guess
224 # is gcc is faking an -mmacosx-version-min
225 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000226# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
227# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
228# cmd_args.append('-mmacosx-version-min=' +
229# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000230
231 # FIXME: Remove faltivec
232 # FIXME: Remove mno-fused-madd
233 # FIXME: Remove mlong-branch
234 # FIXME: Remove mlongcall
235 # FIXME: Remove mcpu=G4
236 # FIXME: Remove mcpu=G5
237
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000238 if (arglist.getLastArg(arglist.parser.gGroup) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000239 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
240 cmd_args.append('-feliminate-unused-debug-symbols')
241
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000242 def getBaseInputName(self, inputs, arglist):
243 # FIXME: gcc uses a temporary name here when the base
244 # input is stdin, but only in auxbase. Investigate.
245 baseInputValue = arglist.getValue(inputs[0].baseInput)
246 return os.path.basename(baseInputValue)
247
248 def getBaseInputStem(self, inputs, arglist):
249 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
250
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000251 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000252 output, outputType, arglist):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000253 inputType = inputs[0].type
254 assert not [i for i in inputs if i.type != inputType]
255
256 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000257 isCXX = False
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000258 if inputType is Types.CType:
259 cc1Name = 'cc1'
260 usePP = True
261 elif inputType is Types.CTypeNoPP:
262 cc1Name = 'cc1'
263 usePP = False
264 elif inputType is Types.ObjCType:
265 cc1Name = 'cc1obj'
266 usePP = True
267 elif inputType is Types.ObjCTypeNoPP:
268 cc1Name = 'cc1obj'
269 usePP = False
270 elif inputType is Types.CXXType:
271 cc1Name = 'cc1plus'
272 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000273 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000274 elif inputType is Types.CXXTypeNoPP:
275 cc1Name = 'cc1plus'
276 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000277 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000278 elif inputType is Types.ObjCXXType:
279 cc1Name = 'cc1objplus'
280 usePP = True
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000281 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000282 elif inputType is Types.ObjCXXTypeNoPP:
283 cc1Name = 'cc1objplus'
284 usePP = False
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000285 isCXX = True
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000286 else:
287 raise RuntimeError,"Unexpected input type for Darwin compile tool."
288
289 cmd_args = []
290 if (arglist.getLastArg(arglist.parser.traditionalOption) or
291 arglist.getLastArg(arglist.parser.f_traditionalOption)):
292 raise ValueError,"-traditional is not supported without -E"
293
294 if usePP:
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000295 # Derived from cpp_options.
296
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000297 # Derived from cpp_unique_options.
298
299 if (arglist.getLastArg(arglist.parser.COption) or
300 arglist.getLastArg(arglist.parser.CCOption)):
301 if not arglist.getLastArg(arglist.parser.EOption):
302 raise ValueError,"-C or -CC is not supported without -E"
303 if not arglist.getLastArg(arglist.parser.QOption):
304 cmd_args.append('-quiet')
305 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
306 arglist.addLastArg(cmd_args, arglist.parser.vOption)
307 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
308 arglist.addLastArg(cmd_args, arglist.parser.POption)
309
310 # FIXME: Handle %I properly.
311 if arglist.getValue(arch) == 'x86_64':
312 cmd_args.append('-imultilib')
313 cmd_args.append('x86_64')
314
315 if arglist.getLastArg(arglist.parser.MDOption):
316 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000317 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000318 outputOpt = arglist.getLastArg(arglist.parser.oOption)
319 if outputOpt:
320 base,ext = os.path.splitext(arglist.getValue(outputOpt))
321 cmd_args.append(base+'.d')
322 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000323 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000324 if arglist.getLastArg(arglist.parser.MMDOption):
325 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000326 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000327 outputOpt = arglist.getLastArg(arglist.parser.oOption)
328 if outputOpt:
329 base,ext = os.path.splitext(arglist.getValue(outputOpt))
330 cmd_args.append(base+'.d')
331 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000332 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000333 arglist.addLastArg(cmd_args, arglist.parser.MOption)
334 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
335 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
336 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
337 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
338 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
339 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
340 if (not arglist.getLastArg(arglist.parser.MOption) and
341 not arglist.getLastArg(arglist.parser.MMOption) and
342 (arglist.getLastArg(arglist.parser.MDOption) or
343 arglist.getLastArg(arglist.parser.MMDOption))):
344 outputOpt = arglist.getLastArg(arglist.parser.oOption)
345 if outputOpt:
346 cmd_args.append('-MQ')
347 cmd_args.append(arglist.getValue(outputOpt))
348
349 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
350 if arglist.getLastArg(arglist.parser.g3Option):
351 cmd_args.append('-dD')
352 arglist.addLastArg(cmd_args, arglist.parser.HOption)
353
Daniel Dunbardff9f502009-01-12 18:51:02 +0000354 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000355
356 arglist.addAllArgs3(cmd_args,
357 arglist.parser.DOption,
358 arglist.parser.UOption,
359 arglist.parser.AOption)
360
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000361 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000362
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000363 for input in inputs:
364 if isinstance(input.source, Jobs.PipedJob):
365 cmd_args.append('-')
366 else:
367 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000368
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000369 for arg in arglist.getArgs2(arglist.parser.WpOption,
370 arglist.parser.XpreprocessorOption):
371 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000372
373 if arglist.getLastArg(arglist.parser.f_mudflapOption):
374 cmd_args.append('-D_MUDFLAP')
375 cmd_args.append('-include')
376 cmd_args.append('mf-runtime.h')
377
378 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
379 cmd_args.append('-D_MUDFLAP')
380 cmd_args.append('-D_MUDFLAPTH')
381 cmd_args.append('-include')
382 cmd_args.append('mf-runtime.h')
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000383
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000384 else:
385 cmd_args.append('-fpreprocessed')
386 # FIXME: There is a spec command to remove
387 # -fpredictive-compilation args here. Investigate.
388
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000389 for input in inputs:
390 if isinstance(input.source, Jobs.PipedJob):
391 cmd_args.append('-')
392 else:
393 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000394
Daniel Dunbar816dd502009-01-12 17:53:19 +0000395 # Derived from cc1_options spec.
396 if (arglist.getLastArg(arglist.parser.fastOption) or
397 arglist.getLastArg(arglist.parser.fastfOption) or
398 arglist.getLastArg(arglist.parser.fastcpOption)):
399 cmd_args.append('-O3')
400
401 if (arglist.getLastArg(arglist.parser.pgOption) and
402 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
403 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
404
Daniel Dunbardff9f502009-01-12 18:51:02 +0000405 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000406
407 if not arglist.getLastArg(arglist.parser.QOption):
408 cmd_args.append('-quiet')
409
410 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000411 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000412
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000413 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000414
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000415 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
416 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000417
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000418 # FIXME: The goal is to use the user provided -o if that is
419 # our final output, otherwise to drive from the original input
420 # name.
421 #
422 # This implementation is close, but gcc also does this for -S
423 # which is broken, and it would be nice to find a cleaner way
424 # which doesn't introduce a dependency on the output argument
425 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000426 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbar1e0ead42009-01-12 22:19:59 +0000427 if outputOpt and outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000428 cmd_args.append('-auxbase-strip')
429 cmd_args.append(arglist.getValue(outputOpt))
430 else:
431 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000432 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000433
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000434 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000435
436 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
437 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000438 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000439 arglist.addLastArg(cmd_args, arglist.parser.wOption)
440 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
441 if arglist.getLastArg(arglist.parser.vOption):
442 cmd_args.append('-version')
443 if arglist.getLastArg(arglist.parser.pgOption):
444 cmd_args.append('-p')
445 arglist.addLastArg(cmd_args, arglist.parser.pOption)
446
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000447 # ccc treats -fsyntax-only specially.
448 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
449 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000450
451 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
452 if arglist.getLastArg(arglist.parser.QnOption):
453 cmd_args.append('-fno-ident')
454
455 # FIXME: This isn't correct.
456 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
457 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
458
Daniel Dunbar76290532009-01-13 06:25:31 +0000459 # There is no need for this level of compatibility, but it
460 # makes diffing easier.
461 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
462 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000463 if isinstance(output, Jobs.PipedJob):
Daniel Dunbar76290532009-01-13 06:25:31 +0000464 output_args = ['-o', '-']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000465 elif output is None:
Daniel Dunbar76290532009-01-13 06:25:31 +0000466 output_args = ['-o', '/dev/null']
Daniel Dunbar816dd502009-01-12 17:53:19 +0000467 else:
Daniel Dunbar76290532009-01-13 06:25:31 +0000468 output_args = arglist.render(output)
469
470 if not outputAtEnd:
471 cmd_args.extend(output_args)
472
Daniel Dunbar816dd502009-01-12 17:53:19 +0000473 # FIXME: Still don't get what is happening here. Investigate.
474 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
475
476 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
477 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
478 cmd_args.append('-fno-builtin')
479 cmd_args.append('-fno-merge-constants')
480
481 if arglist.getLastArg(arglist.parser.coverageOption):
482 cmd_args.append('-fprofile-arcs')
483 cmd_args.append('-ftest-coverage')
484
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000485 if isCXX:
486 cmd_args.append('-D__private_extern__=extern')
487
Daniel Dunbar76290532009-01-13 06:25:31 +0000488 if outputAtEnd:
489 cmd_args.extend(output_args)
490
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000491 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
492 cmd_args))
493
494
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000495class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000496 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000497 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000498 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000499
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000500 def getMacosxVersionTuple(self, arglist):
501 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
502 if arg:
503 version = arglist.getValue(arg)
504 components = version.split('.')
505 try:
506 return tuple(map(int, components))
507 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000508 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000509 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000510 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000511 return (10, major-4, minor)
512
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000513 def addDarwinArch(self, cmd_args, arch, arglist):
514 # Derived from darwin_arch spec.
515 cmd_args.append('-arch')
516 # FIXME: The actual spec uses -m64 for this, but we want to
517 # respect arch. Figure out what exactly gcc is doing.
518 #if arglist.getLastArg(arglist.parser.m_64Option):
519 if arglist.getValue(arch) == 'x86_64':
520 cmd_args.append('x86_64')
521 else:
522 cmd_args.append('i386')
523
524 def addDarwinSubArch(self, cmd_args, arch, arglist):
525 # Derived from darwin_subarch spec, not sure what the
526 # distinction exists for but at least for this chain it is the same.
527 return self.addDarwinArch(cmd_args, arch, arglist)
528
529 def addLinkArgs(self, cmd_args, arch, arglist):
530 # Derived from link spec.
531 if arglist.getLastArg(arglist.parser.staticOption):
532 cmd_args.append('-static')
533 else:
534 cmd_args.append('-dynamic')
535 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
536 # FIXME: Replace -lobjc in forward args with
537 # -lobjc-gnu. How do we wish to handle such things?
538 pass
539
540 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
541 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
542 self.addDarwinArch(cmd_args, arch, arglist)
543 cmd_args.append('-force_cpusubtype_all')
544 else:
545 self.addDarwinSubArch(cmd_args, arch, arglist)
546
547 if arglist.getLastArg(arglist.parser.ZbundleOption):
548 cmd_args.append('-bundle')
549 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
550 '-bundle_loader')
551 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
552 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
553 # FIXME: Where should diagnostics go?
554 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
555 sys.exit(1)
556 if arglist.getLastArg(arglist.parser.current_versionOption):
557 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
558 sys.exit(1)
559 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
560 cmd_args.append('-force_flat_namespace')
561 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
562 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
563 sys.exit(1)
564 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
565 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
566 else:
567 cmd_args.append('-dylib')
568 if arglist.getLastArg(arglist.parser.ZbundleOption):
569 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
570 sys.exit(1)
571 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
572 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
573 sys.exit(1)
574 if arglist.getLastArg(arglist.parser.client_nameOption):
575 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
576 sys.exit(1)
577 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
578 '-dylib_compatibility_version')
579 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
580 '-dylib_current_version')
581
582 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
583 self.addDarwinArch(cmd_args, arch, arglist)
584 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
585 else:
586 self.addDarwinSubArch(cmd_args, arch, arglist)
587
588 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
589 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
590 sys.exit(1)
591
592 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
593 '-dylib_install_name')
594
595 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
596 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
597 sys.exit(1)
598 if arglist.getLastArg(arglist.parser.private_bundleOption):
599 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
600 sys.exit(1)
601
602 if arglist.getLastArg(arglist.parser.Zall_loadOption):
603 cmd_args.append('-all_load')
604
605 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
606 '-allowable_client')
607
608 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
609 cmd_args.append('-bind_at_load')
610
611 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
612 cmd_args.append('-dead_strip')
613
614 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
615 cmd_args.append('-no_dead_strip_inits_and_terms')
616
617 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
618 '-dylib_file')
619
620 if arglist.getLastArg(arglist.parser.ZdynamicOption):
621 cmd_args.append('-dynamic')
622
623 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
624 '-exported_symbols_list')
625
626 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
627 cmd_args.append('-flat_namespace')
628
629 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
630 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
631 '-image_base')
632 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
633 '-init')
634
635 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
636 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
637 # FIXME: I don't understand what is going on
638 # here. This is supposed to come from
639 # darwin_ld_minversion, but gcc doesn't seem to be
640 # following that; it must be getting over-ridden
641 # somewhere.
642 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000643 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000644 else:
645 # addAll doesn't make sense here but this is what gcc
646 # does.
647 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
648 '-macosx_version_min')
649
650 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
651 '-iphoneos_version_min')
652 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
653
654 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
655 cmd_args.append('-multi_module')
656
657 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
658 cmd_args.append('-single_module')
659
660 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
661 '-multiply_defined')
662
663 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
664 '-multiply_defined_unused')
665
666 if arglist.getLastArg(arglist.parser.f_pieOption):
667 cmd_args.append('-pie')
668
669 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
670 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
671 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
672 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
673 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
674 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
675 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
676 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
677 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
678 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
679 '-segaddr')
680 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
681 '-segs_read_only_addr')
682 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
683 '-segs_read_write_addr')
684 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
685 '-seg_addr_table')
686 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
687 '-fn_seg_addr_table_filename')
688 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
689 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
690 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
691 '-syslibroot')
692 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
693 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
694 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
695 '-umbrella')
696 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
697 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
698 '-unexported_symbols_list')
699 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
700 '-weak_reference_mismatches')
701
702 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
703 cmd_args.append('-weak_reference_mismatches')
704 cmd_args.append('non-weak')
705
706 arglist.addLastArg(cmd_args, arglist.parser.XOption)
707 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
708 arglist.addLastArg(cmd_args, arglist.parser.wOption)
709 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
710 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
711 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
712 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
713 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
714 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
715 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
716 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
717 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
718 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
719 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
720 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000721
722 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000723 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000724 assert outputType is Types.ImageType
725
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000726 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000727 # comes from specs (starting with link_command). Consult gcc
728 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000729
730 # FIXME: gcc's spec controls when this is done; certain things
731 # like -filelist or -Wl, still trigger a link stage. I don't
732 # quite understand how gcc decides to execute the linker,
733 # investigate. Also, the spec references -fdump= which seems
734 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000735 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000736
737 # Not sure why this particular decomposition exists in gcc.
738 self.addLinkArgs(cmd_args, arch, arglist)
739
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000740 # This toolchain never accumlates options in specs, the only
741 # place this gets used is to add -ObjC.
742 if (arglist.getLastArg(arglist.parser.ObjCOption) or
743 arglist.getLastArg(arglist.parser.f_objcOption)):
744 cmd_args.append('-ObjC')
745 if arglist.getLastArg(arglist.parser.ObjCXXOption):
746 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000747
748 # FIXME: gcc has %{x} in here. How could this ever happen?
749 # Cruft?
750 arglist.addLastArg(cmd_args, arglist.parser.dOption)
751 arglist.addLastArg(cmd_args, arglist.parser.tOption)
752 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
753 arglist.addLastArg(cmd_args, arglist.parser.uOption)
754 arglist.addLastArg(cmd_args, arglist.parser.AOption)
755 arglist.addLastArg(cmd_args, arglist.parser.eOption)
756 arglist.addLastArg(cmd_args, arglist.parser.mOption)
757 arglist.addLastArg(cmd_args, arglist.parser.rOption)
758
759 cmd_args.extend(arglist.render(output))
760
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000761 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000762 if (not arglist.getLastArg(arglist.parser.AOption) and
763 not arglist.getLastArg(arglist.parser.nostdlibOption) and
764 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
765 # Derived from startfile spec.
766 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
767 # Derived from darwin_dylib1 spec.
768 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
769 cmd_args.append('-ldylib1.o')
770 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000771 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000772 cmd_args.append('-ldylib1.o')
773 else:
774 cmd_args.append('-ldylib1.10.5.o')
775 else:
776 if arglist.getLastArg(arglist.parser.ZbundleOption):
777 if not arglist.getLastArg(arglist.parser.staticOption):
778 cmd_args.append('-lbundle1.o')
779 else:
780 if arglist.getLastArg(arglist.parser.pgOption):
781 if arglist.getLastArg(arglist.parser.staticOption):
782 cmd_args.append('-lgcrt0.o')
783 else:
784 if arglist.getLastArg(arglist.parser.objectOption):
785 cmd_args.append('-lgcrt0.o')
786 else:
787 if arglist.getLastArg(arglist.parser.preloadOption):
788 cmd_args.append('-lgcrt0.o')
789 else:
790 cmd_args.append('-lgcrt1.o')
791
792 # darwin_crt2 spec is empty.
793 pass
794 else:
795 if arglist.getLastArg(arglist.parser.staticOption):
796 cmd_args.append('-lcrt0.o')
797 else:
798 if arglist.getLastArg(arglist.parser.objectOption):
799 cmd_args.append('-lcrt0.o')
800 else:
801 if arglist.getLastArg(arglist.parser.preloadOption):
802 cmd_args.append('-lcrt0.o')
803 else:
804 # Derived from darwin_crt1 spec.
805 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
806 cmd_args.append('-lcrt1.o')
807 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000808 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000809 cmd_args.append('-lcrt1.o')
810 else:
811 cmd_args.append('-lcrt1.10.5.o')
812
813 # darwin_crt2 spec is empty.
814 pass
815
816 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
817 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000818 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000819 # FIXME: gcc does a library search for this
820 # file, this will be be broken currently.
821 cmd_args.append('crt3.o')
822
823 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
824
825 if arglist.getLastArg(arglist.parser.f_openmpOption):
826 # This is more complicated in gcc...
827 cmd_args.append('-lgomp')
828
829 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000830 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000831 if arglist.getValue(arch) == 'x86_64':
832 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
833 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
834 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
835 "-L/usr/lib/gcc/%s" % tcDir,
836 "-L/usr/lib/gcc/%s" % tcDir,
837 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
838 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000839
Daniel Dunbara5677512009-01-05 19:53:30 +0000840 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000841 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000842
843 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
844 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
845 arglist.getLastArg(arglist.parser.f_createProfileOption) or
846 arglist.getLastArg(arglist.parser.coverageOption)):
847 cmd_args.append('-lgcov')
848
849 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
850 cmd_args.append('-allow_stack_execute')
851
852 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
853 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
854 # link_ssp spec is empty.
855
856 # Derived from libgcc spec.
857 if arglist.getLastArg(arglist.parser.staticOption):
858 cmd_args.append('-lgcc_static')
859 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
860 cmd_args.append('-lgcc_eh')
861 cmd_args.append('-lgcc')
862 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
863 # Derived from darwin_iphoneos_libgcc spec.
864 cmd_args.append('-lgcc_s.10.5')
865 cmd_args.append('-lgcc')
866 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
867 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
868 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000869 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000870 cmd_args.append('-lgcc_s.10.4')
871 else:
872 cmd_args.append('-lgcc_s.10.5')
873 cmd_args.append('-lgcc')
874 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000875 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000876 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000877 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000878 cmd_args.append('-lgcc_s.10.5')
879 cmd_args.append('-lgcc')
880
881 # Derived from lib spec.
882 if not arglist.getLastArg(arglist.parser.staticOption):
883 cmd_args.append('-lSystem')
884
885 if (not arglist.getLastArg(arglist.parser.AOption) and
886 not arglist.getLastArg(arglist.parser.nostdlibOption) and
887 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
888 # endfile_spec is empty.
889 pass
890
891 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
892 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
893
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000894 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
895 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000896
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000897 if (arglist.getLastArg(arglist.parser.gGroup) and
898 not arglist.getLastArg(arglist.parser.gstabsOption) and
899 not arglist.getLastArg(arglist.parser.g0Option)):
900 # FIXME: This is gross, but matches gcc. The test only
901 # considers the suffix (not the -x type), and then only of the
902 # first input.
903 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
904 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
905 '.c++','.cxx','.CPP','.m','.mm'):
906 jobs.addJob(Jobs.Command('dsymutil',
907 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000908
Daniel Dunbara5677512009-01-05 19:53:30 +0000909class LipoTool(Tool):
910 def __init__(self):
911 super(LipoTool, self).__init__('lipo')
912
913 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000914 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000915 assert outputType is Types.ImageType
916
Daniel Dunbardb439902009-01-07 18:40:45 +0000917 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000918 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000919 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000920 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000921 jobs.addJob(Jobs.Command('lipo', cmd_args))