ipa-chkp.h (chkp_wrap_function): New.
gcc/ * ipa-chkp.h (chkp_wrap_function): New. * ipa-chkp.c (chkp_wrap_function): Remove 'static'. (chkp_wrap_function_name): New. (chkp_build_instrumented_fndecl): Use chkp_wrap_function_name to get wrapper name. * lto-cgraph.c: Include ipa-chkp.h. (input_cgraph_1): Avoid alias chain for wrappers. gcc/testsuite/ * gcc.dg/lto/chkp-wrap-asm-name_0.c: New. From-SVN: r223216
This commit is contained in:
parent
2c1f37b57a
commit
2662516181
|
@ -1,3 +1,13 @@
|
||||||
|
2015-05-15 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||||
|
|
||||||
|
* ipa-chkp.h (chkp_wrap_function): New.
|
||||||
|
* ipa-chkp.c (chkp_wrap_function): Remove 'static'.
|
||||||
|
(chkp_wrap_function_name): New.
|
||||||
|
(chkp_build_instrumented_fndecl): Use chkp_wrap_function_name
|
||||||
|
to get wrapper name.
|
||||||
|
* lto-cgraph.c: Include ipa-chkp.h.
|
||||||
|
(input_cgraph_1): Avoid alias chain for wrappers.
|
||||||
|
|
||||||
2015-05-15 Ilya Enkovich <enkovich.gnu@gmail.com>
|
2015-05-15 Ilya Enkovich <enkovich.gnu@gmail.com>
|
||||||
|
|
||||||
PR middle-end/66134
|
PR middle-end/66134
|
||||||
|
|
|
@ -104,7 +104,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
|
||||||
/* Return 1 calls to FNDECL should be replaced with
|
/* Return 1 calls to FNDECL should be replaced with
|
||||||
a call to wrapper function. */
|
a call to wrapper function. */
|
||||||
static bool
|
bool
|
||||||
chkp_wrap_function (tree fndecl)
|
chkp_wrap_function (tree fndecl)
|
||||||
{
|
{
|
||||||
if (!flag_chkp_use_wrappers)
|
if (!flag_chkp_use_wrappers)
|
||||||
|
@ -139,6 +139,51 @@ chkp_wrap_function (tree fndecl)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
chkp_wrap_function_name (tree fndecl)
|
||||||
|
{
|
||||||
|
gcc_assert (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL);
|
||||||
|
|
||||||
|
switch (DECL_FUNCTION_CODE (fndecl))
|
||||||
|
{
|
||||||
|
case BUILT_IN_STRLEN:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "strlen";
|
||||||
|
case BUILT_IN_STRCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "strcpy";
|
||||||
|
case BUILT_IN_STRNCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "strncpy";
|
||||||
|
case BUILT_IN_STPCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "stpcpy";
|
||||||
|
case BUILT_IN_STPNCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "stpncpy";
|
||||||
|
case BUILT_IN_STRCAT:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "strcat";
|
||||||
|
case BUILT_IN_STRNCAT:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "strncat";
|
||||||
|
case BUILT_IN_MEMCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "memcpy";
|
||||||
|
case BUILT_IN_MEMPCPY:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "mempcpy";
|
||||||
|
case BUILT_IN_MEMSET:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "memset";
|
||||||
|
case BUILT_IN_MEMMOVE:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "memmove";
|
||||||
|
case BUILT_IN_BZERO:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "bzero";
|
||||||
|
case BUILT_IN_MALLOC:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "malloc";
|
||||||
|
case BUILT_IN_CALLOC:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "calloc";
|
||||||
|
case BUILT_IN_REALLOC:
|
||||||
|
return CHKP_WRAPPER_SYMBOL_PREFIX "realloc";
|
||||||
|
|
||||||
|
default:
|
||||||
|
gcc_unreachable ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
/* Build a clone of FNDECL with a modified name. */
|
/* Build a clone of FNDECL with a modified name. */
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
|
@ -164,9 +209,8 @@ chkp_build_instrumented_fndecl (tree fndecl)
|
||||||
instrumented version. */
|
instrumented version. */
|
||||||
if (chkp_wrap_function(fndecl))
|
if (chkp_wrap_function(fndecl))
|
||||||
{
|
{
|
||||||
s = CHKP_WRAPPER_SYMBOL_PREFIX;
|
new_name = get_identifier (chkp_wrap_function_name (fndecl));
|
||||||
s += IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
|
DECL_VISIBILITY (new_decl) = VISIBILITY_DEFAULT;
|
||||||
new_name = get_identifier (s.c_str ());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,5 +24,6 @@ extern tree chkp_copy_function_type_adding_bounds (tree orig_type);
|
||||||
extern tree chkp_maybe_clone_builtin_fndecl (tree fndecl);
|
extern tree chkp_maybe_clone_builtin_fndecl (tree fndecl);
|
||||||
extern cgraph_node *chkp_maybe_create_clone (tree fndecl);
|
extern cgraph_node *chkp_maybe_create_clone (tree fndecl);
|
||||||
extern bool chkp_instrumentable_p (tree fndecl);
|
extern bool chkp_instrumentable_p (tree fndecl);
|
||||||
|
extern bool chkp_wrap_function (tree fndecl);
|
||||||
|
|
||||||
#endif /* GCC_IPA_CHKP_H */
|
#endif /* GCC_IPA_CHKP_H */
|
||||||
|
|
|
@ -80,6 +80,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#include "pass_manager.h"
|
#include "pass_manager.h"
|
||||||
#include "ipa-utils.h"
|
#include "ipa-utils.h"
|
||||||
#include "omp-low.h"
|
#include "omp-low.h"
|
||||||
|
#include "ipa-chkp.h"
|
||||||
|
|
||||||
/* True when asm nodes has been output. */
|
/* True when asm nodes has been output. */
|
||||||
bool asm_nodes_output = false;
|
bool asm_nodes_output = false;
|
||||||
|
@ -1616,10 +1617,13 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
|
||||||
cnode->instrumented_version->instrumented_version = cnode;
|
cnode->instrumented_version->instrumented_version = cnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore decl names reference. */
|
/* Restore decl names reference except for wrapper functions. */
|
||||||
IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (cnode->decl)) = 1;
|
if (!chkp_wrap_function (cnode->orig_decl))
|
||||||
TREE_CHAIN (DECL_ASSEMBLER_NAME (cnode->decl))
|
{
|
||||||
= DECL_ASSEMBLER_NAME (cnode->orig_decl);
|
tree name = DECL_ASSEMBLER_NAME (cnode->decl);
|
||||||
|
IDENTIFIER_TRANSPARENT_ALIAS (name) = 1;
|
||||||
|
TREE_CHAIN (name) = DECL_ASSEMBLER_NAME (cnode->orig_decl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2015-05-15 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||||
|
|
||||||
|
* gcc.dg/lto/chkp-wrap-asm-name_0.c: New.
|
||||||
|
|
||||||
2015-05-15 Ilya Enkovich <enkovich.gnu@gmail.com>
|
2015-05-15 Ilya Enkovich <enkovich.gnu@gmail.com>
|
||||||
|
|
||||||
PR middle-end/66134
|
PR middle-end/66134
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* { dg-lto-do link } */
|
||||||
|
/* { dg-require-effective-target mpx } */
|
||||||
|
/* { dg-lto-options { { -O2 -flto -fcheck-pointer-bounds -mmpx } } } */
|
||||||
|
|
||||||
|
typedef long unsigned int size_t;
|
||||||
|
|
||||||
|
extern size_t strlen (const char *);
|
||||||
|
extern __typeof (strlen) strlen __asm__ ("" "__hidden_strlen") __attribute__ ((visibility ("hidden")));
|
||||||
|
|
||||||
|
size_t
|
||||||
|
test1 (const char *p) { return strlen (p); }
|
||||||
|
|
||||||
|
size_t
|
||||||
|
test2 (const char *p) { return __builtin_strlen (p); }
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, const char **argv)
|
||||||
|
{
|
||||||
|
return test1 (argv[0]) - test2 (argv[0]);
|
||||||
|
}
|
Loading…
Reference in New Issue