diff options
| author | Eric Beckmann <ecbeckmann@google.com> | 2017-05-08 01:48:55 +0000 |
|---|---|---|
| committer | Eric Beckmann <ecbeckmann@google.com> | 2017-05-08 01:48:55 +0000 |
| commit | 626680a09e5031234eb98b9c42ebba4636294aef (patch) | |
| tree | dd9ce1ac773ca25b3fe52452c875b5fee78273c5 | |
| parent | ef40748260b2fadd11cb174d0326d742d7353d9b (diff) | |
| download | bcm5719-llvm-626680a09e5031234eb98b9c42ebba4636294aef.tar.gz bcm5719-llvm-626680a09e5031234eb98b9c42ebba4636294aef.zip | |
Hopefully one last commit to fix this patch, addresses string reference
issues.
llvm-svn: 302395
| -rw-r--r-- | llvm/include/llvm/Object/COFF.h | 5 | ||||
| -rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 10 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 8 |
3 files changed, 12 insertions, 11 deletions
diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h index 94fc10340e0..8b9b4973717 100644 --- a/llvm/include/llvm/Object/COFF.h +++ b/llvm/include/llvm/Object/COFF.h @@ -22,6 +22,7 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/BinaryByteStream.h" #include "llvm/Support/COFF.h" +#include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorOr.h" @@ -1074,7 +1075,7 @@ public: ResourceSectionRef() = default; explicit ResourceSectionRef(StringRef Ref) : BBS(Ref, support::little) {} - ErrorOr<StringRef> getEntryNameString(const coff_resource_dir_entry &Entry); + ErrorOr<ArrayRef<UTF16>> getEntryNameString(const coff_resource_dir_entry &Entry); ErrorOr<const coff_resource_dir_table &> getEntrySubDir(const coff_resource_dir_entry &Entry); ErrorOr<const coff_resource_dir_table &> getBaseTable(); @@ -1083,7 +1084,7 @@ private: BinaryByteStream BBS; ErrorOr<const coff_resource_dir_table &> getTableAtOffset(uint32_t Offset); - ErrorOr<StringRef> getDirStringAtOffset(uint32_t Offset); + ErrorOr<ArrayRef<UTF16>> getDirStringAtOffset(uint32_t Offset); }; // Corresponds to `_FPO_DATA` structure in the PE/COFF spec. diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 39762e1d216..b1223e81be4 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -21,7 +21,6 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/BinaryStreamReader.h" #include "llvm/Support/COFF.h" -#include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" @@ -1597,7 +1596,7 @@ std::error_code BaseRelocRef::getRVA(uint32_t &Result) const { if (auto EC = errorToErrorCode(X)) \ return EC; -ErrorOr<StringRef> ResourceSectionRef::getDirStringAtOffset(uint32_t Offset) { +ErrorOr<ArrayRef<UTF16>> ResourceSectionRef::getDirStringAtOffset(uint32_t Offset) { BinaryStreamReader Reader = BinaryStreamReader(BBS); Reader.setOffset(Offset); uint16_t Length; @@ -1606,13 +1605,10 @@ ErrorOr<StringRef> ResourceSectionRef::getDirStringAtOffset(uint32_t Offset) { // 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)); - std::string DirString; - if (!llvm::convertUTF16ToUTF8String(RawDirString, DirString)) - return object_error::parse_failed; - return DirString; + return RawDirString; } -ErrorOr<StringRef> +ErrorOr<ArrayRef<UTF16>> ResourceSectionRef::getEntryNameString(const coff_resource_dir_entry &Entry) { return getDirStringAtOffset(Entry.Identifier.getNameOffset()); } diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 64fd60ea209..9ffa8292738 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -44,6 +44,7 @@ #include "llvm/Support/BinaryByteStream.h" #include "llvm/Support/BinaryStreamReader.h" #include "llvm/Support/COFF.h" +#include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/DataExtractor.h" @@ -1560,9 +1561,12 @@ void COFFDumper::printResourceDirectoryTable( SmallString<20> IDStr; raw_svector_ostream OS(IDStr); if (i < Table.NumberOfNameEntries) { - StringRef EntryNameString = unwrapOrError(RSF.getEntryNameString(Entry)); + ArrayRef<UTF16> RawEntryNameString = unwrapOrError(RSF.getEntryNameString(Entry)); + std::string EntryNameString; + if (!llvm::convertUTF16ToUTF8String(RawEntryNameString, EntryNameString)) + error(object_error::parse_failed); OS << ": "; - OS << EntryNameString.str(); + OS << EntryNameString; } else { if (Level == "Type") { ScopedPrinter Printer(OS); |

