1# -*- python -*-
2# Copyright 2012 The Native Client Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6# Calling convention test to ensure interoperabilty of nacl-gcc and
7# pnacl generated code
8
9Import('env')
10
11# This test does not make any sense for pure pnacl
12if not env.Bit('bitcode'):
13  Return()
14
15if env.Bit('pnacl_generate_pexe'):
16  Return()
17
18# This test is disabled for MIPS because we do not have a MIPS-enabled nacl-gcc
19# to test PNaCl against.
20if env.Bit('build_mips32'):
21  Return()
22
23env_pnacl_cc = env.Clone()
24env_pnacl_cc.PNaClForceNative()
25# for ppapi headers which include other ppapi headers
26env_pnacl_cc.Append(CPPPATH='${SCONSTRUCT_DIR}/tests/callingconv_ppapi')
27
28if env.Bit('build_arm'):
29  pnacl_nativecc_flags = ['--target=armv7a-unknown-nacl-gnueabi',
30                          '-mfloat-abi=hard']
31elif env.Bit('build_x86_32'):
32  pnacl_nativecc_flags = ['--target=i686-unknown-nacl']
33elif env.Bit('build_x86_64'):
34  pnacl_nativecc_flags = ['--target=x86_64-unknown-nacl']
35
36env_pnacl_cc_calling = env_pnacl_cc.Clone()
37env_pnacl_cc_calling.Append(
38    CCFLAGS=pnacl_nativecc_flags,
39    # force invoked functions to have "gcc" prefix
40    CPPDEFINES=['INVOCATION_PREFIX=gcc'])
41env_pnacl_cc_called = env_pnacl_cc.Clone()
42env_pnacl_cc_called.Append(
43    CCFLAGS=pnacl_nativecc_flags,
44    # force both defined and invoked functions to have the "pnacl" prefix
45    CPPDEFINES=['FUNCTION_PREFIX=pnacl', 'INVOCATION_PREFIX=pnacl'])
46
47gcc_cc_env = env_pnacl_cc.PNaClGetNNaClEnv()
48# GCC's C++ EH support requires GCC's runtime, which we don't link with.
49gcc_cc_env.Append(CXXFLAGS=['-fno-exceptions'])
50
51# This can generate references to runtime code we won't link with.
52gcc_cc_env.FilterOut(CCFLAGS=['-fasynchronous-unwind-tables'])
53
54env_gcc_cc_calling = gcc_cc_env.Clone()
55env_gcc_cc_calling.Append(
56    # force invoked functions to have "pnacl" prefix
57    CPPDEFINES=['INVOCATION_PREFIX=pnacl'])
58env_gcc_cc_called = gcc_cc_env.Clone()
59env_gcc_cc_called.Append(
60    # force both defined and invoked functions to have the "gcc" prefix
61    CPPDEFINES=['FUNCTION_PREFIX=gcc', 'INVOCATION_PREFIX=gcc'])
62
63# Note: this file is alwyas built with the pnacl TC
64obj_support = env_pnacl_cc.ComponentObject('support.c')
65
66env_pnacl_cc_called.ComponentObject('obj_pnacl_called',
67                                    'ppapi_callingconv_test.cpp')
68
69env_pnacl_cc_calling.ComponentObject('obj_pnacl_calling',
70                                     'ppapi_callingconv_test.cpp')
71env_pnacl_cc.ComponentObject('obj_pnacl_both',
72                             'ppapi_callingconv_test.cpp')
73
74env_gcc_cc_called.ComponentObject('obj_gcc_called',
75                                  'ppapi_callingconv_test.cpp')
76
77env_gcc_cc_calling.ComponentObject('obj_gcc_calling',
78                                   'ppapi_callingconv_test.cpp')
79
80gcc_cc_env.ComponentObject('obj_gcc_both',
81                           'ppapi_callingconv_test.cpp')
82
83
84TARGETS = [
85  # pnacl self consistency tests
86  ('pnacl_both', ['obj_pnacl_both', obj_support]),
87  # gcc self consistency tests
88  ('gcc_both', ['obj_gcc_both', obj_support]),
89  # gcc compiled code invoking pnacl compiled code:
90  # * obj_gcc_calling contains gcc compiled code invoking functions
91  #   with the "pnacl" prefix
92  # * obj_pnacl_called contains pnacl compiled functions with the "pnacl"
93  #   prefix
94  ('gcc_calls_pnacl', ['obj_gcc_calling', 'obj_pnacl_called', obj_support]),
95  # pnacl compiled code invoking gcc compiled code:
96  # * obj_pnacl_calling contains pnacl compiled code invoking functions
97  #   with the "gcc" prefix
98  # * obj_gcc_called contains gcc compiled functions with the "gcc"
99  #   prefix
100  ('pnacl_calls_gcc',['obj_pnacl_calling', 'obj_gcc_called', obj_support]),
101]
102
103
104for name, objs in TARGETS:
105  nexe = env_pnacl_cc.ComponentProgram('callingconv_ppapi_%s' % name,
106                                       objs,
107                                       EXTRA_LIBS=['${NONIRT_LIBS}'])
108  test= env.CommandSelLdrTestNacl('callingconv_ppapi_%s.out' % name,
109                                  nexe,
110                                  stdout_golden=env.File('golden.out'))
111  env.AddNodeToTestSuite(test,
112                         ['medium_tests', 'nonpexe_tests'],
113                         'run_callingconv_ppapi_%s_test' % name)
114