mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01: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
90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
//===- DebugStringTableSubsection.h - 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.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H
|
|
#define LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H
|
|
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
|
|
#include "llvm/Support/BinaryStreamRef.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
namespace llvm {
|
|
|
|
class BinaryStreamReader;
|
|
class BinaryStreamRef;
|
|
class BinaryStreamWriter;
|
|
|
|
namespace codeview {
|
|
|
|
/// Represents a read-only view of a CodeView string table. This is a very
|
|
/// simple flat buffer consisting of null-terminated strings, where strings
|
|
/// are retrieved by their offset in the buffer. DebugStringTableSubsectionRef
|
|
/// does not own the underlying storage for the buffer.
|
|
class DebugStringTableSubsectionRef : public DebugSubsectionRef {
|
|
public:
|
|
DebugStringTableSubsectionRef();
|
|
|
|
static bool classof(const DebugSubsectionRef *S) {
|
|
return S->kind() == DebugSubsectionKind::StringTable;
|
|
}
|
|
|
|
Error initialize(BinaryStreamRef Contents);
|
|
Error initialize(BinaryStreamReader &Reader);
|
|
|
|
Expected<StringRef> getString(uint32_t Offset) const;
|
|
|
|
bool valid() const { return Stream.valid(); }
|
|
|
|
BinaryStreamRef getBuffer() const { return Stream; }
|
|
|
|
private:
|
|
BinaryStreamRef Stream;
|
|
};
|
|
|
|
/// Represents a read-write view of a CodeView string table.
|
|
/// DebugStringTableSubsection owns the underlying storage for the table, and is
|
|
/// capable of serializing the string table into a format understood by
|
|
/// DebugStringTableSubsectionRef.
|
|
class DebugStringTableSubsection : public DebugSubsection {
|
|
public:
|
|
DebugStringTableSubsection();
|
|
|
|
static bool classof(const DebugSubsection *S) {
|
|
return S->kind() == DebugSubsectionKind::StringTable;
|
|
}
|
|
|
|
// If string S does not exist in the string table, insert it.
|
|
// Returns the ID for S.
|
|
uint32_t insert(StringRef S);
|
|
|
|
// Return the ID for string S. Assumes S exists in the table.
|
|
uint32_t getStringId(StringRef S) const;
|
|
|
|
uint32_t calculateSerializedSize() const override;
|
|
Error commit(BinaryStreamWriter &Writer) const override;
|
|
|
|
uint32_t size() const;
|
|
|
|
StringMap<uint32_t>::const_iterator begin() const { return Strings.begin(); }
|
|
|
|
StringMap<uint32_t>::const_iterator end() const { return Strings.end(); }
|
|
|
|
private:
|
|
StringMap<uint32_t> Strings;
|
|
uint32_t StringSize = 1;
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif
|