[C++] Use 'nullptr'. Tools edition.
[oota-llvm.git] / tools / llvm-readobj / COFFDumper.cpp
index 34115f481ae512390a7ad33d03da632bdc89fc48..b53520daefb048d1d9f76ac3b04711ff1b66c0f3 100644 (file)
@@ -55,8 +55,8 @@ public:
   virtual void printUnwindInfo() override;
 
 private:
-  void printSymbol(symbol_iterator SymI);
-  void printRelocation(section_iterator SecI, const RelocationRef &Reloc);
+  void printSymbol(const SymbolRef &Sym);
+  void printRelocation(const SectionRef &Section, const RelocationRef &Reloc);
   void printDataDirectory(uint32_t Index, const std::string &FieldName);
   void printX64UnwindInfo();
 
@@ -74,9 +74,9 @@ private:
     uint64_t OffsetInSection,
     const std::vector<RelocationRef> &Rels);
 
-  void printUnwindCode(const Win64EH::UnwindInfoUI, ArrayRef<UnwindCode> UCs);
+  void printUnwindCode(const Win64EH::UnwindInfo &UI, ArrayRef<UnwindCode> UCs);
 
-  void printCodeViewLineTables(section_iterator SecI);
+  void printCodeViewLineTables(const SectionRef &Section);
 
   void cacheRelocations();
 
@@ -188,7 +188,7 @@ static error_code resolveSectionAndAddress(const COFFObjectFile *Obj,
   if (error_code EC = Sym.getSection(iter))
     return EC;
 
-  ResolvedSection = Obj->getCOFFSection(iter);
+  ResolvedSection = Obj->getCOFFSection(*iter);
   return object_error::success;
 }
 
@@ -428,34 +428,6 @@ static const EnumEntry<unsigned> UnwindOpInfo[] = {
   { "R15", 15 }
 };
 
-// Some additional COFF structures not defined by llvm::object.
-namespace {
-  struct coff_aux_function_definition {
-    support::ulittle32_t TagIndex;
-    support::ulittle32_t TotalSize;
-    support::ulittle32_t PointerToLineNumber;
-    support::ulittle32_t PointerToNextFunction;
-    uint8_t Unused[2];
-  };
-
-  struct coff_aux_weak_external_definition {
-    support::ulittle32_t TagIndex;
-    support::ulittle32_t Characteristics;
-    uint8_t Unused[10];
-  };
-
-  struct coff_aux_file_record {
-    char FileName[18];
-  };
-
-  struct coff_aux_clr_token {
-    support::ulittle8_t AuxType;
-    support::ulittle8_t Reserved;
-    support::ulittle32_t SymbolTableIndex;
-    uint8_t Unused[12];
-  };
-} // namespace
-
 static uint64_t getOffsetOfLSDA(const Win64EH::UnwindInfo& UI) {
   return static_cast<const char*>(UI.getLanguageSpecificData())
          - reinterpret_cast<const char*>(&UI);
@@ -540,11 +512,10 @@ error_code COFFDumper::getSection(
 }
 
 void COFFDumper::cacheRelocations() {
-  for (section_iterator SecI = Obj->section_begin(), SecE = Obj->section_end();
-       SecI != SecE; ++SecI) {
-    const coff_section *Section = Obj->getCOFFSection(SecI);
+  for (const SectionRef &S : Obj->sections()) {
+    const coff_section *Section = Obj->getCOFFSection(S);
 
-    for (const RelocationRef &Reloc : SecI->relocations())
+    for (const RelocationRef &Reloc : S.relocations())
       RelocMap[Section].push_back(Reloc);
 
     // Sort relocations by address.
@@ -563,7 +534,7 @@ void COFFDumper::printDataDirectory(uint32_t Index, const std::string &FieldName
 
 void COFFDumper::printFileHeaders() {
   // Print COFF header
-  const coff_file_header *COFFHeader = 0;
+  const coff_file_header *COFFHeader = nullptr;
   if (error(Obj->getCOFFHeader(COFFHeader)))
     return;
 
@@ -586,13 +557,13 @@ void COFFDumper::printFileHeaders() {
 
   // Print PE header. This header does not exist if this is an object file and
   // not an executable.
-  const pe32_header *PEHeader = 0;
+  const pe32_header *PEHeader = nullptr;
   if (error(Obj->getPE32Header(PEHeader)))
     return;
   if (PEHeader)
     printPEHeader<pe32_header>(PEHeader);
 
-  const pe32plus_header *PEPlusHeader = 0;
+  const pe32plus_header *PEPlusHeader = nullptr;
   if (error(Obj->getPE32PlusHeader(PEPlusHeader)))
     return;
   if (PEPlusHeader)
@@ -653,9 +624,10 @@ void COFFDumper::printBaseOfDataField(const pe32_header *Hdr) {
 
 void COFFDumper::printBaseOfDataField(const pe32plus_header *) {}
 
-void COFFDumper::printCodeViewLineTables(section_iterator SecI) {
+void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
   StringRef Data;
-  if (error(SecI->getContents(Data))) return;
+  if (error(Section.getContents(Data)))
+    return;
 
   SmallVector<StringRef, 10> FunctionNames;
   StringMap<StringRef> FunctionLineTables;
@@ -706,8 +678,8 @@ void COFFDumper::printCodeViewLineTables(section_iterator SecI) {
         }
 
         StringRef FunctionName;
-        if (error(resolveSymbolName(RelocMap[Obj->getCOFFSection(SecI)], Offset,
-                                    FunctionName)))
+        if (error(resolveSymbolName(RelocMap[Obj->getCOFFSection(Section)],
+                                    Offset, FunctionName)))
           return;
         W.printString("FunctionName", FunctionName);
         if (FunctionLineTables.count(FunctionName) != 0) {
@@ -721,7 +693,7 @@ void COFFDumper::printCodeViewLineTables(section_iterator SecI) {
         break;
       }
       case COFF::DEBUG_STRING_TABLE_SUBSECTION:
-        if (PayloadSize == 0 || StringTable.data() != 0 ||
+        if (PayloadSize == 0 || StringTable.data() != nullptr ||
             Contents.back() != '\0') {
           // Empty or duplicate or non-null-terminated subsection.
           error(object_error::parse_failed);
@@ -733,7 +705,8 @@ void COFFDumper::printCodeViewLineTables(section_iterator SecI) {
         // Holds the translation table from file indices
         // to offsets in the string table.
 
-        if (PayloadSize == 0 || FileIndexToStringOffsetTable.data() != 0) {
+        if (PayloadSize == 0 ||
+            FileIndexToStringOffsetTable.data() != nullptr) {
           // Empty or duplicate subsection.
           error(object_error::parse_failed);
           return;
@@ -814,15 +787,13 @@ void COFFDumper::printCodeViewLineTables(section_iterator SecI) {
 void COFFDumper::printSections() {
   ListScope SectionsD(W, "Sections");
   int SectionNumber = 0;
-  for (section_iterator SecI = Obj->section_begin(),
-                        SecE = Obj->section_end();
-       SecI != SecE; ++SecI) {
+  for (const SectionRef &Sec : Obj->sections()) {
     ++SectionNumber;
-    const coff_section *Section = Obj->getCOFFSection(SecI);
+    const coff_section *Section = Obj->getCOFFSection(Sec);
 
     StringRef Name;
-    if (error(SecI->getName(Name)))
-        Name = "";
+    if (error(Sec.getName(Name)))
+      Name = "";
 
     DictScope D(W, "Section");
     W.printNumber("Number", SectionNumber);
@@ -841,29 +812,28 @@ void COFFDumper::printSections() {
 
     if (opts::SectionRelocations) {
       ListScope D(W, "Relocations");
-      for (const RelocationRef &Reloc : SecI->relocations())
-        printRelocation(SecI, Reloc);
+      for (const RelocationRef &Reloc : Sec.relocations())
+        printRelocation(Sec, Reloc);
     }
 
     if (opts::SectionSymbols) {
       ListScope D(W, "Symbols");
-      for (symbol_iterator SymI = Obj->symbol_begin(),
-                           SymE = Obj->symbol_end();
-           SymI != SymE; ++SymI) {
+      for (const SymbolRef &Symbol : Obj->symbols()) {
         bool Contained = false;
-        if (SecI->containsSymbol(*SymI, Contained) || !Contained)
+        if (Sec.containsSymbol(Symbol, Contained) || !Contained)
           continue;
 
-        printSymbol(SymI);
+        printSymbol(Symbol);
       }
     }
 
     if (Name == ".debug$S" && opts::CodeViewLineTables)
-      printCodeViewLineTables(SecI);
+      printCodeViewLineTables(Sec);
 
     if (opts::SectionData) {
       StringRef Data;
-      if (error(SecI->getContents(Data))) break;
+      if (error(Sec.getContents(Data)))
+        break;
 
       W.printBinaryBlock("SectionData", Data);
     }
@@ -874,23 +844,21 @@ void COFFDumper::printRelocations() {
   ListScope D(W, "Relocations");
 
   int SectionNumber = 0;
-  for (section_iterator SecI = Obj->section_begin(),
-                        SecE = Obj->section_end();
-                        SecI != SecE; ++SecI) {
+  for (const SectionRef &Section : Obj->sections()) {
     ++SectionNumber;
     StringRef Name;
-    if (error(SecI->getName(Name)))
+    if (error(Section.getName(Name)))
       continue;
 
     bool PrintedGroup = false;
-    for (const RelocationRef &Reloc : SecI->relocations()) {
+    for (const RelocationRef &Reloc : Section.relocations()) {
       if (!PrintedGroup) {
         W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
         W.indent();
         PrintedGroup = true;
       }
 
-      printRelocation(SecI, Reloc);
+      printRelocation(Section, Reloc);
     }
 
     if (PrintedGroup) {
@@ -900,7 +868,7 @@ void COFFDumper::printRelocations() {
   }
 }
 
-void COFFDumper::printRelocation(section_iterator SecI,
+void COFFDumper::printRelocation(const SectionRef &Section,
                                  const RelocationRef &Reloc) {
   uint64_t Offset;
   uint64_t RelocType;
@@ -916,7 +884,7 @@ void COFFDumper::printRelocation(section_iterator SecI,
   symbol_iterator Symbol = Reloc.getSymbol();
   if (error(Symbol->getName(SymbolName)))
     return;
-  if (error(SecI->getContents(Contents)))
+  if (error(Section.getContents(Contents)))
     return;
 
   if (opts::ExpandRelocs) {
@@ -936,19 +904,16 @@ void COFFDumper::printRelocation(section_iterator SecI,
 void COFFDumper::printSymbols() {
   ListScope Group(W, "Symbols");
 
-  for (symbol_iterator SymI = Obj->symbol_begin(), SymE = Obj->symbol_end();
-       SymI != SymE; ++SymI)
-    printSymbol(SymI);
+  for (const SymbolRef &Symbol : Obj->symbols())
+    printSymbol(Symbol);
 }
 
-void COFFDumper::printDynamicSymbols() {
-  ListScope Group(W, "DynamicSymbols");
-}
+void COFFDumper::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); }
 
-void COFFDumper::printSymbol(symbol_iterator SymI) {
+void COFFDumper::printSymbol(const SymbolRef &Sym) {
   DictScope D(W, "Symbol");
 
-  const coff_symbol *Symbol = Obj->getCOFFSymbol(SymI);
+  const coff_symbol *Symbol = Obj->getCOFFSymbol(Sym);
   const coff_section *Section;
   if (error_code EC = Obj->getSection(Symbol->SectionNumber, Section)) {
     W.startLine() << "Invalid section number: " << EC.message() << "\n";
@@ -975,10 +940,7 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
   W.printNumber("AuxSymbolCount", Symbol->NumberOfAuxSymbols);
 
   for (unsigned I = 0; I < Symbol->NumberOfAuxSymbols; ++I) {
-    if (Symbol->StorageClass     == COFF::IMAGE_SYM_CLASS_EXTERNAL &&
-        Symbol->getBaseType()    == COFF::IMAGE_SYM_TYPE_NULL &&
-        Symbol->getComplexType() == COFF::IMAGE_SYM_DTYPE_FUNCTION &&
-        Symbol->SectionNumber > 0) {
+    if (Symbol->isFunctionDefinition()) {
       const coff_aux_function_definition *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;
@@ -986,16 +948,12 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
       DictScope AS(W, "AuxFunctionDef");
       W.printNumber("TagIndex", Aux->TagIndex);
       W.printNumber("TotalSize", Aux->TotalSize);
-      W.printHex("PointerToLineNumber", Aux->PointerToLineNumber);
+      W.printHex("PointerToLineNumber", Aux->PointerToLinenumber);
       W.printHex("PointerToNextFunction", Aux->PointerToNextFunction);
       W.printBinary("Unused", makeArrayRef(Aux->Unused));
 
-    } else if (
-        Symbol->StorageClass   == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL ||
-        (Symbol->StorageClass  == COFF::IMAGE_SYM_CLASS_EXTERNAL &&
-         Symbol->SectionNumber == 0 &&
-         Symbol->Value         == 0)) {
-      const coff_aux_weak_external_definition *Aux;
+    } else if (Symbol->isWeakExternal()) {
+      const coff_aux_weak_external *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;
 
@@ -1012,21 +970,20 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
       W.printNumber("Linked", LinkedName, Aux->TagIndex);
       W.printEnum  ("Search", Aux->Characteristics,
                     makeArrayRef(WeakExternalCharacteristics));
-      W.printBinary("Unused", Aux->Unused);
+      W.printBinary("Unused", makeArrayRef(Aux->Unused));
 
-    } else if (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_FILE) {
-      const coff_aux_file_record *Aux;
+    } else if (Symbol->isFileRecord()) {
+      const coff_aux_file *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;
 
       DictScope AS(W, "AuxFileRecord");
-      W.printString("FileName", StringRef(Aux->FileName));
 
-    // C++/CLI creates external ABS symbols for non-const appdomain globals.
-    // These are also followed by an auxiliary section definition.
-    } else if (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_STATIC ||
-               (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL &&
-                Symbol->SectionNumber == COFF::IMAGE_SYM_ABSOLUTE)) {
+      StringRef Name(Aux->FileName,
+                     Symbol->NumberOfAuxSymbols * COFF::SymbolSize);
+      W.printString("FileName", Name.rtrim(StringRef("\0", 1)));
+      break;
+    } else if (Symbol->isSectionDefinition()) {
       const coff_aux_section_definition *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;
@@ -1053,7 +1010,7 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
 
         W.printNumber("AssocSection", AssocName, Aux->Number);
       }
-    } else if (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_CLR_TOKEN) {
+    } else if (Symbol->isCLRToken()) {
       const coff_aux_clr_token *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;
@@ -1071,7 +1028,7 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
       W.printNumber("AuxType", Aux->AuxType);
       W.printNumber("Reserved", Aux->Reserved);
       W.printNumber("SymbolTableIndex", ReferredName, Aux->SymbolTableIndex);
-      W.printBinary("Unused", Aux->Unused);
+      W.printBinary("Unused", makeArrayRef(Aux->Unused));
 
     } else {
       W.startLine() << "<unhandled auxiliary record>\n";
@@ -1095,20 +1052,17 @@ void COFFDumper::printUnwindInfo() {
 }
 
 void COFFDumper::printX64UnwindInfo() {
-  for (section_iterator SecI = Obj->section_begin(),
-                        SecE = Obj->section_end();
-       SecI != SecE; ++SecI) {
+  for (const SectionRef &Section : Obj->sections()) {
     StringRef Name;
-    if (error(SecI->getName(Name)))
+    if (error(Section.getName(Name)))
       continue;
     if (Name != ".pdata" && !Name.startswith(".pdata$"))
       continue;
 
-    const coff_section *PData = Obj->getCOFFSection(SecI);
+    const coff_section *PData = Obj->getCOFFSection(Section);
 
     ArrayRef<uint8_t> Contents;
-    if (error(Obj->getSectionContents(PData, Contents)) ||
-        Contents.empty())
+    if (error(Obj->getSectionContents(PData, Contents)) || Contents.empty())
       continue;
 
     ArrayRef<RuntimeFunction> RFs(
@@ -1137,7 +1091,7 @@ void COFFDumper::printRuntimeFunction(
   W.printString("UnwindInfoAddress",
                 formatSymbol(Rels, OffsetInSection + 8, RTF.UnwindInfoOffset));
 
-  const coff_section* XData = 0;
+  const coff_section* XData = nullptr;
   uint64_t UnwindInfoOffset = 0;
   if (error(getSection(Rels, OffsetInSection + 8, &XData, &UnwindInfoOffset)))
     return;