diff options
author | Chung-Ju Wu <jasonwucj@gmail.com> | 2015-01-13 05:59:03 +0000 |
---|---|---|
committer | Chung-Ju Wu <jasonwucj@gcc.gnu.org> | 2015-01-13 05:59:03 +0000 |
commit | 511a41d799f2a3b9946d5176ff0f5404077d2bec (patch) | |
tree | 87e98cb1caaaa6089af45c21d8c509ed6d016192 /gcc/config | |
parent | da0675433410f073bb5dc199e6ef4e83e036e2c9 (diff) | |
download | gcc-511a41d799f2a3b9946d5176ff0f5404077d2bec.zip gcc-511a41d799f2a3b9946d5176ff0f5404077d2bec.tar.gz gcc-511a41d799f2a3b9946d5176ff0f5404077d2bec.tar.bz2 |
[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
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/nds32/nds32.c | 42 | ||||
-rw-r--r-- | gcc/config/nds32/nds32.h | 8 |
2 files changed, 50 insertions, 0 deletions
diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c index 91e797e..5128bfa 100644 --- a/gcc/config/nds32/nds32.c +++ b/gcc/config/nds32/nds32.c @@ -2107,6 +2107,45 @@ nds32_address_cost (rtx address, } +/* 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. */ /* -- The Overall Framework of an Assembler File. */ @@ -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. */ diff --git a/gcc/config/nds32/nds32.h b/gcc/config/nds32/nds32.h index ac6cf42..e3362b6 100644 --- a/gcc/config/nds32/nds32.h +++ b/gcc/config/nds32/nds32.h @@ -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) \ |