blob: de72e1221bd1c93bb64f9f9db24f4b6022b6af94 [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')
# This test does not make any sense for pure pnacl
if env.Bit('bitcode') and env.Bit('pnacl_generate_pexe'):
Return()
# This test is disabled for MIPS because we do not have a MIPS-enabled nacl-gcc
# to test PNaCl against.
if env.Bit('build_mips32'):
Return()
if env.Bit('bitcode'):
# Disabling the PNaCl ABI checker is necessary for the
# PNaCl-calling-PNaCl case below because the test uses the __m128
# type, which the checker rejects.
env.Append(LINKFLAGS=['--pnacl-disable-abi-check'])
# Case-by-case calling Convention Test for PNaCl and nacl-gcc compatibility.
# We make 4 modules.
# CC1 emits MODULE0 and CC2 MODULE1, CC2 emits MODULE2 and CC1 MODULE3
# For the call test:
# MODULE0(cc1) -> MODULE0(cc1) -> MODULE1(cc2) -> MODULE2(cc2) -> MODULE3(cc1).
# For the return test, the dataflow is reversed.
# List of (4 envs for the modules, link_env, test_name_suffix)
# to apply to each source. The 4 envs may have different flags.
test_configurations = []
def AddCommonFlags(envlist):
for (i, e) in enumerate(envlist):
# Add -Wno-long-long because we use c99 long long constants in C++ code.
# GCC warns/errors about kPTR_EMPTYSTRUCT_PTR as an unused variable.
e.Append(CCFLAGS=['-DMODULE' + str(i), '-Wno-long-long',
'-Wno-unused-variable'])
def MakeSelfTestEnv(base_env, extra_flags):
""" Make a list of four (nearly identical) envs which use the same CC
for compiling the four modules to test self-consistency. """
base_env = base_env.Clone()
base_env.Append(CCFLAGS=extra_flags)
# Same CC for all, but assign different module defines later.
envlist = [base_env.Clone() for dummy_count in xrange(4)]
AddCommonFlags(envlist)
link_env = base_env
return (envlist, link_env)
def MakeCrossEnvs(base_env, gcc_flags, clang_flags):
""" Make a list of four (nearly identical) envs, some of which use nacl-clang
and some use pnacl, for compiling the four modules to test consistency.
"""
envlist = []
# For module0
cc1_env = base_env.Clone()
cc1_env.PNaClForceNative()
cc1_env.Append(CCFLAGS=clang_flags)
envlist.append(cc1_env)
# For module1
cc2_env = base_env.PNaClGetNNaClEnv()
cc2_env.Append(CCFLAGS=gcc_flags)
# GCC's C++ EH support requires GCC's runtime, which we don't link with.
cc2_env.Append(CXXFLAGS=['-fno-exceptions'])
# This can generate references to runtime code we won't link with.
cc2_env.FilterOut(CCFLAGS=['-fasynchronous-unwind-tables'])
envlist.append(cc2_env)
envlist.append(cc2_env.Clone()) # For module2
envlist.append(cc1_env.Clone()) # For module3
link_env = cc1_env # To allow linking native objects (from ForceNative).
AddCommonFlags(envlist)
return (envlist, link_env)
if not env.Bit('bitcode'):
# For gcc, only do a self-consistency test.
if env.Bit('build_x86'):
# Assume for nacl-gcc the bots have at least SSE2.
extra_flags = ['-msse2']
else:
extra_flags = []
envlist, link_env = MakeSelfTestEnv(env, extra_flags)
test_configurations.append((envlist, link_env, ''))
else:
# For PNaCl, do a self-consistency + a cross toolchain check.
envlist, link_env = MakeSelfTestEnv(env, [])
test_configurations.append((envlist, link_env, '_self'))
if env.Bit('build_arm'):
pnacl_flags=['--target=armv7a-unknown-nacl-gnueabi','-mfloat-abi=hard']
envlist, link_env = MakeCrossEnvs(
env,
gcc_flags=[],
clang_flags = pnacl_flags if env.Bit('bitcode') else [])
test_configurations.append((envlist, link_env, ''))
elif env.Bit('build_x86_32'):
native_flags=['-msse2']
pnacl_flags=['--target=i686-unknown-nacl']
envlist, link_env = MakeCrossEnvs(
env,
gcc_flags=native_flags,
clang_flags = pnacl_flags if env.Bit('bitcode') else native_flags)
test_configurations.append((envlist, link_env, ''))
elif env.Bit('build_x86_64'):
native_flags = ['-msse2']
pnacl_flags = ['--target=x86_64-unknown-nacl']
envlist, link_env = MakeCrossEnvs(
env,
gcc_flags=native_flags,
clang_flags=pnacl_flags if env.Bit('bitcode') else native_flags)
test_configurations.append((envlist, link_env, ''))
else:
raise Exception("Unknown target architecture!")
######################################################################
for test_source in ['return_structs.cc',
'call_structs.cc']:
test_name = test_source.split('.')[0]
for (envlist, link_env, test_suffix) in test_configurations:
objfiles = []
test_full_name = test_name + test_suffix
for (i, e) in enumerate(envlist):
obj = e.ComponentObject(test_full_name + '.' + str(i),
test_source)
objfiles.append(obj)
prog = link_env.ComponentProgram(test_full_name,
objfiles,
EXTRA_LIBS=['${NONIRT_LIBS}'])
node = env.CommandSelLdrTestNacl(test_full_name + '.out',
prog)
env.AddNodeToTestSuite(node, ['small_tests', 'toolchain_tests',
'nonpexe_tests'],
'run_' + test_full_name + '_test')