diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-03 04:23:21 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-03 04:23:21 +0000 |
commit | 41eb471c1884c63591a1cbfe50bae5d56ebdbba7 (patch) | |
tree | 0c4d8b48d85a563b3f4acbe81debdbebc7911eac | |
parent | adb7ce73f68211a1c5f19f2a725bc3097d8ebcf2 (diff) | |
download | gcc-41eb471c1884c63591a1cbfe50bae5d56ebdbba7.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50236 138bc75d-0d04-0410-961f-82ee72b054a4
65 files changed, 225 insertions, 217 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb73bd1a536..85872bbdc1a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,39 @@ +2002-03-02 Richard Henderson <rth@redhat.com> + + * 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 <ghazi@caip.rutgers.edu> * 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 f499ea11b15..2c98d12a650 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 c6fdd042242..0ccdaaa0a1c 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 aea7471f1ad..58753467e4f 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 6d78d3ff82f..3ea65568d46 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 0a8385430d8..29edf4e95e1 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 b42da823869..036ea44fed5 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 8f4c4a1c8de..853db6da6d8 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 8360f85c44c..4069eac1ab2 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 1182aac12c4..6c4375de122 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 4de366521c0..f559bd20cff 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 e47b7e0ea64..966a0cb28a4 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 8e64bcb74aa..30ea833c751 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 ffcfa263095..9b5b35f8740 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 1cd7fce9c50..d24a1f1bce4 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 ee878dd7098..6743990bede 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 5ae16ab3306..ffa888e4e1a 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 e13c94fb36d..f5e9f76c7e2 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 063bad642ea..72fc6b3acdd 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 009b9aa33df..e1d7007ccd5 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 21745076b81..aa4f7187d15 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 0bff1308d01..5a93ca65151 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 6864f0c8288..f5e9db0e315 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 05ca85bdb8c..c5a078b025e 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 b19c0b336fc..3439453a1e5 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 d1f72bb8600..206a94dc89d 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 2a812a5ff4d..aa05518ae46 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 962862f0858..495d9628351 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 a53a06f7148..1a3d9abe58e 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 4580e0ef56d..7338191293e 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 0aa7a5794c4..da1821d877c 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 9d955df2f48..b8bb39e727b 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 43538cc7493..332b07690b8 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 e4f6268b505..1c7c5a35876 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 3c1d6b78443..50f7982ef32 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 f76e6b918e2..86adde0166d 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 edf5fa4056e..0a985599a3e 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 44510a06bb7..dcbcfd5322b 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 e775234eb54..bbbb4525f4f 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 f45d195e020..4946c3bb78c 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 0e4b2022fd3..6afcf9a2173 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 11d8e544d06..a6da552387f 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 d478f900306..d6f6e2e8a46 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 2b6d1e8cedf..931cd06a99d 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 ab02a2afb6b..4899aa6cc1d 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 66c362124af..39862a35e90 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 8ef5aeb9a8e..e0343a69857 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 696068449d1..770f24363e8 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 5ce44f055e4..a8e04dd8652 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 40b64dc3f9e..109985998bc 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 19aeb07b9e0..50367e35e25 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 887c3b4729a..140593fe233 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 8caa1cc21c9..5373a6cd11a 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 4a51b046ed1..9fcedf8de5c 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 e395f852de4..b8e86bb8c87 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 e9195970c79..28cf110c0ec 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 3faf25b8673..22645c3b530 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 76d0bc0dcfe..fdae8a466a9 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 0a886aceea4..dedc9be5ffe 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 c2fd617d638..6ebb43f1bb3 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 b20c1f48b4d..1cf58da1290 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 133d1c3ba1a..69eced9db1d 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 709ed06d110..428ed4734a4 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 1a5855740ac..2d7c3e0f250 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 e7505a8c39c..4d57b8990f8 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); } |