blob: c0728f5d0f7168a09f3bb6dd0d692e7585fb8efe [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 Dunbarde388a52009-01-21 01:07:49 +0000179 if isinstance(phase.phase, Phases.AnalyzePhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000180 assert outputType is Types.PlistType
Daniel Dunbarde388a52009-01-21 01:07:49 +0000181 cmd_args.append('-analyze')
182 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000183 assert outputType is Types.NothingType
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args.append('-fsyntax-only')
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000185 elif outputType is Types.LLVMAsmType:
186 cmd_args.append('-emit-llvm')
187 elif outputType is Types.LLVMBCType:
188 cmd_args.append('-emit-llvm-bc')
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000189 elif outputType is Types.AsmTypeNoPP:
190 cmd_args.append('-S')
Daniel Dunbar350b5d42009-01-29 23:54:06 +0000191 elif (inputs[0].type.preprocess and
192 outputType is inputs[0].type.preprocess):
193 cmd_args.append('-E')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000194 elif outputType is Types.PCHType:
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000195 # No special option needed, driven by -x.
196 #
197 # FIXME: Don't drive this by -x, that is gross.
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000198
199 # FIXME: This is a total hack. Copy the input header file
200 # to the output, so that it can be -include'd by clang.
201 assert len(inputs) == 1
202 assert not isinstance(output, Jobs.PipedJob)
203 assert not isinstance(inputs[0].source, Jobs.PipedJob)
204 inputPath = arglist.getValue(inputs[0].source)
205 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
206 os.path.basename(inputPath))
207 # Only do copy when the output doesn't exist.
208 if not os.path.exists(outputPath):
209 import shutil
210 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000211 else:
212 raise ValueError,"Unexpected output type for clang tool."
213
Daniel Dunbar87a7b282009-02-17 18:07:00 +0000214 # The make clang go fast button.
215 cmd_args.append('-disable-free')
216
Daniel Dunbarde388a52009-01-21 01:07:49 +0000217 if isinstance(phase.phase, Phases.AnalyzePhase):
218 # Add default argument set.
219 #
220 # FIXME: Move into clang?
221 cmd_args.extend(['-warn-dead-stores',
222 '-checker-cfref',
223 '-warn-objc-methodsigs',
224 '-warn-objc-missing-dealloc',
225 '-warn-objc-unused-ivars'])
226
Ted Kremenekbe1fe1e2009-02-17 04:27:41 +0000227 cmd_args.append('-analyzer-output=plist')
Daniel Dunbarde388a52009-01-21 01:07:49 +0000228
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000229 # Add -Xanalyzer arguments when running as analyzer.
230 for arg in arglist.getArgs(arglist.parser.XanalyzerOption):
231 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000232 else:
233 # Perform argument translation for LLVM backend. This
Daniel Dunbar6262cc42009-01-27 20:42:58 +0000234 # takes some care in reconciling with llvm-gcc. The
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000235 # issue is that llvm-gcc translates these options based on
236 # the values in cc1, whereas we are processing based on
237 # the driver arguments.
238 #
239 # FIXME: This is currently broken for -f flags when -fno
240 # variants are present.
241
242 # This comes from the default translation the driver + cc1
243 # would do to enable flag_pic.
244 #
245 # FIXME: Centralize this code.
246 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
247 arglist.getLastArg(arglist.parser.f_picOption) or
248 arglist.getLastArg(arglist.parser.f_PIEOption) or
249 arglist.getLastArg(arglist.parser.f_pieOption) or
250 (not arglist.getLastArg(arglist.parser.m_kernelOption) and
251 not arglist.getLastArg(arglist.parser.staticOption) and
252 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)))
253
Daniel Dunbar2d43e3b2009-01-29 06:12:22 +0000254 # FIXME: This needs to tie into a platform hook.
255 if arch:
256 archName = arglist.getValue(arch)
257 if (archName == 'x86_64' or
258 picEnabled):
259 cmd_args.append('--relocation-model=pic')
260 elif not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
261 cmd_args.append('--relocation-model=static')
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000262
263 if arglist.getLastArg(arglist.parser.f_timeReportOption):
264 cmd_args.append('--time-passes')
265 # FIXME: Set --enable-unsafe-fp-math.
266 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
267 cmd_args.append('--disable-fp-elim')
268 if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption):
269 cmd_args.append('--nozero-initialized-in-bss')
270 if arglist.getLastArg(arglist.parser.dAOption):
271 cmd_args.append('--asm-verbose')
272 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
273 cmd_args.append('--debug-pass=Structure')
274 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
275 cmd_args.append('--debug-pass=Arguments')
276 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
277 if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
278 cmd_args.append('--unwind-tables')
279
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000280 if arglist.hasFFlag(arglist.parser.f_mathErrnoOption,
281 arglist.parser.f_noMathErrnoOption,
282 self.toolChain.isMathErrnoDefault()):
283 cmd_args.append('--fmath-errno=1')
284 else:
285 cmd_args.append('--fmath-errno=0')
286
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000287 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
288 if arg:
289 cmd_args.append('--limit-float-precision')
290 cmd_args.append(arglist.getValue(arg))
291
292 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbarde388a52009-01-21 01:07:49 +0000293
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000294 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000295 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000296 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar41577f12009-02-15 05:59:37 +0000297 arglist.addLastArg(cmd_args, arglist.parser.POption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000298 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
299
300 # Special case debug options to only pass -g to clang. This is
301 # wrong.
302 if arglist.getLastArg(arglist.parser.gGroup):
303 cmd_args.append('-g')
304
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000305 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
306
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000307 # FIXME: Clang isn't going to accept just anything here.
308 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
309
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000310 # Automatically load .pth files which match -include options.
311 for arg in arglist.getArgs(arglist.parser.includeOption):
312 pthPath = arglist.getValue(arg) + '.pth'
313 if os.path.exists(pthPath):
314 cmd_args.append('-token-cache')
315 cmd_args.append(pthPath)
316
Mike Stumpb55cc632009-01-30 08:22:07 +0000317 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000318
Daniel Dunbarc1212a32009-02-05 02:43:38 +0000319 # Manually translate -O to -O1; let clang reject others.
320 arg = arglist.getLastArg(arglist.parser.OOption)
321 if arg:
322 if arglist.getValue(arg) == '':
323 cmd_args.append('-O1')
324 else:
325 cmd_args.extend(arglist.render(arg))
326
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000327 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
328 arglist.addLastArg(cmd_args, arglist.parser.wOption)
329 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
330
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000331 arglist.addAllArgs(cmd_args, arglist.parser.Clang_fGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000332
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000333 arglist.addLastArg(cmd_args, arglist.parser.dMOption)
334
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000335 for arg in arglist.getArgs(arglist.parser.XclangOption):
336 cmd_args.extend(arglist.getValues(arg))
337
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000338 if arch is not None:
339 cmd_args.extend(arglist.render(arch))
340
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000341 if isinstance(output, Jobs.PipedJob):
342 cmd_args.extend(['-o', '-'])
Daniel Dunbar3d2b7902009-02-13 00:49:01 +0000343 elif output:
344 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000345
346 for input in inputs:
347 cmd_args.append('-x')
348 cmd_args.append(input.type.name)
349 if isinstance(input.source, Jobs.PipedJob):
350 cmd_args.append('-')
351 else:
352 cmd_args.extend(arglist.renderAsInput(input.source))
353
Daniel Dunbar768be1c2009-01-21 02:03:52 +0000354 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
355 cmd_args))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000356
Daniel Dunbar06172d62009-01-20 00:47:24 +0000357class Darwin_X86_CC1Tool(Tool):
358 def getCC1Name(self, type):
359 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000360
Daniel Dunbar06172d62009-01-20 00:47:24 +0000361 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000362 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000363 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000364 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000365 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000366 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000367 return 'cc1obj',True,False
Daniel Dunbar2910dfa2009-01-23 00:04:43 +0000368 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000369 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000370 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000371 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000372 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000373 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000374 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000375 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000376 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000377 return 'cc1objplus',False,True
378 else:
379 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000380
381 def addCC1Args(self, cmd_args, arch, arglist):
382 # Derived from cc1 spec.
383
384 # FIXME: -fapple-kext seems to disable this too. Investigate.
385 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
386 not arglist.getLastArg(arglist.parser.staticOption) and
387 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
388 cmd_args.append('-fPIC')
389
390 # FIXME: Remove mthumb
391 # FIXME: Remove mno-thumb
392
393 # FIXME: As with ld, something else is going on. My best guess
394 # is gcc is faking an -mmacosx-version-min
395 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000396# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
397# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
398# cmd_args.append('-mmacosx-version-min=' +
399# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000400
401 # FIXME: Remove faltivec
402 # FIXME: Remove mno-fused-madd
403 # FIXME: Remove mlong-branch
404 # FIXME: Remove mlongcall
405 # FIXME: Remove mcpu=G4
406 # FIXME: Remove mcpu=G5
407
Daniel Dunbar105132e2009-01-16 21:07:21 +0000408 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000409 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
410 cmd_args.append('-feliminate-unused-debug-symbols')
411
Daniel Dunbar06172d62009-01-20 00:47:24 +0000412 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000413 # Derived from cc1_options spec.
414 if (arglist.getLastArg(arglist.parser.fastOption) or
415 arglist.getLastArg(arglist.parser.fastfOption) or
416 arglist.getLastArg(arglist.parser.fastcpOption)):
417 cmd_args.append('-O3')
418
419 if (arglist.getLastArg(arglist.parser.pgOption) and
420 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000421 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000422
Daniel Dunbardff9f502009-01-12 18:51:02 +0000423 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000424
425 if not arglist.getLastArg(arglist.parser.QOption):
426 cmd_args.append('-quiet')
427
428 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000429 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000430
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000431 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000432
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000433 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
434 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000435
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000436 # FIXME: The goal is to use the user provided -o if that is
437 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000438 # name. Find a clean way to go about this.
439 if (arglist.getLastArg(arglist.parser.cOption) or
440 arglist.getLastArg(arglist.parser.SOption)):
441 outputOpt = arglist.getLastArg(arglist.parser.oOption)
442 if outputOpt:
443 cmd_args.append('-auxbase-strip')
444 cmd_args.append(arglist.getValue(outputOpt))
445 else:
446 cmd_args.append('-auxbase')
447 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000448 else:
449 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000450 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000451
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000452 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000453
Daniel Dunbar816dd502009-01-12 17:53:19 +0000454 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
455 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000456 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000457 arglist.addLastArg(cmd_args, arglist.parser.wOption)
458 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
459 if arglist.getLastArg(arglist.parser.vOption):
460 cmd_args.append('-version')
461 if arglist.getLastArg(arglist.parser.pgOption):
462 cmd_args.append('-p')
463 arglist.addLastArg(cmd_args, arglist.parser.pOption)
464
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000465 # ccc treats -fsyntax-only specially.
466 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
467 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000468 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000469
Daniel Dunbar06172d62009-01-20 00:47:24 +0000470 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000471 if arglist.getLastArg(arglist.parser.QnOption):
472 cmd_args.append('-fno-ident')
473
474 # FIXME: This isn't correct.
475 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
476 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
477
Daniel Dunbar06172d62009-01-20 00:47:24 +0000478 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000479 cmd_args.extend(output_args)
480
Daniel Dunbar816dd502009-01-12 17:53:19 +0000481 # FIXME: Still don't get what is happening here. Investigate.
482 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
483
484 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
485 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
486 cmd_args.append('-fno-builtin')
487 cmd_args.append('-fno-merge-constants')
488
489 if arglist.getLastArg(arglist.parser.coverageOption):
490 cmd_args.append('-fprofile-arcs')
491 cmd_args.append('-ftest-coverage')
492
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000493 if isCXX:
494 cmd_args.append('-D__private_extern__=extern')
495
Daniel Dunbar06172d62009-01-20 00:47:24 +0000496 def getBaseInputName(self, inputs, arglist):
497 # FIXME: gcc uses a temporary name here when the base
498 # input is stdin, but only in auxbase. Investigate.
499 baseInputValue = arglist.getValue(inputs[0].baseInput)
500 return os.path.basename(baseInputValue)
501
502 def getBaseInputStem(self, inputs, arglist):
503 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
504
505 def getOutputArgs(self, arglist, output, isCPP=False):
506 if isinstance(output, Jobs.PipedJob):
507 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000508 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000509 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000510 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000511 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000512 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000513 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000514 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000515
516 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
517 output_args, isCXX):
518 # Derived from cpp_options.
519 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
520
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000521 cmd_args.extend(output_args)
522
Daniel Dunbar06172d62009-01-20 00:47:24 +0000523 self.addCC1Args(cmd_args, arch, arglist)
524
525 # NOTE: The code below has some commonality with cpp_options,
526 # but in classic gcc style ends up sending things in different
527 # orders. This may be a good merge candidate once we drop
528 # pedantic compatibility.
529
530 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
531 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
532 arglist.parser.ansiOption,
533 arglist.parser.trigraphsOption)
534 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
535 arglist.parser.pedanticGroup)
536 arglist.addLastArg(cmd_args, arglist.parser.wOption)
537
538 # ccc treats -fsyntax-only specially.
539 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
540 arglist.parser.syntaxOnlyOption)
Mike Stumpb55cc632009-01-30 08:22:07 +0000541 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000542
543 if (arglist.getLastArg(arglist.parser.gGroup) and
544 not arglist.getLastArg(arglist.parser.g0Option) and
545 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
546 cmd_args.append('-fworking-directory')
547
548 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
549 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
550 if arglist.getLastArg(arglist.parser.saveTempsOption):
551 cmd_args.append('-fpch-preprocess')
552
553 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
554 # Derived from cpp_unique_options.
555
556 if (arglist.getLastArg(arglist.parser.COption) or
557 arglist.getLastArg(arglist.parser.CCOption)):
558 if not arglist.getLastArg(arglist.parser.EOption):
559 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
560 if not arglist.getLastArg(arglist.parser.QOption):
561 cmd_args.append('-quiet')
562 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
563 arglist.addLastArg(cmd_args, arglist.parser.vOption)
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000564 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000565 arglist.addLastArg(cmd_args, arglist.parser.POption)
566
567 # FIXME: Handle %I properly.
568 if arglist.getValue(arch) == 'x86_64':
569 cmd_args.append('-imultilib')
570 cmd_args.append('x86_64')
571
572 if arglist.getLastArg(arglist.parser.MDOption):
573 cmd_args.append('-MD')
574 # FIXME: Think about this more.
575 outputOpt = arglist.getLastArg(arglist.parser.oOption)
576 if outputOpt:
577 base,ext = os.path.splitext(arglist.getValue(outputOpt))
578 cmd_args.append(base+'.d')
579 else:
580 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
581 if arglist.getLastArg(arglist.parser.MMDOption):
582 cmd_args.append('-MMD')
583 # FIXME: Think about this more.
584 outputOpt = arglist.getLastArg(arglist.parser.oOption)
585 if outputOpt:
586 base,ext = os.path.splitext(arglist.getValue(outputOpt))
587 cmd_args.append(base+'.d')
588 else:
589 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
590 arglist.addLastArg(cmd_args, arglist.parser.MOption)
591 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
592 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
593 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
594 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
595 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
596 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
597 if (not arglist.getLastArg(arglist.parser.MOption) and
598 not arglist.getLastArg(arglist.parser.MMOption) and
599 (arglist.getLastArg(arglist.parser.MDOption) or
600 arglist.getLastArg(arglist.parser.MMDOption))):
601 outputOpt = arglist.getLastArg(arglist.parser.oOption)
602 if outputOpt:
603 cmd_args.append('-MQ')
604 cmd_args.append(arglist.getValue(outputOpt))
605
606 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
607 if arglist.getLastArg(arglist.parser.g3Option):
608 cmd_args.append('-dD')
609 arglist.addLastArg(cmd_args, arglist.parser.HOption)
610
611 self.addCPPArgs(cmd_args, arch, arglist)
612
613 arglist.addAllArgs3(cmd_args,
614 arglist.parser.DOption,
615 arglist.parser.UOption,
616 arglist.parser.AOption)
617
618 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
619
620 for input in inputs:
621 if isinstance(input.source, Jobs.PipedJob):
622 cmd_args.append('-')
623 else:
624 cmd_args.extend(arglist.renderAsInput(input.source))
625
626 for arg in arglist.getArgs2(arglist.parser.WpOption,
627 arglist.parser.XpreprocessorOption):
628 cmd_args.extend(arglist.getValues(arg))
629
630 if arglist.getLastArg(arglist.parser.f_mudflapOption):
631 cmd_args.append('-D_MUDFLAP')
632 cmd_args.append('-include')
633 cmd_args.append('mf-runtime.h')
634
635 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
636 cmd_args.append('-D_MUDFLAP')
637 cmd_args.append('-D_MUDFLAPTH')
638 cmd_args.append('-include')
639 cmd_args.append('mf-runtime.h')
640
641 def addCPPArgs(self, cmd_args, arch, arglist):
642 # Derived from cpp spec.
643
644 if arglist.getLastArg(arglist.parser.staticOption):
645 # The gcc spec is broken here, it refers to dynamic but
646 # that has been translated. Start by being bug compatible.
647
648 # if not arglist.getLastArg(arglist.parser.dynamicOption):
649 cmd_args.append('-D__STATIC__')
650 else:
651 cmd_args.append('-D__DYNAMIC__')
652
653 if arglist.getLastArg(arglist.parser.pthreadOption):
654 cmd_args.append('-D_REENTRANT')
655
656class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
657 def __init__(self, toolChain):
658 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
659 (Tool.eFlagsPipedInput |
660 Tool.eFlagsPipedOutput))
661 self.toolChain = toolChain
662
663 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000664 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000665 inputType = inputs[0].type
666 assert not [i for i in inputs if i.type != inputType]
667
668 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
669
670 cmd_args = ['-E']
671 if (arglist.getLastArg(arglist.parser.traditionalOption) or
672 arglist.getLastArg(arglist.parser.f_traditionalOption) or
673 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
674 cmd_args.append('-traditional-cpp')
675
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000676 output_args = self.getOutputArgs(arglist, output,
677 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000678 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000679 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000680
681 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
682
683 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
684 cmd_args))
685
686class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
687 def __init__(self, toolChain):
688 super(Darwin_X86_CompileTool, self).__init__('cc1',
689 (Tool.eFlagsPipedInput |
690 Tool.eFlagsPipedOutput |
691 Tool.eFlagsIntegratedCPP))
692 self.toolChain = toolChain
693
694 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000695 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000696 inputType = inputs[0].type
697 assert not [i for i in inputs if i.type != inputType]
698
699 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
700
701 cmd_args = []
702 if (arglist.getLastArg(arglist.parser.traditionalOption) or
703 arglist.getLastArg(arglist.parser.f_traditionalOption)):
704 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
705
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000706 if outputType is Types.PCHType:
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000707 pass
708 elif outputType is Types.AsmTypeNoPP:
709 pass
710 elif outputType is Types.LLVMAsmType:
711 cmd_args.append('-emit-llvm')
712 elif outputType is Types.LLVMBCType:
713 cmd_args.append('-emit-llvm-bc')
714
715 if outputType is Types.PCHType:
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000716 output_args = []
717 else:
718 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000719
720 # There is no need for this level of compatibility, but it
721 # makes diffing easier.
722 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
723 not arglist.getLastArg(arglist.parser.SOption)):
724 early_output_args, end_output_args = [], output_args
725 else:
726 early_output_args, end_output_args = output_args, []
727
Daniel Dunbar06172d62009-01-20 00:47:24 +0000728 if usePP:
729 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
730 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
731 early_output_args, isCXX)
732 cmd_args.extend(end_output_args)
733 else:
734 cmd_args.append('-fpreprocessed')
735
736 # FIXME: There is a spec command to remove
737 # -fpredictive-compilation args here. Investigate.
738
739 for input in inputs:
740 if isinstance(input.source, Jobs.PipedJob):
741 cmd_args.append('-')
742 else:
743 cmd_args.extend(arglist.renderAsInput(input.source))
744
745 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
746 early_output_args, isCXX)
747 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000748
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000749 if outputType is Types.PCHType:
750 assert output is not None and not isinstance(output, Jobs.PipedJob)
751
752 cmd_args.append('-o')
753 # NOTE: gcc uses a temp .s file for this, but there
754 # doesn't seem to be a good reason.
755 cmd_args.append('/dev/null')
756
757 cmd_args.append('--output-pch=')
758 cmd_args.append(arglist.getValue(output))
759
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000760 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
761 cmd_args))
762
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000763class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000764 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000765 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000766 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000767
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000768 def getMacosxVersionTuple(self, arglist):
769 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
770 if arg:
771 version = arglist.getValue(arg)
772 components = version.split('.')
773 try:
774 return tuple(map(int, components))
775 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000776 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000777 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000778 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000779 return (10, major-4, minor)
780
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000781 def addDarwinArch(self, cmd_args, arch, arglist):
782 # Derived from darwin_arch spec.
783 cmd_args.append('-arch')
784 # FIXME: The actual spec uses -m64 for this, but we want to
785 # respect arch. Figure out what exactly gcc is doing.
786 #if arglist.getLastArg(arglist.parser.m_64Option):
787 if arglist.getValue(arch) == 'x86_64':
788 cmd_args.append('x86_64')
789 else:
790 cmd_args.append('i386')
791
792 def addDarwinSubArch(self, cmd_args, arch, arglist):
793 # Derived from darwin_subarch spec, not sure what the
794 # distinction exists for but at least for this chain it is the same.
795 return self.addDarwinArch(cmd_args, arch, arglist)
796
797 def addLinkArgs(self, cmd_args, arch, arglist):
798 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000799 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
800 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000801 cmd_args.append('-dynamic')
802 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
803 # FIXME: Replace -lobjc in forward args with
804 # -lobjc-gnu. How do we wish to handle such things?
805 pass
806
Daniel Dunbar470104e2009-01-17 00:53:19 +0000807 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
808 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000809 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000810 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000811 else:
812 self.addDarwinSubArch(cmd_args, arch, arglist)
813
Daniel Dunbar470104e2009-01-17 00:53:19 +0000814 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000815 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000816 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000817 '-bundle_loader')
818 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
819 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
820 # FIXME: Where should diagnostics go?
821 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
822 sys.exit(1)
823 if arglist.getLastArg(arglist.parser.current_versionOption):
824 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
825 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000826 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000827 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000828 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000829 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
830 sys.exit(1)
831 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
832 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
833 else:
834 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000835 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000836 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
837 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000838 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000839 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
840 sys.exit(1)
841 if arglist.getLastArg(arglist.parser.client_nameOption):
842 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
843 sys.exit(1)
844 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
845 '-dylib_compatibility_version')
846 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
847 '-dylib_current_version')
848
Daniel Dunbar470104e2009-01-17 00:53:19 +0000849 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000850 self.addDarwinArch(cmd_args, arch, arglist)
851 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
852 else:
853 self.addDarwinSubArch(cmd_args, arch, arglist)
854
Daniel Dunbar470104e2009-01-17 00:53:19 +0000855 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000856 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
857 sys.exit(1)
858
Daniel Dunbar470104e2009-01-17 00:53:19 +0000859 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000860 '-dylib_install_name')
861
862 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
863 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
864 sys.exit(1)
865 if arglist.getLastArg(arglist.parser.private_bundleOption):
866 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
867 sys.exit(1)
868
Daniel Dunbar470104e2009-01-17 00:53:19 +0000869 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000870 cmd_args.append('-all_load')
871
Daniel Dunbar470104e2009-01-17 00:53:19 +0000872 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000873 '-allowable_client')
874
Daniel Dunbar470104e2009-01-17 00:53:19 +0000875 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000876 cmd_args.append('-bind_at_load')
877
Daniel Dunbar470104e2009-01-17 00:53:19 +0000878 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000879 cmd_args.append('-dead_strip')
880
Daniel Dunbar470104e2009-01-17 00:53:19 +0000881 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000882 cmd_args.append('-no_dead_strip_inits_and_terms')
883
Daniel Dunbar470104e2009-01-17 00:53:19 +0000884 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000885 '-dylib_file')
886
Daniel Dunbar470104e2009-01-17 00:53:19 +0000887 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000888 cmd_args.append('-dynamic')
889
Daniel Dunbar470104e2009-01-17 00:53:19 +0000890 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000891 '-exported_symbols_list')
892
Daniel Dunbar470104e2009-01-17 00:53:19 +0000893 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000894 cmd_args.append('-flat_namespace')
895
896 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000897 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000898 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000899 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000900 '-init')
901
902 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
903 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
904 # FIXME: I don't understand what is going on
905 # here. This is supposed to come from
906 # darwin_ld_minversion, but gcc doesn't seem to be
907 # following that; it must be getting over-ridden
908 # somewhere.
909 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000910 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000911 else:
912 # addAll doesn't make sense here but this is what gcc
913 # does.
914 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
915 '-macosx_version_min')
916
917 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
918 '-iphoneos_version_min')
919 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
920
Daniel Dunbar470104e2009-01-17 00:53:19 +0000921 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000922 cmd_args.append('-multi_module')
923
Daniel Dunbar470104e2009-01-17 00:53:19 +0000924 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000925 cmd_args.append('-single_module')
926
Daniel Dunbar470104e2009-01-17 00:53:19 +0000927 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000928 '-multiply_defined')
929
Daniel Dunbar470104e2009-01-17 00:53:19 +0000930 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000931 '-multiply_defined_unused')
932
933 if arglist.getLastArg(arglist.parser.f_pieOption):
934 cmd_args.append('-pie')
935
936 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
937 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
938 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
939 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
940 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
941 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
942 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
943 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
944 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000945 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000946 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000947 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000948 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000949 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000950 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000951 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000952 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000953 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
954 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000955 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
956 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
957 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
958 '-syslibroot')
959 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
960 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000961 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000962 '-umbrella')
963 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000964 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000965 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000966 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000967 '-weak_reference_mismatches')
968
Daniel Dunbar470104e2009-01-17 00:53:19 +0000969 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000970 cmd_args.append('-weak_reference_mismatches')
971 cmd_args.append('non-weak')
972
973 arglist.addLastArg(cmd_args, arglist.parser.XOption)
974 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
975 arglist.addLastArg(cmd_args, arglist.parser.wOption)
976 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
977 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
978 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
979 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
980 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
981 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
982 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
983 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
984 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
985 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
986 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
987 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000988
989 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000990 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000991 assert outputType is Types.ImageType
992
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000993 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000994 # comes from specs (starting with link_command). Consult gcc
995 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000996
997 # FIXME: gcc's spec controls when this is done; certain things
998 # like -filelist or -Wl, still trigger a link stage. I don't
999 # quite understand how gcc decides to execute the linker,
1000 # investigate. Also, the spec references -fdump= which seems
1001 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +00001002 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001003
1004 # Not sure why this particular decomposition exists in gcc.
1005 self.addLinkArgs(cmd_args, arch, arglist)
1006
Daniel Dunbaree8cc262009-01-12 02:24:21 +00001007 # This toolchain never accumlates options in specs, the only
1008 # place this gets used is to add -ObjC.
1009 if (arglist.getLastArg(arglist.parser.ObjCOption) or
1010 arglist.getLastArg(arglist.parser.f_objcOption)):
1011 cmd_args.append('-ObjC')
1012 if arglist.getLastArg(arglist.parser.ObjCXXOption):
1013 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001014
1015 # FIXME: gcc has %{x} in here. How could this ever happen?
1016 # Cruft?
Daniel Dunbarb644be32009-01-23 00:39:52 +00001017 arglist.addAllArgs(cmd_args, arglist.parser.dOption)
1018 arglist.addAllArgs(cmd_args, arglist.parser.sOption)
1019 arglist.addAllArgs(cmd_args, arglist.parser.tOption)
1020 arglist.addAllArgs(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +00001021 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001022 arglist.addAllArgs(cmd_args, arglist.parser.AOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001023 arglist.addLastArg(cmd_args, arglist.parser.eOption)
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001024 arglist.addAllArgs(cmd_args, arglist.parser.mSeparate)
Daniel Dunbarb644be32009-01-23 00:39:52 +00001025 arglist.addAllArgs(cmd_args, arglist.parser.rOption)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001026
1027 cmd_args.extend(arglist.render(output))
1028
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001029 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001030 if (not arglist.getLastArg(arglist.parser.AOption) and
1031 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1032 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1033 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +00001034 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001035 # Derived from darwin_dylib1 spec.
1036 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1037 cmd_args.append('-ldylib1.o')
1038 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001039 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001040 cmd_args.append('-ldylib1.o')
1041 else:
1042 cmd_args.append('-ldylib1.10.5.o')
1043 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +00001044 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001045 if not arglist.getLastArg(arglist.parser.staticOption):
1046 cmd_args.append('-lbundle1.o')
1047 else:
1048 if arglist.getLastArg(arglist.parser.pgOption):
1049 if arglist.getLastArg(arglist.parser.staticOption):
1050 cmd_args.append('-lgcrt0.o')
1051 else:
1052 if arglist.getLastArg(arglist.parser.objectOption):
1053 cmd_args.append('-lgcrt0.o')
1054 else:
1055 if arglist.getLastArg(arglist.parser.preloadOption):
1056 cmd_args.append('-lgcrt0.o')
1057 else:
1058 cmd_args.append('-lgcrt1.o')
1059
1060 # darwin_crt2 spec is empty.
1061 pass
1062 else:
1063 if arglist.getLastArg(arglist.parser.staticOption):
1064 cmd_args.append('-lcrt0.o')
1065 else:
1066 if arglist.getLastArg(arglist.parser.objectOption):
1067 cmd_args.append('-lcrt0.o')
1068 else:
1069 if arglist.getLastArg(arglist.parser.preloadOption):
1070 cmd_args.append('-lcrt0.o')
1071 else:
1072 # Derived from darwin_crt1 spec.
1073 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1074 cmd_args.append('-lcrt1.o')
1075 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001076 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001077 cmd_args.append('-lcrt1.o')
1078 else:
1079 cmd_args.append('-lcrt1.10.5.o')
1080
1081 # darwin_crt2 spec is empty.
1082 pass
1083
1084 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1085 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001086 if macosxVersion < (10,5):
Daniel Dunbar70230822009-01-21 17:18:19 +00001087 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001088
1089 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1090
1091 if arglist.getLastArg(arglist.parser.f_openmpOption):
1092 # This is more complicated in gcc...
1093 cmd_args.append('-lgomp')
1094
1095 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001096 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001097 if arglist.getValue(arch) == 'x86_64':
1098 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1099 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1100 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1101 "-L/usr/lib/gcc/%s" % tcDir,
1102 "-L/usr/lib/gcc/%s" % tcDir,
1103 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1104 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001105
Daniel Dunbara5677512009-01-05 19:53:30 +00001106 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001107 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001108
Daniel Dunbar7c584962009-01-20 21:29:14 +00001109 if linkingOutput:
1110 cmd_args.append('-arch_multiple')
1111 cmd_args.append('-final_output')
1112 cmd_args.append(arglist.getValue(linkingOutput))
1113
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001114 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1115 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1116 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1117 arglist.getLastArg(arglist.parser.coverageOption)):
1118 cmd_args.append('-lgcov')
1119
1120 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1121 cmd_args.append('-allow_stack_execute')
1122
1123 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1124 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1125 # link_ssp spec is empty.
1126
1127 # Derived from libgcc spec.
1128 if arglist.getLastArg(arglist.parser.staticOption):
1129 cmd_args.append('-lgcc_static')
1130 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1131 cmd_args.append('-lgcc_eh')
1132 cmd_args.append('-lgcc')
1133 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1134 # Derived from darwin_iphoneos_libgcc spec.
1135 cmd_args.append('-lgcc_s.10.5')
1136 cmd_args.append('-lgcc')
1137 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1138 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1139 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001140 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001141 cmd_args.append('-lgcc_s.10.4')
1142 else:
1143 cmd_args.append('-lgcc_s.10.5')
1144 cmd_args.append('-lgcc')
1145 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001146 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001147 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001148 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001149 cmd_args.append('-lgcc_s.10.5')
1150 cmd_args.append('-lgcc')
1151
1152 # Derived from lib spec.
1153 if not arglist.getLastArg(arglist.parser.staticOption):
1154 cmd_args.append('-lSystem')
1155
1156 if (not arglist.getLastArg(arglist.parser.AOption) and
1157 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1158 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1159 # endfile_spec is empty.
1160 pass
1161
1162 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1163 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1164
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001165 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1166 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001167
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001168 if (arglist.getLastArg(arglist.parser.gGroup) and
1169 not arglist.getLastArg(arglist.parser.gstabsOption) and
1170 not arglist.getLastArg(arglist.parser.g0Option)):
1171 # FIXME: This is gross, but matches gcc. The test only
1172 # considers the suffix (not the -x type), and then only of the
1173 # first input.
1174 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1175 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1176 '.c++','.cxx','.CPP','.m','.mm'):
1177 jobs.addJob(Jobs.Command('dsymutil',
1178 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001179
Daniel Dunbara5677512009-01-05 19:53:30 +00001180class LipoTool(Tool):
1181 def __init__(self):
1182 super(LipoTool, self).__init__('lipo')
1183
1184 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001185 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001186 assert outputType is Types.ImageType
1187
Daniel Dunbardb439902009-01-07 18:40:45 +00001188 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001189 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001190 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001191 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001192 jobs.addJob(Jobs.Command('lipo', cmd_args))