Commit 5f680ab6 by DJ Delorie Committed by Jim Wilson

Fix -membedded-data bug found by mips16 port.

	* mips/mips.h (ENCODE_SECTION_INFO): Handle TARGET_EMBEDDED_DATA.
	Add comment.
	* mips/mips.c (mips_select_section): Add comment.

From-SVN: r24158
parent 069f7cf2
Mon Dec 7 15:27:09 1998 DJ Delorie <dj@cygnus.com>
* mips/mips.h (ENCODE_SECTION_INFO): Handle TARGET_EMBEDDED_DATA.
Add comment.
* mips/mips.c (mips_select_section): Add comment.
Mon Dec 7 17:55:06 1998 Mike Stump <mrs@wrs.com> Mon Dec 7 17:55:06 1998 Mike Stump <mrs@wrs.com>
* cccp.c (ignore_escape_flag): Add support for \ as `natural' * cccp.c (ignore_escape_flag): Add support for \ as `natural'
......
...@@ -6861,7 +6861,16 @@ mips_select_rtx_section (mode, x) ...@@ -6861,7 +6861,16 @@ mips_select_rtx_section (mode, x)
} }
/* Choose the section to use for DECL. RELOC is true if its value contains /* Choose the section to use for DECL. RELOC is true if its value contains
any relocatable expression. */ any relocatable expression.
Some of the logic used here needs to be replicated in
ENCODE_SECTION_INFO in mips.h so that references to these symbols
are done correctly. Specifically, at least all symbols assigned
here to rom (.text and/or .rodata) must not be referenced via
ENCODE_SECTION_INFO with %gprel, as the rom might be too far away.
If you need to make a change here, you probably should check
ENCODE_SECTION_INFO to see if it needs a similar change. */
void void
mips_select_section (decl, reloc) mips_select_section (decl, reloc)
......
...@@ -3080,7 +3080,19 @@ typedef struct mips_args { ...@@ -3080,7 +3080,19 @@ typedef struct mips_args {
gp addresable section, SYMBOL_REF_FLAG is set prevent gcc from gp addresable section, SYMBOL_REF_FLAG is set prevent gcc from
splitting the reference so that gas can generate a gp relative splitting the reference so that gas can generate a gp relative
reference. reference.
*/
When TARGET_EMBEDDED_DATA is set, we assume that all const
variables will be stored in ROM, which is too far from %gp to use
%gprel addressing. Note that (1) we include "extern const"
variables in this, which mips_select_section doesn't, and (2) we
can't always tell if they're really const (they might be const C++
objects with non-const constructors), so we err on the side of
caution and won't use %gprel anyway (otherwise we'd have to defer
this decision to the linker/loader). The handling of extern consts
is why the DECL_INITIAL macros differ from mips_select_section.
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) \
do \ do \
...@@ -3094,7 +3106,17 @@ do \ ...@@ -3094,7 +3106,17 @@ do \
mips_string_length += TREE_STRING_LENGTH (DECL); \ mips_string_length += TREE_STRING_LENGTH (DECL); \
} \ } \
} \ } \
if (TARGET_EMBEDDED_PIC) \ \
if (TARGET_EMBEDDED_DATA \
&& (TREE_CODE (DECL) == VAR_DECL \
&& TREE_READONLY (DECL) && !TREE_SIDE_EFFECTS (DECL)) \
&& (!DECL_INITIAL (DECL) \
|| TREE_CONSTANT (DECL_INITIAL (DECL)))) \
{ \
SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 0; \
} \
\
else if (TARGET_EMBEDDED_PIC) \
{ \ { \
if (TREE_CODE (DECL) == VAR_DECL) \ if (TREE_CODE (DECL) == VAR_DECL) \
SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment