Resubmit "Support embedding natvis files in PDBs."

The issue causing this to fail in certain configurations
should be fixed.

It was due to the fact that DIA apparently expects there to be
a null string at ID 1 in the string table.  I'm not sure why this
is important but it seems to make a difference, so set it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328002 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zachary Turner
2018-03-20 17:06:39 +00:00
parent f60cf82ca0
commit 119b4ed31a
19 changed files with 309 additions and 42 deletions
@@ -46,12 +46,15 @@ DebugStringTableSubsection::DebugStringTableSubsection()
: DebugSubsection(DebugSubsectionKind::StringTable) {}
uint32_t DebugStringTableSubsection::insert(StringRef S) {
auto P = Strings.insert({S, StringSize});
auto P = StringToId.insert({S, StringSize});
// If a given string didn't exist in the string table, we want to increment
// the string table size.
if (P.second)
// the string table size and insert it into the reverse lookup.
if (P.second) {
IdToString.insert({P.first->getValue(), P.first->getKey()});
StringSize += S.size() + 1; // +1 for '\0'
}
return P.first->second;
}
@@ -67,7 +70,7 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const {
if (auto EC = Writer.writeCString(StringRef()))
return EC;
for (auto &Pair : Strings) {
for (auto &Pair : StringToId) {
StringRef S = Pair.getKey();
uint32_t Offset = Begin + Pair.getValue();
Writer.setOffset(Offset);
@@ -81,10 +84,16 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const {
return Error::success();
}
uint32_t DebugStringTableSubsection::size() const { return Strings.size(); }
uint32_t DebugStringTableSubsection::size() const { return StringToId.size(); }
uint32_t DebugStringTableSubsection::getStringId(StringRef S) const {
auto Iter = Strings.find(S);
assert(Iter != Strings.end());
uint32_t DebugStringTableSubsection::getIdForString(StringRef S) const {
auto Iter = StringToId.find(S);
assert(Iter != StringToId.end());
return Iter->second;
}
StringRef DebugStringTableSubsection::getStringForId(uint32_t Id) const {
auto Iter = IdToString.find(Id);
assert(Iter != IdToString.end());
return Iter->second;
}