Skip to content

Commit

Permalink
Update to GCC 15.0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Kartatz committed Feb 15, 2025
1 parent 4016d19 commit b123140
Show file tree
Hide file tree
Showing 21 changed files with 643 additions and 181 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
id: check-cache
uses: actions/cache@main
with:
key: gcc-14.2.0
key: gcc-15.0.1
lookup-only: true
path: |
/tmp/x86_64-linux-gnu.tar.xz
Expand Down Expand Up @@ -45,7 +45,7 @@ jobs:
if: ${{ steps.check-cache.outputs.cache-hit != 'true' }}
uses: actions/cache@main
with:
key: gcc-14.2.0
key: gcc-15.0.1
path: |
/tmp/x86_64-linux-gnu.tar.xz
/tmp/x86_64-linux-gnu.tar.xz.sha256
Expand Down Expand Up @@ -82,7 +82,7 @@ jobs:
- name: Restore from cache
uses: actions/cache@main
with:
key: gcc-14.2.0
key: gcc-15.0.1
fail-on-cache-miss: true
path: |
/tmp/x86_64-linux-gnu.tar.xz
Expand Down
178 changes: 78 additions & 100 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

set -eu

declare -r toolchain_directory="/tmp/loki"
declare -r share_directory="${toolchain_directory}/usr/local/share/loki"

declare -r workdir="${PWD}"

declare -r revision="$(git rev-parse --short HEAD)"
Expand All @@ -16,15 +19,28 @@ declare -r mpc_tarball='/tmp/mpc.tar.gz'
declare -r mpc_directory='/tmp/mpc-1.3.1'

declare -r binutils_tarball='/tmp/binutils.tar.xz'
declare -r binutils_directory='/tmp/binutils-2.43'
declare -r binutils_directory='/tmp/binutils-with-gold-2.44'

declare -r gcc_tarball='/tmp/gcc.tar.gz'
declare -r gcc_directory='/tmp/gcc-14.2.0'
declare -r gcc_directory='/tmp/gcc-master'

declare -r optflags='-Os'
declare -r optflags='-w -Os'
declare -r linkflags='-Wl,-s'

declare -r max_jobs="$(($(nproc) * 17))"
declare -r max_jobs="$(($(nproc) * 10))"

declare -r asan_libraries=(
'libasan'
'libhwasan'
'liblsan'
'libtsan'
'libubsan'
)

declare -r plugin_libraries=(
'libcc1plugin'
'libcp1plugin'
)

declare build_type="${1}"

Expand Down Expand Up @@ -64,21 +80,25 @@ if ! [ -f "${mpc_tarball}" ]; then
fi

if ! [ -f "${binutils_tarball}" ]; then
wget --no-verbose 'https://ftp.gnu.org/gnu/binutils/binutils-2.43.tar.xz' --output-document="${binutils_tarball}"
wget --no-verbose 'https://ftp.gnu.org/gnu/binutils/binutils-with-gold-2.44.tar.xz' --output-document="${binutils_tarball}"
tar --directory="$(dirname "${binutils_directory}")" --extract --file="${binutils_tarball}"

patch --directory="${binutils_directory}" --strip='1' --input="${workdir}/patches/0001-Revert-gold-Use-char16_t-char32_t-instead-of-uint16_.patch"
patch --directory="${binutils_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Revert-gold-Use-char16_t-char32_t-instead-of-uint16_.patch"
patch --directory="${binutils_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Disable-annoying-linker-warnings.patch"
fi

if ! [ -f "${gcc_tarball}" ]; then
wget --no-verbose 'https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz' --output-document="${gcc_tarball}"
wget --no-verbose 'https://github.com/gcc-mirror/gcc/archive/refs/heads/master.tar.gz' --output-document="${gcc_tarball}"
tar --directory="$(dirname "${gcc_directory}")" --extract --file="${gcc_tarball}"

patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/patches/0001-Fix-FreeBSD-config-for-riscv.patch"
patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Fix-libgcc-build-on-arm.patch"
patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Change-the-default-language-version-for-C-compilatio.patch"
patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Turn-Wimplicit-int-back-into-an-warning.patch"
patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Turn-Wint-conversion-back-into-an-warning.patch"
patch --directory="${gcc_directory}" --strip='1' --input="${workdir}/submodules/obggcc/patches/0001-Revert-GCC-change-about-turning-Wimplicit-function-d.patch"
fi

[ -d "${gcc_directory}/build" ] || mkdir "${gcc_directory}/build"

declare -r toolchain_directory="/tmp/loki"

[ -d "${gmp_directory}/build" ] || mkdir "${gmp_directory}/build"

cd "${gmp_directory}/build"
Expand Down Expand Up @@ -129,73 +149,31 @@ cd "${mpc_directory}/build"
make all --jobs
make install

sed -i 's/#include <stdint.h>/#include <stdint.h>\n#include <stdio.h>/g' "${toolchain_directory}/include/mpc.h"

[ -d "${binutils_directory}/build" ] || mkdir "${binutils_directory}/build"

declare -r targets=(
'riscv/riscv64'
'amd64'
'arm64'
'i386'
'powerpc/powerpc'
'powerpc/powerpc64'
'powerpc/powerpc64_elfv2'
'sparc64/sparc64'
'sparc64-unknown-freebsd12.3'
'aarch64-unknown-freebsd12.3'
'x86_64-unknown-freebsd12.3'
'i386-unknown-freebsd12.3'
'powerpc-unknown-freebsd12.3'
'powerpc64-unknown-freebsd12.3'
'powerpc64-unknown-freebsd13.0'
'riscv64-unknown-freebsd14.2'
)

for target in "${targets[@]}"; do
for triplet in "${targets[@]}"; do
declare extra_configure_flags=''

declare version='12.3-RELEASE'

if [ "${target}" == 'riscv/riscv64' ]; then
version='14.1-STABLE'
elif [ "${target}" == 'powerpc/powerpc64_elfv2' ]; then
# Required due to https://reviews.freebsd.org/D20383
# Required due to https://reviews.freebsd.org/D20383
if [ "${triplet}" == 'powerpc64-unknown-freebsd13.0' ]; then
extra_configure_flags+='--with-abi=elfv2'
version='13.0-RELEASE'
fi

if [ "${target}" == 'riscv/riscv64' ]; then
declare url="http://ftp.freebsd.org/pub/FreeBSD/snapshots/$(cut -d '_' -f '1' <<< "${target}")/${version}/base.txz"
else
declare url="http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/$(cut -d '_' -f '1' <<< "${target}")/${version}/base.txz"
if [ "${triplet}" == 'sparc64-unknown-freebsd12.3' ]; then
extra_configure_flags+=' --disable-libsanitizer'
fi

declare output="/tmp/freebsd-${target//\//_}-base.tar.xz"

case "${target}" in
amd64)
declare triplet='x86_64-unknown-freebsd12.3';;
arm64)
declare triplet='aarch64-unknown-freebsd12.3';;
i386)
declare triplet='i386-unknown-freebsd12.3';;
powerpc/powerpc)
declare triplet='powerpc-unknown-freebsd12.3';;
powerpc/powerpc64)
declare triplet='powerpc64-unknown-freebsd12.3';;
powerpc/powerpc64_elfv2)
declare triplet='powerpc64-unknown-freebsd13.0';;
riscv/riscv64)
declare triplet='riscv64-unknown-freebsd14.0';;
sparc64/sparc64)
declare triplet='sparc64-unknown-freebsd12.3';;
esac

echo "${url}"

curl \
--url "${url}" \
--retry '30' \
--retry-all-errors \
--retry-delay '0' \
--retry-max-time '0' \
--location \
--silent \
--output "${output}"

cd "${binutils_directory}/build"
rm --force --recursive ./*

Expand All @@ -216,36 +194,32 @@ for target in "${targets[@]}"; do
make all --jobs="${max_jobs}"
make install

tar --directory="${toolchain_directory}/${triplet}" --strip=2 --extract --file="${output}" './usr/lib' './usr/include'
tar --directory="${toolchain_directory}/${triplet}" --extract --file="${output}" './lib'
cd "$(mktemp --directory)"

pushd "${toolchain_directory}/${triplet}/lib"
declare sysroot_url="https://github.com/AmanoTeam/freebsd-sysroot/releases/latest/download/${triplet}.tar.xz"
declare sysroot_file="${PWD}/${triplet}.tar.xz"
declare sysroot_directory="${PWD}/${triplet}"

if [ -f './libc++.so' ]; then
chmod 777 './libc++.so'
echo 'GROUP ( ./libc++.so.1 ./libcxxrt.so )' > './libc++.so'
chmod 444 './libc++.so'
fi
wget \
--no-verbose \
--output-document="${sysroot_file}" \
"${sysroot_url}"

chmod 777 './libc.so'
tar \
--extract \
--file="${sysroot_file}"

if [ "${target}" == 'riscv/riscv64' ] || [ "${target}" == 'powerpc/powerpc64_elfv2' ]; then
echo 'GROUP ( ./libc.so.7 ./libc_nonshared.a )' > './libc.so'
else
echo 'GROUP ( ./libc.so.7 ./libc_nonshared.a ./libssp_nonshared.a )' > './libc.so'
fi

chmod 444 './libc.so'
cp --recursive "${sysroot_directory}" "${toolchain_directory}"

find . -type l | xargs ls -l | grep '/lib/' | awk '{print "unlink "$9" && ln -s $(basename "$11") $(basename "$9")"}' | bash

pushd
rm --force --recursive ./*

# Required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78251
if [ "${target}" == 'riscv/riscv64' ]; then
if [ "${triplet}" == 'riscv64-unknown-freebsd14.2' ]; then
mv "${toolchain_directory}/${triplet}/include/unwind.h" "${toolchain_directory}/${triplet}/include/unwind.h.bak"
fi

[ -d "${gcc_directory}/build" ] || mkdir "${gcc_directory}/build"

cd "${gcc_directory}/build"

rm --force --recursive ./*
Expand All @@ -259,7 +233,7 @@ for target in "${targets[@]}"; do
--with-mpfr="${toolchain_directory}" \
--with-bugurl='https://github.com/AmanoTeam/Loki/issues' \
--with-gcc-major-version-only \
--with-pkgversion="Loki v0.6-${revision}" \
--with-pkgversion="Loki v0.7-${revision}" \
--with-sysroot="${toolchain_directory}/${triplet}" \
--with-native-system-header-dir='/include' \
--includedir="${toolchain_directory}/${triplet}/include" \
Expand All @@ -274,11 +248,13 @@ for target in "${targets[@]}"; do
--enable-linker-build-id \
--enable-lto \
--enable-plugin \
--enable-libsanitizer \
--enable-shared \
--enable-threads='posix' \
--enable-libssp \
--enable-ld \
--enable-gold \
--disable-fixincludes \
--disable-libstdcxx-pch \
--disable-werror \
--disable-libgomp \
Expand All @@ -289,30 +265,32 @@ for target in "${targets[@]}"; do
${extra_configure_flags} \
${cross_compile_flags} \
CFLAGS="${optflags}" \
CXXFLAGS="${optflags}" \
LDFLAGS="-Wl,-rpath-link,${OBGGCC_TOOLCHAIN}/${CROSS_COMPILE_TRIPLET}/lib ${linkflags}"
CXXFLAGS="${optflags}"

LD_LIBRARY_PATH="${toolchain_directory}/lib" PATH="${PATH}:${toolchain_directory}/bin" make \
CFLAGS_FOR_TARGET="${optflags} ${linkflags}" \
CXXFLAGS_FOR_TARGET="${optflags} ${linkflags}" \
all --jobs="${max_jobs}"
make install

if [ "${target}" == 'riscv/riscv64' ]; then
if [ "${triplet}" == 'riscv64-unknown-freebsd14.2' ]; then
mv "${toolchain_directory}/${triplet}/include/unwind.h.bak" "${toolchain_directory}/${triplet}/include/unwind.h"
fi

cd "${toolchain_directory}/${triplet}/bin"

for name in *; do
rm "${name}"
ln -s "../../bin/${triplet}-${name}" "${name}"
done

rm --recursive "${toolchain_directory}/share"
rm --recursive "${toolchain_directory}/lib/gcc/${triplet}/"*"/include-fixed"

patchelf --add-rpath '$ORIGIN/../../../../lib' "${toolchain_directory}/libexec/gcc/${triplet}/"*"/cc1"
patchelf --add-rpath '$ORIGIN/../../../../lib' "${toolchain_directory}/libexec/gcc/${triplet}/"*"/cc1plus"
patchelf --add-rpath '$ORIGIN/../../../../lib' "${toolchain_directory}/libexec/gcc/${triplet}/"*"/lto1"

for library in "${asan_libraries[@]}"; do
patchelf --set-rpath '$ORIGIN' "${toolchain_directory}/lib"*"/${library}.so" || true
patchelf --set-rpath '$ORIGIN' "${toolchain_directory}/${triplet}/lib"*"/${library}.so" || true
done

for library in "${plugin_libraries[@]}"; do
patchelf --set-rpath "\$ORIGIN/../../../../../${triplet}/lib64:\$ORIGIN/../../../../../${triplet}/lib:\$ORIGIN/../../../../../lib64:\$ORIGIN/../../../../../lib" "${toolchain_directory}/lib/gcc/${triplet}/"*"/plugin/${library}.so"
done
done

mkdir --parent "${share_directory}"

cp --recursive "${workdir}/tools/dev/"* "${share_directory}"
25 changes: 25 additions & 0 deletions patches/0001-Fix-FreeBSD-config-for-riscv.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
From 6de0157ef3b7e64d8d6b56b17ed12e4980d04fdb Mon Sep 17 00:00:00 2001
From: Kartatz <105828205+Kartatz@users.noreply.github.com>
Date: Sat, 15 Feb 2025 02:06:41 +0100
Subject: [PATCH] Fix FreeBSD config for riscv

---
gcc/config/riscv/freebsd.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/config/riscv/freebsd.h b/gcc/config/riscv/freebsd.h
index 2dc7055..217e0ac 100644
--- a/gcc/config/riscv/freebsd.h
+++ b/gcc/config/riscv/freebsd.h
@@ -42,7 +42,7 @@ along with GCC; see the file COPYING3. If not see
#define LINK_SPEC " \
-melf" XLEN_SPEC DEFAULT_ENDIAN_SPEC "riscv \
%{p:%nconsider using `-pg' instead of `-p' with gprof (1)} \
- " FBSD_LINK_PG_NOTES " \
+ " FBSD_LINK_PG_NOTE " \
%{v:-V} \
%{assert*} %{R*} %{rpath*} %{defsym*} \
-X \
--
2.36.6

Loading

0 comments on commit b123140

Please sign in to comment.