blob: 642732a713ac2cbdb504464c6b1a0de77c5fd2db [file] [log] [blame]
Daniel Dunbarf86e98a2009-01-12 09:23:15 +00001import os
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00002import sys # FIXME: Shouldn't be needed.
3
Daniel Dunbar378530c2009-01-05 19:53:30 +00004import Arguments
5import Jobs
Daniel Dunbar90c72cd2009-01-21 01:07:49 +00006import Phases
Daniel Dunbar378530c2009-01-05 19:53:30 +00007import Types
8
9class Tool(object):
Daniel Dunbare9f1a692009-01-06 06:12:13 +000010 """Tool - A concrete implementation of an action."""
Daniel Dunbar378530c2009-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 Dunbar31c80812009-01-20 21:29:14 +000028 def getGCCExtraArgs(self):
29 return []
30
Daniel Dunbar378530c2009-01-05 19:53:30 +000031 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +000032 output, outputType, arglist, linkingOutput):
Daniel Dunbarb3492762009-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 Dunbar31c80812009-01-20 21:29:14 +000038 cmd_args.extend(self.getGCCExtraArgs())
Daniel Dunbar378530c2009-01-05 19:53:30 +000039 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +000040 cmd_args.extend(arglist.render(arch))
Daniel Dunbar378530c2009-01-05 19:53:30 +000041 if isinstance(output, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +000042 cmd_args.extend(['-o', '-'])
Daniel Dunbar90c72cd2009-01-21 01:07:49 +000043 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarb421dba2009-01-07 18:40:45 +000044 cmd_args.append('-fsyntax-only')
Daniel Dunbar378530c2009-01-05 19:53:30 +000045 else:
Daniel Dunbar90c72cd2009-01-21 01:07:49 +000046 assert output
Daniel Dunbar1ba90982009-01-07 18:54:26 +000047 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +000048
Daniel Dunbar31c80812009-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 Dunbar306ca042009-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 Dunbar9bbf18d2009-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 Dunbar306ca042009-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 Dunbarfc2ad022009-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 Dunbar378530c2009-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 Dunbar306ca042009-01-10 02:00:04 +000083 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000084 (Tool.eFlagsPipedInput |
85 Tool.eFlagsPipedOutput))
86
Daniel Dunbar31c80812009-01-20 21:29:14 +000087 def getGCCExtraArgs(self):
88 return ['-E']
Daniel Dunbar378530c2009-01-05 19:53:30 +000089
90class GCC_CompileTool(GCC_Common_Tool):
91 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000092 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000093 (Tool.eFlagsPipedInput |
94 Tool.eFlagsPipedOutput |
95 Tool.eFlagsIntegratedCPP))
96
Daniel Dunbar31c80812009-01-20 21:29:14 +000097 def getGCCExtraArgs(self):
98 return ['-S']
Daniel Dunbar378530c2009-01-05 19:53:30 +000099
100class GCC_PrecompileTool(GCC_Common_Tool):
101 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +0000102 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbar378530c2009-01-05 19:53:30 +0000103 (Tool.eFlagsPipedInput |
104 Tool.eFlagsIntegratedCPP))
105
Daniel Dunbar31c80812009-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 Dunbar378530c2009-01-05 19:53:30 +0000121
Daniel Dunbar2dda5412009-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 Dunbar378530c2009-01-05 19:53:30 +0000127
128 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +0000129 output, outputType, arglist, linkingOutput):
Daniel Dunbar378530c2009-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 Dunbar3b246392009-01-12 07:40:25 +0000136
Daniel Dunbare5fb6792009-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 Dunbar3b246392009-01-12 07:40:25 +0000141
142 # Derived from asm spec.
Daniel Dunbar378530c2009-01-05 19:53:30 +0000143 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000144 cmd_args.extend(arglist.render(arch))
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000145 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar3b246392009-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 Dunbar80e48b72009-01-17 00:53:19 +0000149 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar3b246392009-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 Dunbar2dda5412009-01-12 07:45:49 +0000156 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000157 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbare19ed8e2009-01-17 02:02:35 +0000158 pass
Daniel Dunbar378530c2009-01-05 19:53:30 +0000159 else:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000160 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar3b246392009-01-12 07:40:25 +0000161
162 # asm_final spec is empty.
163
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000164 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
165 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000166
Daniel Dunbar786df442009-01-14 01:50:15 +0000167class Clang_CompileTool(Tool):
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000168 def __init__(self, toolChain):
Daniel Dunbar7c2f91b2009-01-14 01:03:36 +0000169 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbar786df442009-01-14 01:50:15 +0000170 (Tool.eFlagsPipedInput |
171 Tool.eFlagsPipedOutput |
172 Tool.eFlagsIntegratedCPP))
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000173 self.toolChain = toolChain
Daniel Dunbar7c2f91b2009-01-14 01:03:36 +0000174
175 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +0000176 output, outputType, arglist, linkingOutput):
Daniel Dunbar786df442009-01-14 01:50:15 +0000177 cmd_args = []
178
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000179 if isinstance(phase.phase, Phases.AnalyzePhase):
Daniel Dunbar34f60f62009-01-26 17:09:15 +0000180 assert outputType is Types.PlistType
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000181 cmd_args.append('-analyze')
182 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbar34f60f62009-01-26 17:09:15 +0000183 assert outputType is Types.NothingType
Daniel Dunbar786df442009-01-14 01:50:15 +0000184 cmd_args.append('-fsyntax-only')
Daniel Dunbar34f60f62009-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 Dunbar786df442009-01-14 01:50:15 +0000189 elif outputType is Types.AsmTypeNoPP:
190 cmd_args.append('-S')
Daniel Dunbar72999172009-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 Dunbar386a51c2009-01-14 23:26:40 +0000194 elif outputType is Types.PCHType:
Daniel Dunbar6c1eb772009-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 Dunbar386a51c2009-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 Dunbar786df442009-01-14 01:50:15 +0000211 else:
212 raise ValueError,"Unexpected output type for clang tool."
213
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000214 if isinstance(phase.phase, Phases.AnalyzePhase):
215 # Add default argument set.
216 #
217 # FIXME: Move into clang?
218 cmd_args.extend(['-warn-dead-stores',
219 '-checker-cfref',
220 '-warn-objc-methodsigs',
221 '-warn-objc-missing-dealloc',
222 '-warn-objc-unused-ivars'])
223
224 cmd_args.append('-analyzer-output-plist')
225
Daniel Dunbaraf877a42009-01-30 00:24:16 +0000226 # Add -Xanalyzer arguments when running as analyzer.
227 for arg in arglist.getArgs(arglist.parser.XanalyzerOption):
228 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000229 else:
Daniel Dunbar852b2ea2009-02-13 00:29:22 +0000230 # The make clang go fast button.
231 #
232 # FIXME: Always pass this, once analyzer is fixed to still
233 # write plist output with it.
234 cmd_args.append('-disable-free')
235
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000236 # Perform argument translation for LLVM backend. This
Daniel Dunbar3da91fe2009-01-27 20:42:58 +0000237 # takes some care in reconciling with llvm-gcc. The
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000238 # issue is that llvm-gcc translates these options based on
239 # the values in cc1, whereas we are processing based on
240 # the driver arguments.
241 #
242 # FIXME: This is currently broken for -f flags when -fno
243 # variants are present.
244
245 # This comes from the default translation the driver + cc1
246 # would do to enable flag_pic.
247 #
248 # FIXME: Centralize this code.
249 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
250 arglist.getLastArg(arglist.parser.f_picOption) or
251 arglist.getLastArg(arglist.parser.f_PIEOption) or
252 arglist.getLastArg(arglist.parser.f_pieOption) or
253 (not arglist.getLastArg(arglist.parser.m_kernelOption) and
254 not arglist.getLastArg(arglist.parser.staticOption) and
255 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)))
256
Daniel Dunbaref993d12009-01-29 06:12:22 +0000257 # FIXME: This needs to tie into a platform hook.
258 if arch:
259 archName = arglist.getValue(arch)
260 if (archName == 'x86_64' or
261 picEnabled):
262 cmd_args.append('--relocation-model=pic')
263 elif not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption):
264 cmd_args.append('--relocation-model=static')
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000265
266 if arglist.getLastArg(arglist.parser.f_timeReportOption):
267 cmd_args.append('--time-passes')
268 # FIXME: Set --enable-unsafe-fp-math.
269 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
270 cmd_args.append('--disable-fp-elim')
271 if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption):
272 cmd_args.append('--nozero-initialized-in-bss')
273 if arglist.getLastArg(arglist.parser.dAOption):
274 cmd_args.append('--asm-verbose')
275 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
276 cmd_args.append('--debug-pass=Structure')
277 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
278 cmd_args.append('--debug-pass=Arguments')
279 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
280 if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
281 cmd_args.append('--unwind-tables')
282
283 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
284 if arg:
285 cmd_args.append('--limit-float-precision')
286 cmd_args.append(arglist.getValue(arg))
287
288 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000289
Daniel Dunbar786df442009-01-14 01:50:15 +0000290 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbar786df442009-01-14 01:50:15 +0000291 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000292 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar786df442009-01-14 01:50:15 +0000293 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
294
295 # Special case debug options to only pass -g to clang. This is
296 # wrong.
297 if arglist.getLastArg(arglist.parser.gGroup):
298 cmd_args.append('-g')
299
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000300 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
301
Daniel Dunbar786df442009-01-14 01:50:15 +0000302 # FIXME: Clang isn't going to accept just anything here.
303 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
304
Daniel Dunbar386a51c2009-01-14 23:26:40 +0000305 # Automatically load .pth files which match -include options.
306 for arg in arglist.getArgs(arglist.parser.includeOption):
307 pthPath = arglist.getValue(arg) + '.pth'
308 if os.path.exists(pthPath):
309 cmd_args.append('-token-cache')
310 cmd_args.append(pthPath)
311
Mike Stump89a26692009-01-30 08:22:07 +0000312 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar786df442009-01-14 01:50:15 +0000313
Daniel Dunbar0b87db12009-02-05 02:43:38 +0000314 # Manually translate -O to -O1; let clang reject others.
315 arg = arglist.getLastArg(arglist.parser.OOption)
316 if arg:
317 if arglist.getValue(arg) == '':
318 cmd_args.append('-O1')
319 else:
320 cmd_args.extend(arglist.render(arg))
321
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000322 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
323 arglist.addLastArg(cmd_args, arglist.parser.wOption)
324 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
325
Daniel Dunbar684d1482009-02-04 21:21:08 +0000326 arglist.addAllArgs(cmd_args, arglist.parser.Clang_fGroup)
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000327
Daniel Dunbar8504f512009-02-06 19:26:48 +0000328 arglist.addLastArg(cmd_args, arglist.parser.dMOption)
329
Daniel Dunbaraf877a42009-01-30 00:24:16 +0000330 for arg in arglist.getArgs(arglist.parser.XclangOption):
331 cmd_args.extend(arglist.getValues(arg))
332
Daniel Dunbar786df442009-01-14 01:50:15 +0000333 if arch is not None:
334 cmd_args.extend(arglist.render(arch))
335
Daniel Dunbar386a51c2009-01-14 23:26:40 +0000336 if isinstance(output, Jobs.PipedJob):
337 cmd_args.extend(['-o', '-'])
Daniel Dunbar6c1eb772009-02-13 00:49:01 +0000338 elif output:
339 cmd_args.extend(arglist.render(output))
Daniel Dunbar786df442009-01-14 01:50:15 +0000340
341 for input in inputs:
342 cmd_args.append('-x')
343 cmd_args.append(input.type.name)
344 if isinstance(input.source, Jobs.PipedJob):
345 cmd_args.append('-')
346 else:
347 cmd_args.extend(arglist.renderAsInput(input.source))
348
Daniel Dunbarf677a602009-01-21 02:03:52 +0000349 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
350 cmd_args))
Daniel Dunbar786df442009-01-14 01:50:15 +0000351
Daniel Dunbar7d494092009-01-20 00:47:24 +0000352class Darwin_X86_CC1Tool(Tool):
353 def getCC1Name(self, type):
354 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000355
Daniel Dunbar7d494092009-01-20 00:47:24 +0000356 # FIXME: Get bool results from elsewhere.
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000357 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000358 return 'cc1',True,False
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000359 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000360 return 'cc1',False,False
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000361 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000362 return 'cc1obj',True,False
Daniel Dunbar1ddfb122009-01-23 00:04:43 +0000363 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000364 return 'cc1obj',True,False
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000365 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000366 return 'cc1plus',True,True
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000367 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000368 return 'cc1plus',False,True
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000369 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000370 return 'cc1objplus',True,True
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000371 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar7d494092009-01-20 00:47:24 +0000372 return 'cc1objplus',False,True
373 else:
374 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000375
376 def addCC1Args(self, cmd_args, arch, arglist):
377 # Derived from cc1 spec.
378
379 # FIXME: -fapple-kext seems to disable this too. Investigate.
380 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
381 not arglist.getLastArg(arglist.parser.staticOption) and
382 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
383 cmd_args.append('-fPIC')
384
385 # FIXME: Remove mthumb
386 # FIXME: Remove mno-thumb
387
388 # FIXME: As with ld, something else is going on. My best guess
389 # is gcc is faking an -mmacosx-version-min
390 # somewhere. Investigate.
Daniel Dunbar0d26f832009-01-13 04:51:51 +0000391# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
392# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
393# cmd_args.append('-mmacosx-version-min=' +
394# self.toolChain.getMacosxVersionMin())
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000395
396 # FIXME: Remove faltivec
397 # FIXME: Remove mno-fused-madd
398 # FIXME: Remove mlong-branch
399 # FIXME: Remove mlongcall
400 # FIXME: Remove mcpu=G4
401 # FIXME: Remove mcpu=G5
402
Daniel Dunbar6e524b62009-01-16 21:07:21 +0000403 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000404 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
405 cmd_args.append('-feliminate-unused-debug-symbols')
406
Daniel Dunbar7d494092009-01-20 00:47:24 +0000407 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000408 # Derived from cc1_options spec.
409 if (arglist.getLastArg(arglist.parser.fastOption) or
410 arglist.getLastArg(arglist.parser.fastfOption) or
411 arglist.getLastArg(arglist.parser.fastcpOption)):
412 cmd_args.append('-O3')
413
414 if (arglist.getLastArg(arglist.parser.pgOption) and
415 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbara0026f22009-01-16 23:12:12 +0000416 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000417
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000418 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000419
420 if not arglist.getLastArg(arglist.parser.QOption):
421 cmd_args.append('-quiet')
422
423 cmd_args.append('-dumpbase')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000424 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000425
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000426 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar0d26f832009-01-13 04:51:51 +0000427
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000428 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
429 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000430
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000431 # FIXME: The goal is to use the user provided -o if that is
432 # our final output, otherwise to drive from the original input
Daniel Dunbar14972152009-01-14 03:31:16 +0000433 # name. Find a clean way to go about this.
434 if (arglist.getLastArg(arglist.parser.cOption) or
435 arglist.getLastArg(arglist.parser.SOption)):
436 outputOpt = arglist.getLastArg(arglist.parser.oOption)
437 if outputOpt:
438 cmd_args.append('-auxbase-strip')
439 cmd_args.append(arglist.getValue(outputOpt))
440 else:
441 cmd_args.append('-auxbase')
442 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000443 else:
444 cmd_args.append('-auxbase')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000445 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000446
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000447 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000448
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000449 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
450 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000451 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000452 arglist.addLastArg(cmd_args, arglist.parser.wOption)
453 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
454 if arglist.getLastArg(arglist.parser.vOption):
455 cmd_args.append('-version')
456 if arglist.getLastArg(arglist.parser.pgOption):
457 cmd_args.append('-p')
458 arglist.addLastArg(cmd_args, arglist.parser.pOption)
459
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000460 # ccc treats -fsyntax-only specially.
461 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
462 arglist.parser.syntaxOnlyOption)
Mike Stump89a26692009-01-30 08:22:07 +0000463 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000464
Daniel Dunbar7d494092009-01-20 00:47:24 +0000465 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000466 if arglist.getLastArg(arglist.parser.QnOption):
467 cmd_args.append('-fno-ident')
468
469 # FIXME: This isn't correct.
470 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
471 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
472
Daniel Dunbar7d494092009-01-20 00:47:24 +0000473 if output_args:
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000474 cmd_args.extend(output_args)
475
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000476 # FIXME: Still don't get what is happening here. Investigate.
477 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
478
479 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
480 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
481 cmd_args.append('-fno-builtin')
482 cmd_args.append('-fno-merge-constants')
483
484 if arglist.getLastArg(arglist.parser.coverageOption):
485 cmd_args.append('-fprofile-arcs')
486 cmd_args.append('-ftest-coverage')
487
Daniel Dunbar78477e02009-01-14 00:06:14 +0000488 if isCXX:
489 cmd_args.append('-D__private_extern__=extern')
490
Daniel Dunbar7d494092009-01-20 00:47:24 +0000491 def getBaseInputName(self, inputs, arglist):
492 # FIXME: gcc uses a temporary name here when the base
493 # input is stdin, but only in auxbase. Investigate.
494 baseInputValue = arglist.getValue(inputs[0].baseInput)
495 return os.path.basename(baseInputValue)
496
497 def getBaseInputStem(self, inputs, arglist):
498 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
499
500 def getOutputArgs(self, arglist, output, isCPP=False):
501 if isinstance(output, Jobs.PipedJob):
502 if isCPP:
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000503 return []
Daniel Dunbar7d494092009-01-20 00:47:24 +0000504 else:
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000505 return ['-o', '-']
Daniel Dunbar7d494092009-01-20 00:47:24 +0000506 elif output is None:
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000507 return ['-o', '/dev/null']
Daniel Dunbar7d494092009-01-20 00:47:24 +0000508 else:
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000509 return arglist.render(output)
Daniel Dunbar7d494092009-01-20 00:47:24 +0000510
511 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
512 output_args, isCXX):
513 # Derived from cpp_options.
514 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
515
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000516 cmd_args.extend(output_args)
517
Daniel Dunbar7d494092009-01-20 00:47:24 +0000518 self.addCC1Args(cmd_args, arch, arglist)
519
520 # NOTE: The code below has some commonality with cpp_options,
521 # but in classic gcc style ends up sending things in different
522 # orders. This may be a good merge candidate once we drop
523 # pedantic compatibility.
524
525 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
526 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
527 arglist.parser.ansiOption,
528 arglist.parser.trigraphsOption)
529 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
530 arglist.parser.pedanticGroup)
531 arglist.addLastArg(cmd_args, arglist.parser.wOption)
532
533 # ccc treats -fsyntax-only specially.
534 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
535 arglist.parser.syntaxOnlyOption)
Mike Stump89a26692009-01-30 08:22:07 +0000536 arglist.addAllArgs(cmd_args, arglist.parser.fblocksGroup)
Daniel Dunbar7d494092009-01-20 00:47:24 +0000537
538 if (arglist.getLastArg(arglist.parser.gGroup) and
539 not arglist.getLastArg(arglist.parser.g0Option) and
540 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
541 cmd_args.append('-fworking-directory')
542
543 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
544 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
545 if arglist.getLastArg(arglist.parser.saveTempsOption):
546 cmd_args.append('-fpch-preprocess')
547
548 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
549 # Derived from cpp_unique_options.
550
551 if (arglist.getLastArg(arglist.parser.COption) or
552 arglist.getLastArg(arglist.parser.CCOption)):
553 if not arglist.getLastArg(arglist.parser.EOption):
554 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
555 if not arglist.getLastArg(arglist.parser.QOption):
556 cmd_args.append('-quiet')
557 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
558 arglist.addLastArg(cmd_args, arglist.parser.vOption)
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000559 arglist.addAllArgs2(cmd_args, arglist.parser.IGroup, arglist.parser.FOption)
Daniel Dunbar7d494092009-01-20 00:47:24 +0000560 arglist.addLastArg(cmd_args, arglist.parser.POption)
561
562 # FIXME: Handle %I properly.
563 if arglist.getValue(arch) == 'x86_64':
564 cmd_args.append('-imultilib')
565 cmd_args.append('x86_64')
566
567 if arglist.getLastArg(arglist.parser.MDOption):
568 cmd_args.append('-MD')
569 # FIXME: Think about this more.
570 outputOpt = arglist.getLastArg(arglist.parser.oOption)
571 if outputOpt:
572 base,ext = os.path.splitext(arglist.getValue(outputOpt))
573 cmd_args.append(base+'.d')
574 else:
575 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
576 if arglist.getLastArg(arglist.parser.MMDOption):
577 cmd_args.append('-MMD')
578 # FIXME: Think about this more.
579 outputOpt = arglist.getLastArg(arglist.parser.oOption)
580 if outputOpt:
581 base,ext = os.path.splitext(arglist.getValue(outputOpt))
582 cmd_args.append(base+'.d')
583 else:
584 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
585 arglist.addLastArg(cmd_args, arglist.parser.MOption)
586 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
587 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
588 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
589 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
590 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
591 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
592 if (not arglist.getLastArg(arglist.parser.MOption) and
593 not arglist.getLastArg(arglist.parser.MMOption) and
594 (arglist.getLastArg(arglist.parser.MDOption) or
595 arglist.getLastArg(arglist.parser.MMDOption))):
596 outputOpt = arglist.getLastArg(arglist.parser.oOption)
597 if outputOpt:
598 cmd_args.append('-MQ')
599 cmd_args.append(arglist.getValue(outputOpt))
600
601 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
602 if arglist.getLastArg(arglist.parser.g3Option):
603 cmd_args.append('-dD')
604 arglist.addLastArg(cmd_args, arglist.parser.HOption)
605
606 self.addCPPArgs(cmd_args, arch, arglist)
607
608 arglist.addAllArgs3(cmd_args,
609 arglist.parser.DOption,
610 arglist.parser.UOption,
611 arglist.parser.AOption)
612
613 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
614
615 for input in inputs:
616 if isinstance(input.source, Jobs.PipedJob):
617 cmd_args.append('-')
618 else:
619 cmd_args.extend(arglist.renderAsInput(input.source))
620
621 for arg in arglist.getArgs2(arglist.parser.WpOption,
622 arglist.parser.XpreprocessorOption):
623 cmd_args.extend(arglist.getValues(arg))
624
625 if arglist.getLastArg(arglist.parser.f_mudflapOption):
626 cmd_args.append('-D_MUDFLAP')
627 cmd_args.append('-include')
628 cmd_args.append('mf-runtime.h')
629
630 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
631 cmd_args.append('-D_MUDFLAP')
632 cmd_args.append('-D_MUDFLAPTH')
633 cmd_args.append('-include')
634 cmd_args.append('mf-runtime.h')
635
636 def addCPPArgs(self, cmd_args, arch, arglist):
637 # Derived from cpp spec.
638
639 if arglist.getLastArg(arglist.parser.staticOption):
640 # The gcc spec is broken here, it refers to dynamic but
641 # that has been translated. Start by being bug compatible.
642
643 # if not arglist.getLastArg(arglist.parser.dynamicOption):
644 cmd_args.append('-D__STATIC__')
645 else:
646 cmd_args.append('-D__DYNAMIC__')
647
648 if arglist.getLastArg(arglist.parser.pthreadOption):
649 cmd_args.append('-D_REENTRANT')
650
651class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
652 def __init__(self, toolChain):
653 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
654 (Tool.eFlagsPipedInput |
655 Tool.eFlagsPipedOutput))
656 self.toolChain = toolChain
657
658 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +0000659 output, outputType, arglist, linkingOutput):
Daniel Dunbar7d494092009-01-20 00:47:24 +0000660 inputType = inputs[0].type
661 assert not [i for i in inputs if i.type != inputType]
662
663 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
664
665 cmd_args = ['-E']
666 if (arglist.getLastArg(arglist.parser.traditionalOption) or
667 arglist.getLastArg(arglist.parser.f_traditionalOption) or
668 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
669 cmd_args.append('-traditional-cpp')
670
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000671 output_args = self.getOutputArgs(arglist, output,
672 isCPP=True)
Daniel Dunbar7d494092009-01-20 00:47:24 +0000673 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000674 output_args, isCXX)
Daniel Dunbar7d494092009-01-20 00:47:24 +0000675
676 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
677
678 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
679 cmd_args))
680
681class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
682 def __init__(self, toolChain):
683 super(Darwin_X86_CompileTool, self).__init__('cc1',
684 (Tool.eFlagsPipedInput |
685 Tool.eFlagsPipedOutput |
686 Tool.eFlagsIntegratedCPP))
687 self.toolChain = toolChain
688
689 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +0000690 output, outputType, arglist, linkingOutput):
Daniel Dunbar7d494092009-01-20 00:47:24 +0000691 inputType = inputs[0].type
692 assert not [i for i in inputs if i.type != inputType]
693
694 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
695
696 cmd_args = []
697 if (arglist.getLastArg(arglist.parser.traditionalOption) or
698 arglist.getLastArg(arglist.parser.f_traditionalOption)):
699 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
700
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000701 if outputType is Types.PCHType:
Daniel Dunbar34f60f62009-01-26 17:09:15 +0000702 pass
703 elif outputType is Types.AsmTypeNoPP:
704 pass
705 elif outputType is Types.LLVMAsmType:
706 cmd_args.append('-emit-llvm')
707 elif outputType is Types.LLVMBCType:
708 cmd_args.append('-emit-llvm-bc')
709
710 if outputType is Types.PCHType:
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000711 output_args = []
712 else:
713 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000714
715 # There is no need for this level of compatibility, but it
716 # makes diffing easier.
717 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
718 not arglist.getLastArg(arglist.parser.SOption)):
719 early_output_args, end_output_args = [], output_args
720 else:
721 early_output_args, end_output_args = output_args, []
722
Daniel Dunbar7d494092009-01-20 00:47:24 +0000723 if usePP:
724 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
725 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
726 early_output_args, isCXX)
727 cmd_args.extend(end_output_args)
728 else:
729 cmd_args.append('-fpreprocessed')
730
731 # FIXME: There is a spec command to remove
732 # -fpredictive-compilation args here. Investigate.
733
734 for input in inputs:
735 if isinstance(input.source, Jobs.PipedJob):
736 cmd_args.append('-')
737 else:
738 cmd_args.extend(arglist.renderAsInput(input.source))
739
740 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
741 early_output_args, isCXX)
742 cmd_args.extend(end_output_args)
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000743
Daniel Dunbar5ee4aa72009-01-20 05:51:52 +0000744 if outputType is Types.PCHType:
745 assert output is not None and not isinstance(output, Jobs.PipedJob)
746
747 cmd_args.append('-o')
748 # NOTE: gcc uses a temp .s file for this, but there
749 # doesn't seem to be a good reason.
750 cmd_args.append('/dev/null')
751
752 cmd_args.append('--output-pch=')
753 cmd_args.append(arglist.getValue(output))
754
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000755 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
756 cmd_args))
757
Daniel Dunbarc2148562009-01-12 04:21:12 +0000758class Darwin_X86_LinkTool(Tool):
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000759 def __init__(self, toolChain):
Daniel Dunbarc2148562009-01-12 04:21:12 +0000760 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000761 self.toolChain = toolChain
Daniel Dunbarc2148562009-01-12 04:21:12 +0000762
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000763 def getMacosxVersionTuple(self, arglist):
764 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
765 if arg:
766 version = arglist.getValue(arg)
767 components = version.split('.')
768 try:
769 return tuple(map(int, components))
770 except:
Daniel Dunbara0026f22009-01-16 23:12:12 +0000771 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000772 else:
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000773 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000774 return (10, major-4, minor)
775
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000776 def addDarwinArch(self, cmd_args, arch, arglist):
777 # Derived from darwin_arch spec.
778 cmd_args.append('-arch')
779 # FIXME: The actual spec uses -m64 for this, but we want to
780 # respect arch. Figure out what exactly gcc is doing.
781 #if arglist.getLastArg(arglist.parser.m_64Option):
782 if arglist.getValue(arch) == 'x86_64':
783 cmd_args.append('x86_64')
784 else:
785 cmd_args.append('i386')
786
787 def addDarwinSubArch(self, cmd_args, arch, arglist):
788 # Derived from darwin_subarch spec, not sure what the
789 # distinction exists for but at least for this chain it is the same.
790 return self.addDarwinArch(cmd_args, arch, arglist)
791
792 def addLinkArgs(self, cmd_args, arch, arglist):
793 # Derived from link spec.
Daniel Dunbar7e184602009-01-16 20:25:36 +0000794 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
795 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000796 cmd_args.append('-dynamic')
797 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
798 # FIXME: Replace -lobjc in forward args with
799 # -lobjc-gnu. How do we wish to handle such things?
800 pass
801
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000802 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
803 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000804 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson751a9622009-01-18 02:54:30 +0000805 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000806 else:
807 self.addDarwinSubArch(cmd_args, arch, arglist)
808
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000809 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000810 cmd_args.append('-bundle')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000811 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000812 '-bundle_loader')
813 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
814 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
815 # FIXME: Where should diagnostics go?
816 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
817 sys.exit(1)
818 if arglist.getLastArg(arglist.parser.current_versionOption):
819 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
820 sys.exit(1)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000821 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000822 cmd_args.append('-force_flat_namespace')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000823 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000824 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
825 sys.exit(1)
826 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
827 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
828 else:
829 cmd_args.append('-dylib')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000830 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000831 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
832 sys.exit(1)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000833 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000834 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
835 sys.exit(1)
836 if arglist.getLastArg(arglist.parser.client_nameOption):
837 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
838 sys.exit(1)
839 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
840 '-dylib_compatibility_version')
841 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
842 '-dylib_current_version')
843
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000844 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000845 self.addDarwinArch(cmd_args, arch, arglist)
846 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
847 else:
848 self.addDarwinSubArch(cmd_args, arch, arglist)
849
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000850 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000851 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
852 sys.exit(1)
853
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000854 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000855 '-dylib_install_name')
856
857 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
858 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
859 sys.exit(1)
860 if arglist.getLastArg(arglist.parser.private_bundleOption):
861 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
862 sys.exit(1)
863
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000864 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000865 cmd_args.append('-all_load')
866
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000867 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000868 '-allowable_client')
869
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000870 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000871 cmd_args.append('-bind_at_load')
872
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000873 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000874 cmd_args.append('-dead_strip')
875
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000876 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000877 cmd_args.append('-no_dead_strip_inits_and_terms')
878
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000879 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000880 '-dylib_file')
881
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000882 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000883 cmd_args.append('-dynamic')
884
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000885 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000886 '-exported_symbols_list')
887
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000888 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000889 cmd_args.append('-flat_namespace')
890
891 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000892 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000893 '-image_base')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000894 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000895 '-init')
896
897 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
898 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
899 # FIXME: I don't understand what is going on
900 # here. This is supposed to come from
901 # darwin_ld_minversion, but gcc doesn't seem to be
902 # following that; it must be getting over-ridden
903 # somewhere.
904 cmd_args.append('-macosx_version_min')
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000905 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000906 else:
907 # addAll doesn't make sense here but this is what gcc
908 # does.
909 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
910 '-macosx_version_min')
911
912 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
913 '-iphoneos_version_min')
914 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
915
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000916 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000917 cmd_args.append('-multi_module')
918
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000919 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000920 cmd_args.append('-single_module')
921
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000922 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000923 '-multiply_defined')
924
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000925 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000926 '-multiply_defined_unused')
927
928 if arglist.getLastArg(arglist.parser.f_pieOption):
929 cmd_args.append('-pie')
930
931 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
932 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
933 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
934 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
935 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
936 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
937 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
938 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
939 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000940 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000941 '-segaddr')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000942 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000943 '-segs_read_only_addr')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000944 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000945 '-segs_read_write_addr')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000946 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000947 '-seg_addr_table')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000948 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
949 '-seg_addr_table_filename')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000950 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
951 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
952 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
953 '-syslibroot')
954 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
955 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000956 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000957 '-umbrella')
958 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000959 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000960 '-unexported_symbols_list')
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000961 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000962 '-weak_reference_mismatches')
963
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000964 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000965 cmd_args.append('-weak_reference_mismatches')
966 cmd_args.append('non-weak')
967
968 arglist.addLastArg(cmd_args, arglist.parser.XOption)
969 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
970 arglist.addLastArg(cmd_args, arglist.parser.wOption)
971 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
972 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
973 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
974 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
975 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
976 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
977 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
978 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
979 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
980 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
981 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
982 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000983
984 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +0000985 output, outputType, arglist, linkingOutput):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000986 assert outputType is Types.ImageType
987
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000988 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbar08292932009-01-12 02:24:21 +0000989 # comes from specs (starting with link_command). Consult gcc
990 # for more information.
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000991
992 # FIXME: gcc's spec controls when this is done; certain things
993 # like -filelist or -Wl, still trigger a link stage. I don't
994 # quite understand how gcc decides to execute the linker,
995 # investigate. Also, the spec references -fdump= which seems
996 # to have disappeared?
Daniel Dunbar378530c2009-01-05 19:53:30 +0000997 cmd_args = []
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000998
999 # Not sure why this particular decomposition exists in gcc.
1000 self.addLinkArgs(cmd_args, arch, arglist)
1001
Daniel Dunbar08292932009-01-12 02:24:21 +00001002 # This toolchain never accumlates options in specs, the only
1003 # place this gets used is to add -ObjC.
1004 if (arglist.getLastArg(arglist.parser.ObjCOption) or
1005 arglist.getLastArg(arglist.parser.f_objcOption)):
1006 cmd_args.append('-ObjC')
1007 if arglist.getLastArg(arglist.parser.ObjCXXOption):
1008 cmd_args.append('-ObjC')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001009
1010 # FIXME: gcc has %{x} in here. How could this ever happen?
1011 # Cruft?
Daniel Dunbar1765dcd2009-01-23 00:39:52 +00001012 arglist.addAllArgs(cmd_args, arglist.parser.dOption)
1013 arglist.addAllArgs(cmd_args, arglist.parser.sOption)
1014 arglist.addAllArgs(cmd_args, arglist.parser.tOption)
1015 arglist.addAllArgs(cmd_args, arglist.parser.ZOption)
Daniel Dunbar7d494092009-01-20 00:47:24 +00001016 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar1765dcd2009-01-23 00:39:52 +00001017 arglist.addAllArgs(cmd_args, arglist.parser.AOption)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001018 arglist.addLastArg(cmd_args, arglist.parser.eOption)
Daniel Dunbar199faa22009-01-23 20:08:16 +00001019 arglist.addAllArgs(cmd_args, arglist.parser.mSeparate)
Daniel Dunbar1765dcd2009-01-23 00:39:52 +00001020 arglist.addAllArgs(cmd_args, arglist.parser.rOption)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001021
1022 cmd_args.extend(arglist.render(output))
1023
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001024 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001025 if (not arglist.getLastArg(arglist.parser.AOption) and
1026 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1027 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1028 # Derived from startfile spec.
Daniel Dunbar80e48b72009-01-17 00:53:19 +00001029 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001030 # Derived from darwin_dylib1 spec.
1031 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1032 cmd_args.append('-ldylib1.o')
1033 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001034 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001035 cmd_args.append('-ldylib1.o')
1036 else:
1037 cmd_args.append('-ldylib1.10.5.o')
1038 else:
Daniel Dunbar80e48b72009-01-17 00:53:19 +00001039 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001040 if not arglist.getLastArg(arglist.parser.staticOption):
1041 cmd_args.append('-lbundle1.o')
1042 else:
1043 if arglist.getLastArg(arglist.parser.pgOption):
1044 if arglist.getLastArg(arglist.parser.staticOption):
1045 cmd_args.append('-lgcrt0.o')
1046 else:
1047 if arglist.getLastArg(arglist.parser.objectOption):
1048 cmd_args.append('-lgcrt0.o')
1049 else:
1050 if arglist.getLastArg(arglist.parser.preloadOption):
1051 cmd_args.append('-lgcrt0.o')
1052 else:
1053 cmd_args.append('-lgcrt1.o')
1054
1055 # darwin_crt2 spec is empty.
1056 pass
1057 else:
1058 if arglist.getLastArg(arglist.parser.staticOption):
1059 cmd_args.append('-lcrt0.o')
1060 else:
1061 if arglist.getLastArg(arglist.parser.objectOption):
1062 cmd_args.append('-lcrt0.o')
1063 else:
1064 if arglist.getLastArg(arglist.parser.preloadOption):
1065 cmd_args.append('-lcrt0.o')
1066 else:
1067 # Derived from darwin_crt1 spec.
1068 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1069 cmd_args.append('-lcrt1.o')
1070 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001071 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001072 cmd_args.append('-lcrt1.o')
1073 else:
1074 cmd_args.append('-lcrt1.10.5.o')
1075
1076 # darwin_crt2 spec is empty.
1077 pass
1078
1079 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1080 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001081 if macosxVersion < (10,5):
Daniel Dunbare28f9e92009-01-21 17:18:19 +00001082 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001083
1084 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1085
1086 if arglist.getLastArg(arglist.parser.f_openmpOption):
1087 # This is more complicated in gcc...
1088 cmd_args.append('-lgomp')
1089
1090 # FIXME: Derive these correctly.
Daniel Dunbar2dda5412009-01-12 07:45:49 +00001091 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbarc2148562009-01-12 04:21:12 +00001092 if arglist.getValue(arch) == 'x86_64':
1093 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1094 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1095 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1096 "-L/usr/lib/gcc/%s" % tcDir,
1097 "-L/usr/lib/gcc/%s" % tcDir,
1098 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1099 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001100
Daniel Dunbar378530c2009-01-05 19:53:30 +00001101 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +00001102 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001103
Daniel Dunbar31c80812009-01-20 21:29:14 +00001104 if linkingOutput:
1105 cmd_args.append('-arch_multiple')
1106 cmd_args.append('-final_output')
1107 cmd_args.append(arglist.getValue(linkingOutput))
1108
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001109 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1110 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1111 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1112 arglist.getLastArg(arglist.parser.coverageOption)):
1113 cmd_args.append('-lgcov')
1114
1115 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1116 cmd_args.append('-allow_stack_execute')
1117
1118 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1119 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1120 # link_ssp spec is empty.
1121
1122 # Derived from libgcc spec.
1123 if arglist.getLastArg(arglist.parser.staticOption):
1124 cmd_args.append('-lgcc_static')
1125 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1126 cmd_args.append('-lgcc_eh')
1127 cmd_args.append('-lgcc')
1128 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1129 # Derived from darwin_iphoneos_libgcc spec.
1130 cmd_args.append('-lgcc_s.10.5')
1131 cmd_args.append('-lgcc')
1132 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1133 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1134 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001135 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001136 cmd_args.append('-lgcc_s.10.4')
1137 else:
1138 cmd_args.append('-lgcc_s.10.5')
1139 cmd_args.append('-lgcc')
1140 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001141 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001142 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar37d54e92009-01-12 05:02:38 +00001143 if macosxVersion >= (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001144 cmd_args.append('-lgcc_s.10.5')
1145 cmd_args.append('-lgcc')
1146
1147 # Derived from lib spec.
1148 if not arglist.getLastArg(arglist.parser.staticOption):
1149 cmd_args.append('-lSystem')
1150
1151 if (not arglist.getLastArg(arglist.parser.AOption) and
1152 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1153 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1154 # endfile_spec is empty.
1155 pass
1156
1157 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1158 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1159
Daniel Dunbar2dda5412009-01-12 07:45:49 +00001160 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1161 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +00001162
Daniel Dunbar0d51cf72009-01-13 06:44:28 +00001163 if (arglist.getLastArg(arglist.parser.gGroup) and
1164 not arglist.getLastArg(arglist.parser.gstabsOption) and
1165 not arglist.getLastArg(arglist.parser.g0Option)):
1166 # FIXME: This is gross, but matches gcc. The test only
1167 # considers the suffix (not the -x type), and then only of the
1168 # first input.
1169 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1170 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1171 '.c++','.cxx','.CPP','.m','.mm'):
1172 jobs.addJob(Jobs.Command('dsymutil',
1173 arglist.renderAsInput(output)))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001174
Daniel Dunbar378530c2009-01-05 19:53:30 +00001175class LipoTool(Tool):
1176 def __init__(self):
1177 super(LipoTool, self).__init__('lipo')
1178
1179 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar31c80812009-01-20 21:29:14 +00001180 output, outputType, arglist, linkingOutput):
Daniel Dunbar378530c2009-01-05 19:53:30 +00001181 assert outputType is Types.ImageType
1182
Daniel Dunbarb421dba2009-01-07 18:40:45 +00001183 cmd_args = ['-create']
Daniel Dunbar1ba90982009-01-07 18:54:26 +00001184 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +00001185 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +00001186 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +00001187 jobs.addJob(Jobs.Command('lipo', cmd_args))