# -*- 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')

# Use of "-nostdlib" means these tests produce statically-linked
# executables.  This does not work with the test runner for
# nacl-glibc, which always runs the executables via ld.so.  However,
# we want to keep building the tests.
# TODO(mseaborn): To fix this, either switch these tests to
# dynamically link against libc, or make use of ld.so optional.
is_glibc = env.Bit('nacl_glibc')

env.Replace(LIBS=[],
            EXTRA_LIBS=[],
            LINKFLAGS=['-nostdlib'])

# This can generate references to runtime code we won't link with.
env.FilterOut(CCFLAGS=['-fasynchronous-unwind-tables'])

# This setting will affect the barebones_regs.c test
if env.Bit('build_arm'):
  env.Append(CPPDEFINES='SMALL_REGS_TEST')

# NOTE: the x86 linker wants _start() to be the very first function
FAKE_STARTUP = env.ComponentObject('fake_startup', 'fake_startup.c')

barebones_tests = ['addr_modes',
                   'exit',
                   'fib',
                   'hello_world',
                   'negindex',
                   'only_bss',
                   'regs',
                   'reloc',
                   'switch',
                   'vtable',
                   'vaarg',
                   ]

for basename in barebones_tests:
  # TODO(kcc): the barebones tests confuse the current nacl-ified valgrind.
  if env.IsRunningUnderValgrind(): continue
  is_broken = is_glibc
  # This is generating a (probably invalid) relocation on PNaCl GlibC X86-64
  # which cannot be handled by the TLS rewrite in binutils.
  if basename == 'reloc' and is_glibc and env.Bit('build_x86_64'):
    continue
  # For MIPS32, barebones_reloc requires a call to 64-bit atomics implemented
  # in compiler-rt library, so this test has to be skipped for this arch.
  if (basename == 'reloc' and env.Bit('build_mips32') and
      not env.Bit('pnacl_generate_pexe')):
    continue

  src = 'barebones_' + basename + '.c'
  nexe_name = 'barebones_' + basename
  out = 'barebones_' + basename + '.out'
  test = 'run_barebones_' + basename + '_test'
  test = 'run_barebones_' + basename + '_test'
  nexe = env.ComponentProgram(nexe_name, [FAKE_STARTUP, src])

  # NOTE: we avoid using zero as the "good" exit status and just
  #       arbitrarily picked 55. All tests are coded to follow this model.
  node = env.CommandSelLdrTestNacl(out, nexe, exit_status='55')

  env.AddNodeToTestSuite(node,
                         ['small_tests', 'sel_ldr_tests', 'barebones_tests'],
                         test,
                         is_broken=is_broken)

# The top_of_sandbox test does not apply to x86-32 because the bug
# it tests for cannot happen in a segment-based sandbox, only with
# a sandbox where some kind of address-masking is done.
if not env.Bit('bitcode') and not env.Bit('build_x86_32'):
  nexe = env.ComponentProgram('top_of_sandbox', ['top_of_sandbox.c'])
  node = env.CommandSelLdrTestNacl('top_of_sandbox.out', nexe)
  env.AddNodeToTestSuite(
      node, ['small_tests', 'sel_ldr_tests',
             'barebones_tests', 'nonpexe_tests'],
      'run_top_of_sandbox_test',
      is_broken=is_glibc)
