- Disable multilib and go on riscv64 - libgcc-riscv-div.patch: Backport of r12-5799-g45116f342057b7 to fix build with current binutils OBS-URL: https://build.opensuse.org/request/show/1088798 OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gcc7?expand=0&rev=238
122 lines
3.7 KiB
Diff
122 lines
3.7 KiB
Diff
From 485b0a0039a29cf046fe97c7d72aefe49275b141 Mon Sep 17 00:00:00 2001
|
|
From: Nelson Chu <nelson.chu@sifive.com>
|
|
Date: Mon, 29 Nov 2021 04:48:20 -0800
|
|
Subject: [PATCH] RISC-V: jal cannot refer to a default visibility symbol for
|
|
shared object.
|
|
|
|
This is the original binutils bugzilla report,
|
|
https://sourceware.org/bugzilla/show_bug.cgi?id=28509
|
|
|
|
And this is the first version of the proposed binutils patch,
|
|
https://sourceware.org/pipermail/binutils/2021-November/118398.html
|
|
|
|
After applying the binutils patch, I get the the unexpected error when
|
|
building libgcc,
|
|
|
|
/scratch/nelsonc/riscv-gnu-toolchain/riscv-gcc/libgcc/config/riscv/div.S:42:
|
|
/scratch/nelsonc/build-upstream/rv64gc-linux/build-install/riscv64-unknown-linux-gnu/bin/ld: relocation R_RISCV_JAL against `__udivdi3' which may bind externally can not be used when making a shared object; recompile with -fPIC
|
|
|
|
Therefore, this patch add an extra hidden alias symbol for __udivdi3, and
|
|
then use HIDDEN_JUMPTARGET to target a non-preemptible symbol instead.
|
|
The solution is similar to glibc as follows,
|
|
https://sourceware.org/git/?p=glibc.git;a=commit;h=68389203832ab39dd0dbaabbc4059e7fff51c29b
|
|
|
|
libgcc/ChangeLog:
|
|
|
|
* config/riscv/div.S: Add the hidden alias symbol for __udivdi3, and
|
|
then use HIDDEN_JUMPTARGET to target it since it is non-preemptible.
|
|
* config/riscv/riscv-asm.h: Added new macros HIDDEN_JUMPTARGET and
|
|
HIDDEN_DEF.
|
|
---
|
|
libgcc/config/riscv/div.S | 23 ++++++++++++++++-------
|
|
1 file changed, 16 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/libgcc/config/riscv/div.S b/libgcc/config/riscv/div.S
|
|
index 63d542e846c..2d43a48a302 100644
|
|
--- a/libgcc/config/riscv/div.S
|
|
+++ b/libgcc/config/riscv/div.S
|
|
@@ -23,6 +23,14 @@ a copy of the GCC Runtime Library Exception along with this program;
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
+#define FUNC_ALIAS(X,Y) \
|
|
+ .globl X; \
|
|
+ X = Y
|
|
+#define CONCAT1(a, b) CONCAT2(a, b)
|
|
+#define CONCAT2(a, b) a ## b
|
|
+#define HIDDEN_JUMPTARGET(X) CONCAT1(__hidden_, X)
|
|
+#define HIDDEN_DEF(X) FUNC_ALIAS(HIDDEN_JUMPTARGET(X), X); \
|
|
+ .hidden HIDDEN_JUMPTARGET(X)
|
|
.text
|
|
.align 2
|
|
|
|
@@ -39,7 +47,7 @@ __udivsi3:
|
|
sll a0, a0, 32
|
|
sll a1, a1, 32
|
|
move t0, ra
|
|
- jal __udivdi3
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3)
|
|
sext.w a0, a0
|
|
jr t0
|
|
|
|
@@ -51,7 +59,7 @@ __umodsi3:
|
|
srl a0, a0, 32
|
|
srl a1, a1, 32
|
|
move t0, ra
|
|
- jal __udivdi3
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3)
|
|
sext.w a0, a1
|
|
jr t0
|
|
|
|
@@ -96,12 +104,13 @@ __udivdi3:
|
|
bnez a3, .L3
|
|
.L5:
|
|
ret
|
|
+HIDDEN_DEF (__udivdi3)
|
|
|
|
.globl __umoddi3
|
|
__umoddi3:
|
|
/* Call __udivdi3(a0, a1), then return the remainder, which is in a1. */
|
|
move t0, ra
|
|
- jal __udivdi3
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3)
|
|
move a0, a1
|
|
jr t0
|
|
|
|
@@ -110,12 +119,12 @@ __umoddi3:
|
|
neg a0, a0
|
|
bgez a1, .L12 /* Compute __udivdi3(-a0, a1), then negate the result. */
|
|
neg a1, a1
|
|
- j __udivdi3 /* Compute __udivdi3(-a0, -a1). */
|
|
+ j HIDDEN_JUMPTARGET(__udivdi3) /* Compute __udivdi3(-a0, -a1). */
|
|
.L11: /* Compute __udivdi3(a0, -a1), then negate the result. */
|
|
neg a1, a1
|
|
.L12:
|
|
move t0, ra
|
|
- jal __udivdi3
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3)
|
|
neg a0, a0
|
|
jr t0
|
|
|
|
@@ -125,7 +134,7 @@ __moddi3:
|
|
bltz a1, .L31
|
|
bltz a0, .L32
|
|
.L30:
|
|
- jal __udivdi3 /* The dividend is not negative. */
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3) /* The dividend is not negative. */
|
|
move a0, a1
|
|
jr t0
|
|
.L31:
|
|
@@ -133,7 +142,7 @@ __moddi3:
|
|
bgez a0, .L30
|
|
.L32:
|
|
neg a0, a0
|
|
- jal __udivdi3 /* The dividend is hella negative. */
|
|
+ jal HIDDEN_JUMPTARGET(__udivdi3) /* The dividend is hella negative. */
|
|
neg a0, a1
|
|
jr t0
|
|
|
|
--
|
|
2.40.1
|
|
|