[NDS32] Implement TARGET_ENCODE_SECTION_INFO to store specific flag in symbol_ref...
authorChung-Ju Wu <jasonwucj@gmail.com>
Tue, 13 Jan 2015 05:59:03 +0000 (05:59 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Tue, 13 Jan 2015 05:59:03 +0000 (05:59 +0000)
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

gcc/ChangeLog
gcc/config/nds32/nds32.c
gcc/config/nds32/nds32.h

index 047af3dbe4436b752862812c70cdaa89652f058d..6166c08c43d2f7079d8fe53b6649824a806bbb6e 100644 (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
index 91e797efbbf97bf5cd5663f18715f0fcb6afe212..5128bfadb1a3203951a868cae4c9040431aa1867 100644 (file)
@@ -2106,6 +2106,45 @@ nds32_address_cost (rtx address,
   return nds32_address_cost_impl (address, mode, as, speed);
 }
 
+\f
+/* 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;
+       }
+    }
+}
+
 \f
 /* Defining the Output Assembler Language.  */
 
@@ -3669,6 +3708,9 @@ nds32_target_alignment (rtx label)
 \f
 /* Dividing the Output into Sections (Texts, Data, . . . ).  */
 
+#undef TARGET_ENCODE_SECTION_INFO
+#define TARGET_ENCODE_SECTION_INFO nds32_encode_section_info
+
 \f
 /* Position Independent Code.  */
 
index ac6cf429a761d8deb3e7d888ffcf0305707e82e9..e3362b67251e4876475c34a98bccc9ede0cbf478 100644 (file)
 /* 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) \