From c7bca45103e360ed9cb695d3db519f0639c898d3 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 5 Feb 2022 23:34:14 -0800 Subject: [PATCH] [ELF] Fix crash when an input is incompatible with a lazy object file The diagnostic is concise. It is ok because the case is rare. (cherry picked from commit bad1b7fbb0fec532f097ac59805562020f895962) --- lld/ELF/InputFiles.cpp | 11 +++++------ lld/test/ELF/incompatible-ar-first.s | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index b5510b3b27362..775999a5f534c 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -152,18 +152,17 @@ static bool isCompatible(InputFile *file) { return false; } - InputFile *existing; + InputFile *existing = nullptr; if (!objectFiles.empty()) existing = objectFiles[0]; else if (!sharedFiles.empty()) existing = sharedFiles[0]; else if (!bitcodeFiles.empty()) existing = bitcodeFiles[0]; - else - llvm_unreachable("Must have -m, OUTPUT_FORMAT or existing input file to " - "determine target emulation"); - - error(toString(file) + " is incompatible with " + toString(existing)); + std::string with; + if (existing) + with = " with " + toString(existing); + error(toString(file) + " is incompatible" + with); return false; } diff --git a/lld/test/ELF/incompatible-ar-first.s b/lld/test/ELF/incompatible-ar-first.s index e49171939513c..a82a55a39ed80 100644 --- a/lld/test/ELF/incompatible-ar-first.s +++ b/lld/test/ELF/incompatible-ar-first.s @@ -10,3 +10,6 @@ // * -m was not used. // CHECK: .a({{.*}}a.o) is incompatible with {{.*}}b.o +// RUN: not ld.lld --start-lib %ta.o --end-lib %tb.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK2 + +// CHECK2: {{.*}}b.o is incompatible{{$}}