From 7106056554c9f25e9a857b69b4595c9b3c7c4639 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Fri, 20 Apr 2018 15:30:18 -0700 Subject: [PATCH] RISC-V: Add new option -mrelax/-mno-relax. gas/ * config/tc-riscv.c (options): Add OPTION_RELAX and OPTION_NO_RELAX. (md_longopts): New option -mrelax and -mno-relax. (md_parse_option): Handle -mrelax and -mno-relax. * doc/c-riscv.texi: Document for -mrelax and -mno-relax. * testsuite/gas/riscv/no-relax-reloc.d: New. * testsuite/gas/riscv/no-relax-reloc.s: New. * testsuite/gas/riscv/relax-reloc.d: New. * testsuite/gas/riscv/relax-reloc.s: New. --- gas/ChangeLog | 12 ++++++++++++ gas/config/tc-riscv.c | 14 ++++++++++++++ gas/doc/c-riscv.texi | 9 +++++++++ gas/testsuite/gas/riscv/no-relax-reloc.d | 12 ++++++++++++ gas/testsuite/gas/riscv/no-relax-reloc.s | 8 ++++++++ gas/testsuite/gas/riscv/relax-reloc.d | 17 +++++++++++++++++ gas/testsuite/gas/riscv/relax-reloc.s | 8 ++++++++ 7 files changed, 80 insertions(+) create mode 100644 gas/testsuite/gas/riscv/no-relax-reloc.d create mode 100644 gas/testsuite/gas/riscv/no-relax-reloc.s create mode 100644 gas/testsuite/gas/riscv/relax-reloc.d create mode 100644 gas/testsuite/gas/riscv/relax-reloc.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 25049216ac9..21d09f8e2c6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2018-04-20 Kito Cheng + + * config/tc-riscv.c (options): Add OPTION_RELAX and + OPTION_NO_RELAX. + (md_longopts): New option -mrelax and -mno-relax. + (md_parse_option): Handle -mrelax and -mno-relax. + * doc/c-riscv.texi: Document for -mrelax and -mno-relax. + * testsuite/gas/riscv/no-relax-reloc.d: New. + * testsuite/gas/riscv/no-relax-reloc.s: New. + * testsuite/gas/riscv/relax-reloc.d: New. + * testsuite/gas/riscv/relax-reloc.s: New. + 2018-04-20 Nick Clifton * po/es.po: Updated Spanish translation. diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index f65702383cc..be32e6c979e 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -2136,6 +2136,8 @@ enum options OPTION_PIC, OPTION_NO_PIC, OPTION_MABI, + OPTION_RELAX, + OPTION_NO_RELAX, OPTION_END_OF_ENUM }; @@ -2146,6 +2148,8 @@ struct option md_longopts[] = {"fpic", no_argument, NULL, OPTION_PIC}, {"fno-pic", no_argument, NULL, OPTION_NO_PIC}, {"mabi", required_argument, NULL, OPTION_MABI}, + {"mrelax", no_argument, NULL, OPTION_RELAX}, + {"mno-relax", no_argument, NULL, OPTION_NO_RELAX}, {NULL, no_argument, NULL, 0} }; @@ -2205,6 +2209,14 @@ md_parse_option (int c, const char *arg) return 0; break; + case OPTION_RELAX: + riscv_opts.relax = TRUE; + break; + + case OPTION_NO_RELAX: + riscv_opts.relax = FALSE; + break; + default: return 0; } @@ -2921,6 +2933,8 @@ RISC-V options:\n\ -fno-pic don't generate position-independent code (default)\n\ -march=ISA set the RISC-V architecture\n\ -mabi=ABI set the RISC-V ABI\n\ + -mrelax enable relax (default)\n\ + -mno-relax disable relax\n\ ")); } diff --git a/gas/doc/c-riscv.texi b/gas/doc/c-riscv.texi index 30e61250d3b..79bc4e37b6d 100644 --- a/gas/doc/c-riscv.texi +++ b/gas/doc/c-riscv.texi @@ -48,6 +48,15 @@ by "f", "d", or "q" to indicate single-precision, double-precision, or quad-precision floating-point calling convention, or none to indicate the soft-float calling convention. +@cindex @samp{-mrelax} option, RISC-V +@item -mrelax +Take advantage of linker relaxations to reduce the number of instructions +required to materialize symbol addresses. (default) + +@cindex @samp{-mno-relax} option, RISC-V +@item -mno-relax +Don't do linker relaxations. + @end table @c man end diff --git a/gas/testsuite/gas/riscv/no-relax-reloc.d b/gas/testsuite/gas/riscv/no-relax-reloc.d new file mode 100644 index 00000000000..62f28e09275 --- /dev/null +++ b/gas/testsuite/gas/riscv/no-relax-reloc.d @@ -0,0 +1,12 @@ +#as: -mno-relax +#objdump: -r + +.*:[ ]+file format .* + +RELOCATION RECORDS FOR .* +.* +0+0 R_RISCV_HI20.* +0+4 R_RISCV_LO12_I.* +0+8 R_RISCV_PCREL_HI20.* +0+c R_RISCV_PCREL_LO12_I.* +0+10 R_RISCV_CALL.* diff --git a/gas/testsuite/gas/riscv/no-relax-reloc.s b/gas/testsuite/gas/riscv/no-relax-reloc.s new file mode 100644 index 00000000000..7f1a484fc2e --- /dev/null +++ b/gas/testsuite/gas/riscv/no-relax-reloc.s @@ -0,0 +1,8 @@ +target: + lui a5,%hi(target) + lw a5,%lo(target)(a5) + + .LA0: auipc a5,%pcrel_hi(bar) + lw a0,%pcrel_lo(.LA0)(a5) + + call target diff --git a/gas/testsuite/gas/riscv/relax-reloc.d b/gas/testsuite/gas/riscv/relax-reloc.d new file mode 100644 index 00000000000..f5f592ce036 --- /dev/null +++ b/gas/testsuite/gas/riscv/relax-reloc.d @@ -0,0 +1,17 @@ +#as: +#objdump: -r + +.*:[ ]+file format .* + +RELOCATION RECORDS FOR .* +.* +0+0 R_RISCV_HI20.* +0+0 R_RISCV_RELAX.* +0+4 R_RISCV_LO12_I.* +0+4 R_RISCV_RELAX.* +0+8 R_RISCV_PCREL_HI20.* +0+8 R_RISCV_RELAX.* +0+c R_RISCV_PCREL_LO12_I.* +0+c R_RISCV_RELAX.* +0+10 R_RISCV_CALL.* +0+10 R_RISCV_RELAX.* diff --git a/gas/testsuite/gas/riscv/relax-reloc.s b/gas/testsuite/gas/riscv/relax-reloc.s new file mode 100644 index 00000000000..7f1a484fc2e --- /dev/null +++ b/gas/testsuite/gas/riscv/relax-reloc.s @@ -0,0 +1,8 @@ +target: + lui a5,%hi(target) + lw a5,%lo(target)(a5) + + .LA0: auipc a5,%pcrel_hi(bar) + lw a0,%pcrel_lo(.LA0)(a5) + + call target -- 2.30.2