[lld] f21c35d - [ELF] Replace some Fatal with Err
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 25 17:29:34 PST 2025
Author: Fangrui Song
Date: 2025-01-25T17:29:28-08:00
New Revision: f21c35d54f8f7af9d0c64b566cabbc4f796a54df
URL: https://github.com/llvm/llvm-project/commit/f21c35d54f8f7af9d0c64b566cabbc4f796a54df
DIFF: https://github.com/llvm/llvm-project/commit/f21c35d54f8f7af9d0c64b566cabbc4f796a54df.diff
LOG: [ELF] Replace some Fatal with Err
In LLD_IN_TEST=2 mode, when a thread calls Fatal, there will be no
output even if the process exits with code 1. Change a few Fatal to
recoverable Err.
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/InputFiles.cpp
lld/ELF/Relocations.cpp
lld/test/ELF/invalid/section-index.test
lld/test/ELF/invalid/symbol-name.test
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index c0a27b3939a54a..770163f4de0860 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2425,8 +2425,10 @@ static void findKeepUniqueSections(Ctx &ctx, opt::InputArgList &args) {
unsigned size;
const char *err = nullptr;
uint64_t symIndex = decodeULEB128(cur, &size, contents.end(), &err);
- if (err)
- Fatal(ctx) << f << ": could not decode addrsig section: " << err;
+ if (err) {
+ Err(ctx) << f << ": could not decode addrsig section: " << err;
+ break;
+ }
markAddrsig(icfSafe, syms[symIndex]);
cur += size;
}
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index b29c7db879fa01..e236057a0d6d19 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -921,17 +921,18 @@ static void readGnuProperty(Ctx &ctx, const InputSection &sec,
using Elf_Note = typename ELFT::Note;
ArrayRef<uint8_t> data = sec.content();
- auto reportFatal = [&](const uint8_t *place, const Twine &msg) {
- Fatal(ctx) << sec.file << ":(" << sec.name << "+0x"
- << Twine::utohexstr(place - sec.content().data())
- << "): " << msg;
+ auto err = [&](const uint8_t *place) -> ELFSyncStream {
+ auto diag = Err(ctx);
+ diag << sec.file << ":(" << sec.name << "+0x"
+ << Twine::utohexstr(place - sec.content().data()) << "): ";
+ return diag;
};
while (!data.empty()) {
// Read one NOTE record.
auto *nhdr = reinterpret_cast<const Elf_Nhdr *>(data.data());
if (data.size() < sizeof(Elf_Nhdr) ||
data.size() < nhdr->getSize(sec.addralign))
- reportFatal(data.data(), "data is too short");
+ return void(err(data.data()) << "data is too short");
Elf_Note note(*nhdr);
if (nhdr->n_type != NT_GNU_PROPERTY_TYPE_0 || note.getName() != "GNU") {
@@ -948,30 +949,32 @@ static void readGnuProperty(Ctx &ctx, const InputSection &sec,
while (!desc.empty()) {
const uint8_t *place = desc.data();
if (desc.size() < 8)
- reportFatal(place, "program property is too short");
+ return void(err(place) << "program property is too short");
uint32_t type = read32<ELFT::Endianness>(desc.data());
uint32_t size = read32<ELFT::Endianness>(desc.data() + 4);
desc = desc.slice(8);
if (desc.size() < size)
- reportFatal(place, "program property is too short");
+ return void(err(place) << "program property is too short");
if (type == featureAndType) {
// We found a FEATURE_1_AND field. There may be more than one of these
// in a .note.gnu.property section, for a relocatable object we
// accumulate the bits set.
if (size < 4)
- reportFatal(place, "FEATURE_1_AND entry is too short");
+ return void(err(place) << "FEATURE_1_AND entry is too short");
f.andFeatures |= read32<ELFT::Endianness>(desc.data());
} else if (ctx.arg.emachine == EM_AARCH64 &&
type == GNU_PROPERTY_AARCH64_FEATURE_PAUTH) {
if (!f.aarch64PauthAbiCoreInfo.empty()) {
- reportFatal(data.data(),
- "multiple GNU_PROPERTY_AARCH64_FEATURE_PAUTH entries are "
- "not supported");
+ return void(
+ err(data.data())
+ << "multiple GNU_PROPERTY_AARCH64_FEATURE_PAUTH entries are "
+ "not supported");
} else if (size != 16) {
- reportFatal(data.data(), "GNU_PROPERTY_AARCH64_FEATURE_PAUTH entry "
- "is invalid: expected 16 bytes, but got " +
- Twine(size));
+ return void(err(data.data())
+ << "GNU_PROPERTY_AARCH64_FEATURE_PAUTH entry "
+ "is invalid: expected 16 bytes, but got "
+ << size);
}
f.aarch64PauthAbiCoreInfo = desc;
}
@@ -1173,8 +1176,10 @@ void ObjFile<ELFT>::initSectionsAndLocalSyms(bool ignoreComdats) {
secIdx = check(getExtendedSymbolTableIndex<ELFT>(eSym, i, shndxTable));
else if (secIdx >= SHN_LORESERVE)
secIdx = 0;
- if (LLVM_UNLIKELY(secIdx >= sections.size()))
- Fatal(ctx) << this << ": invalid section index: " << secIdx;
+ if (LLVM_UNLIKELY(secIdx >= sections.size())) {
+ Err(ctx) << this << ": invalid section index: " << secIdx;
+ secIdx = 0;
+ }
if (LLVM_UNLIKELY(eSym.getBinding() != STB_LOCAL))
ErrAlways(ctx) << this << ": non-local symbol (" << i
<< ") found at index < .symtab's sh_info (" << end << ")";
@@ -1183,9 +1188,12 @@ void ObjFile<ELFT>::initSectionsAndLocalSyms(bool ignoreComdats) {
uint8_t type = eSym.getType();
if (type == STT_FILE)
sourceFile = CHECK2(eSym.getName(stringTable), this);
- if (LLVM_UNLIKELY(stringTable.size() <= eSym.st_name))
- Fatal(ctx) << this << ": invalid symbol name offset";
- StringRef name(stringTable.data() + eSym.st_name);
+ unsigned stName = eSym.st_name;
+ if (LLVM_UNLIKELY(stringTable.size() <= stName)) {
+ Err(ctx) << this << ": invalid symbol name offset";
+ stName = 0;
+ }
+ StringRef name(stringTable.data() + stName);
symbols[i] = reinterpret_cast<Symbol *>(locals + i);
if (eSym.st_shndx == SHN_UNDEF || sec == &InputSection::discarded)
@@ -1236,8 +1244,10 @@ template <class ELFT> void ObjFile<ELFT>::postParse() {
secIdx = 0;
}
- if (LLVM_UNLIKELY(secIdx >= sections.size()))
- Fatal(ctx) << this << ": invalid section index: " << secIdx;
+ if (LLVM_UNLIKELY(secIdx >= sections.size())) {
+ Err(ctx) << this << ": invalid section index: " << secIdx;
+ continue;
+ }
InputSectionBase *sec = sections[secIdx];
if (sec == &InputSection::discarded) {
if (sym.traced) {
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 76b151b93d5179..629702b45965b9 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -428,8 +428,10 @@ class OffsetGetter {
if (j == fdes.begin() || j[-1].inputOff + j[-1].size <= off) {
while (i != cies.end() && i->inputOff <= off)
++i;
- if (i == cies.begin() || i[-1].inputOff + i[-1].size <= off)
- Fatal(ctx) << ".eh_frame: relocation is not in any piece";
+ if (i == cies.begin() || i[-1].inputOff + i[-1].size <= off) {
+ Err(ctx) << ".eh_frame: relocation is not in any piece";
+ return 0;
+ }
it = i;
}
diff --git a/lld/test/ELF/invalid/section-index.test b/lld/test/ELF/invalid/section-index.test
index cc8c6d067265a8..370597b7b7a2d0 100644
--- a/lld/test/ELF/invalid/section-index.test
+++ b/lld/test/ELF/invalid/section-index.test
@@ -3,6 +3,7 @@
# RUN: yaml2obj %s -o %t1.o
# RUN: not ld.lld %t1.o -o /dev/null 2>&1 | FileCheck %s
+# RUN: ld.lld %t1.o -o /dev/null --noinhibit-exec 2>&1 | FileCheck %s
# CHECK: {{.*}}1.o: invalid section index: 256
!ELF
diff --git a/lld/test/ELF/invalid/symbol-name.test b/lld/test/ELF/invalid/symbol-name.test
index 1ae76f0bd81e76..73284a1b9b8423 100644
--- a/lld/test/ELF/invalid/symbol-name.test
+++ b/lld/test/ELF/invalid/symbol-name.test
@@ -1,5 +1,6 @@
# RUN: yaml2obj %s -o %t.o
# RUN: not ld.lld %t.o -o /dev/null 2>&1 | FileCheck %s
+# RUN: ld.lld %t.o -o /dev/null --noinhibit-exec
# CHECK: error: {{.*}}.o: invalid symbol name offset
## YAML below contains symbol with name offset in st_name
More information about the llvm-commits
mailing list