llvm_ir_strip () {
    mkdir -pv "$SRCDIR"/strip-tmp
    cat << 'EOF' > "$SRCDIR"/strip-tmp/build.ninja
rule ir-strip
  command = TMPDIR="$$(mktemp -d)" && cd "$$TMPDIR" && llvm-ar x "$in" && for i in *.o; do if llvm-bcanalyzer "$$i" > /dev/null; then echo "-- Removing debug markers in $$i"; opt --strip-debug "$$i" -o "$$i"; fi done && llvm-ar rcs "$out" *.o && rm -rf "$$TMPDIR"
  description = Stripping $in ...

EOF
    abinfo "Removing installed LTO archives ..."
    rm -v "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/*.a
    abinfo "Generating stripping scripts ..."
    for i in "$SRCDIR"/fakeroot/usr/lib/llvm-${PKGVER%%.*}/lib/*.a; do
        local outfile="$(basename "$i")"
        printf "build $PKGDIR/usr/lib/llvm-${PKGVER%%.*}/lib/$outfile: ir-strip $i\n\n" >> "$SRCDIR"/strip-tmp/build.ninja
    done
    abinfo "Executing LLVM IR stripping scripts ..."
    ninja -C "$SRCDIR"/strip-tmp/
}

abinfo "Installing all files from LLVM ..."
mkdir -pv "$PKGDIR"
cp -arv "$SRCDIR"/fakeroot/* \
    "$PKGDIR"/

if [[ "$NOLTO" = 0 ]]; then
    abinfo "Preparing for LLVM IR strip in LTO archives ..."
    llvm_ir_strip
else
    abinfo "Dropping executable bit from static libraries ..."
    chmod -v 644 "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/*.a
fi

abinfo "Installing clang-analyzer ..."
install -dvm755 "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/clang-analyzer
for prog in scan-build scan-view; do
    cp -rfv "$SRCDIR"/../clang/tools/$prog \
        "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/clang-analyzer/
    ln -sfv ../lib/clang-analyzer/$prog/bin/$prog \
        "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/bin/
done
ln -sfv ../../../bin/clang \
    "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/clang-analyzer/scan-build/

abinfo "Dropping runtime libraries ..."
rm -v "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/lib{clang,LLVM,LTO}*.so*
rm -v "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/LLVMgold.so
# FIXME: Broken ld.lld => no extra runtime library may be built.
if ! ab_match_arch loongson3; then
    rm -v "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/lib{unwind,c++}*.so*
fi

abinfo "Stripping static libraries ..."
strip \
    --verbose \
    --strip-debug \
    --enable-deterministic-archives \
    --remove-section=.comment \
    --remove-section=.note \
    "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/*.a

abinfo "Making compatible version symlinks ..."
ln -sv "${PKGVER%%.*}" \
    "$PKGDIR"/usr/lib/llvm-${PKGVER%%.*}/lib/clang/"${PKGVER}"

# FIXME: Chromium would fail to detect Clang prefix unless a full absolute
# path to the compilers were set. Debian creates a symlink:
#
#   /usr/lib/clang/${PKGVER%%.*}
#       => /usr/lib/llvm-${PKGVER%%.*}/lib/clang/${PKGVER%%.*}
#
# to counteract this - not sure if needed anywhere else but create this
# symlink just to be safe.
abinfo "Making Clang prefix symlinks ..."
mkdir -pv "$PKGDIR"/usr/lib/clang
ln -sv ../llvm-${PKGVER%%.*}/lib/clang/${PKGVER%%.*} \
    "$PKGDIR"/usr/lib/clang/${PKGVER%%.*}

abinfo "Creating versioned executable symlinks ..."
mkdir -pv "$PKGDIR"/usr/bin
cd "$PKGDIR"/usr/bin
for i in ../lib/llvm-${PKGVER%%.*}/bin/*; do 
    ln -sv $i $(basename $i)-${PKGVER%%.*}
done
# Note: Remove double-suffixed executables.
rm -v "$PKGDIR"/usr/bin/*-${PKGVER%%.*}-${PKGVER%%.*}

# FIXME: https://github.com/llvm/llvm-project/issues/135476
abinfo "Workaround mis-installed fuzzer libcxx ..."
if [[ -e "$PKGDIR"/var/cache/acbs/build ]]; then
    rm -vrf "$PKGDIR"/var/cache/acbs/build
fi
rm -vdf "$PKGDIR"/var/cache/acbs
rm -vdf "$PKGDIR"/var/cache
rm -vdf "$PKGDIR"/var
