[NDS32] Implement TARGET_ENCODE_SECTION_INFO to store specific flag in symbol_ref rtx.

gcc/
	* config/nds32/nds32.h (NDS32_SYMBOL_FLAG_RODATA): Define our own
	target-specific symbol_ref flag.
	(NDS32_SYMBOL_REF_RODATA_P): Define it to check if the symbol_ref
	resides in rodata section.
	* config/nds32/nds32.c (TARGET_ENCODE_SECTION_INFO): Define.
	(nds32_encode_section_info): New function.

From-SVN: r219514
This commit is contained in:
Chung-Ju Wu 2015-01-13 05:59:03 +00:00 committed by Chung-Ju Wu
parent da06754334
commit 511a41d799
3 changed files with 59 additions and 0 deletions

View file

@ -1,3 +1,12 @@
2015-01-13 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.h (NDS32_SYMBOL_FLAG_RODATA): Define our own
target-specific symbol_ref flag.
(NDS32_SYMBOL_REF_RODATA_P): Define it to check if the symbol_ref
resides in rodata section.
* config/nds32/nds32.c (TARGET_ENCODE_SECTION_INFO): Define.
(nds32_encode_section_info): New function.
2015-01-13 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.md (call): Use pseudo instruction bal which

View file

@ -2106,6 +2106,45 @@ nds32_address_cost (rtx address,
return nds32_address_cost_impl (address, mode, as, speed);
}
/* Dividing the Output into Sections (Texts, Data, . . . ). */
/* 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), we use this hook to store flags
in symbol_ref rtx. */
static void
nds32_encode_section_info (tree decl, rtx rtl, int new_decl_p)
{
default_encode_section_info (decl, rtl, new_decl_p);
/* For the memory rtx, if it references to rodata section, we can store
NDS32_SYMBOL_FLAG_RODATA flag into symbol_ref rtx so that the
nds32_legitimate_address_p() can determine how to treat such symbol_ref
based on -mcmodel=X and this information. */
if (MEM_P (rtl) && MEM_READONLY_P (rtl))
{
rtx addr = XEXP (rtl, 0);
if (GET_CODE (addr) == SYMBOL_REF)
{
/* For (mem (symbol_ref X)) case. */
SYMBOL_REF_FLAGS (addr) |= NDS32_SYMBOL_FLAG_RODATA;
}
else if (GET_CODE (addr) == CONST
&& GET_CODE (XEXP (addr, 0)) == PLUS)
{
/* For (mem (const (plus (symbol_ref X) (const_int N)))) case. */
rtx plus_op = XEXP (addr, 0);
rtx op0 = XEXP (plus_op, 0);
rtx op1 = XEXP (plus_op, 1);
if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1))
SYMBOL_REF_FLAGS (op0) |= NDS32_SYMBOL_FLAG_RODATA;
}
}
}
/* Defining the Output Assembler Language. */
@ -3669,6 +3708,9 @@ nds32_target_alignment (rtx label)
/* Dividing the Output into Sections (Texts, Data, . . . ). */
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO nds32_encode_section_info
/* Position Independent Code. */

View file

@ -24,6 +24,14 @@
/* The following are auxiliary macros or structure declarations
that are used all over the nds32.c and nds32.h. */
/* Use SYMBOL_FLAG_MACH_DEP to define our own symbol_ref flag.
It is used in nds32_encode_section_info() to store flag in symbol_ref
in case the symbol should be placed in .rodata section.
So that we can check it in nds32_legitimate_address_p(). */
#define NDS32_SYMBOL_FLAG_RODATA \
(SYMBOL_FLAG_MACH_DEP << 0)
#define NDS32_SYMBOL_REF_RODATA_P(x) \
((SYMBOL_REF_FLAGS (x) & NDS32_SYMBOL_FLAG_RODATA) != 0)
/* Computing the Length of an Insn. */
#define ADJUST_INSN_LENGTH(INSN, LENGTH) \