diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-01-27 19:48:30 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-01-27 19:48:30 +0100 |
commit | 8f91e6e0eff1494cfefb2129876847aab5748538 (patch) | |
tree | 368b5c8a00ed9b3e4a5b5d67306390a2880e97da /gcc | |
parent | ede673766742e2e48e43e3fa1c08c86d2ca8c893 (diff) | |
download | gcc-8f91e6e0eff1494cfefb2129876847aab5748538.zip gcc-8f91e6e0eff1494cfefb2129876847aab5748538.tar.gz gcc-8f91e6e0eff1494cfefb2129876847aab5748538.tar.bz2 |
re PR lto/69254 (ICE in streamer_get_builtin_tree when using -fsanitize=shift on the compile side only)
PR lto/69254
* sanitizer.def: Add BEGIN_SANITIZER_BUILTINS and
END_SANITIZER_BUILTINS markers using DEF_BUILTIN_STUB.
* asan.c (DEF_BUILTIN_STUB): Temporarily define.
* tree-streamer-in.c: Include asan.h.
(streamer_get_builtin_tree): For builtins in sanitizer
range call initialize_sanitizer_builtins and retry.
From-SVN: r232891
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/asan.c | 3 | ||||
-rw-r--r-- | gcc/sanitizer.def | 7 | ||||
-rw-r--r-- | gcc/tree-streamer-in.c | 21 |
4 files changed, 35 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 60322af..1973060 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-01-27 Jakub Jelinek <jakub@redhat.com> + + PR lto/69254 + * sanitizer.def: Add BEGIN_SANITIZER_BUILTINS and + END_SANITIZER_BUILTINS markers using DEF_BUILTIN_STUB. + * asan.c (DEF_BUILTIN_STUB): Temporarily define. + * tree-streamer-in.c: Include asan.h. + (streamer_get_builtin_tree): For builtins in sanitizer + range call initialize_sanitizer_builtins and retry. + 2016-01-27 Ian Lance Taylor <iant@google.com> * common.opt (fkeep-gc-roots-live): New undocumented option. @@ -2370,6 +2370,8 @@ initialize_sanitizer_builtins (void) /* ECF_COLD missing */ ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST #undef ATTR_PURE_NOTHROW_LEAF_LIST #define ATTR_PURE_NOTHROW_LEAF_LIST ECF_PURE | ATTR_NOTHROW_LEAF_LIST +#undef DEF_BUILTIN_STUB +#define DEF_BUILTIN_STUB(ENUM, NAME) #undef DEF_SANITIZER_BUILTIN #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \ decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \ @@ -2389,6 +2391,7 @@ initialize_sanitizer_builtins (void) ATTR_PURE_NOTHROW_LEAF_LIST) #undef DEF_SANITIZER_BUILTIN +#undef DEF_BUILTIN_STUB } /* Called via htab_traverse. Count number of emitted diff --git a/gcc/sanitizer.def b/gcc/sanitizer.def index 3a71801..303c1e4 100644 --- a/gcc/sanitizer.def +++ b/gcc/sanitizer.def @@ -20,12 +20,16 @@ along with GCC; see the file COPYING3. If not see /* Before including this file, you should define a macro: + DEF_BUILTIN_STUB(ENUM, NAME) DEF_SANITIZER_BUILTIN (ENUM, NAME, TYPE, ATTRS) See builtins.def for details. The builtins are created by the C-family of FEs in c-family/c-common.c, for other FEs by asan.c. */ +/* This has to come before all the sanitizer builtins. */ +DEF_BUILTIN_STUB(BEGIN_SANITIZER_BUILTINS, (const char *)0) + /* Address Sanitizer */ DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_INIT, "__asan_init", BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST) @@ -515,3 +519,6 @@ DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_DYNAMIC_TYPE_CACHE_MISS_ABORT, DEF_SANITIZER_BUILTIN(BUILT_IN_SANITIZER_COV_TRACE_PC, "__sanitizer_cov_trace_pc", BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST) + +/* This has to come after all the sanitizer builtins. */ +DEF_BUILTIN_STUB(END_SANITIZER_BUILTINS, (const char *)0) diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index 3c8558e..91c72eb 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "builtins.h" #include "ipa-chkp.h" #include "gomp-constants.h" +#include "asan.h" /* Read a STRING_CST from the string table in DATA_IN using input @@ -1136,13 +1137,21 @@ streamer_get_builtin_tree (struct lto_input_block *ib, struct data_in *data_in) fatal_error (input_location, "machine independent builtin code out of range"); result = builtin_decl_explicit (fcode); - if (!result - && fcode > BEGIN_CHKP_BUILTINS - && fcode < END_CHKP_BUILTINS) + if (!result) { - fcode = (enum built_in_function) (fcode - BEGIN_CHKP_BUILTINS - 1); - result = builtin_decl_explicit (fcode); - result = chkp_maybe_clone_builtin_fndecl (result); + if (fcode > BEGIN_CHKP_BUILTINS && fcode < END_CHKP_BUILTINS) + { + fcode = (enum built_in_function) + (fcode - BEGIN_CHKP_BUILTINS - 1); + result = builtin_decl_explicit (fcode); + result = chkp_maybe_clone_builtin_fndecl (result); + } + else if (fcode > BEGIN_SANITIZER_BUILTINS + && fcode < END_SANITIZER_BUILTINS) + { + initialize_sanitizer_builtins (); + result = builtin_decl_explicit (fcode); + } } gcc_assert (result); } |