blob: 2bb694c4e284545e2fe29b0213ddd2a541fa1695 [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):
Daniel Dunbar7c584962009-01-20 21:29:14 +000027 def getGCCExtraArgs(self):
28 return []
29
Daniel Dunbara5677512009-01-05 19:53:30 +000030 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +000031 output, outputType, arglist, linkingOutput):
Daniel Dunbar11672ec2009-01-13 18:51:26 +000032 cmd_args = []
33 for arg in arglist.args:
34 if arg.opt.forwardToGCC():
35 cmd_args.extend(arglist.render(arg))
36
Daniel Dunbar7c584962009-01-20 21:29:14 +000037 cmd_args.extend(self.getGCCExtraArgs())
Daniel Dunbara5677512009-01-05 19:53:30 +000038 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000039 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000040 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000041 cmd_args.extend(['-o', '-'])
Daniel Dunbara5677512009-01-05 19:53:30 +000042 elif output is None:
Daniel Dunbardb439902009-01-07 18:40:45 +000043 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000044 else:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000045 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000046
Daniel Dunbar7c584962009-01-20 21:29:14 +000047 if (isinstance(self, GCC_LinkTool) and
48 linkingOutput):
49 cmd_args.append('-Wl,-arch_multiple')
50 cmd_args.append('-Wl,-final_output,' +
51 arglist.getValue(linkingOutput))
52
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000053 # Only pass -x if gcc will understand it; otherwise hope gcc
54 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000055 # would go wrong in is for linker inputs if they happened to
56 # have an odd suffix; really the only way to get this to
57 # happen is a command like '-x foobar a.c' which will treat
58 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000059 #
60 # FIXME: For the linker case specifically, can we safely
61 # convert inputs into '-Wl,' options?
62 for input in inputs:
63 if input.type.canBeUserSpecified:
64 cmd_args.extend(['-x', input.type.name])
65
66 if isinstance(input.source, Jobs.PipedJob):
67 cmd_args.append('-')
68 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000069 assert isinstance(input.source, Arguments.Arg)
70 # If this is a linker input then assume we can forward
71 # just by rendering.
72 if input.source.opt.isLinkerInput:
73 cmd_args.extend(arglist.render(input.source))
74 else:
75 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000076
77 jobs.addJob(Jobs.Command('gcc', cmd_args))
78
79class GCC_PreprocessTool(GCC_Common_Tool):
80 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000081 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000082 (Tool.eFlagsPipedInput |
83 Tool.eFlagsPipedOutput))
84
Daniel Dunbar7c584962009-01-20 21:29:14 +000085 def getGCCExtraArgs(self):
86 return ['-E']
Daniel Dunbara5677512009-01-05 19:53:30 +000087
88class GCC_CompileTool(GCC_Common_Tool):
89 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000090 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000091 (Tool.eFlagsPipedInput |
92 Tool.eFlagsPipedOutput |
93 Tool.eFlagsIntegratedCPP))
94
Daniel Dunbar7c584962009-01-20 21:29:14 +000095 def getGCCExtraArgs(self):
96 return ['-S']
Daniel Dunbara5677512009-01-05 19:53:30 +000097
98class GCC_PrecompileTool(GCC_Common_Tool):
99 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000100 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +0000101 (Tool.eFlagsPipedInput |
102 Tool.eFlagsIntegratedCPP))
103
Daniel Dunbar7c584962009-01-20 21:29:14 +0000104 def getGCCExtraArgs(self):
105 return []
106
107class GCC_AssembleTool(GCC_Common_Tool):
108 def __init__(self):
109 # We can't generally assume the assembler can take or output
110 # on pipes.
111 super(GCC_AssembleTool, self).__init__('gcc (as)')
112
113 def getGCCExtraArgs(self):
114 return ['-c']
115
116class GCC_LinkTool(GCC_Common_Tool):
117 def __init__(self):
118 super(GCC_LinkTool, self).__init__('gcc (ld)')
Daniel Dunbara5677512009-01-05 19:53:30 +0000119
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000120class Darwin_AssembleTool(Tool):
121 def __init__(self, toolChain):
122 super(Darwin_AssembleTool, self).__init__('as',
123 Tool.eFlagsPipedInput)
124 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000125
126 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000127 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000128 assert len(inputs) == 1
129 assert outputType is Types.ObjectType
130
131 input = inputs[0]
132
133 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000134
Daniel Dunbar76290532009-01-13 06:25:31 +0000135 # Bit of a hack, this is only used for original inputs.
136 if input.isOriginalInput():
137 if arglist.getLastArg(arglist.parser.gGroup):
138 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000139
140 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000141 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000142 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000143 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000144 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
145 arglist.getLastArg(arglist.parser.staticOption) or
146 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000147 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000148 cmd_args.append('-static')
149
150 for arg in arglist.getArgs2(arglist.parser.WaOption,
151 arglist.parser.XassemblerOption):
152 cmd_args.extend(arglist.getValues(arg))
153
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000154 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000155 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000156 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000157 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000158 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000159
160 # asm_final spec is empty.
161
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000162 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
163 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000164
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000165class Clang_CompileTool(Tool):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000166 def __init__(self):
167 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000168 (Tool.eFlagsPipedInput |
169 Tool.eFlagsPipedOutput |
170 Tool.eFlagsIntegratedCPP))
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000171
172 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000173 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000174 cmd_args = []
175
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000176 patchOutputNameForPTH = False
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000177 if output is None:
178 cmd_args.append('-fsyntax-only')
179 elif outputType is Types.AsmTypeNoPP:
180 cmd_args.append('-S')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000181 elif outputType is Types.PCHType:
182 # No special option needed, driven by -x. However, we
183 # patch the output name to try and not conflict with gcc.
184 patchOutputNameForPTH = True
185
186 # FIXME: This is a total hack. Copy the input header file
187 # to the output, so that it can be -include'd by clang.
188 assert len(inputs) == 1
189 assert not isinstance(output, Jobs.PipedJob)
190 assert not isinstance(inputs[0].source, Jobs.PipedJob)
191 inputPath = arglist.getValue(inputs[0].source)
192 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
193 os.path.basename(inputPath))
194 # Only do copy when the output doesn't exist.
195 if not os.path.exists(outputPath):
196 import shutil
197 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000198 else:
199 raise ValueError,"Unexpected output type for clang tool."
200
201 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000202 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
203 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000204 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
205
206 # Special case debug options to only pass -g to clang. This is
207 # wrong.
208 if arglist.getLastArg(arglist.parser.gGroup):
209 cmd_args.append('-g')
210
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000211 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
212
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000213 # FIXME: Clang isn't going to accept just anything here.
214 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
215
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000216 # Automatically load .pth files which match -include options.
217 for arg in arglist.getArgs(arglist.parser.includeOption):
218 pthPath = arglist.getValue(arg) + '.pth'
219 if os.path.exists(pthPath):
220 cmd_args.append('-token-cache')
221 cmd_args.append(pthPath)
222
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000223 # FIXME: Dehardcode this.
224 cmd_args.append('-fblocks')
225
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000226 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
227 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
228 arglist.addLastArg(cmd_args, arglist.parser.wOption)
229 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
230
231 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
232 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
233 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
234 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
235 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
236 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
237 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
238 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
239 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
240 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
241 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
242
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000243 if arch is not None:
244 cmd_args.extend(arglist.render(arch))
245
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000246 if isinstance(output, Jobs.PipedJob):
247 cmd_args.extend(['-o', '-'])
248 else:
249 if patchOutputNameForPTH:
250 base,suffix = os.path.splitext(arglist.getValue(output))
251 if suffix == '.gch':
252 suffix = '.pth'
253 cmd_args.append('-o')
254 cmd_args.append(base + suffix)
255 else:
256 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000257
258 for input in inputs:
259 cmd_args.append('-x')
260 cmd_args.append(input.type.name)
261 if isinstance(input.source, Jobs.PipedJob):
262 cmd_args.append('-')
263 else:
264 cmd_args.extend(arglist.renderAsInput(input.source))
265
266 jobs.addJob(Jobs.Command('clang', cmd_args))
267
Daniel Dunbar06172d62009-01-20 00:47:24 +0000268class Darwin_X86_CC1Tool(Tool):
269 def getCC1Name(self, type):
270 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000271
Daniel Dunbar06172d62009-01-20 00:47:24 +0000272 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000273 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000274 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000275 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000276 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000277 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000278 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000279 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPTypeP:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000280 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000281 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000282 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000283 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000284 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000285 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000286 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000287 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000288 return 'cc1objplus',False,True
289 else:
290 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000291
292 def addCC1Args(self, cmd_args, arch, arglist):
293 # Derived from cc1 spec.
294
295 # FIXME: -fapple-kext seems to disable this too. Investigate.
296 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
297 not arglist.getLastArg(arglist.parser.staticOption) and
298 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
299 cmd_args.append('-fPIC')
300
301 # FIXME: Remove mthumb
302 # FIXME: Remove mno-thumb
303
304 # FIXME: As with ld, something else is going on. My best guess
305 # is gcc is faking an -mmacosx-version-min
306 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000307# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
308# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
309# cmd_args.append('-mmacosx-version-min=' +
310# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000311
312 # FIXME: Remove faltivec
313 # FIXME: Remove mno-fused-madd
314 # FIXME: Remove mlong-branch
315 # FIXME: Remove mlongcall
316 # FIXME: Remove mcpu=G4
317 # FIXME: Remove mcpu=G5
318
Daniel Dunbar105132e2009-01-16 21:07:21 +0000319 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000320 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
321 cmd_args.append('-feliminate-unused-debug-symbols')
322
Daniel Dunbar06172d62009-01-20 00:47:24 +0000323 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000324 # Derived from cc1_options spec.
325 if (arglist.getLastArg(arglist.parser.fastOption) or
326 arglist.getLastArg(arglist.parser.fastfOption) or
327 arglist.getLastArg(arglist.parser.fastcpOption)):
328 cmd_args.append('-O3')
329
330 if (arglist.getLastArg(arglist.parser.pgOption) and
331 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000332 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000333
Daniel Dunbardff9f502009-01-12 18:51:02 +0000334 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000335
336 if not arglist.getLastArg(arglist.parser.QOption):
337 cmd_args.append('-quiet')
338
339 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000340 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000341
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000342 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000343
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000344 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
345 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000346
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000347 # FIXME: The goal is to use the user provided -o if that is
348 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000349 # name. Find a clean way to go about this.
350 if (arglist.getLastArg(arglist.parser.cOption) or
351 arglist.getLastArg(arglist.parser.SOption)):
352 outputOpt = arglist.getLastArg(arglist.parser.oOption)
353 if outputOpt:
354 cmd_args.append('-auxbase-strip')
355 cmd_args.append(arglist.getValue(outputOpt))
356 else:
357 cmd_args.append('-auxbase')
358 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000359 else:
360 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000361 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000362
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000363 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000364
Daniel Dunbar816dd502009-01-12 17:53:19 +0000365 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
366 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000367 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000368 arglist.addLastArg(cmd_args, arglist.parser.wOption)
369 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
370 if arglist.getLastArg(arglist.parser.vOption):
371 cmd_args.append('-version')
372 if arglist.getLastArg(arglist.parser.pgOption):
373 cmd_args.append('-p')
374 arglist.addLastArg(cmd_args, arglist.parser.pOption)
375
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000376 # ccc treats -fsyntax-only specially.
377 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
378 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000379
Daniel Dunbar06172d62009-01-20 00:47:24 +0000380 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000381 if arglist.getLastArg(arglist.parser.QnOption):
382 cmd_args.append('-fno-ident')
383
384 # FIXME: This isn't correct.
385 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
386 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
387
Daniel Dunbar06172d62009-01-20 00:47:24 +0000388 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000389 cmd_args.extend(output_args)
390
Daniel Dunbar816dd502009-01-12 17:53:19 +0000391 # FIXME: Still don't get what is happening here. Investigate.
392 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
393
394 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
395 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
396 cmd_args.append('-fno-builtin')
397 cmd_args.append('-fno-merge-constants')
398
399 if arglist.getLastArg(arglist.parser.coverageOption):
400 cmd_args.append('-fprofile-arcs')
401 cmd_args.append('-ftest-coverage')
402
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000403 if isCXX:
404 cmd_args.append('-D__private_extern__=extern')
405
Daniel Dunbar06172d62009-01-20 00:47:24 +0000406 def getBaseInputName(self, inputs, arglist):
407 # FIXME: gcc uses a temporary name here when the base
408 # input is stdin, but only in auxbase. Investigate.
409 baseInputValue = arglist.getValue(inputs[0].baseInput)
410 return os.path.basename(baseInputValue)
411
412 def getBaseInputStem(self, inputs, arglist):
413 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
414
415 def getOutputArgs(self, arglist, output, isCPP=False):
416 if isinstance(output, Jobs.PipedJob):
417 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000418 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000419 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000420 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000421 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000422 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000423 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000424 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000425
426 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
427 output_args, isCXX):
428 # Derived from cpp_options.
429 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
430
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000431 cmd_args.extend(output_args)
432
Daniel Dunbar06172d62009-01-20 00:47:24 +0000433 self.addCC1Args(cmd_args, arch, arglist)
434
435 # NOTE: The code below has some commonality with cpp_options,
436 # but in classic gcc style ends up sending things in different
437 # orders. This may be a good merge candidate once we drop
438 # pedantic compatibility.
439
440 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
441 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
442 arglist.parser.ansiOption,
443 arglist.parser.trigraphsOption)
444 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
445 arglist.parser.pedanticGroup)
446 arglist.addLastArg(cmd_args, arglist.parser.wOption)
447
448 # ccc treats -fsyntax-only specially.
449 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
450 arglist.parser.syntaxOnlyOption)
451
452 if (arglist.getLastArg(arglist.parser.gGroup) and
453 not arglist.getLastArg(arglist.parser.g0Option) and
454 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
455 cmd_args.append('-fworking-directory')
456
457 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
458 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
459 if arglist.getLastArg(arglist.parser.saveTempsOption):
460 cmd_args.append('-fpch-preprocess')
461
462 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
463 # Derived from cpp_unique_options.
464
465 if (arglist.getLastArg(arglist.parser.COption) or
466 arglist.getLastArg(arglist.parser.CCOption)):
467 if not arglist.getLastArg(arglist.parser.EOption):
468 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
469 if not arglist.getLastArg(arglist.parser.QOption):
470 cmd_args.append('-quiet')
471 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
472 arglist.addLastArg(cmd_args, arglist.parser.vOption)
473 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
474 arglist.addLastArg(cmd_args, arglist.parser.POption)
475
476 # FIXME: Handle %I properly.
477 if arglist.getValue(arch) == 'x86_64':
478 cmd_args.append('-imultilib')
479 cmd_args.append('x86_64')
480
481 if arglist.getLastArg(arglist.parser.MDOption):
482 cmd_args.append('-MD')
483 # FIXME: Think about this more.
484 outputOpt = arglist.getLastArg(arglist.parser.oOption)
485 if outputOpt:
486 base,ext = os.path.splitext(arglist.getValue(outputOpt))
487 cmd_args.append(base+'.d')
488 else:
489 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
490 if arglist.getLastArg(arglist.parser.MMDOption):
491 cmd_args.append('-MMD')
492 # FIXME: Think about this more.
493 outputOpt = arglist.getLastArg(arglist.parser.oOption)
494 if outputOpt:
495 base,ext = os.path.splitext(arglist.getValue(outputOpt))
496 cmd_args.append(base+'.d')
497 else:
498 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
499 arglist.addLastArg(cmd_args, arglist.parser.MOption)
500 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
501 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
502 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
503 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
504 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
505 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
506 if (not arglist.getLastArg(arglist.parser.MOption) and
507 not arglist.getLastArg(arglist.parser.MMOption) and
508 (arglist.getLastArg(arglist.parser.MDOption) or
509 arglist.getLastArg(arglist.parser.MMDOption))):
510 outputOpt = arglist.getLastArg(arglist.parser.oOption)
511 if outputOpt:
512 cmd_args.append('-MQ')
513 cmd_args.append(arglist.getValue(outputOpt))
514
515 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
516 if arglist.getLastArg(arglist.parser.g3Option):
517 cmd_args.append('-dD')
518 arglist.addLastArg(cmd_args, arglist.parser.HOption)
519
520 self.addCPPArgs(cmd_args, arch, arglist)
521
522 arglist.addAllArgs3(cmd_args,
523 arglist.parser.DOption,
524 arglist.parser.UOption,
525 arglist.parser.AOption)
526
527 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
528
529 for input in inputs:
530 if isinstance(input.source, Jobs.PipedJob):
531 cmd_args.append('-')
532 else:
533 cmd_args.extend(arglist.renderAsInput(input.source))
534
535 for arg in arglist.getArgs2(arglist.parser.WpOption,
536 arglist.parser.XpreprocessorOption):
537 cmd_args.extend(arglist.getValues(arg))
538
539 if arglist.getLastArg(arglist.parser.f_mudflapOption):
540 cmd_args.append('-D_MUDFLAP')
541 cmd_args.append('-include')
542 cmd_args.append('mf-runtime.h')
543
544 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
545 cmd_args.append('-D_MUDFLAP')
546 cmd_args.append('-D_MUDFLAPTH')
547 cmd_args.append('-include')
548 cmd_args.append('mf-runtime.h')
549
550 def addCPPArgs(self, cmd_args, arch, arglist):
551 # Derived from cpp spec.
552
553 if arglist.getLastArg(arglist.parser.staticOption):
554 # The gcc spec is broken here, it refers to dynamic but
555 # that has been translated. Start by being bug compatible.
556
557 # if not arglist.getLastArg(arglist.parser.dynamicOption):
558 cmd_args.append('-D__STATIC__')
559 else:
560 cmd_args.append('-D__DYNAMIC__')
561
562 if arglist.getLastArg(arglist.parser.pthreadOption):
563 cmd_args.append('-D_REENTRANT')
564
565class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
566 def __init__(self, toolChain):
567 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
568 (Tool.eFlagsPipedInput |
569 Tool.eFlagsPipedOutput))
570 self.toolChain = toolChain
571
572 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000573 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000574 inputType = inputs[0].type
575 assert not [i for i in inputs if i.type != inputType]
576
577 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
578
579 cmd_args = ['-E']
580 if (arglist.getLastArg(arglist.parser.traditionalOption) or
581 arglist.getLastArg(arglist.parser.f_traditionalOption) or
582 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
583 cmd_args.append('-traditional-cpp')
584
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000585 output_args = self.getOutputArgs(arglist, output,
586 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000587 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000588 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000589
590 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
591
592 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
593 cmd_args))
594
595class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
596 def __init__(self, toolChain):
597 super(Darwin_X86_CompileTool, self).__init__('cc1',
598 (Tool.eFlagsPipedInput |
599 Tool.eFlagsPipedOutput |
600 Tool.eFlagsIntegratedCPP))
601 self.toolChain = toolChain
602
603 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000604 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000605 inputType = inputs[0].type
606 assert not [i for i in inputs if i.type != inputType]
607
608 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
609
610 cmd_args = []
611 if (arglist.getLastArg(arglist.parser.traditionalOption) or
612 arglist.getLastArg(arglist.parser.f_traditionalOption)):
613 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
614
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000615 if outputType is Types.PCHType:
616 output_args = []
617 else:
618 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000619
620 # There is no need for this level of compatibility, but it
621 # makes diffing easier.
622 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
623 not arglist.getLastArg(arglist.parser.SOption)):
624 early_output_args, end_output_args = [], output_args
625 else:
626 early_output_args, end_output_args = output_args, []
627
Daniel Dunbar06172d62009-01-20 00:47:24 +0000628 if usePP:
629 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
630 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
631 early_output_args, isCXX)
632 cmd_args.extend(end_output_args)
633 else:
634 cmd_args.append('-fpreprocessed')
635
636 # FIXME: There is a spec command to remove
637 # -fpredictive-compilation args here. Investigate.
638
639 for input in inputs:
640 if isinstance(input.source, Jobs.PipedJob):
641 cmd_args.append('-')
642 else:
643 cmd_args.extend(arglist.renderAsInput(input.source))
644
645 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
646 early_output_args, isCXX)
647 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000648
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000649 if outputType is Types.PCHType:
650 assert output is not None and not isinstance(output, Jobs.PipedJob)
651
652 cmd_args.append('-o')
653 # NOTE: gcc uses a temp .s file for this, but there
654 # doesn't seem to be a good reason.
655 cmd_args.append('/dev/null')
656
657 cmd_args.append('--output-pch=')
658 cmd_args.append(arglist.getValue(output))
659
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000660 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
661 cmd_args))
662
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000663class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000664 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000665 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000666 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000667
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000668 def getMacosxVersionTuple(self, arglist):
669 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
670 if arg:
671 version = arglist.getValue(arg)
672 components = version.split('.')
673 try:
674 return tuple(map(int, components))
675 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000676 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000677 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000678 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000679 return (10, major-4, minor)
680
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000681 def addDarwinArch(self, cmd_args, arch, arglist):
682 # Derived from darwin_arch spec.
683 cmd_args.append('-arch')
684 # FIXME: The actual spec uses -m64 for this, but we want to
685 # respect arch. Figure out what exactly gcc is doing.
686 #if arglist.getLastArg(arglist.parser.m_64Option):
687 if arglist.getValue(arch) == 'x86_64':
688 cmd_args.append('x86_64')
689 else:
690 cmd_args.append('i386')
691
692 def addDarwinSubArch(self, cmd_args, arch, arglist):
693 # Derived from darwin_subarch spec, not sure what the
694 # distinction exists for but at least for this chain it is the same.
695 return self.addDarwinArch(cmd_args, arch, arglist)
696
697 def addLinkArgs(self, cmd_args, arch, arglist):
698 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000699 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
700 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000701 cmd_args.append('-dynamic')
702 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
703 # FIXME: Replace -lobjc in forward args with
704 # -lobjc-gnu. How do we wish to handle such things?
705 pass
706
Daniel Dunbar470104e2009-01-17 00:53:19 +0000707 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
708 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000709 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000710 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000711 else:
712 self.addDarwinSubArch(cmd_args, arch, arglist)
713
Daniel Dunbar470104e2009-01-17 00:53:19 +0000714 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000715 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000716 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000717 '-bundle_loader')
718 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
719 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
720 # FIXME: Where should diagnostics go?
721 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
722 sys.exit(1)
723 if arglist.getLastArg(arglist.parser.current_versionOption):
724 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
725 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000726 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000727 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000728 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000729 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
730 sys.exit(1)
731 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
732 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
733 else:
734 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000735 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000736 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
737 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000738 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000739 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
740 sys.exit(1)
741 if arglist.getLastArg(arglist.parser.client_nameOption):
742 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
743 sys.exit(1)
744 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
745 '-dylib_compatibility_version')
746 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
747 '-dylib_current_version')
748
Daniel Dunbar470104e2009-01-17 00:53:19 +0000749 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000750 self.addDarwinArch(cmd_args, arch, arglist)
751 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
752 else:
753 self.addDarwinSubArch(cmd_args, arch, arglist)
754
Daniel Dunbar470104e2009-01-17 00:53:19 +0000755 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000756 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
757 sys.exit(1)
758
Daniel Dunbar470104e2009-01-17 00:53:19 +0000759 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000760 '-dylib_install_name')
761
762 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
763 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
764 sys.exit(1)
765 if arglist.getLastArg(arglist.parser.private_bundleOption):
766 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
767 sys.exit(1)
768
Daniel Dunbar470104e2009-01-17 00:53:19 +0000769 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000770 cmd_args.append('-all_load')
771
Daniel Dunbar470104e2009-01-17 00:53:19 +0000772 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000773 '-allowable_client')
774
Daniel Dunbar470104e2009-01-17 00:53:19 +0000775 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000776 cmd_args.append('-bind_at_load')
777
Daniel Dunbar470104e2009-01-17 00:53:19 +0000778 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000779 cmd_args.append('-dead_strip')
780
Daniel Dunbar470104e2009-01-17 00:53:19 +0000781 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000782 cmd_args.append('-no_dead_strip_inits_and_terms')
783
Daniel Dunbar470104e2009-01-17 00:53:19 +0000784 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000785 '-dylib_file')
786
Daniel Dunbar470104e2009-01-17 00:53:19 +0000787 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000788 cmd_args.append('-dynamic')
789
Daniel Dunbar470104e2009-01-17 00:53:19 +0000790 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000791 '-exported_symbols_list')
792
Daniel Dunbar470104e2009-01-17 00:53:19 +0000793 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000794 cmd_args.append('-flat_namespace')
795
796 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000797 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000798 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000799 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000800 '-init')
801
802 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
803 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
804 # FIXME: I don't understand what is going on
805 # here. This is supposed to come from
806 # darwin_ld_minversion, but gcc doesn't seem to be
807 # following that; it must be getting over-ridden
808 # somewhere.
809 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000810 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000811 else:
812 # addAll doesn't make sense here but this is what gcc
813 # does.
814 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
815 '-macosx_version_min')
816
817 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
818 '-iphoneos_version_min')
819 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
820
Daniel Dunbar470104e2009-01-17 00:53:19 +0000821 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000822 cmd_args.append('-multi_module')
823
Daniel Dunbar470104e2009-01-17 00:53:19 +0000824 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000825 cmd_args.append('-single_module')
826
Daniel Dunbar470104e2009-01-17 00:53:19 +0000827 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000828 '-multiply_defined')
829
Daniel Dunbar470104e2009-01-17 00:53:19 +0000830 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000831 '-multiply_defined_unused')
832
833 if arglist.getLastArg(arglist.parser.f_pieOption):
834 cmd_args.append('-pie')
835
836 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
837 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
838 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
839 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
840 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
841 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
842 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
843 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
844 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000845 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000846 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000847 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000848 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000849 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000850 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000851 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000852 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000853 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
854 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000855 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
856 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
857 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
858 '-syslibroot')
859 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
860 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000861 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000862 '-umbrella')
863 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000864 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000865 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000866 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000867 '-weak_reference_mismatches')
868
Daniel Dunbar470104e2009-01-17 00:53:19 +0000869 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000870 cmd_args.append('-weak_reference_mismatches')
871 cmd_args.append('non-weak')
872
873 arglist.addLastArg(cmd_args, arglist.parser.XOption)
874 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
875 arglist.addLastArg(cmd_args, arglist.parser.wOption)
876 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
877 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
878 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
879 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
880 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
881 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
882 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
883 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
884 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
885 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
886 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
887 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000888
889 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000890 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000891 assert outputType is Types.ImageType
892
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000893 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000894 # comes from specs (starting with link_command). Consult gcc
895 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000896
897 # FIXME: gcc's spec controls when this is done; certain things
898 # like -filelist or -Wl, still trigger a link stage. I don't
899 # quite understand how gcc decides to execute the linker,
900 # investigate. Also, the spec references -fdump= which seems
901 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000902 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000903
904 # Not sure why this particular decomposition exists in gcc.
905 self.addLinkArgs(cmd_args, arch, arglist)
906
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000907 # This toolchain never accumlates options in specs, the only
908 # place this gets used is to add -ObjC.
909 if (arglist.getLastArg(arglist.parser.ObjCOption) or
910 arglist.getLastArg(arglist.parser.f_objcOption)):
911 cmd_args.append('-ObjC')
912 if arglist.getLastArg(arglist.parser.ObjCXXOption):
913 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000914
915 # FIXME: gcc has %{x} in here. How could this ever happen?
916 # Cruft?
917 arglist.addLastArg(cmd_args, arglist.parser.dOption)
918 arglist.addLastArg(cmd_args, arglist.parser.tOption)
919 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000920 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000921 arglist.addLastArg(cmd_args, arglist.parser.AOption)
922 arglist.addLastArg(cmd_args, arglist.parser.eOption)
923 arglist.addLastArg(cmd_args, arglist.parser.mOption)
924 arglist.addLastArg(cmd_args, arglist.parser.rOption)
925
926 cmd_args.extend(arglist.render(output))
927
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000928 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000929 if (not arglist.getLastArg(arglist.parser.AOption) and
930 not arglist.getLastArg(arglist.parser.nostdlibOption) and
931 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
932 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +0000933 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000934 # Derived from darwin_dylib1 spec.
935 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
936 cmd_args.append('-ldylib1.o')
937 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000938 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000939 cmd_args.append('-ldylib1.o')
940 else:
941 cmd_args.append('-ldylib1.10.5.o')
942 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +0000943 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000944 if not arglist.getLastArg(arglist.parser.staticOption):
945 cmd_args.append('-lbundle1.o')
946 else:
947 if arglist.getLastArg(arglist.parser.pgOption):
948 if arglist.getLastArg(arglist.parser.staticOption):
949 cmd_args.append('-lgcrt0.o')
950 else:
951 if arglist.getLastArg(arglist.parser.objectOption):
952 cmd_args.append('-lgcrt0.o')
953 else:
954 if arglist.getLastArg(arglist.parser.preloadOption):
955 cmd_args.append('-lgcrt0.o')
956 else:
957 cmd_args.append('-lgcrt1.o')
958
959 # darwin_crt2 spec is empty.
960 pass
961 else:
962 if arglist.getLastArg(arglist.parser.staticOption):
963 cmd_args.append('-lcrt0.o')
964 else:
965 if arglist.getLastArg(arglist.parser.objectOption):
966 cmd_args.append('-lcrt0.o')
967 else:
968 if arglist.getLastArg(arglist.parser.preloadOption):
969 cmd_args.append('-lcrt0.o')
970 else:
971 # Derived from darwin_crt1 spec.
972 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
973 cmd_args.append('-lcrt1.o')
974 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000975 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000976 cmd_args.append('-lcrt1.o')
977 else:
978 cmd_args.append('-lcrt1.10.5.o')
979
980 # darwin_crt2 spec is empty.
981 pass
982
983 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
984 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000985 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000986 # FIXME: gcc does a library search for this
987 # file, this will be be broken currently.
988 cmd_args.append('crt3.o')
989
990 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
991
992 if arglist.getLastArg(arglist.parser.f_openmpOption):
993 # This is more complicated in gcc...
994 cmd_args.append('-lgomp')
995
996 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000997 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000998 if arglist.getValue(arch) == 'x86_64':
999 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1000 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1001 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1002 "-L/usr/lib/gcc/%s" % tcDir,
1003 "-L/usr/lib/gcc/%s" % tcDir,
1004 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1005 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001006
Daniel Dunbara5677512009-01-05 19:53:30 +00001007 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001008 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001009
Daniel Dunbar7c584962009-01-20 21:29:14 +00001010 if linkingOutput:
1011 cmd_args.append('-arch_multiple')
1012 cmd_args.append('-final_output')
1013 cmd_args.append(arglist.getValue(linkingOutput))
1014
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001015 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1016 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1017 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1018 arglist.getLastArg(arglist.parser.coverageOption)):
1019 cmd_args.append('-lgcov')
1020
1021 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1022 cmd_args.append('-allow_stack_execute')
1023
1024 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1025 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1026 # link_ssp spec is empty.
1027
1028 # Derived from libgcc spec.
1029 if arglist.getLastArg(arglist.parser.staticOption):
1030 cmd_args.append('-lgcc_static')
1031 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1032 cmd_args.append('-lgcc_eh')
1033 cmd_args.append('-lgcc')
1034 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1035 # Derived from darwin_iphoneos_libgcc spec.
1036 cmd_args.append('-lgcc_s.10.5')
1037 cmd_args.append('-lgcc')
1038 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1039 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1040 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001041 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001042 cmd_args.append('-lgcc_s.10.4')
1043 else:
1044 cmd_args.append('-lgcc_s.10.5')
1045 cmd_args.append('-lgcc')
1046 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001047 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001048 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001049 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001050 cmd_args.append('-lgcc_s.10.5')
1051 cmd_args.append('-lgcc')
1052
1053 # Derived from lib spec.
1054 if not arglist.getLastArg(arglist.parser.staticOption):
1055 cmd_args.append('-lSystem')
1056
1057 if (not arglist.getLastArg(arglist.parser.AOption) and
1058 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1059 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1060 # endfile_spec is empty.
1061 pass
1062
1063 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1064 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1065
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001066 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1067 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001068
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001069 if (arglist.getLastArg(arglist.parser.gGroup) and
1070 not arglist.getLastArg(arglist.parser.gstabsOption) and
1071 not arglist.getLastArg(arglist.parser.g0Option)):
1072 # FIXME: This is gross, but matches gcc. The test only
1073 # considers the suffix (not the -x type), and then only of the
1074 # first input.
1075 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1076 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1077 '.c++','.cxx','.CPP','.m','.mm'):
1078 jobs.addJob(Jobs.Command('dsymutil',
1079 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001080
Daniel Dunbara5677512009-01-05 19:53:30 +00001081class LipoTool(Tool):
1082 def __init__(self):
1083 super(LipoTool, self).__init__('lipo')
1084
1085 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001086 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001087 assert outputType is Types.ImageType
1088
Daniel Dunbardb439902009-01-07 18:40:45 +00001089 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001090 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001091 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001092 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001093 jobs.addJob(Jobs.Command('lipo', cmd_args))