RISC-V: Add and document the "-mno-relax" option
authorPalmer Dabbelt <palmer@sifive.com>
Tue, 13 Mar 2018 18:35:06 +0000 (18:35 +0000)
committerPalmer Dabbelt <palmer@gcc.gnu.org>
Tue, 13 Mar 2018 18:35:06 +0000 (18:35 +0000)
RISC-V relies on aggressive linker relaxation to get good code size.  As
a result no text symbol addresses can be known until link time, which
means that alignment must be handled during the link.  This alignment
pass is essentially just another linker relaxation, so this has the
unfortunate side effect that linker relaxation is required for
correctness on many RISC-V targets.

The RISC-V assembler has supported an ".option norelax" for a long time
because there are situations in which linker relaxation is a bad idea --
the canonical example is when trying to materialize the initial value of
the global pointer into a register, which would otherwise be relaxed to
a NOP.  We've been relying on users who want to disable relaxation for
an entire link to pass "-Wl,--no-relax", but that still relies on the
linker relaxing R_RISCV_ALIGN to handle alignment despite it not being
strictly necessary.

This patch adds a GCC option, "-mno-relax", that disable linker
relaxation by adding ".option norelax" to the top of every generated
assembly file.  The assembler is smart enough to handle alignment at
assemble time for files that have never emitted a relaxable relocation,
so this is sufficient to really disable all relaxations in the linker,
which results in significantly faster link times for large objects.

This also has the side effect of allowing toolchains that don't support
linker relaxation (LLVM and the Linux module loader) to function
correctly.  Toolchains that don't support linker relaxation should
default to "-mno-relax" and error when presented with any R_RISCV_ALIGN
relocation as those need to be handled for correctness.

gcc/ChangeLog

2018-03-13  Palmer Dabbelt  <palmer@sifive.com>

        * config/riscv/riscv.opt (mrelax): New option.
        * config/riscv/riscv.c (riscv_file_start): Emit ".option
        "norelax" when riscv_mrelax is disabled.
        * doc/invoke.texi (RISC-V): Document "-mrelax" and "-mno-relax".

From-SVN: r258499

gcc/ChangeLog
gcc/config/riscv/riscv.c
gcc/config/riscv/riscv.opt
gcc/doc/invoke.texi

index 6453b26584b22b5099b9479526eafefbf8366cfa..d4d61a0cdbac2ece229b757d6e05a7c40323faea 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-01  Palmer Dabbelt  <palmer@sifive.com>
+
+       * config/riscv/riscv.opt (mrelax): New option.
+       * config/riscv/riscv.c (riscv_file_start): Emit ".option
+       "norelax" when riscv_mrelax is disabled.
+       * doc/invoke.texi (RISC-V): Document "-mrelax" and "-mno-relax".
+
 2018-03-13  Aaron Sawdey  <acsawdey@linux.vnet.ibm.com>
 
        PR target/84743
index c38f6c394d54057fd6a6058e438bc5d565e49709..3e81874de232eda6863d338499ce47c5ba084a8e 100644 (file)
@@ -3979,6 +3979,11 @@ riscv_file_start (void)
 
   /* Instruct GAS to generate position-[in]dependent code.  */
   fprintf (asm_out_file, "\t.option %spic\n", (flag_pic ? "" : "no"));
+
+  /* If the user specifies "-mno-relax" on the command line then disable linker
+     relaxation in the assembler.  */
+  if (! riscv_mrelax)
+    fprintf (asm_out_file, "\t.option norelax\n");
 }
 
 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
index 581a26bb5c1e108fd950183ec6655ace3ae47f59..b37ac75d9bb4179cd8986ac99516d6c90f38127d 100644 (file)
@@ -106,6 +106,11 @@ mexplicit-relocs
 Target Report Mask(EXPLICIT_RELOCS)
 Use %reloc() operators, rather than assembly macros, to load addresses.
 
+mrelax
+Target Bool Var(riscv_mrelax) Init(1)
+Take advantage of linker relaxations to reduce the number of instructions
+required to materialize symbol addresses.
+
 Mask(64BIT)
 
 Mask(MUL)
index 5d3835097974f31357399c17b334741f25a8a596..4d543008f532eba62df7720376753bacb57f6c46 100644 (file)
@@ -1042,7 +1042,8 @@ See RS/6000 and PowerPC Options.
 -msave-restore  -mno-save-restore @gol
 -mstrict-align -mno-strict-align @gol
 -mcmodel=medlow -mcmodel=medany @gol
--mexplicit-relocs  -mno-explicit-relocs @gol}
+-mexplicit-relocs  -mno-explicit-relocs @gol
+-mrelax -mno-relax @gol}
 
 @emph{RL78 Options}
 @gccoptlist{-msim  -mmul=none  -mmul=g13  -mmul=g14  -mallregs @gol
@@ -23102,6 +23103,12 @@ Use or do not use assembler relocation operators when dealing with symbolic
 addresses.  The alternative is to use assembler macros instead, which may
 limit optimization.
 
+@item -mrelax
+@itemx -mno-relax
+Take advantage of linker relaxations to reduce the number of instructions
+required to materialize symbol addresses. The default is to take advantage of
+linker relaxations.
+
 @end table
 
 @node RL78 Options