diff options
author | Nico Weber <nicolasweber@gmx.de> | 2019-04-29 00:51:41 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2019-04-29 00:51:41 +0000 |
commit | cf6267cecb706afae2a9699779596c1c2ddf9090 (patch) | |
tree | 25a24040e459428403eaab9dcded6b549df24282 /llvm/lib/Object/WindowsResource.cpp | |
parent | 84da0e1bb75f8666cf222d2f600f37bebb9ea389 (diff) | |
download | llvm-cf6267cecb706afae2a9699779596c1c2ddf9090.zip llvm-cf6267cecb706afae2a9699779596c1c2ddf9090.tar.gz llvm-cf6267cecb706afae2a9699779596c1c2ddf9090.tar.bz2 |
llvm-cvtres: Attempt to make llvm-cvtres/duplicate.test work on big-endian systems
llvm-svn: 359414
Diffstat (limited to 'llvm/lib/Object/WindowsResource.cpp')
-rw-r--r-- | llvm/lib/Object/WindowsResource.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/llvm/lib/Object/WindowsResource.cpp b/llvm/lib/Object/WindowsResource.cpp index bf70e75..2ad5e94 100644 --- a/llvm/lib/Object/WindowsResource.cpp +++ b/llvm/lib/Object/WindowsResource.cpp @@ -155,6 +155,17 @@ void printResourceTypeName(uint16_t TypeID, raw_ostream &OS) { } } +static bool convertUTF16LEToUTF8String(ArrayRef<UTF16> Src, std::string &Out) { + if (!sys::IsBigEndianHost) + return convertUTF16ToUTF8String(Src, Out); + + std::vector<UTF16> EndianCorrectedSrc; + EndianCorrectedSrc.resize(Src.size() + 1); + llvm::copy(Src, EndianCorrectedSrc.begin() + 1); + EndianCorrectedSrc[0] = UNI_UTF16_BYTE_ORDER_MARK_SWAPPED; + return convertUTF16ToUTF8String(makeArrayRef(EndianCorrectedSrc), Out); +} + static Error makeDuplicateResourceError(const ResourceEntryRef &Entry, StringRef File1, StringRef File2) { std::string Ret; @@ -165,7 +176,7 @@ static Error makeDuplicateResourceError(const ResourceEntryRef &Entry, OS << " type "; if (Entry.checkTypeString()) { std::string UTF8; - if (!convertUTF16ToUTF8String(Entry.getTypeString(), UTF8)) + if (!convertUTF16LEToUTF8String(Entry.getTypeString(), UTF8)) UTF8 = "(failed conversion from UTF16)"; OS << '\"' << UTF8 << '\"'; } else @@ -174,7 +185,7 @@ static Error makeDuplicateResourceError(const ResourceEntryRef &Entry, OS << "/name "; if (Entry.checkNameString()) { std::string UTF8; - if (!convertUTF16ToUTF8String(Entry.getNameString(), UTF8)) + if (!convertUTF16LEToUTF8String(Entry.getNameString(), UTF8)) UTF8 = "(failed conversion from UTF16)"; OS << '\"' << UTF8 << '\"'; } else { @@ -331,16 +342,7 @@ WindowsResourceParser::TreeNode & WindowsResourceParser::TreeNode::addNameChild(ArrayRef<UTF16> NameRef, bool &IsNewString) { std::string NameString; - ArrayRef<UTF16> CorrectedName; - std::vector<UTF16> EndianCorrectedName; - if (sys::IsBigEndianHost) { - EndianCorrectedName.resize(NameRef.size() + 1); - llvm::copy(NameRef, EndianCorrectedName.begin() + 1); - EndianCorrectedName[0] = UNI_UTF16_BYTE_ORDER_MARK_SWAPPED; - CorrectedName = makeArrayRef(EndianCorrectedName); - } else - CorrectedName = NameRef; - convertUTF16ToUTF8String(CorrectedName, NameString); + convertUTF16LEToUTF8String(NameRef, NameString); auto Child = StringChildren.find(NameString); if (Child == StringChildren.end()) { |