Backport from trunk r238254, r238763.
2016-07-12 Nathan Sidwell <nathan@acm.org>
* config/arm/arm.c (arm_option_override): Set MASK_SINGLE_PIC_BASE
when -mno-pic-data-is-text-relative is in effect, by default.
* doc/invoke.texi (mpic-data-is-text-relative): Document new
behavior and clarify.
gcc/testsuite/
Backport from trunk r238254, r238763.
2016-07-12 Nathan Sidwell <nathan@acm.org>
* gcc.target/arm/data-rel-1.c: New.
* gcc.target/arm/data-rel-2.c: New.
* gcc.target/arm/data-rel-3.c: New.
Change-Id: Ic060a8302c039cf67a098618a539c14cd3589e23
}
}
+ if (TARGET_VXWORKS_RTP)
+ {
+ if (!global_options_set.x_arm_pic_data_is_text_relative)
+ arm_pic_data_is_text_relative = 0;
+ }
+ else if (flag_pic
+ && !arm_pic_data_is_text_relative
+ && !(global_options_set.x_target_flags & MASK_SINGLE_PIC_BASE))
+ /* When text & data segments don't have a fixed displacement, the
+ intended use is with a single, read only, pic base register.
+ Unless the user explicitly requested not to do that, set
+ it. */
+ target_flags |= MASK_SINGLE_PIC_BASE;
+
/* If stack checking is disabled, we can use r10 as the PIC register,
which keeps r9 available. The EABI specifies r9 as the PIC register. */
if (flag_pic && TARGET_SINGLE_PIC_BASE)
arm_pic_register = pic_register;
}
- if (TARGET_VXWORKS_RTP
- && !global_options_set.x_arm_pic_data_is_text_relative)
- arm_pic_data_is_text_relative = 0;
-
/* Enable -mfix-cortex-m3-ldrd by default for Cortex-M3 cores. */
if (fix_cm3_ldrd == 2)
{
@item -mpic-data-is-text-relative
@opindex mpic-data-is-text-relative
-Assume that each data segments are relative to text segment at load time.
-Therefore, it permits addressing data using PC-relative operations.
-This option is on by default for targets other than VxWorks RTP.
+Assume that the displacement between the text and data segments is fixed
+at static link time. This permits using PC-relative addressing
+operations to access data known to be in the data segment. For
+non-VxWorks RTP targets, this option is enabled by default. When
+disabled on such targets, it will enable @option{-msingle-pic-base} by
+default.
@item -mpoke-function-name
@opindex mpoke-function-name
--- /dev/null
+/* { dg-options "-fPIC -mno-pic-data-is-text-relative" } */
+/* { dg-final { scan-assembler-not "j-\\(.LPIC" } } */
+/* { dg-final { scan-assembler-not "_GLOBAL_OFFSET_TABLE_-\\(.LPIC" } } */
+/* { dg-final { scan-assembler "j\\(GOT\\)" } } */
+/* { dg-final { scan-assembler "(ldr|mov)\tr\[0-9\]+, \\\[?r9" } } */
+
+static int j;
+
+int *Foo ()
+{
+ return &j;
+}
--- /dev/null
+/* { dg-options "-fPIC -mno-pic-data-is-text-relative -mno-single-pic-base" } */
+/* { dg-final { scan-assembler-not "j-\\(.LPIC" } } */
+/* { dg-final { scan-assembler "_GLOBAL_OFFSET_TABLE_-\\(.LPIC" } } */
+/* { dg-final { scan-assembler "j\\(GOT\\)" } } */
+
+static int j;
+
+int *Foo ()
+{
+ return &j;
+}
--- /dev/null
+/* { dg-options "-fPIC -mpic-data-is-text-relative" } */
+/* { dg-final { scan-assembler "j-\\(.LPIC" } } */
+/* { dg-final { scan-assembler-not "_GLOBAL_OFFSET_TABLE_-\\(.LPIC" } } */
+/* { dg-final { scan-assembler-not "j\\(GOT\\)" } } */
+
+static int j;
+
+int *Foo ()
+{
+ return &j;
+}