blob: bc10081dc10dd1be65da71a9568336751f85e4b9 [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
6import Types
7
8class Tool(object):
Daniel Dunbare9f1a692009-01-06 06:12:13 +00009 """Tool - A concrete implementation of an action."""
Daniel Dunbar378530c2009-01-05 19:53:30 +000010
11 eFlagsPipedInput = 1 << 0
12 eFlagsPipedOutput = 1 << 1
13 eFlagsIntegratedCPP = 1 << 2
14
15 def __init__(self, name, flags = 0):
16 self.name = name
17 self.flags = flags
18
19 def acceptsPipedInput(self):
20 return not not (self.flags & Tool.eFlagsPipedInput)
21 def canPipeOutput(self):
22 return not not (self.flags & Tool.eFlagsPipedOutput)
23 def hasIntegratedCPP(self):
24 return not not (self.flags & Tool.eFlagsIntegratedCPP)
25
26class GCC_Common_Tool(Tool):
27 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +000028 output, outputType, arglist,
Daniel Dunbar378530c2009-01-05 19:53:30 +000029 extraArgs):
Daniel Dunbarb3492762009-01-13 18:51:26 +000030 cmd_args = []
31 for arg in arglist.args:
32 if arg.opt.forwardToGCC():
33 cmd_args.extend(arglist.render(arg))
34
35 cmd_args.extend(extraArgs)
Daniel Dunbar378530c2009-01-05 19:53:30 +000036 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +000037 cmd_args.extend(arglist.render(arch))
Daniel Dunbar378530c2009-01-05 19:53:30 +000038 if isinstance(output, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +000039 cmd_args.extend(['-o', '-'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000040 elif output is None:
Daniel Dunbarb421dba2009-01-07 18:40:45 +000041 cmd_args.append('-fsyntax-only')
Daniel Dunbar378530c2009-01-05 19:53:30 +000042 else:
Daniel Dunbar1ba90982009-01-07 18:54:26 +000043 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +000044
Daniel Dunbar306ca042009-01-10 02:00:04 +000045 # Only pass -x if gcc will understand it; otherwise hope gcc
46 # understands the suffix correctly. The main use case this
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +000047 # would go wrong in is for linker inputs if they happened to
48 # have an odd suffix; really the only way to get this to
49 # happen is a command like '-x foobar a.c' which will treat
50 # a.c like a linker input.
Daniel Dunbar306ca042009-01-10 02:00:04 +000051 #
52 # FIXME: For the linker case specifically, can we safely
53 # convert inputs into '-Wl,' options?
54 for input in inputs:
55 if input.type.canBeUserSpecified:
56 cmd_args.extend(['-x', input.type.name])
57
58 if isinstance(input.source, Jobs.PipedJob):
59 cmd_args.append('-')
60 else:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +000061 assert isinstance(input.source, Arguments.Arg)
62 # If this is a linker input then assume we can forward
63 # just by rendering.
64 if input.source.opt.isLinkerInput:
65 cmd_args.extend(arglist.render(input.source))
66 else:
67 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +000068
69 jobs.addJob(Jobs.Command('gcc', cmd_args))
70
71class GCC_PreprocessTool(GCC_Common_Tool):
72 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000073 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000074 (Tool.eFlagsPipedInput |
75 Tool.eFlagsPipedOutput))
76
77 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +000078 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000079 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +000080 output, outputType, arglist,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000081 ['-E'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000082
83class GCC_CompileTool(GCC_Common_Tool):
84 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000085 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000086 (Tool.eFlagsPipedInput |
87 Tool.eFlagsPipedOutput |
88 Tool.eFlagsIntegratedCPP))
89
90 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +000091 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000092 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +000093 output, outputType, arglist,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000094 ['-S'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000095
96class GCC_PrecompileTool(GCC_Common_Tool):
97 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000098 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000099 (Tool.eFlagsPipedInput |
100 Tool.eFlagsIntegratedCPP))
101
102 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000103 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000104 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000105 output, outputType, arglist,
Daniel Dunbar378530c2009-01-05 19:53:30 +0000106 [])
107
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000108class Darwin_AssembleTool(Tool):
109 def __init__(self, toolChain):
110 super(Darwin_AssembleTool, self).__init__('as',
111 Tool.eFlagsPipedInput)
112 self.toolChain = toolChain
Daniel Dunbar378530c2009-01-05 19:53:30 +0000113
114 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000115 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000116 assert len(inputs) == 1
117 assert outputType is Types.ObjectType
118
119 input = inputs[0]
120
121 cmd_args = []
Daniel Dunbar3b246392009-01-12 07:40:25 +0000122
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000123 # Bit of a hack, this is only used for original inputs.
124 if input.isOriginalInput():
125 if arglist.getLastArg(arglist.parser.gGroup):
126 cmd_args.append('--gstabs')
Daniel Dunbar3b246392009-01-12 07:40:25 +0000127
128 # Derived from asm spec.
Daniel Dunbar378530c2009-01-05 19:53:30 +0000129 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000130 cmd_args.extend(arglist.render(arch))
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000131 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar3b246392009-01-12 07:40:25 +0000132 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
133 arglist.getLastArg(arglist.parser.staticOption) or
134 arglist.getLastArg(arglist.parser.f_appleKextOption)):
135 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
136 cmd_args.append('-static')
137
138 for arg in arglist.getArgs2(arglist.parser.WaOption,
139 arglist.parser.XassemblerOption):
140 cmd_args.extend(arglist.getValues(arg))
141
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000142 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000143 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000144 cmd_args.append('-')
Daniel Dunbar378530c2009-01-05 19:53:30 +0000145 else:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000146 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar3b246392009-01-12 07:40:25 +0000147
148 # asm_final spec is empty.
149
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000150 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
151 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000152
Daniel Dunbar306ca042009-01-10 02:00:04 +0000153class GCC_AssembleTool(GCC_Common_Tool):
154 def __init__(self):
155 # We can't generally assume the assembler can take or output
156 # on pipes.
157 super(GCC_AssembleTool, self).__init__('gcc (as)')
158
159 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000160 output, outputType, arglist):
Daniel Dunbar306ca042009-01-10 02:00:04 +0000161 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000162 output, outputType, arglist,
Daniel Dunbar306ca042009-01-10 02:00:04 +0000163 ['-c'])
164
165class GCC_LinkTool(GCC_Common_Tool):
166 def __init__(self):
167 super(GCC_LinkTool, self).__init__('gcc (ld)')
168
169 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000170 output, outputType, arglist):
Daniel Dunbar306ca042009-01-10 02:00:04 +0000171 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000172 output, outputType, arglist,
Daniel Dunbar306ca042009-01-10 02:00:04 +0000173 [])
174
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000175class Darwin_X86_CompileTool(Tool):
176 def __init__(self, toolChain):
177 super(Darwin_X86_CompileTool, self).__init__('cc1',
178 (Tool.eFlagsPipedInput |
179 Tool.eFlagsPipedOutput |
180 Tool.eFlagsIntegratedCPP))
181 self.toolChain = toolChain
182
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000183 def addCPPArgs(self, cmd_args, arch, arglist):
184 # Derived from cpp spec.
185
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000186 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbarb285d712009-01-13 01:04:40 +0000187 # The gcc spec is broken here, it refers to dynamic but
188 # that has been translated. Start by being bug compatible.
189
190 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
191 cmd_args.append('-D__STATIC__')
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000192 else:
193 cmd_args.append('-D__DYNAMIC__')
194
195 if arglist.getLastArg(arglist.parser.pthreadOption):
196 cmd_args.append('-D_REENTRANT')
197
198 def addCC1Args(self, cmd_args, arch, arglist):
199 # Derived from cc1 spec.
200
201 # FIXME: -fapple-kext seems to disable this too. Investigate.
202 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
203 not arglist.getLastArg(arglist.parser.staticOption) and
204 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
205 cmd_args.append('-fPIC')
206
207 # FIXME: Remove mthumb
208 # FIXME: Remove mno-thumb
209
210 # FIXME: As with ld, something else is going on. My best guess
211 # is gcc is faking an -mmacosx-version-min
212 # somewhere. Investigate.
Daniel Dunbar0d26f832009-01-13 04:51:51 +0000213# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
214# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
215# cmd_args.append('-mmacosx-version-min=' +
216# self.toolChain.getMacosxVersionMin())
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000217
218 # FIXME: Remove faltivec
219 # FIXME: Remove mno-fused-madd
220 # FIXME: Remove mlong-branch
221 # FIXME: Remove mlongcall
222 # FIXME: Remove mcpu=G4
223 # FIXME: Remove mcpu=G5
224
Daniel Dunbarb3492762009-01-13 18:51:26 +0000225 if (arglist.getLastArg(arglist.parser.gGroup) and
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000226 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
227 cmd_args.append('-feliminate-unused-debug-symbols')
228
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000229 def getBaseInputName(self, inputs, arglist):
230 # FIXME: gcc uses a temporary name here when the base
231 # input is stdin, but only in auxbase. Investigate.
232 baseInputValue = arglist.getValue(inputs[0].baseInput)
233 return os.path.basename(baseInputValue)
234
235 def getBaseInputStem(self, inputs, arglist):
236 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
237
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000238 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000239 output, outputType, arglist):
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000240 inputType = inputs[0].type
241 assert not [i for i in inputs if i.type != inputType]
242
243 usePP = False
Daniel Dunbar78477e02009-01-14 00:06:14 +0000244 isCXX = False
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000245 if inputType is Types.CType:
246 cc1Name = 'cc1'
247 usePP = True
248 elif inputType is Types.CTypeNoPP:
249 cc1Name = 'cc1'
250 usePP = False
251 elif inputType is Types.ObjCType:
252 cc1Name = 'cc1obj'
253 usePP = True
254 elif inputType is Types.ObjCTypeNoPP:
255 cc1Name = 'cc1obj'
256 usePP = False
257 elif inputType is Types.CXXType:
258 cc1Name = 'cc1plus'
259 usePP = True
Daniel Dunbar78477e02009-01-14 00:06:14 +0000260 isCXX = True
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000261 elif inputType is Types.CXXTypeNoPP:
262 cc1Name = 'cc1plus'
263 usePP = False
Daniel Dunbar78477e02009-01-14 00:06:14 +0000264 isCXX = True
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000265 elif inputType is Types.ObjCXXType:
266 cc1Name = 'cc1objplus'
267 usePP = True
Daniel Dunbar78477e02009-01-14 00:06:14 +0000268 isCXX = True
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000269 elif inputType is Types.ObjCXXTypeNoPP:
270 cc1Name = 'cc1objplus'
271 usePP = False
Daniel Dunbar78477e02009-01-14 00:06:14 +0000272 isCXX = True
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000273 else:
274 raise RuntimeError,"Unexpected input type for Darwin compile tool."
275
276 cmd_args = []
277 if (arglist.getLastArg(arglist.parser.traditionalOption) or
278 arglist.getLastArg(arglist.parser.f_traditionalOption)):
279 raise ValueError,"-traditional is not supported without -E"
280
281 if usePP:
Daniel Dunbar78477e02009-01-14 00:06:14 +0000282 # Derived from cpp_options.
283
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000284 # Derived from cpp_unique_options.
285
286 if (arglist.getLastArg(arglist.parser.COption) or
287 arglist.getLastArg(arglist.parser.CCOption)):
288 if not arglist.getLastArg(arglist.parser.EOption):
289 raise ValueError,"-C or -CC is not supported without -E"
290 if not arglist.getLastArg(arglist.parser.QOption):
291 cmd_args.append('-quiet')
292 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
293 arglist.addLastArg(cmd_args, arglist.parser.vOption)
294 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
295 arglist.addLastArg(cmd_args, arglist.parser.POption)
296
297 # FIXME: Handle %I properly.
298 if arglist.getValue(arch) == 'x86_64':
299 cmd_args.append('-imultilib')
300 cmd_args.append('x86_64')
301
302 if arglist.getLastArg(arglist.parser.MDOption):
303 cmd_args.append('-MD')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000304 # FIXME: Think about this more.
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000305 outputOpt = arglist.getLastArg(arglist.parser.oOption)
306 if outputOpt:
307 base,ext = os.path.splitext(arglist.getValue(outputOpt))
308 cmd_args.append(base+'.d')
309 else:
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000310 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000311 if arglist.getLastArg(arglist.parser.MMDOption):
312 cmd_args.append('-MMD')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000313 # FIXME: Think about this more.
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000314 outputOpt = arglist.getLastArg(arglist.parser.oOption)
315 if outputOpt:
316 base,ext = os.path.splitext(arglist.getValue(outputOpt))
317 cmd_args.append(base+'.d')
318 else:
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000319 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000320 arglist.addLastArg(cmd_args, arglist.parser.MOption)
321 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
322 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
323 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
324 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
325 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
326 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
327 if (not arglist.getLastArg(arglist.parser.MOption) and
328 not arglist.getLastArg(arglist.parser.MMOption) and
329 (arglist.getLastArg(arglist.parser.MDOption) or
330 arglist.getLastArg(arglist.parser.MMDOption))):
331 outputOpt = arglist.getLastArg(arglist.parser.oOption)
332 if outputOpt:
333 cmd_args.append('-MQ')
334 cmd_args.append(arglist.getValue(outputOpt))
335
336 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
337 if arglist.getLastArg(arglist.parser.g3Option):
338 cmd_args.append('-dD')
339 arglist.addLastArg(cmd_args, arglist.parser.HOption)
340
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000341 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000342
343 arglist.addAllArgs3(cmd_args,
344 arglist.parser.DOption,
345 arglist.parser.UOption,
346 arglist.parser.AOption)
347
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000348 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000349
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000350 for input in inputs:
351 if isinstance(input.source, Jobs.PipedJob):
352 cmd_args.append('-')
353 else:
354 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000355
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000356 for arg in arglist.getArgs2(arglist.parser.WpOption,
357 arglist.parser.XpreprocessorOption):
358 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000359
360 if arglist.getLastArg(arglist.parser.f_mudflapOption):
361 cmd_args.append('-D_MUDFLAP')
362 cmd_args.append('-include')
363 cmd_args.append('mf-runtime.h')
364
365 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
366 cmd_args.append('-D_MUDFLAP')
367 cmd_args.append('-D_MUDFLAPTH')
368 cmd_args.append('-include')
369 cmd_args.append('mf-runtime.h')
Daniel Dunbar78477e02009-01-14 00:06:14 +0000370
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000371 else:
372 cmd_args.append('-fpreprocessed')
373 # FIXME: There is a spec command to remove
374 # -fpredictive-compilation args here. Investigate.
375
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000376 for input in inputs:
377 if isinstance(input.source, Jobs.PipedJob):
378 cmd_args.append('-')
379 else:
380 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000381
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000382 # Derived from cc1_options spec.
383 if (arglist.getLastArg(arglist.parser.fastOption) or
384 arglist.getLastArg(arglist.parser.fastfOption) or
385 arglist.getLastArg(arglist.parser.fastcpOption)):
386 cmd_args.append('-O3')
387
388 if (arglist.getLastArg(arglist.parser.pgOption) and
389 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
390 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
391
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000392 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000393
394 if not arglist.getLastArg(arglist.parser.QOption):
395 cmd_args.append('-quiet')
396
397 cmd_args.append('-dumpbase')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000398 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000399
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000400 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar0d26f832009-01-13 04:51:51 +0000401
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000402 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
403 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000404
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000405 # FIXME: The goal is to use the user provided -o if that is
406 # our final output, otherwise to drive from the original input
407 # name.
408 #
409 # This implementation is close, but gcc also does this for -S
410 # which is broken, and it would be nice to find a cleaner way
411 # which doesn't introduce a dependency on the output argument
412 # we are given.
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000413 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbarcd7f5842009-01-12 22:19:59 +0000414 if outputOpt and outputOpt is output:
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000415 cmd_args.append('-auxbase-strip')
416 cmd_args.append(arglist.getValue(outputOpt))
417 else:
418 cmd_args.append('-auxbase')
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000419 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000420
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000421 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000422
423 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
424 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar6cb42052009-01-13 21:07:43 +0000425 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticOption)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000426 arglist.addLastArg(cmd_args, arglist.parser.wOption)
427 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
428 if arglist.getLastArg(arglist.parser.vOption):
429 cmd_args.append('-version')
430 if arglist.getLastArg(arglist.parser.pgOption):
431 cmd_args.append('-p')
432 arglist.addLastArg(cmd_args, arglist.parser.pOption)
433
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000434 # ccc treats -fsyntax-only specially.
435 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
436 arglist.parser.syntaxOnlyOption)
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000437
438 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
439 if arglist.getLastArg(arglist.parser.QnOption):
440 cmd_args.append('-fno-ident')
441
442 # FIXME: This isn't correct.
443 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
444 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
445
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000446 # There is no need for this level of compatibility, but it
447 # makes diffing easier.
448 outputAtEnd = (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
449 not arglist.getLastArg(arglist.parser.SOption))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000450 if isinstance(output, Jobs.PipedJob):
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000451 output_args = ['-o', '-']
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000452 elif output is None:
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000453 output_args = ['-o', '/dev/null']
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000454 else:
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000455 output_args = arglist.render(output)
456
457 if not outputAtEnd:
458 cmd_args.extend(output_args)
459
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000460 # FIXME: Still don't get what is happening here. Investigate.
461 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
462
463 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
464 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
465 cmd_args.append('-fno-builtin')
466 cmd_args.append('-fno-merge-constants')
467
468 if arglist.getLastArg(arglist.parser.coverageOption):
469 cmd_args.append('-fprofile-arcs')
470 cmd_args.append('-ftest-coverage')
471
Daniel Dunbar78477e02009-01-14 00:06:14 +0000472 if isCXX:
473 cmd_args.append('-D__private_extern__=extern')
474
Daniel Dunbare5fb6792009-01-13 06:25:31 +0000475 if outputAtEnd:
476 cmd_args.extend(output_args)
477
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000478 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
479 cmd_args))
480
481
Daniel Dunbarc2148562009-01-12 04:21:12 +0000482class Darwin_X86_LinkTool(Tool):
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000483 def __init__(self, toolChain):
Daniel Dunbarc2148562009-01-12 04:21:12 +0000484 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000485 self.toolChain = toolChain
Daniel Dunbarc2148562009-01-12 04:21:12 +0000486
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000487 def getMacosxVersionTuple(self, arglist):
488 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
489 if arg:
490 version = arglist.getValue(arg)
491 components = version.split('.')
492 try:
493 return tuple(map(int, components))
494 except:
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000495 raise ValueError,"invalid version number %r" % version
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000496 else:
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000497 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000498 return (10, major-4, minor)
499
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000500 def addDarwinArch(self, cmd_args, arch, arglist):
501 # Derived from darwin_arch spec.
502 cmd_args.append('-arch')
503 # FIXME: The actual spec uses -m64 for this, but we want to
504 # respect arch. Figure out what exactly gcc is doing.
505 #if arglist.getLastArg(arglist.parser.m_64Option):
506 if arglist.getValue(arch) == 'x86_64':
507 cmd_args.append('x86_64')
508 else:
509 cmd_args.append('i386')
510
511 def addDarwinSubArch(self, cmd_args, arch, arglist):
512 # Derived from darwin_subarch spec, not sure what the
513 # distinction exists for but at least for this chain it is the same.
514 return self.addDarwinArch(cmd_args, arch, arglist)
515
516 def addLinkArgs(self, cmd_args, arch, arglist):
517 # Derived from link spec.
518 if arglist.getLastArg(arglist.parser.staticOption):
519 cmd_args.append('-static')
520 else:
521 cmd_args.append('-dynamic')
522 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
523 # FIXME: Replace -lobjc in forward args with
524 # -lobjc-gnu. How do we wish to handle such things?
525 pass
526
527 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
528 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
529 self.addDarwinArch(cmd_args, arch, arglist)
530 cmd_args.append('-force_cpusubtype_all')
531 else:
532 self.addDarwinSubArch(cmd_args, arch, arglist)
533
534 if arglist.getLastArg(arglist.parser.ZbundleOption):
535 cmd_args.append('-bundle')
536 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
537 '-bundle_loader')
538 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
539 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
540 # FIXME: Where should diagnostics go?
541 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
542 sys.exit(1)
543 if arglist.getLastArg(arglist.parser.current_versionOption):
544 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
545 sys.exit(1)
546 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
547 cmd_args.append('-force_flat_namespace')
548 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
549 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
550 sys.exit(1)
551 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
552 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
553 else:
554 cmd_args.append('-dylib')
555 if arglist.getLastArg(arglist.parser.ZbundleOption):
556 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
557 sys.exit(1)
558 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
559 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
560 sys.exit(1)
561 if arglist.getLastArg(arglist.parser.client_nameOption):
562 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
563 sys.exit(1)
564 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
565 '-dylib_compatibility_version')
566 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
567 '-dylib_current_version')
568
569 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
570 self.addDarwinArch(cmd_args, arch, arglist)
571 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
572 else:
573 self.addDarwinSubArch(cmd_args, arch, arglist)
574
575 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
576 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
577 sys.exit(1)
578
579 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
580 '-dylib_install_name')
581
582 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
583 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
584 sys.exit(1)
585 if arglist.getLastArg(arglist.parser.private_bundleOption):
586 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
587 sys.exit(1)
588
589 if arglist.getLastArg(arglist.parser.Zall_loadOption):
590 cmd_args.append('-all_load')
591
592 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
593 '-allowable_client')
594
595 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
596 cmd_args.append('-bind_at_load')
597
598 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
599 cmd_args.append('-dead_strip')
600
601 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
602 cmd_args.append('-no_dead_strip_inits_and_terms')
603
604 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
605 '-dylib_file')
606
607 if arglist.getLastArg(arglist.parser.ZdynamicOption):
608 cmd_args.append('-dynamic')
609
610 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
611 '-exported_symbols_list')
612
613 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
614 cmd_args.append('-flat_namespace')
615
616 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
617 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
618 '-image_base')
619 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
620 '-init')
621
622 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
623 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
624 # FIXME: I don't understand what is going on
625 # here. This is supposed to come from
626 # darwin_ld_minversion, but gcc doesn't seem to be
627 # following that; it must be getting over-ridden
628 # somewhere.
629 cmd_args.append('-macosx_version_min')
Daniel Dunbarbafb8f42009-01-12 18:51:02 +0000630 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000631 else:
632 # addAll doesn't make sense here but this is what gcc
633 # does.
634 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
635 '-macosx_version_min')
636
637 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
638 '-iphoneos_version_min')
639 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
640
641 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
642 cmd_args.append('-multi_module')
643
644 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
645 cmd_args.append('-single_module')
646
647 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
648 '-multiply_defined')
649
650 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
651 '-multiply_defined_unused')
652
653 if arglist.getLastArg(arglist.parser.f_pieOption):
654 cmd_args.append('-pie')
655
656 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
657 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
658 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
659 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
660 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
661 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
662 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
663 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
664 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
665 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
666 '-segaddr')
667 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
668 '-segs_read_only_addr')
669 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
670 '-segs_read_write_addr')
671 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
672 '-seg_addr_table')
673 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
674 '-fn_seg_addr_table_filename')
675 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
676 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
677 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
678 '-syslibroot')
679 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
680 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
681 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
682 '-umbrella')
683 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
684 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
685 '-unexported_symbols_list')
686 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
687 '-weak_reference_mismatches')
688
689 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
690 cmd_args.append('-weak_reference_mismatches')
691 cmd_args.append('non-weak')
692
693 arglist.addLastArg(cmd_args, arglist.parser.XOption)
694 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
695 arglist.addLastArg(cmd_args, arglist.parser.wOption)
696 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
697 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
698 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
699 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
700 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
701 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
702 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
703 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
704 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
705 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
706 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
707 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000708
709 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000710 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000711 assert outputType is Types.ImageType
712
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000713 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbar08292932009-01-12 02:24:21 +0000714 # comes from specs (starting with link_command). Consult gcc
715 # for more information.
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000716
717 # FIXME: gcc's spec controls when this is done; certain things
718 # like -filelist or -Wl, still trigger a link stage. I don't
719 # quite understand how gcc decides to execute the linker,
720 # investigate. Also, the spec references -fdump= which seems
721 # to have disappeared?
Daniel Dunbar378530c2009-01-05 19:53:30 +0000722 cmd_args = []
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000723
724 # Not sure why this particular decomposition exists in gcc.
725 self.addLinkArgs(cmd_args, arch, arglist)
726
Daniel Dunbar08292932009-01-12 02:24:21 +0000727 # This toolchain never accumlates options in specs, the only
728 # place this gets used is to add -ObjC.
729 if (arglist.getLastArg(arglist.parser.ObjCOption) or
730 arglist.getLastArg(arglist.parser.f_objcOption)):
731 cmd_args.append('-ObjC')
732 if arglist.getLastArg(arglist.parser.ObjCXXOption):
733 cmd_args.append('-ObjC')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000734
735 # FIXME: gcc has %{x} in here. How could this ever happen?
736 # Cruft?
737 arglist.addLastArg(cmd_args, arglist.parser.dOption)
738 arglist.addLastArg(cmd_args, arglist.parser.tOption)
739 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
740 arglist.addLastArg(cmd_args, arglist.parser.uOption)
741 arglist.addLastArg(cmd_args, arglist.parser.AOption)
742 arglist.addLastArg(cmd_args, arglist.parser.eOption)
743 arglist.addLastArg(cmd_args, arglist.parser.mOption)
744 arglist.addLastArg(cmd_args, arglist.parser.rOption)
745
746 cmd_args.extend(arglist.render(output))
747
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000748 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000749 if (not arglist.getLastArg(arglist.parser.AOption) and
750 not arglist.getLastArg(arglist.parser.nostdlibOption) and
751 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
752 # Derived from startfile spec.
753 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
754 # Derived from darwin_dylib1 spec.
755 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
756 cmd_args.append('-ldylib1.o')
757 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000758 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000759 cmd_args.append('-ldylib1.o')
760 else:
761 cmd_args.append('-ldylib1.10.5.o')
762 else:
763 if arglist.getLastArg(arglist.parser.ZbundleOption):
764 if not arglist.getLastArg(arglist.parser.staticOption):
765 cmd_args.append('-lbundle1.o')
766 else:
767 if arglist.getLastArg(arglist.parser.pgOption):
768 if arglist.getLastArg(arglist.parser.staticOption):
769 cmd_args.append('-lgcrt0.o')
770 else:
771 if arglist.getLastArg(arglist.parser.objectOption):
772 cmd_args.append('-lgcrt0.o')
773 else:
774 if arglist.getLastArg(arglist.parser.preloadOption):
775 cmd_args.append('-lgcrt0.o')
776 else:
777 cmd_args.append('-lgcrt1.o')
778
779 # darwin_crt2 spec is empty.
780 pass
781 else:
782 if arglist.getLastArg(arglist.parser.staticOption):
783 cmd_args.append('-lcrt0.o')
784 else:
785 if arglist.getLastArg(arglist.parser.objectOption):
786 cmd_args.append('-lcrt0.o')
787 else:
788 if arglist.getLastArg(arglist.parser.preloadOption):
789 cmd_args.append('-lcrt0.o')
790 else:
791 # Derived from darwin_crt1 spec.
792 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
793 cmd_args.append('-lcrt1.o')
794 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000795 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000796 cmd_args.append('-lcrt1.o')
797 else:
798 cmd_args.append('-lcrt1.10.5.o')
799
800 # darwin_crt2 spec is empty.
801 pass
802
803 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
804 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000805 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000806 # FIXME: gcc does a library search for this
807 # file, this will be be broken currently.
808 cmd_args.append('crt3.o')
809
810 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
811
812 if arglist.getLastArg(arglist.parser.f_openmpOption):
813 # This is more complicated in gcc...
814 cmd_args.append('-lgomp')
815
816 # FIXME: Derive these correctly.
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000817 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbarc2148562009-01-12 04:21:12 +0000818 if arglist.getValue(arch) == 'x86_64':
819 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
820 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
821 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
822 "-L/usr/lib/gcc/%s" % tcDir,
823 "-L/usr/lib/gcc/%s" % tcDir,
824 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
825 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000826
Daniel Dunbar378530c2009-01-05 19:53:30 +0000827 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000828 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000829
830 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
831 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
832 arglist.getLastArg(arglist.parser.f_createProfileOption) or
833 arglist.getLastArg(arglist.parser.coverageOption)):
834 cmd_args.append('-lgcov')
835
836 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
837 cmd_args.append('-allow_stack_execute')
838
839 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
840 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
841 # link_ssp spec is empty.
842
843 # Derived from libgcc spec.
844 if arglist.getLastArg(arglist.parser.staticOption):
845 cmd_args.append('-lgcc_static')
846 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
847 cmd_args.append('-lgcc_eh')
848 cmd_args.append('-lgcc')
849 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
850 # Derived from darwin_iphoneos_libgcc spec.
851 cmd_args.append('-lgcc_s.10.5')
852 cmd_args.append('-lgcc')
853 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
854 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
855 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000856 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000857 cmd_args.append('-lgcc_s.10.4')
858 else:
859 cmd_args.append('-lgcc_s.10.5')
860 cmd_args.append('-lgcc')
861 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000862 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000863 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000864 if macosxVersion >= (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000865 cmd_args.append('-lgcc_s.10.5')
866 cmd_args.append('-lgcc')
867
868 # Derived from lib spec.
869 if not arglist.getLastArg(arglist.parser.staticOption):
870 cmd_args.append('-lSystem')
871
872 if (not arglist.getLastArg(arglist.parser.AOption) and
873 not arglist.getLastArg(arglist.parser.nostdlibOption) and
874 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
875 # endfile_spec is empty.
876 pass
877
878 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
879 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
880
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000881 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
882 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000883
Daniel Dunbar0d51cf72009-01-13 06:44:28 +0000884 if (arglist.getLastArg(arglist.parser.gGroup) and
885 not arglist.getLastArg(arglist.parser.gstabsOption) and
886 not arglist.getLastArg(arglist.parser.g0Option)):
887 # FIXME: This is gross, but matches gcc. The test only
888 # considers the suffix (not the -x type), and then only of the
889 # first input.
890 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
891 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
892 '.c++','.cxx','.CPP','.m','.mm'):
893 jobs.addJob(Jobs.Command('dsymutil',
894 arglist.renderAsInput(output)))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000895
Daniel Dunbar378530c2009-01-05 19:53:30 +0000896class LipoTool(Tool):
897 def __init__(self):
898 super(LipoTool, self).__init__('lipo')
899
900 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb3492762009-01-13 18:51:26 +0000901 output, outputType, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000902 assert outputType is Types.ImageType
903
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000904 cmd_args = ['-create']
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000905 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000906 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000907 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000908 jobs.addJob(Jobs.Command('lipo', cmd_args))