diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-06-09 19:06:30 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-06-09 19:06:30 +0000 | 
| commit | 85d8b2bbe386bcfe669575d05b61482d7be07e5d (patch) | |
| tree | 1dc5e75ab222a9ead44c699eceafab7a6ca7b310 /lib/Object/COFFObjectFile.cpp | |
| parent | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (diff) | |
Notes
Diffstat (limited to 'lib/Object/COFFObjectFile.cpp')
| -rw-r--r-- | lib/Object/COFFObjectFile.cpp | 146 | 
1 files changed, 63 insertions, 83 deletions
| diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 74709c88ba26..1055b987d7ef 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -46,7 +46,7 @@ static std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr,        Addr < uintptr_t(M.getBufferStart())) {      return object_error::unexpected_eof;    } -  return object_error::success; +  return std::error_code();  }  // Sets Obj unless any bytes in [addr, addr + size) fall outsize of m. @@ -59,7 +59,7 @@ static std::error_code getObject(const T *&Obj, MemoryBufferRef M,    if (std::error_code EC = checkOffset(M, Addr, Size))      return EC;    Obj = reinterpret_cast<const T *>(Addr); -  return object_error::success; +  return std::error_code();  }  // Decode a string table entry in base 64 (//AAAAAA). Expects \arg Str without @@ -156,11 +156,11 @@ std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,    if (Symb.isAnyUndefined()) {      Result = UnknownAddressOrSize; -    return object_error::success; +    return std::error_code();    }    if (Symb.isCommon()) {      Result = UnknownAddressOrSize; -    return object_error::success; +    return std::error_code();    }    int32_t SectionNumber = Symb.getSectionNumber();    if (!COFF::isReservedSectionNumber(SectionNumber)) { @@ -169,11 +169,11 @@ std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,        return EC;      Result = Section->VirtualAddress + Symb.getValue(); -    return object_error::success; +    return std::error_code();    }    Result = Symb.getValue(); -  return object_error::success; +  return std::error_code();  }  std::error_code COFFObjectFile::getSymbolType(DataRefImpl Ref, @@ -205,7 +205,7 @@ std::error_code COFFObjectFile::getSymbolType(DataRefImpl Ref,                                  COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA))        Result = SymbolRef::ST_Data;    } -  return object_error::success; +  return std::error_code();  }  uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const { @@ -236,16 +236,12 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {    return Result;  } -std::error_code COFFObjectFile::getSymbolSize(DataRefImpl Ref, -                                              uint64_t &Result) const { +uint64_t COFFObjectFile::getSymbolSize(DataRefImpl Ref) const {    COFFSymbolRef Symb = getCOFFSymbol(Ref);    if (Symb.isCommon()) -    Result = Symb.getValue(); -  else -    Result = UnknownAddressOrSize; - -  return object_error::success; +    return Symb.getValue(); +  return UnknownAddressOrSize;  }  std::error_code @@ -262,7 +258,7 @@ COFFObjectFile::getSymbolSection(DataRefImpl Ref,      Ref.p = reinterpret_cast<uintptr_t>(Sec);      Result = section_iterator(SectionRef(Ref, this));    } -  return object_error::success; +  return std::error_code();  }  void COFFObjectFile::moveSectionNext(DataRefImpl &Ref) const { @@ -421,7 +417,7 @@ std::error_code COFFObjectFile::initSymbolTablePtr() {    // Check that the string table is null terminated if has any in it.    if (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)      return  object_error::parse_failed; -  return object_error::success; +  return std::error_code();  }  // Returns the file offset for the given VA. @@ -442,7 +438,7 @@ std::error_code COFFObjectFile::getRvaPtr(uint32_t Addr, uintptr_t &Res) const {      if (SectionStart <= Addr && Addr < SectionEnd) {        uint32_t Offset = Addr - SectionStart;        Res = uintptr_t(base()) + Section->PointerToRawData + Offset; -      return object_error::success; +      return std::error_code();      }    }    return object_error::parse_failed; @@ -458,7 +454,7 @@ std::error_code COFFObjectFile::getHintName(uint32_t Rva, uint16_t &Hint,    const uint8_t *Ptr = reinterpret_cast<const uint8_t *>(IntPtr);    Hint = *reinterpret_cast<const ulittle16_t *>(Ptr);    Name = StringRef(reinterpret_cast<const char *>(Ptr + 2)); -  return object_error::success; +  return std::error_code();  }  // Find the import table. @@ -467,11 +463,11 @@ std::error_code COFFObjectFile::initImportTablePtr() {    // the import table, do nothing.    const data_directory *DataEntry;    if (getDataDirectory(COFF::IMPORT_TABLE, DataEntry)) -    return object_error::success; +    return std::error_code();    // Do nothing if the pointer to import table is NULL.    if (DataEntry->RelativeVirtualAddress == 0) -    return object_error::success; +    return std::error_code();    uint32_t ImportTableRva = DataEntry->RelativeVirtualAddress;    // -1 because the last entry is the null entry. @@ -485,16 +481,16 @@ std::error_code COFFObjectFile::initImportTablePtr() {      return EC;    ImportDirectory = reinterpret_cast<        const import_directory_table_entry *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  // Initializes DelayImportDirectory and NumberOfDelayImportDirectory.  std::error_code COFFObjectFile::initDelayImportTablePtr() {    const data_directory *DataEntry;    if (getDataDirectory(COFF::DELAY_IMPORT_DESCRIPTOR, DataEntry)) -    return object_error::success; +    return std::error_code();    if (DataEntry->RelativeVirtualAddress == 0) -    return object_error::success; +    return std::error_code();    uint32_t RVA = DataEntry->RelativeVirtualAddress;    NumberOfDelayImportDirectory = DataEntry->Size / @@ -505,7 +501,7 @@ std::error_code COFFObjectFile::initDelayImportTablePtr() {      return EC;    DelayImportDirectory = reinterpret_cast<        const delay_import_directory_table_entry *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  // Find the export table. @@ -514,11 +510,11 @@ std::error_code COFFObjectFile::initExportTablePtr() {    // the export table, do nothing.    const data_directory *DataEntry;    if (getDataDirectory(COFF::EXPORT_TABLE, DataEntry)) -    return object_error::success; +    return std::error_code();    // Do nothing if the pointer to export table is NULL.    if (DataEntry->RelativeVirtualAddress == 0) -    return object_error::success; +    return std::error_code();    uint32_t ExportTableRva = DataEntry->RelativeVirtualAddress;    uintptr_t IntPtr = 0; @@ -526,15 +522,15 @@ std::error_code COFFObjectFile::initExportTablePtr() {      return EC;    ExportDirectory =        reinterpret_cast<const export_directory_table_entry *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  std::error_code COFFObjectFile::initBaseRelocPtr() {    const data_directory *DataEntry;    if (getDataDirectory(COFF::BASE_RELOCATION_TABLE, DataEntry)) -    return object_error::success; +    return std::error_code();    if (DataEntry->RelativeVirtualAddress == 0) -    return object_error::success; +    return std::error_code();    uintptr_t IntPtr = 0;    if (std::error_code EC = getRvaPtr(DataEntry->RelativeVirtualAddress, IntPtr)) @@ -543,7 +539,7 @@ std::error_code COFFObjectFile::initBaseRelocPtr() {        IntPtr);    BaseRelocEnd = reinterpret_cast<coff_base_reloc_block_header *>(        IntPtr + DataEntry->Size); -  return object_error::success; +  return std::error_code();  }  COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC) @@ -608,7 +604,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)    if (COFFHeader) {      // The prior checkSize call may have failed.  This isn't a hard error      // because we were just trying to sniff out bigobj. -    EC = object_error::success; +    EC = std::error_code();      CurPtr += sizeof(coff_file_header);      if (COFFHeader->isImportLibrary()) @@ -670,7 +666,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)    if ((EC = initBaseRelocPtr()))      return; -  EC = object_error::success; +  EC = std::error_code();  }  basic_symbol_iterator COFFObjectFile::symbol_begin_impl() const { @@ -796,13 +792,13 @@ iterator_range<base_reloc_iterator> COFFObjectFile::base_relocs() const {  std::error_code COFFObjectFile::getPE32Header(const pe32_header *&Res) const {    Res = PE32Header; -  return object_error::success; +  return std::error_code();  }  std::error_code  COFFObjectFile::getPE32PlusHeader(const pe32plus_header *&Res) const {    Res = PE32PlusHeader; -  return object_error::success; +  return std::error_code();  }  std::error_code @@ -821,18 +817,18 @@ COFFObjectFile::getDataDirectory(uint32_t Index,      return object_error::parse_failed;    }    Res = &DataDirectory[Index]; -  return object_error::success; +  return std::error_code();  }  std::error_code COFFObjectFile::getSection(int32_t Index,                                             const coff_section *&Result) const {    Result = nullptr;    if (COFF::isReservedSectionNumber(Index)) -    return object_error::success; +    return std::error_code();    if (static_cast<uint32_t>(Index) <= getNumberOfSections()) {      // We already verified the section table data, so no need to check again.      Result = SectionTable + (Index - 1); -    return object_error::success; +    return std::error_code();    }    return object_error::parse_failed;  } @@ -845,7 +841,7 @@ std::error_code COFFObjectFile::getString(uint32_t Offset,    if (Offset >= StringTableSize)      return object_error::unexpected_eof;    Result = StringRef(StringTable + Offset); -  return object_error::success; +  return std::error_code();  }  std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol, @@ -855,7 +851,7 @@ std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol,      uint32_t Offset = Symbol.getStringTableOffset().Offset;      if (std::error_code EC = getString(Offset, Res))        return EC; -    return object_error::success; +    return std::error_code();    }    if (Symbol.getShortName()[COFF::NameSize - 1] == 0) @@ -864,7 +860,7 @@ std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol,    else      // Not null terminated, use all 8 bytes.      Res = StringRef(Symbol.getShortName(), COFF::NameSize); -  return object_error::success; +  return std::error_code();  }  ArrayRef<uint8_t> @@ -915,7 +911,7 @@ std::error_code COFFObjectFile::getSectionName(const coff_section *Sec,    }    Res = Name; -  return object_error::success; +  return std::error_code();  }  uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const { @@ -953,7 +949,7 @@ COFFObjectFile::getSectionContents(const coff_section *Sec,    if (checkOffset(Data, ConStart, SectionSize))      return object_error::parse_failed;    Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize); -  return object_error::success; +  return std::error_code();  }  const coff_relocation *COFFObjectFile::toRel(DataRefImpl Rel) const { @@ -978,7 +974,7 @@ std::error_code COFFObjectFile::getRelocationOffset(DataRefImpl Rel,            getObject(VirtualAddressPtr, Data, &R->VirtualAddress))      return EC;    Res = *VirtualAddressPtr; -  return object_error::success; +  return std::error_code();  }  symbol_iterator COFFObjectFile::getRelocationSymbol(DataRefImpl Rel) const { @@ -1012,7 +1008,7 @@ std::error_code COFFObjectFile::getRelocationType(DataRefImpl Rel,                                                    uint64_t &Res) const {    const coff_relocation* R = toRel(Rel);    Res = R->Type; -  return object_error::success; +  return std::error_code();  }  const coff_section * @@ -1113,27 +1109,11 @@ COFFObjectFile::getRelocationTypeName(DataRefImpl Rel,      Res = "Unknown";    }    Result.append(Res.begin(), Res.end()); -  return object_error::success; +  return std::error_code();  }  #undef LLVM_COFF_SWITCH_RELOC_TYPE_NAME -std::error_code -COFFObjectFile::getRelocationValueString(DataRefImpl Rel, -                                         SmallVectorImpl<char> &Result) const { -  const coff_relocation *Reloc = toRel(Rel); -  DataRefImpl Sym; -  ErrorOr<COFFSymbolRef> Symb = getSymbol(Reloc->SymbolTableIndex); -  if (std::error_code EC = Symb.getError()) -    return EC; -  Sym.p = reinterpret_cast<uintptr_t>(Symb->getRawPtr()); -  StringRef SymName; -  if (std::error_code EC = getSymbolName(Sym, SymName)) -    return EC; -  Result.append(SymName.begin(), SymName.end()); -  return object_error::success; -} -  bool COFFObjectFile::isRelocatableObject() const {    return !DataDirectory;  } @@ -1150,7 +1130,7 @@ void ImportDirectoryEntryRef::moveNext() {  std::error_code ImportDirectoryEntryRef::getImportTableEntry(      const import_directory_table_entry *&Result) const {    Result = ImportTable + Index; -  return object_error::success; +  return std::error_code();  }  static imported_symbol_iterator @@ -1212,19 +1192,19 @@ std::error_code ImportDirectoryEntryRef::getName(StringRef &Result) const {            OwningObject->getRvaPtr(ImportTable[Index].NameRVA, IntPtr))      return EC;    Result = StringRef(reinterpret_cast<const char *>(IntPtr)); -  return object_error::success; +  return std::error_code();  }  std::error_code  ImportDirectoryEntryRef::getImportLookupTableRVA(uint32_t  &Result) const {    Result = ImportTable[Index].ImportLookupTableRVA; -  return object_error::success; +  return std::error_code();  }  std::error_code  ImportDirectoryEntryRef::getImportAddressTableRVA(uint32_t &Result) const {    Result = ImportTable[Index].ImportAddressTableRVA; -  return object_error::success; +  return std::error_code();  }  std::error_code ImportDirectoryEntryRef::getImportLookupEntry( @@ -1234,7 +1214,7 @@ std::error_code ImportDirectoryEntryRef::getImportLookupEntry(    if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))      return EC;    Result = reinterpret_cast<const import_lookup_table_entry32 *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  bool DelayImportDirectoryEntryRef:: @@ -1268,13 +1248,13 @@ std::error_code DelayImportDirectoryEntryRef::getName(StringRef &Result) const {    if (std::error_code EC = OwningObject->getRvaPtr(Table[Index].Name, IntPtr))      return EC;    Result = StringRef(reinterpret_cast<const char *>(IntPtr)); -  return object_error::success; +  return std::error_code();  }  std::error_code DelayImportDirectoryEntryRef::  getDelayImportTable(const delay_import_directory_table_entry *&Result) const {    Result = Table; -  return object_error::success; +  return std::error_code();  }  std::error_code DelayImportDirectoryEntryRef:: @@ -1288,7 +1268,7 @@ getImportAddress(int AddrIndex, uint64_t &Result) const {      Result = *reinterpret_cast<const ulittle64_t *>(IntPtr);    else      Result = *reinterpret_cast<const ulittle32_t *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  bool ExportDirectoryEntryRef:: @@ -1308,20 +1288,20 @@ std::error_code ExportDirectoryEntryRef::getDllName(StringRef &Result) const {            OwningObject->getRvaPtr(ExportTable->NameRVA, IntPtr))      return EC;    Result = StringRef(reinterpret_cast<const char *>(IntPtr)); -  return object_error::success; +  return std::error_code();  }  // Returns the starting ordinal number.  std::error_code  ExportDirectoryEntryRef::getOrdinalBase(uint32_t &Result) const {    Result = ExportTable->OrdinalBase; -  return object_error::success; +  return std::error_code();  }  // Returns the export ordinal of the current export symbol.  std::error_code ExportDirectoryEntryRef::getOrdinal(uint32_t &Result) const {    Result = ExportTable->OrdinalBase + Index; -  return object_error::success; +  return std::error_code();  }  // Returns the address of the current export symbol. @@ -1333,7 +1313,7 @@ std::error_code ExportDirectoryEntryRef::getExportRVA(uint32_t &Result) const {    const export_address_table_entry *entry =        reinterpret_cast<const export_address_table_entry *>(IntPtr);    Result = entry[Index].ExportRVA; -  return object_error::success; +  return std::error_code();  }  // Returns the name of the current export symbol. If the symbol is exported only @@ -1359,10 +1339,10 @@ ExportDirectoryEntryRef::getSymbolName(StringRef &Result) const {      if (std::error_code EC = OwningObject->getRvaPtr(NamePtr[Offset], IntPtr))        return EC;      Result = StringRef(reinterpret_cast<const char *>(IntPtr)); -    return object_error::success; +    return std::error_code();    }    Result = ""; -  return object_error::success; +  return std::error_code();  }  bool ImportedSymbolRef:: @@ -1381,11 +1361,11 @@ ImportedSymbolRef::getSymbolName(StringRef &Result) const {    if (Entry32) {      // If a symbol is imported only by ordinal, it has no name.      if (Entry32[Index].isOrdinal()) -      return object_error::success; +      return std::error_code();      RVA = Entry32[Index].getHintNameRVA();    } else {      if (Entry64[Index].isOrdinal()) -      return object_error::success; +      return std::error_code();      RVA = Entry64[Index].getHintNameRVA();    }    uintptr_t IntPtr = 0; @@ -1393,7 +1373,7 @@ ImportedSymbolRef::getSymbolName(StringRef &Result) const {      return EC;    // +2 because the first two bytes is hint.    Result = StringRef(reinterpret_cast<const char *>(IntPtr + 2)); -  return object_error::success; +  return std::error_code();  }  std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const { @@ -1401,13 +1381,13 @@ std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const {    if (Entry32) {      if (Entry32[Index].isOrdinal()) {        Result = Entry32[Index].getOrdinal(); -      return object_error::success; +      return std::error_code();      }      RVA = Entry32[Index].getHintNameRVA();    } else {      if (Entry64[Index].isOrdinal()) {        Result = Entry64[Index].getOrdinal(); -      return object_error::success; +      return std::error_code();      }      RVA = Entry64[Index].getHintNameRVA();    } @@ -1415,7 +1395,7 @@ std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const {    if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))      return EC;    Result = *reinterpret_cast<const ulittle16_t *>(IntPtr); -  return object_error::success; +  return std::error_code();  }  ErrorOr<std::unique_ptr<COFFObjectFile>> @@ -1452,11 +1432,11 @@ void BaseRelocRef::moveNext() {  std::error_code BaseRelocRef::getType(uint8_t &Type) const {    auto *Entry = reinterpret_cast<const coff_base_reloc_block_entry *>(Header + 1);    Type = Entry[Index].getType(); -  return object_error::success; +  return std::error_code();  }  std::error_code BaseRelocRef::getRVA(uint32_t &Result) const {    auto *Entry = reinterpret_cast<const coff_base_reloc_block_entry *>(Header + 1);    Result = Header->PageRVA + Entry[Index].getOffset(); -  return object_error::success; +  return std::error_code();  } | 
