From e7e3856c2c748cf0c7ed35ed843ec4ce516c9b4f Mon Sep 17 00:00:00 2001 From: Mikhail Maltsev Date: Tue, 22 Sep 2015 02:51:31 +0300 Subject: [PATCH 2/9] libcpp --- libcpp/include/line-map.h | 2 +- libcpp/init.c | 2 +- libcpp/macro.c | 38 +++++++++++++++----------------------- libcpp/system.h | 17 +++++++++++++++++ 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index bc747c1..e718fc2 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -272,7 +272,7 @@ struct GTY((tag ("2"))) line_map_macro : public line_map { source_location expansion; }; -#if defined ENABLE_CHECKING && (GCC_VERSION >= 2007) +#if CHECKING_P && (GCC_VERSION >= 2007) /* Assertion macro to be used in line-map code. */ #define linemap_assert(EXPR) \ diff --git a/libcpp/init.c b/libcpp/init.c index 2d5626f..0419e95 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -535,7 +535,7 @@ cpp_init_builtins (cpp_reader *pfile, int hosted) /* Sanity-checks are dependent on command-line options, so it is called as a subroutine of cpp_read_main_file (). */ -#if ENABLE_CHECKING +#if CHECKING_P static void sanity_checks (cpp_reader *); static void sanity_checks (cpp_reader *pfile) { diff --git a/libcpp/macro.c b/libcpp/macro.c index 786c21b..60a0753 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -73,7 +73,7 @@ struct macro_arg_token_iter -ftrack-macro-expansion is used this location tracks loci across macro expansion. */ const source_location *location_ptr; -#ifdef ENABLE_CHECKING +#if CHECKING_P /* The number of times the iterator went forward. This useful only when checking is enabled. */ size_t num_forwards; @@ -1310,14 +1310,11 @@ set_arg_token (macro_arg *arg, const cpp_token *token, if (loc != NULL) { -#ifdef ENABLE_CHECKING - if (kind == MACRO_ARG_TOKEN_STRINGIFIED - || !track_macro_exp_p) - /* We can't set the location of a stringified argument - token and we can't set any location if we aren't tracking - macro expansion locations. */ - abort (); -#endif + /* We can't set the location of a stringified argument + token and we can't set any location if we aren't tracking + macro expansion locations. */ + gcc_checking_assert (kind != MACRO_ARG_TOKEN_STRINGIFIED + && track_macro_exp_p); *loc = location; } } @@ -1403,7 +1400,7 @@ macro_arg_token_iter_init (macro_arg_token_iter *iter, iter->location_ptr = NULL; if (track_macro_exp_p) iter->location_ptr = get_arg_token_location (arg, kind); -#ifdef ENABLE_CHECKING +#if CHECKING_P iter->num_forwards = 0; if (track_macro_exp_p && token_ptr != NULL @@ -1428,14 +1425,14 @@ macro_arg_token_iter_forward (macro_arg_token_iter *it) it->location_ptr++; break; case MACRO_ARG_TOKEN_STRINGIFIED: -#ifdef ENABLE_CHECKING +#if CHECKING_P if (it->num_forwards > 0) abort (); #endif break; } -#ifdef ENABLE_CHECKING +#if CHECKING_P it->num_forwards++; #endif } @@ -1444,7 +1441,7 @@ macro_arg_token_iter_forward (macro_arg_token_iter *it) static const cpp_token * macro_arg_token_iter_get_token (const macro_arg_token_iter *it) { -#ifdef ENABLE_CHECKING +#if CHECKING_P if (it->kind == MACRO_ARG_TOKEN_STRINGIFIED && it->num_forwards > 0) abort (); @@ -1458,7 +1455,7 @@ macro_arg_token_iter_get_token (const macro_arg_token_iter *it) static source_location macro_arg_token_iter_get_location (const macro_arg_token_iter *it) { -#ifdef ENABLE_CHECKING +#if CHECKING_P if (it->kind == MACRO_ARG_TOKEN_STRINGIFIED && it->num_forwards > 0) abort (); @@ -2144,11 +2141,9 @@ tokens_buff_add_token (_cpp_buff *buffer, static void alloc_expanded_arg_mem (cpp_reader *pfile, macro_arg *arg, size_t capacity) { -#ifdef ENABLE_CHECKING - if (arg->expanded != NULL - || arg->expanded_virt_locs != NULL) - abort (); -#endif + gcc_checking_assert (arg->expanded == NULL + && arg->expanded_virt_locs == NULL); + arg->expanded = XNEWVEC (const cpp_token *, capacity); if (CPP_OPTION (pfile, track_macro_expansion)) arg->expanded_virt_locs = XNEWVEC (source_location, capacity); @@ -2709,10 +2704,7 @@ _cpp_backup_tokens (cpp_reader *pfile, unsigned int count) { macro_context *m = pfile->context->c.mc; m->cur_virt_loc--; -#ifdef ENABLE_CHECKING - if (m->cur_virt_loc < m->virt_locs) - abort (); -#endif + gcc_checking_assert (m->cur_virt_loc >= m->virt_locs); } else abort (); diff --git a/libcpp/system.h b/libcpp/system.h index e070bc9..aa336b4 100644 --- a/libcpp/system.h +++ b/libcpp/system.h @@ -391,6 +391,23 @@ extern void abort (void); #define __builtin_expect(a, b) (a) #endif +/* Redefine abort to report an internal error w/o coredump, and + reporting the location of the error in the source file. */ +extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; +#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) + +/* Use gcc_assert(EXPR) to test invariants. */ +#if ENABLE_ASSERT_CHECKING +#define gcc_assert(EXPR) \ + ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) +#elif (GCC_VERSION >= 4005) +#define gcc_assert(EXPR) \ + ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0)) +#else +/* Include EXPR, so that unused variable warnings do not occur. */ +#define gcc_assert(EXPR) ((void)(0 && (EXPR))) +#endif + #ifdef ENABLE_CHECKING #define gcc_checking_assert(EXPR) gcc_assert (EXPR) #define CHECKING_P 1 -- 2.1.4