mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
Based strictly on the name, this seems to have something to do width edit & continue. The goal of this patch has nothing to do with supporting edit and continue though. msvc link.exe writes very basic information into this area even when *not* compiling with support for E&C, and so the goal here is to bring lld-link to parity. Since we cannot know what assumptions standard tools make about the content of PDB files, we need to be as close as possible. This ECNames data structure is a standard PDB string hash table. link.exe puts a single string into this hash table, which is the full path to the PDB file on disk. It then references this string from the module descriptor for the compiler generated `* Linker *` module. With this patch, lld-link will generate the exact same sequence of bytes as MSVC link for this subsection for a given object file input (as reported by `llvm-pdbutil bytes -ec`). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307356 91177308-0d34-0410-b5e6-96231b3b80d8
128 lines
3.7 KiB
C++
128 lines
3.7 KiB
C++
//===- DbiStream.h - PDB Dbi Stream (Stream 3) Access -----------*- 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_PDB_RAW_PDBDBISTREAM_H
|
|
#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
|
|
|
|
#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
|
|
#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
|
|
#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
|
|
#include "llvm/DebugInfo/PDB/Native/DbiModuleList.h"
|
|
#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
|
|
#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
|
|
#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
|
|
#include "llvm/DebugInfo/PDB/PDBTypes.h"
|
|
#include "llvm/Support/BinaryStreamArray.h"
|
|
#include "llvm/Support/BinaryStreamRef.h"
|
|
#include "llvm/Support/Endian.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
namespace llvm {
|
|
namespace object {
|
|
struct FpoData;
|
|
struct coff_section;
|
|
}
|
|
|
|
namespace pdb {
|
|
class DbiStreamBuilder;
|
|
class PDBFile;
|
|
class ISectionContribVisitor;
|
|
|
|
class DbiStream {
|
|
friend class DbiStreamBuilder;
|
|
|
|
public:
|
|
DbiStream(PDBFile &File, std::unique_ptr<msf::MappedBlockStream> Stream);
|
|
~DbiStream();
|
|
Error reload();
|
|
|
|
PdbRaw_DbiVer getDbiVersion() const;
|
|
uint32_t getAge() const;
|
|
uint16_t getPublicSymbolStreamIndex() const;
|
|
uint16_t getGlobalSymbolStreamIndex() const;
|
|
|
|
uint16_t getFlags() const;
|
|
bool isIncrementallyLinked() const;
|
|
bool hasCTypes() const;
|
|
bool isStripped() const;
|
|
|
|
uint16_t getBuildNumber() const;
|
|
uint16_t getBuildMajorVersion() const;
|
|
uint16_t getBuildMinorVersion() const;
|
|
|
|
uint16_t getPdbDllRbld() const;
|
|
uint32_t getPdbDllVersion() const;
|
|
|
|
uint32_t getSymRecordStreamIndex() const;
|
|
|
|
PDB_Machine getMachineType() const;
|
|
|
|
BinarySubstreamRef getSectionContributionData() const;
|
|
BinarySubstreamRef getSecMapSubstreamData() const;
|
|
BinarySubstreamRef getModiSubstreamData() const;
|
|
BinarySubstreamRef getFileInfoSubstreamData() const;
|
|
BinarySubstreamRef getTypeServerMapSubstreamData() const;
|
|
BinarySubstreamRef getECSubstreamData() const;
|
|
|
|
/// If the given stream type is present, returns its stream index. If it is
|
|
/// not present, returns InvalidStreamIndex.
|
|
uint32_t getDebugStreamIndex(DbgHeaderType Type) const;
|
|
|
|
const DbiModuleList &modules() const;
|
|
|
|
FixedStreamArray<object::coff_section> getSectionHeaders();
|
|
|
|
FixedStreamArray<object::FpoData> getFpoRecords();
|
|
|
|
FixedStreamArray<SecMapEntry> getSectionMap() const;
|
|
void visitSectionContributions(ISectionContribVisitor &Visitor) const;
|
|
|
|
Expected<StringRef> getECName(uint32_t NI) const;
|
|
|
|
private:
|
|
Error initializeSectionContributionData();
|
|
Error initializeSectionHeadersData();
|
|
Error initializeSectionMapData();
|
|
Error initializeFpoRecords();
|
|
|
|
PDBFile &Pdb;
|
|
std::unique_ptr<msf::MappedBlockStream> Stream;
|
|
|
|
PDBStringTable ECNames;
|
|
|
|
BinarySubstreamRef SecContrSubstream;
|
|
BinarySubstreamRef SecMapSubstream;
|
|
BinarySubstreamRef ModiSubstream;
|
|
BinarySubstreamRef FileInfoSubstream;
|
|
BinarySubstreamRef TypeServerMapSubstream;
|
|
BinarySubstreamRef ECSubstream;
|
|
|
|
DbiModuleList Modules;
|
|
|
|
FixedStreamArray<support::ulittle16_t> DbgStreams;
|
|
|
|
PdbRaw_DbiSecContribVer SectionContribVersion =
|
|
PdbRaw_DbiSecContribVer::DbiSecContribVer60;
|
|
FixedStreamArray<SectionContrib> SectionContribs;
|
|
FixedStreamArray<SectionContrib2> SectionContribs2;
|
|
FixedStreamArray<SecMapEntry> SectionMap;
|
|
|
|
std::unique_ptr<msf::MappedBlockStream> SectionHeaderStream;
|
|
FixedStreamArray<object::coff_section> SectionHeaders;
|
|
|
|
std::unique_ptr<msf::MappedBlockStream> FpoStream;
|
|
FixedStreamArray<object::FpoData> FpoRecords;
|
|
|
|
const DbiStreamHeader *Header;
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif
|