diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-08 17:12:57 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-08 17:12:57 +0000 | 
| commit | c46e6a5940c50058e00c0c5f9123fd82e338d29a (patch) | |
| tree | 89a719d723035c54a190b1f81d329834f1f93336 /lib/Object/COFFObjectFile.cpp | |
| parent | 148779df305667b6942fee7e758fdf81a6498f38 (diff) | |
Notes
Diffstat (limited to 'lib/Object/COFFObjectFile.cpp')
| -rw-r--r-- | lib/Object/COFFObjectFile.cpp | 45 | 
1 files changed, 43 insertions, 2 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 1866aba9b21a..b1223e81be43 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -19,6 +19,7 @@  #include "llvm/Object/COFF.h"  #include "llvm/Object/Error.h"  #include "llvm/Object/ObjectFile.h" +#include "llvm/Support/BinaryStreamReader.h"  #include "llvm/Support/COFF.h"  #include "llvm/Support/Endian.h"  #include "llvm/Support/Error.h" @@ -159,8 +160,7 @@ void COFFObjectFile::moveSymbolNext(DataRefImpl &Ref) const {  Expected<StringRef> COFFObjectFile::getSymbolName(DataRefImpl Ref) const {    COFFSymbolRef Symb = getCOFFSymbol(Ref);    StringRef Result; -  std::error_code EC = getSymbolName(Symb, Result); -  if (EC) +  if (std::error_code EC = getSymbolName(Symb, Result))      return errorCodeToError(EC);    return Result;  } @@ -1591,3 +1591,44 @@ std::error_code BaseRelocRef::getRVA(uint32_t &Result) const {    Result = Header->PageRVA + Entry[Index].getOffset();    return std::error_code();  } + +#define RETURN_IF_ERROR(X)                                                     \ +  if (auto EC = errorToErrorCode(X))                                           \ +    return EC; + +ErrorOr<ArrayRef<UTF16>> ResourceSectionRef::getDirStringAtOffset(uint32_t Offset) { +  BinaryStreamReader Reader = BinaryStreamReader(BBS); +  Reader.setOffset(Offset); +  uint16_t Length; +  RETURN_IF_ERROR(Reader.readInteger(Length)); +  ArrayRef<UTF16> RawDirString; +  // Strings are stored as 2-byte aligned unicode characters but readFixedString +  // assumes byte string, so we double length. +  RETURN_IF_ERROR(Reader.readArray(RawDirString, Length)); +  return RawDirString; +} + +ErrorOr<ArrayRef<UTF16>> +ResourceSectionRef::getEntryNameString(const coff_resource_dir_entry &Entry) { +  return getDirStringAtOffset(Entry.Identifier.getNameOffset()); +} + +ErrorOr<const coff_resource_dir_table &> +ResourceSectionRef::getTableAtOffset(uint32_t Offset) { +  const coff_resource_dir_table *Table = nullptr; + +  BinaryStreamReader Reader(BBS); +  Reader.setOffset(Offset); +  RETURN_IF_ERROR(Reader.readObject(Table)); +  assert(Table != nullptr); +  return *Table; +} + +ErrorOr<const coff_resource_dir_table &> +ResourceSectionRef::getEntrySubDir(const coff_resource_dir_entry &Entry) { +  return getTableAtOffset(Entry.Offset.value()); +} + +ErrorOr<const coff_resource_dir_table &> ResourceSectionRef::getBaseTable() { +  return getTableAtOffset(0); +}  | 
