[llvm] r366053 - Revert r366052 "[obj2yaml] - Rework tool's error reporting logic for ELF target."

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 15 04:00:42 PDT 2019


Author: grimar
Date: Mon Jul 15 04:00:42 2019
New Revision: 366053

URL: http://llvm.org/viewvc/llvm-project?rev=366053&view=rev
Log:
Revert r366052 "[obj2yaml] - Rework tool's error reporting logic for ELF target."

Seems it broke LLD:
http://lab.llvm.org:8011/builders/sanitizer-windows/builds/48434

Modified:
    llvm/trunk/include/llvm/Object/ELF.h
    llvm/trunk/test/tools/obj2yaml/section-group.test
    llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml
    llvm/trunk/tools/obj2yaml/elf2yaml.cpp
    llvm/trunk/tools/obj2yaml/obj2yaml.cpp
    llvm/trunk/tools/obj2yaml/obj2yaml.h

Modified: llvm/trunk/include/llvm/Object/ELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Mon Jul 15 04:00:42 2019
@@ -355,21 +355,24 @@ ELFFile<ELFT>::getSection(const Elf_Sym
 }
 
 template <class ELFT>
-Expected<const typename ELFT::Sym *>
-ELFFile<ELFT>::getSymbol(const Elf_Shdr *Sec, uint32_t Index) const {
-  auto SymsOrErr = symbols(Sec);
-  if (!SymsOrErr)
-    return SymsOrErr.takeError();
-
-  Elf_Sym_Range Symbols = *SymsOrErr;
+inline Expected<const typename ELFT::Sym *>
+getSymbol(typename ELFT::SymRange Symbols, uint32_t Index) {
   if (Index >= Symbols.size())
-    return createError("unable to get symbol from section " +
-                       getSecIndexForError(this, Sec) +
-                       ": invalid symbol index (" + Twine(Index) + ")");
+    // TODO: this error is untested.
+    return createError("invalid symbol index");
   return &Symbols[Index];
 }
 
 template <class ELFT>
+Expected<const typename ELFT::Sym *>
+ELFFile<ELFT>::getSymbol(const Elf_Shdr *Sec, uint32_t Index) const {
+  auto SymtabOrErr = symbols(Sec);
+  if (!SymtabOrErr)
+    return SymtabOrErr.takeError();
+  return object::getSymbol<ELFT>(*SymtabOrErr, Index);
+}
+
+template <class ELFT>
 template <typename T>
 Expected<ArrayRef<T>>
 ELFFile<ELFT>::getSectionContentsAsArray(const Elf_Shdr *Sec) const {

Modified: llvm/trunk/test/tools/obj2yaml/section-group.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/section-group.test?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/section-group.test (original)
+++ llvm/trunk/test/tools/obj2yaml/section-group.test Mon Jul 15 04:00:42 2019
@@ -1,6 +1,6 @@
 ## Checks that the tool is able to read section groups from ELF.
 
-# RUN: yaml2obj --docnum=1 %s > %t1.o
+# RUN: yaml2obj %s > %t1.o
 # RUN: llvm-readobj --elf-section-groups %t1.o | FileCheck %s -check-prefix=OBJ
 # RUN: obj2yaml %t1.o | FileCheck %s --check-prefix YAML
 
@@ -46,25 +46,3 @@ Symbols:
   - Name:    signature
     Type:    STT_OBJECT
     Section: .rodata
-
-## Check obj2yaml report an error when sh_info field of
-## group section contains invalid (too large) signature symbol index.
-
-# RUN: yaml2obj --docnum=2 %s > %t2.o
-# RUN: not obj2yaml %t2.o 2>&1 | FileCheck %s --check-prefix ERR
-
---- !ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_REL
-  Machine: EM_X86_64
-Sections:
-  - Name: .group
-    Type: SHT_GROUP
-    Link: .symtab
-    Info: 0xFF
-    Members:
-      - SectionOrType: GRP_COMDAT
-
-# ERR: Error reading file: {{.*}}2.o: unable to get symbol from section [index 2]: invalid symbol index (255)

Modified: llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml (original)
+++ llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml Mon Jul 15 04:00:42 2019
@@ -51,4 +51,4 @@ Symbols:
 ## shn_xindex.o contains a symbol with st_shndx == SHN_XINDEX.
 ## We do not support it at this moment.
 # RUN: not obj2yaml %S/Inputs/shn_xindex.o 2>&1 | FileCheck %s --check-prefix=ERR
-# ERR: Error reading file: {{.*}}shn_xindex.o: SHN_XINDEX symbols are not supported
+# ERR: Error reading file: {{.*}}shn_xindex.o: Feature not yet implemented.

Modified: llvm/trunk/tools/obj2yaml/elf2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/elf2yaml.cpp?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/elf2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/elf2yaml.cpp Mon Jul 15 04:00:42 2019
@@ -44,31 +44,31 @@ class ELFDumper {
   const object::ELFFile<ELFT> &Obj;
   ArrayRef<Elf_Word> ShndxTable;
 
-  Error dumpSymbols(const Elf_Shdr *Symtab,
-                    std::vector<ELFYAML::Symbol> &Symbols);
-  Error dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
-                   StringRef StrTable, ELFYAML::Symbol &S);
-  Error dumpCommonSection(const Elf_Shdr *Shdr, ELFYAML::Section &S);
-  Error dumpCommonRelocationSection(const Elf_Shdr *Shdr,
-                                    ELFYAML::RelocationSection &S);
+  std::error_code dumpSymbols(const Elf_Shdr *Symtab,
+                              std::vector<ELFYAML::Symbol> &Symbols);
+  std::error_code dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
+                             StringRef StrTable, ELFYAML::Symbol &S);
+  std::error_code dumpCommonSection(const Elf_Shdr *Shdr, ELFYAML::Section &S);
+  std::error_code dumpCommonRelocationSection(const Elf_Shdr *Shdr,
+                                              ELFYAML::RelocationSection &S);
   template <class RelT>
-  Error dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
-                       ELFYAML::Relocation &R);
-
-  Expected<ELFYAML::DynamicSection *> dumpDynamicSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::RelocationSection *> dumpRelocSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::RawContentSection *>
+  std::error_code dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
+                                 ELFYAML::Relocation &R);
+  
+  ErrorOr<ELFYAML::DynamicSection *> dumpDynamicSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::RelocationSection *> dumpRelocSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::RawContentSection *>
   dumpContentSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::NoBitsSection *> dumpNoBitsSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::VerdefSection *> dumpVerdefSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::SymverSection *> dumpSymverSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::VerneedSection *> dumpVerneedSection(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::Group *> dumpGroup(const Elf_Shdr *Shdr);
-  Expected<ELFYAML::MipsABIFlags *> dumpMipsABIFlags(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::NoBitsSection *> dumpNoBitsSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::VerdefSection *> dumpVerdefSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::SymverSection *> dumpSymverSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::VerneedSection *> dumpVerneedSection(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::Group *> dumpGroup(const Elf_Shdr *Shdr);
+  ErrorOr<ELFYAML::MipsABIFlags *> dumpMipsABIFlags(const Elf_Shdr *Shdr);
 
 public:
   ELFDumper(const object::ELFFile<ELFT> &O);
-  Expected<ELFYAML::Object *> dump();
+  ErrorOr<ELFYAML::Object *> dump();
 };
 
 }
@@ -134,7 +134,7 @@ ELFDumper<ELFT>::getUniquedSymbolName(co
   return Name;
 }
 
-template <class ELFT> Expected<ELFYAML::Object *> ELFDumper<ELFT>::dump() {
+template <class ELFT> ErrorOr<ELFYAML::Object *> ELFDumper<ELFT>::dump() {
   auto Y = make_unique<ELFYAML::Object>();
 
   // Dump header. We do not dump SHEntSize, SHOffset, SHNum and SHStrNdx field.
@@ -152,7 +152,7 @@ template <class ELFT> Expected<ELFYAML::
   // Dump sections
   auto SectionsOrErr = Obj.sections();
   if (!SectionsOrErr)
-    return SectionsOrErr.takeError();
+    return errorToErrorCode(SectionsOrErr.takeError());
   Sections = *SectionsOrErr;
   SectionNames.resize(Sections.size());
 
@@ -160,20 +160,20 @@ template <class ELFT> Expected<ELFYAML::
   // to access the deduplicated symbol names that we also create here.
   for (const Elf_Shdr &Sec : Sections) {
     if (Sec.sh_type == ELF::SHT_SYMTAB)
-      if (Error E = dumpSymbols(&Sec, Y->Symbols))
-        return std::move(E);
+      if (auto EC = dumpSymbols(&Sec, Y->Symbols))
+        return EC;
     if (Sec.sh_type == ELF::SHT_DYNSYM)
-      if (Error E = dumpSymbols(&Sec, Y->DynamicSymbols))
-        return std::move(E);
+      if (auto EC = dumpSymbols(&Sec, Y->DynamicSymbols))
+        return EC;
   }
 
   for (const Elf_Shdr &Sec : Sections) {
     switch (Sec.sh_type) {
     case ELF::SHT_DYNAMIC: {
-      Expected<ELFYAML::DynamicSection *> SecOrErr = dumpDynamicSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::DynamicSection *> S = dumpDynamicSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     case ELF::SHT_NULL:
@@ -185,66 +185,65 @@ template <class ELFT> Expected<ELFYAML::
     case ELF::SHT_SYMTAB_SHNDX: {
       auto TableOrErr = Obj.getSHNDXTable(Sec);
       if (!TableOrErr)
-        return TableOrErr.takeError();
+        return errorToErrorCode(TableOrErr.takeError());
       ShndxTable = *TableOrErr;
       break;
     }
     case ELF::SHT_REL:
     case ELF::SHT_RELA: {
-      Expected<ELFYAML::RelocationSection *> SecOrErr = dumpRelocSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::RelocationSection *> S = dumpRelocSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     case ELF::SHT_GROUP: {
-      Expected<ELFYAML::Group *> GroupOrErr = dumpGroup(&Sec);
-      if (!GroupOrErr)
-        return GroupOrErr.takeError();
-      Y->Sections.emplace_back(*GroupOrErr);
+      ErrorOr<ELFYAML::Group *> G = dumpGroup(&Sec);
+      if (std::error_code EC = G.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(G.get()));
       break;
     }
     case ELF::SHT_MIPS_ABIFLAGS: {
-      Expected<ELFYAML::MipsABIFlags *> SecOrErr = dumpMipsABIFlags(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::MipsABIFlags *> G = dumpMipsABIFlags(&Sec);
+      if (std::error_code EC = G.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(G.get()));
       break;
     }
     case ELF::SHT_NOBITS: {
-      Expected<ELFYAML::NoBitsSection *> SecOrErr = dumpNoBitsSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::NoBitsSection *> S = dumpNoBitsSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     case ELF::SHT_GNU_verdef: {
-      Expected<ELFYAML::VerdefSection *> SecOrErr = dumpVerdefSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::VerdefSection *> S = dumpVerdefSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     case ELF::SHT_GNU_versym: {
-      Expected<ELFYAML::SymverSection *> SecOrErr = dumpSymverSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::SymverSection *> S = dumpSymverSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     case ELF::SHT_GNU_verneed: {
-      Expected<ELFYAML::VerneedSection *> SecOrErr = dumpVerneedSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::VerneedSection *> S = dumpVerneedSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
       break;
     }
     default: {
-      Expected<ELFYAML::RawContentSection *> SecOrErr =
-          dumpContentSection(&Sec);
-      if (!SecOrErr)
-        return SecOrErr.takeError();
-      Y->Sections.emplace_back(*SecOrErr);
+      ErrorOr<ELFYAML::RawContentSection *> S = dumpContentSection(&Sec);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
     }
     }
   }
@@ -253,19 +252,20 @@ template <class ELFT> Expected<ELFYAML::
 }
 
 template <class ELFT>
-Error ELFDumper<ELFT>::dumpSymbols(const Elf_Shdr *Symtab,
+std::error_code
+ELFDumper<ELFT>::dumpSymbols(const Elf_Shdr *Symtab,
                              std::vector<ELFYAML::Symbol> &Symbols) {
   if (!Symtab)
-    return Error::success();
+    return std::error_code();
 
   auto StrTableOrErr = Obj.getStringTableForSymtab(*Symtab);
   if (!StrTableOrErr)
-    return StrTableOrErr.takeError();
+    return errorToErrorCode(StrTableOrErr.takeError());
   StringRef StrTable = *StrTableOrErr;
 
   auto SymtabOrErr = Obj.symbols(Symtab);
   if (!SymtabOrErr)
-    return SymtabOrErr.takeError();
+    return errorToErrorCode(SymtabOrErr.takeError());
 
   if (Symtab->sh_type == ELF::SHT_SYMTAB) {
     SymTable = *SymtabOrErr;
@@ -279,12 +279,13 @@ Error ELFDumper<ELFT>::dumpSymbols(const
     Symbols.push_back(S);
   }
 
-  return Error::success();
+  return std::error_code();
 }
 
 template <class ELFT>
-Error ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
-                                  StringRef StrTable, ELFYAML::Symbol &S) {
+std::error_code
+ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
+                            StringRef StrTable, ELFYAML::Symbol &S) {
   S.Type = Sym->getType();
   S.Value = Sym->st_value;
   S.Size = Sym->st_size;
@@ -294,56 +295,56 @@ Error ELFDumper<ELFT>::dumpSymbol(const
   Expected<StringRef> SymbolNameOrErr =
       getUniquedSymbolName(Sym, StrTable, SymTab);
   if (!SymbolNameOrErr)
-    return SymbolNameOrErr.takeError();
+    return errorToErrorCode(SymbolNameOrErr.takeError());
   S.Name = SymbolNameOrErr.get();
 
   if (Sym->st_shndx >= ELF::SHN_LORESERVE) {
     if (Sym->st_shndx == ELF::SHN_XINDEX)
-      return createStringError(obj2yaml_error::not_implemented,
-                               "SHN_XINDEX symbols are not supported");
+      return obj2yaml_error::not_implemented;
     S.Index = (ELFYAML::ELF_SHN)Sym->st_shndx;
-    return Error::success();
+    return obj2yaml_error::success;
   }
 
   auto ShdrOrErr = Obj.getSection(Sym, SymTab, ShndxTable);
   if (!ShdrOrErr)
-    return ShdrOrErr.takeError();
+    return errorToErrorCode(ShdrOrErr.takeError());
   const Elf_Shdr *Shdr = *ShdrOrErr;
   if (!Shdr)
-    return Error::success();
+    return obj2yaml_error::success;
 
   auto NameOrErr = getUniquedSectionName(Shdr);
   if (!NameOrErr)
-    return NameOrErr.takeError();
+    return errorToErrorCode(NameOrErr.takeError());
   S.Section = NameOrErr.get();
 
-  return Error::success();
+  return obj2yaml_error::success;
 }
 
 template <class ELFT>
 template <class RelT>
-Error ELFDumper<ELFT>::dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
-                                      ELFYAML::Relocation &R) {
+std::error_code ELFDumper<ELFT>::dumpRelocation(const RelT *Rel,
+                                                const Elf_Shdr *SymTab,
+                                                ELFYAML::Relocation &R) {
   R.Type = Rel->getType(Obj.isMips64EL());
   R.Offset = Rel->r_offset;
   R.Addend = 0;
 
   auto SymOrErr = Obj.getRelocationSymbol(Rel, SymTab);
   if (!SymOrErr)
-    return SymOrErr.takeError();
+    return errorToErrorCode(SymOrErr.takeError());
   const Elf_Sym *Sym = *SymOrErr;
   auto StrTabSec = Obj.getSection(SymTab->sh_link);
   if (!StrTabSec)
-    return StrTabSec.takeError();
+    return errorToErrorCode(StrTabSec.takeError());
   auto StrTabOrErr = Obj.getStringTable(*StrTabSec);
   if (!StrTabOrErr)
-    return StrTabOrErr.takeError();
+    return errorToErrorCode(StrTabOrErr.takeError());
   StringRef StrTab = *StrTabOrErr;
 
   if (Sym) {
     Expected<StringRef> NameOrErr = getUniquedSymbolName(Sym, StrTab, SymTab);
     if (!NameOrErr)
-      return NameOrErr.takeError();
+      return errorToErrorCode(NameOrErr.takeError());
     R.Symbol = NameOrErr.get();
   } else {
     // We have some edge cases of relocations without a symbol associated,
@@ -353,12 +354,12 @@ Error ELFDumper<ELFT>::dumpRelocation(co
     R.Symbol = "";
   }
 
-  return Error::success();
+  return obj2yaml_error::success;
 }
 
 template <class ELFT>
-Error ELFDumper<ELFT>::dumpCommonSection(const Elf_Shdr *Shdr,
-                                         ELFYAML::Section &S) {
+std::error_code ELFDumper<ELFT>::dumpCommonSection(const Elf_Shdr *Shdr,
+                                                   ELFYAML::Section &S) {
   // Dump fields. We do not dump the ShOffset field. When not explicitly
   // set, the value is set by yaml2obj automatically.
   S.Type = Shdr->sh_type;
@@ -371,50 +372,51 @@ Error ELFDumper<ELFT>::dumpCommonSection
 
   auto NameOrErr = getUniquedSectionName(Shdr);
   if (!NameOrErr)
-    return NameOrErr.takeError();
+    return errorToErrorCode(NameOrErr.takeError());
   S.Name = NameOrErr.get();
 
   if (Shdr->sh_link != ELF::SHN_UNDEF) {
     auto LinkSection = Obj.getSection(Shdr->sh_link);
     if (LinkSection.takeError())
-      return LinkSection.takeError();
+      return errorToErrorCode(LinkSection.takeError());
     NameOrErr = getUniquedSectionName(*LinkSection);
     if (!NameOrErr)
-      return NameOrErr.takeError();
+      return errorToErrorCode(NameOrErr.takeError());
     S.Link = NameOrErr.get();
   }
 
-  return Error::success();
+  return obj2yaml_error::success;
 }
 
 template <class ELFT>
-Error ELFDumper<ELFT>::dumpCommonRelocationSection(
-    const Elf_Shdr *Shdr, ELFYAML::RelocationSection &S) {
-  if (Error E = dumpCommonSection(Shdr, S))
-    return E;
+std::error_code
+ELFDumper<ELFT>::dumpCommonRelocationSection(const Elf_Shdr *Shdr,
+                                             ELFYAML::RelocationSection &S) {
+  if (std::error_code EC = dumpCommonSection(Shdr, S))
+    return EC;
 
   auto InfoSection = Obj.getSection(Shdr->sh_info);
   if (!InfoSection)
-    return InfoSection.takeError();
+    return errorToErrorCode(InfoSection.takeError());
 
   auto NameOrErr = getUniquedSectionName(*InfoSection);
   if (!NameOrErr)
-    return NameOrErr.takeError();
+    return errorToErrorCode(NameOrErr.takeError());
   S.RelocatableSec = NameOrErr.get();
 
-  return Error::success();
+  return obj2yaml_error::success;
 }
 
 template <class ELFT>
-Expected<ELFYAML::DynamicSection *>
+ErrorOr<ELFYAML::DynamicSection *>
 ELFDumper<ELFT>::dumpDynamicSection(const Elf_Shdr *Shdr) {
   auto S = make_unique<ELFYAML::DynamicSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   auto DynTagsOrErr = Obj.template getSectionContentsAsArray<Elf_Dyn>(Shdr);
   if (!DynTagsOrErr)
-    return DynTagsOrErr.takeError();
+    return errorToErrorCode(DynTagsOrErr.takeError());
 
   for (const Elf_Dyn &Dyn : *DynTagsOrErr)
     S->Entries.push_back({(ELFYAML::ELF_DYNTAG)Dyn.getTag(), Dyn.getVal()});
@@ -423,35 +425,35 @@ ELFDumper<ELFT>::dumpDynamicSection(cons
 }
 
 template <class ELFT>
-Expected<ELFYAML::RelocationSection *>
+ErrorOr<ELFYAML::RelocationSection *>
 ELFDumper<ELFT>::dumpRelocSection(const Elf_Shdr *Shdr) {
   auto S = make_unique<ELFYAML::RelocationSection>();
-  if (auto E = dumpCommonRelocationSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonRelocationSection(Shdr, *S))
+    return EC;
 
   auto SymTabOrErr = Obj.getSection(Shdr->sh_link);
   if (!SymTabOrErr)
-    return SymTabOrErr.takeError();
+    return errorToErrorCode(SymTabOrErr.takeError());
   const Elf_Shdr *SymTab = *SymTabOrErr;
 
   if (Shdr->sh_type == ELF::SHT_REL) {
     auto Rels = Obj.rels(Shdr);
     if (!Rels)
-      return Rels.takeError();
+      return errorToErrorCode(Rels.takeError());
     for (const Elf_Rel &Rel : *Rels) {
       ELFYAML::Relocation R;
-      if (Error E = dumpRelocation(&Rel, SymTab, R))
-        return std::move(E);
+      if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
+        return EC;
       S->Relocations.push_back(R);
     }
   } else {
     auto Rels = Obj.relas(Shdr);
     if (!Rels)
-      return Rels.takeError();
+      return errorToErrorCode(Rels.takeError());
     for (const Elf_Rela &Rel : *Rels) {
       ELFYAML::Relocation R;
-      if (Error E = dumpRelocation(&Rel, SymTab, R))
-        return std::move(E);
+      if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
+        return EC;
       R.Addend = Rel.r_addend;
       S->Relocations.push_back(R);
     }
@@ -461,15 +463,16 @@ ELFDumper<ELFT>::dumpRelocSection(const
 }
 
 template <class ELFT>
-Expected<ELFYAML::RawContentSection *>
+ErrorOr<ELFYAML::RawContentSection *>
 ELFDumper<ELFT>::dumpContentSection(const Elf_Shdr *Shdr) {
   auto S = make_unique<ELFYAML::RawContentSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   auto ContentOrErr = Obj.getSectionContents(Shdr);
   if (!ContentOrErr)
-    return ContentOrErr.takeError();
+    return errorToErrorCode(ContentOrErr.takeError());
   ArrayRef<uint8_t> Content = *ContentOrErr;
   if (!Content.empty())
     S->Content = yaml::BinaryRef(Content);
@@ -479,39 +482,40 @@ ELFDumper<ELFT>::dumpContentSection(cons
 }
 
 template <class ELFT>
-Expected<ELFYAML::NoBitsSection *>
+ErrorOr<ELFYAML::NoBitsSection *>
 ELFDumper<ELFT>::dumpNoBitsSection(const Elf_Shdr *Shdr) {
   auto S = make_unique<ELFYAML::NoBitsSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
   S->Size = Shdr->sh_size;
 
   return S.release();
 }
 
 template <class ELFT>
-Expected<ELFYAML::VerdefSection *>
+ErrorOr<ELFYAML::VerdefSection *>
 ELFDumper<ELFT>::dumpVerdefSection(const Elf_Shdr *Shdr) {
   typedef typename ELFT::Verdef Elf_Verdef;
   typedef typename ELFT::Verdaux Elf_Verdaux;
 
   auto S = make_unique<ELFYAML::VerdefSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   S->Info = Shdr->sh_info;
 
   auto StringTableShdrOrErr = Obj.getSection(Shdr->sh_link);
   if (!StringTableShdrOrErr)
-    return StringTableShdrOrErr.takeError();
+    return errorToErrorCode(StringTableShdrOrErr.takeError());
 
   auto StringTableOrErr = Obj.getStringTable(*StringTableShdrOrErr);
   if (!StringTableOrErr)
-    return StringTableOrErr.takeError();
+    return errorToErrorCode(StringTableOrErr.takeError());
 
   auto Contents = Obj.getSectionContents(Shdr);
   if (!Contents)
-    return Contents.takeError();
+    return errorToErrorCode(Contents.takeError());
 
   llvm::ArrayRef<uint8_t> Data = *Contents;
   const uint8_t *Buf = Data.data();
@@ -540,17 +544,17 @@ ELFDumper<ELFT>::dumpVerdefSection(const
 }
 
 template <class ELFT>
-Expected<ELFYAML::SymverSection *>
+ErrorOr<ELFYAML::SymverSection *>
 ELFDumper<ELFT>::dumpSymverSection(const Elf_Shdr *Shdr) {
   typedef typename ELFT::Half Elf_Half;
 
   auto S = make_unique<ELFYAML::SymverSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   auto VersionsOrErr = Obj.template getSectionContentsAsArray<Elf_Half>(Shdr);
   if (!VersionsOrErr)
-    return VersionsOrErr.takeError();
+    return errorToErrorCode(VersionsOrErr.takeError());
   for (const Elf_Half &E : *VersionsOrErr)
     S->Entries.push_back(E);
 
@@ -558,28 +562,28 @@ ELFDumper<ELFT>::dumpSymverSection(const
 }
 
 template <class ELFT>
-Expected<ELFYAML::VerneedSection *>
+ErrorOr<ELFYAML::VerneedSection *>
 ELFDumper<ELFT>::dumpVerneedSection(const Elf_Shdr *Shdr) {
   typedef typename ELFT::Verneed Elf_Verneed;
   typedef typename ELFT::Vernaux Elf_Vernaux;
 
   auto S = make_unique<ELFYAML::VerneedSection>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   S->Info = Shdr->sh_info;
 
   auto Contents = Obj.getSectionContents(Shdr);
   if (!Contents)
-    return Contents.takeError();
+    return errorToErrorCode(Contents.takeError());
 
   auto StringTableShdrOrErr = Obj.getSection(Shdr->sh_link);
   if (!StringTableShdrOrErr)
-    return StringTableShdrOrErr.takeError();
+    return errorToErrorCode(StringTableShdrOrErr.takeError());
 
   auto StringTableOrErr = Obj.getStringTable(*StringTableShdrOrErr);
   if (!StringTableOrErr)
-    return StringTableOrErr.takeError();
+    return errorToErrorCode(StringTableOrErr.takeError());
 
   llvm::ArrayRef<uint8_t> Data = *Contents;
   const uint8_t *Buf = Data.data();
@@ -615,32 +619,32 @@ ELFDumper<ELFT>::dumpVerneedSection(cons
 }
 
 template <class ELFT>
-Expected<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) {
+ErrorOr<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) {
   auto S = make_unique<ELFYAML::Group>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   auto SymtabOrErr = Obj.getSection(Shdr->sh_link);
   if (!SymtabOrErr)
-    return SymtabOrErr.takeError();
+    return errorToErrorCode(SymtabOrErr.takeError());
   // Get symbol with index sh_info which name is the signature of the group.
   const Elf_Shdr *Symtab = *SymtabOrErr;
   auto SymOrErr = Obj.getSymbol(Symtab, Shdr->sh_info);
   if (!SymOrErr)
-    return SymOrErr.takeError();
+    return errorToErrorCode(SymOrErr.takeError());
   auto StrTabOrErr = Obj.getStringTableForSymtab(*Symtab);
   if (!StrTabOrErr)
-    return StrTabOrErr.takeError();
+    return errorToErrorCode(StrTabOrErr.takeError());
 
   Expected<StringRef> SymbolName =
       getUniquedSymbolName(*SymOrErr, *StrTabOrErr, Symtab);
   if (!SymbolName)
-    return SymbolName.takeError();
+    return errorToErrorCode(SymbolName.takeError());
   S->Signature = *SymbolName;
 
   auto MembersOrErr = Obj.template getSectionContentsAsArray<Elf_Word>(Shdr);
   if (!MembersOrErr)
-    return MembersOrErr.takeError();
+    return errorToErrorCode(MembersOrErr.takeError());
 
   for (Elf_Word Member : *MembersOrErr) {
     if (Member == llvm::ELF::GRP_COMDAT) {
@@ -650,27 +654,27 @@ Expected<ELFYAML::Group *> ELFDumper<ELF
 
     auto SHdrOrErr = Obj.getSection(Member);
     if (!SHdrOrErr)
-      return SHdrOrErr.takeError();
+      return errorToErrorCode(SHdrOrErr.takeError());
     auto NameOrErr = getUniquedSectionName(*SHdrOrErr);
     if (!NameOrErr)
-      return NameOrErr.takeError();
+      return errorToErrorCode(NameOrErr.takeError());
     S->Members.push_back({*NameOrErr});
   }
   return S.release();
 }
 
 template <class ELFT>
-Expected<ELFYAML::MipsABIFlags *>
+ErrorOr<ELFYAML::MipsABIFlags *>
 ELFDumper<ELFT>::dumpMipsABIFlags(const Elf_Shdr *Shdr) {
   assert(Shdr->sh_type == ELF::SHT_MIPS_ABIFLAGS &&
          "Section type is not SHT_MIPS_ABIFLAGS");
   auto S = make_unique<ELFYAML::MipsABIFlags>();
-  if (Error E = dumpCommonSection(Shdr, *S))
-    return std::move(E);
+  if (std::error_code EC = dumpCommonSection(Shdr, *S))
+    return EC;
 
   auto ContentOrErr = Obj.getSectionContents(Shdr);
   if (!ContentOrErr)
-    return ContentOrErr.takeError();
+    return errorToErrorCode(ContentOrErr.takeError());
 
   auto *Flags = reinterpret_cast<const object::Elf_Mips_ABIFlags<ELFT> *>(
       ContentOrErr.get().data());
@@ -689,20 +693,21 @@ ELFDumper<ELFT>::dumpMipsABIFlags(const
 }
 
 template <class ELFT>
-static Error elf2yaml(raw_ostream &Out, const object::ELFFile<ELFT> &Obj) {
+static std::error_code elf2yaml(raw_ostream &Out,
+                                const object::ELFFile<ELFT> &Obj) {
   ELFDumper<ELFT> Dumper(Obj);
-  Expected<ELFYAML::Object *> YAMLOrErr = Dumper.dump();
-  if (!YAMLOrErr)
-    return YAMLOrErr.takeError();
+  ErrorOr<ELFYAML::Object *> YAMLOrErr = Dumper.dump();
+  if (std::error_code EC = YAMLOrErr.getError())
+    return EC;
 
   std::unique_ptr<ELFYAML::Object> YAML(YAMLOrErr.get());
   yaml::Output Yout(Out);
   Yout << *YAML;
 
-  return Error::success();
+  return std::error_code();
 }
 
-Error elf2yaml(raw_ostream &Out, const object::ObjectFile &Obj) {
+std::error_code elf2yaml(raw_ostream &Out, const object::ObjectFile &Obj) {
   if (const auto *ELFObj = dyn_cast<object::ELF32LEObjectFile>(&Obj))
     return elf2yaml(Out, *ELFObj->getELFFile());
 
@@ -715,5 +720,5 @@ Error elf2yaml(raw_ostream &Out, const o
   if (const auto *ELFObj = dyn_cast<object::ELF64BEObjectFile>(&Obj))
     return elf2yaml(Out, *ELFObj->getELFFile());
 
-  llvm_unreachable("unknown ELF file format");
+  return obj2yaml_error::unsupported_obj_file_format;
 }

Modified: llvm/trunk/tools/obj2yaml/obj2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/obj2yaml.cpp?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/obj2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/obj2yaml.cpp Mon Jul 15 04:00:42 2019
@@ -17,20 +17,19 @@
 using namespace llvm;
 using namespace llvm::object;
 
-static Error dumpObject(const ObjectFile &Obj) {
+static std::error_code dumpObject(const ObjectFile &Obj) {
   if (Obj.isCOFF())
-    return errorCodeToError(coff2yaml(outs(), cast<COFFObjectFile>(Obj)));
+    return coff2yaml(outs(), cast<COFFObjectFile>(Obj));
 
   if (Obj.isXCOFF())
-    return errorCodeToError(xcoff2yaml(outs(), cast<XCOFFObjectFile>(Obj)));
+    return xcoff2yaml(outs(), cast<XCOFFObjectFile>(Obj));
 
   if (Obj.isELF())
     return elf2yaml(outs(), Obj);
-
   if (Obj.isWasm())
-    return errorCodeToError(wasm2yaml(outs(), cast<WasmObjectFile>(Obj)));
+    return wasm2yaml(outs(), cast<WasmObjectFile>(Obj));
 
-  return errorCodeToError(obj2yaml_error::unsupported_obj_file_format);
+  return obj2yaml_error::unsupported_obj_file_format;
 }
 
 static Error dumpInput(StringRef File) {
@@ -45,7 +44,7 @@ static Error dumpInput(StringRef File) {
     return errorCodeToError(macho2yaml(outs(), Binary));
   // TODO: If this is an archive, then burst it and dump each entry
   if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary))
-    return dumpObject(*Obj);
+    return errorCodeToError(dumpObject(*Obj));
   if (MinidumpFile *Minidump = dyn_cast<MinidumpFile>(&Binary))
     return minidump2yaml(outs(), *Minidump);
 

Modified: llvm/trunk/tools/obj2yaml/obj2yaml.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/obj2yaml.h?rev=366053&r1=366052&r2=366053&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/obj2yaml.h (original)
+++ llvm/trunk/tools/obj2yaml/obj2yaml.h Mon Jul 15 04:00:42 2019
@@ -21,7 +21,7 @@
 
 std::error_code coff2yaml(llvm::raw_ostream &Out,
                           const llvm::object::COFFObjectFile &Obj);
-llvm::Error elf2yaml(llvm::raw_ostream &Out,
+std::error_code elf2yaml(llvm::raw_ostream &Out,
                          const llvm::object::ObjectFile &Obj);
 std::error_code macho2yaml(llvm::raw_ostream &Out,
                            const llvm::object::Binary &Obj);




More information about the llvm-commits mailing list