Skip to content

Commit

Permalink
addpatch: gcc12
Browse files Browse the repository at this point in the history
Reused previous gcc patch with modifications.
  • Loading branch information
hack3ric committed Jun 30, 2023
1 parent 0625b57 commit de823d9
Show file tree
Hide file tree
Showing 3 changed files with 347 additions and 0 deletions.
205 changes: 205 additions & 0 deletions gcc12/libitm-riscv64.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
diff --git a/libitm/config/riscv/asm.h b/libitm/config/riscv/asm.h
new file mode 100644
index 0000000..0f58bc1
--- /dev/null
+++ b/libitm/config/riscv/asm.h
@@ -0,0 +1,28 @@
+#ifndef _RV_ASM_H
+#define _RV_ASM_H
+
+#if __riscv_xlen == 64
+# define GPR_L ld
+# define GPR_S sd
+# define SZ_GPR 8
+#elif __riscv_xlen == 32
+# define GPR_L lw
+# define GPR_S sw
+# define SZ_GPR 4
+#else
+# error Unsupported XLEN (must be 64-bit or 32-bit).
+#endif
+
+#if defined(__riscv_flen) && __riscv_flen == 64
+# define FPR_L fld
+# define FPR_S fsd
+# define SZ_FPR 8
+#elif defined(__riscv_flen) && __riscv_flen == 32
+# define FPR_L flw
+# define FPR_S fsw
+# define SZ_FPR 4
+#else
+# define SZ_FPR 0
+#endif
+
+#endif /* _RV_ASM_H */
diff --git a/libitm/config/riscv/sjlj.S b/libitm/config/riscv/sjlj.S
new file mode 100644
index 0000000..b4e15fc
--- /dev/null
+++ b/libitm/config/riscv/sjlj.S
@@ -0,0 +1,120 @@
+#include "asmcfi.h"
+#include "asm.h"
+
+ .text
+ .align 2
+ .global _ITM_beginTransaction
+ .type _ITM_beginTransaction, @function
+
+_ITM_beginTransaction:
+ cfi_startproc
+ mv a1, sp
+ addi sp, sp, -(14*SZ_GPR+12*SZ_FPR)
+ cfi_adjust_cfa_offset(14*SZ_GPR+12*SZ_FPR)
+
+ /* Return Address */
+ GPR_S ra, 0*SZ_GPR(sp)
+ cfi_rel_offset(ra, 0*SZ_GPR)
+
+ /* Caller's sp */
+ GPR_S a1, 1*SZ_GPR(sp)
+
+ /* Caller's s0/fp */
+ GPR_S fp, 2*SZ_GPR(sp)
+ cfi_rel_offset(fp, 2*SZ_GPR)
+
+ /* Callee-saved registers */
+ GPR_S s1, 3*SZ_GPR(sp)
+ GPR_S s2, 4*SZ_GPR(sp)
+ GPR_S s3, 5*SZ_GPR(sp)
+ GPR_S s4, 6*SZ_GPR(sp)
+ GPR_S s5, 7*SZ_GPR(sp)
+ GPR_S s6, 8*SZ_GPR(sp)
+ GPR_S s7, 9*SZ_GPR(sp)
+ GPR_S s8, 10*SZ_GPR(sp)
+ GPR_S s9, 11*SZ_GPR(sp)
+ GPR_S s10, 12*SZ_GPR(sp)
+ GPR_S s11, 13*SZ_GPR(sp)
+
+#if defined(__riscv_flen)
+ /* Callee-saved floating-point registers */
+ FPR_S fs0, 0*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs1, 1*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs2, 2*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs3, 3*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs4, 4*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs5, 5*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs6, 6*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs7, 7*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs8, 8*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs9, 9*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs10, 10*SZ_FPR+14*SZ_GPR(sp)
+ FPR_S fs11, 11*SZ_FPR+14*SZ_GPR(sp)
+#endif
+ mv fp, sp
+
+ /* Invoke GTM_begin_transaction with the struct we've just built. */
+ mv a1, sp
+ jal ra, GTM_begin_transaction
+
+ /* Return; we don't need to restore any of the call-saved regs. */
+ GPR_L ra, 0*SZ_GPR(sp)
+ cfi_restore(ra)
+ GPR_L fp, 2*SZ_GPR(sp)
+ cfi_restore(fp)
+
+ addi sp, sp, 14*SZ_GPR+12*SZ_FPR
+ cfi_adjust_cfa_offset(-(14*SZ_GPR+12*SZ_FPR))
+
+ ret
+ cfi_endproc
+ .size _ITM_beginTransaction, . - _ITM_beginTransaction
+
+ .align 2
+ .global GTM_longjmp
+ .hidden GTM_longjmp
+ .type GTM_longjmp, @function
+
+GTM_longjmp:
+ /* The first parameter becomes the return value (x0).
+ The third parameter is ignored for now. */
+ cfi_startproc
+ GPR_L s1, 3*SZ_GPR(a1)
+ GPR_L s2, 4*SZ_GPR(a1)
+ GPR_L s3, 5*SZ_GPR(a1)
+ GPR_L s4, 6*SZ_GPR(a1)
+ GPR_L s5, 7*SZ_GPR(a1)
+ GPR_L s6, 8*SZ_GPR(a1)
+ GPR_L s7, 9*SZ_GPR(a1)
+ GPR_L s8, 10*SZ_GPR(a1)
+ GPR_L s9, 11*SZ_GPR(a1)
+ GPR_L s10, 12*SZ_GPR(a1)
+ GPR_L s11, 13*SZ_GPR(a1)
+
+#if defined(__riscv_flen)
+ FPR_L fs0, 0*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs1, 1*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs2, 2*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs3, 3*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs4, 4*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs5, 5*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs6, 6*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs7, 7*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs8, 8*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs9, 9*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs10, 10*SZ_FPR+14*SZ_GPR(a1)
+ FPR_L fs11, 11*SZ_FPR+14*SZ_GPR(a1)
+#endif
+
+ GPR_L ra, 0*SZ_GPR(a1)
+ GPR_L fp, 2*SZ_GPR(a1)
+ GPR_L a3, 1*SZ_GPR(a1)
+ cfi_def_cfa(a1, 0)
+ mv sp, a3
+ jr ra
+ cfi_endproc
+ .size GTM_longjmp, . - GTM_longjmp
+
+#ifdef __linux__
+.section .note.GNU-stack, "", @progbits
+#endif
diff --git a/libitm/config/riscv/target.h b/libitm/config/riscv/target.h
new file mode 100644
index 0000000..b20de73
--- /dev/null
+++ b/libitm/config/riscv/target.h
@@ -0,0 +1,26 @@
+namespace GTM HIDDEN {
+
+typedef struct gtm_jmpbuf
+ {
+ long int pc;
+ void *cfa;
+ long int s[12]; /* Saved registers, s0 is fp */
+
+ /* FP saved registers */
+#if defined(__riscv_flen) && __riscv_flen == 64
+ double fs[12];
+#elif defined(__riscv_flen) && __riscv_flen == 32
+ float fs[12];
+#endif
+ } gtm_jmpbuf;
+
+/* ??? The size of one line in hardware caches (in bytes). */
+#define HW_CACHELINE_SIZE 64
+
+static inline void
+cpu_relax (void)
+{
+ __asm__ volatile ("" : : : "memory");
+}
+
+} // namespace GTM
diff --git a/libitm/configure.tgt b/libitm/configure.tgt
index 4c0e78c..635c1d4 100644
--- a/libitm/configure.tgt
+++ b/libitm/configure.tgt
@@ -82,6 +82,8 @@ EOF

loongarch*) ARCH=loongarch ;;

+ riscv*) ARCH=riscv ;;
+
sh*) ARCH=sh ;;

sparc)
120 changes: 120 additions & 0 deletions gcc12/riscv64.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
--- PKGBUILD
+++ PKGBUILD
@@ -20,7 +20,6 @@ url='https://gcc.gnu.org'
makedepends=(
binutils
doxygen
- gcc-ada
gcc-d
git
libisl
@@ -39,6 +38,8 @@ options=(!emptydirs !lto)
_libdir=usr/lib/gcc/$CHOST/${pkgver%%+*}
source=(git+https://sourceware.org/git/gcc.git#commit=${_commit}
c89 c99
+ libitm-riscv64.patch
+ unfilter-default-library-path.patch
)
validpgpkeys=(F3691687D867B81B51CE07D9BBE43771487328A9 # [email protected]
86CFFCA918CF3AF47147588051E8B148A9999C34 # [email protected]
@@ -46,7 +47,9 @@ validpgpkeys=(F3691687D867B81B51CE07D9BBE43771487328A9 # bpiotrowski@archlinux.
D3A93CAD751C2AF4F8C7AD516C35B99309B5FA62) # Jakub Jelinek <[email protected]>
sha256sums=('SKIP'
'de48736f6e4153f03d0a5d38ceb6c6fdb7f054e8f47ddd6af0a3dbf14f27b931'
- '2513c6d9984dd0a2058557bf00f06d8d5181734e41dcfe07be7ed86f2959622a')
+ '2513c6d9984dd0a2058557bf00f06d8d5181734e41dcfe07be7ed86f2959622a'
+ '8a71bbb41463fb0e8518d5cff671097704fb8b01867ea224b8ebfe6ba3e4f6d6'
+ '7183fdeea8fd148cf9dd03b0932f9d439b818a5ab3bc9a5e20d8e0b41c9e0efd')

prepare() {
[[ ! -d gcc ]] && ln -s gcc-${pkgver/+/-} gcc
@@ -58,6 +61,12 @@ prepare() {
# Arch Linux installs x86_64 libraries /lib
sed -i '/m64=/s/lib64/lib/' gcc/config/i386/t-linux64

+ # libitm riscv
+ patch -Np1 < ../libitm-riscv64.patch
+
+ # Remove codes filtering default library paths to make mold work correctly
+ patch -Np1 < ../unfilter-default-library-path.patch
+
mkdir -p "$srcdir/gcc-build"
}

@@ -117,6 +126,10 @@ build() {

# make documentation
make -O -C $CHOST/libstdc++-v3/doc doc-man-doxygen
+
+ # Patch spec strings embedded in binaries
+ sed -i 's/%{pthread:--push-state --as-needed -latomic --pop-state}/ --push-state --as-needed -latomic --pop-state /' gcc/xgcc
+ sed -i 's/%{pthread:--push-state --as-needed -latomic --pop-state}/ --push-state --as-needed -latomic --pop-state /' gcc/xg++
}

check() {
@@ -130,12 +143,10 @@ check() {
package_gcc12-libs() {
pkgdesc='Runtime libraries shipped by GCC (12.x.x)'
depends=('glibc>=2.27')
- options=(!emptydirs !strip)
+ options=(!emptydirs !strip staticlibs)

cd gcc-build
make -C $CHOST/libgcc DESTDIR="$pkgdir" install-shared
- mv "${pkgdir}/${_libdir}"/../lib/* "${pkgdir}/${_libdir}"
- rmdir "${pkgdir}/${_libdir}"/../lib
rm -f "$pkgdir/$_libdir/libgcc_eh.a"

for lib in libatomic \
@@ -143,9 +154,8 @@ package_gcc12-libs() {
libgomp \
libitm \
libquadmath \
- libsanitizer/{a,l,ub,t}san \
- libstdc++-v3/src \
- libvtv; do
+ libsanitizer/{a,l,ub}san \
+ libstdc++-v3/src; do
make -C $CHOST/$lib DESTDIR="$pkgdir" install-toolexeclibLTLIBRARIES
done

@@ -158,6 +168,9 @@ package_gcc12-libs() {
install -Dm644 "$srcdir/gcc/COPYING.RUNTIME" \
"$pkgdir/usr/share/licenses/gcc12-libs/RUNTIME.LIBRARY.EXCEPTION"

+ # Remove static library (.a) files except libatomic.a
+ find "$pkgdir" -name '*.a' ! -name libatomic.a -delete
+
# remove conflicting files
rm -rf "${pkgdir}"/usr/share/locale
}
@@ -175,7 +188,8 @@ package_gcc12() {
install -m755 -t "$pkgdir/${_libdir}/" gcc/{cc1,cc1plus,collect2,lto1,gcov{,-tool}}

make -C $CHOST/libgcc DESTDIR="$pkgdir" install
- rm -f "$pkgdir"/usr/lib/libgcc_s.so*
+ rm -rf "$pkgdir/${_libdir}"/../lib
+ rm -f "$pkgdir/${_libdir}"/libgcc_s.so*

make -C $CHOST/libstdc++-v3/src DESTDIR="$pkgdir" install
make -C $CHOST/libstdc++-v3/include DESTDIR="$pkgdir" install
@@ -196,7 +210,6 @@ package_gcc12() {
make -C $CHOST/libquadmath DESTDIR="$pkgdir" install-nodist_libsubincludeHEADERS
make -C $CHOST/libsanitizer DESTDIR="$pkgdir" install-nodist_{saninclude,toolexeclib}HEADERS
make -C $CHOST/libsanitizer/asan DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS
- make -C $CHOST/libsanitizer/tsan DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS
make -C $CHOST/libsanitizer/lsan DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS

make -C libcpp DESTDIR="$pkgdir" install
@@ -206,9 +219,9 @@ package_gcc12() {
ln -s gcc "$pkgdir"/usr/bin/cc-12

# create cc-rs compatible symlinks
- # https://github.com/rust-lang/cc-rs/blob/1.0.73/src/lib.rs#L2578-L2581
+ # https://github.com/rust-lang/cc-rs/blob/1.0.73/src/lib.rs#L2624
for binary in {c++,g++,gcc,gcc-ar,gcc-nm,gcc-ranlib}; do
- ln -s /usr/bin/${binary} "${pkgdir}"/usr/bin/x86_64-linux-gnu-${binary}-12
+ ln -s /usr/bin/${binary} "${pkgdir}"/usr/bin/riscv64-linux-gnu-${binary}-12
done

# POSIX conformance launcher scripts for c89 and c99
22 changes: 22 additions & 0 deletions gcc12/unfilter-default-library-path.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 16bb07f2cdc..1beb23ba279 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -7904,17 +7904,6 @@ is_directory (const char *path1, bool linker)
*cp++ = '.';
*cp = '\0';

- /* Exclude directories that the linker is known to search. */
- if (linker
- && IS_DIR_SEPARATOR (path[0])
- && ((cp - path == 6
- && filename_ncmp (path + 1, "lib", 3) == 0)
- || (cp - path == 10
- && filename_ncmp (path + 1, "usr", 3) == 0
- && IS_DIR_SEPARATOR (path[4])
- && filename_ncmp (path + 5, "lib", 3) == 0)))
- return 0;
-
return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
}

0 comments on commit de823d9

Please sign in to comment.