+2014-12-01 David Malcolm <dmalcolm@redhat.com>
+
+ PR jit/63969
+ * jit-playback.c: Ensure that ctxt_progname is non-NULL.
+
2014-11-19 David Malcolm <dmalcolm@redhat.com>
PR jit/63854
/* Pass in user-provided program name as argv0, if any, so that it
makes it into GCC's "progname" global, used in various diagnostics. */
ctxt_progname = get_str_option (GCC_JIT_STR_OPTION_PROGNAME);
- fake_args[0] =
- (ctxt_progname ? ctxt_progname : "libgccjit.so");
+ if (!ctxt_progname)
+ ctxt_progname = "libgccjit.so";
+
+ fake_args[0] = ctxt_progname;
fake_args[1] = m_path_c_file;
num_args = 2;
/* pex argv arrays are NULL-terminated. */
argv[6] = NULL;
+ /* pex_one's error-handling requires pname to be non-NULL. */
+ gcc_assert (ctxt_progname);
+
errmsg = pex_one (PEX_SEARCH, /* int flags, */
gcc_driver_name,
const_cast<char * const *> (argv),
+2014-12-01 David Malcolm <dmalcolm@redhat.com>
+
+ PR jit/63969
+ * jit.dg/harness.h (CHECK_STRING_STARTS_WITH): New.
+ (check_string_starts_with): New.
+ * jit.dg/test-error-pr63969-missing-driver.c: New.
+
2014-12-01 David Malcolm <dmalcolm@redhat.com>
* jit.dg/jit.exp (jit-dg-test): Use $name rathen than $prog
#define CHECK_STRING_VALUE(ACTUAL, EXPECTED) \
check_string_value ((ACTUAL), (EXPECTED));
+#define CHECK_STRING_STARTS_WITH(ACTUAL, EXPECTED_PREFIX) \
+ check_string_starts_with ((ACTUAL), (EXPECTED_PREFIX));
+
#define CHECK(COND) \
do { \
if (COND) \
extern void check_string_value (const char *actual, const char *expected);
+extern void
+check_string_starts_with (const char *actual,
+ const char *expected_prefix);
+
/* Implement framework needed for turning the testcase hooks into an
executable. test-combination.c and test-threads.c each combine multiple
testcases into larger testcases, so we have COMBINED_TEST as a way of
pass ("%s: actual: NULL == expected: NULL");
}
+void
+check_string_starts_with (const char *actual,
+ const char *expected_prefix)
+{
+ if (!actual)
+ {
+ fail ("%s: actual: NULL != expected prefix: \"%s\"",
+ test, expected_prefix);
+ fprintf (stderr, "incorrect value\n");
+ abort ();
+ }
+
+ if (strncmp (actual, expected_prefix, strlen (expected_prefix)))
+ {
+ fail ("%s: actual: \"%s\" did not begin with expected prefix: \"%s\"",
+ test, actual, expected_prefix);
+ fprintf (stderr, "incorrect value\n");
+ abort ();
+ }
+
+ pass ("%s: actual: \"%s\" begins with expected prefix: \"%s\"",
+ test, actual, expected_prefix);
+}
+
static void set_options (gcc_jit_context *ctxt, const char *argv0)
{
/* Set up options. */
--- /dev/null
+/* PR jit/63969: libgccjit would segfault inside gcc_jit_context_compile
+ if the driver wasn't found on PATH if GCC_JIT_STR_OPTION_PROGNAME was
+ NULL. */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "libgccjit.h"
+
+#include "harness.h"
+
+void
+create_code (gcc_jit_context *ctxt, void *user_data)
+{
+ /* Create nothing within the context. */
+
+ /* harness.h's set_options has set a sane value for
+ GCC_JIT_STR_OPTION_PROGNAME, but PR jit/63969 only segfaulted if it's
+ NULL.
+
+ Unset it. */
+ gcc_jit_context_set_str_option (ctxt, GCC_JIT_STR_OPTION_PROGNAME, NULL);
+
+ /* Break PATH, so that the driver can't be found
+ by gcc::jit::playback::context::compile ()
+ within gcc_jit_context_compile. */
+ unsetenv ("PATH");
+}
+
+void
+verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
+{
+ CHECK_VALUE (result, NULL);
+
+ /* Verify that a sane error message was emitted. */
+ CHECK_STRING_STARTS_WITH (gcc_jit_context_get_first_error (ctxt),
+ "error invoking gcc driver");
+}