From: Nico Weber Date: Mon, 29 Apr 2019 00:51:41 +0000 (+0000) Subject: llvm-cvtres: Attempt to make llvm-cvtres/duplicate.test work on big-endian systems X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=828c798b90125d33c5f93654a3d34617c516ac01;p=llvm llvm-cvtres: Attempt to make llvm-cvtres/duplicate.test work on big-endian systems git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359414 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Object/WindowsResource.cpp b/lib/Object/WindowsResource.cpp index bf70e75d3ab..2ad5e941b9d 100644 --- a/lib/Object/WindowsResource.cpp +++ b/lib/Object/WindowsResource.cpp @@ -155,6 +155,17 @@ void printResourceTypeName(uint16_t TypeID, raw_ostream &OS) { } } +static bool convertUTF16LEToUTF8String(ArrayRef Src, std::string &Out) { + if (!sys::IsBigEndianHost) + return convertUTF16ToUTF8String(Src, Out); + + std::vector 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 NameRef, bool &IsNewString) { std::string NameString; - ArrayRef CorrectedName; - std::vector 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()) {