aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <jimw@sifive.com>2018-09-25 22:52:38 +0000
committerJim Wilson <wilson@gcc.gnu.org>2018-09-25 15:52:38 -0700
commitad117173a0d8a5412bc2b9fb99e2c9b1cb4036af (patch)
treedc6bd6677ec3a060c251232a8106b1431063ae65 /gcc
parentc7813484bc9fe2c578d7538d0a9e286bf2e64599 (diff)
downloadgcc-ad117173a0d8a5412bc2b9fb99e2c9b1cb4036af.zip
gcc-ad117173a0d8a5412bc2b9fb99e2c9b1cb4036af.tar.gz
gcc-ad117173a0d8a5412bc2b9fb99e2c9b1cb4036af.tar.bz2
RISC-V: Fix weak symbols with medany and explicit relocs.
gcc/ * config/riscv/riscv.c (riscv_split_symbol): Mark auipc label as weak when target symbol is weak. gcc/testsuite/ * gcc.target/riscv/weak-1.c: New. From-SVN: r264586
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/riscv/riscv.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/riscv/weak-1.c14
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4385715..d43e6d6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-25 Jim Wilson <jimw@sifive.com>
+
+ * config/riscv/riscv.c (riscv_split_symbol): Mark auipc label as weak
+ when target symbol is weak.
+
2018-09-25 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c/87387
diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c
index 9d6d981..381a203 100644
--- a/gcc/config/riscv/riscv.c
+++ b/gcc/config/riscv/riscv.c
@@ -1103,6 +1103,11 @@ riscv_split_symbol (rtx temp, rtx addr, machine_mode mode, rtx *low_out)
label = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
SYMBOL_REF_FLAGS (label) |= SYMBOL_FLAG_LOCAL;
+ /* ??? Ugly hack to make weak symbols work. May need to change the
+ RTL for the auipc and/or low patterns to get a better fix for
+ this. */
+ if (! nonzero_address_p (addr))
+ SYMBOL_REF_WEAK (label) = 1;
if (temp == NULL)
temp = gen_reg_rtx (Pmode);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7b26b89..f690e62 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-09-25 Jim Wilson <jimw@sifive.com>
+
+ * gcc.target/riscv/weak-1.c: New.
+
2018-09-25 Jeff Law <law@redhat.com>
* gcc.dg/warn-stpcpy-no-nul.c: Drop unnecessary xfails.
diff --git a/gcc/testsuite/gcc.target/riscv/weak-1.c b/gcc/testsuite/gcc.target/riscv/weak-1.c
new file mode 100644
index 0000000..0f20501
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/weak-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mcmodel=medany -mexplicit-relocs -O" } */
+
+/* Verify that the branch doesn't get optimized away. */
+extern int weak_func(void) __attribute__ ((weak));
+
+int
+sub (void)
+{
+ if (weak_func)
+ return weak_func ();
+ return 0;
+}
+/* { dg-final { scan-assembler "b\(ne|eq\)" } } */