From: Richard Henderson Date: Sun, 3 Mar 2002 04:23:21 +0000 (-0800) Subject: varasm.c (make_decl_rtl): Remove call to REDO_SECTION_INFO_P; invoke ENCODE_SECTION_I... X-Git-Tag: prereleases/libstdc++-3.0.97~52 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b20032503b0ecc63b4ce05e65fda684b47afef3b;p=thirdparty%2Fgcc.git varasm.c (make_decl_rtl): Remove call to REDO_SECTION_INFO_P; invoke ENCODE_SECTION_INFO with first call flag. * varasm.c (make_decl_rtl): Remove call to REDO_SECTION_INFO_P; invoke ENCODE_SECTION_INFO with first call flag. * config/darwin-protos.h, config/darwin.c, config/darwin.h, config/a29k/a29k.h, config/alpha/alpha-protos.h, config/alpha/alpha.c, config/alpha/alpha.h, config/arc/arc.h, config/arm/arm-protos.h, config/arm/arm.h, config/arm/pe.c, config/arm/pe.h, config/avr/avr-protos.h, config/avr/avr.c, config/avr/avr.h, config/c4x/c4x-protos.h, config/c4x/c4x.c, config/c4x/c4x.h, config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.h, config/d30v/d30v.h, config/h8300/h8300.h, config/i370/i370.h, config/i386/cygwin.h, config/i386/i386-interix.h, config/i386/i386.h, config/i386/osfrose.h, config/i386/win32.h, config/i386/winnt.c, config/ia64/ia64-protos.h, config/ia64/ia64.c, config/ia64/ia64.h, config/m32r/m32r-protos.h, config/m32r/m32r.c, config/m32r/m32r.h, config/m68hc11/m68hc11-protos.h, config/m68hc11/m68hc11.c, config/m68hc11/m68hc11.h, config/m88k/m88k.h, config/mcore/mcore-protos.h, config/mcore/mcore.c, config/mcore/mcore.h, config/mips/mips.h, config/ns32k/ns32k.h, config/pa/pa.h, config/romp/romp.h, config/rs6000/linux64.h, config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c, config/rs6000/sysv4.h, config/rs6000/xcoff.h, config/s390/s390.h, config/sh/sh.h, config/sparc/sparc.h, config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c, config/stormy16/stormy16.h, config/v850/v850.h, config/vax/vms.h, config/xtensa/xtensa.h, doc/tm.texi: ENCODE_SECTION_INFO now takes FIRST argument. As needed, examine it and do nothing. * config/darwin.h, config/alpha/alpha.h, config/arm/pe.h, config/i386/cygwin.h, config/ia64/ia64.h, config/m68hc11/m68hc11.h, config/mcore/mcore.h: Remove REDO_SECTION_INFO_P. * config/arm/t-pe (pe.o): Add dependencies. From-SVN: r50236 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb73bd1a536f..85872bbdc1af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,39 @@ +2002-03-02 Richard Henderson + + * varasm.c (make_decl_rtl): Remove call to REDO_SECTION_INFO_P; + invoke ENCODE_SECTION_INFO with first call flag. + + * config/darwin-protos.h, config/darwin.c, config/darwin.h, + config/a29k/a29k.h, config/alpha/alpha-protos.h, config/alpha/alpha.c, + config/alpha/alpha.h, config/arc/arc.h, config/arm/arm-protos.h, + config/arm/arm.h, config/arm/pe.c, config/arm/pe.h, + config/avr/avr-protos.h, config/avr/avr.c, config/avr/avr.h, + config/c4x/c4x-protos.h, config/c4x/c4x.c, config/c4x/c4x.h, + config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.h, + config/d30v/d30v.h, config/h8300/h8300.h, config/i370/i370.h, + config/i386/cygwin.h, config/i386/i386-interix.h, config/i386/i386.h, + config/i386/osfrose.h, config/i386/win32.h, config/i386/winnt.c, + config/ia64/ia64-protos.h, config/ia64/ia64.c, config/ia64/ia64.h, + config/m32r/m32r-protos.h, config/m32r/m32r.c, config/m32r/m32r.h, + config/m68hc11/m68hc11-protos.h, config/m68hc11/m68hc11.c, + config/m68hc11/m68hc11.h, config/m88k/m88k.h, + config/mcore/mcore-protos.h, config/mcore/mcore.c, + config/mcore/mcore.h, config/mips/mips.h, config/ns32k/ns32k.h, + config/pa/pa.h, config/romp/romp.h, config/rs6000/linux64.h, + config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c, + config/rs6000/sysv4.h, config/rs6000/xcoff.h, config/s390/s390.h, + config/sh/sh.h, config/sparc/sparc.h, + config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c, + config/stormy16/stormy16.h, config/v850/v850.h, config/vax/vms.h, + config/xtensa/xtensa.h, doc/tm.texi: ENCODE_SECTION_INFO now takes + FIRST argument. As needed, examine it and do nothing. + + * config/darwin.h, config/alpha/alpha.h, config/arm/pe.h, + config/i386/cygwin.h, config/ia64/ia64.h, config/m68hc11/m68hc11.h, + config/mcore/mcore.h: Remove REDO_SECTION_INFO_P. + + * config/arm/t-pe (pe.o): Add dependencies. + 2002-03-02 Kaveh R. Ghazi * a29k.h, alpha.h, arc.h, arm.h, avr.h, clipper.h, convex.h, diff --git a/gcc/config/a29k/a29k.h b/gcc/config/a29k/a29k.h index f499ea11b159..2c98d12a6506 100644 --- a/gcc/config/a29k/a29k.h +++ b/gcc/config/a29k/a29k.h @@ -1366,7 +1366,7 @@ literal_section () \ that we can branch to this function without emitting a no-op after the call. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ if (TREE_CODE (DECL) == FUNCTION_DECL \ && (TREE_ASM_WRITTEN (DECL) || ! TREE_PUBLIC (DECL))) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; diff --git a/gcc/config/alpha/alpha-protos.h b/gcc/config/alpha/alpha-protos.h index c6fdd042242e..0ccdaaa0a1c9 100644 --- a/gcc/config/alpha/alpha-protos.h +++ b/gcc/config/alpha/alpha-protos.h @@ -165,7 +165,7 @@ extern void alpha_start_function PARAMS ((FILE *, const char *, tree)); extern void alpha_end_function PARAMS ((FILE *, const char *, tree)); extern void alpha_output_mi_thunk_osf PARAMS ((FILE *, tree, HOST_WIDE_INT, tree)); -extern void alpha_encode_section_info PARAMS ((tree)); +extern void alpha_encode_section_info PARAMS ((tree, int)); #endif /* TREE CODE */ #ifdef RTX_CODE diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index aea7471f1ad2..58753467e4f6 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -1554,8 +1554,9 @@ decl_in_text_section (decl) then add "@s" instead. */ void -alpha_encode_section_info (decl) +alpha_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { const char *symbol_str; bool is_local, is_small; diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 6d78d3ff82f3..3ea65568d469 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -1797,16 +1797,8 @@ literal_section () \ depending on something about the variable or function named by the symbol (such as what section it is in). */ -#define ENCODE_SECTION_INFO(DECL) alpha_encode_section_info (DECL) - -/* If a variable is weakened, made one only or moved into a different - section, it may be necessary to redo the section info to move the - variable out of sdata. */ - -#define REDO_SECTION_INFO_P(DECL) \ - ((TREE_CODE (DECL) == VAR_DECL) \ - && (DECL_ONE_ONLY (DECL) || DECL_WEAK (DECL) || DECL_COMMON (DECL) \ - || DECL_SECTION_NAME (DECL) != 0)) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + alpha_encode_section_info (DECL, FIRST) #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \ do { \ diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h index 0a8385430d8f..29edf4e95e1f 100644 --- a/gcc/config/arc/arc.h +++ b/gcc/config/arc/arc.h @@ -1139,7 +1139,7 @@ extern const char *arc_text_section, *arc_data_section, *arc_rodata_section; Branch to absolute address insns take an address that is right-shifted by 2. We encode the fact that we have a function here, and then emit a special assembler op when outputting the address. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do { \ if (TREE_CODE (DECL) == FUNCTION_DECL) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index b42da823869a..036ea44fed5d 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -185,7 +185,7 @@ extern int arm_dllimport_name_p PARAMS ((const char *)); #ifdef TREE_CODE extern void arm_pe_unique_section PARAMS ((tree, int)); -extern void arm_pe_encode_section_info PARAMS ((tree)); +extern void arm_pe_encode_section_info PARAMS ((tree, int)); extern int arm_dllexport_p PARAMS ((tree)); extern int arm_dllimport_p PARAMS ((tree)); extern void arm_mark_dllexport PARAMS ((tree)); diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 8f4c4a1c8def..853db6da6d8c 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -1912,7 +1912,7 @@ typedef struct /* This doesn't work with AOF syntax, since the string table may be in a different AREA. */ #ifndef AOF_ASSEMBLER -#define ENCODE_SECTION_INFO(decl) \ +#define ENCODE_SECTION_INFO(decl, first) \ { \ if (optimize > 0 && TREE_CONSTANT (decl) \ && (!flag_writable_strings || TREE_CODE (decl) != STRING_CST)) \ @@ -1921,12 +1921,14 @@ typedef struct ? TREE_CST_RTL (decl) : DECL_RTL (decl)); \ SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1; \ } \ - ARM_ENCODE_CALL_TYPE (decl) \ + if (first) \ + ARM_ENCODE_CALL_TYPE (decl) \ } #else -#define ENCODE_SECTION_INFO(decl) \ +#define ENCODE_SECTION_INFO(decl, first) \ { \ - ARM_ENCODE_CALL_TYPE (decl) \ + if (first) \ + ARM_ENCODE_CALL_TYPE (decl) \ } #endif diff --git a/gcc/config/arm/pe.c b/gcc/config/arm/pe.c index 8360f85c44ca..4069eac1ab2d 100644 --- a/gcc/config/arm/pe.c +++ b/gcc/config/arm/pe.c @@ -207,8 +207,9 @@ arm_mark_dllimport (decl) /* Cover function to implement ENCODE_SECTION_INFO. */ void -arm_pe_encode_section_info (decl) +arm_pe_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { /* This bit is copied from arm.h. */ if (optimize > 0 && TREE_CONSTANT (decl) diff --git a/gcc/config/arm/pe.h b/gcc/config/arm/pe.h index 1182aac12c4d..6c4375de1224 100644 --- a/gcc/config/arm/pe.h +++ b/gcc/config/arm/pe.h @@ -102,14 +102,8 @@ Boston, MA 02111-1307, USA. */ section and we need to set DECL_SECTION_NAME so we do that here. Note that we can be called twice on the same decl. */ #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ - arm_pe_encode_section_info (DECL) - -/* Used to implement dllexport overriding dllimport semantics. It's also used - to handle vtables - the first pass won't do anything because - DECL_CONTEXT (DECL) will be 0 so arm_dll{ex,im}port_p will return 0. - It's also used to handle dllimport override semantics. */ -#define REDO_SECTION_INFO_P(DECL) 1 +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + arm_pe_encode_section_info (DECL, FIRST) /* Define this macro if in some cases global symbols from one translation unit may not be bound to undefined symbols in another translation unit diff --git a/gcc/config/arm/t-pe b/gcc/config/arm/t-pe index 4de366521c06..f559bd20cff9 100644 --- a/gcc/config/arm/t-pe +++ b/gcc/config/arm/t-pe @@ -20,7 +20,8 @@ dp-bit.c: $(srcdir)/config/fp-bit.c echo '#endif' >> dp-bit.c cat $(srcdir)/config/fp-bit.c >> dp-bit.c -pe.o: $(srcdir)/config/arm/pe.c +pe.o: $(srcdir)/config/arm/pe.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) output.h \ + flags.h $(TREE_H) $(EXPR_H) toplev.h $(TM_P_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/arm/pe.c MULTILIB_OPTIONS = mhard-float mthumb diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index e47b7e0ea646..966a0cb28a4f 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -44,7 +44,7 @@ extern void gas_output_ascii PARAMS ((FILE *file, const char *str, extern void asm_output_external PARAMS ((FILE *file, tree decl, char *name)); extern void unique_section PARAMS ((tree decl, int reloc)); -extern void encode_section_info PARAMS ((tree decl)); +extern void encode_section_info PARAMS ((tree decl, int)); extern int avr_progmem_p PARAMS ((tree decl)); diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 8e64bcb74aae..30ea833c751f 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -4741,12 +4741,14 @@ avr_progmem_p (decl) /* Encode section information about tree DECL */ void -encode_section_info (decl) +encode_section_info (decl, first) tree decl; + int first; { if (TREE_CODE (decl) == FUNCTION_DECL) SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; - else if ((TREE_STATIC (decl) || DECL_EXTERNAL (decl)) + else if (first + && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) && TREE_CODE (decl) == VAR_DECL && avr_progmem_p (decl)) { diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index ffcfa2630958..9b5b35f87405 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -1830,7 +1830,7 @@ progmem_section (void) \ This macro is irrelevant if there is no separate readonly data section. */ -#define ENCODE_SECTION_INFO(DECL) encode_section_info(DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) encode_section_info(DECL, FIRST) /* Define this macro if references to a symbol must be treated differently depending on something about the variable or function named by the symbol (such as what section it is in). diff --git a/gcc/config/c4x/c4x-protos.h b/gcc/config/c4x/c4x-protos.h index 1cd7fce9c50a..d24a1f1bce4b 100644 --- a/gcc/config/c4x/c4x-protos.h +++ b/gcc/config/c4x/c4x-protos.h @@ -53,7 +53,7 @@ extern struct rtx_def *c4x_function_arg PARAMS ((CUMULATIVE_ARGS *, enum machine_mode, tree, int)); -extern void c4x_encode_section_info PARAMS ((tree)); +extern void c4x_encode_section_info PARAMS ((tree, int)); #endif /* TREE_CODE */ diff --git a/gcc/config/c4x/c4x.c b/gcc/config/c4x/c4x.c index ee878dd70988..6743990bede0 100644 --- a/gcc/config/c4x/c4x.c +++ b/gcc/config/c4x/c4x.c @@ -1479,16 +1479,12 @@ c4x_emit_libcall_mulhi (libcall, code, mode, operands) /* Set the SYMBOL_REF_FLAG for a function decl. However, wo do not yet use this info. */ void -c4x_encode_section_info (decl) - tree decl; +c4x_encode_section_info (decl, first) + tree decl; + int first ATTRIBUTE_UNUSED; { -#if 0 - if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE) - SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; -#else if (TREE_CODE (decl) == FUNCTION_DECL) SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; -#endif } diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h index 5ae16ab33064..ffa888e4e1a6 100644 --- a/gcc/config/c4x/c4x.h +++ b/gcc/config/c4x/c4x.h @@ -1540,7 +1540,7 @@ CUMULATIVE_ARGS; On the C4x we use this to indicate if a symbol is in text or data space. */ -#define ENCODE_SECTION_INFO(DECL) c4x_encode_section_info (DECL); +#define ENCODE_SECTION_INFO(DECL, FIRST) c4x_encode_section_info (DECL, FIRST); /* Descripting Relative Cost of Operations. */ diff --git a/gcc/config/cris/cris-protos.h b/gcc/config/cris/cris-protos.h index e13c94fb36db..f5e9f76c7e21 100644 --- a/gcc/config/cris/cris-protos.h +++ b/gcc/config/cris/cris-protos.h @@ -49,7 +49,7 @@ extern void cris_target_asm_named_section # ifdef TREE_CODE extern rtx cris_expand_builtin_va_arg PARAMS ((tree, tree)); -extern void cris_encode_section_info PARAMS ((tree)); +extern void cris_encode_section_info PARAMS ((tree, int)); # endif #endif /* RTX_CODE */ diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c index 063bad642ea4..72fc6b3acddf 100644 --- a/gcc/config/cris/cris.c +++ b/gcc/config/cris/cris.c @@ -2999,8 +2999,9 @@ restart: functions. */ void -cris_encode_section_info (exp) +cris_encode_section_info (exp, first) tree exp; + int first ATTRIBUTE_UNUSED; { if (flag_pic) { diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index 009b9aa33df3..e1d7007ccd5c 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -1446,7 +1446,7 @@ struct cum_args {int regs;}; /* We need to code in PIC-specific flags into SYMBOL_REF_FLAG. */ -#define ENCODE_SECTION_INFO(EXP) cris_encode_section_info (EXP) +#define ENCODE_SECTION_INFO(EXP, FIRST) cris_encode_section_info (EXP, FIRST) /* We pull a little trick to register the _fini function with atexit, after (presumably) registering the eh frame info, since we don't handle diff --git a/gcc/config/d30v/d30v.h b/gcc/config/d30v/d30v.h index 21745076b818..aa4f7187d155 100644 --- a/gcc/config/d30v/d30v.h +++ b/gcc/config/d30v/d30v.h @@ -2794,19 +2794,6 @@ extern const char *d30v_branch_cost_string; This macro is irrelevant if there is no separate readonly data section. */ /* #define JUMP_TABLES_IN_TEXT_SECTION */ -/* Define this macro if references to a symbol must be treated differently - depending on something about the variable or function named by the symbol - (such as what section it is in). - - The macro definition, if any, is executed immediately after the rtl for DECL - has been created and stored in `DECL_RTL (DECL)'. The value of the rtl will - be a `mem' whose address is a `symbol_ref'. - - The usual thing for this macro to do is to record a flag in the `symbol_ref' - (such as `SYMBOL_REF_FLAG') or to store a modified name string in the - `symbol_ref' (if one bit is not enough information). */ -/* #define ENCODE_SECTION_INFO(DECL) */ - /* Decode SYM_NAME and store the real name part in VAR, sans the characters that encode section info. Define this macro if `ENCODE_SECTION_INFO' alters the symbol's name string. */ diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h index 0bff1308d013..5a93ca651518 100644 --- a/gcc/config/darwin-protos.h +++ b/gcc/config/darwin-protos.h @@ -58,7 +58,7 @@ extern void machopic_define_ident PARAMS ((tree)); extern void machopic_define_name PARAMS ((const char*)); extern int machopic_name_defined_p PARAMS ((const char*)); extern int machopic_ident_defined_p PARAMS ((tree)); -extern void darwin_encode_section_info PARAMS ((tree)); +extern void darwin_encode_section_info PARAMS ((tree, int)); #endif /* TREE_CODE */ diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 6864f0c82883..f5e9db0e3154 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -952,8 +952,9 @@ machopic_operand_p (op) use later. */ void -darwin_encode_section_info (decl) +darwin_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { char code = '\0'; int defined = 0; diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index 05ca85bdb8c9..c5a078b025e5 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -208,7 +208,7 @@ do { text_section (); \ if ((TREE_STATIC (DECL) \ && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ || DECL_INITIAL (DECL)) \ - ENCODE_SECTION_INFO (DECL); \ + ENCODE_SECTION_INFO (DECL, false); \ ASM_OUTPUT_LABEL (FILE, xname); \ } while (0) @@ -224,7 +224,7 @@ do { text_section (); \ if ((TREE_STATIC (DECL) \ && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ || DECL_INITIAL (DECL)) \ - ENCODE_SECTION_INFO (DECL); \ + ENCODE_SECTION_INFO (DECL, false); \ ASM_OUTPUT_LABEL (FILE, xname); \ /* Avoid generating stubs for functions we've just defined by \ outputting any required stub name label now. */ \ @@ -270,19 +270,20 @@ do { text_section (); \ /* Ensure correct alignment of bss data. */ #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL -#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ - do { \ - fputs (".lcomm ", (FILE)); \ - assemble_name ((FILE), (NAME)); \ - fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)); \ - if ((DECL) && ((TREE_STATIC (DECL) \ - && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ - || DECL_INITIAL (DECL))) \ - ENCODE_SECTION_INFO (DECL); \ - if ((DECL) && ((TREE_STATIC (DECL) \ - && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ - || DECL_INITIAL (DECL))) \ - machopic_define_name (NAME); \ +#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ + do { \ + fputs (".lcomm ", (FILE)); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), ",%u,%u\n", (SIZE), \ + floor_log2 ((ALIGN) / BITS_PER_UNIT)); \ + if ((DECL) && ((TREE_STATIC (DECL) \ + && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ + || DECL_INITIAL (DECL))) \ + ENCODE_SECTION_INFO (DECL, false); \ + if ((DECL) && ((TREE_STATIC (DECL) \ + && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ + || DECL_INITIAL (DECL))) \ + machopic_define_name (NAME); \ } while (0) /* Output nothing for #ident. */ @@ -716,12 +717,8 @@ enum machopic_addr_class { #define MACHOPIC_JUST_INDIRECT (flag_pic == 1) #define MACHOPIC_PURE (flag_pic == 2) -#define ENCODE_SECTION_INFO(DECL) \ - darwin_encode_section_info (DECL) - -/* Be conservative and always redo the encoding. */ - -#define REDO_SECTION_INFO_P(DECL) (1) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + darwin_encode_section_info (DECL, FIRST) #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \ ((VAR) = ((SYMBOL_NAME[0] == '!') ? (SYMBOL_NAME) + 4 : (SYMBOL_NAME))) diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index b19c0b336fc3..3439453a1e58 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -1140,7 +1140,7 @@ readonly_data () \ /* If we are referencing a function that is supposed to be called through the function vector, the SYMBOL_REF_FLAG in the rtl so the call patterns can generate the correct code. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ if (TREE_CODE (DECL) == FUNCTION_DECL \ && h8300_funcvec_function_p (DECL)) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ @@ -1148,7 +1148,7 @@ readonly_data () \ && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \ && h8300_eightbit_data_p (DECL)) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ - else if (TREE_CODE (DECL) == VAR_DECL \ + else if ((FIRST) && TREE_CODE (DECL) == VAR_DECL \ && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \ && h8300_tiny_data_p (DECL)) \ h8300_encode_label (DECL); diff --git a/gcc/config/i370/i370.h b/gcc/config/i370/i370.h index d1f72bb86002..206a94dc89d2 100644 --- a/gcc/config/i370/i370.h +++ b/gcc/config/i370/i370.h @@ -291,7 +291,7 @@ extern int mvs_function_name_length; /* Mark external references. */ -#define ENCODE_SECTION_INFO(decl) \ +#define ENCODE_SECTION_INFO(decl, first) \ if (DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; diff --git a/gcc/config/i386/cygwin.h b/gcc/config/i386/cygwin.h index 2a812a5ff4df..aa05518ae46b 100644 --- a/gcc/config/i386/cygwin.h +++ b/gcc/config/i386/cygwin.h @@ -189,19 +189,6 @@ Boston, MA 02111-1307, USA. */ union tree_node; #define TREE union tree_node * - -/* Used to implement dllexport overriding dllimport semantics. It's also used - to handle vtables - the first pass won't do anything because - DECL_CONTEXT (DECL) will be 0 so i386_pe_dll{ex,im}port_p will return 0. - It's also used to handle dllimport override semantics. */ -#if 0 -#define REDO_SECTION_INFO_P(DECL) \ - ((DECL_ATTRIBUTES (DECL) != NULL_TREE) \ - || (TREE_CODE (DECL) == VAR_DECL && DECL_VIRTUAL_P (DECL))) -#else -#define REDO_SECTION_INFO_P(DECL) 1 -#endif - #undef EXTRA_SECTIONS #define EXTRA_SECTIONS in_drectve @@ -277,12 +264,11 @@ do { \ section and we need to set DECL_SECTION_NAME so we do that here. Note that we can be called twice on the same decl. */ -extern void i386_pe_encode_section_info PARAMS ((TREE)); +extern void i386_pe_encode_section_info PARAMS ((TREE, int)); -#ifdef ENCODE_SECTION_INFO #undef ENCODE_SECTION_INFO -#endif -#define ENCODE_SECTION_INFO(DECL) i386_pe_encode_section_info (DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + i386_pe_encode_section_info (DECL, FIRST) /* Utility used only in this file. */ #define I386_PE_STRIP_ENCODING(SYM_NAME) \ diff --git a/gcc/config/i386/i386-interix.h b/gcc/config/i386/i386-interix.h index 962862f0858b..495d96283510 100644 --- a/gcc/config/i386/i386-interix.h +++ b/gcc/config/i386/i386-interix.h @@ -354,7 +354,7 @@ union tree_node; const char *gen_stdcall_suffix PARAMS ((union tree_node *)); #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ if (flag_pic) \ @@ -365,7 +365,7 @@ do \ = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ || ! TREE_PUBLIC (DECL)); \ } \ - if (TREE_CODE (DECL) == FUNCTION_DECL) \ + if ((FIRST) && TREE_CODE (DECL) == FUNCTION_DECL) \ if (lookup_attribute ("stdcall", \ TYPE_ATTRIBUTES (TREE_TYPE (DECL)))) \ XEXP (DECL_RTL (DECL), 0) = \ diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index a53a06f7148a..1a3d9abe58e0 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2244,7 +2244,7 @@ enum ix86_builtins On i386, if using PIC, mark a SYMBOL_REF for a non-global symbol so that we may access it directly in the GOT. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do { \ if (flag_pic) \ { \ diff --git a/gcc/config/i386/osfrose.h b/gcc/config/i386/osfrose.h index 4580e0ef56d0..7338191293eb 100644 --- a/gcc/config/i386/osfrose.h +++ b/gcc/config/i386/osfrose.h @@ -449,21 +449,23 @@ while (0) `PRINT_OPERAND_ADDRESS'. */ #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ -do \ - { \ - if (HALF_PIC_P ()) \ - HALF_PIC_ENCODE (DECL); \ - \ - else if (flag_pic) \ - { \ - rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \ - SYMBOL_REF_FLAG (XEXP (rtl, 0)) \ - = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - || ! TREE_PUBLIC (DECL)); \ - } \ - } \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ +do \ + { \ + if (HALF_PIC_P ()) \ + { \ + if (FIRST) \ + HALF_PIC_ENCODE (DECL); \ + } \ + else if (flag_pic) \ + { \ + rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ + ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \ + SYMBOL_REF_FLAG (XEXP (rtl, 0)) \ + = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ + || ! TREE_PUBLIC (DECL)); \ + } \ + } \ while (0) diff --git a/gcc/config/i386/win32.h b/gcc/config/i386/win32.h index 0aa7a5794c4a..da1821d877c3 100644 --- a/gcc/config/i386/win32.h +++ b/gcc/config/i386/win32.h @@ -115,9 +115,8 @@ Boston, MA 02111-1307, USA. */ the number of bytes of arguments passed to the function, if it has the attribute STDCALL. */ -#ifdef ENCODE_SECTION_INFO #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ if (flag_pic) \ @@ -128,14 +127,13 @@ do \ = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ || ! TREE_PUBLIC (DECL)); \ } \ - if (TREE_CODE (DECL) == FUNCTION_DECL) \ + if ((FIRST) && TREE_CODE (DECL) == FUNCTION_DECL) \ if (lookup_attribute ("stdcall", \ TYPE_ATTRIBUTES (TREE_TYPE (DECL)))) \ XEXP (DECL_RTL (DECL), 0) = \ gen_rtx (SYMBOL_REF, Pmode, gen_stdcall_suffix (DECL)); \ } \ while (0) -#endif /* This macro gets just the user-specified name out of the string in a SYMBOL_REF. Discard diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index 9d955df2f48e..b8bb39e727b1 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -369,9 +369,13 @@ gen_stdcall_suffix (decl) /* Cover function to implement ENCODE_SECTION_INFO. */ void -i386_pe_encode_section_info (decl) +i386_pe_encode_section_info (decl, first) tree decl; + int first; { + if (!first) + return; + /* This bit is copied from i386.h. */ if (optimize > 0 && TREE_CONSTANT (decl) && (!flag_writable_strings || TREE_CODE (decl) != STRING_CST)) diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h index 43538cc74930..332b07690b83 100644 --- a/gcc/config/ia64/ia64-protos.h +++ b/gcc/config/ia64/ia64-protos.h @@ -116,7 +116,7 @@ extern void ia64_function_arg_advance PARAMS((CUMULATIVE_ARGS *, extern int ia64_return_in_memory PARAMS((tree)); extern void ia64_asm_output_external PARAMS((FILE *, tree, const char *)); -extern void ia64_encode_section_info PARAMS((tree)); +extern void ia64_encode_section_info PARAMS((tree, int)); #endif /* TREE_CODE */ extern int ia64_register_move_cost PARAMS((enum machine_mode, enum reg_class, diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index e4f6268b505e..1c7c5a35876a 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -6857,8 +6857,9 @@ const struct attribute_spec ia64_attribute_table[] = extern struct obstack * saveable_obstack; void -ia64_encode_section_info (decl) +ia64_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { const char *symbol_str; diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 3c1d6b784435..50f7982ef321 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1764,16 +1764,7 @@ do { \ depending on something about the variable or function named by the symbol (such as what section it is in). */ -#define ENCODE_SECTION_INFO(DECL) ia64_encode_section_info (DECL) - -/* If a variable is weakened, made one only or moved into a different - section, it may be necessary to redo the section info to move the - variable out of sdata. */ - -#define REDO_SECTION_INFO_P(DECL) \ - ((TREE_CODE (DECL) == VAR_DECL) \ - && (DECL_ONE_ONLY (DECL) || DECL_WEAK (DECL) || DECL_COMMON (DECL) \ - || DECL_SECTION_NAME (DECL) != 0)) +#define ENCODE_SECTION_INFO(DECL, FIRST) ia64_encode_section_info (DECL, FIRST) #define SDATA_NAME_FLAG_CHAR '@' diff --git a/gcc/config/m32r/m32r-protos.h b/gcc/config/m32r/m32r-protos.h index f76e6b918e24..86adde0166d0 100644 --- a/gcc/config/m32r/m32r-protos.h +++ b/gcc/config/m32r/m32r-protos.h @@ -34,7 +34,7 @@ extern void m32r_asm_file_start PARAMS ((FILE *)); extern int direct_return PARAMS ((void)); #ifdef TREE_CODE extern void m32r_select_section PARAMS ((tree, int)); -extern void m32r_encode_section_info PARAMS ((tree)); +extern void m32r_encode_section_info PARAMS ((tree, int)); extern enum m32r_function_type m32r_compute_function_type PARAMS ((tree)); extern void m32r_select_section PARAMS ((tree, int)); diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index edf5fa4056e6..0a985599a3e5 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -366,12 +366,16 @@ m32r_select_section (decl, reloc) */ void -m32r_encode_section_info (decl) +m32r_encode_section_info (decl, first) tree decl; + int first; { char prefix = 0; tree model = 0; + if (!first) + return; + switch (TREE_CODE (decl)) { case VAR_DECL : diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index 44510a06bb7b..dcbcfd5322b5 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -1644,7 +1644,7 @@ sbss_section () \ || MEDIUM_NAME_P (SYMBOL_NAME) \ || LARGE_NAME_P (SYMBOL_NAME)) -#define ENCODE_SECTION_INFO(DECL) m32r_encode_section_info (DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) m32r_encode_section_info (DECL, FIRST) /* Decode SYM_NAME and store the real name part in VAR, sans the characters that encode section info. Define this macro if diff --git a/gcc/config/m68hc11/m68hc11-protos.h b/gcc/config/m68hc11/m68hc11-protos.h index e775234eb544..bbbb4525f4f3 100644 --- a/gcc/config/m68hc11/m68hc11-protos.h +++ b/gcc/config/m68hc11/m68hc11-protos.h @@ -41,7 +41,7 @@ extern void m68hc11_function_arg_advance PARAMS((CUMULATIVE_ARGS*, enum machine_mode, tree, int)); -extern void m68hc11_encode_section_info PARAMS((tree)); +extern void m68hc11_encode_section_info PARAMS((tree, int)); #endif #ifdef RTX_CODE diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c index f45d195e0203..4946c3bb78cb 100644 --- a/gcc/config/m68hc11/m68hc11.c +++ b/gcc/config/m68hc11/m68hc11.c @@ -1173,8 +1173,9 @@ m68hc11_handle_fntype_attribute (node, name, args, flags, no_add_attrs) handle calls to traps in a special manner (by issuing the trap). This information is stored in SYMBOL_REF_FLAG. */ void -m68hc11_encode_section_info (decl) +m68hc11_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { tree func_attr; int trap_handler; diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h index 0e4b2022fd3d..6afcf9a2173a 100644 --- a/gcc/config/m68hc11/m68hc11.h +++ b/gcc/config/m68hc11/m68hc11.h @@ -1146,11 +1146,8 @@ typedef struct m68hc11_args handle calls to traps in a special manner (by issuing the trap). This information is stored in SYMBOL_REF_FLAG. */ -#define ENCODE_SECTION_INFO(DECL) m68hc11_encode_section_info (DECL) - -/* Override what GCC does for section info to let us recognize traps. */ - -#define REDO_SECTION_INFO_P(DECL) 1 +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + m68hc11_encode_section_info (DECL, FIRST) /* `INIT_TARGET_OPTABS' Define this macro as a C statement that declares additional library diff --git a/gcc/config/m88k/m88k.h b/gcc/config/m88k/m88k.h index 11d8e544d068..a6da552387fd 100644 --- a/gcc/config/m88k/m88k.h +++ b/gcc/config/m88k/m88k.h @@ -2414,7 +2414,7 @@ sdata_section () \ rtl will be a `mem' whose address is a `symbol_ref'. For the m88k, determine if the item should go in the global pool. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do { \ if (m88k_gp_threshold > 0) \ { \ diff --git a/gcc/config/mcore/mcore-protos.h b/gcc/config/mcore/mcore-protos.h index d478f9003067..d6f6e2e8a46c 100644 --- a/gcc/config/mcore/mcore-protos.h +++ b/gcc/config/mcore/mcore-protos.h @@ -36,7 +36,7 @@ extern int mcore_naked_function_p PARAMS ((void)); #ifdef TREE_CODE extern void mcore_unique_section PARAMS ((tree, int)); -extern void mcore_encode_section_info PARAMS ((tree)); +extern void mcore_encode_section_info PARAMS ((tree, int)); #ifdef HAVE_MACHINE_MODES extern int mcore_function_arg_partial_nregs PARAMS ((CUMULATIVE_ARGS, enum machine_mode, tree, int)); diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c index 2b6d1e8cedf2..931cd06a99db 100644 --- a/gcc/config/mcore/mcore.c +++ b/gcc/config/mcore/mcore.c @@ -3416,8 +3416,9 @@ mcore_dllimport_p (decl) /* Cover function to implement ENCODE_SECTION_INFO. */ void -mcore_encode_section_info (decl) +mcore_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { /* This bit is copied from arm.h. */ if (optimize > 0 diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h index ab02a2afb6b4..4899aa6cc1d9 100644 --- a/gcc/config/mcore/mcore.h +++ b/gcc/config/mcore/mcore.h @@ -1161,8 +1161,6 @@ switch_to_section (section, decl) \ #undef UNIQUE_SECTION #define UNIQUE_SECTION(DECL, RELOC) mcore_unique_section (DECL, RELOC) -#define REDO_SECTION_INFO_P(DECL) 1 - #define MULTIPLE_SYMBOL_SPACES 1 #define SUPPORTS_ONE_ONLY 1 @@ -1315,7 +1313,8 @@ extern long mcore_current_compilation_timestamp; /* We must mark dll symbols specially. Definitions of dllexport'd objects install some info in the .drective (PE) or .exports (ELF) sections. */ #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) mcore_encode_section_info (DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + mcore_encode_section_info (DECL, FIRST) /* Print operand X (an rtx) in assembler syntax to file FILE. CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 66c362124afa..39862a35e90f 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -3343,12 +3343,12 @@ typedef struct mips_args { If you are changing this macro, you should look at mips_select_section and see if it needs a similar change. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ if (TARGET_MIPS16) \ { \ - if (TREE_CODE (DECL) == STRING_CST \ + if ((FIRST) && TREE_CODE (DECL) == STRING_CST \ && ! flag_writable_strings \ /* If this string is from a function, and the function will \ go in a gnu linkonce section, then we can't directly \ @@ -3415,7 +3415,8 @@ do \ \ else if (HALF_PIC_P ()) \ { \ - HALF_PIC_ENCODE (DECL); \ + if (FIRST) \ + HALF_PIC_ENCODE (DECL); \ } \ } \ while (0) diff --git a/gcc/config/ns32k/ns32k.h b/gcc/config/ns32k/ns32k.h index 8ef5aeb9a8e4..e0343a698573 100644 --- a/gcc/config/ns32k/ns32k.h +++ b/gcc/config/ns32k/ns32k.h @@ -1064,7 +1064,7 @@ __transfer_from_trampoline () \ symbol or a code symbol. These symbols are referenced via pc and not via sb. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ extern int flag_pic; \ diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 696068449d1d..770f24363e84 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -1486,9 +1486,9 @@ do { \ #define FUNCTION_NAME_P(NAME) (*(NAME) == '@') -#define ENCODE_SECTION_INFO(DECL)\ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ - { if (TEXT_SPACE_P (DECL)) \ + { if (FIRST && TEXT_SPACE_P (DECL)) \ { rtx _rtl; \ if (TREE_CODE (DECL) == FUNCTION_DECL \ || TREE_CODE (DECL) == VAR_DECL) \ diff --git a/gcc/config/romp/romp.h b/gcc/config/romp/romp.h index 5ce44f055e48..a8e04dd86520 100644 --- a/gcc/config/romp/romp.h +++ b/gcc/config/romp/romp.h @@ -923,7 +923,7 @@ struct rt_cargs {int gregs, fregs; }; /* For no good reason, we do the same as the other RT compilers and load the addresses of data areas for a function from our data area. That means that we need to mark such SYMBOL_REFs. We do so here. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ if (TREE_CODE (TREE_TYPE (DECL)) == FUNCTION_TYPE) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index 40b64dc3f9e7..109985998bc1 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -218,7 +218,7 @@ Boston, MA 02111-1307, USA. */ call. Do not set this flag if the function is weakly defined. */ #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ if (TREE_CODE (DECL) == FUNCTION_DECL \ && (TREE_ASM_WRITTEN (DECL) || ! TREE_PUBLIC (DECL)) \ && ! DECL_WEAK (DECL)) \ diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index 19aeb07b9e0c..50367e35e25c 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -144,7 +144,7 @@ extern void setup_incoming_varargs PARAMS ((CUMULATIVE_ARGS *, int *, int)); extern struct rtx_def *rs6000_va_arg PARAMS ((tree, tree)); extern void output_mi_thunk PARAMS ((FILE *, tree, int, tree)); -extern void rs6000_encode_section_info PARAMS ((tree)); +extern void rs6000_encode_section_info PARAMS ((tree, int)); extern void rs6000_select_section PARAMS ((tree, int)); extern void rs6000_unique_section PARAMS ((tree, int)); #ifdef ARGS_SIZE_RTX diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 887c3b4729ab..140593fe2334 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -10954,9 +10954,13 @@ rs6000_unique_section (decl, reloc) to read the prefixes. */ void -rs6000_encode_section_info (decl) +rs6000_encode_section_info (decl, first) tree decl; + int first; { + if (!first) + return; + if (TREE_CODE (decl) == FUNCTION_DECL) { rtx sym_ref = XEXP (DECL_RTL (decl), 0); diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 8caa1cc21c99..5373a6cd11a2 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -816,7 +816,8 @@ extern int fixuplabelno; to read the prefixes. */ #undef ENCODE_SECTION_INFO -#define ENCODE_SECTION_INFO(DECL) rs6000_encode_section_info (DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + rs6000_encode_section_info (DECL, FIRST) /* The ELF version doesn't encode [DS] or whatever at the end of symbols. */ diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h index 4a51b046ed1f..9fcedf8de5cd 100644 --- a/gcc/config/rs6000/xcoff.h +++ b/gcc/config/rs6000/xcoff.h @@ -207,7 +207,7 @@ toc_section () \ that we can branch to this function without emitting a no-op after the call. Do not set this flag if the function is weakly defined. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ if (TREE_CODE (DECL) == FUNCTION_DECL \ && !TREE_PUBLIC (DECL) \ && !DECL_WEAK (DECL)) \ diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index e395f852de4d..b8e86bb8c873 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -409,7 +409,7 @@ do \ On s390, if using PIC, mark a SYMBOL_REF for a non-global symbol so that we may access it directly in the GOT. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ if (flag_pic) \ diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index e9195970c796..28cf110c0ec3 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -2688,31 +2688,33 @@ while (0) On SH, if using PIC, mark a SYMBOL_REF for a non-global symbol so that we may access it using GOTOFF instead of GOT. */ -#define ENCODE_SECTION_INFO(DECL) \ -do \ - { \ - if (flag_pic) \ - { \ - rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \ - \ - SYMBOL_REF_FLAG (XEXP (rtl, 0)) = \ - (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - || ! TREE_PUBLIC (DECL)); \ - } \ - if (TARGET_SH5) \ - { \ - rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ - ? TREE_CST_RTL (DECL) \ - : TREE_CODE (DECL) != VAR_DECL \ - ? NULL_RTX \ - : DECL_RTL (DECL)); \ - \ - if (rtl && GET_CODE (rtl) == MEM \ - && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF) \ - XEXP (rtl, 0) = gen_datalabel_ref (XEXP (rtl, 0)); \ - } \ - } \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ +do \ + { \ + if (!(FIRST)) \ + break; \ + if (flag_pic) \ + { \ + rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ + ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \ + \ + SYMBOL_REF_FLAG (XEXP (rtl, 0)) = \ + (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ + || ! TREE_PUBLIC (DECL)); \ + } \ + if (TARGET_SH5) \ + { \ + rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \ + ? TREE_CST_RTL (DECL) \ + : TREE_CODE (DECL) != VAR_DECL \ + ? NULL_RTX \ + : DECL_RTL (DECL)); \ + \ + if (rtl && GET_CODE (rtl) == MEM \ + && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF) \ + XEXP (rtl, 0) = gen_datalabel_ref (XEXP (rtl, 0)); \ + } \ + } \ while (0) /* The prefix used to mark SYMBOL_REFs that refer to data symbols. */ diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 3faf25b8673b..22645c3b5307 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -2383,10 +2383,10 @@ do { \ In the Embedded Medium/Anywhere code model, %g4 points to the data segment so we must not add it to function addresses. */ -#define ENCODE_SECTION_INFO(DECL) \ - do { \ - if (TARGET_CM_EMBMEDANY && TREE_CODE (DECL) == FUNCTION_DECL) \ - SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + do { \ + if (TARGET_CM_EMBMEDANY && TREE_CODE (DECL) == FUNCTION_DECL) \ + SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ } while (0) /* Specify the machine mode that this machine uses diff --git a/gcc/config/stormy16/stormy16-protos.h b/gcc/config/stormy16/stormy16-protos.h index 76d0bc0dcfed..fdae8a466a91 100644 --- a/gcc/config/stormy16/stormy16-protos.h +++ b/gcc/config/stormy16/stormy16-protos.h @@ -38,7 +38,7 @@ extern CUMULATIVE_ARGS xstormy16_function_arg_advance extern void xstormy16_setup_incoming_varargs PARAMS ((CUMULATIVE_ARGS, int, tree, int *)); extern tree xstormy16_build_va_list PARAMS ((void)); -extern void xstormy16_encode_section_info PARAMS ((tree)); +extern void xstormy16_encode_section_info PARAMS ((tree, int)); #endif #if defined (TREE_CODE) && defined (RTX_CODE) diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c index 0a886aceea4b..dedc9be5ffe5 100644 --- a/gcc/config/stormy16/stormy16.c +++ b/gcc/config/stormy16/stormy16.c @@ -1394,8 +1394,9 @@ xstormy16_asm_output_mi_thunk (file, thunk_fndecl, delta, function) /* Mark functions with SYMBOL_REF_FLAG. */ void -xstormy16_encode_section_info (decl) +xstormy16_encode_section_info (decl, first) tree decl; + int first ATTRIBUTE_UNUSED; { if (TREE_CODE (decl) == FUNCTION_DECL) SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h index c2fd617d6380..6ebb43f1bb30 100644 --- a/gcc/config/stormy16/stormy16.h +++ b/gcc/config/stormy16/stormy16.h @@ -2593,7 +2593,8 @@ do { \ The usual thing for this macro to do is to record a flag in the `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified name string in the `symbol_ref' (if one bit is not enough information). */ -#define ENCODE_SECTION_INFO(DECL) xstormy16_encode_section_info(DECL) +#define ENCODE_SECTION_INFO(DECL, FIRST) \ + xstormy16_encode_section_info(DECL, FIRST) /* Decode SYM_NAME and store the real name part in VAR, sans the characters that encode section info. Define this macro if `ENCODE_SECTION_INFO' alters diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index b20c1f48b4d2..1cf58da1290b 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -1505,10 +1505,10 @@ extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_K #define EP_REGNUM 30 /* ep register number */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do \ { \ - if (TREE_CODE (DECL) == VAR_DECL \ + if ((FIRST) && TREE_CODE (DECL) == VAR_DECL \ && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL))) \ v850_encode_data_area (DECL); \ } \ diff --git a/gcc/config/vax/vms.h b/gcc/config/vax/vms.h index 133d1c3ba1ab..69eced9db1db 100644 --- a/gcc/config/vax/vms.h +++ b/gcc/config/vax/vms.h @@ -88,7 +88,7 @@ Boston, MA 02111-1307, USA. */ addressed. Under VMS there is some brain damage in the linker that requires us to do this. */ -#define ENCODE_SECTION_INFO(decl) \ +#define ENCODE_SECTION_INFO(decl, FIRST) \ if (DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1; diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index 709ed06d110b..428ed4734a42 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -1261,7 +1261,7 @@ typedef struct xtensa_args { /* If we are referencing a function that is static, make the SYMBOL_REF special so that we can generate direct calls to it even with -fpic. */ -#define ENCODE_SECTION_INFO(DECL) \ +#define ENCODE_SECTION_INFO(DECL, FIRST) \ do { \ if (TREE_CODE (DECL) == FUNCTION_DECL && ! TREE_PUBLIC (DECL)) \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 1a5855740ac0..2d7c3e0f2504 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5545,25 +5545,31 @@ readonly data section is used. This macro is irrelevant if there is no separate readonly data section. @findex ENCODE_SECTION_INFO -@item ENCODE_SECTION_INFO (@var{decl}) +@item ENCODE_SECTION_INFO (@var{decl}, @var{new_decl_p}) Define this macro if references to a symbol or a constant must be treated differently depending on something about the variable or function named by the symbol (such as what section it is in). The macro definition, if any, is executed under two circumstances. One is immediately after the rtl for @var{decl} that represents a variable -or a function has been created and stored in @code{DECL_RTL -(@var{decl})}. The value of the rtl will be a @code{mem} whose address -is a @code{symbol_ref}. The other is immediately after the rtl for -@var{decl} that represents a constant has been created and stored in -@code{TREE_CST_RTL (@var{decl})}. The macro is called once for each -distinct constant in a source file. +or a function has been created and stored in @code{DECL_RTL(@var{decl})}. +The value of the rtl will be a @code{mem} whose address is a @code{symbol_ref}. +The other is immediately after the rtl for @var{decl} that represents a +constant has been created and stored in @code{TREE_CST_RTL (@var{decl})}. +The macro is called once for each distinct constant in a source file. + +The @var{new_decl_p} argument will be true if this is the first time that +@code{ENCODE_SECTION_INFO} has been invoked on this decl. It will +be false for subsequent invocations, which will happen for duplicate +declarations. Whether or not anything must be done for the duplicate +declaration depends on whether @code{ENCODE_SECTION_INFO} examines +@code{DECL_ATTRIBUTES}. @cindex @code{SYMBOL_REF_FLAG}, in @code{ENCODE_SECTION_INFO} The usual thing for this macro to do is to record a flag in the @code{symbol_ref} (such as @code{SYMBOL_REF_FLAG}) or to store a -modified name string in the @code{symbol_ref} (if one bit is not enough -information). +modified name string in the @code{symbol_ref} (if one bit is not +enough information). @findex STRIP_NAME_ENCODING @item STRIP_NAME_ENCODING (@var{var}, @var{sym_name}) diff --git a/gcc/varasm.c b/gcc/varasm.c index e7505a8c39cd..4d57b8990f82 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -851,14 +851,11 @@ make_decl_rtl (decl, asmspec) /* ??? Another way to do this would be to do what halfpic.c does and maintain a hashed table of such critters. */ - /* ??? Another way to do this would be to pass a flag bit to - ENCODE_SECTION_INFO saying whether this is a new decl or not. */ /* Let the target reassign the RTL if it wants. This is necessary, for example, when one machine specific decl attribute overrides another. */ -#ifdef REDO_SECTION_INFO_P - if (REDO_SECTION_INFO_P (decl)) - ENCODE_SECTION_INFO (decl); +#ifdef ENCODE_SECTION_INFO + ENCODE_SECTION_INFO (decl, false); #endif return; } @@ -984,7 +981,7 @@ make_decl_rtl (decl, asmspec) If the name is changed, the macro ASM_OUTPUT_LABELREF will have to know how to strip this information. */ #ifdef ENCODE_SECTION_INFO - ENCODE_SECTION_INFO (decl); + ENCODE_SECTION_INFO (decl, true); #endif } @@ -3320,7 +3317,7 @@ output_constant_def (exp, defer) encoded in it. */ if (! found) { - ENCODE_SECTION_INFO (exp); + ENCODE_SECTION_INFO (exp, true); desc->rtl = rtl; desc->label = XSTR (XEXP (desc->rtl, 0), 0); }