mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Add name offset flags, for parity with cvtres.exe.
Summary: The original cvtres.exe sets the high bit when an identifier offset points to a string. Even though this is not mentioned in the spec, and in fact does not seem to cause errors with most cases, for some reason this causes a failure in Chromium where the new resource file is not verified as a new version. This patch sets this high bit flag, and also adds a test case to check that the output of our library is always identical to original cvtres. Reviewers: zturner, ruiu Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D35099 llvm-svn: 307452
This commit is contained in:
parent
ce5664ff66
commit
fdff2a0519
@ -698,6 +698,9 @@ struct coff_resource_dir_entry {
|
||||
uint32_t getNameOffset() const {
|
||||
return maskTrailingOnes<uint32_t>(31) & NameOffset;
|
||||
}
|
||||
// Even though the PE/COFF spec doesn't mention this, the high bit of a name
|
||||
// offset is set.
|
||||
void setNameOffset(uint32_t Offset) { NameOffset = Offset | (1 << 31); }
|
||||
} Identifier;
|
||||
union {
|
||||
support::ulittle32_t DataEntryOffset;
|
||||
|
@ -616,8 +616,8 @@ void WindowsResourceCOFFWriter::writeDirectoryTree() {
|
||||
for (auto const &Child : StringChildren) {
|
||||
auto *Entry = reinterpret_cast<coff_resource_dir_entry *>(BufferStart +
|
||||
CurrentOffset);
|
||||
Entry->Identifier.NameOffset =
|
||||
StringTableOffsets[Child.second->getStringIndex()];
|
||||
Entry->Identifier.setNameOffset(
|
||||
StringTableOffsets[Child.second->getStringIndex()]);
|
||||
if (Child.second->checkIsDataNode()) {
|
||||
Entry->Offset.DataEntryOffset = NextLevelOffset;
|
||||
NextLevelOffset += sizeof(coff_resource_data_entry);
|
||||
|
Loading…
Reference in New Issue
Block a user