diff --git a/CMakeLists.txt b/CMakeLists.txt index 515287c75d..f061bf10ee 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 f37e4cb3e9..4af539332f 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 c156ae4447..689e546c2d 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 f992c7c11a..9d32ca02e9 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 3dd09ceaf0..5ee609b39d 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 3a932c76ed..24394265b5 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 d4ce0a6f68..50351f2794 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 8afcfa2b36..f01392358a 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 0000000000..ee9cd36e59 --- /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 0000000000..cca7fc4949 --- /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 e44237acfe..ddf3004c8a 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 31f46e3de2..8fef87b03e 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/)