* [PATCH] jit.exp: support C++ testcases
@ 2014-12-10 19:56 David Malcolm
2015-01-07 19:28 ` [PATCH, committed] " David Malcolm
0 siblings, 1 reply; 2+ messages in thread
From: David Malcolm @ 2014-12-10 19:56 UTC (permalink / raw)
To: gcc-patches, jit; +Cc: David Malcolm
There is an ugly kludge here in jit.exp, but it works.
Is there a better way to do this? (see "Kludge alert" at top of
jit.exp)
gcc/jit/ChangeLog:
* TODO.rst (Test suite): Remove item about running C++ testcases.
* docs/internals/index.rst (Working on the JIT library): Add
"c++" to the enabled languages in the suggested "configure"
invocation, and add a description of why this is necessary.
gcc/testsuite/ChangeLog:
* jit.dg/jit.exp: Load wrapper.exp with %{tool} set to "g++"
rather than "jit". Load g++.exp, and call g++_init.
Run test-*.cc files within the testsuite and *.cc files within
docs/examples.
(jit-dg-test): Drop the addition of -fgnu89-inline to
DEFAULT_CFLAGS in favor of adding it to additional_flags, only
doing it when compiling C testcases (since g++ does not handle
it).
---
gcc/jit/TODO.rst | 2 --
gcc/jit/docs/internals/index.rst | 13 ++++++++--
gcc/testsuite/jit.dg/jit.exp | 54 ++++++++++++++++++++++++++++++++--------
3 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/gcc/jit/TODO.rst b/gcc/jit/TODO.rst
index 09c4d9d..ca0ddbb 100644
--- a/gcc/jit/TODO.rst
+++ b/gcc/jit/TODO.rst
@@ -81,8 +81,6 @@ Bugs
Test suite
==========
-* get DejaGnu to build and run C++ testcases
-
* measure code coverage in testing of libgccjit.so
Future milestones
diff --git a/gcc/jit/docs/internals/index.rst b/gcc/jit/docs/internals/index.rst
index 1d46818..50c55b0 100644
--- a/gcc/jit/docs/internals/index.rst
+++ b/gcc/jit/docs/internals/index.rst
@@ -31,7 +31,7 @@ the JIT library like this:
cd build
../src/configure \
--enable-host-shared \
- --enable-languages=jit \
+ --enable-languages=jit,c++ \
--disable-bootstrap \
--enable-checking=release \
--prefix=$PREFIX
@@ -54,11 +54,20 @@ Here's what those configuration options mean:
position-independent code, which incurs a slight performance hit,
but it necessary for a shared library.
-.. option:: --enable-languages=jit
+.. option:: --enable-languages=jit,c++
This specifies which frontends to build. The JIT library looks like
a frontend to the rest of the code.
+ The C++ portion of the JIT test suite requires the C++ frontend to be
+ enabled at configure-time, or you may see errors like this when
+ running the test suite:
+
+ .. code-block:: console
+
+ xgcc: error: /home/david/jit/src/gcc/testsuite/jit.dg/test-quadratic.cc: C++ compiler not installed on this system
+ c++: error trying to exec 'cc1plus': execvp: No such file or directory
+
.. option:: --disable-bootstrap
For hacking on the "jit" subdirectory, performing a full
diff --git a/gcc/testsuite/jit.dg/jit.exp b/gcc/testsuite/jit.dg/jit.exp
index a37ccc7..454e656 100644
--- a/gcc/testsuite/jit.dg/jit.exp
+++ b/gcc/testsuite/jit.dg/jit.exp
@@ -14,6 +14,20 @@
# up into the Tcl world, reporting a summary of all results
# across all of the executables.
+# Kludge alert:
+# We need g++_init so that it can find the stdlib include path.
+#
+# g++_init (in lib/g++.exp) uses g++_maybe_build_wrapper,
+# which normally comes from the definition of
+# ${tool}_maybe_build_wrapper within lib/wrapper.exp.
+#
+# However, for us, ${tool} is "jit".
+# Hence we load wrapper.exp with tool == "g++", so that
+# g++_maybe_build_wrapper is defined.
+set tool g++
+load_lib wrapper.exp
+set tool jit
+
load_lib dg.exp
load_lib prune.exp
load_lib target-supports.exp
@@ -21,6 +35,7 @@ load_lib gcc-defs.exp
load_lib timeout.exp
load_lib target-libpath.exp
load_lib gcc.exp
+load_lib g++.exp
load_lib dejagnu.exp
# Look for lines of the form:
@@ -264,17 +279,25 @@ if ![info exists GCC_UNDER_TEST] {
set GCC_UNDER_TEST "[find_gcc]"
}
+g++_init
+
# Initialize dg.
dg-init
# Gather a list of all tests.
-# Tests within the testsuite: gcc/testsuite/jit.dg/test-*.c
-set tests [lsort [find $srcdir/$subdir test-*.c]]
+# C tests within the testsuite: gcc/testsuite/jit.dg/test-*.c
+set tests [find $srcdir/$subdir test-*.c]
+
+# C++ tests within the testsuite: gcc/testsuite/jit.dg/test-*.cc
+set tests [concat $tests [find $srcdir/$subdir test-*.cc]]
# We also test the examples within the documentation, to ensure that
# they compile:
-set tests [lsort [concat $tests [find $srcdir/../jit/docs/examples *.c]]]
+set tests [concat $tests [find $srcdir/../jit/docs/examples *.c]]
+set tests [concat $tests [find $srcdir/../jit/docs/examples *.cc]]
+
+set tests [lsort $tests]
verbose "tests: $tests"
@@ -306,8 +329,24 @@ proc jit-dg-test { prog do_what extra_tool_flags } {
verbose "output_file: $output_file"
# Create the test executable:
- set comp_output [gcc_target_compile $prog $output_file $do_what \
- "{additional_flags=$extra_tool_flags}"]
+ set extension [file extension $prog]
+ if {$extension == ".cc"} {
+ set compilation_function "g++_target_compile"
+ set options "{additional_flags=$extra_tool_flags}"
+ } else {
+ set compilation_function "gcc_target_compile"
+ # Until recently, <dejagnu.h> assumed -fgnu89-inline
+ # Ideally we should fixincludes it (PR other/63613), but
+ # for now add -fgnu89-inline when compiling C JIT testcases.
+ # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63613
+ # and http://lists.gnu.org/archive/html/dejagnu/2014-10/msg00011.html
+ set options "{additional_flags=$extra_tool_flags -fgnu89-inline}"
+ }
+ verbose "compilation_function=$compilation_function"
+ verbose "options=$options"
+
+ set comp_output [$compilation_function $prog $output_file \
+ "executable" $options]
upvar 1 name name
if ![jit_check_compile "$name" "initial compilation" \
$output_file $comp_output] then {
@@ -388,11 +427,6 @@ proc jit-dg-test { prog do_what extra_tool_flags } {
# so that the JIT-built code can call into functions from the main program.
set DEFAULT_CFLAGS "-I$srcdir/../jit -lgccjit -g -Wall -Werror -Wl,--export-dynamic"
-# <dejagnu.h> assumes -fgnu89-inline
-# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63613
-# and http://lists.gnu.org/archive/html/dejagnu/2014-10/msg00011.html
-append DEFAULT_CFLAGS " -fgnu89-inline"
-
# Main loop. This will invoke jig-dg-test on each test-*.c file.
dg-runtest $tests "" $DEFAULT_CFLAGS
--
1.8.5.3
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH, committed] jit.exp: support C++ testcases
2014-12-10 19:56 [PATCH] jit.exp: support C++ testcases David Malcolm
@ 2015-01-07 19:28 ` David Malcolm
0 siblings, 0 replies; 2+ messages in thread
From: David Malcolm @ 2015-01-07 19:28 UTC (permalink / raw)
To: jit, gcc-patches; +Cc: David Malcolm
This adds at least two ugly kludges to jit.exp, but it works:
in particular: the setting of tool to "g++" when loading wrapper.lib,
and the resetting of "orig_environment_saved".
I also noticed that jit-dg-test wasn't returning a list of the form:
[list $comp_output $output_file]
as dg-test assumes, so I fixed that. I'm not sure how that aspect
ever worked before.
This takes jit.sum from
# of expected passes 5008
to:
# of expected passes 5158
and finally gives us automated test coverage of the C++ bindings to
libgccjit.
Committed to trunk as r219318.
gcc/jit/ChangeLog:
* TODO.rst (Test suite): Remove item about running C++ testcases.
* docs/internals/index.rst (Working on the JIT library): Add
"c++" to the enabled languages in the suggested "configure"
invocation, and add a description of why this is necessary.
* docs/_build/texinfo/libgccjit.texi: Regenerate.
gcc/testsuite/ChangeLog:
* jit.dg/jit.exp: Load wrapper.exp with %{tool} set to "g++"
rather than "jit". Load g++.exp, and call g++_init.
Run test-*.cc files within the testsuite and *.cc files within
docs/examples.
(jit-dg-test): Drop the addition of -fgnu89-inline to
DEFAULT_CFLAGS in favor of adding it to additional_flags, only
doing it when compiling C testcases (since g++ does not handle
it). Reset "orig_environment_saved" so that LD_LIBRARY_PATH
is restored to the value after g++_init ran, rather than the
value before g++_init ran. Return a list of
$comp_output $output_file, as dg-test assumes.
---
gcc/jit/TODO.rst | 2 --
gcc/jit/docs/internals/index.rst | 13 +++++--
gcc/testsuite/jit.dg/jit.exp | 78 ++++++++++++++++++++++++++++++++++------
3 files changed, 79 insertions(+), 14 deletions(-)
diff --git a/gcc/jit/TODO.rst b/gcc/jit/TODO.rst
index 09c4d9d..ca0ddbb 100644
--- a/gcc/jit/TODO.rst
+++ b/gcc/jit/TODO.rst
@@ -81,8 +81,6 @@ Bugs
Test suite
==========
-* get DejaGnu to build and run C++ testcases
-
* measure code coverage in testing of libgccjit.so
Future milestones
diff --git a/gcc/jit/docs/internals/index.rst b/gcc/jit/docs/internals/index.rst
index 424c73e..694f058 100644
--- a/gcc/jit/docs/internals/index.rst
+++ b/gcc/jit/docs/internals/index.rst
@@ -31,7 +31,7 @@ the JIT library like this:
cd build
../src/configure \
--enable-host-shared \
- --enable-languages=jit \
+ --enable-languages=jit,c++ \
--disable-bootstrap \
--enable-checking=release \
--prefix=$PREFIX
@@ -54,11 +54,20 @@ Here's what those configuration options mean:
position-independent code, which incurs a slight performance hit,
but it necessary for a shared library.
-.. option:: --enable-languages=jit
+.. option:: --enable-languages=jit,c++
This specifies which frontends to build. The JIT library looks like
a frontend to the rest of the code.
+ The C++ portion of the JIT test suite requires the C++ frontend to be
+ enabled at configure-time, or you may see errors like this when
+ running the test suite:
+
+ .. code-block:: console
+
+ xgcc: error: /home/david/jit/src/gcc/testsuite/jit.dg/test-quadratic.cc: C++ compiler not installed on this system
+ c++: error trying to exec 'cc1plus': execvp: No such file or directory
+
.. option:: --disable-bootstrap
For hacking on the "jit" subdirectory, performing a full
diff --git a/gcc/testsuite/jit.dg/jit.exp b/gcc/testsuite/jit.dg/jit.exp
index 307cc04..098ce5e 100644
--- a/gcc/testsuite/jit.dg/jit.exp
+++ b/gcc/testsuite/jit.dg/jit.exp
@@ -14,6 +14,20 @@
# up into the Tcl world, reporting a summary of all results
# across all of the executables.
+# Kludge alert:
+# We need g++_init so that it can find the stdlib include path.
+#
+# g++_init (in lib/g++.exp) uses g++_maybe_build_wrapper,
+# which normally comes from the definition of
+# ${tool}_maybe_build_wrapper within lib/wrapper.exp.
+#
+# However, for us, ${tool} is "jit".
+# Hence we load wrapper.exp with tool == "g++", so that
+# g++_maybe_build_wrapper is defined.
+set tool g++
+load_lib wrapper.exp
+set tool jit
+
load_lib dg.exp
load_lib prune.exp
load_lib target-supports.exp
@@ -21,6 +35,7 @@ load_lib gcc-defs.exp
load_lib timeout.exp
load_lib target-libpath.exp
load_lib gcc.exp
+load_lib g++.exp
load_lib dejagnu.exp
# Look for lines of the form:
@@ -264,17 +279,25 @@ if ![info exists GCC_UNDER_TEST] {
set GCC_UNDER_TEST "[find_gcc]"
}
+g++_init
+
# Initialize dg.
dg-init
# Gather a list of all tests.
-# Tests within the testsuite: gcc/testsuite/jit.dg/test-*.c
-set tests [lsort [find $srcdir/$subdir test-*.c]]
+# C tests within the testsuite: gcc/testsuite/jit.dg/test-*.c
+set tests [find $srcdir/$subdir test-*.c]
+
+# C++ tests within the testsuite: gcc/testsuite/jit.dg/test-*.cc
+set tests [concat $tests [find $srcdir/$subdir test-*.cc]]
# We also test the examples within the documentation, to ensure that
# they compile:
-set tests [lsort [concat $tests [find $srcdir/../jit/docs/examples *.c]]]
+set tests [concat $tests [find $srcdir/../jit/docs/examples *.c]]
+set tests [concat $tests [find $srcdir/../jit/docs/examples *.cc]]
+
+set tests [lsort $tests]
verbose "tests: $tests"
@@ -318,8 +341,24 @@ proc jit-dg-test { prog do_what extra_tool_flags } {
verbose "output_file: $output_file"
# Create the test executable:
- set comp_output [gcc_target_compile $prog $output_file $do_what \
- "{additional_flags=$extra_tool_flags}"]
+ set extension [file extension $prog]
+ if {$extension == ".cc"} {
+ set compilation_function "g++_target_compile"
+ set options "{additional_flags=$extra_tool_flags}"
+ } else {
+ set compilation_function "gcc_target_compile"
+ # Until recently, <dejagnu.h> assumed -fgnu89-inline
+ # Ideally we should fixincludes it (PR other/63613), but
+ # for now add -fgnu89-inline when compiling C JIT testcases.
+ # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63613
+ # and http://lists.gnu.org/archive/html/dejagnu/2014-10/msg00011.html
+ set options "{additional_flags=$extra_tool_flags -fgnu89-inline}"
+ }
+ verbose "compilation_function=$compilation_function"
+ verbose "options=$options"
+
+ set comp_output [$compilation_function $prog $output_file \
+ "executable" $options]
upvar 1 name name
if ![jit_check_compile "$name" "initial compilation" \
$output_file $comp_output] then {
@@ -332,6 +371,28 @@ proc jit-dg-test { prog do_what extra_tool_flags } {
# We need to set LD_LIBRARY_PATH so that the test files can find
# libgccjit.so
# Do this using set_ld_library_path_env_vars from target-libpath.exp
+ # We will restore the old value later using
+ # restore_ld_library_path_env_vars.
+
+ # Unfortunately this API only supports a single saved value, rather
+ # than a stack, and g++_init has already called into this API,
+ # injecting the appropriate value for LD_LIBRARY_PATH for finding
+ # the built copy of libstdc++.
+ # Hence the call to restore_ld_library_path_env_vars would restore
+ # the *initial* value of LD_LIBRARY_PATH, and attempts to run
+ # a C++ testcase after running any prior testcases would thus look
+ # in the wrong place for libstdc++. This led to failures at startup
+ # of the form:
+ # ./tut01-hello-world.cc.exe: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./tut01-hello-world.cc.exe)
+ # when the built libstdc++ is more recent that the system libstdc++.
+ #
+ # As a workaround, reset the variable "orig_environment_saved" within
+ # target-libpath.exp, so that the {set|restore}_ld_library_path_env_vars
+ # API saves/restores the current value of LD_LIBRARY_PATH (as set up
+ # by g++_init).
+ global orig_environment_saved
+ set orig_environment_saved 0
+
global ld_library_path
global base_dir
set ld_library_path "$base_dir/../../"
@@ -394,17 +455,14 @@ proc jit-dg-test { prog do_what extra_tool_flags } {
}
restore_ld_library_path_env_vars
+
+ return [list $comp_output $output_file]
}
# We need to link with --export-dynamic for test-calling-external-function.c
# so that the JIT-built code can call into functions from the main program.
set DEFAULT_CFLAGS "-I$srcdir/../jit -lgccjit -g -Wall -Werror -Wl,--export-dynamic"
-# <dejagnu.h> assumes -fgnu89-inline
-# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63613
-# and http://lists.gnu.org/archive/html/dejagnu/2014-10/msg00011.html
-append DEFAULT_CFLAGS " -fgnu89-inline"
-
# Main loop. This will invoke jig-dg-test on each test-*.c file.
dg-runtest $tests "" $DEFAULT_CFLAGS
--
1.8.5.3
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-01-07 19:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-10 19:56 [PATCH] jit.exp: support C++ testcases David Malcolm
2015-01-07 19:28 ` [PATCH, committed] " David Malcolm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).