aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/WindowsResource.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2019-04-29 00:51:41 +0000
committerNico Weber <nicolasweber@gmx.de>2019-04-29 00:51:41 +0000
commitcf6267cecb706afae2a9699779596c1c2ddf9090 (patch)
tree25a24040e459428403eaab9dcded6b549df24282 /llvm/lib/Object/WindowsResource.cpp
parent84da0e1bb75f8666cf222d2f600f37bebb9ea389 (diff)
downloadllvm-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.cpp26
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()) {