blob: 9cc3400f3dc8a82e5d88fb7bc7ba16b0ffa5b00f [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 os
Import('env')
if 'TRUSTED_ENV' not in env:
Return()
if env.UnderWindowsCoverage():
Return()
if env.Bit('build_arm') or env.Bit('build_mips32'):
if env.UsingEmulator():
# nacl-gdb is built with ARM support but not MIPS support.
if env.Bit('build_mips32'):
Return()
nacl_x86_toolchain_dir = env.GetToolchainDir(target_arch='x86',
is_pnacl=False,
lib_name='glibc')
nacl_gdb_path = os.path.join(nacl_x86_toolchain_dir, 'bin', 'i686-nacl-gdb')
env.Replace(GDB=nacl_gdb_path)
else:
# Use the system's ARM/MIPS GDB because the NaCl toolchain does not
# include a copy of GDB built to run on ARM/MIPS.
env.Replace(GDB='gdb')
# Unlike nacl-gdb, the system version of GDB does not support the
# "nacl-irt" command.
if env.Bit('tests_use_irt'):
Return()
# Disable finalization (which would strip debug metadata), but allow
# the sandbox translator where it makes sense.
if not env.SetNonStableBitcodeIfAllowed(allow_sb_translator=True):
Return()
# We need -O0 to make stepping predictable and read local variables/function
# arguments that may otherwise be optimized out.
env.Append(CCFLAGS=['-O0', '-g', '-fno-omit-frame-pointer'])
# We need to disable PNaCl's link time optimizations so that functions
# do not get inlined, so that we can set breakpoints on these
# functions. Also make translation optimizaton level -O0.
if env.Bit('bitcode'):
env.Append(LINKFLAGS=['-O0'])
env.Append(TRANSLATEFLAGS=['-O0'])
# TODO(jfb) ARM bots test the local GDB, which isn't as recent as
# nacl-gdb. The move to LLVM 3.5 broke line info reading on some of
# the ARM bots, and using DWARF 3 "fixes" this issue.
if env.Bit('build_arm'):
env.Append(CCFLAGS=['-gdwarf-3'])
sel_ldr_command = env.AddBootstrap(env.GetSelLdr(), ['-v'])
if env.GetEmulator():
# Run sel_ldr through qemu-arm. Add "-Q" to disable the platform
# qualification tests because they fail under qemu-arm.
sel_ldr_command = [env.GetEmulator()] + sel_ldr_command + ['-Q']
test_args = ['--gdb', env['GDB'],
'--output_dir', env.subst('${TARGET_ROOT}/test_results')]
if env.Bit('tests_use_irt'):
test_args += ['--irt', env.GetIrtNexe()]
if not env.Bit('nacl_static_link'):
test_args += ['--ld_so', env.File('${NACL_SDK_LIB}/runnable-ld.so'),
'--library_path', env['NACL_SDK_LIB']]
test_args += ['--'] + sel_ldr_command
extra_deps = [env.File('gdb_test.py')]
test_suites = ['medium_tests', 'gdb_tests']
gdb_test_guest = env.ComponentProgram(
'gdb_test_guest', 'gdb_test_guest.c',
EXTRA_LIBS=['${NONIRT_LIBS}'])
gdb_test_guest = env.GetTranslatedNexe(gdb_test_guest)
# GDB treats multithreaded programs specially. Provide distinct nexe for
# multithreaded tests to isolate multiple threads-specific issues.
gdb_test_guest_thread = env.ComponentProgram(
'gdb_test_guest_thread', 'gdb_test_guest_thread.c',
EXTRA_LIBS=['${PTHREAD_LIBS}', '${NONIRT_LIBS}'])
gdb_test_guest_thread = env.GetTranslatedNexe(gdb_test_guest_thread)
# TempFileArguments: gdb_test_guest-based tests below accept a
# temporary file argument, and we encapsulate this here for brevity /
# to avoid code duplication.
def TempFileArguments():
temp_path = env.MakeEmptyFile(prefix='nacl_gdb_test_')
return ','.join(['-f', temp_path])
def AddGdbTest(name, is_broken=False, is_thread_test=False):
if is_thread_test:
script_args = ['--nexe', gdb_test_guest_thread]
else:
script_args = ['--nexe', gdb_test_guest,
'--nexe_args', TempFileArguments()]
node = env.CommandTest('%s.out' % name,
extra_deps=extra_deps,
command=(['${PYTHON}', env.File('%s.py' % name)]
+ script_args
+ test_args),
# Don't run the host Python through qemu-arm.
direct_emulation=False)
env.TestBindsFixedTcpPort(node)
env.AddNodeToTestSuite(node, test_suites, 'run_gdb_%s_test' % name,
is_broken=(is_broken or env.Bit('no_gdb_tests') or
# TODO(mcgrathr): Currently these tests
# do not work with the new glibc.
(env.Bit('nacl_glibc') and
env.Bit('build_arm'))))
AddGdbTest('complete')
AddGdbTest('detach')
AddGdbTest('disconnect')
# https://code.google.com/p/nativeclient/issues/detail?id=4059
AddGdbTest('invalid_memory',
is_broken = (env.Bit('nacl_clang') and not env.UsingEmulator()))
AddGdbTest('kill')
AddGdbTest('remote_get')
# Single-stepping does work reliably with ARM and MIPS in qemu due to the code
# cache not being flushable.
AddGdbTest('stepi_after_break', is_broken=env.UsingEmulator())
using_clang = env.Bit('bitcode') or env.Bit('nacl_clang')
# This fails on ARM+PNaCl. The set_global_var function appears to be
# getting the wrong argument value (68K vs 1), so the value of
# global_var doesn't match the expected value.
# TODO(mseaborn): Investigate and enable this test.
# http://code.google.com/p/nativeclient/issues/detail?id=3252
# This test also fails with arm-nacl-clang:
# https://code.google.com/p/nativeclient/issues/detail?id=4059
AddGdbTest('print_symbol',
is_broken=((using_clang and env.Bit('build_arm'))
or env.UsingEmulator()))
# This fails on ARM+PNaCl because it gets an
# unexpected value for a function argument from
# the stack backtrace.
# TODO(mseaborn): Investigate and enable this test.
# http://code.google.com/p/nativeclient/issues/detail?id=3252
AddGdbTest('stack_trace',
is_broken=using_clang and env.Bit('build_arm'))
# This fails on ARM+nacl-clang
# https://code.google.com/p/nativeclient/issues/detail?id=4059
AddGdbTest('step_from_func_start',
is_broken=(env.UsingEmulator() or
(env.Bit('nacl_clang') and env.Bit('build_arm'))))
# This fails on MIPS, since GDB for MIPS executes inferior calls on stack
# (call dummy location in MIPS GDB is set as ON_STACK method). Since the stack
# is not executable under NaCl, this makes inferior call impossible to execute.
AddGdbTest('call_from_gdb', is_broken=env.Bit('build_mips32'))
# This fails on ARM/MIPS+PNaCl because it is reading
# local_var before it has been initialised.
# TODO(mseaborn): Investigate and enable this test.
# http://code.google.com/p/nativeclient/issues/detail?id=3252
# This test also fails with arm-nacl-clang:
# https://code.google.com/p/nativeclient/issues/detail?id=4059
AddGdbTest('change_variable',
is_broken=((using_clang and env.Bit('build_arm')) or
env.Bit('build_mips32') or
env.UsingEmulator()))
if not env.Bit('nacl_static_link'):
AddGdbTest('execute_nacl_manifest_twice')
# This test hangs under qemu-arm because thread suspension doesn't
# work on qemu-arm.
AddGdbTest('break_continue_thread', is_thread_test=True,
is_broken=env.UsingEmulator())
AddGdbTest('syscall_thread', is_thread_test=True)
# We don't run this test on non-x86 architectures or PNaCl since it
# contains inline assembly.
if env.Bit('build_x86') and not env.Bit('bitcode'):
AddGdbTest('mmap')