This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] config/arm/arm.c: Use GOT instead of GOTOFF when XIP


Any comments on this patch? This patch, or something like it, is
absolutely necessary to support execute-in-place (XIP) on uClinux.

Please cc me in your reply. Cheers,
Shaun

On 6/29/06, Shaun Jackman <sjackman@gmail.com> wrote:
This patch forces the use of GOT relocations instead of GOTOFF when
compiling execute-in-place (XIP) code. I've defined XIP as the
combination of -fpic and -msingle-pic-base.

There is room for improvement in using GOTOFF relocations for symbols
that will be in the same addressing space as the GOT (.data likely)
and PC relative relocations for symbols that will be in the same
addressing space as the PC (.text and .rodata likely).

I'm open to suggestions for the name of the new predicate, which I've
named local_symbol_p here. I had named it use_gotoff_p at one point.

Cheers,
Shaun

2006-06-29 Shaun Jackman <sjackman@gmail.com>

        * config/arm/arm.c (local_symbol_p): New function.
        (legitimize_pic_address, arm_assemble_integer): Use it to prevent
        GOTOFF relocations to the .text segment in execute-in-place code.

Index: config/arm/arm.c
===================================================================
--- config/arm/arm.c    (revision 115074)
+++ config/arm/arm.c    (working copy)
@@ -3193,6 +3193,17 @@
   return 1;
 }

+static int
+local_symbol_p(rtx x)
+{
+  /* Execute-in-place code fails if a GOTOFF relocation is used to
+   * adress a local symbol in the .text segment. */
+  if (flag_pic && TARGET_SINGLE_PIC_BASE)
+    return 0;
+  return GET_CODE (x) == LABEL_REF
+    || (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (x));
+}
+
  rtx
  legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
 {
@@ -3271,10 +3282,7 @@
       else
        emit_insn (gen_pic_load_addr_thumb (address, orig));

-      if ((GET_CODE (orig) == LABEL_REF
-          || (GET_CODE (orig) == SYMBOL_REF &&
-              SYMBOL_REF_LOCAL_P (orig)))
-         && NEED_GOT_RELOC)
+      if (NEED_GOT_RELOC && local_symbol_p (orig))
        pic_ref = gen_rtx_PLUS (Pmode, cfun->machine->pic_reg, address);
       else
        {
@@ -11292,12 +11300,10 @@
       if (NEED_GOT_RELOC && flag_pic && making_const_table &&
          (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF))
        {
-         if (GET_CODE (x) == SYMBOL_REF
-             && (CONSTANT_POOL_ADDRESS_P (x)
-                 || SYMBOL_REF_LOCAL_P (x)))
+         if ((GET_CODE (x) == SYMBOL_REF
+               && CONSTANT_POOL_ADDRESS_P (x))
+             || local_symbol_p (x))
            fputs ("(GOTOFF)", asm_out_file);
-         else if (GET_CODE (x) == LABEL_REF)
-           fputs ("(GOTOFF)", asm_out_file);
          else
            fputs ("(GOT)", asm_out_file);
        }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]