From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13378 invoked by alias); 7 Jan 2015 19:28:00 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13340 invoked by uid 89); 7 Jan 2015 19:27:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 07 Jan 2015 19:27:54 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t07JRqqh011040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 7 Jan 2015 14:27:52 -0500 Received: from c64.redhat.com (vpn-227-171.phx2.redhat.com [10.3.227.171]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t07JRpQ4020201; Wed, 7 Jan 2015 14:27:51 -0500 From: David Malcolm To: jit@gcc.gnu.org, gcc-patches@gcc.gnu.org Cc: David Malcolm Subject: [PATCH, committed] jit.exp: support C++ testcases Date: Wed, 07 Jan 2015 19:28:00 -0000 Message-Id: <1420659382-25461-1-git-send-email-dmalcolm@redhat.com> In-Reply-To: <1418241897-13617-1-git-send-email-dmalcolm@redhat.com> References: <1418241897-13617-1-git-send-email-dmalcolm@redhat.com> X-IsSubscribed: yes X-SW-Source: 2015-01/txt/msg00338.txt.bz2 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, 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" -# 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