[lld] r262626 - Simplify error handling.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 3 12:53:03 PST 2016


What do you think of the attached patch?

Cheers,
Rafael


On 3 March 2016 at 15:37, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:
> On 3 March 2016 at 15:28, Rui Ueyama <ruiu at google.com> wrote:
>> Maybe we should make all fatal functions noreturn functions, and rename
>> fatal to check if it may return?
>>
>
> Sounds reasonable. I will give it a try.
>
> Cheers,
> Rafael
-------------- next part --------------
diff --git a/ELF/Driver.cpp b/ELF/Driver.cpp
index a84c95e..e476d5d 100644
--- a/ELF/Driver.cpp
+++ b/ELF/Driver.cpp
@@ -71,14 +71,14 @@ static std::pair<ELFKind, uint16_t> parseEmulation(StringRef S) {
 // Each slice consists of a member file in the archive.
 static std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB) {
   std::unique_ptr<Archive> File =
-      fatal(Archive::create(MB), "Failed to parse archive");
+      check(Archive::create(MB), "Failed to parse archive");
 
   std::vector<MemoryBufferRef> V;
   for (const ErrorOr<Archive::Child> &COrErr : File->children()) {
-    Archive::Child C = fatal(COrErr, "Could not get the child of the archive " +
+    Archive::Child C = check(COrErr, "Could not get the child of the archive " +
                                          File->getFileName());
     MemoryBufferRef Mb =
-        fatal(C.getMemoryBufferRef(),
+        check(C.getMemoryBufferRef(),
               "Could not get the buffer for a child of the archive " +
                   File->getFileName());
     V.push_back(Mb);
diff --git a/ELF/Error.cpp b/ELF/Error.cpp
index 2835f56..9e42910 100644
--- a/ELF/Error.cpp
+++ b/ELF/Error.cpp
@@ -54,7 +54,7 @@ void fatal(const Twine &Msg, const Twine &Prefix) {
   fatal(Prefix + ": " + Msg);
 }
 
-void fatal(std::error_code EC) {
+void check(std::error_code EC) {
   if (EC)
     fatal(EC.message());
 }
diff --git a/ELF/Error.h b/ELF/Error.h
index 4416b62..6a56e3d 100644
--- a/ELF/Error.h
+++ b/ELF/Error.h
@@ -39,15 +39,15 @@ template <typename T> bool error(const ErrorOr<T> &V) {
 
 LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg);
 LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg, const Twine &Prefix);
-void fatal(std::error_code EC);
+void check(std::error_code EC);
 
-template <class T> T fatal(ErrorOr<T> EO) {
+template <class T> T check(ErrorOr<T> EO) {
   if (EO)
     return std::move(*EO);
   fatal(EO.getError().message());
 }
 
-template <class T> T fatal(ErrorOr<T> EO, const Twine &Prefix) {
+template <class T> T check(ErrorOr<T> EO, const Twine &Prefix) {
   if (EO)
     return std::move(*EO);
   fatal(EO.getError().message(), Prefix);
diff --git a/ELF/InputFiles.cpp b/ELF/InputFiles.cpp
index bfe3585..b4696b8 100644
--- a/ELF/InputFiles.cpp
+++ b/ELF/InputFiles.cpp
@@ -29,7 +29,7 @@ template <class ELFT>
 static ELFFile<ELFT> createELFObj(MemoryBufferRef MB) {
   std::error_code EC;
   ELFFile<ELFT> F(MB.getBuffer(), EC);
-  fatal(EC);
+  check(EC);
   return F;
 }
 
@@ -73,7 +73,7 @@ uint32_t ELFFileBase<ELFT>::getSectionIndex(const Elf_Sym &Sym) const {
 template <class ELFT> void ELFFileBase<ELFT>::initStringTable() {
   if (!Symtab)
     return;
-  StringTable = fatal(ELFObj.getStringTableForSymtab(*Symtab));
+  StringTable = check(ELFObj.getStringTableForSymtab(*Symtab));
 }
 
 template <class ELFT>
@@ -122,11 +122,11 @@ template <class ELFT>
 StringRef elf::ObjectFile<ELFT>::getShtGroupSignature(const Elf_Shdr &Sec) {
   const ELFFile<ELFT> &Obj = this->ELFObj;
   uint32_t SymtabdSectionIndex = Sec.sh_link;
-  const Elf_Shdr *SymtabSec = fatal(Obj.getSection(SymtabdSectionIndex));
+  const Elf_Shdr *SymtabSec = check(Obj.getSection(SymtabdSectionIndex));
   uint32_t SymIndex = Sec.sh_info;
   const Elf_Sym *Sym = Obj.getSymbol(SymtabSec, SymIndex);
-  StringRef StringTable = fatal(Obj.getStringTableForSymtab(*SymtabSec));
-  return fatal(Sym->getName(StringTable));
+  StringRef StringTable = check(Obj.getStringTableForSymtab(*SymtabSec));
+  return check(Sym->getName(StringTable));
 }
 
 template <class ELFT>
@@ -134,7 +134,7 @@ ArrayRef<typename elf::ObjectFile<ELFT>::uint32_X>
 elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
   const ELFFile<ELFT> &Obj = this->ELFObj;
   ArrayRef<uint32_X> Entries =
-      fatal(Obj.template getSectionContentsAsArray<uint32_X>(&Sec));
+      check(Obj.template getSectionContentsAsArray<uint32_X>(&Sec));
   if (Entries.empty() || Entries[0] != GRP_COMDAT)
     fatal("Unsupported SHT_GROUP format");
   return Entries.slice(1);
@@ -194,7 +194,7 @@ void elf::ObjectFile<ELFT>::initializeSections(
       this->Symtab = &Sec;
       break;
     case SHT_SYMTAB_SHNDX:
-      this->SymtabSHNDX = fatal(Obj.getSHNDXTable(Sec));
+      this->SymtabSHNDX = check(Obj.getSHNDXTable(Sec));
       break;
     case SHT_STRTAB:
     case SHT_NULL:
@@ -236,7 +236,7 @@ void elf::ObjectFile<ELFT>::initializeSections(
 template <class ELFT>
 InputSectionBase<ELFT> *
 elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec) {
-  StringRef Name = fatal(this->ELFObj.getSectionName(&Sec));
+  StringRef Name = check(this->ELFObj.getSectionName(&Sec));
 
   // .note.GNU-stack is a marker section to control the presence of
   // PT_GNU_STACK segment in outputs. Since the presence of the segment
@@ -286,7 +286,7 @@ elf::ObjectFile<ELFT>::getSection(const Elf_Sym &Sym) const {
 
 template <class ELFT>
 SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
-  StringRef Name = fatal(Sym->getName(this->StringTable));
+  StringRef Name = check(Sym->getName(this->StringTable));
 
   switch (Sym->st_shndx) {
   case SHN_UNDEF:
@@ -312,7 +312,7 @@ SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
 }
 
 void ArchiveFile::parse() {
-  File = fatal(Archive::create(MB), "Failed to parse archive");
+  File = check(Archive::create(MB), "Failed to parse archive");
 
   // Allocate a buffer for Lazy objects.
   size_t NumSyms = File->getNumberOfSymbols();
@@ -326,13 +326,13 @@ void ArchiveFile::parse() {
 // Returns a buffer pointing to a member file containing a given symbol.
 MemoryBufferRef ArchiveFile::getMember(const Archive::Symbol *Sym) {
   Archive::Child C =
-      fatal(Sym->getMember(),
+      check(Sym->getMember(),
             "Could not get the member for symbol " + Sym->getName());
 
   if (!Seen.insert(C.getChildOffset()).second)
     return MemoryBufferRef();
 
-  return fatal(C.getMemoryBufferRef(),
+  return check(C.getMemoryBufferRef(),
                "Could not get the buffer for the member defining symbol " +
                    Sym->getName());
 }
@@ -347,7 +347,7 @@ SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const {
   uint32_t Index = this->getSectionIndex(Sym);
   if (Index == 0)
     return nullptr;
-  return fatal(this->ELFObj.getSection(Index));
+  return check(this->ELFObj.getSection(Index));
 }
 
 // Partially parse the shared object file so that we can call
@@ -369,7 +369,7 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() {
       DynamicSec = &Sec;
       break;
     case SHT_SYMTAB_SHNDX:
-      this->SymtabSHNDX = fatal(Obj.getSHNDXTable(Sec));
+      this->SymtabSHNDX = check(Obj.getSHNDXTable(Sec));
       break;
     }
   }
@@ -401,7 +401,7 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() {
   SymbolBodies.reserve(NumSymbols);
   for (const Elf_Sym &Sym : Syms) {
     ErrorOr<StringRef> NameOrErr = Sym.getName(this->StringTable);
-    fatal(NameOrErr.getError());
+    check(NameOrErr.getError());
     StringRef Name = *NameOrErr;
 
     if (Sym.isUndefined())
@@ -419,7 +419,7 @@ bool BitcodeFile::classof(const InputFile *F) {
 
 void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) {
   LLVMContext Context;
-  std::unique_ptr<IRObjectFile> Obj = fatal(IRObjectFile::create(MB, Context));
+  std::unique_ptr<IRObjectFile> Obj = check(IRObjectFile::create(MB, Context));
   const Module &M = Obj->getModule();
 
   DenseSet<const Comdat *> KeptComdats;
diff --git a/ELF/InputSection.cpp b/ELF/InputSection.cpp
index e98d7d6..66fc79c 100644
--- a/ELF/InputSection.cpp
+++ b/ELF/InputSection.cpp
@@ -39,12 +39,12 @@ InputSectionBase<ELFT>::InputSectionBase(ObjectFile<ELFT> *File,
 }
 
 template <class ELFT> StringRef InputSectionBase<ELFT>::getSectionName() const {
-  return fatal(File->getObj().getSectionName(this->Header));
+  return check(File->getObj().getSectionName(this->Header));
 }
 
 template <class ELFT>
 ArrayRef<uint8_t> InputSectionBase<ELFT>::getSectionData() const {
-  return fatal(this->File->getObj().getSectionContents(this->Header));
+  return check(this->File->getObj().getSectionContents(this->Header));
 }
 
 template <class ELFT>
diff --git a/ELF/SymbolTable.cpp b/ELF/SymbolTable.cpp
index 205911b..589a91e 100644
--- a/ELF/SymbolTable.cpp
+++ b/ELF/SymbolTable.cpp
@@ -137,7 +137,7 @@ ObjectFile<ELFT> *SymbolTable<ELFT>::createCombinedLtoObject() {
     std::unique_ptr<MemoryBuffer> Buffer =
         MemoryBuffer::getMemBuffer(F->MB, false);
     std::unique_ptr<Module> M =
-        fatal(getLazyBitcodeModule(std::move(Buffer), Context,
+        check(getLazyBitcodeModule(std::move(Buffer), Context,
                                    /*ShouldLazyLoadMetadata*/ true));
     L.linkInModule(std::move(M));
   }
diff --git a/ELF/Writer.cpp b/ELF/Writer.cpp
index c6c18d3..886883b 100644
--- a/ELF/Writer.cpp
+++ b/ELF/Writer.cpp
@@ -221,7 +221,7 @@ template <class ELFT> void Writer<ELFT>::run() {
   writeSections();
   if (HasError)
     return;
-  fatal(Buffer->commit());
+  check(Buffer->commit());
 }
 
 namespace {
@@ -564,7 +564,7 @@ template <class ELFT> void Writer<ELFT>::copyLocalSymbols() {
     return;
   for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
     for (const Elf_Sym &Sym : F->getLocalSymbols()) {
-      StringRef SymName = fatal(Sym.getName(F->getStringTable()));
+      StringRef SymName = check(Sym.getName(F->getStringTable()));
       if (!shouldKeepInSymtab<ELFT>(*F, SymName, Sym))
         continue;
       if (Sym.st_shndx != SHN_ABS) {


More information about the llvm-commits mailing list