blob: f08f1c7c40878ebd9d962451221e6c28b11f9fce [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):
Daniel Dunbar48d0d612009-02-17 18:10:15 +0000111 # Assume that gcc will do any magic necessary to let the
112 # assembler take piped input.
113 super(GCC_AssembleTool, self).__init__('gcc (as)',
114 Tool.eFlagsPipedInput)
Daniel Dunbar7c584962009-01-20 21:29:14 +0000115
116 def getGCCExtraArgs(self):
117 return ['-c']
118
119class GCC_LinkTool(GCC_Common_Tool):
120 def __init__(self):
121 super(GCC_LinkTool, self).__init__('gcc (ld)')
Daniel Dunbara5677512009-01-05 19:53:30 +0000122
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000123class Darwin_AssembleTool(Tool):
124 def __init__(self, toolChain):
125 super(Darwin_AssembleTool, self).__init__('as',
126 Tool.eFlagsPipedInput)
127 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000128
129 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000130 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000131 assert len(inputs) == 1
132 assert outputType is Types.ObjectType
133
134 input = inputs[0]
135
136 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000137
Daniel Dunbar76290532009-01-13 06:25:31 +0000138 # Bit of a hack, this is only used for original inputs.
139 if input.isOriginalInput():
140 if arglist.getLastArg(arglist.parser.gGroup):
141 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000142
143 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000144 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000145 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000146 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000147 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
148 arglist.getLastArg(arglist.parser.staticOption) or
149 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000150 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000151 cmd_args.append('-static')
152
153 for arg in arglist.getArgs2(arglist.parser.WaOption,
154 arglist.parser.XassemblerOption):
155 cmd_args.extend(arglist.getValues(arg))
156
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000157 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000158 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000159 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000160 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000161 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000162
163 # asm_final spec is empty.
164
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000165 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
166 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000167
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000168class Clang_CompileTool(Tool):
Daniel Dunbarde388a52009-01-21 01:07:49 +0000169 def __init__(self, toolChain):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000170 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000171 (Tool.eFlagsPipedInput |
172 Tool.eFlagsPipedOutput |
173 Tool.eFlagsIntegratedCPP))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000174 self.toolChain = toolChain
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000175
176 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000177 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000178 cmd_args = []
179
Daniel Dunbarde388a52009-01-21 01:07:49 +0000180 if isinstance(phase.phase, Phases.AnalyzePhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000181 assert outputType is Types.PlistType
Daniel Dunbarde388a52009-01-21 01:07:49 +0000182 cmd_args.append('-analyze')
183 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000184 assert outputType is Types.NothingType
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000185 cmd_args.append('-fsyntax-only')
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000186 elif outputType is Types.LLVMAsmType:
187 cmd_args.append('-emit-llvm')
188 elif outputType is Types.LLVMBCType:
189 cmd_args.append('-emit-llvm-bc')
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000190 elif outputType is Types.AsmTypeNoPP:
191 cmd_args.append('-S')
Daniel Dunbar350b5d42009-01-29 23:54:06 +0000192 elif (inputs[0].type.preprocess and
193 outputType is inputs[0].type.preprocess):
194 cmd_args.append('-E')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000195 elif outputType is Types.PCHType:
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000196 # No special option needed, driven by -x.
197 #
198 # FIXME: Don't drive this by -x, that is gross.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000199
200 # FIXME: This is a total hack. Copy the input header file
201 # to the output, so that it can be -include'd by clang.
202 assert len(inputs) == 1
203 assert not isinstance(output, Jobs.PipedJob)
204 assert not isinstance(inputs[0].source, Jobs.PipedJob)
205 inputPath = arglist.getValue(inputs[0].source)
206 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
207 os.path.basename(inputPath))
208 # Only do copy when the output doesn't exist.
209 if not os.path.exists(outputPath):
210 import shutil
211 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000212 else:
213 raise ValueError,"Unexpected output type for clang tool."
214
Daniel Dunbar87a7b282009-02-17 18:07:00 +0000215 # The make clang go fast button.
216 cmd_args.append('-disable-free')
217
Daniel Dunbarde388a52009-01-21 01:07:49 +0000218 if isinstance(phase.phase, Phases.AnalyzePhase):
219 # Add default argument set.
220 #
221 # FIXME: Move into clang?
222 cmd_args.extend(['-warn-dead-stores',
223 '-checker-cfref',
224 '-warn-objc-methodsigs',
225 '-warn-objc-missing-dealloc',
226 '-warn-objc-unused-ivars'])
227
Ted Kremenekbe1fe1e2009-02-17 04:27:41 +0000228 cmd_args.append('-analyzer-output=plist')
Daniel Dunbarde388a52009-01-21 01:07:49 +0000229
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000230 # Add -Xanalyzer arguments when running as analyzer.
231 for arg in arglist.getArgs(arglist.parser.XanalyzerOption):
232 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000233 else:
234 # Perform argument translation for LLVM backend. This
Daniel Dunbar6262cc42009-01-27 20:42:58 +0000235 # takes some care in reconciling with llvm-gcc. The
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000236 # issue is that llvm-gcc translates these options based on
237 # the values in cc1, whereas we are processing based on
238 # the driver arguments.
239 #
240 # FIXME: This is currently broken for -f flags when -fno
241 # variants are present.
242
243 # This comes from the default translation the driver + cc1
244 # would do to enable flag_pic.
245 #
246 # FIXME: Centralize this code.
247 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
248 arglist.getLastArg(arglist.parser.f_picOption) or
249 arglist.getLastArg(arglist.parser.f_PIEOption) or
250 arglist.getLastArg(arglist.parser.f_pieOption) or
251 (not arglist.getLastArg(arglist.parser.m_kernelOption) and
252 not arglist.getLastArg(arglist.parser.staticOption) and
253 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)))
254
Daniel Dunbar2d43e3b2009-01-29 06:12:22 +0000255 # FIXME: This needs to tie into a platform hook.
256 if arch:
257 archName = arglist.getValue(arch)
258 if (archName == 'x86_64' or
259 picEnabled):
260 cmd_args.append('--relocation-model=pic')
261 elif not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
262 cmd_args.append('--relocation-model=static')
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000263
264 if arglist.getLastArg(arglist.parser.f_timeReportOption):
265 cmd_args.append('--time-passes')
266 # FIXME: Set --enable-unsafe-fp-math.
267 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
268 cmd_args.append('--disable-fp-elim')
269 if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption):
270 cmd_args.append('--nozero-initialized-in-bss')
271 if arglist.getLastArg(arglist.parser.dAOption):
272 cmd_args.append('--asm-verbose')
273 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
274 cmd_args.append('--debug-pass=Structure')
275 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
276 cmd_args.append('--debug-pass=Arguments')
277 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
278 if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
279 cmd_args.append('--unwind-tables')
280
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000281 if arglist.hasFFlag(arglist.parser.f_mathErrnoOption,
282 arglist.parser.f_noMathErrnoOption,
283 self.toolChain.isMathErrnoDefault()):
284 cmd_args.append('--fmath-errno=1')
285 else:
286 cmd_args.append('--fmath-errno=0')
287
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000288 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
289 if arg:
290 cmd_args.append('--limit-float-precision')
291 cmd_args.append(arglist.getValue(arg))
292
293 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbarde388a52009-01-21 01:07:49 +0000294
Daniel Dunbard563e522009-02-17 19:02:12 +0000295 arglist.addLastArg(cmd_args, arglist.parser.MDOption)
296 arglist.addLastArg(cmd_args, arglist.parser.MMDOption)
297 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
298 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
299 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
300
301 unsupported = (arglist.getLastArg(arglist.parser.MOption) or
302 arglist.getLastArg(arglist.parser.MMOption) or
303 arglist.getLastArg(arglist.parser.MGOption) or
304 arglist.getLastArg(arglist.parser.MQOption))
305 if unsupported:
306 raise NotImplementedError('clang support for "%s"' % unsupported.opt.name)
307
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000308 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000309 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000310 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar41577f12009-02-15 05:59:37 +0000311 arglist.addLastArg(cmd_args, arglist.parser.POption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000312 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
313
314 # Special case debug options to only pass -g to clang. This is
315 # wrong.
316 if arglist.getLastArg(arglist.parser.gGroup):
317 cmd_args.append('-g')
318
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000319 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
320
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000321 # FIXME: Clang isn't going to accept just anything here.
322 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
323
Daniel Dunbarf0846632009-02-19 22:01:23 +0000324 # Automatically load .pth or .gch files which match -include
325 # options. It's wonky, but we include looking for .gch so we
326 # can support seamless replacement into a build system already
327 # set up to be generating .gch files.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000328 for arg in arglist.getArgs(arglist.parser.includeOption):
Daniel Dunbarf0846632009-02-19 22:01:23 +0000329 for suffix in ('.pth','.gch'):
330 pthPath = arglist.getValue(arg) + suffix
331 if os.path.exists(pthPath):
332 cmd_args.append('-token-cache')
333 cmd_args.append(pthPath)
334 break
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000335
Mike Stumpb55cc632009-01-30 08:22:07 +0000336 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000337
Daniel Dunbarc1212a32009-02-05 02:43:38 +0000338 # Manually translate -O to -O1; let clang reject others.
339 arg = arglist.getLastArg(arglist.parser.OOption)
340 if arg:
341 if arglist.getValue(arg) == '':
342 cmd_args.append('-O1')
343 else:
344 cmd_args.extend(arglist.render(arg))
345
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000346 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
347 arglist.addLastArg(cmd_args, arglist.parser.wOption)
348 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
349
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000350 arglist.addAllArgs(cmd_args, arglist.parser.Clang_fGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000351
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000352 arglist.addLastArg(cmd_args, arglist.parser.dMOption)
353
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000354 for arg in arglist.getArgs(arglist.parser.XclangOption):
355 cmd_args.extend(arglist.getValues(arg))
356
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000357 if arch is not None:
358 cmd_args.extend(arglist.render(arch))
359
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000360 if isinstance(output, Jobs.PipedJob):
361 cmd_args.extend(['-o', '-'])
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000362 elif output:
363 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000364
365 for input in inputs:
366 cmd_args.append('-x')
367 cmd_args.append(input.type.name)
368 if isinstance(input.source, Jobs.PipedJob):
369 cmd_args.append('-')
370 else:
371 cmd_args.extend(arglist.renderAsInput(input.source))
372
Daniel Dunbar768be1c2009-01-21 02:03:52 +0000373 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
374 cmd_args))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000375
Daniel Dunbar06172d62009-01-20 00:47:24 +0000376class Darwin_X86_CC1Tool(Tool):
377 def getCC1Name(self, type):
378 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000379
Daniel Dunbar06172d62009-01-20 00:47:24 +0000380 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000381 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000382 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000383 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000384 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000385 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000386 return 'cc1obj',True,False
Daniel Dunbar2910dfa2009-01-23 00:04:43 +0000387 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000388 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000389 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000390 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000391 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000392 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000393 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000394 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000395 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000396 return 'cc1objplus',False,True
397 else:
398 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000399
400 def addCC1Args(self, cmd_args, arch, arglist):
401 # Derived from cc1 spec.
402
403 # FIXME: -fapple-kext seems to disable this too. Investigate.
404 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
405 not arglist.getLastArg(arglist.parser.staticOption) and
406 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
407 cmd_args.append('-fPIC')
408
409 # FIXME: Remove mthumb
410 # FIXME: Remove mno-thumb
411
412 # FIXME: As with ld, something else is going on. My best guess
413 # is gcc is faking an -mmacosx-version-min
414 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000415# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
416# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
417# cmd_args.append('-mmacosx-version-min=' +
418# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000419
420 # FIXME: Remove faltivec
421 # FIXME: Remove mno-fused-madd
422 # FIXME: Remove mlong-branch
423 # FIXME: Remove mlongcall
424 # FIXME: Remove mcpu=G4
425 # FIXME: Remove mcpu=G5
426
Daniel Dunbar105132e2009-01-16 21:07:21 +0000427 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000428 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
429 cmd_args.append('-feliminate-unused-debug-symbols')
430
Daniel Dunbar06172d62009-01-20 00:47:24 +0000431 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000432 # Derived from cc1_options spec.
433 if (arglist.getLastArg(arglist.parser.fastOption) or
434 arglist.getLastArg(arglist.parser.fastfOption) or
435 arglist.getLastArg(arglist.parser.fastcpOption)):
436 cmd_args.append('-O3')
437
438 if (arglist.getLastArg(arglist.parser.pgOption) and
439 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000440 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000441
Daniel Dunbardff9f502009-01-12 18:51:02 +0000442 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000443
444 if not arglist.getLastArg(arglist.parser.QOption):
445 cmd_args.append('-quiet')
446
447 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000448 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000449
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000450 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000451
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000452 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
453 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000454
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000455 # FIXME: The goal is to use the user provided -o if that is
456 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000457 # name. Find a clean way to go about this.
458 if (arglist.getLastArg(arglist.parser.cOption) or
459 arglist.getLastArg(arglist.parser.SOption)):
460 outputOpt = arglist.getLastArg(arglist.parser.oOption)
461 if outputOpt:
462 cmd_args.append('-auxbase-strip')
463 cmd_args.append(arglist.getValue(outputOpt))
464 else:
465 cmd_args.append('-auxbase')
466 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000467 else:
468 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000469 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000470
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000471 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000472
Daniel Dunbar816dd502009-01-12 17:53:19 +0000473 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
474 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000475 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000476 arglist.addLastArg(cmd_args, arglist.parser.wOption)
477 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
478 if arglist.getLastArg(arglist.parser.vOption):
479 cmd_args.append('-version')
480 if arglist.getLastArg(arglist.parser.pgOption):
481 cmd_args.append('-p')
482 arglist.addLastArg(cmd_args, arglist.parser.pOption)
483
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000484 # ccc treats -fsyntax-only specially.
485 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
486 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000487 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000488
Daniel Dunbar06172d62009-01-20 00:47:24 +0000489 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000490 if arglist.getLastArg(arglist.parser.QnOption):
491 cmd_args.append('-fno-ident')
492
493 # FIXME: This isn't correct.
494 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
495 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
496
Daniel Dunbar06172d62009-01-20 00:47:24 +0000497 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000498 cmd_args.extend(output_args)
499
Daniel Dunbar816dd502009-01-12 17:53:19 +0000500 # FIXME: Still don't get what is happening here. Investigate.
501 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
502
503 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
504 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
505 cmd_args.append('-fno-builtin')
506 cmd_args.append('-fno-merge-constants')
507
508 if arglist.getLastArg(arglist.parser.coverageOption):
509 cmd_args.append('-fprofile-arcs')
510 cmd_args.append('-ftest-coverage')
511
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000512 if isCXX:
513 cmd_args.append('-D__private_extern__=extern')
514
Daniel Dunbar06172d62009-01-20 00:47:24 +0000515 def getBaseInputName(self, inputs, arglist):
516 # FIXME: gcc uses a temporary name here when the base
517 # input is stdin, but only in auxbase. Investigate.
518 baseInputValue = arglist.getValue(inputs[0].baseInput)
519 return os.path.basename(baseInputValue)
520
521 def getBaseInputStem(self, inputs, arglist):
522 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
523
524 def getOutputArgs(self, arglist, output, isCPP=False):
525 if isinstance(output, Jobs.PipedJob):
526 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000527 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000528 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000529 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000530 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000531 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000532 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000533 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000534
535 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
536 output_args, isCXX):
537 # Derived from cpp_options.
538 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
539
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000540 cmd_args.extend(output_args)
541
Daniel Dunbar06172d62009-01-20 00:47:24 +0000542 self.addCC1Args(cmd_args, arch, arglist)
543
544 # NOTE: The code below has some commonality with cpp_options,
545 # but in classic gcc style ends up sending things in different
546 # orders. This may be a good merge candidate once we drop
547 # pedantic compatibility.
548
549 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
550 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
551 arglist.parser.ansiOption,
552 arglist.parser.trigraphsOption)
553 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
554 arglist.parser.pedanticGroup)
555 arglist.addLastArg(cmd_args, arglist.parser.wOption)
556
557 # ccc treats -fsyntax-only specially.
558 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
559 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000560 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000561
562 if (arglist.getLastArg(arglist.parser.gGroup) and
563 not arglist.getLastArg(arglist.parser.g0Option) and
564 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
565 cmd_args.append('-fworking-directory')
566
567 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
568 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
569 if arglist.getLastArg(arglist.parser.saveTempsOption):
570 cmd_args.append('-fpch-preprocess')
571
572 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
573 # Derived from cpp_unique_options.
574
575 if (arglist.getLastArg(arglist.parser.COption) or
576 arglist.getLastArg(arglist.parser.CCOption)):
577 if not arglist.getLastArg(arglist.parser.EOption):
578 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
579 if not arglist.getLastArg(arglist.parser.QOption):
580 cmd_args.append('-quiet')
581 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
582 arglist.addLastArg(cmd_args, arglist.parser.vOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000583 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000584 arglist.addLastArg(cmd_args, arglist.parser.POption)
585
586 # FIXME: Handle %I properly.
587 if arglist.getValue(arch) == 'x86_64':
588 cmd_args.append('-imultilib')
589 cmd_args.append('x86_64')
590
591 if arglist.getLastArg(arglist.parser.MDOption):
592 cmd_args.append('-MD')
593 # FIXME: Think about this more.
594 outputOpt = arglist.getLastArg(arglist.parser.oOption)
595 if outputOpt:
596 base,ext = os.path.splitext(arglist.getValue(outputOpt))
597 cmd_args.append(base+'.d')
598 else:
599 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
600 if arglist.getLastArg(arglist.parser.MMDOption):
601 cmd_args.append('-MMD')
602 # FIXME: Think about this more.
603 outputOpt = arglist.getLastArg(arglist.parser.oOption)
604 if outputOpt:
605 base,ext = os.path.splitext(arglist.getValue(outputOpt))
606 cmd_args.append(base+'.d')
607 else:
608 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
609 arglist.addLastArg(cmd_args, arglist.parser.MOption)
610 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
611 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
612 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
613 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
614 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
615 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
616 if (not arglist.getLastArg(arglist.parser.MOption) and
617 not arglist.getLastArg(arglist.parser.MMOption) and
618 (arglist.getLastArg(arglist.parser.MDOption) or
619 arglist.getLastArg(arglist.parser.MMDOption))):
620 outputOpt = arglist.getLastArg(arglist.parser.oOption)
621 if outputOpt:
622 cmd_args.append('-MQ')
623 cmd_args.append(arglist.getValue(outputOpt))
624
625 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
626 if arglist.getLastArg(arglist.parser.g3Option):
627 cmd_args.append('-dD')
628 arglist.addLastArg(cmd_args, arglist.parser.HOption)
629
630 self.addCPPArgs(cmd_args, arch, arglist)
631
632 arglist.addAllArgs3(cmd_args,
633 arglist.parser.DOption,
634 arglist.parser.UOption,
635 arglist.parser.AOption)
636
637 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
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 for arg in arglist.getArgs2(arglist.parser.WpOption,
646 arglist.parser.XpreprocessorOption):
647 cmd_args.extend(arglist.getValues(arg))
648
649 if arglist.getLastArg(arglist.parser.f_mudflapOption):
650 cmd_args.append('-D_MUDFLAP')
651 cmd_args.append('-include')
652 cmd_args.append('mf-runtime.h')
653
654 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
655 cmd_args.append('-D_MUDFLAP')
656 cmd_args.append('-D_MUDFLAPTH')
657 cmd_args.append('-include')
658 cmd_args.append('mf-runtime.h')
659
660 def addCPPArgs(self, cmd_args, arch, arglist):
661 # Derived from cpp spec.
662
663 if arglist.getLastArg(arglist.parser.staticOption):
664 # The gcc spec is broken here, it refers to dynamic but
665 # that has been translated. Start by being bug compatible.
666
667 # if not arglist.getLastArg(arglist.parser.dynamicOption):
668 cmd_args.append('-D__STATIC__')
669 else:
670 cmd_args.append('-D__DYNAMIC__')
671
672 if arglist.getLastArg(arglist.parser.pthreadOption):
673 cmd_args.append('-D_REENTRANT')
674
675class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
676 def __init__(self, toolChain):
677 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
678 (Tool.eFlagsPipedInput |
679 Tool.eFlagsPipedOutput))
680 self.toolChain = toolChain
681
682 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000683 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000684 inputType = inputs[0].type
685 assert not [i for i in inputs if i.type != inputType]
686
687 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
688
689 cmd_args = ['-E']
690 if (arglist.getLastArg(arglist.parser.traditionalOption) or
691 arglist.getLastArg(arglist.parser.f_traditionalOption) or
692 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
693 cmd_args.append('-traditional-cpp')
694
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000695 output_args = self.getOutputArgs(arglist, output,
696 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000697 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000698 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000699
700 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
701
702 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
703 cmd_args))
704
705class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
706 def __init__(self, toolChain):
707 super(Darwin_X86_CompileTool, self).__init__('cc1',
708 (Tool.eFlagsPipedInput |
709 Tool.eFlagsPipedOutput |
710 Tool.eFlagsIntegratedCPP))
711 self.toolChain = toolChain
712
713 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000714 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000715 inputType = inputs[0].type
716 assert not [i for i in inputs if i.type != inputType]
717
718 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
719
720 cmd_args = []
721 if (arglist.getLastArg(arglist.parser.traditionalOption) or
722 arglist.getLastArg(arglist.parser.f_traditionalOption)):
723 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
724
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000725 if outputType is Types.PCHType:
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000726 pass
727 elif outputType is Types.AsmTypeNoPP:
728 pass
729 elif outputType is Types.LLVMAsmType:
730 cmd_args.append('-emit-llvm')
731 elif outputType is Types.LLVMBCType:
732 cmd_args.append('-emit-llvm-bc')
733
734 if outputType is Types.PCHType:
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000735 output_args = []
736 else:
737 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000738
739 # There is no need for this level of compatibility, but it
740 # makes diffing easier.
741 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
742 not arglist.getLastArg(arglist.parser.SOption)):
743 early_output_args, end_output_args = [], output_args
744 else:
745 early_output_args, end_output_args = output_args, []
746
Daniel Dunbar06172d62009-01-20 00:47:24 +0000747 if usePP:
748 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
749 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
750 early_output_args, isCXX)
751 cmd_args.extend(end_output_args)
752 else:
753 cmd_args.append('-fpreprocessed')
754
755 # FIXME: There is a spec command to remove
756 # -fpredictive-compilation args here. Investigate.
757
758 for input in inputs:
759 if isinstance(input.source, Jobs.PipedJob):
760 cmd_args.append('-')
761 else:
762 cmd_args.extend(arglist.renderAsInput(input.source))
763
764 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
765 early_output_args, isCXX)
766 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000767
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000768 if outputType is Types.PCHType:
769 assert output is not None and not isinstance(output, Jobs.PipedJob)
770
771 cmd_args.append('-o')
772 # NOTE: gcc uses a temp .s file for this, but there
773 # doesn't seem to be a good reason.
774 cmd_args.append('/dev/null')
775
776 cmd_args.append('--output-pch=')
777 cmd_args.append(arglist.getValue(output))
778
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000779 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
780 cmd_args))
781
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000782class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000783 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000784 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000785 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000786
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000787 def getMacosxVersionTuple(self, arglist):
788 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
789 if arg:
790 version = arglist.getValue(arg)
791 components = version.split('.')
792 try:
793 return tuple(map(int, components))
794 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000795 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000796 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000797 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000798 return (10, major-4, minor)
799
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000800 def addDarwinArch(self, cmd_args, arch, arglist):
801 # Derived from darwin_arch spec.
802 cmd_args.append('-arch')
803 # FIXME: The actual spec uses -m64 for this, but we want to
804 # respect arch. Figure out what exactly gcc is doing.
805 #if arglist.getLastArg(arglist.parser.m_64Option):
806 if arglist.getValue(arch) == 'x86_64':
807 cmd_args.append('x86_64')
808 else:
809 cmd_args.append('i386')
810
811 def addDarwinSubArch(self, cmd_args, arch, arglist):
812 # Derived from darwin_subarch spec, not sure what the
813 # distinction exists for but at least for this chain it is the same.
814 return self.addDarwinArch(cmd_args, arch, arglist)
815
816 def addLinkArgs(self, cmd_args, arch, arglist):
817 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000818 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
819 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000820 cmd_args.append('-dynamic')
821 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
822 # FIXME: Replace -lobjc in forward args with
823 # -lobjc-gnu. How do we wish to handle such things?
824 pass
825
Daniel Dunbar470104e2009-01-17 00:53:19 +0000826 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
827 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000828 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000829 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000830 else:
831 self.addDarwinSubArch(cmd_args, arch, arglist)
832
Daniel Dunbar470104e2009-01-17 00:53:19 +0000833 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000834 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000835 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000836 '-bundle_loader')
837 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
838 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
839 # FIXME: Where should diagnostics go?
840 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
841 sys.exit(1)
842 if arglist.getLastArg(arglist.parser.current_versionOption):
843 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
844 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000845 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000846 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000847 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000848 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
849 sys.exit(1)
850 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
851 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
852 else:
853 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000854 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000855 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
856 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000857 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000858 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
859 sys.exit(1)
860 if arglist.getLastArg(arglist.parser.client_nameOption):
861 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
862 sys.exit(1)
863 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
864 '-dylib_compatibility_version')
865 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
866 '-dylib_current_version')
867
Daniel Dunbar470104e2009-01-17 00:53:19 +0000868 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000869 self.addDarwinArch(cmd_args, arch, arglist)
870 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
871 else:
872 self.addDarwinSubArch(cmd_args, arch, arglist)
873
Daniel Dunbar470104e2009-01-17 00:53:19 +0000874 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000875 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
876 sys.exit(1)
877
Daniel Dunbar470104e2009-01-17 00:53:19 +0000878 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000879 '-dylib_install_name')
880
881 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
882 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
883 sys.exit(1)
884 if arglist.getLastArg(arglist.parser.private_bundleOption):
885 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
886 sys.exit(1)
887
Daniel Dunbar470104e2009-01-17 00:53:19 +0000888 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000889 cmd_args.append('-all_load')
890
Daniel Dunbar470104e2009-01-17 00:53:19 +0000891 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000892 '-allowable_client')
893
Daniel Dunbar470104e2009-01-17 00:53:19 +0000894 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000895 cmd_args.append('-bind_at_load')
896
Daniel Dunbar470104e2009-01-17 00:53:19 +0000897 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000898 cmd_args.append('-dead_strip')
899
Daniel Dunbar470104e2009-01-17 00:53:19 +0000900 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000901 cmd_args.append('-no_dead_strip_inits_and_terms')
902
Daniel Dunbar470104e2009-01-17 00:53:19 +0000903 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000904 '-dylib_file')
905
Daniel Dunbar470104e2009-01-17 00:53:19 +0000906 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000907 cmd_args.append('-dynamic')
908
Daniel Dunbar470104e2009-01-17 00:53:19 +0000909 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000910 '-exported_symbols_list')
911
Daniel Dunbar470104e2009-01-17 00:53:19 +0000912 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000913 cmd_args.append('-flat_namespace')
914
915 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000916 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000917 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000918 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000919 '-init')
920
921 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
922 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
923 # FIXME: I don't understand what is going on
924 # here. This is supposed to come from
925 # darwin_ld_minversion, but gcc doesn't seem to be
926 # following that; it must be getting over-ridden
927 # somewhere.
928 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000929 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000930 else:
931 # addAll doesn't make sense here but this is what gcc
932 # does.
933 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
934 '-macosx_version_min')
935
936 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
937 '-iphoneos_version_min')
938 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
939
Daniel Dunbar470104e2009-01-17 00:53:19 +0000940 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000941 cmd_args.append('-multi_module')
942
Daniel Dunbar470104e2009-01-17 00:53:19 +0000943 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000944 cmd_args.append('-single_module')
945
Daniel Dunbar470104e2009-01-17 00:53:19 +0000946 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000947 '-multiply_defined')
948
Daniel Dunbar470104e2009-01-17 00:53:19 +0000949 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000950 '-multiply_defined_unused')
951
952 if arglist.getLastArg(arglist.parser.f_pieOption):
953 cmd_args.append('-pie')
954
955 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
956 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
957 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
958 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
959 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
960 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
961 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
962 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
963 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000964 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000965 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000966 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000967 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000968 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000969 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000970 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000971 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000972 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
973 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000974 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
975 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
976 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
977 '-syslibroot')
978 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
979 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000980 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000981 '-umbrella')
982 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000983 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000984 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000985 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000986 '-weak_reference_mismatches')
987
Daniel Dunbar470104e2009-01-17 00:53:19 +0000988 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000989 cmd_args.append('-weak_reference_mismatches')
990 cmd_args.append('non-weak')
991
992 arglist.addLastArg(cmd_args, arglist.parser.XOption)
993 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
994 arglist.addLastArg(cmd_args, arglist.parser.wOption)
995 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
996 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
997 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
998 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
999 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
1000 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
1001 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
1002 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
1003 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
1004 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
1005 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
1006 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +00001007
1008 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001009 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001010 assert outputType is Types.ImageType
1011
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001012 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001013 # comes from specs (starting with link_command). Consult gcc
1014 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001015
1016 # FIXME: gcc's spec controls when this is done; certain things
1017 # like -filelist or -Wl, still trigger a link stage. I don't
1018 # quite understand how gcc decides to execute the linker,
1019 # investigate. Also, the spec references -fdump= which seems
1020 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +00001021 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001022
1023 # Not sure why this particular decomposition exists in gcc.
1024 self.addLinkArgs(cmd_args, arch, arglist)
1025
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001026 # This toolchain never accumlates options in specs, the only
1027 # place this gets used is to add -ObjC.
1028 if (arglist.getLastArg(arglist.parser.ObjCOption) or
1029 arglist.getLastArg(arglist.parser.f_objcOption)):
1030 cmd_args.append('-ObjC')
1031 if arglist.getLastArg(arglist.parser.ObjCXXOption):
1032 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001033
1034 # FIXME: gcc has %{x} in here. How could this ever happen?
1035 # Cruft?
Daniel Dunbarb644be32009-01-23 00:39:52 +00001036 arglist.addAllArgs(cmd_args, arglist.parser.dOption)
1037 arglist.addAllArgs(cmd_args, arglist.parser.sOption)
1038 arglist.addAllArgs(cmd_args, arglist.parser.tOption)
1039 arglist.addAllArgs(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +00001040 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001041 arglist.addAllArgs(cmd_args, arglist.parser.AOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001042 arglist.addLastArg(cmd_args, arglist.parser.eOption)
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001043 arglist.addAllArgs(cmd_args, arglist.parser.mSeparate)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001044 arglist.addAllArgs(cmd_args, arglist.parser.rOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001045
1046 cmd_args.extend(arglist.render(output))
1047
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001048 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001049 if (not arglist.getLastArg(arglist.parser.AOption) and
1050 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1051 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1052 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +00001053 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001054 # Derived from darwin_dylib1 spec.
1055 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1056 cmd_args.append('-ldylib1.o')
1057 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001058 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001059 cmd_args.append('-ldylib1.o')
1060 else:
1061 cmd_args.append('-ldylib1.10.5.o')
1062 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +00001063 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001064 if not arglist.getLastArg(arglist.parser.staticOption):
1065 cmd_args.append('-lbundle1.o')
1066 else:
1067 if arglist.getLastArg(arglist.parser.pgOption):
1068 if arglist.getLastArg(arglist.parser.staticOption):
1069 cmd_args.append('-lgcrt0.o')
1070 else:
1071 if arglist.getLastArg(arglist.parser.objectOption):
1072 cmd_args.append('-lgcrt0.o')
1073 else:
1074 if arglist.getLastArg(arglist.parser.preloadOption):
1075 cmd_args.append('-lgcrt0.o')
1076 else:
1077 cmd_args.append('-lgcrt1.o')
1078
1079 # darwin_crt2 spec is empty.
1080 pass
1081 else:
1082 if arglist.getLastArg(arglist.parser.staticOption):
1083 cmd_args.append('-lcrt0.o')
1084 else:
1085 if arglist.getLastArg(arglist.parser.objectOption):
1086 cmd_args.append('-lcrt0.o')
1087 else:
1088 if arglist.getLastArg(arglist.parser.preloadOption):
1089 cmd_args.append('-lcrt0.o')
1090 else:
1091 # Derived from darwin_crt1 spec.
1092 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1093 cmd_args.append('-lcrt1.o')
1094 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001095 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001096 cmd_args.append('-lcrt1.o')
1097 else:
1098 cmd_args.append('-lcrt1.10.5.o')
1099
1100 # darwin_crt2 spec is empty.
1101 pass
1102
1103 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1104 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001105 if macosxVersion < (10,5):
Daniel Dunbar70230822009-01-21 17:18:19 +00001106 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001107
1108 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1109
1110 if arglist.getLastArg(arglist.parser.f_openmpOption):
1111 # This is more complicated in gcc...
1112 cmd_args.append('-lgomp')
1113
1114 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001115 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001116 if arglist.getValue(arch) == 'x86_64':
1117 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1118 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1119 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1120 "-L/usr/lib/gcc/%s" % tcDir,
1121 "-L/usr/lib/gcc/%s" % tcDir,
1122 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1123 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001124
Daniel Dunbara5677512009-01-05 19:53:30 +00001125 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001126 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001127
Daniel Dunbar7c584962009-01-20 21:29:14 +00001128 if linkingOutput:
1129 cmd_args.append('-arch_multiple')
1130 cmd_args.append('-final_output')
1131 cmd_args.append(arglist.getValue(linkingOutput))
1132
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001133 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1134 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1135 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1136 arglist.getLastArg(arglist.parser.coverageOption)):
1137 cmd_args.append('-lgcov')
1138
1139 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1140 cmd_args.append('-allow_stack_execute')
1141
1142 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1143 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1144 # link_ssp spec is empty.
1145
1146 # Derived from libgcc spec.
1147 if arglist.getLastArg(arglist.parser.staticOption):
1148 cmd_args.append('-lgcc_static')
1149 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1150 cmd_args.append('-lgcc_eh')
1151 cmd_args.append('-lgcc')
1152 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1153 # Derived from darwin_iphoneos_libgcc spec.
1154 cmd_args.append('-lgcc_s.10.5')
1155 cmd_args.append('-lgcc')
1156 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1157 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1158 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001159 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001160 cmd_args.append('-lgcc_s.10.4')
1161 else:
1162 cmd_args.append('-lgcc_s.10.5')
1163 cmd_args.append('-lgcc')
1164 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001165 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001166 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001167 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001168 cmd_args.append('-lgcc_s.10.5')
1169 cmd_args.append('-lgcc')
1170
1171 # Derived from lib spec.
1172 if not arglist.getLastArg(arglist.parser.staticOption):
1173 cmd_args.append('-lSystem')
1174
1175 if (not arglist.getLastArg(arglist.parser.AOption) and
1176 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1177 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1178 # endfile_spec is empty.
1179 pass
1180
1181 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1182 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1183
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001184 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1185 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001186
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001187 if (arglist.getLastArg(arglist.parser.gGroup) and
1188 not arglist.getLastArg(arglist.parser.gstabsOption) and
1189 not arglist.getLastArg(arglist.parser.g0Option)):
1190 # FIXME: This is gross, but matches gcc. The test only
1191 # considers the suffix (not the -x type), and then only of the
1192 # first input.
1193 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1194 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1195 '.c++','.cxx','.CPP','.m','.mm'):
1196 jobs.addJob(Jobs.Command('dsymutil',
1197 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001198
Daniel Dunbara5677512009-01-05 19:53:30 +00001199class LipoTool(Tool):
1200 def __init__(self):
1201 super(LipoTool, self).__init__('lipo')
1202
1203 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001204 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001205 assert outputType is Types.ImageType
1206
Daniel Dunbardb439902009-01-07 18:40:45 +00001207 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001208 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001209 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001210 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001211 jobs.addJob(Jobs.Command('lipo', cmd_args))