From 06fc64be13d933a47232243732dc8ca8313374ed Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Fri, 13 Aug 2021 12:11:12 +0200 Subject: [PATCH] Toolchain+Meta: Update LLVM version to 13.0.0 This commit updates the Clang toolchain's version to 13.0.0, which comes with better C++20 support and improved handling of new features by clang-format. Due to the newly enabled `-Bsymbolic-functions` flag, our Clang binaries will only be 2-4% slower than if we dynamically linked them, but we save hundreds of megabytes of disk space. The `BuildClang.sh` script has been reworked to build the entire toolchain in just three steps: one for the compiler, one for GNU binutils, and one for the runtime libraries. This reduces the complexity of the build script, and will allow us to modify the CI configuration to only rebuild the libraries when our libc headers change. Most of the compile flags have been moved out to a separate CMake cache file, similarly to how the Android and Fuchsia toolchains are implemented within the LLVM repo. This provides a nicer interface than the heaps of command-line arguments. We no longer build separate toolchains for each architecture, as the same Clang binary can compile code for multiple targets. The horrible mess that `SERENITY_CLANG_ARCH` was, has been removed in this commit. Clang happily accepts an `i686-pc-serenity` target triple, which matches what our GCC toolchain accepts. --- CMakeLists.txt | 20 +- Kernel/CMakeLists.txt | 9 +- Kernel/Prekernel/CMakeLists.txt | 2 +- Meta/CMake/utils.cmake | 2 +- Meta/build-root-filesystem.sh | 9 +- Meta/serenity.sh | 8 +- Toolchain/BuildClang.sh | 230 ++----- Toolchain/CMake/ClangToolchain.txt.in | 4 +- Toolchain/CMake/LLVMConfig.cmake | 67 ++ Toolchain/CMake/LLVMRuntimesConfig.cmake | 52 ++ Toolchain/Patches/llvm.patch | 791 +++++++++-------------- Userland/DynamicLoader/CMakeLists.txt | 3 +- 12 files changed, 534 insertions(+), 663 deletions(-) create mode 100644 Toolchain/CMake/LLVMConfig.cmake create mode 100644 Toolchain/CMake/LLVMRuntimesConfig.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 515287c75d9..f061bf10ee5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,12 +16,6 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "SerenityOS") "Please re-read the BuildInstructions documentation, and use the superbuild configuration\n") endif() -if(SERENITY_ARCH STREQUAL "i686") - set(SERENITY_CLANG_ARCH "i386") -else() - set(SERENITY_CLANG_ARCH "${SERENITY_ARCH}") -endif() - set(CMAKE_INSTALL_MESSAGE NEVER) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -176,7 +170,6 @@ add_compile_options(-fdiagnostics-color=always) add_compile_options(-fno-delete-null-pointer-checks) add_compile_options(-ffile-prefix-map=${SerenityOS_SOURCE_DIR}=.) add_compile_options(-fno-exceptions) -add_compile_options(-ftls-model=initial-exec) add_compile_options(-fno-semantic-interposition) add_compile_options(-fsized-deallocation) add_compile_options(-fstack-clash-protection) @@ -194,26 +187,21 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang$") add_compile_options(-Wno-c99-designator) add_compile_options(-Wno-implicit-const-int-float-conversion) add_compile_options(-Wno-inconsistent-missing-override) + add_compile_options(-Wno-null-pointer-subtraction) add_compile_options(-Wno-tautological-constant-out-of-range-compare) add_compile_options(-Wno-unneeded-internal-declaration) + add_compile_options(-Wno-unused-but-set-variable) add_compile_options(-Wno-unused-function) add_compile_options(-fno-aligned-allocation) add_compile_options(-fconstexpr-steps=16777216) - add_compile_options(-gdwarf-4) - # FIXME: Why can't clang find this path for compiler_rt builtins? - link_directories(${TOOLCHAIN_ROOT}/lib/clang/${CMAKE_CXX_COMPILER_VERSION}/lib/serenity) + # Clang doesn't add compiler_rt to the search path when compiling with -nostdlib. + link_directories(${TOOLCHAIN_ROOT}/lib/clang/${CMAKE_CXX_COMPILER_VERSION}/lib/${SERENITY_ARCH}-pc-serenity/) add_link_options(LINKER:--allow-shlib-undefined) endif() add_link_options(LINKER:-z,text) -if("${SERENITY_ARCH}" STREQUAL "i686") - add_compile_options(-march=i686) -elseif("${SERENITY_ARCH}" STREQUAL "x86_64") - add_compile_options(-march=x86-64) -endif() - add_compile_definitions(SANITIZE_PTRS) set(CMAKE_CXX_FLAGS_STATIC "${CMAKE_CXX_FLAGS} -static") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pie -fpic") diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index f37e4cb3e9c..4af539332f9 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -400,9 +400,14 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() link_directories(${TOOLCHAIN_ROOT}/${SERENITY_ARCH}-pc-serenity/lib) link_directories(${TOOLCHAIN_ROOT}/lib/gcc/${SERENITY_ARCH}-pc-serenity/${GCC_VERSION}/) + + set(TARGET_STRING "") else() # Assume Clang add_compile_options(-Waddress-of-packed-member) add_compile_options(-faligned-allocation) + + # We need this in order to pick up the #define __serenity__, otherwise we end up including unistd.h into the linker script + set(TARGET_STRING "--target=${CMAKE_CXX_COMPILER_TARGET}") add_link_options(LINKER:--build-id=none) endif() @@ -476,7 +481,7 @@ add_dependencies(Kernel generate_EscapeSequenceStateMachine.h) add_custom_command( OUTPUT linker.ld - COMMAND "${CMAKE_CXX_COMPILER}" -E -P -x c -I${CMAKE_CURRENT_SOURCE_DIR}/.. "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" -o "${CMAKE_CURRENT_BINARY_DIR}/linker.ld" + COMMAND "${CMAKE_CXX_COMPILER}" ${TARGET_STRING} -E -P -x c -I${CMAKE_CURRENT_SOURCE_DIR}/.. "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" -o "${CMAKE_CURRENT_BINARY_DIR}/linker.ld" MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" COMMENT "Preprocessing linker.ld" VERBATIM @@ -497,7 +502,7 @@ if (NOT "${SERENITY_ARCH}" STREQUAL "aarch64") if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_libraries(Kernel PRIVATE kernel_heap gcc) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang$") - target_link_libraries(Kernel PRIVATE kernel_heap "clang_rt.builtins-${SERENITY_CLANG_ARCH}") + target_link_libraries(Kernel PRIVATE kernel_heap clang_rt.builtins) endif() endif() diff --git a/Kernel/Prekernel/CMakeLists.txt b/Kernel/Prekernel/CMakeLists.txt index c156ae44478..689e546c2d1 100644 --- a/Kernel/Prekernel/CMakeLists.txt +++ b/Kernel/Prekernel/CMakeLists.txt @@ -51,7 +51,7 @@ set_target_properties(${PREKERNEL_TARGET} PROPERTIES LINK_DEPENDS ${PREKERNEL_LI if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_libraries(${PREKERNEL_TARGET} PRIVATE gcc) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang$") - target_link_libraries(${PREKERNEL_TARGET} PRIVATE "clang_rt.builtins-${SERENITY_CLANG_ARCH}" c++abi) + target_link_libraries(${PREKERNEL_TARGET} PRIVATE clang_rt.builtins) endif() if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64") diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake index f992c7c11aa..9d32ca02e9b 100644 --- a/Meta/CMake/utils.cmake +++ b/Meta/CMake/utils.cmake @@ -57,7 +57,7 @@ function(serenity_libc target_name fs_name) install(TARGETS ${target_name} DESTINATION usr/lib) set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang$") - target_link_libraries(${target_name} "clang_rt.builtins-${SERENITY_CLANG_ARCH}") + target_link_libraries(${target_name} clang_rt.builtins) endif() target_link_directories(LibC PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) serenity_generated_sources(${target_name}) diff --git a/Meta/build-root-filesystem.sh b/Meta/build-root-filesystem.sh index 3dd09ceaf0e..5ee609b39dc 100755 --- a/Meta/build-root-filesystem.sh +++ b/Meta/build-root-filesystem.sh @@ -46,14 +46,13 @@ else fi SERENITY_ARCH="${SERENITY_ARCH:-i686}" -LLVM_VERSION="${LLVM_VERSION:-12.0.1}" +LLVM_VERSION="${LLVM_VERSION:-13.0.0}" if [ "$SERENITY_TOOLCHAIN" = "Clang" ]; then - TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR"/Toolchain/Local/clang/"$SERENITY_ARCH" + TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR"/Toolchain/Local/clang/ mkdir -p mnt/usr/lib/clang/"$LLVM_VERSION"/lib/serenity - $CP "$TOOLCHAIN_DIR"/lib/clang/"$LLVM_VERSION"/lib/serenity/* mnt/usr/lib/clang/"$LLVM_VERSION"/lib/serenity - $CP "$TOOLCHAIN_DIR"/lib/libunwind* mnt/usr/lib - $CP "$TOOLCHAIN_DIR"/lib/libc++* mnt/usr/lib + $CP "$TOOLCHAIN_DIR"/lib/clang/"$LLVM_VERSION"/lib/"$SERENITY_ARCH"-pc-serenity/* mnt/usr/lib/clang/"$LLVM_VERSION"/lib/serenity + $CP "$TOOLCHAIN_DIR"/lib/"$SERENITY_ARCH"-pc-serenity/* mnt/usr/lib elif [ "$SERENITY_ARCH" != "aarch64" ]; then $CP "$SERENITY_SOURCE_DIR"/Toolchain/Local/"$SERENITY_ARCH"/"$SERENITY_ARCH"-pc-serenity/lib/libgcc_s.so mnt/usr/lib fi diff --git a/Meta/serenity.sh b/Meta/serenity.sh index 3a932c76ed9..24394265b57 100755 --- a/Meta/serenity.sh +++ b/Meta/serenity.sh @@ -180,7 +180,11 @@ cmd_with_target() { BUILD_DIR="$SERENITY_SOURCE_DIR/Build/$TARGET$TARGET_TOOLCHAIN" if [ "$TARGET" != "lagom" ]; then export SERENITY_ARCH="$TARGET" - TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR/Toolchain/Local/$TARGET_TOOLCHAIN/$TARGET" + if [ "$TOOLCHAIN_TYPE" = "Clang" ]; then + TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR/Toolchain/Local/clang" + else + TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR/Toolchain/Local/$TARGET_TOOLCHAIN/$TARGET" + fi SUPER_BUILD_DIR="$SERENITY_SOURCE_DIR/Build/superbuild-$TARGET$TARGET_TOOLCHAIN" else SUPER_BUILD_DIR="$BUILD_DIR" @@ -225,7 +229,7 @@ delete_target() { build_toolchain() { echo "build_toolchain: $TOOLCHAIN_DIR" if [ "$TOOLCHAIN_TYPE" = "Clang" ]; then - ( cd "$SERENITY_SOURCE_DIR/Toolchain" && ARCH="$TARGET" ./BuildClang.sh ) + ( cd "$SERENITY_SOURCE_DIR/Toolchain" && ./BuildClang.sh ) else ( cd "$SERENITY_SOURCE_DIR/Toolchain" && ARCH="$TARGET" ./BuildIt.sh ) fi diff --git a/Toolchain/BuildClang.sh b/Toolchain/BuildClang.sh index d4ce0a6f689..50351f2794c 100755 --- a/Toolchain/BuildClang.sh +++ b/Toolchain/BuildClang.sh @@ -7,13 +7,10 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo "$DIR" -ARCH=${ARCH:-"i686"} -LLVM_ARCH= -[ "$ARCH" = "i686" ] && LLVM_ARCH="i386" || LLVM_ARCH="$ARCH" -LLVM_TARGET="$LLVM_ARCH-pc-serenity" -PREFIX="$DIR/Local/clang/$ARCH" -BUILD="$DIR/../Build/clang/$ARCH" -SYSROOT="$BUILD/Root" +PREFIX="$DIR/Local/clang/" +BUILD="$DIR/../Build/" +USERLAND_ARCHS="i686 x86_64" +ARCHS="$USERLAND_ARCHS aarch64" MD5SUM="md5sum" REALPATH="realpath" @@ -65,12 +62,11 @@ if [ "$dev" = "1" ] && [ "$ci" = "1" ]; then fi echo PREFIX is "$PREFIX" -echo SYSROOT is "$SYSROOT" mkdir -p "$DIR/Tarballs" -LLVM_VERSION="12.0.1" -LLVM_MD5SUM="c28061313a4f1b7d74cd491a19f569b4" +LLVM_VERSION="13.0.0" +LLVM_MD5SUM="bfc5191cbe87954952d25c6884596ccb" LLVM_NAME="llvm-project-$LLVM_VERSION.src" LLVM_PKG="$LLVM_NAME.tar.xz" LLVM_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION/$LLVM_PKG" @@ -92,7 +88,7 @@ buildstep_ninja() { # When ninja writes to a pipe, it strips ANSI escape codes and prints one line per buildstep. # Instead, use NINJA_STATUS so that we get colored output from LLVM's build and fewer lines of output when running in a tty. # ANSI escape codes in NINJA_STATUS are slightly janky (ninja thinks that "\e[34m" needs 5 output characters instead of 5, so - # it's middle elision is slightly off; also it would happily elide the "\e39m" which messes up the output if the terminal is too + # its middle elision is slightly off; also it would happily elide the "\e39m" which messes up the output if the terminal is too # narrow), but it's still working better than the alternative. NAME=$1 shift @@ -100,6 +96,7 @@ buildstep_ninja() { } # === DEPENDENCIES === + buildstep dependencies echo "Checking whether 'make' is available..." if ! command -v ${MAKE:-make} >/dev/null; then buildstep dependencies echo "Please make sure to install GNU Make (for the '${MAKE:-make}' tool)." @@ -192,7 +189,7 @@ pushd "$DIR/Tarballs" # Drop the previously patched extracted dir rm -rf "${LLVM_NAME}" # Also drop the build dir - rm -rf "$DIR/Build/clang/$ARCH" + rm -rf "$DIR/Build/clang" fi echo "Extracting LLVM..." tar -xJf "$LLVM_PKG" @@ -224,7 +221,7 @@ pushd "$DIR/Tarballs" if [ -d "$BINUTILS_NAME" ]; then rm -rf "$BINUTILS_NAME" - rm -rf "$DIR/Build/clang/$ARCH/binutils" + rm -rf "$DIR/Build/clang/binutils" fi echo "Extracting GNU binutils" @@ -243,182 +240,95 @@ pushd "$DIR/Tarballs" popd popd -# === COPY SERENITYOS HEADERS === +# === COPY HEADERS === -mkdir -p "$BUILD" -pushd "$BUILD" - mkdir -p Root/usr/include/ - SRC_ROOT=$($REALPATH "$DIR"/..) - FILES=$(find "$SRC_ROOT"/Kernel/API "$SRC_ROOT"/Userland/Libraries/LibC "$SRC_ROOT"/Userland/Libraries/LibM "$SRC_ROOT"/Userland/Libraries/LibPthread "$SRC_ROOT"/Userland/Libraries/LibDl -name '*.h' -print) - for header in $FILES; do - target=$(echo "$header" | sed -e "s@$SRC_ROOT/Userland/Libraries/LibC@@" -e "s@$SRC_ROOT/Userland/Libraries/LibM@@" -e "s@$SRC_ROOT/Userland/Libraries/LibPthread@@" -e "s@$SRC_ROOT/Userland/Libraries/LibDl@@" -e "s@$SRC_ROOT/Kernel/@Kernel/@") - buildstep "system_headers" install -D "$header" "Root/usr/include/$target" - done - unset SRC_ROOT -popd +SRC_ROOT=$($REALPATH "$DIR"/..) +FILES=$(find "$SRC_ROOT"/Kernel/API "$SRC_ROOT"/Userland/Libraries/LibC "$SRC_ROOT"/Userland/Libraries/LibM "$SRC_ROOT"/Userland/Libraries/LibPthread "$SRC_ROOT"/Userland/Libraries/LibDl -name '*.h' -print) + +for arch in $ARCHS; do + mkdir -p "$BUILD/${arch}clang" + pushd "$BUILD/${arch}clang" + mkdir -p Root/usr/include/ + for header in $FILES; do + target=$(echo "$header" | sed -e "s@$SRC_ROOT/Userland/Libraries/LibC@@" -e "s@$SRC_ROOT/Userland/Libraries/LibM@@" -e "s@$SRC_ROOT/Userland/Libraries/LibPthread@@" -e "s@$SRC_ROOT/Userland/Libraries/LibDl@@" -e "s@$SRC_ROOT/Kernel/@Kernel/@") + buildstep "system_headers" install -D "$header" "Root/usr/include/$target" + done + popd +done +unset SRC_ROOT + +# === COPY LIBRARY STUBS === + +for arch in $USERLAND_ARCHS; do + pushd "$BUILD/${arch}clang" + mkdir -p Root/usr/lib/ + for lib in "$DIR/Stubs/${arch}clang/"*".so"; do + lib_name=$(basename "$lib") + [ ! -f "Root/usr/lib/${lib_name}.so" ] && cp "$lib" "Root/usr/lib/${lib_name}" + done + popd +done # === COMPILE AND INSTALL === rm -rf "$PREFIX" mkdir -p "$PREFIX" -mkdir -p "$DIR/Build/clang/$ARCH" - -pushd "$DIR/Build/clang/$ARCH" +mkdir -p "$DIR/Build/clang" +pushd "$DIR/Build/clang" mkdir -p llvm pushd llvm - buildstep "llvm+clang/configure" cmake "$DIR/Tarballs/llvm-project-$LLVM_VERSION.src/llvm" \ + buildstep "llvm/configure" cmake "$DIR/Tarballs/$LLVM_NAME/llvm" \ -G Ninja \ - -DCMAKE_BUILD_TYPE="MinSizeRel" \ + -DSERENITY_i686-pc-serenity_SYSROOT="$BUILD/i686clang/Root" \ + -DSERENITY_x86_64-pc-serenity_SYSROOT="$BUILD/x86_64clang/Root" \ + -DSERENITY_aarch64-pc-serenity_SYSROOT="$BUILD/aarch64clang/Root" \ -DCMAKE_INSTALL_PREFIX="$PREFIX" \ - -DLLVM_DEFAULT_TARGET_TRIPLE="$LLVM_TARGET" \ - '-DLLVM_TARGETS_TO_BUILD=X86;AArch64' \ - -DLLVM_ENABLE_BINDINGS=OFF \ - -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \ - -DLLVM_ENABLE_PROJECTS="clang;lld" \ - -DLLVM_INCLUDE_BENCHMARKS=OFF \ - -DLLVM_INCLUDE_TESTS=OFF \ - -DLLVM_LINK_LLVM_DYLIB=ON \ - -DLLVM_INSTALL_UTILS=OFF \ + -C "$DIR/CMake/LLVMConfig.cmake" \ ${dev:+"-DLLVM_CCACHE_BUILD=ON"} \ ${ci:+"-DLLVM_CCACHE_BUILD=ON"} \ ${ci:+"-DLLVM_CCACHE_DIR=$LLVM_CCACHE_DIR"} \ - ${ci:+"-DLLVM_CCACHE_MAXSIZE=$LLVM_CCACHE_MAXSIZE"} \ - || exit 1 + ${ci:+"-DLLVM_CCACHE_MAXSIZE=$LLVM_CCACHE_MAXSIZE"} - buildstep_ninja "llvm+clang/build" ninja -j "$MAKEJOBS" || exit 1 - buildstep "llvm+clang/install" ninja install || exit 1 - popd - - LLVM_COMPILER_FLAGS="-target $LLVM_TARGET --sysroot $SYSROOT -ftls-model=initial-exec -ffreestanding -nostdlib -nostdlib++" - - mkdir -p "compiler-rt" - pushd compiler-rt - buildstep "compiler-rt/configure" cmake "$DIR/Tarballs/llvm-project-$LLVM_VERSION.src/compiler-rt" \ - -GNinja \ - -DCMAKE_SYSROOT="$SYSROOT" \ - -DCMAKE_INSTALL_PREFIX="$PREFIX/lib/clang/${LLVM_VERSION}" \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_AR="$PREFIX/bin/llvm-ar" \ - -DCMAKE_C_COMPILER="$PREFIX/bin/clang" \ - -DCMAKE_C_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_C_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_CXX_COMPILER="$PREFIX/bin/clang++" \ - -DCMAKE_CXX_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_CXX_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_ASM_COMPILER="$PREFIX/bin/clang" \ - -DCMAKE_ASM_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_ASM_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DLLVM_CONFIG_PATH="$PREFIX/bin/llvm-config" \ - -DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=OFF \ - -DCOMPILER_RT_OS_DIR="serenity" \ - -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ - -DCOMPILER_RT_BUILD_BUILTINS=ON \ - -DCOMPILER_RT_BUILD_CRT=ON \ - -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ - -DCOMPILER_RT_BUILD_MEMPROF=OFF \ - -DCOMPILER_RT_BUILD_PROFILE=OFF \ - -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ - -DCOMPILER_RT_BUILD_XRAY=OFF || exit 1 - - buildstep_ninja "compiler-rt/build" ninja -j "$MAKEJOBS" || exit 1 - buildstep "compiler-rt/install" ninja install || exit 1 - popd - - mkdir -p libunwind - pushd libunwind - buildstep "libunwind/configure" cmake "$DIR/Tarballs/llvm-project-$LLVM_VERSION.src/libunwind" \ - -GNinja \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_SYSROOT="$SYSROOT" \ - -DCMAKE_C_COMPILER="$PREFIX/bin/clang" \ - -DCMAKE_C_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_C_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_CXX_COMPILER="$PREFIX/bin/clang++" \ - -DCMAKE_CXX_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_CXX_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_INSTALL_PREFIX="$PREFIX" \ - -DLLVM_CONFIG_PATH="$PREFIX/bin/llvm-config" \ - -DLIBUNWIND_TARGET_TRIPLE="$LLVM_TARGET" \ - -DLIBUNWIND_SYSROOT="$SYSROOT" || exit 1 - - buildstep_ninja "libunwind/build" ninja -j "$MAKEJOBS" || exit 1 - buildstep "libunwind/install" ninja install || exit 1 - popd - - mkdir -p libcxxabi - pushd libcxxabi - buildstep "libcxxabi/configure" cmake "$DIR/Tarballs/llvm-project-$LLVM_VERSION.src/libcxxabi" \ - -GNinja \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_SYSROOT="$SYSROOT" \ - -DCMAKE_C_COMPILER="$PREFIX/bin/clang" \ - -DCMAKE_C_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_C_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_CXX_COMPILER="$PREFIX/bin/clang++" \ - -DCMAKE_CXX_COMPILER_TARGET="$LLVM_TARGET" \ - -DCMAKE_CXX_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_INSTALL_PREFIX="$PREFIX" \ - -DLLVM_CONFIG_PATH="$PREFIX/bin/llvm-config" \ - -DLIBCXXABI_STANDALONE_BUILD=ON \ - -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \ - -DLIBCXXABI_STANDALONE_BUILD=ON \ - -DLIBCXXABI_ENABLE_ASSERTIONS=OFF \ - -DLIBCXXABI_BAREMETAL=ON || exit 1 - - buildstep_ninja "libcxxabi/build" ninja -j "$MAKEJOBS" || exit 1 - buildstep "libcxxabi/install" ninja install || exit 1 - popd - - mkdir -p libcxx - pushd libcxx - buildstep "libcxx/configure" cmake "$DIR/Tarballs/llvm-project-$LLVM_VERSION.src/libcxx" \ - -G Ninja \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_BINARY_DIR="$PREFIX/usr" \ - -DCMAKE_SYSROOT="$SYSROOT" \ - -DCMAKE_C_COMPILER="$PREFIX/bin/clang" \ - -DCMAKE_C_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_CXX_COMPILER="$PREFIX/bin/clang++" \ - -DCMAKE_CXX_FLAGS="$LLVM_COMPILER_FLAGS" \ - -DCMAKE_INSTALL_PREFIX="$PREFIX" \ - -DLLVM_CONFIG_PATH="$PREFIX/bin/llvm-config" \ - -DLLVM_BINARY_DIR="$PREFIX/usr" \ - -DLIBCXX_INSTALL_LIBRARY=ON \ - -DLIBCXX_ENABLE_LOCALIZATION=OFF \ - -DLIBCXX_ENABLE_FILESYSTEM=OFF \ - -DLIBCXX_INSTALL_HEADERS=ON \ - -DLIBCXX_ENABLE_SHARED=ON \ - -DLIBCXX_ENABLE_LOCALIZATION=OFF \ - -DLIBCXX_ENABLE_STATIC=ON \ - -DLIBCXX_CXX_ABI="libcxxabi" \ - -DLIBCXX_INCLUDE_BENCHMARKS=OFF || exit 1 - - buildstep "libcxx/build" ninja -j "$MAKEJOBS" || exit 1 - buildstep "libcxx/install" ninja install || exit 1 - buildstep "libcxx/install-headers" ninja install-cxx-headers || exit 1 + buildstep_ninja "llvm/build" ninja -j "$MAKEJOBS" + buildstep "llvm/install" ninja install/strip popd mkdir -p binutils pushd binutils - buildstep "binutils/configure" "$DIR/Tarballs/$BINUTILS_NAME/configure" --prefix="$PREFIX/binutils" \ - --target="$ARCH-pc-serenity" \ + buildstep "binutils/configure" "$DIR/Tarballs/$BINUTILS_NAME/configure" --prefix="$PREFIX" \ + --enable-targets="$(echo "$ARCHS" | sed -E "s@(\S)(\s|$)@\1-pc-serenity,@g")" \ + --program-prefix="gnu-" \ --disable-nls \ --disable-gas \ --disable-gold \ --disable-ld \ --disable-gprof \ - --enable-shared || exit 1 - buildstep "binutils/build" "$MAKE" -j "$MAKEJOBS" || exit 1 - buildstep "binutils/install" "$MAKE" install || exit 1 + --enable-shared + buildstep "binutils/build" "$MAKE" -j "$MAKEJOBS" + buildstep "binutils/install" "$MAKE" install popd + + for arch in $ARCHS; do + mkdir -p runtimes/"$arch" + pushd runtimes/"$arch" + buildstep "runtimes/$arch/configure" cmake "$DIR/Tarballs/$LLVM_NAME/runtimes" \ + -G Ninja \ + -DSERENITY_TOOLCHAIN_ARCH="$arch" \ + -DSERENITY_TOOLCHAIN_ROOT="$PREFIX" \ + -DSERENITY_BUILD_DIR="$BUILD/${arch}clang/" \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -C "$DIR/CMake/LLVMRuntimesConfig.cmake" + + buildstep "runtimes/$arch/build" ninja -j "$MAKEJOBS" + buildstep "runtimes/$arch/install" ninja install + popd + done popd -# === REMOVE UNNECESSARY BUILD ARTIFACTS === -rm -r "$PREFIX"/lib/libclang*.a "$PREFIX"/lib/libLLVM*.a "$PREFIX"/lib/liblld*.a - # === SAVE TO CACHE === + pushd "$DIR" if [ "$TRY_USE_LOCAL_TOOLCHAIN" = "y" ]; then echo "::endgroup::" diff --git a/Toolchain/CMake/ClangToolchain.txt.in b/Toolchain/CMake/ClangToolchain.txt.in index 8afcfa2b364..f01392358a2 100644 --- a/Toolchain/CMake/ClangToolchain.txt.in +++ b/Toolchain/CMake/ClangToolchain.txt.in @@ -5,7 +5,7 @@ set(CMAKE_SYSTEM_PROCESSOR "@SERENITY_ARCH@") set(SERENITYOS 1) set(triple @SERENITY_ARCH@-pc-serenity) -set(TOOLCHAIN_ROOT @SERENITY_SOURCE_DIR@/Toolchain/Local/clang/@SERENITY_ARCH@) +set(TOOLCHAIN_ROOT @SERENITY_SOURCE_DIR@/Toolchain/Local/clang/) set(TOOLCHAIN_PATH ${TOOLCHAIN_ROOT}/bin) # where to read from/write to @@ -26,7 +26,7 @@ set(CMAKE_STRIP ${TOOLCHAIN_PATH}/llvm-strip) set(CMAKE_AR ${TOOLCHAIN_PATH}/llvm-ar) set(SERENITY_CXXFILT ${TOOLCHAIN_PATH}/llvm-cxxfilt) # FIXME: Persuade LLVM maintainers to add `--update-section` to llvm-objcopy, as it's required for the kernel symbol map. -set(CMAKE_OBJCOPY ${TOOLCHAIN_ROOT}/binutils/bin/@SERENITY_ARCH@-pc-serenity-objcopy) +set(CMAKE_OBJCOPY ${TOOLCHAIN_PATH}/gnu-objcopy) set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--hash-style=gnu,-z,relro,-z,now,-z,noexecstack,-z,max-page-size=0x1000,-z,separate-code") diff --git a/Toolchain/CMake/LLVMConfig.cmake b/Toolchain/CMake/LLVMConfig.cmake new file mode 100644 index 00000000000..ee9cd36e590 --- /dev/null +++ b/Toolchain/CMake/LLVMConfig.cmake @@ -0,0 +1,67 @@ +# This file specifies the options used for building the Clang compiler, LLD linker and the compiler builtins library + +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +set(LLVM_TARGETS_TO_BUILD "X86;AArch64" CACHE STRING "") + +set(LLVM_ENABLE_PROJECTS "llvm;clang;lld" CACHE STRING "") +set(LLVM_ENABLE_RUNTIMES "compiler-rt" CACHE STRING "") + +set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "") +set(LLVM_ENABLE_BINDINGS OFF CACHE BOOL "") +set(LLVM_INCLUDE_BENCHMARKS OFF CACHE BOOL "") +set(LLVM_BUILD_UTILS OFF CACHE BOOL "") +set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "") +set(LLVM_BUILD_LLVM_DYLIB ON CACHE BOOL "") +set(LLVM_LINK_LLVM_DYLIB ON CACHE BOOL "") +set(LLVM_INSTALL_UTILS OFF CACHE BOOL "") +set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") +set(LLVM_INSTALL_BINUTILS_SYMLINKS OFF CACHE BOOL "") + +set(CLANG_ENABLE_CLANGD OFF CACHE BOOL "") + +set(compiler_flags "-nostdlib -nostdlib++") +foreach(target i686-pc-serenity;x86_64-pc-serenity;aarch64-pc-serenity) + list(APPEND targets "${target}") + + set(RUNTIMES_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "") + set(RUNTIMES_${target}_CMAKE_SYSROOT ${SERENITY_${target}_SYSROOT} CACHE PATH "") + set(RUNTIMES_${target}_CMAKE_C_FLAGS ${compiler_flags} CACHE STRING "") + set(RUNTIMES_${target}_CMAKE_CXX_FLAGS ${compiler_flags} CACHE STRING "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_CRT ON CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_MEMPROF OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_ORC OFF CACHE BOOL "") + + set(BUILTINS_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "") + set(BUILTINS_${target}_CMAKE_SYSROOT ${SERENITY_${target}_SYSROOT} CACHE PATH "") + set(BUILTINS_${target}_COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN OFF CACHE BOOL "") +endforeach() + +set(LLVM_TOOLCHAIN_TOOLS + llvm-addr2line + llvm-ar + llvm-cov + llvm-cxxfilt + llvm-dwarfdump + llvm-ifs + llvm-lib + llvm-nm + llvm-objcopy + llvm-objdump + llvm-profdata + llvm-rc + llvm-ranlib + llvm-readelf + llvm-readobj + llvm-size + llvm-strings + llvm-strip + llvm-symbolizer + CACHE STRING "") + +set(LLVM_RUNTIME_TARGETS ${targets} CACHE STRING "") +set(LLVM_BUILTIN_TARGETS ${targets} CACHE STRING "") diff --git a/Toolchain/CMake/LLVMRuntimesConfig.cmake b/Toolchain/CMake/LLVMRuntimesConfig.cmake new file mode 100644 index 00000000000..cca7fc4949a --- /dev/null +++ b/Toolchain/CMake/LLVMRuntimesConfig.cmake @@ -0,0 +1,52 @@ +# This file specifies the options used for building the various LLVM runtime libraries + +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +set(LLVM_ENABLE_RUNTIMES "libcxx;libcxxabi;libunwind" CACHE STRING "") + +set(target_triple ${SERENITY_TOOLCHAIN_ARCH}-pc-serenity) + +set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "") +set(LLVM_ENABLE_BINDINGS OFF CACHE BOOL "") +set(LLVM_INCLUDE_BENCHMARKS OFF CACHE BOOL "") +set(LLVM_BUILD_UTILS OFF CACHE BOOL "") +set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "") +set(LLVM_BUILD_LLVM_DYLIB ON CACHE BOOL "") +set(LLVM_LINK_LLVM_DYLIB ON CACHE BOOL "") +set(LLVM_INSTALL_UTILS OFF CACHE BOOL "") +set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") +set(LLVM_INSTALL_BINUTILS_SYMLINKS OFF CACHE BOOL "") +set(LLVM_DEFAULT_TARGET_TRIPLE ${target_triple} CACHE STRING "") +set(LLVM_BINARY_DIR "${SERENITY_TOOLCHAIN_ROOT}" CACHE PATH "") + +set(CMAKE_SYSROOT "${SERENITY_BUILD_DIR}/Root" CACHE PATH "") +set(compiler_flags "-nostdlib -nostdlib++") + +set(CMAKE_C_COMPILER "${SERENITY_TOOLCHAIN_ROOT}/bin/clang" CACHE PATH "") +set(CMAKE_C_COMPILER_WORKS ON CACHE BOOL "") +set(CMAKE_CXX_COMPILER "${SERENITY_TOOLCHAIN_ROOT}/bin/clang++" CACHE PATH "") +set(CMAKE_CXX_COMPILER_WORKS ON CACHE BOOL "") +set(CMAKE_ASM_COMPILER "${SERENITY_TOOLCHAIN_ROOT}/bin/clang" CACHE PATH "") +set(CMAKE_ASM_COMPILER_WORKS ON CACHE BOOL "") +set(CMAKE_LINKER "${SERENITY_TOOLCHAIN_ROOT}/bin/ld.lld" CACHE PATH "") +foreach(tool ranlib;nm;objdump;objcopy;strip) + string(TOUPPER tool Tool) + set(CMAKE_${Tool} "${SERENITY_TOOLCHAIN_ROOT}/bin/llvm-${tool}" CACHE PATH "") +endforeach() + +set(CMAKE_C_COMPILER_TARGET ${target_triple} CACHE STRING "") +set(CMAKE_CXX_COMPILER_TARGET ${target_triple} CACHE STRING "") +set(CMAKE_ASM_COMPILER_TARGET ${target_triple} CACHE STRING "") + +set(CMAKE_C_FLAGS ${compiler_flags} CACHE STRING "") +set(CMAKE_CXX_FLAGS ${compiler_flags} CACHE STRING "") + +set(LIBCXX_ENABLE_FILESYSTEM OFF CACHE BOOL "") +set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") +set(LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "") +set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "") +if (NOT "${SERENITY_TOOLCHAIN_ARCH}" STREQUAL "aarch64") + set(LIBCXX_HAS_M_LIB ON CACHE BOOL "") +endif() +set(LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") +set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") diff --git a/Toolchain/Patches/llvm.patch b/Toolchain/Patches/llvm.patch index e44237acfe8..ddf3004c8a6 100644 --- a/Toolchain/Patches/llvm.patch +++ b/Toolchain/Patches/llvm.patch @@ -1,8 +1,8 @@ diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp -index 90a67d03b..ad21af415 100644 +index ba91d0439..42265d547 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp -@@ -148,6 +148,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -149,6 +149,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new NetBSDTargetInfo(Triple, Opts); case llvm::Triple::OpenBSD: return new OpenBSDTargetInfo(Triple, Opts); @@ -11,7 +11,7 @@ index 90a67d03b..ad21af415 100644 case llvm::Triple::Win32: switch (Triple.getEnvironment()) { case llvm::Triple::GNU: -@@ -527,6 +527,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -538,6 +540,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new MCUX86_32TargetInfo(Triple, Opts); case llvm::Triple::Hurd: return new HurdTargetInfo(Triple, Opts); @@ -20,7 +20,7 @@ index 90a67d03b..ad21af415 100644 default: return new X86_32TargetInfo(Triple, Opts); } -@@ -579,6 +581,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -590,6 +594,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new NaClTargetInfo(Triple, Opts); case llvm::Triple::PS4: return new PS4OSTargetInfo(Triple, Opts); @@ -30,21 +30,21 @@ index 90a67d03b..ad21af415 100644 return new X86_64TargetInfo(Triple, Opts); } diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h -index 67fa1a537..9dd9039bb 100644 +index 3fe39ed64..51e7a6cca 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h -@@ -947,6 +947,22 @@ public: - : WebAssemblyOSTargetInfo(Triple, Opts) {} +@@ -966,6 +966,22 @@ public: + } }; -+// SerenityOS Target ++// SerenityOS target +template +class LLVM_LIBRARY_VISIBILITY SerenityTargetInfo : public OSTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + Builder.defineMacro("__serenity__"); -+ Builder.defineMacro("__unix__"); ++ DefineStd(Builder, "unix", Opts); + Builder.defineMacro("__ELF__"); + } + @@ -57,10 +57,10 @@ index 67fa1a537..9dd9039bb 100644 } // namespace clang #endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt -index aeffcf0bb..43bec8fd7 100644 +index 08be9f011..69038ff00 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt -@@ -66,6 +66,7 @@ add_clang_library(clangDriver +@@ -67,6 +67,7 @@ add_clang_library(clangDriver ToolChains/OpenBSD.cpp ToolChains/PS4CPU.cpp ToolChains/RISCVToolchain.cpp @@ -69,7 +69,7 @@ index aeffcf0bb..43bec8fd7 100644 ToolChains/TCE.cpp ToolChains/VEToolchain.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp -index 418e1d3e8..672aadc4d 100644 +index 94a7553e2..c6b3210f6 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -41,6 +41,7 @@ @@ -80,7 +80,7 @@ index 418e1d3e8..672aadc4d 100644 #include "ToolChains/Solaris.h" #include "ToolChains/TCE.h" #include "ToolChains/VEToolchain.h" -@@ -5128,6 +5129,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, +@@ -5299,6 +5300,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::Fuchsia: TC = std::make_unique(*this, Target, Args); break; @@ -91,10 +91,10 @@ index 418e1d3e8..672aadc4d 100644 TC = std::make_unique(*this, Target, Args); break; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp -index b2ddef141..48880a612 100644 +index 6c1b88141..c77ff78be 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp -@@ -398,6 +398,8 @@ StringRef ToolChain::getOSLibName() const { +@@ -404,6 +404,8 @@ StringRef ToolChain::getOSLibName() const { return "sunos"; case llvm::Triple::AIX: return "aix"; @@ -103,13 +103,44 @@ index b2ddef141..48880a612 100644 default: return getOS(); } +diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp b/clang/lib/Driver/ToolChains/Arch/X86.cpp +index 12749c7ec..91f744a26 100644 +--- a/clang/lib/Driver/ToolChains/Arch/X86.cpp ++++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp +@@ -100,6 +100,7 @@ std::string x86::getX86TargetCPU(const ArgList &Args, + case llvm::Triple::OpenBSD: + return "i586"; + case llvm::Triple::FreeBSD: ++ case llvm::Triple::Serenity: + return "i686"; + default: + // Fallback to p4. +diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp +index 58ae08a38..8e9a3fee6 100644 +--- a/clang/lib/Driver/ToolChains/Clang.cpp ++++ b/clang/lib/Driver/ToolChains/Clang.cpp +@@ -5695,7 +5695,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, + options::OPT_fno_visibility_inlines_hidden_static_local_var); + Args.AddLastArg(CmdArgs, options::OPT_fvisibility_global_new_delete_hidden); + +- Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ); ++ if (Triple.isOSSerenity()) { ++ StringRef tls_model = ++ Args.getLastArgValue(options::OPT_ftlsmodel_EQ, "initial-exec"); ++ CmdArgs.push_back(Args.MakeArgString("-ftls-model=" + tls_model)); ++ } else { ++ Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ); ++ } + + if (Args.hasFlag(options::OPT_fno_operator_names, + options::OPT_foperator_names, false)) diff --git a/clang/lib/Driver/ToolChains/Serenity.cpp b/clang/lib/Driver/ToolChains/Serenity.cpp new file mode 100644 -index 000000000..8840188eb +index 000000000..8f3e125dd --- /dev/null +++ b/clang/lib/Driver/ToolChains/Serenity.cpp -@@ -0,0 +1,220 @@ -+//===--- Serenity.cpp - SerenityOS ToolChain Implementations ----*- C++ -*-===// +@@ -0,0 +1,275 @@ ++//===---- Serenity.cpp - SerenityOS ToolChain Implementation ----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. @@ -119,9 +150,9 @@ index 000000000..8840188eb + +#include "Serenity.h" +#include "CommonArgs.h" -+#include "InputInfo.h" +#include "clang/Driver/Compilation.h" +#include "clang/Driver/Driver.h" ++#include "clang/Driver/DriverDiagnostic.h" +#include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" +#include "llvm/Option/ArgList.h" @@ -283,10 +314,11 @@ index 000000000..8840188eb + +Serenity::Serenity(const Driver &D, const llvm::Triple &Triple, + const ArgList &Args) -+ : Generic_ELF(D, Triple, Args) { -+ getFilePaths().push_back(getDriver().Dir + "/../lib"); -+ if (!getDriver().SysRoot.empty()) -+ getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); ++ : ToolChain(D, Triple, Args) { ++ getProgramPaths().push_back(getDriver().getInstalledDir()); ++ if (getDriver().getInstalledDir() != getDriver().Dir) ++ getProgramPaths().push_back(getDriver().Dir); ++ getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); +} + +Tool *Serenity::buildLinker() const { @@ -308,34 +340,89 @@ index 000000000..8840188eb + return; + + if (!D.SysRoot.empty()) { ++ addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include"); + addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include"); + } +} + +void Serenity::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { -+ if (DriverArgs.hasArg(options::OPT_nostdlibinc, options::OPT_nostdincxx)) ++ if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdincxx, ++ +options::OPT_nostdlibinc)) + return; + -+ switch (GetCXXStdlibType(DriverArgs)) { -+ case ToolChain::CST_Libcxx: { -+ addSystemInclude(DriverArgs, CC1Args, -+ getDriver().SysRoot + "/usr/include/c++/v1"); -+ addSystemInclude(DriverArgs, CC1Args, -+ getDriver().Dir + "/../include/c++/v1"); -+ break; -+ } -+ default: -+ llvm_unreachable("invalid stdlib name"); -+ } ++ if (GetCXXStdlibType(DriverArgs) != ToolChain::CST_Libcxx) ++ llvm_unreachable("Only libc++ is supported on the Serenity target"); ++ ++ const Driver &D = getDriver(); ++ std::string SysRoot = computeSysRoot(); ++ std::string Target = getTripleString(); ++ ++ auto AddIncludePath = [&](std::string Path) { ++ std::string Version = detectLibcxxVersion(Path); ++ if (Version.empty()) ++ return false; ++ ++ std::string TargetDir = Path + "/" + Target + "/c++/" + Version; ++ if (D.getVFS().exists(TargetDir)) ++ addSystemInclude(DriverArgs, CC1Args, TargetDir); ++ ++ addSystemInclude(DriverArgs, CC1Args, Path + "/c++/" + Version); ++ return true; ++ }; ++ ++ if (AddIncludePath(getDriver().Dir + "/../include")) ++ return; ++ if (AddIncludePath(SysRoot + "/usr/local/include")) ++ return; ++ if (AddIncludePath(SysRoot + "/usr/include")) ++ return; +} ++ ++void Serenity::addClangTargetOptions( ++ const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, ++ Action::OffloadKind DeviceOffloadKind) const { ++ if (!DriverArgs.hasFlag(options::OPT_fuse_init_array, ++ options::OPT_fno_use_init_array, true)) ++ CC1Args.push_back("-fno-use-init-array"); ++} ++ ++ToolChain::UnwindLibType ++Serenity::GetUnwindLibType(const llvm::opt::ArgList &Args) const { ++ ++ const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ); ++ StringRef LibName = A ? A->getValue() : ""; ++ ++ if (LibName == "none") { ++ return ToolChain::UNW_None; ++ } else if (LibName == "platform" || LibName == "") { ++ ToolChain::RuntimeLibType RtLibType = GetRuntimeLibType(Args); ++ if (RtLibType == ToolChain::RLT_CompilerRT) { ++ return ToolChain::UNW_CompilerRT; ++ } else if (RtLibType == ToolChain::RLT_Libgcc) ++ return ToolChain::UNW_Libgcc; ++ } else if (LibName == "libunwind") { ++ if (GetRuntimeLibType(Args) == RLT_Libgcc) ++ getDriver().Diag(diag::err_drv_incompatible_unwindlib); ++ return ToolChain::UNW_CompilerRT; ++ } else if (LibName == "libgcc") { ++ return ToolChain::UNW_Libgcc; ++ } ++ ++ if (A) ++ getDriver().Diag(diag::err_drv_invalid_unwindlib_name) ++ << A->getAsString(Args); ++ ++ return ToolChain::UNW_None; ++} +\ No newline at end of file diff --git a/clang/lib/Driver/ToolChains/Serenity.h b/clang/lib/Driver/ToolChains/Serenity.h new file mode 100644 -index 000000000..a45a0c853 +index 000000000..50b0dbe62 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Serenity.h -@@ -0,0 +1,78 @@ -+//===--- Serenity.h - SerenityOS ToolChain Implementations ------*- C++ -*-===// +@@ -0,0 +1,99 @@ ++//===---- Serenity.h - SerenityOS ToolChain Implementation ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. @@ -346,14 +433,13 @@ index 000000000..a45a0c853 +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SERENITY_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SERENITY_H + -+#include "Gnu.h" ++#include "clang/Basic/LangOptions.h" +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace tools { -+/// Serenity -- Directly call GNU Binutils assembler and linker +namespace serenity { + +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { @@ -373,7 +459,7 @@ index 000000000..a45a0c853 + +namespace toolchains { + -+class LLVM_LIBRARY_VISIBILITY Serenity : public Generic_ELF { ++class LLVM_LIBRARY_VISIBILITY Serenity : public ToolChain { +public: + Serenity(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); @@ -390,18 +476,40 @@ index 000000000..a45a0c853 + return ToolChain::RLT_CompilerRT; + } + -+ UnwindLibType GetDefaultUnwindLibType() const override { -+ return ToolChain::UNW_CompilerRT; -+ } -+ + CXXStdlibType GetDefaultCXXStdlibType() const override { + return ToolChain::CST_Libcxx; + } ++ ++ UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override; ++ ++ void ++ addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, ++ llvm::opt::ArgStringList &CC1Args, ++ Action::OffloadKind DeviceOffloadKind) const override; ++ + const char *getDefaultLinker() const override { return "ld.lld"; } + + bool HasNativeLLVMSupport() const override { return true; } ++ + bool IsIntegratedAssemblerDefault() const override { return true; } + ++ bool isPICDefault() const override { return true; } ++ bool isPIEDefault() const override { return true; } ++ bool isPICDefaultForced() const override { return false; } ++ ++ bool IsMathErrnoDefault() const override { return false; } ++ ++ bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override { ++ return true; ++ } ++ ++ bool useRelaxRelocations() const override { return true; } ++ ++ LangOptions::StackProtectorMode ++ GetDefaultStackProtectorLevel(bool KernelOrKext) const override { ++ return LangOptions::SSPStrong; ++ } ++ + unsigned GetDefaultDwarfVersion() const override { return 5; } + +protected: @@ -414,10 +522,10 @@ index 000000000..a45a0c853 + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SERENITY_H diff --git a/clang/lib/Frontend/InitHeaderSearch.cpp b/clang/lib/Frontend/InitHeaderSearch.cpp -index bc31445d6..a4a3fbc89 100644 +index ba9f96384..4aecfeee2 100644 --- a/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/clang/lib/Frontend/InitHeaderSearch.cpp -@@ -229,6 +229,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, +@@ -233,6 +233,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, case llvm::Triple::PS4: case llvm::Triple::ELFIAMCU: case llvm::Triple::Fuchsia: @@ -425,7 +533,7 @@ index bc31445d6..a4a3fbc89 100644 break; case llvm::Triple::Win32: if (triple.getEnvironment() != llvm::Triple::Cygnus) -@@ -428,6 +429,7 @@ void InitHeaderSearch::AddDefaultIncludePaths(const LangOptions &Lang, +@@ -432,6 +433,7 @@ void InitHeaderSearch::AddDefaultIncludePaths(const LangOptions &Lang, case llvm::Triple::Solaris: case llvm::Triple::WASI: case llvm::Triple::AIX: @@ -433,447 +541,162 @@ index bc31445d6..a4a3fbc89 100644 return; case llvm::Triple::Win32: +diff --git a/libcxx/cmake/Modules/HandleOutOfTreeLLVM.cmake b/libcxx/cmake/Modules/HandleOutOfTreeLLVM.cmake +index ad2820b32..deaa2c380 100644 +--- a/libcxx/cmake/Modules/HandleOutOfTreeLLVM.cmake ++++ b/libcxx/cmake/Modules/HandleOutOfTreeLLVM.cmake +@@ -14,6 +14,8 @@ set(LLVM_INCLUDE_DIR ${LLVM_PATH}/include CACHE PATH "Path to llvm/include") + set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree") + set(LLVM_MAIN_SRC_DIR ${LLVM_PATH}) + set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules") ++set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) ++set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_CURRENT_BINARY_DIR}/lib") + + if (EXISTS "${LLVM_CMAKE_PATH}") + list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}") diff --git a/libcxx/include/__config b/libcxx/include/__config -index a3838c89e..8a20731ef 100644 +index 97e33f315..bfb221230 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config -@@ -1132,6 +1132,7 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container( - defined(__CloudABI__) || \ +@@ -958,6 +958,8 @@ typedef unsigned int char32_t; + # define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION + #elif defined(__MVS__) + # define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION ++#elif defined(__serenity__) && !defined(KERNEL) ++# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION + #endif + + #if defined(__APPLE__) +@@ -1148,6 +1150,7 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container( defined(__sun__) || \ defined(__MVS__) || \ + defined(_AIX) || \ + defined(__serenity__) || \ (defined(__MINGW32__) && __has_include()) # define _LIBCPP_HAS_THREAD_API_PTHREAD # elif defined(__Fuchsia__) -diff --git a/libcxx/include/__string b/libcxx/include/__string -index d8b672e4c..638cf1698 100644 ---- a/libcxx/include/__string -+++ b/libcxx/include/__string -@@ -451,6 +451,7 @@ char_traits::find(const char_type* __s, size_t __n, const char_type& __a) - } +diff --git a/libcxx/include/__locale b/libcxx/include/__locale +index ad742997d..c75dcb458 100644 +--- a/libcxx/include/__locale ++++ b/libcxx/include/__locale +@@ -31,7 +31,7 @@ + #elif defined(__sun__) + # include + # include <__support/solaris/xlocale.h> +-#elif defined(_NEWLIB_VERSION) ++#elif defined(_NEWLIB_VERSION) || defined(__serenity__) + # include <__support/newlib/xlocale.h> + #elif defined(__OpenBSD__) + # include <__support/openbsd/xlocale.h> +@@ -490,7 +490,7 @@ public: + static const mask xdigit = _ISXDIGIT; + static const mask blank = _ISBLANK; + static const mask __regex_word = 0x80; +-#elif defined(_NEWLIB_VERSION) ++#elif defined(_NEWLIB_VERSION) || defined(__serenity__) + // Same type as Newlib's _ctype_ array in newlib/libc/include/ctype.h. + typedef char mask; + static const mask space = _S; +diff --git a/libcxx/include/__support/newlib/xlocale.h b/libcxx/include/__support/newlib/xlocale.h +index b75f9263a..f5ffb9003 100644 +--- a/libcxx/include/__support/newlib/xlocale.h ++++ b/libcxx/include/__support/newlib/xlocale.h +@@ -9,7 +9,7 @@ + #ifndef _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H + #define _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H +-#if defined(_NEWLIB_VERSION) ++#if defined(_NEWLIB_VERSION) || defined(__serenity__) -+#ifndef __serenity__ - // char_traits - - template <> -@@ -531,6 +532,7 @@ char_traits::compare(const char_type* __s1, const char_type* __s2, size + #include + #include +@@ -22,6 +22,6 @@ + #include <__support/xlocale/__strtonum_fallback.h> #endif - } -+#endif +-#endif // _NEWLIB_VERSION ++#endif // _NEWLIB_VERSION || __serenity__ - template - _LIBCPP_INLINE_VISIBILITY -@@ -543,6 +545,7 @@ inline size_t __char_traits_length_checked(const typename _Traits::char_type* __ #endif - } - -+#ifndef __serenity__ - inline _LIBCPP_CONSTEXPR_AFTER_CXX14 - size_t - char_traits::length(const char_type* __s) _NOEXCEPT -@@ -579,6 +582,7 @@ char_traits::find(const char_type* __s, size_t __n, const char_type& __ - return nullptr; - #endif - } -+#endif - - - #ifndef _LIBCPP_NO_HAS_CHAR8_T -diff --git a/libcxx/include/cwchar b/libcxx/include/cwchar -index 451c621f9..1e83b8e60 100644 ---- a/libcxx/include/cwchar -+++ b/libcxx/include/cwchar -@@ -112,11 +112,13 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len, - - _LIBCPP_BEGIN_NAMESPACE_STD - --using ::mbstate_t; - using ::size_t; -+using ::FILE; -+ -+#ifndef __serenity__ -+using ::mbstate_t; - using ::tm; - using ::wint_t; --using ::FILE; - using ::fwprintf; - using ::fwscanf; - using ::swprintf; -@@ -186,6 +188,7 @@ using ::putwchar; - using ::vwprintf; - using ::wprintf; - #endif -+#endif - - _LIBCPP_END_NAMESPACE_STD - -diff --git a/libcxx/include/cwctype b/libcxx/include/cwctype -index 575fd5661..c401b6cf0 100644 ---- a/libcxx/include/cwctype -+++ b/libcxx/include/cwctype -@@ -59,6 +59,7 @@ wctrans_t wctrans(const char* property); - - _LIBCPP_BEGIN_NAMESPACE_STD - -+#ifndef __serenity__ - using ::wint_t; - using ::wctrans_t; - using ::wctype_t; -@@ -80,6 +81,7 @@ using ::towlower; - using ::towupper; - using ::towctrans; - using ::wctrans; -+#endif - - _LIBCPP_END_NAMESPACE_STD - diff --git a/libcxx/include/initializer_list b/libcxx/include/initializer_list -index 893736f57..70a0d1ccf 100644 +index ea1f23467..45631ac2f 100644 --- a/libcxx/include/initializer_list +++ b/libcxx/include/initializer_list @@ -43,7 +43,9 @@ template const E* end(initializer_list il) noexcept; // constexpr in */ #include <__config> -+#ifndef KERNEL ++#if !defined(__serenity__) || !defined(KERNEL) #include +#endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header -diff --git a/libcxx/include/iosfwd b/libcxx/include/iosfwd -index 0a0de99ff..790dc4023 100644 ---- a/libcxx/include/iosfwd -+++ b/libcxx/include/iosfwd -@@ -109,7 +113,9 @@ template<> struct char_traits; - #endif - template<> struct char_traits; - template<> struct char_traits; -+#if 0 - template<> struct char_traits; -+#endif +diff --git a/libcxx/include/locale b/libcxx/include/locale +index 8e584005d..f29f3453e 100644 +--- a/libcxx/include/locale ++++ b/libcxx/include/locale +@@ -206,7 +206,7 @@ template class messages_byname; - template class _LIBCPP_TEMPLATE_VIS allocator; + #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + // Most unix variants have catopen. These are the specific ones that don't. +-# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) ++# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) && !defined(__serenity__) + # define _LIBCPP_HAS_CATOPEN 1 + # include + # endif +diff --git a/libcxx/src/include/config_elast.h b/libcxx/src/include/config_elast.h +index 7880c733f..87b25cf42 100644 +--- a/libcxx/src/include/config_elast.h ++++ b/libcxx/src/include/config_elast.h +@@ -33,6 +33,8 @@ + #define _LIBCPP_ELAST 4095 + #elif defined(__APPLE__) + // No _LIBCPP_ELAST needed on Apple ++#elif defined(__serenity__) ++// No _LIBCPP_ELAST needed on SerenityOS + #elif defined(__sun__) + #define _LIBCPP_ELAST ESTALE + #elif defined(__MVS__) +diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp +index d5ab8fb3b..5039c1987 100644 +--- a/libcxx/src/locale.cpp ++++ b/libcxx/src/locale.cpp +@@ -1145,6 +1145,8 @@ ctype::classic_table() noexcept + return __pctype_func(); + #elif defined(__EMSCRIPTEN__) + return *__ctype_b_loc(); ++#elif defined(__serenity__) ++ return _ctype_; + #elif defined(_NEWLIB_VERSION) + // Newlib has a 257-entry table in ctype_.c, where (char)0 starts at [1]. + return _ctype_ + 1; +diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake +index 0c3419390..75f8b552b 100644 +--- a/llvm/cmake/modules/HandleLLVMOptions.cmake ++++ b/llvm/cmake/modules/HandleLLVMOptions.cmake +@@ -228,11 +228,11 @@ endif() -diff --git a/libcxx/include/new b/libcxx/include/new -index 0562cef45..82f4ca8be 100644 ---- a/libcxx/include/new -+++ b/libcxx/include/new -@@ -301,6 +301,8 @@ inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate_unsized(void* __ptr, s - #endif - } + # Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise a DSO + # build might work on ELF but fail on MachO/COFF. +-if(NOT (CMAKE_SYSTEM_NAME MATCHES "Darwin|FreeBSD|OpenBSD|DragonFly|AIX|SunOS|OS390" OR +- WIN32 OR CYGWIN) AND +- NOT LLVM_USE_SANITIZER) +- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") +-endif() ++#if(NOT (CMAKE_SYSTEM_NAME MATCHES "Darwin|FreeBSD|OpenBSD|DragonFly|AIX|SunOS|OS390" OR ++# WIN32 OR CYGWIN) AND ++# NOT LLVM_USE_SANITIZER) ++# set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") ++#endif() -+#define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION -+ - #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) - // Low-level helpers to call the aligned allocation and deallocation functions - // on the target platform. This is used to implement libc++'s own memory -diff --git a/libcxx/include/string b/libcxx/include/string -index 687795c79..f3a216647 100644 ---- a/libcxx/include/string -+++ b/libcxx/include/string -@@ -1728,8 +1728,10 @@ _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char) - _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t) - #else - _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char) -+#ifndef __serenity__ - _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t) - #endif -+#endif - - - #ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES -@@ -4527,11 +4529,13 @@ inline namespace literals - return basic_string (__str, __len); - } - -+#ifndef __serenity__ - inline _LIBCPP_INLINE_VISIBILITY - basic_string operator "" s( const wchar_t *__str, size_t __len ) - { - return basic_string (__str, __len); - } -+#endif - - #ifndef _LIBCPP_NO_HAS_CHAR8_T - inline _LIBCPP_INLINE_VISIBILITY -diff --git a/libcxx/include/string_view b/libcxx/include/string_view -index bc0245cf2..55f9b62c4 100644 ---- a/libcxx/include/string_view -+++ b/libcxx/include/string_view -@@ -204,7 +204,9 @@ typedef basic_string_view u8string_view; - #endif - typedef basic_string_view u16string_view; - typedef basic_string_view u32string_view; -+#ifndef __serenity__ - typedef basic_string_view wstring_view; -+#endif - - template - class -@@ -214,7 +216,9 @@ class - #endif - _LIBCPP_PREFERRED_NAME(u16string_view) - _LIBCPP_PREFERRED_NAME(u32string_view) -+#ifndef __serenity__ - _LIBCPP_PREFERRED_NAME(wstring_view) -+#endif - basic_string_view { - public: - // types -@@ -836,11 +840,13 @@ inline namespace literals - return basic_string_view (__str, __len); - } - -+#ifndef __serenity__ - inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR - basic_string_view operator "" sv(const wchar_t *__str, size_t __len) _NOEXCEPT - { - return basic_string_view (__str, __len); - } -+#endif - - #ifndef _LIBCPP_NO_HAS_CHAR8_T - inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR -diff --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h -index b21a78968..ae20183ed 100644 ---- a/libcxx/include/wchar.h -+++ b/libcxx/include/wchar.h -@@ -132,6 +132,7 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len, - #endif - - #if defined(__cplusplus) && !defined(_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS) && defined(_LIBCPP_PREFERRED_OVERLOAD) -+#ifndef __serenity__ - extern "C++" { - inline _LIBCPP_INLINE_VISIBILITY - wchar_t* __libcpp_wcschr(const wchar_t* __s, wchar_t __c) {return (wchar_t*)wcschr(__s, __c);} -@@ -178,5 +179,6 @@ size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src, - size_t nwc, size_t len, mbstate_t *__restrict ps); - } // extern "C++" - #endif // __cplusplus && _LIBCPP_MSVCRT -+#endif - - #endif // _LIBCPP_WCHAR_H -diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp -index 5105594cf..ca85269db 100644 ---- a/libcxx/src/string.cpp -+++ b/libcxx/src/string.cpp -@@ -131,6 +131,7 @@ as_integer( const string& func, const string& s, size_t* idx, int base ) - return as_integer_helper( func, s, idx, base, strtoull ); - } - -+#ifndef __serenity__ - // wstring - template<> - inline -@@ -175,6 +176,7 @@ as_integer( const string& func, const wstring& s, size_t* idx, int base ) - { - return as_integer_helper( func, s, idx, base, wcstoull ); - } -+#endif - - // as_float - -@@ -226,6 +228,8 @@ as_float( const string& func, const string& s, size_t* idx ) - return as_float_helper( func, s, idx, strtold ); - } - -+ -+#ifndef __serenity__ - template<> - inline - float -@@ -249,6 +253,7 @@ as_float( const string& func, const wstring& s, size_t* idx ) - { - return as_float_helper( func, s, idx, wcstold ); - } -+#endif - - } // unnamed namespace - -@@ -258,11 +263,13 @@ stoi(const string& str, size_t* idx, int base) - return as_integer( "stoi", str, idx, base ); - } - -+#ifndef __serenity__ - int - stoi(const wstring& str, size_t* idx, int base) - { - return as_integer( "stoi", str, idx, base ); - } -+#endif - - long - stol(const string& str, size_t* idx, int base) -@@ -270,11 +277,13 @@ stol(const string& str, size_t* idx, int base) - return as_integer( "stol", str, idx, base ); - } - -+#ifndef __serenity__ - long - stol(const wstring& str, size_t* idx, int base) - { - return as_integer( "stol", str, idx, base ); - } -+#endif - - unsigned long - stoul(const string& str, size_t* idx, int base) -@@ -282,11 +291,13 @@ stoul(const string& str, size_t* idx, int base) - return as_integer( "stoul", str, idx, base ); - } - -+#ifndef __serenity__ - unsigned long - stoul(const wstring& str, size_t* idx, int base) - { - return as_integer( "stoul", str, idx, base ); - } -+#endif - - long long - stoll(const string& str, size_t* idx, int base) -@@ -294,11 +305,13 @@ stoll(const string& str, size_t* idx, int base) - return as_integer( "stoll", str, idx, base ); - } - -+#ifndef __serenity__ - long long - stoll(const wstring& str, size_t* idx, int base) - { - return as_integer( "stoll", str, idx, base ); - } -+#endif - - unsigned long long - stoull(const string& str, size_t* idx, int base) -@@ -306,11 +319,13 @@ stoull(const string& str, size_t* idx, int base) - return as_integer( "stoull", str, idx, base ); - } - -+#ifndef __serenity__ - unsigned long long - stoull(const wstring& str, size_t* idx, int base) - { - return as_integer( "stoull", str, idx, base ); - } -+#endif - - float - stof(const string& str, size_t* idx) -@@ -318,11 +333,13 @@ stof(const string& str, size_t* idx) - return as_float( "stof", str, idx ); - } - -+#ifndef __serenity__ - float - stof(const wstring& str, size_t* idx) - { - return as_float( "stof", str, idx ); - } -+#endif - - double - stod(const string& str, size_t* idx) -@@ -330,11 +347,13 @@ stod(const string& str, size_t* idx) - return as_float( "stod", str, idx ); - } - -+#ifndef __serenity__ - double - stod(const wstring& str, size_t* idx) - { - return as_float( "stod", str, idx ); - } -+#endif - - long double - stold(const string& str, size_t* idx) -@@ -342,11 +361,13 @@ stold(const string& str, size_t* idx) - return as_float( "stold", str, idx ); - } - -+#ifndef __serenity__ - long double - stold(const wstring& str, size_t* idx) - { - return as_float( "stold", str, idx ); - } -+#endif - - // to_string - -@@ -397,6 +418,7 @@ struct initial_string - } - }; - -+#ifndef __serenity__ - template <> - struct initial_string - { -@@ -408,7 +430,9 @@ struct initial_string - return s; - } - }; -+#endif - -+#ifndef __serenity__ - typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...); - - inline -@@ -421,6 +445,7 @@ get_swprintf() - return static_cast(_snwprintf); - #endif - } -+#endif - - template - S i_to_string(const V v) -@@ -444,20 +469,24 @@ string to_string (unsigned val) { return i_to_string< string>(val); } - string to_string (unsigned long val) { return i_to_string< string>(val); } - string to_string (unsigned long long val) { return i_to_string< string>(val); } - -+#ifndef __serenity__ - wstring to_wstring(int val) { return i_to_string(val); } - wstring to_wstring(long val) { return i_to_string(val); } - wstring to_wstring(long long val) { return i_to_string(val); } - wstring to_wstring(unsigned val) { return i_to_string(val); } - wstring to_wstring(unsigned long val) { return i_to_string(val); } - wstring to_wstring(unsigned long long val) { return i_to_string(val); } -+#endif - - - string to_string (float val) { return as_string(snprintf, initial_string< string>()(), "%f", val); } - string to_string (double val) { return as_string(snprintf, initial_string< string>()(), "%f", val); } - string to_string (long double val) { return as_string(snprintf, initial_string< string>()(), "%Lf", val); } - -+#ifndef __serenity__ - wstring to_wstring(float val) { return as_string(get_swprintf(), initial_string()(), L"%f", val); } - wstring to_wstring(double val) { return as_string(get_swprintf(), initial_string()(), L"%f", val); } - wstring to_wstring(long double val) { return as_string(get_swprintf(), initial_string()(), L"%Lf", val); } -+#endif - - _LIBCPP_END_NAMESPACE_STD -diff --git a/libunwind/src/AddressSpace.hpp b/libunwind/src/AddressSpace.hpp -index 171318ff6..aa7345a19 100644 ---- a/libunwind/src/AddressSpace.hpp -+++ b/libunwind/src/AddressSpace.hpp -@@ -24,7 +24,7 @@ - #include "Registers.hpp" - - #ifndef _LIBUNWIND_USE_DLADDR -- #if !defined(_LIBUNWIND_IS_BAREMETAL) && !defined(_WIN32) -+ #if !defined(_LIBUNWIND_IS_BAREMETAL) && !defined(_WIN32) && !defined(__serenity__) - #define _LIBUNWIND_USE_DLADDR 1 - #else - #define _LIBUNWIND_USE_DLADDR 0 + # Pass -Wl,-z,nodelete. This makes sure our shared libraries are not unloaded + # by dlclose(). We need that since the CLI API relies on cross-references diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h -index eed315c92..11e53b8ac 100644 +index 76f351405..b81556c55 100644 --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h -@@ -198,7 +198,8 @@ public: +@@ -199,7 +199,8 @@ public: Hurd, // GNU/Hurd WASI, // Experimental WebAssembly OS Emscripten, @@ -883,7 +706,7 @@ index eed315c92..11e53b8ac 100644 }; enum EnvironmentType { UnknownEnvironment, -@@ -626,6 +627,11 @@ public: +@@ -628,6 +629,11 @@ public: return getOS() == Triple::AIX; } @@ -895,24 +718,11 @@ index eed315c92..11e53b8ac 100644 /// Tests whether the OS uses the ELF binary format. bool isOSBinFormatELF() const { return getObjectFormat() == Triple::ELF; -diff --git a/llvm/include/llvm/Support/SwapByteOrder.h b/llvm/include/llvm/Support/SwapByteOrder.h -index e8612ba66..f0109f4b3 100644 ---- a/llvm/include/llvm/Support/SwapByteOrder.h -+++ b/llvm/include/llvm/Support/SwapByteOrder.h -@@ -22,7 +22,7 @@ - #endif - - #if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) || \ -- defined(__Fuchsia__) || defined(__EMSCRIPTEN__) -+ defined(__Fuchsia__) || defined(__EMSCRIPTEN__) || defined(__serenity__) - #include - #elif defined(_AIX) - #include diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp -index 4f483c965..bdbda22c9 100644 +index 883115463..22b39d8f5 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp -@@ -215,6 +215,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { +@@ -218,6 +218,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { case PS4: return "ps4"; case RTEMS: return "rtems"; case Solaris: return "solaris"; @@ -920,7 +730,7 @@ index 4f483c965..bdbda22c9 100644 case TvOS: return "tvos"; case WASI: return "wasi"; case WatchOS: return "watchos"; -@@ -531,6 +532,7 @@ static Triple::OSType parseOS(StringRef OSName) { +@@ -538,6 +539,7 @@ static Triple::OSType parseOS(StringRef OSName) { .StartsWith("hurd", Triple::Hurd) .StartsWith("wasi", Triple::WASI) .StartsWith("emscripten", Triple::Emscripten) @@ -928,3 +738,38 @@ index 4f483c965..bdbda22c9 100644 .Default(Triple::UnknownOS); } +diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt +index 1ffce323d..552521192 100644 +--- a/runtimes/CMakeLists.txt ++++ b/runtimes/CMakeLists.txt +@@ -58,17 +58,28 @@ if(compiler_rt_path) + endif() + endif() + ++# If building standalone by pointing CMake at this runtimes directory, ++# LLVM_BINARY_DIR isn't set, find_package(LLVM) will fail and these ++# intermediate paths are unset. ++if (LLVM_BINARY_DIR STREQUAL "") ++ set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) ++endif() ++if (NOT LLVM_FOUND) ++ set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin) ++ set(LLVM_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib) ++endif() ++ + # Setting these variables will allow the sub-build to put their outputs into + # the library and bin directories of the top-level build. + set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR}) + set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR}) + + # This variable makes sure that e.g. llvm-lit is found. +-set(LLVM_MAIN_SRC_DIR ${LLVM_BUILD_MAIN_SRC_DIR}) ++set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../llvm) + set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules) + + # This variable is used by individual runtimes to locate LLVM files. +-set(LLVM_PATH ${LLVM_BUILD_MAIN_SRC_DIR}) ++set(LLVM_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../llvm) + + if(APPLE) + set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index 31f46e3de27..8fef87b03ef 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -42,7 +42,8 @@ add_executable(Loader.so ${SOURCES}) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_libraries(Loader.so PRIVATE gcc) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang$") - target_link_libraries(Loader.so PRIVATE "clang_rt.builtins-${SERENITY_CLANG_ARCH}") + target_link_libraries(Loader.so PRIVATE clang_rt.builtins) endif () + target_link_options(Loader.so PRIVATE LINKER:--no-dynamic-linker) install(TARGETS Loader.so RUNTIME DESTINATION usr/lib/)