| 2005-07-22 Jakub Jelinek <jakub@redhat.com> |
| |
| PR middle-end/20303 |
| * c-pragma.c: Include varray.h. |
| (visibility_stack): New variable. |
| (handle_pragma_visibility): Use VARRAY. |
| * Makefile.in (c-pragma.o): Depend on varray.h. |
| * doc/invoke.texi: Remove the nested visibility push limit. |
| |
| * gcc.dg/visibility-d.c: New test. |
| |
| |
| |
| @@ -1345,7 +1345,8 @@ c-aux-info.o : c-aux-info.c $(CONFIG_H) |
| c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ |
| flags.h toplev.h $(C_COMMON_H) real.h |
| c-pragma.o: c-pragma.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \ |
| - function.h c-pragma.h toplev.h output.h $(GGC_H) $(TM_P_H) $(C_COMMON_H) gt-c-pragma.h |
| + function.h c-pragma.h toplev.h output.h $(GGC_H) $(TM_P_H) $(C_COMMON_H) \ |
| + varray.h gt-c-pragma.h |
| graph.o: graph.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h flags.h output.h \ |
| $(RTL_H) function.h hard-reg-set.h $(BASIC_BLOCK_H) graph.h |
| sbitmap.o: sbitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \ |
| |
| |
| @@ -11418,8 +11418,8 @@ For those adding visibility support to e |
| @samp{#pragma GCC visibility} of use. This works by you enclosing |
| the declarations you wish to set visibility for with (for example) |
| @samp{#pragma GCC visibility push(hidden)} and |
| -@samp{#pragma GCC visibility pop}. These can be nested up to sixteen |
| -times. Bear in mind that symbol visibility should be viewed @strong{as |
| +@samp{#pragma GCC visibility pop}. |
| +Bear in mind that symbol visibility should be viewed @strong{as |
| part of the API interface contract} and thus all new code should |
| always specify visibility when it is not the default ie; declarations |
| only for use within the local DSO should @strong{always} be marked explicitly |
| |
| |
| @@ -34,6 +34,7 @@ Software Foundation, 59 Temple Place - S |
| #include "c-common.h" |
| #include "output.h" |
| #include "tm_p.h" |
| +#include "varray.h" |
| |
| #define GCC_BAD(msgid) do { warning (msgid); return; } while (0) |
| #define GCC_BAD2(msgid, arg) do { warning (msgid, arg); return; } while (0) |
| @@ -483,6 +484,8 @@ maybe_apply_renaming_pragma (tree decl, |
| |
| |
| #ifdef HANDLE_PRAGMA_VISIBILITY |
| +static GTY(()) varray_type visibility_stack; |
| + |
| static void handle_pragma_visibility (cpp_reader *); |
| |
| /* Sets the default visibility for symbols to something other than that |
| @@ -490,11 +493,13 @@ static void handle_pragma_visibility (cp |
| static void |
| handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED) |
| { /* Form is #pragma GCC visibility push(hidden)|pop */ |
| - static int visstack [16], visidx; |
| tree x; |
| enum cpp_ttype token; |
| enum { bad, push, pop } action = bad; |
| |
| + if (!visibility_stack) |
| + VARRAY_INT_INIT (visibility_stack, 32, "visibility_stack"); |
| + |
| token = c_lex (&x); |
| if (token == CPP_NAME) |
| { |
| @@ -510,14 +515,17 @@ handle_pragma_visibility (cpp_reader *du |
| { |
| if (pop == action) |
| { |
| - if (!visidx) |
| + int visidx = VARRAY_ACTIVE_SIZE (visibility_stack); |
| + |
| + if (visidx <= 0) |
| { |
| GCC_BAD ("No matching push for '#pragma GCC visibility pop'"); |
| } |
| else |
| { |
| - default_visibility = visstack[--visidx]; |
| - visibility_options.inpragma = (visidx>0); |
| + default_visibility = VARRAY_INT (visibility_stack, visidx - 1); |
| + VARRAY_POP (visibility_stack); |
| + visibility_options.inpragma = (visidx>1); |
| } |
| } |
| else |
| @@ -529,14 +537,10 @@ handle_pragma_visibility (cpp_reader *du |
| { |
| GCC_BAD ("malformed #pragma GCC visibility push"); |
| } |
| - else if (visidx >= 16) |
| - { |
| - GCC_BAD ("No more than sixteen #pragma GCC visibility pushes allowed at once"); |
| - } |
| else |
| { |
| const char *str = IDENTIFIER_POINTER (x); |
| - visstack[visidx++] = default_visibility; |
| + VARRAY_PUSH_INT (visibility_stack, (int) default_visibility); |
| if (!strcmp (str, "default")) |
| default_visibility = VISIBILITY_DEFAULT; |
| else if (!strcmp (str, "internal")) |
| |
| |
| @@ -0,0 +1,205 @@ |
| +/* PR middle-end/20303 */ |
| +/* Test nesting of #pragma GCC visibility. */ |
| +/* { dg-do compile } */ |
| +/* { dg-require-visibility "" } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo00" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo01" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo02" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo03" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo04" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo05" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo06" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo07" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo08" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo09" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo10" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo11" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo12" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo13" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo14" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo15" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo16" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo17" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo18" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo19" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo20" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo21" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo22" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo23" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo24" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo25" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo26" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo27" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo28" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo29" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo30" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo31" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo32" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo33" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo34" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo35" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo36" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo37" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo38" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo39" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo40" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo41" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo42" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo43" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo44" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo45" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo46" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo47" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo48" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo49" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo50" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo51" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo52" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo53" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo54" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo55" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo56" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo57" } } */ |
| +/* { dg-final { scan-assembler-not "\\.hidden\[^\\n\]foo58" } } */ |
| +/* { dg-final { scan-assembler "\\.hidden\[^\\n\]foo59" } } */ |
| + |
| +#pragma GCC visibility push(default) |
| +void foo00(); |
| +#pragma GCC visibility push(hidden) |
| +void foo01(); |
| +#pragma GCC visibility push(default) |
| +void foo02(); |
| +#pragma GCC visibility push(hidden) |
| +void foo03(); |
| +#pragma GCC visibility push(default) |
| +void foo04(); |
| +#pragma GCC visibility push(default) |
| +void foo05(); |
| +#pragma GCC visibility push(default) |
| +void foo06(); |
| +#pragma GCC visibility push(hidden) |
| +void foo07(); |
| +#pragma GCC visibility push(default) |
| +void foo08(); |
| +#pragma GCC visibility push(hidden) |
| +void foo09(); |
| +#pragma GCC visibility push(default) |
| +void foo10(); |
| +#pragma GCC visibility push(hidden) |
| +void foo11(); |
| +#pragma GCC visibility push(hidden) |
| +void foo12(); |
| +#pragma GCC visibility push(hidden) |
| +void foo13(); |
| +#pragma GCC visibility push(default) |
| +void foo14(); |
| +#pragma GCC visibility push(hidden) |
| +void foo15(); |
| +#pragma GCC visibility push(default) |
| +void foo16(); |
| +#pragma GCC visibility push(hidden) |
| +void foo17(); |
| +#pragma GCC visibility push(default) |
| +void foo18(); |
| +#pragma GCC visibility push(hidden) |
| +void foo19(); |
| +#pragma GCC visibility push(default) |
| +void foo20(); |
| +#pragma GCC visibility push(hidden) |
| +void foo21(); |
| +#pragma GCC visibility push(default) |
| +void foo22(); |
| +#pragma GCC visibility push(hidden) |
| +void foo23(); |
| +#pragma GCC visibility push(default) |
| +void foo24(); |
| +#pragma GCC visibility push(hidden) |
| +void foo25(); |
| +#pragma GCC visibility push(default) |
| +void foo26(); |
| +#pragma GCC visibility push(hidden) |
| +void foo27(); |
| +#pragma GCC visibility push(default) |
| +void foo28(); |
| +#pragma GCC visibility push(hidden) |
| +void foo29(); |
| +#pragma GCC visibility pop |
| +void foo30(); |
| +#pragma GCC visibility pop |
| +void foo31(); |
| +#pragma GCC visibility pop |
| +void foo32(); |
| +#pragma GCC visibility pop |
| +void foo33(); |
| +#pragma GCC visibility pop |
| +void foo34(); |
| +#pragma GCC visibility pop |
| +void foo35(); |
| +#pragma GCC visibility pop |
| +void foo36(); |
| +#pragma GCC visibility pop |
| +void foo37(); |
| +#pragma GCC visibility pop |
| +void foo38(); |
| +#pragma GCC visibility pop |
| +void foo39(); |
| +#pragma GCC visibility pop |
| +void foo40(); |
| +#pragma GCC visibility pop |
| +void foo41(); |
| +#pragma GCC visibility pop |
| +void foo42(); |
| +#pragma GCC visibility pop |
| +void foo43(); |
| +#pragma GCC visibility pop |
| +void foo44(); |
| +#pragma GCC visibility pop |
| +void foo45(); |
| +#pragma GCC visibility pop |
| +void foo46(); |
| +#pragma GCC visibility pop |
| +void foo47(); |
| +#pragma GCC visibility pop |
| +void foo48(); |
| +#pragma GCC visibility pop |
| +void foo49(); |
| +#pragma GCC visibility pop |
| +void foo50(); |
| +#pragma GCC visibility pop |
| +void foo51(); |
| +#pragma GCC visibility pop |
| +void foo52(); |
| +#pragma GCC visibility pop |
| +void foo53(); |
| +#pragma GCC visibility pop |
| +void foo54(); |
| +#pragma GCC visibility pop |
| +void foo55(); |
| +#pragma GCC visibility pop |
| +void foo56(); |
| +#pragma GCC visibility pop |
| +void foo57(); |
| +#pragma GCC visibility pop |
| +void foo58(); |
| +#pragma GCC visibility push (hidden) |
| +void foo59(); |
| +#pragma GCC visibility pop |
| +#pragma GCC visibility pop |
| + |
| +#define D(N) \ |
| +void foo##N##0() { } \ |
| +void foo##N##1() { } \ |
| +void foo##N##2() { } \ |
| +void foo##N##3() { } \ |
| +void foo##N##4() { } \ |
| +void foo##N##5() { } \ |
| +void foo##N##6() { } \ |
| +void foo##N##7() { } \ |
| +void foo##N##8() { } \ |
| +void foo##N##9() { } |
| +D(0) |
| +D(1) |
| +D(2) |
| +D(3) |
| +D(4) |
| +D(5) |