Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
openSUSE:Factory
gcc7
libgcc-riscv-div.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libgcc-riscv-div.patch of Package gcc7
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor