[compiler-rt] 2030e64 - Avoid ar_to_bc.sh script in symbolizer build; add -ignore-non-bitcode flag to llvm-link

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 14:50:21 PDT 2022


Author: Matthias Braun
Date: 2022-06-28T14:49:35-07:00
New Revision: 2030e6496aaed3d38c9a2725a5ebec4a3264019c

URL: https://github.com/llvm/llvm-project/commit/2030e6496aaed3d38c9a2725a5ebec4a3264019c
DIFF: https://github.com/llvm/llvm-project/commit/2030e6496aaed3d38c9a2725a5ebec4a3264019c.diff

LOG: Avoid ar_to_bc.sh script in symbolizer build; add -ignore-non-bitcode flag to llvm-link

Remove the `ar_to_bc.sh` helper script in the compiler-rt symbolizer
build. Instead use `llvm-link` directly as D81109 introduced the
capability to read archives. I just needed to add a new flag
`-ignore-non-bitcode` to avoid `llvm-link` aborting when it found a
non-bitcode file in the archive.

Differential Revision: https://reviews.llvm.org/D128729

Added: 
    llvm/test/tools/llvm-link/archive-non-bitcode.ll

Modified: 
    compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh
    llvm/tools/llvm-link/llvm-link.cpp

Removed: 
    compiler-rt/lib/sanitizer_common/symbolizer/scripts/ar_to_bc.sh


################################################################################
diff  --git a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/ar_to_bc.sh b/compiler-rt/lib/sanitizer_common/symbolizer/scripts/ar_to_bc.sh
deleted file mode 100755
index 7b69539ec59da..0000000000000
--- a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/ar_to_bc.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-
-function usage() {
-  echo "Usage: $0 INPUT... OUTPUT"
-  exit 1
-}
-
-if [ "$#" -le 1 ]; then
-  usage
-fi
-
-[[ $AR == /* ]] || AR=$PWD/$AR
-[[ $LINK == /* ]] || LINK=$PWD/$LINK
-
-INPUTS=
-OUTPUT=
-for ARG in $@; do
-  INPUTS="$INPUTS $OUTPUT"
-  OUTPUT=$(readlink -f $ARG)
-done
-
-echo Inputs: $INPUTS
-echo Output: $OUTPUT
-
-SCRATCH_DIR=$(mktemp -d)
-ln -s $INPUTS $SCRATCH_DIR/
-
-pushd $SCRATCH_DIR
-
-for INPUT in *; do
-  for OBJ in $($AR t $INPUT); do
-    $AR x $INPUT $OBJ
-    if [[ $(file $OBJ) =~ 'LLVM IR bitcode' ]]; then
-      mv -f $OBJ $(basename $INPUT).$OBJ
-    else
-      # Skip $OBJ which may come from an assembly file (e.g. Support/BLAKE3/*.S).
-      rm -f $OBJ
-    fi
-  done
-done
-
-$LINK *.o -o $OUTPUT
-
-rm -rf $SCRATCH_DIR

diff  --git a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh b/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh
index 599f063b45c9b..af1a23348742b 100755
--- a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh
+++ b/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh
@@ -69,8 +69,8 @@ CC=$CLANG_DIR/clang
 CXX=$CLANG_DIR/clang++
 TBLGEN=$CLANG_DIR/llvm-tblgen
 OPT=$CLANG_DIR/opt
-export AR=$CLANG_DIR/llvm-ar
-export LINK=$CLANG_DIR/llvm-link
+AR=$CLANG_DIR/llvm-ar
+LINK=$CLANG_DIR/llvm-link
 TARGET_TRIPLE=$($CC -print-target-triple)
 
 for F in $CC $CXX $TBLGEN $LINK $OPT $AR; do
@@ -165,23 +165,23 @@ SYMBOLIZER_API_LIST+=,__sanitizer_symbolize_set_inline_frames
 LIBCXX_ARCHIVE_DIR=$(dirname $(find $LIBCXX_BUILD -name libc++.a | head -n1))
 
 # Merge all the object files together and copy the resulting library back.
-$SCRIPT_DIR/ar_to_bc.sh $LIBCXX_ARCHIVE_DIR/libc++.a \
-                        $LIBCXX_ARCHIVE_DIR/libc++abi.a \
-                        $LLVM_BUILD/lib/libLLVMSymbolize.a \
-                        $LLVM_BUILD/lib/libLLVMObject.a \
-                        $LLVM_BUILD/lib/libLLVMBinaryFormat.a \
-                        $LLVM_BUILD/lib/libLLVMDebugInfoDWARF.a \
-                        $LLVM_BUILD/lib/libLLVMSupport.a \
-                        $LLVM_BUILD/lib/libLLVMDebugInfoPDB.a \
-                        $LLVM_BUILD/lib/libLLVMDebugInfoMSF.a \
-                        $LLVM_BUILD/lib/libLLVMDebugInfoCodeView.a \
-                        $LLVM_BUILD/lib/libLLVMDebuginfod.a \
-                        $LLVM_BUILD/lib/libLLVMDemangle.a \
-                        $LLVM_BUILD/lib/libLLVMMC.a \
-                        $LLVM_BUILD/lib/libLLVMTextAPI.a \
-                        $ZLIB_BUILD/libz.a \
-                        symbolizer.a \
-                        all.bc
+$LINK $LIBCXX_ARCHIVE_DIR/libc++.a \
+      $LIBCXX_ARCHIVE_DIR/libc++abi.a \
+      $LLVM_BUILD/lib/libLLVMSymbolize.a \
+      $LLVM_BUILD/lib/libLLVMObject.a \
+      $LLVM_BUILD/lib/libLLVMBinaryFormat.a \
+      $LLVM_BUILD/lib/libLLVMDebugInfoDWARF.a \
+      $LLVM_BUILD/lib/libLLVMSupport.a \
+      $LLVM_BUILD/lib/libLLVMDebugInfoPDB.a \
+      $LLVM_BUILD/lib/libLLVMDebugInfoMSF.a \
+      $LLVM_BUILD/lib/libLLVMDebugInfoCodeView.a \
+      $LLVM_BUILD/lib/libLLVMDebuginfod.a \
+      $LLVM_BUILD/lib/libLLVMDemangle.a \
+      $LLVM_BUILD/lib/libLLVMMC.a \
+      $LLVM_BUILD/lib/libLLVMTextAPI.a \
+      $ZLIB_BUILD/libz.a \
+      symbolizer.a \
+      -ignore-non-bitcode -o all.bc
 
 echo "Optimizing..."
 $OPT -internalize -internalize-public-api-list=${SYMBOLIZER_API_LIST} all.bc -o opt.bc

diff  --git a/llvm/test/tools/llvm-link/archive-non-bitcode.ll b/llvm/test/tools/llvm-link/archive-non-bitcode.ll
new file mode 100644
index 0000000000000..631b03290c687
--- /dev/null
+++ b/llvm/test/tools/llvm-link/archive-non-bitcode.ll
@@ -0,0 +1,10 @@
+# RUN: llvm-as %S/Inputs/f.ll -o %t.f.bc
+# RUN: llvm-as %S/Inputs/g.ll -o %t.g.bc
+# RUN: echo "This is not a bitcode file" > %t.not_bitcode.txt
+# RUN: llvm-ar cr %t.a %t.f.bc %t.not_bitcode.txt %t.g.bc
+# RUN: llvm-ar cr --format=gnu %t.empty.lib
+# RUN: llvm-link -ignore-non-bitcode %t.a %t.empty.lib -o %t.linked.bc 2>&1 | FileCheck --check-prefix CHECK_IGNORE_NON_BITCODE %s
+# RUN: not llvm-link %t.a %t.empty.lib -o %t.linked2.bc 2>&1 | FileCheck --check-prefix CHECK_ERROR_BITCODE %s
+
+# CHECK_ERROR_BITCODE: error: member of archive is not a bitcode file
+# CHECK_IGNORE_NON_BITCODE-NOT: is not a bitcode file

diff  --git a/llvm/tools/llvm-link/llvm-link.cpp b/llvm/tools/llvm-link/llvm-link.cpp
index ee1cc0c093b90..6585b193b2cbc 100644
--- a/llvm/tools/llvm-link/llvm-link.cpp
+++ b/llvm/tools/llvm-link/llvm-link.cpp
@@ -124,6 +124,11 @@ static cl::opt<bool> NoVerify("disable-verify",
                               cl::desc("Do not run the verifier"), cl::Hidden,
                               cl::cat(LinkCategory));
 
+static cl::opt<bool> IgnoreNonBitcode(
+    "ignore-non-bitcode",
+    cl::desc("Do not report an error for non-bitcode files in archives"),
+    cl::Hidden);
+
 static ExitOnError ExitOnErr;
 
 // Read the specified bitcode file in and return it. This routine searches the
@@ -199,6 +204,8 @@ static std::unique_ptr<Module> loadArFile(const char *Argv0,
                        MemBuf.get().getBufferStart()),
                    reinterpret_cast<const unsigned char *>(
                        MemBuf.get().getBufferEnd()))) {
+      if (IgnoreNonBitcode)
+        continue;
       errs() << Argv0 << ": ";
       WithColor::error() << "  member of archive is not a bitcode file: '"
                          << ChildName << "'\n";


        


More information about the llvm-commits mailing list