aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorChung-Ju Wu <jasonwucj@gmail.com>2015-01-13 05:59:03 +0000
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>2015-01-13 05:59:03 +0000
commit511a41d799f2a3b9946d5176ff0f5404077d2bec (patch)
tree87e98cb1caaaa6089af45c21d8c509ed6d016192 /gcc/config
parentda0675433410f073bb5dc199e6ef4e83e036e2c9 (diff)
downloadgcc-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.c42
-rw-r--r--gcc/config/nds32/nds32.h8
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) \