mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[llvm-dwp] Deduplicate strings in the debug_str.dwo section
Also, ensure that references to those strings in debug_str_offsets.dwo correctly refer to the deduplicated strings. llvm-svn: 254441
This commit is contained in:
parent
6501fb731e
commit
2b4f493936
@ -46,13 +46,11 @@ FIXME: Emit and verify the cu_index contents
|
||||
CHECK: .debug_str.dwo contents:
|
||||
CHECK: "clang version
|
||||
CHECK: 0x[[ACPP:.*]]: "a.cpp"
|
||||
FIXME: Remove duplicates
|
||||
CHECK: 0x[[SECONDREV:.*]]: "clang version
|
||||
CHECK-NOT: "clang version
|
||||
CHECK: 0x[[BCPP:.*]]: "b.cpp"
|
||||
|
||||
CHECK: .debug_str_offsets.dwo contents:
|
||||
CHECK: : 00000000
|
||||
CHECK: : [[ACPP]]
|
||||
CHECK: : [[SECONDREV]]
|
||||
FIXME: Update str offset indexes, this should be BCPP \/
|
||||
CHECK: : 00000000
|
||||
CHECK: : [[BCPP]]
|
||||
|
@ -40,8 +40,9 @@ static int error(const Twine &Error, const Twine &Context) {
|
||||
|
||||
static std::error_code
|
||||
writeStringsAndOffsets(MCStreamer &Out, StringMap<uint32_t> &Strings,
|
||||
uint32_t &StringOffset, MCSection *StrOffsetSection,
|
||||
StringRef CurStrSection, StringRef CurStrOffsetSection) {
|
||||
uint32_t &StringOffset, MCSection *StrSection,
|
||||
MCSection *StrOffsetSection, StringRef CurStrSection,
|
||||
StringRef CurStrOffsetSection) {
|
||||
// Could possibly produce an error or warning if one of these was non-null but
|
||||
// the other was null.
|
||||
if (CurStrSection.empty() || CurStrOffsetSection.empty())
|
||||
@ -54,9 +55,14 @@ writeStringsAndOffsets(MCStreamer &Out, StringMap<uint32_t> &Strings,
|
||||
uint32_t PrevOffset = 0;
|
||||
while (const char *s = Data.getCStr(&LocalOffset)) {
|
||||
StringRef Str(s, LocalOffset - PrevOffset - 1);
|
||||
OffsetRemapping[PrevOffset] = StringOffset;
|
||||
// insert, if successful, write new string to the str.dwo section
|
||||
StringOffset += Str.size() + 1;
|
||||
auto Pair = Strings.insert(std::make_pair(Str, StringOffset));
|
||||
if (Pair.second) {
|
||||
Out.SwitchSection(StrSection);
|
||||
Out.EmitBytes(
|
||||
StringRef(Pair.first->getKeyData(), Pair.first->getKeyLength() + 1));
|
||||
StringOffset += Str.size() + 1;
|
||||
}
|
||||
OffsetRemapping[PrevOffset] = Pair.first->second;
|
||||
PrevOffset = LocalOffset;
|
||||
}
|
||||
|
||||
@ -106,19 +112,19 @@ static std::error_code write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
|
||||
StringRef Contents;
|
||||
if (auto Err = Section.getContents(Contents))
|
||||
return Err;
|
||||
if (OutSection == StrOffsetSection) {
|
||||
if (OutSection == StrOffsetSection)
|
||||
CurStrOffsetSection = Contents;
|
||||
continue;
|
||||
}
|
||||
if (OutSection == StrSection)
|
||||
else if (OutSection == StrSection)
|
||||
CurStrSection = Contents;
|
||||
Out.SwitchSection(OutSection);
|
||||
Out.EmitBytes(Contents);
|
||||
else {
|
||||
Out.SwitchSection(OutSection);
|
||||
Out.EmitBytes(Contents);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (auto Err =
|
||||
writeStringsAndOffsets(Out, Strings, StringOffset, StrOffsetSection,
|
||||
CurStrSection, CurStrOffsetSection))
|
||||
if (auto Err = writeStringsAndOffsets(Out, Strings, StringOffset,
|
||||
StrSection, StrOffsetSection,
|
||||
CurStrSection, CurStrOffsetSection))
|
||||
return Err;
|
||||
}
|
||||
return std::error_code();
|
||||
|
Loading…
Reference in New Issue
Block a user