[CodeView] Write CodeView line information.

Differential Revision: https://reviews.llvm.org/D32716

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301882 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zachary Turner
2017-05-01 23:27:42 +00:00
parent 2cc0b076e8
commit 4c78c0e348
24 changed files with 526 additions and 14 deletions

View File

@@ -48,3 +48,50 @@ Error ModuleDebugFileChecksumFragmentRef::initialize(
return Error::success();
}
ModuleDebugFileChecksumFragment::ModuleDebugFileChecksumFragment()
: ModuleDebugFragment(ModuleDebugFragmentKind::FileChecksums) {}
void ModuleDebugFileChecksumFragment::addChecksum(uint32_t StringTableOffset,
FileChecksumKind Kind,
ArrayRef<uint8_t> Bytes) {
FileChecksumEntry Entry;
if (!Bytes.empty()) {
uint8_t *Copy = Storage.Allocate<uint8_t>(Bytes.size());
::memcpy(Copy, Bytes.data(), Bytes.size());
Entry.Checksum = makeArrayRef(Copy, Bytes.size());
}
Entry.FileNameOffset = StringTableOffset;
Entry.Kind = Kind;
Checksums.push_back(Entry);
// This maps the offset of this string in the string table to the offset
// of this checksum entry in the checksum buffer.
OffsetMap[StringTableOffset] = SerializedSize;
SerializedSize += sizeof(FileChecksumEntryHeader) + Bytes.size();
}
uint32_t ModuleDebugFileChecksumFragment::calculateSerializedLength() {
return SerializedSize;
}
Error ModuleDebugFileChecksumFragment::commit(BinaryStreamWriter &Writer) {
for (const auto &FC : Checksums) {
FileChecksumEntryHeader Header;
Header.ChecksumKind = uint8_t(FC.Kind);
Header.ChecksumSize = FC.Checksum.size();
Header.FileNameOffset = FC.FileNameOffset;
if (auto EC = Writer.writeObject(Header))
return EC;
if (auto EC = Writer.writeArray(makeArrayRef(FC.Checksum)))
return EC;
}
return Error::success();
}
uint32_t ModuleDebugFileChecksumFragment::mapChecksumOffset(
uint32_t StringTableOffset) const {
auto Iter = OffsetMap.find(StringTableOffset);
assert(Iter != OffsetMap.end());
return Iter->second;
}