From 8373a2dc8bbb73b359e3d63b966582f5340b7071 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 14 Jul 2022 11:36:09 -0700 Subject: [PATCH 1/5] Create and link against libllvmlibc-sparse Using musl solved our static linking woes, but introduced performance regressions. Specifically, calls to memset, memcpy, memcmp, and strlen became more noticeable in profiles. Build llvmlibc, extract the .o files from the .a for those 4, repack them in a new .a, then link against that. llvmlibc's strlen isn't measurably better, but the author is aware and interested in fixing. Fixes #39 --- ...ix-build-when-__FE_DENORM-is-defined.patch | 49 +++++++++++++++++++ llvm-project/Dockerfile.epoch3 | 21 ++++++++ llvm-project/build_sparse_libc.sh | 8 +++ llvm-project/stage3.cmake | 2 +- 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 llvm-project/0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch create mode 100755 llvm-project/build_sparse_libc.sh diff --git a/llvm-project/0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch b/llvm-project/0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch new file mode 100644 index 0000000..8d7ef53 --- /dev/null +++ b/llvm-project/0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch @@ -0,0 +1,49 @@ +From 122da690b39a67cd6e6bce4b9ad3ac1470cc1ed5 Mon Sep 17 00:00:00 2001 +From: Alex Brachet +Date: Wed, 8 Jun 2022 16:21:53 +0000 +Subject: [PATCH] [libc] Fix build when __FE_DENORM is defined + +[nd: drop hunk that doesn't apply to 14.0.1 due to missing + commit 805899e68a83 ("[libc] Change FEnv to use MXCSR as source of truth")] + +Differential revision: https://reviews.llvm.org/D127222 +--- + libc/src/__support/FPUtil/x86_64/FEnvImpl.h | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/libc/src/__support/FPUtil/x86_64/FEnvImpl.h b/libc/src/__support/FPUtil/x86_64/FEnvImpl.h +index 846996ec93af..6bac3e9e6a0f 100644 +--- a/libc/src/__support/FPUtil/x86_64/FEnvImpl.h ++++ b/libc/src/__support/FPUtil/x86_64/FEnvImpl.h +@@ -73,7 +73,7 @@ static inline uint16_t get_status_value_for_except(int excepts) { + // bit flags in the control registers. + return (excepts & FE_INVALID ? ExceptionFlags::INVALID : 0) | + #ifdef __FE_DENORM +- (excepts & __FE_DENORM ? ExceptionFlags::Denormal : 0) | ++ (excepts & __FE_DENORM ? ExceptionFlags::DENORMAL : 0) | + #endif // __FE_DENORM + (excepts & FE_DIVBYZERO ? ExceptionFlags::DIV_BY_ZERO : 0) | + (excepts & FE_OVERFLOW ? ExceptionFlags::OVERFLOW : 0) | +@@ -84,7 +84,7 @@ static inline uint16_t get_status_value_for_except(int excepts) { + static inline int exception_status_to_macro(uint16_t status) { + return (status & ExceptionFlags::INVALID ? FE_INVALID : 0) | + #ifdef __FE_DENORM +- (status & ExceptionFlags::Denormal ? __FE_DENORM : 0) | ++ (status & ExceptionFlags::DENORMAL ? __FE_DENORM : 0) | + #endif // __FE_DENORM + (status & ExceptionFlags::DIV_BY_ZERO ? FE_DIVBYZERO : 0) | + (status & ExceptionFlags::OVERFLOW ? FE_OVERFLOW : 0) | +@@ -273,8 +273,8 @@ static inline int raise_except(int excepts) { + if (status_value & internal::ExceptionFlags::INEXACT) + raise_helper(internal::ExceptionFlags::INEXACT); + #ifdef __FE_DENORM +- if (statusValue & internal::ExceptionFlags::Denormal) { +- raiseHelper(internal::ExceptionFlags::Denormal); ++ if (status_value & internal::ExceptionFlags::DENORMAL) { ++ raise_helper(internal::ExceptionFlags::DENORMAL); + } + #endif // __FE_DENORM + +-- +2.37.0.144.g8ac04bfd2-goog + diff --git a/llvm-project/Dockerfile.epoch3 b/llvm-project/Dockerfile.epoch3 index 6752f25..4afef5b 100644 --- a/llvm-project/Dockerfile.epoch3 +++ b/llvm-project/Dockerfile.epoch3 @@ -80,6 +80,11 @@ RUN tar xf llvm-project-14.0.1.src.tar.xz && \ mv llvm-project-14.0.1.src llvm-project RUN apk add cmake ninja python3 COPY stage3.cmake llvm-project/. +COPY 0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch llvm-project/. +RUN apk add patch +RUN cd llvm-project && \ + patch -p1 < 0001-libc-Fix-build-when-__FE_DENORM-is-defined.patch +RUN apk del patch ARG LLVM_BUILD_DIR=llvm-project/llvm/build RUN cmake \ -B ${LLVM_BUILD_DIR} \ @@ -87,6 +92,22 @@ RUN cmake \ -D LLVM_DEFAULT_TARGET_TRIPLE=$(clang -print-target-triple) \ -S llvm-project/llvm \ -G Ninja + +RUN ninja -C ${LLVM_BUILD_DIR} llvmlibc +COPY build_sparse_libc.sh ${LLVM_BUILD_DIR}/. +RUN cd ${LLVM_BUILD_DIR} && \ + ./build_sparse_libc.sh && \ + mv libllvmlibc-sparse.a /sysroot/usr/lib/. + +RUN cmake \ + -B ${LLVM_BUILD_DIR} \ + -C llvm-project/stage3.cmake \ + -D LLVM_DEFAULT_TARGET_TRIPLE=$(clang -print-target-triple) \ + -S llvm-project/llvm \ + -D CMAKE_EXE_LINKER_FLAGS="-static -lc++abi -ljemalloc -lllvmlibc-sparse -Wl,--allow-multiple-definition" \ + -G Ninja +#RUN ninja -C ${LLVM_BUILD_DIR} llvm-tblgen +#RUN llvm-objdump -dr --disassemble-symbols=strlen llvm-project/llvm/build/bin/llvm-tblgen RUN ninja -C ${LLVM_BUILD_DIR} install-clang install-lld RUN ninja -C ${LLVM_BUILD_DIR} install-clang-resource-headers RUN ninja -C ${LLVM_BUILD_DIR} \ diff --git a/llvm-project/build_sparse_libc.sh b/llvm-project/build_sparse_libc.sh new file mode 100755 index 0000000..ba9b64c --- /dev/null +++ b/llvm-project/build_sparse_libc.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +LLVM_LIBC=$(find . -name libllvmlibc.a) +for i in strlen memcmp memset memcpy; do + llvm-ar x ${LLVM_LIBC} $i.cpp.o +done +rm -f libllvmlibc-sparse.a +llvm-ar qc libllvmlibc-sparse.a memcmp.cpp.o memcpy.cpp.o memset.cpp.o strlen.cpp.o diff --git a/llvm-project/stage3.cmake b/llvm-project/stage3.cmake index 4dedb42..4c30056 100644 --- a/llvm-project/stage3.cmake +++ b/llvm-project/stage3.cmake @@ -47,7 +47,7 @@ set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") set(LLVM_ENABLE_LLD ON CACHE BOOL "") # Build clang, lld, and compiler-rt. -set(LLVM_ENABLE_PROJECTS "clang;lld;compiler-rt" CACHE STRING "") +set(LLVM_ENABLE_PROJECTS "clang;lld;compiler-rt;libc" CACHE STRING "") # FORCE_ON causes the build to fail if zlib is not found in the environment # during configuration, rather than much later during link. From 16299fb4c98e20610e751bf3f669a3b3078e9d65 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 14 Jul 2022 13:07:10 -0700 Subject: [PATCH 2/5] appease shellcheck --- llvm-project/build_sparse_libc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm-project/build_sparse_libc.sh b/llvm-project/build_sparse_libc.sh index ba9b64c..ce9dbaf 100755 --- a/llvm-project/build_sparse_libc.sh +++ b/llvm-project/build_sparse_libc.sh @@ -2,7 +2,7 @@ LLVM_LIBC=$(find . -name libllvmlibc.a) for i in strlen memcmp memset memcpy; do - llvm-ar x ${LLVM_LIBC} $i.cpp.o + llvm-ar x "${LLVM_LIBC}" $i.cpp.o done rm -f libllvmlibc-sparse.a llvm-ar qc libllvmlibc-sparse.a memcmp.cpp.o memcpy.cpp.o memset.cpp.o strlen.cpp.o From be1d8dfc08bf849d34f78811d00c1fe2c90aa5a4 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 14 Jul 2022 14:02:31 -0700 Subject: [PATCH 3/5] remove commented out debugging lines --- llvm-project/Dockerfile.epoch3 | 2 -- 1 file changed, 2 deletions(-) diff --git a/llvm-project/Dockerfile.epoch3 b/llvm-project/Dockerfile.epoch3 index 4afef5b..229e1ea 100644 --- a/llvm-project/Dockerfile.epoch3 +++ b/llvm-project/Dockerfile.epoch3 @@ -106,8 +106,6 @@ RUN cmake \ -S llvm-project/llvm \ -D CMAKE_EXE_LINKER_FLAGS="-static -lc++abi -ljemalloc -lllvmlibc-sparse -Wl,--allow-multiple-definition" \ -G Ninja -#RUN ninja -C ${LLVM_BUILD_DIR} llvm-tblgen -#RUN llvm-objdump -dr --disassemble-symbols=strlen llvm-project/llvm/build/bin/llvm-tblgen RUN ninja -C ${LLVM_BUILD_DIR} install-clang install-lld RUN ninja -C ${LLVM_BUILD_DIR} install-clang-resource-headers RUN ninja -C ${LLVM_BUILD_DIR} \ From 6b3ca6d09df77f15ebf4e767caddb43f161f11be Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 14 Jul 2022 14:03:29 -0700 Subject: [PATCH 4/5] shfmt appeasement --- llvm-project/build_sparse_libc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm-project/build_sparse_libc.sh b/llvm-project/build_sparse_libc.sh index ce9dbaf..426be56 100755 --- a/llvm-project/build_sparse_libc.sh +++ b/llvm-project/build_sparse_libc.sh @@ -2,7 +2,7 @@ LLVM_LIBC=$(find . -name libllvmlibc.a) for i in strlen memcmp memset memcpy; do - llvm-ar x "${LLVM_LIBC}" $i.cpp.o + llvm-ar x "${LLVM_LIBC}" $i.cpp.o done rm -f libllvmlibc-sparse.a llvm-ar qc libllvmlibc-sparse.a memcmp.cpp.o memcpy.cpp.o memset.cpp.o strlen.cpp.o From ee00a4de1e6aa8c9d07c0048b463be50d177ce4d Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 14 Jul 2022 14:03:54 -0700 Subject: [PATCH 5/5] update comment --- llvm-project/stage3.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm-project/stage3.cmake b/llvm-project/stage3.cmake index 4c30056..c7335e3 100644 --- a/llvm-project/stage3.cmake +++ b/llvm-project/stage3.cmake @@ -46,7 +46,7 @@ set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") # Use lld from stage2. set(LLVM_ENABLE_LLD ON CACHE BOOL "") -# Build clang, lld, and compiler-rt. +# Build clang, lld, compiler-rt, and libc. set(LLVM_ENABLE_PROJECTS "clang;lld;compiler-rt;libc" CACHE STRING "") # FORCE_ON causes the build to fail if zlib is not found in the environment