From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32533 invoked by alias); 11 Feb 2014 18:19:34 -0000 Mailing-List: contact jit-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: Sender: jit-owner@gcc.gnu.org Received: (qmail 32512 invoked by uid 89); 11 Feb 2014 18:19:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.98.1 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com From: David Malcolm To: jit@gcc.gnu.org, gcc-patches@gcc.gnu.org Cc: David Malcolm Subject: [jit] Improvements to error-handling Date: Wed, 01 Jan 2014 00:00:00 -0000 Message-Id: <1392142688-21255-1-git-send-email-dmalcolm@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-SW-Source: 2014-q1/txt/msg00033.txt.bz2 Committed to branch dmalcolm/jit: gcc/jit/ * internal-api.c (gcc::jit::recording::context::add_error_va): If GCC_JIT_STR_OPTION_PROGNAME is NULL, use "libgccjit.so", as per the comment in libgccjit.h (gcc::jit::recording::label::replay_into): When reporting on an unplaced label, include the name of the containing function in the error message. * libgccjit.c: Remove comment about "Functions for use within the code factory", as this distinction went away in commit 96b218c9a1d5f39fb649e02c0e77586b180e8516. (RETURN_VAL_IF_FAIL_PRINTF4): New. (RETURN_NULL_IF_FAIL_PRINTF4): New. (jit_error): Invoke vfprintf with the correct format string in the NULL context case. (gcc_jit_context_new_call): Check for NULL entries within the array of arguments. --- gcc/jit/ChangeLog.jit | 18 ++++++++++++++++++ gcc/jit/internal-api.c | 10 ++++++++-- gcc/jit/libgccjit.c | 29 +++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/gcc/jit/ChangeLog.jit b/gcc/jit/ChangeLog.jit index 68c38db..d331082 100644 --- a/gcc/jit/ChangeLog.jit +++ b/gcc/jit/ChangeLog.jit @@ -1,3 +1,21 @@ +2014-02-11 David Malcolm + + * internal-api.c (gcc::jit::recording::context::add_error_va): If + GCC_JIT_STR_OPTION_PROGNAME is NULL, use "libgccjit.so", as per + the comment in libgccjit.h + (gcc::jit::recording::label::replay_into): When reporting on an + unplaced label, include the name of the containing function in + the error message. + * libgccjit.c: Remove comment about "Functions for use within the + code factory", as this distinction went away in commit + 96b218c9a1d5f39fb649e02c0e77586b180e8516. + (RETURN_VAL_IF_FAIL_PRINTF4): New. + (RETURN_NULL_IF_FAIL_PRINTF4): New. + (jit_error): Invoke vfprintf with the correct format string in + the NULL context case. + (gcc_jit_context_new_call): Check for NULL entries within the + array of arguments. + 2014-02-10 David Malcolm * libgccjit.h (gcc_jit_context_get_int_type): New. diff --git a/gcc/jit/internal-api.c b/gcc/jit/internal-api.c index 9ff0eb8..6c66d3d 100644 --- a/gcc/jit/internal-api.c +++ b/gcc/jit/internal-api.c @@ -500,8 +500,12 @@ recording::context::add_error_va (const char *fmt, va_list ap) char buf[1024]; vsnprintf (buf, sizeof (buf) - 1, fmt, ap); + const char *progname = get_str_option (GCC_JIT_STR_OPTION_PROGNAME); + if (!progname) + progname = "libgccjit.so"; + fprintf (stderr, "%s: %s\n", - get_str_option (GCC_JIT_STR_OPTION_PROGNAME), + progname, buf); if (!m_error_count) @@ -1075,7 +1079,9 @@ recording::label::replay_into (replayer *r) { if (!m_has_been_placed) { - r->add_error ("unplaced label: %s", get_debug_string ()); + r->add_error ("unplaced label within %s: %s", + m_func->get_debug_string (), + get_debug_string ()); return; } set_playback_obj (m_func->playback_function () diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c index 94b3271..3c2d962 100644 --- a/gcc/jit/libgccjit.c +++ b/gcc/jit/libgccjit.c @@ -100,6 +100,16 @@ struct gcc_jit_loop : public gcc::jit::recording::loop } \ JIT_END_STMT +#define RETURN_VAL_IF_FAIL_PRINTF4(TEST_EXPR, RETURN_EXPR, CTXT, ERR_FMT, A0, A1, A2, A3) \ + JIT_BEGIN_STMT \ + if (!(TEST_EXPR)) \ + { \ + jit_error ((CTXT), "%s: " ERR_FMT, \ + __func__, (A0), (A1), (A2), (A3)); \ + return (RETURN_EXPR); \ + } \ + JIT_END_STMT + #define RETURN_VAL_IF_FAIL_PRINTF6(TEST_EXPR, RETURN_EXPR, CTXT, ERR_FMT, A0, A1, A2, A3, A4, A5) \ JIT_BEGIN_STMT \ if (!(TEST_EXPR)) \ @@ -119,6 +129,9 @@ struct gcc_jit_loop : public gcc::jit::recording::loop #define RETURN_NULL_IF_FAIL_PRINTF3(TEST_EXPR, CTXT, ERR_FMT, A0, A1, A2) \ RETURN_VAL_IF_FAIL_PRINTF3 (TEST_EXPR, NULL, CTXT, ERR_FMT, A0, A1, A2) +#define RETURN_NULL_IF_FAIL_PRINTF4(TEST_EXPR, CTXT, ERR_FMT, A0, A1, A2, A3) \ + RETURN_VAL_IF_FAIL_PRINTF4 (TEST_EXPR, NULL, CTXT, ERR_FMT, A0, A1, A2, A3) + #define RETURN_NULL_IF_FAIL_PRINTF6(TEST_EXPR, CTXT, ERR_FMT, A0, A1, A2, A3, A4, A5) \ RETURN_VAL_IF_FAIL_PRINTF6 (TEST_EXPR, NULL, CTXT, ERR_FMT, A0, A1, A2, A3, A4, A5) @@ -174,7 +187,8 @@ jit_error (gcc::jit::recording::context *ctxt, const char *fmt, ...) else { /* No context? Send to stderr. */ - vfprintf (stderr, "%s\n", ap); + vfprintf (stderr, fmt, ap); + fprintf (stderr, "\n"); } va_end (ap); @@ -205,9 +219,6 @@ gcc_jit_context_new_child_context (gcc_jit_context *parent_ctxt) return new gcc_jit_context (parent_ctxt); } -/********************************************************************** - Functions for use within the code factory. - **********************************************************************/ gcc_jit_location * gcc_jit_context_new_location (gcc_jit_context *ctxt, const char *filename, @@ -630,6 +641,16 @@ gcc_jit_context_new_call (gcc_jit_context *ctxt, gcc::jit::recording::param *param = func->get_param (i); gcc_jit_rvalue *arg = args[i]; + RETURN_NULL_IF_FAIL_PRINTF4 ( + arg, + ctxt, + "NULL argument %i to function \"%s\":" + " param %s (type: %s)", + i + 1, + func->get_name ()->c_str (), + param->get_debug_string (), + param->get_type ()->get_debug_string ()); + RETURN_NULL_IF_FAIL_PRINTF6 ( compatible_types (param->get_type (), arg->get_type ()), -- 1.7.11.7