mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-18 19:36:36 +00:00

This adds support for Symbols, StringTable, and FrameData subsection types. Even though these subsections rarely if ever appear in a PDB file (they are usually in object files), there's no theoretical reason why they *couldn't* appear in a PDB. The real issue though is that in order to add support for dumping and writing them (which will be useful for object files), we need a way to test them. And since there is no support for reading and writing them to / from object files yet, making PDB support them is the best way to both add support for the underlying format and add support for tests at the same time. Later, when we go to add support for reading / writing them from object files, we'll need only minimal changes in the underlying read/write code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305037 91177308-0d34-0410-b5e6-96231b3b80d8
81 lines
2.4 KiB
C++
81 lines
2.4 KiB
C++
//===- DebugStringTableSubsection.cpp - CodeView String Table ---*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
|
|
|
|
#include "llvm/Support/BinaryStream.h"
|
|
#include "llvm/Support/BinaryStreamReader.h"
|
|
#include "llvm/Support/BinaryStreamWriter.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::codeview;
|
|
|
|
DebugStringTableSubsectionRef::DebugStringTableSubsectionRef()
|
|
: DebugSubsectionRef(DebugSubsectionKind::StringTable) {}
|
|
|
|
Error DebugStringTableSubsectionRef::initialize(BinaryStreamRef Contents) {
|
|
Stream = Contents;
|
|
return Error::success();
|
|
}
|
|
Error DebugStringTableSubsectionRef::initialize(BinaryStreamReader &Reader) {
|
|
return Reader.readStreamRef(Stream);
|
|
}
|
|
|
|
Expected<StringRef>
|
|
DebugStringTableSubsectionRef::getString(uint32_t Offset) const {
|
|
BinaryStreamReader Reader(Stream);
|
|
Reader.setOffset(Offset);
|
|
StringRef Result;
|
|
if (auto EC = Reader.readCString(Result))
|
|
return std::move(EC);
|
|
return Result;
|
|
}
|
|
|
|
DebugStringTableSubsection::DebugStringTableSubsection()
|
|
: DebugSubsection(DebugSubsectionKind::StringTable) {}
|
|
|
|
uint32_t DebugStringTableSubsection::insert(StringRef S) {
|
|
auto P = Strings.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)
|
|
StringSize += S.size() + 1; // +1 for '\0'
|
|
return P.first->second;
|
|
}
|
|
|
|
uint32_t DebugStringTableSubsection::calculateSerializedSize() const {
|
|
return StringSize;
|
|
}
|
|
|
|
Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const {
|
|
uint32_t Begin = Writer.getOffset();
|
|
uint32_t End = Begin + StringSize;
|
|
|
|
for (auto &Pair : Strings) {
|
|
StringRef S = Pair.getKey();
|
|
uint32_t Offset = Begin + Pair.getValue();
|
|
Writer.setOffset(Offset);
|
|
if (auto EC = Writer.writeCString(S))
|
|
return EC;
|
|
assert(Writer.getOffset() <= End);
|
|
}
|
|
|
|
Writer.setOffset(End);
|
|
return Error::success();
|
|
}
|
|
|
|
uint32_t DebugStringTableSubsection::size() const { return Strings.size(); }
|
|
|
|
uint32_t DebugStringTableSubsection::getStringId(StringRef S) const {
|
|
auto Iter = Strings.find(S);
|
|
assert(Iter != Strings.end());
|
|
return Iter->second;
|
|
}
|