blob: 4ee12442f6eee3503d92dc4b87a832bc9c6a1cbd [file] [log] [blame]
# -*- python -*-
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
Import('env')
# force inclusion of entire library, so that we can validate it
# NOTE: This approach does not work for -lc because of tons of
# undefined symbols which would have to be stubbed out
DEP_LIBS = ['nacl', 'imc_syscalls', 'platform', 'gio', 'pthread', 'm']
# -lgcc is not exposed to the bitcode in PNaCl
if env.Bit('bitcode'):
LIBGCC = []
else:
LIBGCC = ['-lgcc']
DEP_LINKFLAGS = (['-Wl,--whole-archive'] + LIBGCC +
['-l' + name for name in DEP_LIBS] +
['-Wl,--no-whole-archive'])
cpp11_env = env.Clone()
# TODO(jfb): Change this to -std=c++11 when it's properly supported.
cpp11_env.Append(CCFLAGS=['-std=gnu++11'])
# All the libraries were already included via -l switches in LINKFLAGS.
# But we use them again in LIBS so scons knows about the dependencies.
# _LIBFLAGS is the internal variable that puts the expansion of LIBS
# into the command line; so by clearing that, we prevent scons from
# adding repeated -l switches at the end of the link.
nexe = env.ComponentProgram('dummy', 'dummy.c',
EXTRA_LINKFLAGS=DEP_LINKFLAGS,
LIBS=DEP_LIBS,
_LIBFLAGS='')
node = env.CommandValidatorTestNacl('whole_archive_test.out',
image=nexe)
env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_whole_archive_test')
def AddIntrinsicTest(test_env, src, exit_status,
golden_file=None, test_suffix='', is_broken=False,
EXTRA_LIBS=[], EXTRA_CCFLAGS='', add_bias=False):
name = src.split('.')[0]
name += test_suffix
if add_bias and test_env.Bit('bitcode'):
test_env.AddBiasForPNaCl()
if EXTRA_CCFLAGS:
test_env = test_env.Clone()
test_env.Append(CCFLAGS=[EXTRA_CCFLAGS])
obj = test_env.ComponentObject(name, src)
nexe = test_env.ComponentProgram(
name, obj, EXTRA_LIBS=['${NONIRT_LIBS}'] + EXTRA_LIBS)
node = test_env.CommandSelLdrTestNacl(name + '.out',
nexe,
exit_status=exit_status,
stdout_golden=golden_file)
test_env.AddNodeToTestSuite(node,
['toolchain_tests','small_tests'],
'run_' + name + '_test',
is_broken=is_broken)
# Test various intrinsics.
AddIntrinsicTest(env, 'intrinsics.cc', '55'),
AddIntrinsicTest(env, 'float2.c', '0', golden_file=env.File('float2.stdout'))
AddIntrinsicTest(env, 'synchronization_sync.c', '0',
# The test exercises instructions that confuse valgrind.
is_broken=env.IsRunningUnderValgrind())
AddIntrinsicTest(env, 'synchronization_volatile.c', '0')
if env.Bit('bitcode') or env.Bit('nacl_clang'):
# The following tests were only made to work on LLVM for
# PNaCl. Command-line flags and libraries need to be updated for GCC
# support.
# pthread is needed when building with libc++.
AddIntrinsicTest(cpp11_env, 'condition_variable_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'])
AddIntrinsicTest(cpp11_env, 'future_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'])
AddIntrinsicTest(cpp11_env, 'mutex_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'])
AddIntrinsicTest(cpp11_env, 'synchronization_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'],
add_bias=True)
AddIntrinsicTest(cpp11_env, 'thread_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'])
AddIntrinsicTest(cpp11_env, 'long_double_cpp11.cc', '0',
EXTRA_LIBS=['${PTHREAD_LIBS}'])
# This test redirects C function calls to llvm instrinsic functions,
# so they only work w/ PNaCl.
if env.Bit('bitcode') or env.Bit('nacl_clang'):
AddIntrinsicTest(env, 'llvm_bitmanip_intrinsics.c', '0',
golden_file=env.File('llvm_bitmanip_intrinsics.stdout'))
for should_inline in [0, 1]:
AddIntrinsicTest(cpp11_env, 'overflow.cc', '0',
test_suffix='inline' if should_inline else 'noinline',
golden_file=env.File('overflow.stdout'),
EXTRA_CCFLAGS='-DSHOULD_INLINE=' + str(should_inline),
# inline case is currently broken:
# https://code.google.com/p/nativeclient/issues/detail?id=4170
is_broken=should_inline)
AddIntrinsicTest(env, 'llvm_math_intrinsics.cc', '0',
golden_file=env.File('llvm_math_intrinsics.stdout'))
# Also test the math functions with -ffast-math, so we are a tiny bit more
# confident that sin() or __builtin_sin() doesn't get turned into
# something like llvm.sin.f64.
fastmath_env = env.Clone()
fastmath_env.Append(CCFLAGS=['-ffast-math'])
AddIntrinsicTest(fastmath_env, 'llvm_math_intrinsics.cc', '0',
golden_file=env.File('llvm_math_intrinsics.stdout'),
test_suffix='_fast_math')
# Some of the intrinsic tests cover intrinsics that we do not want to
# support. For example, llvm.frameaddress. If that is the case, we will
# use the nonstable_env as our test_env in AddIntrinsicTest.
nonstable_env = env.Clone()
if env.Bit('bitcode'):
nonstable_env.Append(LINKFLAGS=['--pnacl-disable-abi-check'])
if nonstable_env.SetNonStableBitcodeIfAllowed():
# Consider llvm.frameaddress and llvm.returnaddress non-stable,
# since we may want to hide return and stack addresses in the future.
AddIntrinsicTest(nonstable_env, 'frame_addresses.c', '0'),
AddIntrinsicTest(nonstable_env, 'return_address.c', '55')
# initfini test
initfini_obj = env.ComponentObject('initfini.c')
def AddInitFiniTest(env, name, extra_libs):
nexe = env.ComponentProgram(name,
[initfini_obj],
EXTRA_LIBS=extra_libs + ['${NONIRT_LIBS}'])
golden_file = env.File(name + '.stdout')
node = env.CommandSelLdrTestNacl(name + '.out',
nexe,
stdout_golden=golden_file)
# This test checks the ".init_array" and ".fini_array" sections,
# which are an internal detail of how the toolchain works. We do
# not support these sections in PNaCl's static linking ABI, because
# PNaCl connects up initializers at bitcode linking time. PNaCl
# does support __attribute__((constructor)) and
# __attribute__((destructor)) which are tested via
# run_initfini_attributes_test below.
is_broken = env.Bit('bitcode') and env.Bit('nacl_static_link')
env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_' + name + '_test',
is_broken=is_broken)
AddInitFiniTest(env, 'initfini_static', [])
if env.Bit('nacl_glibc') and not env.Bit('nacl_disable_shared'):
# Additional case: Add initfini_shared.c as a shared object.
# For a shared object, the init/fini arrays are executed by
# the dynamic loader. This exercises a different code path.
env.NaClSdkLibrary('initfini_s', 'initfini_shared.c')
AddInitFiniTest(env, 'initfini_shared', ['initfini_s'])
nexe = env.ComponentProgram(
'initfini_attributes', ['initfini_attributes.c'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl(
'initfini_attributes.out', nexe,
stdout_golden=env.File('initfini_attributes.stdout'))
env.AddNodeToTestSuite(
node, ['toolchain_tests', 'small_tests'],
'run_initfini_attributes_test',
# __attribute__((destructor)) is broken in nacl-glibc on x86-64.
# See http://code.google.com/p/nativeclient/issues/detail?id=3056
# TODO(mseaborn): Enable this test there when this is fixed.
is_broken=env.Bit('nacl_glibc') and env.Bit('build_x86_64'))
nexe = env.ComponentProgram('pthread_cleanup', 'pthread_cleanup.c',
EXTRA_LIBS=['${PTHREAD_LIBS}',
'${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('pthread_cleanup.out', nexe)
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_pthread_cleanup_test',
# This test is flaky on mac10.7-newlib-dbg-asan.
# See https://code.google.com/p/nativeclient/issues/detail?id=3906
is_broken=(env.Bit('asan') and env.Bit('host_mac')))
nexe = env.ComponentProgram('cpp_threadsafe_static_init',
'cpp_threadsafe_static_init.cc',
EXTRA_LIBS=['${PTHREAD_LIBS}',
'${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('cpp_threadsafe_static_init.out', nexe)
# This test fails with the newlib-based builds of libstdc++ that have
# multi-threading disabled internally. In x86 nacl-gcc, libstdc++'s
# threading works on x86-32 but is disabled on x86-64 via an #ifdef. In
# ARM nacl-gcc, libstdc++'s threading isn't enabled at all.
# See https://code.google.com/p/nativeclient/issues/detail?id=3948
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_cpp_threadsafe_static_init_test',
is_broken=(not env.Bit('bitcode') and
not env.Bit('nacl_clang') and
not env.Bit('nacl_glibc') and
not env.Bit('build_x86_32')))
# Test that the toolchain accepts both forms of --build-id and creates a GNU
# build ID note section
if not env.Bit('pnacl_generate_pexe') and env['TOOLCHAIN_FEATURE_VERSION'] >= 27:
for flag, name in zip(['--build-id', '--build-id=sha1'], ['empty', 'sha1']):
buildid_env = env.Clone()
buildid_env.Append(LINKFLAGS=['-Wl,' + flag])
obj = buildid_env.ComponentObject('build_id.%s.o' % name, 'dummy.c')
nexe = buildid_env.ComponentProgram('build_id.%s.nexe' % name, obj,
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = buildid_env.CommandTestFileDumpCheck(
'build_id.%s.out' % name, nexe,
buildid_env.File('build_id_check_text'),
'--headers')
buildid_env.AddNodeToTestSuite(node, ['small_tests', 'toolchain_tests'],
'run_build_id_%s_test' % name)
# NOTE: the tests below break easily under valgrid and since
# they do not exercise malloc/free we exclude
if env.IsRunningUnderValgrind():
Return()
# NOTE: we assume that the incoming env contains '-O2', '-fomit-frame-pointer'
def MakeEnv(env, use_opts, use_frames):
new_env = env.Clone()
# AddBiasForPNaCl() is only needed for stack_frame.cc and eh_return.c.
if new_env.Bit('bitcode'):
new_env.AddBiasForPNaCl()
new_env.FilterOut(CFLAGS=['-pedantic'])
new_env.FilterOut(CCFLAGS=['-pedantic'])
if use_frames:
new_env.FilterOut(CFLAGS=['-fomit-frame-pointer'])
new_env.FilterOut(CCFLAGS=['-fomit-frame-pointer'])
if env.Bit('bitcode'):
# To use frame pointers for PNaCl, we need to change the translate-flags.
new_env.Append(TRANSLATEFLAGS=[
'--pnacl-driver-set-LLC_FLAGS_EXTRA=-disable-fp-elim'])
else:
new_env.Append(CFLAGS=['-fomit-frame-pointer'])
new_env.Append(CCFLAGS=['-fomit-frame-pointer'])
if use_opts:
new_env.Append(CFLAGS=['-O2'])
new_env.Append(CCFLAGS=['-O2'])
else:
new_env.FilterOut(CFLAGS=['-O2'])
new_env.FilterOut(CCFLAGS=['-O2'])
new_env.FilterOut(LINKFLAGS=['-O3'])
return new_env
EH_ENVIRONMENTS_TO_TRY = []
base_eh_env = env.Clone()
supports_cxx11 = (env.Bit('bitcode') or env.Bit('build_arm') or
env.Bit('nacl_clang'))
base_eh_env.Append(CPPDEFINES=[['SUPPORTS_CXX11', str(int(supports_cxx11))]])
if supports_cxx11 and not env.Bit('bitcode') and not env.Bit('nacl_clang'):
# This flag is necessary for testing std::rethrow_exception(), at
# least when using libstdc++.
base_eh_env.Append(CXXFLAGS=['-std=gnu++11'])
if env.Bit('bitcode'):
sjlj_eh_env = base_eh_env.Clone()
sjlj_eh_env.Append(LINKFLAGS=['--pnacl-exceptions=sjlj'])
EH_ENVIRONMENTS_TO_TRY.append(('sjlj_libc++', sjlj_eh_env))
else:
EH_ENVIRONMENTS_TO_TRY.extend(
[('noopt_frame', MakeEnv(base_eh_env, False, True)),
('noopt_noframe', MakeEnv(base_eh_env, False, False)),
('opt_frame', MakeEnv(base_eh_env, True, True)),
('opt_noframe', MakeEnv(base_eh_env, True, False))])
for tag, env_to_try in EH_ENVIRONMENTS_TO_TRY:
for src in ['stack_frame.cc',
'eh_return.c',
'eh_virtual_dtor.cc',
'eh_loop_single.cc',
'eh_loop_many.cc',
'eh_catch_many.cc',
'eh_loop_break.cc',
'eh_floating_point.cc',
'eh_uncaught_exception.cc',
'eh_throw_tests.cc',
]:
if not env.Bit('bitcode') and src in ['eh_return.c']:
# for some reason gcc does not allow us to use
# __builtin_eh_return
continue
is_broken = False
if (env.Bit('bitcode') and
src in ['stack_frame.cc', 'eh_return.c']):
# stack_frame.cc and eh_return.c have bias see above
is_broken = True
if not env.Bit('bitcode') and src in ['stack_frame.cc']:
# This test makes pnacl specific assumptions which
# may not hold for the nacl-gcc TC
is_broken = True
# The following tests don't work as PNaCl ABI-stable pexes.
non_abi_stable_tests = [
'eh_floating_point.cc', # Uses vector types
'stack_frame.cc', # Uses llvm.eh.dwarf.cfa
'eh_return.c', # Uses llvm.eh.dwarf.cfa, and llvm.eh.return.i32
]
if tag.startswith('sjlj_') and src in non_abi_stable_tests:
continue
name = src.split('.')[0] + '_' + tag
nobj = env_to_try.ComponentObject(name + '.o', src)
nexe = env_to_try.ComponentProgram(name, nobj,
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env_to_try.CommandSelLdrTestNacl(name + '.out',
nexe,
exit_status='55')
env_to_try.AddNodeToTestSuite(
node, ['eh_tests', 'toolchain_tests', 'small_tests'],
'run_' + name +'_test', is_broken=is_broken)
abi_types_nexe = env.ComponentProgram('abi_types',
'abi_types.cc',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('abi_types_test.out',
abi_types_nexe)
env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_abi_types_test')
getpagesize_test_nexe = env.ComponentProgram(
'getpagesize_test', 'getpagesize_test.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('getpagesize_test.out', getpagesize_test_nexe)
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_getpagesize_test')
getid_test_nexe = env.ComponentProgram(
'getid_test', 'getid_test.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('getid_test.out', getid_test_nexe)
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_getid_test')
prefetch_test_nexe = env.ComponentProgram(
'prefetch_test', 'prefetch_test.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('prefetch_test.out', prefetch_test_nexe)
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_prefetch_test')
# Test that local variable dwarf info is preserved with linking and LTO.
# Force '-g' on in case it was not turned on for some reason, and lower
# optimization settings to prevent some optimizations that would convert
# locals from llvm allocas to registers.
# We may be able to remove this test once LLVM has an upstream regression test.
debug_env = env.Clone()
debug_env.Append(CFLAGS=['-g', '-O0'])
debug_env.Append(CCFLAGS=['-g', '-O0'])
debug_env.Append(LINKFLAGS=['-O0'])
# This requires preserving nonstable bitcode debug metadata.
if ((debug_env.Bit('bitcode') and debug_env.SetNonStableBitcodeIfAllowed())
or debug_env.Bit('nacl_clang')):
dwarf_local_var_nexe = debug_env.ComponentProgram(
'dwarf_local_var',
['dwarf_local_var.c',
'dwarf_local_var_dummy.c'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
# Sanity-check -- make sure it runs.
node = debug_env.CommandSelLdrTestNacl('dwarf_local_var_run.out',
dwarf_local_var_nexe,
exit_status=55)
debug_env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_dwarf_local_var_run_test')
node = debug_env.CommandTestFileDumpCheck('dwarf_local_var_objdump.out',
dwarf_local_var_nexe,
debug_env.File('dwarf_local_var.c'),
'-W')
debug_env.AddNodeToTestSuite(node,
['small_tests', 'toolchain_tests'],
'run_dwarf_local_var_objdump_test')
dwarf_method_ptr_nexe = debug_env.ComponentProgram(
'dwarf_method_ptr',
['dwarf_method_ptr.cc'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
# Sanity-check -- make sure it runs.
node = debug_env.CommandSelLdrTestNacl('dwarf_method_ptr_run.out',
dwarf_method_ptr_nexe,
exit_status=42)
debug_env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_dwarf_method_ptr_run_test')
file = debug_env.File('dwarf_method_ptr.cc')
node = debug_env.CommandTestFileDumpCheck('dwarf_method_ptr_objdump.out',
dwarf_method_ptr_nexe,
file,
'-W')
debug_env.AddNodeToTestSuite(node,
['small_tests', 'toolchain_tests'],
'run_dwarf_method_ptr_objdump_test')
if env.Bit('nacl_glibc'):
nexe = env.ComponentProgram('byteswap64', 'byteswap64.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('byteswap64.out', nexe)
env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_byteswap64_test')
if ((env.Bit('nacl_glibc') or not env.Bit('bitcode'))
and not env.Bit('built_elsewhere')):
def AddAlignedCodeTest(name, object_file):
node = env.CommandTest(name + '.out',
['${PYTHON}', env.File('aligned_code.py'),
'${OBJDUMP}', nexe],
# don't run ${PYTHON} under the emulator.
direct_emulation=False)
env.AddNodeToTestSuite(node,
['toolchain_tests', 'small_tests'],
'run_' + name + '_test')
AddAlignedCodeTest('aligned_code',
env.ComponentProgram('aligned_code', ['aligned_code.c'],
EXTRA_LIBS=['${NONIRT_LIBS}']))
if not env.Bit('nacl_disable_shared'):
AddAlignedCodeTest('aligned_code_lib',
env.NaClSharedLibrary('aligned_code_lib',
['aligned_code_lib.c']))
nexe = env.ComponentProgram('method_pointer_repr', 'method_pointer_repr.cc',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('method_pointer_repr.out', nexe)
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_method_pointer_repr_test')
c99_env = env.Clone()
c99_env.Append(CFLAGS=['-std=c99'])
# VLA test is broken on nacl-gcc x86-64 (segfaults in test_two_recursion()).
# http://code.google.com/p/nativeclient/issues/detail?id=3527
vla_is_broken = not env.Bit('bitcode') and env.Bit('build_x86_64')
nexe = c99_env.ComponentProgram('vla', 'vla.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('vla.out', nexe,
stdout_golden=env.File('vla.stdout'))
env.AddNodeToTestSuite(node, ['toolchain_tests', 'small_tests'],
'run_vla_test',
is_broken=vla_is_broken)
if not env.Bit('pnacl_generate_pexe'):
asm_env = env.Clone()
if env.Bit('bitcode'):
asm_env.PNaClForceNative()
asm_env.AddBiasForPNaCl()
testsuite = ['toolchain_tests', 'small_tests', 'nonpexe_tests']
def FarCallObjects(env, suffix=''):
return [env.ComponentObject(file[:-2] + suffix + '.o', file)
for file in ['far_caller.c', 'far_padding.S', 'far_callee.c']]
nexe = asm_env.ComponentProgram('far_call', FarCallObjects(asm_env),
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = asm_env.CommandSelLdrTestNacl('far_call.out', nexe)
# TODO(mcgrathr): Broken for bitcode pending fixes to gold; see
# https://code.google.com/p/nativeclient/issues/detail?id=3568
asm_env.AddNodeToTestSuite(node, testsuite,
'run_far_call_test',
is_broken=env.Bit('bitcode'))
# TODO(mcgrathr): Disabled for bitcode because pnacl-ld doesn't grok
# --pic-veneer. Another tack to test this would be to generate a shared
# object and validate it, but -shared is not really supported either.
# Since PNaCl has no reason to generate PIC at all until there is some
# form of ELF shared object support (if that ever happens at all),
# perhaps we'll never really need to test this.
if not env.Bit('bitcode'):
pic_env = asm_env.Clone()
pic_env.Append(CFLAGS=['-fPIC'])
if pic_env.Bit('build_arm'):
pic_env.Append(LINKFLAGS=['-Wl,--pic-veneer'])
nexe = pic_env.ComponentProgram('far_call_pic',
FarCallObjects(pic_env, '_pic'),
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = pic_env.CommandSelLdrTestNacl('far_call_pic.out', nexe)
pic_env.AddNodeToTestSuite(node, testsuite,
'run_far_call_pic_test')
dummy_obj = asm_env.ComponentObject('nop_test_main.o', 'dummy.c')
nexe = asm_env.ComponentProgram('nop_test', [dummy_obj, 'nop_test.S'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = asm_env.CommandSelLdrTestNacl('nop_test.out', nexe)
asm_env.AddNodeToTestSuite(node, testsuite,
'run_nop_test')
# Test that both the layout and the nops are not munged by stripping.
stripped_nexe = asm_env.Command('strip_test.nexe', nexe,
'${STRIP} -o ${TARGET} ${SOURCES}')
node = asm_env.CommandSelLdrTestNacl('strip_test.out', stripped_nexe)
asm_env.AddNodeToTestSuite(node, testsuite,
'run_strip_test')
if not env.Bit('nacl_disable_shared') and not env.Bit('nacl_static_link'):
env.NaClSharedLibrary('pic_constant_lib', ['pic_constant_lib.c'])
nexe = env.ComponentProgram('pic_constant', ['pic_constant.c'],
EXTRA_LIBS=['pic_constant_lib', '${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('pic_constant.out', nexe)
env.AddNodeToTestSuite(node, testsuite,
'run_pic_constant_test')
WRAP_LINK_FLAGS = ['-Wl,--wrap=foo', '-Wl,--wrap=bar']
env.ComponentLibrary('wrap_lib', ['wrap_lib1.c', 'wrap_lib2.c'])
nexe = env.ComponentProgram('wrap', ['wrap_main.c'],
EXTRA_LINKFLAGS=WRAP_LINK_FLAGS,
EXTRA_LIBS=['wrap_lib', '${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl('wrap.out', nexe,
stdout_golden=env.File('wrap.stdout'))
env.AddNodeToTestSuite(node, ['toolchain_tests','small_tests'], 'run_wrap_test')
if (env.Bit('build_x86_32') and env.Bit('bitcode') and
not env.Bit('pnacl_generate_pexe')):
# This test compiles a file that will need to generate a call to a compiler-rt
# function (__udivdi3) on x86-32. Ensure that when we pre-translate to a
# native object file, libgcc is included in the bitcode link to satisfy the
# reference.
mixedlink_env = env.Clone()
mixedlink_env.Append(CCFLAGS=['--pnacl-allow-translate',
'--pnacl-allow-native',
'-arch', 'x86-32'])
mixedlink_env.Append(LINKFLAGS=['--pnacl-allow-translate',
'--pnacl-allow-native',
'-arch', 'x86-32'])
nexe = mixedlink_env.ComponentProgram('libgcc_mixed_link', 'needs_libgcc.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = mixedlink_env.CommandSelLdrTestNacl('libgcc_mixed_link.out', nexe,
['9', '3'])
mixedlink_env.AddNodeToTestSuite(node, ['nonpexe_tests', 'small_tests',
'toolchain_tests'],
'run_libgcc_mixed_link_test')
# This tests the translator's -force-align-stack flag, which means that the
# compiler cannot assume that the stack pointer is aligned to a 16-byte
# boundary, and must force realignment on entry to each function.
mixedlink_env.Append(ASFLAGS=['-arch', 'x86-32'])
mixedlink_env.Append(CCFLAGS=['-Wt,-force-align-stack'])
nexe = mixedlink_env.ComponentProgram(
'stackalign_test',
['call_with_misaligned_stack.S', 'stackalign_test.c'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = mixedlink_env.CommandSelLdrTestNacl('stackalign.out', nexe)
mixedlink_env.AddNodeToTestSuite(
node,
['nonpexe_tests', 'small_tests', 'toolchain_tests'],
'run_stackalign_test')
alt_env = env.Clone()
if ((alt_env.Bit('bitcode') and alt_env.SetNonStableBitcodeIfAllowed())
or alt_env.Bit('nacl_clang')):
# We want to enable optimizations, to ensure "used" entrypoints
# are kept.
alt_env.Append(CFLAGS=['-O3'])
alt_env.Append(CCFLAGS=['-O3'])
alt_env.Append(LINKFLAGS=['-O3'])
exe = alt_env.ComponentProgram(
'llvm_used_globals',
['llvm_used_globals.cc'],
EXTRA_LIBS=['${NONIRT_LIBS}'])
c_file = alt_env.File('llvm_used_globals.cc')
node = alt_env.CommandTestFileDumpCheck('llvm_used_globals_objdump.out',
exe,
c_file,
'-d')
alt_env.AddNodeToTestSuite(node,
['small_tests', 'toolchain_tests'],
'run_llvm_used_globals_objdump_test')
tf_env = env.Clone()
if tf_env.Bit('bitcode') and tf_env.SetNonStableBitcodeIfAllowed():
tf_env.Append(TRANSLATEFLAGS=['-stream-bitcode', '-split-module=2'])
obj = tf_env.ComponentObject('aligned_code.trans.bc',
'aligned_code.c')
pexe = tf_env.ComponentProgram('nonstable_streaming_bitcode', obj,
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = tf_env.CommandSelLdrTestNacl('nonstable_streaming_bitcode.out', pexe)
tf_env.AddNodeToTestSuite(node,
['small_tests', 'toolchain_tests'],
'run_nonstable_streaming_bitcode_test')