diff options
author | David Malcolm <dmalcolm@redhat.com> | 2015-01-07 19:19:10 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2015-01-07 19:19:10 +0000 |
commit | 433d16df137250a4b814268e692d6c114ee45e49 (patch) | |
tree | 79c842059b7d5daf9dc83d67a29a678e4d841ce2 | |
parent | 23608da4dba98f09398d6a608c8f8a57c37f8280 (diff) | |
download | gcc-433d16df137250a4b814268e692d6c114ee45e49.zip gcc-433d16df137250a4b814268e692d6c114ee45e49.tar.gz gcc-433d16df137250a4b814268e692d6c114ee45e49.tar.bz2 |
jit.exp: support C++ testcases
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.
From-SVN: r219318
-rw-r--r-- | gcc/jit/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/jit/TODO.rst | 2 | ||||
-rw-r--r-- | gcc/jit/docs/_build/texinfo/libgccjit.texi | 17 | ||||
-rw-r--r-- | gcc/jit/docs/internals/index.rst | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/testsuite/jit.dg/jit.exp | 78 |
6 files changed, 115 insertions, 17 deletions
diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index 6126d02..89ded0b 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,5 +1,13 @@ 2015-01-07 David Malcolm <dmalcolm@redhat.com> + * 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. + +2015-01-07 David Malcolm <dmalcolm@redhat.com> + * docs/internals/index.rst: Update to reflect that built testcases are now test-foo.c.exe, rather than test-foo.exe. * docs/_build/texinfo/libgccjit.texi: Regenerate. 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/_build/texinfo/libgccjit.texi b/gcc/jit/docs/_build/texinfo/libgccjit.texi index 64862dc..f142491 100644 --- a/gcc/jit/docs/_build/texinfo/libgccjit.texi +++ b/gcc/jit/docs/_build/texinfo/libgccjit.texi @@ -11937,7 +11937,7 @@ PREFIX=$(pwd)/install cd build ../src/configure \ --enable-host-shared \ - --enable-languages=jit \ + --enable-languages=jit,c++ \ --disable-bootstrap \ --enable-checking=release \ --prefix=$PREFIX @@ -11968,12 +11968,23 @@ position-independent code, which incurs a slight performance hit, but it necessary for a shared library. @end deffn -@geindex command line option; --enable-languages=jit +@geindex command line option; --enable-languages=jit@comma{}c++ @anchor{internals/index cmdoption--enable-languages}@anchor{177} -@deffn {Option} --enable-languages=jit +@deffn {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: + +@example +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 +@end example + +@noindent @end deffn @geindex command line option; --disable-bootstrap 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/ChangeLog b/gcc/testsuite/ChangeLog index fbe4251..e320af4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,19 @@ 2015-01-07 David Malcolm <dmalcolm@redhat.com> + * 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. + +2015-01-07 David Malcolm <dmalcolm@redhat.com> + * jit.dg/harness.h (CHECK_NON_NULL): Add __func__ to output, to make it easier to figure out the origin of each test result when running test-combination.c and test-threads.c. 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 |