blob: 94f2b60bfdfe83800114aeb1f8d7d75dbb494ad8 [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)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000135 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000136 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 Dunbar7d791fd2009-01-17 02:02:35 +0000144 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000145 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000146 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000147
148 # asm_final spec is empty.
149
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000150 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
151 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000152
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000153class GCC_AssembleTool(GCC_Common_Tool):
154 def __init__(self):
155 # We can't generally assume the assembler can take or output
156 # on pipes.
157 super(GCC_AssembleTool, self).__init__('gcc (as)')
158
159 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000160 output, outputType, arglist):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000161 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000162 output, outputType, arglist,
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000163 ['-c'])
164
165class GCC_LinkTool(GCC_Common_Tool):
166 def __init__(self):
167 super(GCC_LinkTool, self).__init__('gcc (ld)')
168
169 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000170 output, outputType, arglist):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000171 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000172 output, outputType, arglist,
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000173 [])
174
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000175class Clang_CompileTool(Tool):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000176 def __init__(self):
177 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000178 (Tool.eFlagsPipedInput |
179 Tool.eFlagsPipedOutput |
180 Tool.eFlagsIntegratedCPP))
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000181
182 def constructJob(self, phase, arch, jobs, inputs,
183 output, outputType, arglist):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args = []
185
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000186 patchOutputNameForPTH = False
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000187 if output is None:
188 cmd_args.append('-fsyntax-only')
189 elif outputType is Types.AsmTypeNoPP:
190 cmd_args.append('-S')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000191 elif outputType is Types.PCHType:
192 # No special option needed, driven by -x. However, we
193 # patch the output name to try and not conflict with gcc.
194 patchOutputNameForPTH = True
195
196 # FIXME: This is a total hack. Copy the input header file
197 # to the output, so that it can be -include'd by clang.
198 assert len(inputs) == 1
199 assert not isinstance(output, Jobs.PipedJob)
200 assert not isinstance(inputs[0].source, Jobs.PipedJob)
201 inputPath = arglist.getValue(inputs[0].source)
202 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
203 os.path.basename(inputPath))
204 # Only do copy when the output doesn't exist.
205 if not os.path.exists(outputPath):
206 import shutil
207 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000208 else:
209 raise ValueError,"Unexpected output type for clang tool."
210
211 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000212 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
213 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000214 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
215
216 # Special case debug options to only pass -g to clang. This is
217 # wrong.
218 if arglist.getLastArg(arglist.parser.gGroup):
219 cmd_args.append('-g')
220
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000221 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
222
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000223 # FIXME: Clang isn't going to accept just anything here.
224 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
225
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000226 # Automatically load .pth files which match -include options.
227 for arg in arglist.getArgs(arglist.parser.includeOption):
228 pthPath = arglist.getValue(arg) + '.pth'
229 if os.path.exists(pthPath):
230 cmd_args.append('-token-cache')
231 cmd_args.append(pthPath)
232
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000233 # FIXME: Dehardcode this.
234 cmd_args.append('-fblocks')
235
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000236 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
237 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
238 arglist.addLastArg(cmd_args, arglist.parser.wOption)
239 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
240
241 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
242 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
243 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
244 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
245 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
246 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
247 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
248 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
249 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
250 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
251 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
252
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000253 if arch is not None:
254 cmd_args.extend(arglist.render(arch))
255
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000256 if isinstance(output, Jobs.PipedJob):
257 cmd_args.extend(['-o', '-'])
258 else:
259 if patchOutputNameForPTH:
260 base,suffix = os.path.splitext(arglist.getValue(output))
261 if suffix == '.gch':
262 suffix = '.pth'
263 cmd_args.append('-o')
264 cmd_args.append(base + suffix)
265 else:
266 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000267
268 for input in inputs:
269 cmd_args.append('-x')
270 cmd_args.append(input.type.name)
271 if isinstance(input.source, Jobs.PipedJob):
272 cmd_args.append('-')
273 else:
274 cmd_args.extend(arglist.renderAsInput(input.source))
275
276 jobs.addJob(Jobs.Command('clang', cmd_args))
277
Daniel Dunbar06172d62009-01-20 00:47:24 +0000278class Darwin_X86_CC1Tool(Tool):
279 def getCC1Name(self, type):
280 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000281
Daniel Dunbar06172d62009-01-20 00:47:24 +0000282 # FIXME: Get bool results from elsewhere.
283 if type is Types.CType:
284 return 'cc1',True,False
285 elif type is Types.CTypeNoPP:
286 return 'cc1',False,False
287 elif type is Types.ObjCType:
288 return 'cc1obj',True,False
289 elif type is Types.ObjCTypeNoPP:
290 return 'cc1obj',True,False
291 elif type is Types.CXXType:
292 return 'cc1plus',True,True
293 elif type is Types.CXXTypeNoPP:
294 return 'cc1plus',False,True
295 elif type is Types.ObjCXXType:
296 return 'cc1objplus',True,True
297 elif type is Types.ObjCXXTypeNoPP:
298 return 'cc1objplus',False,True
299 else:
300 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000301
302 def addCC1Args(self, cmd_args, arch, arglist):
303 # Derived from cc1 spec.
304
305 # FIXME: -fapple-kext seems to disable this too. Investigate.
306 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
307 not arglist.getLastArg(arglist.parser.staticOption) and
308 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
309 cmd_args.append('-fPIC')
310
311 # FIXME: Remove mthumb
312 # FIXME: Remove mno-thumb
313
314 # FIXME: As with ld, something else is going on. My best guess
315 # is gcc is faking an -mmacosx-version-min
316 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000317# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
318# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
319# cmd_args.append('-mmacosx-version-min=' +
320# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000321
322 # FIXME: Remove faltivec
323 # FIXME: Remove mno-fused-madd
324 # FIXME: Remove mlong-branch
325 # FIXME: Remove mlongcall
326 # FIXME: Remove mcpu=G4
327 # FIXME: Remove mcpu=G5
328
Daniel Dunbar105132e2009-01-16 21:07:21 +0000329 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000330 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
331 cmd_args.append('-feliminate-unused-debug-symbols')
332
Daniel Dunbar06172d62009-01-20 00:47:24 +0000333 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000334 # Derived from cc1_options spec.
335 if (arglist.getLastArg(arglist.parser.fastOption) or
336 arglist.getLastArg(arglist.parser.fastfOption) or
337 arglist.getLastArg(arglist.parser.fastcpOption)):
338 cmd_args.append('-O3')
339
340 if (arglist.getLastArg(arglist.parser.pgOption) and
341 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000342 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000343
Daniel Dunbardff9f502009-01-12 18:51:02 +0000344 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000345
346 if not arglist.getLastArg(arglist.parser.QOption):
347 cmd_args.append('-quiet')
348
349 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000350 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000351
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000352 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000353
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000354 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
355 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000356
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000357 # FIXME: The goal is to use the user provided -o if that is
358 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000359 # name. Find a clean way to go about this.
360 if (arglist.getLastArg(arglist.parser.cOption) or
361 arglist.getLastArg(arglist.parser.SOption)):
362 outputOpt = arglist.getLastArg(arglist.parser.oOption)
363 if outputOpt:
364 cmd_args.append('-auxbase-strip')
365 cmd_args.append(arglist.getValue(outputOpt))
366 else:
367 cmd_args.append('-auxbase')
368 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000369 else:
370 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000371 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000372
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000373 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000374
Daniel Dunbar816dd502009-01-12 17:53:19 +0000375 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
376 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000377 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000378 arglist.addLastArg(cmd_args, arglist.parser.wOption)
379 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
380 if arglist.getLastArg(arglist.parser.vOption):
381 cmd_args.append('-version')
382 if arglist.getLastArg(arglist.parser.pgOption):
383 cmd_args.append('-p')
384 arglist.addLastArg(cmd_args, arglist.parser.pOption)
385
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000386 # ccc treats -fsyntax-only specially.
387 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
388 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000389
Daniel Dunbar06172d62009-01-20 00:47:24 +0000390 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000391 if arglist.getLastArg(arglist.parser.QnOption):
392 cmd_args.append('-fno-ident')
393
394 # FIXME: This isn't correct.
395 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
396 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
397
Daniel Dunbar06172d62009-01-20 00:47:24 +0000398 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000399 cmd_args.extend(output_args)
400
Daniel Dunbar816dd502009-01-12 17:53:19 +0000401 # FIXME: Still don't get what is happening here. Investigate.
402 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
403
404 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
405 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
406 cmd_args.append('-fno-builtin')
407 cmd_args.append('-fno-merge-constants')
408
409 if arglist.getLastArg(arglist.parser.coverageOption):
410 cmd_args.append('-fprofile-arcs')
411 cmd_args.append('-ftest-coverage')
412
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000413 if isCXX:
414 cmd_args.append('-D__private_extern__=extern')
415
Daniel Dunbar06172d62009-01-20 00:47:24 +0000416 def getBaseInputName(self, inputs, arglist):
417 # FIXME: gcc uses a temporary name here when the base
418 # input is stdin, but only in auxbase. Investigate.
419 baseInputValue = arglist.getValue(inputs[0].baseInput)
420 return os.path.basename(baseInputValue)
421
422 def getBaseInputStem(self, inputs, arglist):
423 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
424
425 def getOutputArgs(self, arglist, output, isCPP=False):
426 if isinstance(output, Jobs.PipedJob):
427 if isCPP:
428 output_args = []
429 else:
430 output_args = ['-o', '-']
431 elif output is None:
432 output_args = ['-o', '/dev/null']
433 else:
434 output_args = arglist.render(output)
435
436 # There is no need for this level of compatibility, but it
437 # makes diffing easier.
438 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
439 not arglist.getLastArg(arglist.parser.SOption)):
440 return [], output_args
441 else:
442 return output_args, []
443
444 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
445 output_args, isCXX):
446 # Derived from cpp_options.
447 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
448
449 self.addCC1Args(cmd_args, arch, arglist)
450
451 # NOTE: The code below has some commonality with cpp_options,
452 # but in classic gcc style ends up sending things in different
453 # orders. This may be a good merge candidate once we drop
454 # pedantic compatibility.
455
456 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
457 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
458 arglist.parser.ansiOption,
459 arglist.parser.trigraphsOption)
460 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
461 arglist.parser.pedanticGroup)
462 arglist.addLastArg(cmd_args, arglist.parser.wOption)
463
464 # ccc treats -fsyntax-only specially.
465 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
466 arglist.parser.syntaxOnlyOption)
467
468 if (arglist.getLastArg(arglist.parser.gGroup) and
469 not arglist.getLastArg(arglist.parser.g0Option) and
470 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
471 cmd_args.append('-fworking-directory')
472
473 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
474 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
475 if arglist.getLastArg(arglist.parser.saveTempsOption):
476 cmd_args.append('-fpch-preprocess')
477
478 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
479 # Derived from cpp_unique_options.
480
481 if (arglist.getLastArg(arglist.parser.COption) or
482 arglist.getLastArg(arglist.parser.CCOption)):
483 if not arglist.getLastArg(arglist.parser.EOption):
484 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
485 if not arglist.getLastArg(arglist.parser.QOption):
486 cmd_args.append('-quiet')
487 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
488 arglist.addLastArg(cmd_args, arglist.parser.vOption)
489 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
490 arglist.addLastArg(cmd_args, arglist.parser.POption)
491
492 # FIXME: Handle %I properly.
493 if arglist.getValue(arch) == 'x86_64':
494 cmd_args.append('-imultilib')
495 cmd_args.append('x86_64')
496
497 if arglist.getLastArg(arglist.parser.MDOption):
498 cmd_args.append('-MD')
499 # FIXME: Think about this more.
500 outputOpt = arglist.getLastArg(arglist.parser.oOption)
501 if outputOpt:
502 base,ext = os.path.splitext(arglist.getValue(outputOpt))
503 cmd_args.append(base+'.d')
504 else:
505 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
506 if arglist.getLastArg(arglist.parser.MMDOption):
507 cmd_args.append('-MMD')
508 # FIXME: Think about this more.
509 outputOpt = arglist.getLastArg(arglist.parser.oOption)
510 if outputOpt:
511 base,ext = os.path.splitext(arglist.getValue(outputOpt))
512 cmd_args.append(base+'.d')
513 else:
514 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
515 arglist.addLastArg(cmd_args, arglist.parser.MOption)
516 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
517 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
518 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
519 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
520 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
521 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
522 if (not arglist.getLastArg(arglist.parser.MOption) and
523 not arglist.getLastArg(arglist.parser.MMOption) and
524 (arglist.getLastArg(arglist.parser.MDOption) or
525 arglist.getLastArg(arglist.parser.MMDOption))):
526 outputOpt = arglist.getLastArg(arglist.parser.oOption)
527 if outputOpt:
528 cmd_args.append('-MQ')
529 cmd_args.append(arglist.getValue(outputOpt))
530
531 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
532 if arglist.getLastArg(arglist.parser.g3Option):
533 cmd_args.append('-dD')
534 arglist.addLastArg(cmd_args, arglist.parser.HOption)
535
536 self.addCPPArgs(cmd_args, arch, arglist)
537
538 arglist.addAllArgs3(cmd_args,
539 arglist.parser.DOption,
540 arglist.parser.UOption,
541 arglist.parser.AOption)
542
543 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
544
545 for input in inputs:
546 if isinstance(input.source, Jobs.PipedJob):
547 cmd_args.append('-')
548 else:
549 cmd_args.extend(arglist.renderAsInput(input.source))
550
551 for arg in arglist.getArgs2(arglist.parser.WpOption,
552 arglist.parser.XpreprocessorOption):
553 cmd_args.extend(arglist.getValues(arg))
554
555 if arglist.getLastArg(arglist.parser.f_mudflapOption):
556 cmd_args.append('-D_MUDFLAP')
557 cmd_args.append('-include')
558 cmd_args.append('mf-runtime.h')
559
560 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
561 cmd_args.append('-D_MUDFLAP')
562 cmd_args.append('-D_MUDFLAPTH')
563 cmd_args.append('-include')
564 cmd_args.append('mf-runtime.h')
565
566 def addCPPArgs(self, cmd_args, arch, arglist):
567 # Derived from cpp spec.
568
569 if arglist.getLastArg(arglist.parser.staticOption):
570 # The gcc spec is broken here, it refers to dynamic but
571 # that has been translated. Start by being bug compatible.
572
573 # if not arglist.getLastArg(arglist.parser.dynamicOption):
574 cmd_args.append('-D__STATIC__')
575 else:
576 cmd_args.append('-D__DYNAMIC__')
577
578 if arglist.getLastArg(arglist.parser.pthreadOption):
579 cmd_args.append('-D_REENTRANT')
580
581class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
582 def __init__(self, toolChain):
583 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
584 (Tool.eFlagsPipedInput |
585 Tool.eFlagsPipedOutput))
586 self.toolChain = toolChain
587
588 def constructJob(self, phase, arch, jobs, inputs,
589 output, outputType, arglist):
590 inputType = inputs[0].type
591 assert not [i for i in inputs if i.type != inputType]
592
593 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
594
595 cmd_args = ['-E']
596 if (arglist.getLastArg(arglist.parser.traditionalOption) or
597 arglist.getLastArg(arglist.parser.f_traditionalOption) or
598 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
599 cmd_args.append('-traditional-cpp')
600
601 early_output_args, end_output_args = self.getOutputArgs(arglist, output,
602 isCPP=True)
603 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
604 early_output_args, isCXX)
605 cmd_args.extend(end_output_args)
606
607 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
608
609 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
610 cmd_args))
611
612class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
613 def __init__(self, toolChain):
614 super(Darwin_X86_CompileTool, self).__init__('cc1',
615 (Tool.eFlagsPipedInput |
616 Tool.eFlagsPipedOutput |
617 Tool.eFlagsIntegratedCPP))
618 self.toolChain = toolChain
619
620 def constructJob(self, phase, arch, jobs, inputs,
621 output, outputType, arglist):
622 inputType = inputs[0].type
623 assert not [i for i in inputs if i.type != inputType]
624
625 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
626
627 cmd_args = []
628 if (arglist.getLastArg(arglist.parser.traditionalOption) or
629 arglist.getLastArg(arglist.parser.f_traditionalOption)):
630 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
631
632 early_output_args, end_output_args = self.getOutputArgs(arglist, output)
633 if usePP:
634 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
635 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
636 early_output_args, isCXX)
637 cmd_args.extend(end_output_args)
638 else:
639 cmd_args.append('-fpreprocessed')
640
641 # FIXME: There is a spec command to remove
642 # -fpredictive-compilation args here. Investigate.
643
644 for input in inputs:
645 if isinstance(input.source, Jobs.PipedJob):
646 cmd_args.append('-')
647 else:
648 cmd_args.extend(arglist.renderAsInput(input.source))
649
650 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
651 early_output_args, isCXX)
652 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000653
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000654 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
655 cmd_args))
656
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000657class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000658 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000659 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000660 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000661
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000662 def getMacosxVersionTuple(self, arglist):
663 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
664 if arg:
665 version = arglist.getValue(arg)
666 components = version.split('.')
667 try:
668 return tuple(map(int, components))
669 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000670 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000671 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000672 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000673 return (10, major-4, minor)
674
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000675 def addDarwinArch(self, cmd_args, arch, arglist):
676 # Derived from darwin_arch spec.
677 cmd_args.append('-arch')
678 # FIXME: The actual spec uses -m64 for this, but we want to
679 # respect arch. Figure out what exactly gcc is doing.
680 #if arglist.getLastArg(arglist.parser.m_64Option):
681 if arglist.getValue(arch) == 'x86_64':
682 cmd_args.append('x86_64')
683 else:
684 cmd_args.append('i386')
685
686 def addDarwinSubArch(self, cmd_args, arch, arglist):
687 # Derived from darwin_subarch spec, not sure what the
688 # distinction exists for but at least for this chain it is the same.
689 return self.addDarwinArch(cmd_args, arch, arglist)
690
691 def addLinkArgs(self, cmd_args, arch, arglist):
692 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000693 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
694 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000695 cmd_args.append('-dynamic')
696 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
697 # FIXME: Replace -lobjc in forward args with
698 # -lobjc-gnu. How do we wish to handle such things?
699 pass
700
Daniel Dunbar470104e2009-01-17 00:53:19 +0000701 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
702 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000703 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000704 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000705 else:
706 self.addDarwinSubArch(cmd_args, arch, arglist)
707
Daniel Dunbar470104e2009-01-17 00:53:19 +0000708 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000709 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000710 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000711 '-bundle_loader')
712 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
713 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
714 # FIXME: Where should diagnostics go?
715 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
716 sys.exit(1)
717 if arglist.getLastArg(arglist.parser.current_versionOption):
718 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
719 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000720 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000721 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000722 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000723 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
724 sys.exit(1)
725 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
726 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
727 else:
728 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000729 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000730 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
731 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000732 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000733 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
734 sys.exit(1)
735 if arglist.getLastArg(arglist.parser.client_nameOption):
736 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
737 sys.exit(1)
738 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
739 '-dylib_compatibility_version')
740 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
741 '-dylib_current_version')
742
Daniel Dunbar470104e2009-01-17 00:53:19 +0000743 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000744 self.addDarwinArch(cmd_args, arch, arglist)
745 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
746 else:
747 self.addDarwinSubArch(cmd_args, arch, arglist)
748
Daniel Dunbar470104e2009-01-17 00:53:19 +0000749 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000750 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
751 sys.exit(1)
752
Daniel Dunbar470104e2009-01-17 00:53:19 +0000753 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000754 '-dylib_install_name')
755
756 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
757 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
758 sys.exit(1)
759 if arglist.getLastArg(arglist.parser.private_bundleOption):
760 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
761 sys.exit(1)
762
Daniel Dunbar470104e2009-01-17 00:53:19 +0000763 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000764 cmd_args.append('-all_load')
765
Daniel Dunbar470104e2009-01-17 00:53:19 +0000766 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000767 '-allowable_client')
768
Daniel Dunbar470104e2009-01-17 00:53:19 +0000769 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000770 cmd_args.append('-bind_at_load')
771
Daniel Dunbar470104e2009-01-17 00:53:19 +0000772 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000773 cmd_args.append('-dead_strip')
774
Daniel Dunbar470104e2009-01-17 00:53:19 +0000775 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000776 cmd_args.append('-no_dead_strip_inits_and_terms')
777
Daniel Dunbar470104e2009-01-17 00:53:19 +0000778 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000779 '-dylib_file')
780
Daniel Dunbar470104e2009-01-17 00:53:19 +0000781 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000782 cmd_args.append('-dynamic')
783
Daniel Dunbar470104e2009-01-17 00:53:19 +0000784 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000785 '-exported_symbols_list')
786
Daniel Dunbar470104e2009-01-17 00:53:19 +0000787 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000788 cmd_args.append('-flat_namespace')
789
790 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000791 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000793 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000794 '-init')
795
796 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
797 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
798 # FIXME: I don't understand what is going on
799 # here. This is supposed to come from
800 # darwin_ld_minversion, but gcc doesn't seem to be
801 # following that; it must be getting over-ridden
802 # somewhere.
803 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000804 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000805 else:
806 # addAll doesn't make sense here but this is what gcc
807 # does.
808 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
809 '-macosx_version_min')
810
811 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
812 '-iphoneos_version_min')
813 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
814
Daniel Dunbar470104e2009-01-17 00:53:19 +0000815 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000816 cmd_args.append('-multi_module')
817
Daniel Dunbar470104e2009-01-17 00:53:19 +0000818 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000819 cmd_args.append('-single_module')
820
Daniel Dunbar470104e2009-01-17 00:53:19 +0000821 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000822 '-multiply_defined')
823
Daniel Dunbar470104e2009-01-17 00:53:19 +0000824 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000825 '-multiply_defined_unused')
826
827 if arglist.getLastArg(arglist.parser.f_pieOption):
828 cmd_args.append('-pie')
829
830 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
831 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
832 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
833 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
834 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
835 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
836 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
837 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
838 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000839 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000840 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000841 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000842 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000843 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000844 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000845 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000846 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000847 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
848 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000849 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
850 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
851 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
852 '-syslibroot')
853 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
854 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000855 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000856 '-umbrella')
857 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000858 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000859 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000860 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000861 '-weak_reference_mismatches')
862
Daniel Dunbar470104e2009-01-17 00:53:19 +0000863 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000864 cmd_args.append('-weak_reference_mismatches')
865 cmd_args.append('non-weak')
866
867 arglist.addLastArg(cmd_args, arglist.parser.XOption)
868 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
869 arglist.addLastArg(cmd_args, arglist.parser.wOption)
870 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
871 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
872 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
873 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
874 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
875 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
876 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
877 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
878 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
879 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
880 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
881 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000882
883 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000884 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000885 assert outputType is Types.ImageType
886
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000887 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000888 # comes from specs (starting with link_command). Consult gcc
889 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000890
891 # FIXME: gcc's spec controls when this is done; certain things
892 # like -filelist or -Wl, still trigger a link stage. I don't
893 # quite understand how gcc decides to execute the linker,
894 # investigate. Also, the spec references -fdump= which seems
895 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000896 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000897
898 # Not sure why this particular decomposition exists in gcc.
899 self.addLinkArgs(cmd_args, arch, arglist)
900
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000901 # This toolchain never accumlates options in specs, the only
902 # place this gets used is to add -ObjC.
903 if (arglist.getLastArg(arglist.parser.ObjCOption) or
904 arglist.getLastArg(arglist.parser.f_objcOption)):
905 cmd_args.append('-ObjC')
906 if arglist.getLastArg(arglist.parser.ObjCXXOption):
907 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000908
909 # FIXME: gcc has %{x} in here. How could this ever happen?
910 # Cruft?
911 arglist.addLastArg(cmd_args, arglist.parser.dOption)
912 arglist.addLastArg(cmd_args, arglist.parser.tOption)
913 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000914 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000915 arglist.addLastArg(cmd_args, arglist.parser.AOption)
916 arglist.addLastArg(cmd_args, arglist.parser.eOption)
917 arglist.addLastArg(cmd_args, arglist.parser.mOption)
918 arglist.addLastArg(cmd_args, arglist.parser.rOption)
919
920 cmd_args.extend(arglist.render(output))
921
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000922 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000923 if (not arglist.getLastArg(arglist.parser.AOption) and
924 not arglist.getLastArg(arglist.parser.nostdlibOption) and
925 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
926 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +0000927 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000928 # Derived from darwin_dylib1 spec.
929 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
930 cmd_args.append('-ldylib1.o')
931 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000932 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000933 cmd_args.append('-ldylib1.o')
934 else:
935 cmd_args.append('-ldylib1.10.5.o')
936 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +0000937 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000938 if not arglist.getLastArg(arglist.parser.staticOption):
939 cmd_args.append('-lbundle1.o')
940 else:
941 if arglist.getLastArg(arglist.parser.pgOption):
942 if arglist.getLastArg(arglist.parser.staticOption):
943 cmd_args.append('-lgcrt0.o')
944 else:
945 if arglist.getLastArg(arglist.parser.objectOption):
946 cmd_args.append('-lgcrt0.o')
947 else:
948 if arglist.getLastArg(arglist.parser.preloadOption):
949 cmd_args.append('-lgcrt0.o')
950 else:
951 cmd_args.append('-lgcrt1.o')
952
953 # darwin_crt2 spec is empty.
954 pass
955 else:
956 if arglist.getLastArg(arglist.parser.staticOption):
957 cmd_args.append('-lcrt0.o')
958 else:
959 if arglist.getLastArg(arglist.parser.objectOption):
960 cmd_args.append('-lcrt0.o')
961 else:
962 if arglist.getLastArg(arglist.parser.preloadOption):
963 cmd_args.append('-lcrt0.o')
964 else:
965 # Derived from darwin_crt1 spec.
966 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
967 cmd_args.append('-lcrt1.o')
968 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000969 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000970 cmd_args.append('-lcrt1.o')
971 else:
972 cmd_args.append('-lcrt1.10.5.o')
973
974 # darwin_crt2 spec is empty.
975 pass
976
977 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
978 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000979 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000980 # FIXME: gcc does a library search for this
981 # file, this will be be broken currently.
982 cmd_args.append('crt3.o')
983
984 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
985
986 if arglist.getLastArg(arglist.parser.f_openmpOption):
987 # This is more complicated in gcc...
988 cmd_args.append('-lgomp')
989
990 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000991 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000992 if arglist.getValue(arch) == 'x86_64':
993 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
994 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
995 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
996 "-L/usr/lib/gcc/%s" % tcDir,
997 "-L/usr/lib/gcc/%s" % tcDir,
998 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
999 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001000
Daniel Dunbara5677512009-01-05 19:53:30 +00001001 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001002 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001003
1004 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1005 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1006 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1007 arglist.getLastArg(arglist.parser.coverageOption)):
1008 cmd_args.append('-lgcov')
1009
1010 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1011 cmd_args.append('-allow_stack_execute')
1012
1013 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1014 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1015 # link_ssp spec is empty.
1016
1017 # Derived from libgcc spec.
1018 if arglist.getLastArg(arglist.parser.staticOption):
1019 cmd_args.append('-lgcc_static')
1020 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1021 cmd_args.append('-lgcc_eh')
1022 cmd_args.append('-lgcc')
1023 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1024 # Derived from darwin_iphoneos_libgcc spec.
1025 cmd_args.append('-lgcc_s.10.5')
1026 cmd_args.append('-lgcc')
1027 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1028 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1029 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001030 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001031 cmd_args.append('-lgcc_s.10.4')
1032 else:
1033 cmd_args.append('-lgcc_s.10.5')
1034 cmd_args.append('-lgcc')
1035 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001036 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001037 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001038 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001039 cmd_args.append('-lgcc_s.10.5')
1040 cmd_args.append('-lgcc')
1041
1042 # Derived from lib spec.
1043 if not arglist.getLastArg(arglist.parser.staticOption):
1044 cmd_args.append('-lSystem')
1045
1046 if (not arglist.getLastArg(arglist.parser.AOption) and
1047 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1048 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1049 # endfile_spec is empty.
1050 pass
1051
1052 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1053 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1054
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001055 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1056 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001057
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001058 if (arglist.getLastArg(arglist.parser.gGroup) and
1059 not arglist.getLastArg(arglist.parser.gstabsOption) and
1060 not arglist.getLastArg(arglist.parser.g0Option)):
1061 # FIXME: This is gross, but matches gcc. The test only
1062 # considers the suffix (not the -x type), and then only of the
1063 # first input.
1064 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1065 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1066 '.c++','.cxx','.CPP','.m','.mm'):
1067 jobs.addJob(Jobs.Command('dsymutil',
1068 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001069
Daniel Dunbara5677512009-01-05 19:53:30 +00001070class LipoTool(Tool):
1071 def __init__(self):
1072 super(LipoTool, self).__init__('lipo')
1073
1074 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +00001075 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +00001076 assert outputType is Types.ImageType
1077
Daniel Dunbardb439902009-01-07 18:40:45 +00001078 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001079 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001080 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001081 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001082 jobs.addJob(Jobs.Command('lipo', cmd_args))