1
0
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:
David Blaikie 2015-12-01 19:17:58 +00:00
parent 6501fb731e
commit 2b4f493936
2 changed files with 22 additions and 18 deletions

View File

@ -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]]

View File

@ -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();