blob: 06d1ab140872393b4c2d4efd06e9bf8418db0267 [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.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000283 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000284 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000285 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000286 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000287 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000288 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000289 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPTypeP:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000290 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000291 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000292 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000293 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000294 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000295 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000296 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000297 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000298 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:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000428 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000429 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000430 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000431 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000432 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000433 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000434 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000435
436 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
437 output_args, isCXX):
438 # Derived from cpp_options.
439 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
440
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000441 cmd_args.extend(output_args)
442
Daniel Dunbar06172d62009-01-20 00:47:24 +0000443 self.addCC1Args(cmd_args, arch, arglist)
444
445 # NOTE: The code below has some commonality with cpp_options,
446 # but in classic gcc style ends up sending things in different
447 # orders. This may be a good merge candidate once we drop
448 # pedantic compatibility.
449
450 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
451 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
452 arglist.parser.ansiOption,
453 arglist.parser.trigraphsOption)
454 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
455 arglist.parser.pedanticGroup)
456 arglist.addLastArg(cmd_args, arglist.parser.wOption)
457
458 # ccc treats -fsyntax-only specially.
459 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
460 arglist.parser.syntaxOnlyOption)
461
462 if (arglist.getLastArg(arglist.parser.gGroup) and
463 not arglist.getLastArg(arglist.parser.g0Option) and
464 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
465 cmd_args.append('-fworking-directory')
466
467 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
468 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
469 if arglist.getLastArg(arglist.parser.saveTempsOption):
470 cmd_args.append('-fpch-preprocess')
471
472 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
473 # Derived from cpp_unique_options.
474
475 if (arglist.getLastArg(arglist.parser.COption) or
476 arglist.getLastArg(arglist.parser.CCOption)):
477 if not arglist.getLastArg(arglist.parser.EOption):
478 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
479 if not arglist.getLastArg(arglist.parser.QOption):
480 cmd_args.append('-quiet')
481 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
482 arglist.addLastArg(cmd_args, arglist.parser.vOption)
483 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
484 arglist.addLastArg(cmd_args, arglist.parser.POption)
485
486 # FIXME: Handle %I properly.
487 if arglist.getValue(arch) == 'x86_64':
488 cmd_args.append('-imultilib')
489 cmd_args.append('x86_64')
490
491 if arglist.getLastArg(arglist.parser.MDOption):
492 cmd_args.append('-MD')
493 # FIXME: Think about this more.
494 outputOpt = arglist.getLastArg(arglist.parser.oOption)
495 if outputOpt:
496 base,ext = os.path.splitext(arglist.getValue(outputOpt))
497 cmd_args.append(base+'.d')
498 else:
499 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
500 if arglist.getLastArg(arglist.parser.MMDOption):
501 cmd_args.append('-MMD')
502 # FIXME: Think about this more.
503 outputOpt = arglist.getLastArg(arglist.parser.oOption)
504 if outputOpt:
505 base,ext = os.path.splitext(arglist.getValue(outputOpt))
506 cmd_args.append(base+'.d')
507 else:
508 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
509 arglist.addLastArg(cmd_args, arglist.parser.MOption)
510 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
511 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
512 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
513 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
514 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
515 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
516 if (not arglist.getLastArg(arglist.parser.MOption) and
517 not arglist.getLastArg(arglist.parser.MMOption) and
518 (arglist.getLastArg(arglist.parser.MDOption) or
519 arglist.getLastArg(arglist.parser.MMDOption))):
520 outputOpt = arglist.getLastArg(arglist.parser.oOption)
521 if outputOpt:
522 cmd_args.append('-MQ')
523 cmd_args.append(arglist.getValue(outputOpt))
524
525 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
526 if arglist.getLastArg(arglist.parser.g3Option):
527 cmd_args.append('-dD')
528 arglist.addLastArg(cmd_args, arglist.parser.HOption)
529
530 self.addCPPArgs(cmd_args, arch, arglist)
531
532 arglist.addAllArgs3(cmd_args,
533 arglist.parser.DOption,
534 arglist.parser.UOption,
535 arglist.parser.AOption)
536
537 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
538
539 for input in inputs:
540 if isinstance(input.source, Jobs.PipedJob):
541 cmd_args.append('-')
542 else:
543 cmd_args.extend(arglist.renderAsInput(input.source))
544
545 for arg in arglist.getArgs2(arglist.parser.WpOption,
546 arglist.parser.XpreprocessorOption):
547 cmd_args.extend(arglist.getValues(arg))
548
549 if arglist.getLastArg(arglist.parser.f_mudflapOption):
550 cmd_args.append('-D_MUDFLAP')
551 cmd_args.append('-include')
552 cmd_args.append('mf-runtime.h')
553
554 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
555 cmd_args.append('-D_MUDFLAP')
556 cmd_args.append('-D_MUDFLAPTH')
557 cmd_args.append('-include')
558 cmd_args.append('mf-runtime.h')
559
560 def addCPPArgs(self, cmd_args, arch, arglist):
561 # Derived from cpp spec.
562
563 if arglist.getLastArg(arglist.parser.staticOption):
564 # The gcc spec is broken here, it refers to dynamic but
565 # that has been translated. Start by being bug compatible.
566
567 # if not arglist.getLastArg(arglist.parser.dynamicOption):
568 cmd_args.append('-D__STATIC__')
569 else:
570 cmd_args.append('-D__DYNAMIC__')
571
572 if arglist.getLastArg(arglist.parser.pthreadOption):
573 cmd_args.append('-D_REENTRANT')
574
575class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
576 def __init__(self, toolChain):
577 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
578 (Tool.eFlagsPipedInput |
579 Tool.eFlagsPipedOutput))
580 self.toolChain = toolChain
581
582 def constructJob(self, phase, arch, jobs, inputs,
583 output, outputType, arglist):
584 inputType = inputs[0].type
585 assert not [i for i in inputs if i.type != inputType]
586
587 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
588
589 cmd_args = ['-E']
590 if (arglist.getLastArg(arglist.parser.traditionalOption) or
591 arglist.getLastArg(arglist.parser.f_traditionalOption) or
592 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
593 cmd_args.append('-traditional-cpp')
594
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000595 output_args = self.getOutputArgs(arglist, output,
596 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000597 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000598 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000599
600 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
601
602 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
603 cmd_args))
604
605class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
606 def __init__(self, toolChain):
607 super(Darwin_X86_CompileTool, self).__init__('cc1',
608 (Tool.eFlagsPipedInput |
609 Tool.eFlagsPipedOutput |
610 Tool.eFlagsIntegratedCPP))
611 self.toolChain = toolChain
612
613 def constructJob(self, phase, arch, jobs, inputs,
614 output, outputType, arglist):
615 inputType = inputs[0].type
616 assert not [i for i in inputs if i.type != inputType]
617
618 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
619
620 cmd_args = []
621 if (arglist.getLastArg(arglist.parser.traditionalOption) or
622 arglist.getLastArg(arglist.parser.f_traditionalOption)):
623 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
624
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000625 if outputType is Types.PCHType:
626 output_args = []
627 else:
628 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000629
630 # There is no need for this level of compatibility, but it
631 # makes diffing easier.
632 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
633 not arglist.getLastArg(arglist.parser.SOption)):
634 early_output_args, end_output_args = [], output_args
635 else:
636 early_output_args, end_output_args = output_args, []
637
Daniel Dunbar06172d62009-01-20 00:47:24 +0000638 if usePP:
639 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
640 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
641 early_output_args, isCXX)
642 cmd_args.extend(end_output_args)
643 else:
644 cmd_args.append('-fpreprocessed')
645
646 # FIXME: There is a spec command to remove
647 # -fpredictive-compilation args here. Investigate.
648
649 for input in inputs:
650 if isinstance(input.source, Jobs.PipedJob):
651 cmd_args.append('-')
652 else:
653 cmd_args.extend(arglist.renderAsInput(input.source))
654
655 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
656 early_output_args, isCXX)
657 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000658
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000659 if outputType is Types.PCHType:
660 assert output is not None and not isinstance(output, Jobs.PipedJob)
661
662 cmd_args.append('-o')
663 # NOTE: gcc uses a temp .s file for this, but there
664 # doesn't seem to be a good reason.
665 cmd_args.append('/dev/null')
666
667 cmd_args.append('--output-pch=')
668 cmd_args.append(arglist.getValue(output))
669
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000670 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
671 cmd_args))
672
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000673class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000674 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000675 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000676 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000677
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000678 def getMacosxVersionTuple(self, arglist):
679 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
680 if arg:
681 version = arglist.getValue(arg)
682 components = version.split('.')
683 try:
684 return tuple(map(int, components))
685 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000686 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000687 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000688 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000689 return (10, major-4, minor)
690
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000691 def addDarwinArch(self, cmd_args, arch, arglist):
692 # Derived from darwin_arch spec.
693 cmd_args.append('-arch')
694 # FIXME: The actual spec uses -m64 for this, but we want to
695 # respect arch. Figure out what exactly gcc is doing.
696 #if arglist.getLastArg(arglist.parser.m_64Option):
697 if arglist.getValue(arch) == 'x86_64':
698 cmd_args.append('x86_64')
699 else:
700 cmd_args.append('i386')
701
702 def addDarwinSubArch(self, cmd_args, arch, arglist):
703 # Derived from darwin_subarch spec, not sure what the
704 # distinction exists for but at least for this chain it is the same.
705 return self.addDarwinArch(cmd_args, arch, arglist)
706
707 def addLinkArgs(self, cmd_args, arch, arglist):
708 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000709 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
710 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000711 cmd_args.append('-dynamic')
712 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
713 # FIXME: Replace -lobjc in forward args with
714 # -lobjc-gnu. How do we wish to handle such things?
715 pass
716
Daniel Dunbar470104e2009-01-17 00:53:19 +0000717 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
718 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000719 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000720 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000721 else:
722 self.addDarwinSubArch(cmd_args, arch, arglist)
723
Daniel Dunbar470104e2009-01-17 00:53:19 +0000724 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000725 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000726 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000727 '-bundle_loader')
728 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
729 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
730 # FIXME: Where should diagnostics go?
731 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
732 sys.exit(1)
733 if arglist.getLastArg(arglist.parser.current_versionOption):
734 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
735 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000736 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000737 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000738 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000739 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
740 sys.exit(1)
741 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
742 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
743 else:
744 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000745 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000746 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
747 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000748 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000749 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
750 sys.exit(1)
751 if arglist.getLastArg(arglist.parser.client_nameOption):
752 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
753 sys.exit(1)
754 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
755 '-dylib_compatibility_version')
756 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
757 '-dylib_current_version')
758
Daniel Dunbar470104e2009-01-17 00:53:19 +0000759 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000760 self.addDarwinArch(cmd_args, arch, arglist)
761 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
762 else:
763 self.addDarwinSubArch(cmd_args, arch, arglist)
764
Daniel Dunbar470104e2009-01-17 00:53:19 +0000765 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000766 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
767 sys.exit(1)
768
Daniel Dunbar470104e2009-01-17 00:53:19 +0000769 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000770 '-dylib_install_name')
771
772 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
773 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
774 sys.exit(1)
775 if arglist.getLastArg(arglist.parser.private_bundleOption):
776 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
777 sys.exit(1)
778
Daniel Dunbar470104e2009-01-17 00:53:19 +0000779 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000780 cmd_args.append('-all_load')
781
Daniel Dunbar470104e2009-01-17 00:53:19 +0000782 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000783 '-allowable_client')
784
Daniel Dunbar470104e2009-01-17 00:53:19 +0000785 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000786 cmd_args.append('-bind_at_load')
787
Daniel Dunbar470104e2009-01-17 00:53:19 +0000788 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000789 cmd_args.append('-dead_strip')
790
Daniel Dunbar470104e2009-01-17 00:53:19 +0000791 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792 cmd_args.append('-no_dead_strip_inits_and_terms')
793
Daniel Dunbar470104e2009-01-17 00:53:19 +0000794 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000795 '-dylib_file')
796
Daniel Dunbar470104e2009-01-17 00:53:19 +0000797 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000798 cmd_args.append('-dynamic')
799
Daniel Dunbar470104e2009-01-17 00:53:19 +0000800 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000801 '-exported_symbols_list')
802
Daniel Dunbar470104e2009-01-17 00:53:19 +0000803 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000804 cmd_args.append('-flat_namespace')
805
806 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000807 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000808 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000809 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000810 '-init')
811
812 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
813 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
814 # FIXME: I don't understand what is going on
815 # here. This is supposed to come from
816 # darwin_ld_minversion, but gcc doesn't seem to be
817 # following that; it must be getting over-ridden
818 # somewhere.
819 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000820 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000821 else:
822 # addAll doesn't make sense here but this is what gcc
823 # does.
824 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
825 '-macosx_version_min')
826
827 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
828 '-iphoneos_version_min')
829 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
830
Daniel Dunbar470104e2009-01-17 00:53:19 +0000831 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000832 cmd_args.append('-multi_module')
833
Daniel Dunbar470104e2009-01-17 00:53:19 +0000834 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000835 cmd_args.append('-single_module')
836
Daniel Dunbar470104e2009-01-17 00:53:19 +0000837 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000838 '-multiply_defined')
839
Daniel Dunbar470104e2009-01-17 00:53:19 +0000840 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000841 '-multiply_defined_unused')
842
843 if arglist.getLastArg(arglist.parser.f_pieOption):
844 cmd_args.append('-pie')
845
846 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
847 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
848 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
849 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
850 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
851 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
852 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
853 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
854 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000855 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000856 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000857 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000858 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000859 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000860 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000861 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000862 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000863 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
864 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000865 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
866 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
867 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
868 '-syslibroot')
869 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
870 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000871 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000872 '-umbrella')
873 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000874 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000875 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000876 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000877 '-weak_reference_mismatches')
878
Daniel Dunbar470104e2009-01-17 00:53:19 +0000879 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000880 cmd_args.append('-weak_reference_mismatches')
881 cmd_args.append('non-weak')
882
883 arglist.addLastArg(cmd_args, arglist.parser.XOption)
884 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
885 arglist.addLastArg(cmd_args, arglist.parser.wOption)
886 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
887 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
888 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
889 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
890 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
891 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
892 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
893 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
894 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
895 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
896 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
897 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000898
899 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000900 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000901 assert outputType is Types.ImageType
902
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000903 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000904 # comes from specs (starting with link_command). Consult gcc
905 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000906
907 # FIXME: gcc's spec controls when this is done; certain things
908 # like -filelist or -Wl, still trigger a link stage. I don't
909 # quite understand how gcc decides to execute the linker,
910 # investigate. Also, the spec references -fdump= which seems
911 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000912 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000913
914 # Not sure why this particular decomposition exists in gcc.
915 self.addLinkArgs(cmd_args, arch, arglist)
916
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000917 # This toolchain never accumlates options in specs, the only
918 # place this gets used is to add -ObjC.
919 if (arglist.getLastArg(arglist.parser.ObjCOption) or
920 arglist.getLastArg(arglist.parser.f_objcOption)):
921 cmd_args.append('-ObjC')
922 if arglist.getLastArg(arglist.parser.ObjCXXOption):
923 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000924
925 # FIXME: gcc has %{x} in here. How could this ever happen?
926 # Cruft?
927 arglist.addLastArg(cmd_args, arglist.parser.dOption)
928 arglist.addLastArg(cmd_args, arglist.parser.tOption)
929 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000930 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000931 arglist.addLastArg(cmd_args, arglist.parser.AOption)
932 arglist.addLastArg(cmd_args, arglist.parser.eOption)
933 arglist.addLastArg(cmd_args, arglist.parser.mOption)
934 arglist.addLastArg(cmd_args, arglist.parser.rOption)
935
936 cmd_args.extend(arglist.render(output))
937
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000938 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000939 if (not arglist.getLastArg(arglist.parser.AOption) and
940 not arglist.getLastArg(arglist.parser.nostdlibOption) and
941 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
942 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +0000943 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000944 # Derived from darwin_dylib1 spec.
945 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
946 cmd_args.append('-ldylib1.o')
947 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000948 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000949 cmd_args.append('-ldylib1.o')
950 else:
951 cmd_args.append('-ldylib1.10.5.o')
952 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +0000953 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000954 if not arglist.getLastArg(arglist.parser.staticOption):
955 cmd_args.append('-lbundle1.o')
956 else:
957 if arglist.getLastArg(arglist.parser.pgOption):
958 if arglist.getLastArg(arglist.parser.staticOption):
959 cmd_args.append('-lgcrt0.o')
960 else:
961 if arglist.getLastArg(arglist.parser.objectOption):
962 cmd_args.append('-lgcrt0.o')
963 else:
964 if arglist.getLastArg(arglist.parser.preloadOption):
965 cmd_args.append('-lgcrt0.o')
966 else:
967 cmd_args.append('-lgcrt1.o')
968
969 # darwin_crt2 spec is empty.
970 pass
971 else:
972 if arglist.getLastArg(arglist.parser.staticOption):
973 cmd_args.append('-lcrt0.o')
974 else:
975 if arglist.getLastArg(arglist.parser.objectOption):
976 cmd_args.append('-lcrt0.o')
977 else:
978 if arglist.getLastArg(arglist.parser.preloadOption):
979 cmd_args.append('-lcrt0.o')
980 else:
981 # Derived from darwin_crt1 spec.
982 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
983 cmd_args.append('-lcrt1.o')
984 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000985 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000986 cmd_args.append('-lcrt1.o')
987 else:
988 cmd_args.append('-lcrt1.10.5.o')
989
990 # darwin_crt2 spec is empty.
991 pass
992
993 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
994 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000995 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000996 # FIXME: gcc does a library search for this
997 # file, this will be be broken currently.
998 cmd_args.append('crt3.o')
999
1000 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1001
1002 if arglist.getLastArg(arglist.parser.f_openmpOption):
1003 # This is more complicated in gcc...
1004 cmd_args.append('-lgomp')
1005
1006 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001007 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001008 if arglist.getValue(arch) == 'x86_64':
1009 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1010 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1011 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1012 "-L/usr/lib/gcc/%s" % tcDir,
1013 "-L/usr/lib/gcc/%s" % tcDir,
1014 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1015 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001016
Daniel Dunbara5677512009-01-05 19:53:30 +00001017 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001018 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001019
1020 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1021 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1022 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1023 arglist.getLastArg(arglist.parser.coverageOption)):
1024 cmd_args.append('-lgcov')
1025
1026 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1027 cmd_args.append('-allow_stack_execute')
1028
1029 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1030 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1031 # link_ssp spec is empty.
1032
1033 # Derived from libgcc spec.
1034 if arglist.getLastArg(arglist.parser.staticOption):
1035 cmd_args.append('-lgcc_static')
1036 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1037 cmd_args.append('-lgcc_eh')
1038 cmd_args.append('-lgcc')
1039 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1040 # Derived from darwin_iphoneos_libgcc spec.
1041 cmd_args.append('-lgcc_s.10.5')
1042 cmd_args.append('-lgcc')
1043 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1044 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1045 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001046 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001047 cmd_args.append('-lgcc_s.10.4')
1048 else:
1049 cmd_args.append('-lgcc_s.10.5')
1050 cmd_args.append('-lgcc')
1051 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001052 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001053 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001054 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001055 cmd_args.append('-lgcc_s.10.5')
1056 cmd_args.append('-lgcc')
1057
1058 # Derived from lib spec.
1059 if not arglist.getLastArg(arglist.parser.staticOption):
1060 cmd_args.append('-lSystem')
1061
1062 if (not arglist.getLastArg(arglist.parser.AOption) and
1063 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1064 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1065 # endfile_spec is empty.
1066 pass
1067
1068 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1069 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1070
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001071 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1072 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001073
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001074 if (arglist.getLastArg(arglist.parser.gGroup) and
1075 not arglist.getLastArg(arglist.parser.gstabsOption) and
1076 not arglist.getLastArg(arglist.parser.g0Option)):
1077 # FIXME: This is gross, but matches gcc. The test only
1078 # considers the suffix (not the -x type), and then only of the
1079 # first input.
1080 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1081 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1082 '.c++','.cxx','.CPP','.m','.mm'):
1083 jobs.addJob(Jobs.Command('dsymutil',
1084 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001085
Daniel Dunbara5677512009-01-05 19:53:30 +00001086class LipoTool(Tool):
1087 def __init__(self):
1088 super(LipoTool, self).__init__('lipo')
1089
1090 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar11672ec2009-01-13 18:51:26 +00001091 output, outputType, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +00001092 assert outputType is Types.ImageType
1093
Daniel Dunbardb439902009-01-07 18:40:45 +00001094 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001095 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001096 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001097 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001098 jobs.addJob(Jobs.Command('lipo', cmd_args))