blob: 11a6047182a04e7bf3b4fd351381be93d3b3c479 [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
Daniel Dunbarde388a52009-01-21 01:07:49 +00006import Phases
Daniel Dunbara5677512009-01-05 19:53:30 +00007import Types
8
9class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +000010 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000011
12 eFlagsPipedInput = 1 << 0
13 eFlagsPipedOutput = 1 << 1
14 eFlagsIntegratedCPP = 1 << 2
15
16 def __init__(self, name, flags = 0):
17 self.name = name
18 self.flags = flags
19
20 def acceptsPipedInput(self):
21 return not not (self.flags & Tool.eFlagsPipedInput)
22 def canPipeOutput(self):
23 return not not (self.flags & Tool.eFlagsPipedOutput)
24 def hasIntegratedCPP(self):
25 return not not (self.flags & Tool.eFlagsIntegratedCPP)
26
27class GCC_Common_Tool(Tool):
Daniel Dunbar7c584962009-01-20 21:29:14 +000028 def getGCCExtraArgs(self):
29 return []
30
Daniel Dunbara5677512009-01-05 19:53:30 +000031 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +000032 output, outputType, arglist, linkingOutput):
Daniel Dunbar11672ec2009-01-13 18:51:26 +000033 cmd_args = []
34 for arg in arglist.args:
35 if arg.opt.forwardToGCC():
36 cmd_args.extend(arglist.render(arg))
37
Daniel Dunbar7c584962009-01-20 21:29:14 +000038 cmd_args.extend(self.getGCCExtraArgs())
Daniel Dunbara5677512009-01-05 19:53:30 +000039 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000040 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000041 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000042 cmd_args.extend(['-o', '-'])
Daniel Dunbarde388a52009-01-21 01:07:49 +000043 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbardb439902009-01-07 18:40:45 +000044 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000045 else:
Daniel Dunbarde388a52009-01-21 01:07:49 +000046 assert output
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000047 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000048
Daniel Dunbar7c584962009-01-20 21:29:14 +000049 if (isinstance(self, GCC_LinkTool) and
50 linkingOutput):
51 cmd_args.append('-Wl,-arch_multiple')
52 cmd_args.append('-Wl,-final_output,' +
53 arglist.getValue(linkingOutput))
54
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000055 # Only pass -x if gcc will understand it; otherwise hope gcc
56 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000057 # would go wrong in is for linker inputs if they happened to
58 # have an odd suffix; really the only way to get this to
59 # happen is a command like '-x foobar a.c' which will treat
60 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000061 #
62 # FIXME: For the linker case specifically, can we safely
63 # convert inputs into '-Wl,' options?
64 for input in inputs:
65 if input.type.canBeUserSpecified:
66 cmd_args.extend(['-x', input.type.name])
67
68 if isinstance(input.source, Jobs.PipedJob):
69 cmd_args.append('-')
70 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000071 assert isinstance(input.source, Arguments.Arg)
72 # If this is a linker input then assume we can forward
73 # just by rendering.
74 if input.source.opt.isLinkerInput:
75 cmd_args.extend(arglist.render(input.source))
76 else:
77 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000078
79 jobs.addJob(Jobs.Command('gcc', cmd_args))
80
81class GCC_PreprocessTool(GCC_Common_Tool):
82 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000083 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000084 (Tool.eFlagsPipedInput |
85 Tool.eFlagsPipedOutput))
86
Daniel Dunbar7c584962009-01-20 21:29:14 +000087 def getGCCExtraArgs(self):
88 return ['-E']
Daniel Dunbara5677512009-01-05 19:53:30 +000089
90class GCC_CompileTool(GCC_Common_Tool):
91 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000092 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000093 (Tool.eFlagsPipedInput |
94 Tool.eFlagsPipedOutput |
95 Tool.eFlagsIntegratedCPP))
96
Daniel Dunbar7c584962009-01-20 21:29:14 +000097 def getGCCExtraArgs(self):
98 return ['-S']
Daniel Dunbara5677512009-01-05 19:53:30 +000099
100class GCC_PrecompileTool(GCC_Common_Tool):
101 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000102 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +0000103 (Tool.eFlagsPipedInput |
104 Tool.eFlagsIntegratedCPP))
105
Daniel Dunbar7c584962009-01-20 21:29:14 +0000106 def getGCCExtraArgs(self):
107 return []
108
109class GCC_AssembleTool(GCC_Common_Tool):
110 def __init__(self):
111 # We can't generally assume the assembler can take or output
112 # on pipes.
113 super(GCC_AssembleTool, self).__init__('gcc (as)')
114
115 def getGCCExtraArgs(self):
116 return ['-c']
117
118class GCC_LinkTool(GCC_Common_Tool):
119 def __init__(self):
120 super(GCC_LinkTool, self).__init__('gcc (ld)')
Daniel Dunbara5677512009-01-05 19:53:30 +0000121
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000122class Darwin_AssembleTool(Tool):
123 def __init__(self, toolChain):
124 super(Darwin_AssembleTool, self).__init__('as',
125 Tool.eFlagsPipedInput)
126 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000127
128 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000129 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000130 assert len(inputs) == 1
131 assert outputType is Types.ObjectType
132
133 input = inputs[0]
134
135 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000136
Daniel Dunbar76290532009-01-13 06:25:31 +0000137 # Bit of a hack, this is only used for original inputs.
138 if input.isOriginalInput():
139 if arglist.getLastArg(arglist.parser.gGroup):
140 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000141
142 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000143 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000144 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000145 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000146 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
147 arglist.getLastArg(arglist.parser.staticOption) or
148 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000149 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000150 cmd_args.append('-static')
151
152 for arg in arglist.getArgs2(arglist.parser.WaOption,
153 arglist.parser.XassemblerOption):
154 cmd_args.extend(arglist.getValues(arg))
155
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000156 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000157 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000158 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000159 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000160 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000161
162 # asm_final spec is empty.
163
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000164 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
165 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000166
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000167class Clang_CompileTool(Tool):
Daniel Dunbarde388a52009-01-21 01:07:49 +0000168 def __init__(self, toolChain):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000169 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000170 (Tool.eFlagsPipedInput |
171 Tool.eFlagsPipedOutput |
172 Tool.eFlagsIntegratedCPP))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000173 self.toolChain = toolChain
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000174
175 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000176 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000177 cmd_args = []
178
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000179 patchOutputNameForPTH = False
Daniel Dunbarde388a52009-01-21 01:07:49 +0000180
181 if isinstance(phase.phase, Phases.AnalyzePhase):
182 cmd_args.append('-analyze')
183 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args.append('-fsyntax-only')
185 elif outputType is Types.AsmTypeNoPP:
186 cmd_args.append('-S')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000187 elif outputType is Types.PCHType:
188 # No special option needed, driven by -x. However, we
189 # patch the output name to try and not conflict with gcc.
190 patchOutputNameForPTH = True
191
192 # FIXME: This is a total hack. Copy the input header file
193 # to the output, so that it can be -include'd by clang.
194 assert len(inputs) == 1
195 assert not isinstance(output, Jobs.PipedJob)
196 assert not isinstance(inputs[0].source, Jobs.PipedJob)
197 inputPath = arglist.getValue(inputs[0].source)
198 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
199 os.path.basename(inputPath))
200 # Only do copy when the output doesn't exist.
201 if not os.path.exists(outputPath):
202 import shutil
203 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000204 else:
205 raise ValueError,"Unexpected output type for clang tool."
206
Daniel Dunbarde388a52009-01-21 01:07:49 +0000207 if isinstance(phase.phase, Phases.AnalyzePhase):
208 # Add default argument set.
209 #
210 # FIXME: Move into clang?
211 cmd_args.extend(['-warn-dead-stores',
212 '-checker-cfref',
213 '-warn-objc-methodsigs',
214 '-warn-objc-missing-dealloc',
215 '-warn-objc-unused-ivars'])
216
217 cmd_args.append('-analyzer-output-plist')
218
219 # Add -WA, arguments when running as analyzer.
220 for arg in arglist.getArgs(arglist.parser.WAOption):
221 cmd_args.extend(arglist.renderAsInput(arg))
222
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000223 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000224 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
225 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000226 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
227
228 # Special case debug options to only pass -g to clang. This is
229 # wrong.
230 if arglist.getLastArg(arglist.parser.gGroup):
231 cmd_args.append('-g')
232
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000233 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
234
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000235 # FIXME: Clang isn't going to accept just anything here.
236 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
237
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000238 # Automatically load .pth files which match -include options.
239 for arg in arglist.getArgs(arglist.parser.includeOption):
240 pthPath = arglist.getValue(arg) + '.pth'
241 if os.path.exists(pthPath):
242 cmd_args.append('-token-cache')
243 cmd_args.append(pthPath)
244
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000245 # FIXME: Dehardcode this.
246 cmd_args.append('-fblocks')
247
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000248 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
249 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
250 arglist.addLastArg(cmd_args, arglist.parser.wOption)
251 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
252
253 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
254 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
255 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
256 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
257 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
258 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
259 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
260 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
261 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
262 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
263 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
264
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000265 if arch is not None:
266 cmd_args.extend(arglist.render(arch))
267
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000268 if isinstance(output, Jobs.PipedJob):
269 cmd_args.extend(['-o', '-'])
270 else:
271 if patchOutputNameForPTH:
272 base,suffix = os.path.splitext(arglist.getValue(output))
273 if suffix == '.gch':
274 suffix = '.pth'
275 cmd_args.append('-o')
276 cmd_args.append(base + suffix)
Daniel Dunbarde388a52009-01-21 01:07:49 +0000277 elif output:
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000278 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000279
280 for input in inputs:
281 cmd_args.append('-x')
282 cmd_args.append(input.type.name)
283 if isinstance(input.source, Jobs.PipedJob):
284 cmd_args.append('-')
285 else:
286 cmd_args.extend(arglist.renderAsInput(input.source))
287
288 jobs.addJob(Jobs.Command('clang', cmd_args))
289
Daniel Dunbar06172d62009-01-20 00:47:24 +0000290class Darwin_X86_CC1Tool(Tool):
291 def getCC1Name(self, type):
292 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000293
Daniel Dunbar06172d62009-01-20 00:47:24 +0000294 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000295 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000296 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000297 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000298 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000299 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000300 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000301 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPTypeP:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000302 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000303 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000304 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000305 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000306 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000307 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000308 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000309 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000310 return 'cc1objplus',False,True
311 else:
312 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000313
314 def addCC1Args(self, cmd_args, arch, arglist):
315 # Derived from cc1 spec.
316
317 # FIXME: -fapple-kext seems to disable this too. Investigate.
318 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
319 not arglist.getLastArg(arglist.parser.staticOption) and
320 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
321 cmd_args.append('-fPIC')
322
323 # FIXME: Remove mthumb
324 # FIXME: Remove mno-thumb
325
326 # FIXME: As with ld, something else is going on. My best guess
327 # is gcc is faking an -mmacosx-version-min
328 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000329# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
330# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
331# cmd_args.append('-mmacosx-version-min=' +
332# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000333
334 # FIXME: Remove faltivec
335 # FIXME: Remove mno-fused-madd
336 # FIXME: Remove mlong-branch
337 # FIXME: Remove mlongcall
338 # FIXME: Remove mcpu=G4
339 # FIXME: Remove mcpu=G5
340
Daniel Dunbar105132e2009-01-16 21:07:21 +0000341 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000342 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
343 cmd_args.append('-feliminate-unused-debug-symbols')
344
Daniel Dunbar06172d62009-01-20 00:47:24 +0000345 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000346 # Derived from cc1_options spec.
347 if (arglist.getLastArg(arglist.parser.fastOption) or
348 arglist.getLastArg(arglist.parser.fastfOption) or
349 arglist.getLastArg(arglist.parser.fastcpOption)):
350 cmd_args.append('-O3')
351
352 if (arglist.getLastArg(arglist.parser.pgOption) and
353 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000354 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000355
Daniel Dunbardff9f502009-01-12 18:51:02 +0000356 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000357
358 if not arglist.getLastArg(arglist.parser.QOption):
359 cmd_args.append('-quiet')
360
361 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000362 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000363
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000364 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000365
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000366 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
367 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000368
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000369 # FIXME: The goal is to use the user provided -o if that is
370 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000371 # name. Find a clean way to go about this.
372 if (arglist.getLastArg(arglist.parser.cOption) or
373 arglist.getLastArg(arglist.parser.SOption)):
374 outputOpt = arglist.getLastArg(arglist.parser.oOption)
375 if outputOpt:
376 cmd_args.append('-auxbase-strip')
377 cmd_args.append(arglist.getValue(outputOpt))
378 else:
379 cmd_args.append('-auxbase')
380 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000381 else:
382 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000383 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000384
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000385 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000386
Daniel Dunbar816dd502009-01-12 17:53:19 +0000387 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
388 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000389 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000390 arglist.addLastArg(cmd_args, arglist.parser.wOption)
391 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
392 if arglist.getLastArg(arglist.parser.vOption):
393 cmd_args.append('-version')
394 if arglist.getLastArg(arglist.parser.pgOption):
395 cmd_args.append('-p')
396 arglist.addLastArg(cmd_args, arglist.parser.pOption)
397
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000398 # ccc treats -fsyntax-only specially.
399 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
400 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000401
Daniel Dunbar06172d62009-01-20 00:47:24 +0000402 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000403 if arglist.getLastArg(arglist.parser.QnOption):
404 cmd_args.append('-fno-ident')
405
406 # FIXME: This isn't correct.
407 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
408 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
409
Daniel Dunbar06172d62009-01-20 00:47:24 +0000410 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000411 cmd_args.extend(output_args)
412
Daniel Dunbar816dd502009-01-12 17:53:19 +0000413 # FIXME: Still don't get what is happening here. Investigate.
414 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
415
416 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
417 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
418 cmd_args.append('-fno-builtin')
419 cmd_args.append('-fno-merge-constants')
420
421 if arglist.getLastArg(arglist.parser.coverageOption):
422 cmd_args.append('-fprofile-arcs')
423 cmd_args.append('-ftest-coverage')
424
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000425 if isCXX:
426 cmd_args.append('-D__private_extern__=extern')
427
Daniel Dunbar06172d62009-01-20 00:47:24 +0000428 def getBaseInputName(self, inputs, arglist):
429 # FIXME: gcc uses a temporary name here when the base
430 # input is stdin, but only in auxbase. Investigate.
431 baseInputValue = arglist.getValue(inputs[0].baseInput)
432 return os.path.basename(baseInputValue)
433
434 def getBaseInputStem(self, inputs, arglist):
435 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
436
437 def getOutputArgs(self, arglist, output, isCPP=False):
438 if isinstance(output, Jobs.PipedJob):
439 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000440 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000441 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000442 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000443 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000444 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000445 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000446 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000447
448 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
449 output_args, isCXX):
450 # Derived from cpp_options.
451 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
452
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000453 cmd_args.extend(output_args)
454
Daniel Dunbar06172d62009-01-20 00:47:24 +0000455 self.addCC1Args(cmd_args, arch, arglist)
456
457 # NOTE: The code below has some commonality with cpp_options,
458 # but in classic gcc style ends up sending things in different
459 # orders. This may be a good merge candidate once we drop
460 # pedantic compatibility.
461
462 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
463 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
464 arglist.parser.ansiOption,
465 arglist.parser.trigraphsOption)
466 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
467 arglist.parser.pedanticGroup)
468 arglist.addLastArg(cmd_args, arglist.parser.wOption)
469
470 # ccc treats -fsyntax-only specially.
471 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
472 arglist.parser.syntaxOnlyOption)
473
474 if (arglist.getLastArg(arglist.parser.gGroup) and
475 not arglist.getLastArg(arglist.parser.g0Option) and
476 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
477 cmd_args.append('-fworking-directory')
478
479 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
480 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
481 if arglist.getLastArg(arglist.parser.saveTempsOption):
482 cmd_args.append('-fpch-preprocess')
483
484 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
485 # Derived from cpp_unique_options.
486
487 if (arglist.getLastArg(arglist.parser.COption) or
488 arglist.getLastArg(arglist.parser.CCOption)):
489 if not arglist.getLastArg(arglist.parser.EOption):
490 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
491 if not arglist.getLastArg(arglist.parser.QOption):
492 cmd_args.append('-quiet')
493 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
494 arglist.addLastArg(cmd_args, arglist.parser.vOption)
495 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
496 arglist.addLastArg(cmd_args, arglist.parser.POption)
497
498 # FIXME: Handle %I properly.
499 if arglist.getValue(arch) == 'x86_64':
500 cmd_args.append('-imultilib')
501 cmd_args.append('x86_64')
502
503 if arglist.getLastArg(arglist.parser.MDOption):
504 cmd_args.append('-MD')
505 # FIXME: Think about this more.
506 outputOpt = arglist.getLastArg(arglist.parser.oOption)
507 if outputOpt:
508 base,ext = os.path.splitext(arglist.getValue(outputOpt))
509 cmd_args.append(base+'.d')
510 else:
511 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
512 if arglist.getLastArg(arglist.parser.MMDOption):
513 cmd_args.append('-MMD')
514 # FIXME: Think about this more.
515 outputOpt = arglist.getLastArg(arglist.parser.oOption)
516 if outputOpt:
517 base,ext = os.path.splitext(arglist.getValue(outputOpt))
518 cmd_args.append(base+'.d')
519 else:
520 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
521 arglist.addLastArg(cmd_args, arglist.parser.MOption)
522 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
523 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
524 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
525 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
526 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
527 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
528 if (not arglist.getLastArg(arglist.parser.MOption) and
529 not arglist.getLastArg(arglist.parser.MMOption) and
530 (arglist.getLastArg(arglist.parser.MDOption) or
531 arglist.getLastArg(arglist.parser.MMDOption))):
532 outputOpt = arglist.getLastArg(arglist.parser.oOption)
533 if outputOpt:
534 cmd_args.append('-MQ')
535 cmd_args.append(arglist.getValue(outputOpt))
536
537 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
538 if arglist.getLastArg(arglist.parser.g3Option):
539 cmd_args.append('-dD')
540 arglist.addLastArg(cmd_args, arglist.parser.HOption)
541
542 self.addCPPArgs(cmd_args, arch, arglist)
543
544 arglist.addAllArgs3(cmd_args,
545 arglist.parser.DOption,
546 arglist.parser.UOption,
547 arglist.parser.AOption)
548
549 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
550
551 for input in inputs:
552 if isinstance(input.source, Jobs.PipedJob):
553 cmd_args.append('-')
554 else:
555 cmd_args.extend(arglist.renderAsInput(input.source))
556
557 for arg in arglist.getArgs2(arglist.parser.WpOption,
558 arglist.parser.XpreprocessorOption):
559 cmd_args.extend(arglist.getValues(arg))
560
561 if arglist.getLastArg(arglist.parser.f_mudflapOption):
562 cmd_args.append('-D_MUDFLAP')
563 cmd_args.append('-include')
564 cmd_args.append('mf-runtime.h')
565
566 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
567 cmd_args.append('-D_MUDFLAP')
568 cmd_args.append('-D_MUDFLAPTH')
569 cmd_args.append('-include')
570 cmd_args.append('mf-runtime.h')
571
572 def addCPPArgs(self, cmd_args, arch, arglist):
573 # Derived from cpp spec.
574
575 if arglist.getLastArg(arglist.parser.staticOption):
576 # The gcc spec is broken here, it refers to dynamic but
577 # that has been translated. Start by being bug compatible.
578
579 # if not arglist.getLastArg(arglist.parser.dynamicOption):
580 cmd_args.append('-D__STATIC__')
581 else:
582 cmd_args.append('-D__DYNAMIC__')
583
584 if arglist.getLastArg(arglist.parser.pthreadOption):
585 cmd_args.append('-D_REENTRANT')
586
587class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
588 def __init__(self, toolChain):
589 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
590 (Tool.eFlagsPipedInput |
591 Tool.eFlagsPipedOutput))
592 self.toolChain = toolChain
593
594 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000595 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000596 inputType = inputs[0].type
597 assert not [i for i in inputs if i.type != inputType]
598
599 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
600
601 cmd_args = ['-E']
602 if (arglist.getLastArg(arglist.parser.traditionalOption) or
603 arglist.getLastArg(arglist.parser.f_traditionalOption) or
604 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
605 cmd_args.append('-traditional-cpp')
606
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000607 output_args = self.getOutputArgs(arglist, output,
608 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000609 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000610 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000611
612 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
613
614 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
615 cmd_args))
616
617class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
618 def __init__(self, toolChain):
619 super(Darwin_X86_CompileTool, self).__init__('cc1',
620 (Tool.eFlagsPipedInput |
621 Tool.eFlagsPipedOutput |
622 Tool.eFlagsIntegratedCPP))
623 self.toolChain = toolChain
624
625 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000626 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000627 inputType = inputs[0].type
628 assert not [i for i in inputs if i.type != inputType]
629
630 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
631
632 cmd_args = []
633 if (arglist.getLastArg(arglist.parser.traditionalOption) or
634 arglist.getLastArg(arglist.parser.f_traditionalOption)):
635 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
636
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000637 if outputType is Types.PCHType:
638 output_args = []
639 else:
640 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000641
642 # There is no need for this level of compatibility, but it
643 # makes diffing easier.
644 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
645 not arglist.getLastArg(arglist.parser.SOption)):
646 early_output_args, end_output_args = [], output_args
647 else:
648 early_output_args, end_output_args = output_args, []
649
Daniel Dunbar06172d62009-01-20 00:47:24 +0000650 if usePP:
651 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
652 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
653 early_output_args, isCXX)
654 cmd_args.extend(end_output_args)
655 else:
656 cmd_args.append('-fpreprocessed')
657
658 # FIXME: There is a spec command to remove
659 # -fpredictive-compilation args here. Investigate.
660
661 for input in inputs:
662 if isinstance(input.source, Jobs.PipedJob):
663 cmd_args.append('-')
664 else:
665 cmd_args.extend(arglist.renderAsInput(input.source))
666
667 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
668 early_output_args, isCXX)
669 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000670
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000671 if outputType is Types.PCHType:
672 assert output is not None and not isinstance(output, Jobs.PipedJob)
673
674 cmd_args.append('-o')
675 # NOTE: gcc uses a temp .s file for this, but there
676 # doesn't seem to be a good reason.
677 cmd_args.append('/dev/null')
678
679 cmd_args.append('--output-pch=')
680 cmd_args.append(arglist.getValue(output))
681
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000682 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
683 cmd_args))
684
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000685class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000686 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000687 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000688 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000689
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000690 def getMacosxVersionTuple(self, arglist):
691 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
692 if arg:
693 version = arglist.getValue(arg)
694 components = version.split('.')
695 try:
696 return tuple(map(int, components))
697 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000698 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000699 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000700 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000701 return (10, major-4, minor)
702
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000703 def addDarwinArch(self, cmd_args, arch, arglist):
704 # Derived from darwin_arch spec.
705 cmd_args.append('-arch')
706 # FIXME: The actual spec uses -m64 for this, but we want to
707 # respect arch. Figure out what exactly gcc is doing.
708 #if arglist.getLastArg(arglist.parser.m_64Option):
709 if arglist.getValue(arch) == 'x86_64':
710 cmd_args.append('x86_64')
711 else:
712 cmd_args.append('i386')
713
714 def addDarwinSubArch(self, cmd_args, arch, arglist):
715 # Derived from darwin_subarch spec, not sure what the
716 # distinction exists for but at least for this chain it is the same.
717 return self.addDarwinArch(cmd_args, arch, arglist)
718
719 def addLinkArgs(self, cmd_args, arch, arglist):
720 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000721 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
722 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000723 cmd_args.append('-dynamic')
724 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
725 # FIXME: Replace -lobjc in forward args with
726 # -lobjc-gnu. How do we wish to handle such things?
727 pass
728
Daniel Dunbar470104e2009-01-17 00:53:19 +0000729 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
730 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000731 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000732 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000733 else:
734 self.addDarwinSubArch(cmd_args, arch, arglist)
735
Daniel Dunbar470104e2009-01-17 00:53:19 +0000736 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000737 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000738 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000739 '-bundle_loader')
740 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
741 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
742 # FIXME: Where should diagnostics go?
743 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
744 sys.exit(1)
745 if arglist.getLastArg(arglist.parser.current_versionOption):
746 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
747 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000748 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000749 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000750 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000751 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
752 sys.exit(1)
753 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
754 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
755 else:
756 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000757 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000758 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
759 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000760 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000761 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
762 sys.exit(1)
763 if arglist.getLastArg(arglist.parser.client_nameOption):
764 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
765 sys.exit(1)
766 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
767 '-dylib_compatibility_version')
768 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
769 '-dylib_current_version')
770
Daniel Dunbar470104e2009-01-17 00:53:19 +0000771 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000772 self.addDarwinArch(cmd_args, arch, arglist)
773 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
774 else:
775 self.addDarwinSubArch(cmd_args, arch, arglist)
776
Daniel Dunbar470104e2009-01-17 00:53:19 +0000777 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000778 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
779 sys.exit(1)
780
Daniel Dunbar470104e2009-01-17 00:53:19 +0000781 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000782 '-dylib_install_name')
783
784 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
785 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
786 sys.exit(1)
787 if arglist.getLastArg(arglist.parser.private_bundleOption):
788 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
789 sys.exit(1)
790
Daniel Dunbar470104e2009-01-17 00:53:19 +0000791 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792 cmd_args.append('-all_load')
793
Daniel Dunbar470104e2009-01-17 00:53:19 +0000794 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000795 '-allowable_client')
796
Daniel Dunbar470104e2009-01-17 00:53:19 +0000797 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000798 cmd_args.append('-bind_at_load')
799
Daniel Dunbar470104e2009-01-17 00:53:19 +0000800 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000801 cmd_args.append('-dead_strip')
802
Daniel Dunbar470104e2009-01-17 00:53:19 +0000803 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000804 cmd_args.append('-no_dead_strip_inits_and_terms')
805
Daniel Dunbar470104e2009-01-17 00:53:19 +0000806 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000807 '-dylib_file')
808
Daniel Dunbar470104e2009-01-17 00:53:19 +0000809 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000810 cmd_args.append('-dynamic')
811
Daniel Dunbar470104e2009-01-17 00:53:19 +0000812 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000813 '-exported_symbols_list')
814
Daniel Dunbar470104e2009-01-17 00:53:19 +0000815 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000816 cmd_args.append('-flat_namespace')
817
818 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000819 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000820 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000821 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000822 '-init')
823
824 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
825 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
826 # FIXME: I don't understand what is going on
827 # here. This is supposed to come from
828 # darwin_ld_minversion, but gcc doesn't seem to be
829 # following that; it must be getting over-ridden
830 # somewhere.
831 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000832 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000833 else:
834 # addAll doesn't make sense here but this is what gcc
835 # does.
836 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
837 '-macosx_version_min')
838
839 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
840 '-iphoneos_version_min')
841 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
842
Daniel Dunbar470104e2009-01-17 00:53:19 +0000843 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000844 cmd_args.append('-multi_module')
845
Daniel Dunbar470104e2009-01-17 00:53:19 +0000846 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000847 cmd_args.append('-single_module')
848
Daniel Dunbar470104e2009-01-17 00:53:19 +0000849 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000850 '-multiply_defined')
851
Daniel Dunbar470104e2009-01-17 00:53:19 +0000852 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000853 '-multiply_defined_unused')
854
855 if arglist.getLastArg(arglist.parser.f_pieOption):
856 cmd_args.append('-pie')
857
858 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
859 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
860 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
861 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
862 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
863 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
864 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
865 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
866 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000867 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000868 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000869 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000870 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000871 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000872 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000873 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000874 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000875 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
876 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000877 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
878 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
879 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
880 '-syslibroot')
881 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
882 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000883 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000884 '-umbrella')
885 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000886 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000887 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000888 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000889 '-weak_reference_mismatches')
890
Daniel Dunbar470104e2009-01-17 00:53:19 +0000891 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000892 cmd_args.append('-weak_reference_mismatches')
893 cmd_args.append('non-weak')
894
895 arglist.addLastArg(cmd_args, arglist.parser.XOption)
896 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
897 arglist.addLastArg(cmd_args, arglist.parser.wOption)
898 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
899 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
900 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
901 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
902 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
903 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
904 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
905 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
906 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
907 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
908 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
909 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000910
911 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000912 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000913 assert outputType is Types.ImageType
914
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000915 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000916 # comes from specs (starting with link_command). Consult gcc
917 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000918
919 # FIXME: gcc's spec controls when this is done; certain things
920 # like -filelist or -Wl, still trigger a link stage. I don't
921 # quite understand how gcc decides to execute the linker,
922 # investigate. Also, the spec references -fdump= which seems
923 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000924 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000925
926 # Not sure why this particular decomposition exists in gcc.
927 self.addLinkArgs(cmd_args, arch, arglist)
928
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000929 # This toolchain never accumlates options in specs, the only
930 # place this gets used is to add -ObjC.
931 if (arglist.getLastArg(arglist.parser.ObjCOption) or
932 arglist.getLastArg(arglist.parser.f_objcOption)):
933 cmd_args.append('-ObjC')
934 if arglist.getLastArg(arglist.parser.ObjCXXOption):
935 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000936
937 # FIXME: gcc has %{x} in here. How could this ever happen?
938 # Cruft?
939 arglist.addLastArg(cmd_args, arglist.parser.dOption)
940 arglist.addLastArg(cmd_args, arglist.parser.tOption)
941 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000942 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000943 arglist.addLastArg(cmd_args, arglist.parser.AOption)
944 arglist.addLastArg(cmd_args, arglist.parser.eOption)
945 arglist.addLastArg(cmd_args, arglist.parser.mOption)
946 arglist.addLastArg(cmd_args, arglist.parser.rOption)
947
948 cmd_args.extend(arglist.render(output))
949
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000950 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000951 if (not arglist.getLastArg(arglist.parser.AOption) and
952 not arglist.getLastArg(arglist.parser.nostdlibOption) and
953 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
954 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +0000955 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000956 # Derived from darwin_dylib1 spec.
957 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
958 cmd_args.append('-ldylib1.o')
959 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000960 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000961 cmd_args.append('-ldylib1.o')
962 else:
963 cmd_args.append('-ldylib1.10.5.o')
964 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +0000965 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000966 if not arglist.getLastArg(arglist.parser.staticOption):
967 cmd_args.append('-lbundle1.o')
968 else:
969 if arglist.getLastArg(arglist.parser.pgOption):
970 if arglist.getLastArg(arglist.parser.staticOption):
971 cmd_args.append('-lgcrt0.o')
972 else:
973 if arglist.getLastArg(arglist.parser.objectOption):
974 cmd_args.append('-lgcrt0.o')
975 else:
976 if arglist.getLastArg(arglist.parser.preloadOption):
977 cmd_args.append('-lgcrt0.o')
978 else:
979 cmd_args.append('-lgcrt1.o')
980
981 # darwin_crt2 spec is empty.
982 pass
983 else:
984 if arglist.getLastArg(arglist.parser.staticOption):
985 cmd_args.append('-lcrt0.o')
986 else:
987 if arglist.getLastArg(arglist.parser.objectOption):
988 cmd_args.append('-lcrt0.o')
989 else:
990 if arglist.getLastArg(arglist.parser.preloadOption):
991 cmd_args.append('-lcrt0.o')
992 else:
993 # Derived from darwin_crt1 spec.
994 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
995 cmd_args.append('-lcrt1.o')
996 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000997 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000998 cmd_args.append('-lcrt1.o')
999 else:
1000 cmd_args.append('-lcrt1.10.5.o')
1001
1002 # darwin_crt2 spec is empty.
1003 pass
1004
1005 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1006 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001007 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001008 # FIXME: gcc does a library search for this
1009 # file, this will be be broken currently.
1010 cmd_args.append('crt3.o')
1011
1012 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1013
1014 if arglist.getLastArg(arglist.parser.f_openmpOption):
1015 # This is more complicated in gcc...
1016 cmd_args.append('-lgomp')
1017
1018 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001019 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001020 if arglist.getValue(arch) == 'x86_64':
1021 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1022 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1023 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1024 "-L/usr/lib/gcc/%s" % tcDir,
1025 "-L/usr/lib/gcc/%s" % tcDir,
1026 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1027 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001028
Daniel Dunbara5677512009-01-05 19:53:30 +00001029 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001030 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001031
Daniel Dunbar7c584962009-01-20 21:29:14 +00001032 if linkingOutput:
1033 cmd_args.append('-arch_multiple')
1034 cmd_args.append('-final_output')
1035 cmd_args.append(arglist.getValue(linkingOutput))
1036
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001037 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1038 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1039 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1040 arglist.getLastArg(arglist.parser.coverageOption)):
1041 cmd_args.append('-lgcov')
1042
1043 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1044 cmd_args.append('-allow_stack_execute')
1045
1046 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1047 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1048 # link_ssp spec is empty.
1049
1050 # Derived from libgcc spec.
1051 if arglist.getLastArg(arglist.parser.staticOption):
1052 cmd_args.append('-lgcc_static')
1053 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1054 cmd_args.append('-lgcc_eh')
1055 cmd_args.append('-lgcc')
1056 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1057 # Derived from darwin_iphoneos_libgcc spec.
1058 cmd_args.append('-lgcc_s.10.5')
1059 cmd_args.append('-lgcc')
1060 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1061 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1062 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001063 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001064 cmd_args.append('-lgcc_s.10.4')
1065 else:
1066 cmd_args.append('-lgcc_s.10.5')
1067 cmd_args.append('-lgcc')
1068 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001069 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001070 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001071 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001072 cmd_args.append('-lgcc_s.10.5')
1073 cmd_args.append('-lgcc')
1074
1075 # Derived from lib spec.
1076 if not arglist.getLastArg(arglist.parser.staticOption):
1077 cmd_args.append('-lSystem')
1078
1079 if (not arglist.getLastArg(arglist.parser.AOption) and
1080 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1081 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1082 # endfile_spec is empty.
1083 pass
1084
1085 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1086 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1087
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001088 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1089 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001090
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001091 if (arglist.getLastArg(arglist.parser.gGroup) and
1092 not arglist.getLastArg(arglist.parser.gstabsOption) and
1093 not arglist.getLastArg(arglist.parser.g0Option)):
1094 # FIXME: This is gross, but matches gcc. The test only
1095 # considers the suffix (not the -x type), and then only of the
1096 # first input.
1097 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1098 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1099 '.c++','.cxx','.CPP','.m','.mm'):
1100 jobs.addJob(Jobs.Command('dsymutil',
1101 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001102
Daniel Dunbara5677512009-01-05 19:53:30 +00001103class LipoTool(Tool):
1104 def __init__(self):
1105 super(LipoTool, self).__init__('lipo')
1106
1107 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001108 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001109 assert outputType is Types.ImageType
1110
Daniel Dunbardb439902009-01-07 18:40:45 +00001111 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001112 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001113 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001114 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001115 jobs.addJob(Jobs.Command('lipo', cmd_args))