diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b1c06eccd5..b9b9eae926a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-03-21 Jason Merrill + + PR middle-end/20297 + * expr.c (init_block_move_fn): Force default visibility. + (init_block_clear_fn): Likewise. + * builtins.c (expand_builtin_fork_or_exec): Likewise. + * targhooks.c (default_external_stack_protect_fail): Likewise. + 2006-03-21 Richard Sandiford * config/mips/predicates.md (const_call_insn_operand): Allow direct diff --git a/gcc/builtins.c b/gcc/builtins.c index 999d777ecc4..ebdbb695296 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5381,6 +5381,8 @@ expand_builtin_fork_or_exec (tree fn, tree arglist, rtx target, int ignore) TREE_PUBLIC (decl) = 1; DECL_ARTIFICIAL (decl) = 1; TREE_NOTHROW (decl) = 1; + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (fn) = 1; call = build_function_call_expr (decl, arglist); return expand_call (call, target, ignore); diff --git a/gcc/expr.c b/gcc/expr.c index e3cb784f187..2d5c359e139 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1409,6 +1409,8 @@ init_block_move_fn (const char *asmspec) TREE_PUBLIC (fn) = 1; DECL_ARTIFICIAL (fn) = 1; TREE_NOTHROW (fn) = 1; + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (fn) = 1; block_move_fn = fn; } @@ -2556,6 +2558,8 @@ init_block_clear_fn (const char *asmspec) TREE_PUBLIC (fn) = 1; DECL_ARTIFICIAL (fn) = 1; TREE_NOTHROW (fn) = 1; + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (fn) = 1; block_clear_fn = fn; } diff --git a/gcc/targhooks.c b/gcc/targhooks.c index f6289c8977e..45942a27a22 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -398,6 +398,8 @@ default_external_stack_protect_fail (void) TREE_NOTHROW (t) = 1; DECL_ARTIFICIAL (t) = 1; DECL_IGNORED_P (t) = 1; + DECL_VISIBILITY (t) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (t) = 1; stack_chk_fail_decl = t; } diff --git a/gcc/testsuite/gcc.dg/visibility-11.c b/gcc/testsuite/gcc.dg/visibility-11.c new file mode 100644 index 00000000000..e5995827b79 --- /dev/null +++ b/gcc/testsuite/gcc.dg/visibility-11.c @@ -0,0 +1,24 @@ +/* PR middle-end/20297 */ +/* The memcpy FUNCTION_DECL built in the middle-end for block moves got + hidden visibility from the first push, so the call didn't use the PLT. */ + +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-Os -fpic" } */ +/* { dg-final { scan-assembler "memcpy@PLT" } } */ + +#pragma GCC visibility push(hidden) +#pragma GCC visibility push(default) +extern void* memcpy (void *, const void *, __SIZE_TYPE__); +#pragma GCC visibility pop + +struct a { int a[10]; }; + +extern void *bar (struct a *, struct a *, int); + +void * +foo (struct a *a, struct a *b, int c) +{ + struct a cc = *b; + return bar (a, &cc, 4 * c); +}