1 # Copyright (c) 2011 The Native Client Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
6 # Config file for various nacl compilation scenarios
11 sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
12 import pynacl.platform
14 TOOLCHAIN_CONFIGS = {}
16 def AppendDictionary(d1, d2):
17 for tag, value in d2.iteritems():
19 d1[tag] = d1[tag] + ' ' + value
24 class ToolchainConfig(object):
25 def __init__(self, desc, commands, tools_needed, is_flaky=False,
26 attributes=[], **extra):
28 self._commands = commands
29 self._tools_needed = tools_needed
31 self._flaky = is_flaky
32 self._attributes = attributes
34 def Append(self, tag, value):
35 assert tag in self._extra
36 self._extra[tag] = self._extra[tag] + ' ' + value + ' '
38 def SanityCheck(self):
39 for t in self._tools_needed:
40 if not os.access(t, os.R_OK | os.X_OK):
41 print "ERROR: missing tool ", t
44 def GetDescription(self):
47 def GetCommands(self, extra):
48 for tag, val in self._commands:
49 d = self._extra.copy()
50 AppendDictionary(d, extra)
54 return [a for (a, _) in self._commands]
59 def GetAttributes(self):
60 return set(self._attributes)
63 ######################################################################
65 ######################################################################
67 LOCAL_GCC = '/usr/bin/gcc'
69 EMU_SCRIPT = 'toolchain/linux_x86/arm_trusted/run_under_qemu_arm'
71 TEMPLATE_DIGITS = 'X' * 16
72 BOOTSTRAP_ARGS = '--r_debug=0x%s --reserved_at_zero=0x%s' % (TEMPLATE_DIGITS,
75 BOOTSTRAP_ARM = 'scons-out/opt-linux-arm/staging/nacl_helper_bootstrap'
76 SEL_LDR_ARM = 'scons-out/opt-linux-arm/staging/sel_ldr'
77 IRT_ARM = 'scons-out/nacl_irt-arm/obj/src/untrusted/irt/irt_core.nexe'
78 RUN_SEL_LDR_ARM = BOOTSTRAP_ARM + ' ' + SEL_LDR_ARM + ' ' + BOOTSTRAP_ARGS
80 BOOTSTRAP_X32 = 'scons-out/opt-linux-x86-32/staging/nacl_helper_bootstrap'
81 SEL_LDR_X32 = 'scons-out/opt-linux-x86-32/staging/sel_ldr'
82 IRT_X32 = 'scons-out/nacl_irt-x86-32/obj/src/untrusted/irt/irt_core.nexe'
83 RUN_SEL_LDR_X32 = BOOTSTRAP_X32 + ' ' + SEL_LDR_X32 + ' ' + BOOTSTRAP_ARGS
85 BOOTSTRAP_X64 = 'scons-out/opt-linux-x86-64/staging/nacl_helper_bootstrap'
86 SEL_LDR_X64 = 'scons-out/opt-linux-x86-64/staging/sel_ldr'
87 IRT_X64 = 'scons-out/nacl_irt-x86-64/obj/src/untrusted/irt/irt_core.nexe'
88 RUN_SEL_LDR_X64 = BOOTSTRAP_X64 + ' ' + SEL_LDR_X64 + ' ' + BOOTSTRAP_ARGS
90 NACL_X86_NEWLIB = 'toolchain/linux_x86/nacl_x86_newlib'
91 NACL_GCC_X32 = NACL_X86_NEWLIB + '/bin/i686-nacl-gcc'
92 NACL_GCC_X64 = NACL_X86_NEWLIB + '/bin/x86_64-nacl-gcc'
94 GLOBAL_CFLAGS = ' '.join(['-DSTACK_SIZE=0x40000',
96 '-D__SIZEOF_LONG__=4',
97 '"-D__INT_LEAST8_TYPE__=signed char"',
98 '"-D__UINT_LEAST32_TYPE__=unsigned int"',
99 '-D_XOPEN_SOURCE=600',
101 '-DNO_LABEL_VALUES',])
103 CLANG_CFLAGS = ' '.join(['-fwrapv',
104 '-fdiagnostics-show-category=name'])
106 ######################################################################
108 ######################################################################
109 COMMANDS_local_gcc = [
111 '%(CC)s %(src)s %(CFLAGS)s -o %(tmp)s.exe -lm -lstdc++',
118 TOOLCHAIN_CONFIGS['local_gcc_x8632_O0'] = ToolchainConfig(
119 desc='local gcc [x86-32]',
120 attributes=['x86-32', 'O0'],
121 commands=COMMANDS_local_gcc,
122 tools_needed=[LOCAL_GCC],
124 CFLAGS = '-O0 -m32 -static ' + GLOBAL_CFLAGS)
126 TOOLCHAIN_CONFIGS['local_gcc_x8632_O3'] = ToolchainConfig(
127 desc='local gcc [x86-32]',
128 attributes=['x86-32', 'O3'],
129 commands=COMMANDS_local_gcc,
130 tools_needed=[LOCAL_GCC],
132 CFLAGS = '-O3 -m32 -static ' + GLOBAL_CFLAGS)
134 TOOLCHAIN_CONFIGS['local_gcc_x8664_O0'] = ToolchainConfig(
135 desc='local gcc [x86-64]',
136 attributes=['x86-64', 'O0'],
137 commands=COMMANDS_local_gcc,
138 tools_needed=[LOCAL_GCC],
140 CFLAGS = '-O0 -m64 -static ' + GLOBAL_CFLAGS)
142 TOOLCHAIN_CONFIGS['local_gcc_x8664_O3'] = ToolchainConfig(
143 attributes=['x86-64', 'O3'],
144 desc='local gcc [x86-64]',
145 commands=COMMANDS_local_gcc,
146 tools_needed=[LOCAL_GCC],
148 CFLAGS = '-O3 -m64 -static ' + GLOBAL_CFLAGS)
150 ######################################################################
151 # # NACL + SEL_LDR [X86]
152 ######################################################################
153 COMMANDS_nacl_gcc = [
155 '%(CC)s %(src)s %(CFLAGS)s -o %(tmp)s.exe -lm -lstdc++',
158 '%(SEL_LDR)s -B %(IRT)s %(tmp)s.exe',
163 TOOLCHAIN_CONFIGS['nacl_gcc_x8632_O0'] = ToolchainConfig(
164 desc='nacl gcc [x86-32]',
165 attributes=['x86-32', 'O0'],
166 commands=COMMANDS_nacl_gcc,
167 tools_needed=[NACL_GCC_X32, BOOTSTRAP_X32, SEL_LDR_X32],
169 SEL_LDR = RUN_SEL_LDR_X32,
171 CFLAGS = '-O0 -static -Bscons-out/nacl-x86-32/lib/ ' + GLOBAL_CFLAGS)
173 TOOLCHAIN_CONFIGS['nacl_gcc_x8632_O3'] = ToolchainConfig(
174 desc='nacl gcc with optimizations [x86-32]',
175 attributes=['x86-32', 'O3'],
176 commands=COMMANDS_nacl_gcc,
177 tools_needed=[NACL_GCC_X32, BOOTSTRAP_X32, SEL_LDR_X32],
179 SEL_LDR = RUN_SEL_LDR_X32,
181 CFLAGS = '-O3 -static -Bscons-out/nacl-x86-32/lib/ ' + GLOBAL_CFLAGS)
183 TOOLCHAIN_CONFIGS['nacl_gcc_x8664_O0'] = ToolchainConfig(
184 desc='nacl gcc [x86-64]',
185 attributes=['x86-64', 'O0'],
186 commands=COMMANDS_nacl_gcc,
187 tools_needed=[NACL_GCC_X64, BOOTSTRAP_X64, SEL_LDR_X64],
189 SEL_LDR = RUN_SEL_LDR_X64,
191 CFLAGS = '-O0 -static -Bscons-out/nacl-x86-64/lib/ ' + GLOBAL_CFLAGS)
193 TOOLCHAIN_CONFIGS['nacl_gcc_x8664_O3'] = ToolchainConfig(
194 desc='nacl gcc with optimizations [x86-64]',
195 attributes=['x86-32', 'O3'],
196 commands=COMMANDS_nacl_gcc,
197 tools_needed=[NACL_GCC_X64, BOOTSTRAP_X64, SEL_LDR_X64],
199 SEL_LDR = RUN_SEL_LDR_X64,
201 CFLAGS = '-O3 -static -Bscons-out/nacl-x86-64/lib/ ' + GLOBAL_CFLAGS)
203 ######################################################################
204 # PNACL + SEL_LDR [ARM]
205 ######################################################################
207 # Locate the pnacl toolchain. Path can be overridden externally.
208 os_name = pynacl.platform.GetOS()
209 PNACL_TOOLCHAIN_DIR = os.getenv('PNACL_TOOLCHAIN_DIR',
210 '%s_x86/pnacl_newlib' % os_name)
211 PNACL_ROOT = os.path.join('toolchain', PNACL_TOOLCHAIN_DIR)
212 PNACL_FRONTEND = PNACL_ROOT + '/bin/pnacl-clang++'
213 PNACL_FINALIZE = PNACL_ROOT + '/bin/pnacl-finalize'
216 # NOTE: Our driver supports going from .c to .nexe in one go
217 # but it maybe useful to inspect the bitcode file so we
218 # split the compilation into two steps.
219 PNACL_LD = PNACL_ROOT + '/bin/pnacl-translate'
221 COMMANDS_llvm_pnacl_arm = [
223 '%(CC)s %(src)s %(CFLAGS)s -o %(tmp)s.nonfinal.pexe',
226 '%(FINALIZE)s %(FINALIZE_FLAGS)s %(tmp)s.nonfinal.pexe'
227 ' -o %(tmp)s.final.pexe'
230 '%(LD)s %(TRANSLATE_FLAGS)s %(tmp)s.final.pexe -o %(tmp)s.nexe',
233 '%(EMU)s %(SEL_LDR)s -B %(IRT)s -Q %(tmp)s.nexe',
238 # In the PNaCl ToolchainConfig attributes, the convention for the 'b'
239 # and 'f' suffixes is that 'O0f' means frontend (clang) compilation
240 # with -O0, and 'O2b' means backend (llc) translation with -O2.
242 TOOLCHAIN_CONFIGS['llvm_pnacl_arm_O0'] = ToolchainConfig(
243 desc='pnacl llvm [arm]',
244 attributes=['arm', 'O0f', 'O2b'],
245 commands=COMMANDS_llvm_pnacl_arm,
246 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
247 EMU_SCRIPT, BOOTSTRAP_ARM,
251 FINALIZE = PNACL_FINALIZE,
252 LD = PNACL_LD + ' -arch arm',
254 SEL_LDR = RUN_SEL_LDR_ARM,
256 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
260 TOOLCHAIN_CONFIGS['llvm_pnacl_arm_O3'] = ToolchainConfig(
261 desc='pnacl llvm with optimizations [arm]',
262 attributes=['arm', 'O3f', 'O2b'],
263 commands=COMMANDS_llvm_pnacl_arm,
264 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
265 EMU_SCRIPT, BOOTSTRAP_ARM, SEL_LDR_ARM],
268 FINALIZE = PNACL_FINALIZE,
269 LD = PNACL_LD + ' -arch arm',
271 SEL_LDR = RUN_SEL_LDR_ARM,
273 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
276 TRANSLATE_FLAGS = '')
278 # Based on llvm_pnacl_arm_O3 with TRANSLATE_FLAGS=-translate-fast
279 TOOLCHAIN_CONFIGS['llvm_pnacl_arm_O3_O0'] = ToolchainConfig(
280 desc='pnacl llvm with optimizations and fast translation [arm]',
281 attributes=['arm', 'O3f', 'O0b'],
282 commands=COMMANDS_llvm_pnacl_arm,
283 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
284 EMU_SCRIPT, BOOTSTRAP_ARM, SEL_LDR_ARM],
287 FINALIZE = PNACL_FINALIZE,
288 LD = PNACL_LD + ' -arch arm',
290 SEL_LDR = RUN_SEL_LDR_ARM,
292 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
295 TRANSLATE_FLAGS = '-translate-fast')
297 # Based on llvm_pnacl_arm_O0 with TRANSLATE_FLAGS=-translate-fast
298 TOOLCHAIN_CONFIGS['llvm_pnacl_arm_O0_O0'] = ToolchainConfig(
299 desc='pnacl llvm [arm]',
300 attributes=['arm', 'O0f', 'O0b'],
301 commands=COMMANDS_llvm_pnacl_arm,
302 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
303 EMU_SCRIPT, BOOTSTRAP_ARM,
307 FINALIZE = PNACL_FINALIZE,
308 LD = PNACL_LD + ' -arch arm',
310 SEL_LDR = RUN_SEL_LDR_ARM,
312 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
314 TRANSLATE_FLAGS='-translate-fast')
316 ######################################################################
317 # PNACL + SEL_LDR [X8632]
318 ######################################################################
320 # NOTE: this is used for both x86 flavors
321 COMMANDS_llvm_pnacl_x86 = [
323 '%(CC)s %(src)s %(CFLAGS)s -o %(tmp)s.nonfinal.pexe',
326 '%(FINALIZE)s %(FINALIZE_FLAGS)s %(tmp)s.nonfinal.pexe'
327 ' -o %(tmp)s.final.pexe',
330 '%(LD)s %(TRANSLATE_FLAGS)s %(tmp)s.final.pexe -o %(tmp)s.nexe ',
333 '%(SEL_LDR)s -B %(IRT)s %(tmp)s.nexe',
338 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-32_O0'] = ToolchainConfig(
339 desc='pnacl llvm [x8632]',
340 attributes=['x86-32', 'O0f', 'O2b'],
341 commands=COMMANDS_llvm_pnacl_x86,
342 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
343 BOOTSTRAP_X32, SEL_LDR_X32],
345 FINALIZE = PNACL_FINALIZE,
346 LD = PNACL_LD + ' -arch x86-32',
347 SEL_LDR = RUN_SEL_LDR_X32,
349 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
351 TRANSLATE_FLAGS = '')
353 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-32_O3'] = ToolchainConfig(
354 desc='pnacl llvm [x8632]',
355 attributes=['x86-32', 'O3f', 'O2b'],
356 commands=COMMANDS_llvm_pnacl_x86,
357 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
358 BOOTSTRAP_X32, SEL_LDR_X32],
360 FINALIZE = PNACL_FINALIZE,
361 LD = PNACL_LD + ' -arch x86-32',
362 SEL_LDR = RUN_SEL_LDR_X32,
364 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
367 TRANSLATE_FLAGS = '')
369 # Based on llvm_pnacl_x86-32_O3 with TRANSLATE_FLAGS=-translate-fast
370 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-32_O3_O0'] = ToolchainConfig(
371 desc='pnacl llvm with fast translation [x8632]',
372 attributes=['x86-32', 'O3f', 'O0b'],
373 commands=COMMANDS_llvm_pnacl_x86,
374 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
375 BOOTSTRAP_X32, SEL_LDR_X32],
377 FINALIZE = PNACL_FINALIZE,
378 LD = PNACL_LD + ' -arch x86-32',
379 SEL_LDR = RUN_SEL_LDR_X32,
381 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
384 TRANSLATE_FLAGS = '-translate-fast')
386 # Based on llvm_pnacl_x86-32_O0 with TRANSLATE_FLAGS=-translate-fast
387 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-32_O0_O0'] = ToolchainConfig(
388 desc='pnacl llvm [x8632]',
389 attributes=['x86-32', 'O0f', 'O0b'],
390 commands=COMMANDS_llvm_pnacl_x86,
391 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
392 BOOTSTRAP_X32, SEL_LDR_X32],
394 FINALIZE = PNACL_FINALIZE,
395 LD = PNACL_LD + ' -arch x86-32',
396 SEL_LDR = RUN_SEL_LDR_X32,
398 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
400 TRANSLATE_FLAGS = '-translate-fast')
402 ######################################################################
403 # PNACL + SEL_LDR [X8664]
404 ######################################################################
406 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-64_O0'] = ToolchainConfig(
407 desc='pnacl llvm [x8664]',
408 attributes=['x86-64', 'O0f', 'O2b'],
409 commands=COMMANDS_llvm_pnacl_x86,
410 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
411 BOOTSTRAP_X64, SEL_LDR_X64],
413 FINALIZE = PNACL_FINALIZE,
414 LD = PNACL_LD + ' -arch x86-64',
415 SEL_LDR = RUN_SEL_LDR_X64,
417 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
419 TRANSLATE_FLAGS = '')
421 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-64_O3'] = ToolchainConfig(
422 desc='pnacl llvm [x8664]',
423 attributes=['x86-64', 'O3f', 'O2b'],
424 commands=COMMANDS_llvm_pnacl_x86,
425 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
426 BOOTSTRAP_X64, SEL_LDR_X64],
428 FINALIZE = PNACL_FINALIZE,
429 LD = PNACL_LD + ' -arch x86-64',
430 SEL_LDR = RUN_SEL_LDR_X64,
432 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
435 TRANSLATE_FLAGS = '')
437 # Based on llvm_pnacl_x86-64_O3 with TRANSLATE_FLAGS=-translate-fast
438 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-64_O3_O0'] = ToolchainConfig(
439 desc='pnacl llvm with fast translation [x8664]',
440 attributes=['x86-64', 'O3f', 'O0b'],
441 commands=COMMANDS_llvm_pnacl_x86,
442 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
443 BOOTSTRAP_X64, SEL_LDR_X64],
445 FINALIZE = PNACL_FINALIZE,
446 LD = PNACL_LD + ' -arch x86-64',
447 SEL_LDR = RUN_SEL_LDR_X64,
449 CFLAGS = '-O3 -D__OPTIMIZE__ -static ' + CLANG_CFLAGS + ' '
452 TRANSLATE_FLAGS = '-translate-fast')
454 # Based on llvm_pnacl_x86-64_O0 with TRANSLATE_FLAGS=-translate-fast
455 TOOLCHAIN_CONFIGS['llvm_pnacl_x86-64_O0_O0'] = ToolchainConfig(
456 desc='pnacl llvm [x8664]',
457 attributes=['x86-64', 'O0f', 'O0b'],
458 commands=COMMANDS_llvm_pnacl_x86,
459 tools_needed=[PNACL_FRONTEND, PNACL_FINALIZE, PNACL_LD,
460 BOOTSTRAP_X64, SEL_LDR_X64],
462 FINALIZE = PNACL_FINALIZE,
463 LD = PNACL_LD + ' -arch x86-64',
464 SEL_LDR = RUN_SEL_LDR_X64,
466 CFLAGS = '-O0 -static ' + CLANG_CFLAGS + ' ' + GLOBAL_CFLAGS,
468 TRANSLATE_FLAGS = '-translate-fast')