You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.6 KiB
77 lines
2.6 KiB
4 months ago
|
//===- DbiStreamBuilder.cpp - PDB Dbi Stream Creation -----------*- 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/PDB/Raw/DbiStreamBuilder.h"
|
||
|
|
||
|
#include "llvm/DebugInfo/CodeView/StreamWriter.h"
|
||
|
#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
|
||
|
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
|
||
|
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
|
||
|
|
||
|
using namespace llvm;
|
||
|
using namespace llvm::codeview;
|
||
|
using namespace llvm::pdb;
|
||
|
|
||
|
DbiStreamBuilder::DbiStreamBuilder(PDBFile &File)
|
||
|
: File(File), Age(1), BuildNumber(0), PdbDllVersion(0), PdbDllRbld(0),
|
||
|
Flags(0), MachineType(PDB_Machine::x86) {}
|
||
|
|
||
|
void DbiStreamBuilder::setVersionHeader(PdbRaw_DbiVer V) { VerHeader = V; }
|
||
|
|
||
|
void DbiStreamBuilder::setAge(uint32_t A) { Age = A; }
|
||
|
|
||
|
void DbiStreamBuilder::setBuildNumber(uint16_t B) { BuildNumber = B; }
|
||
|
|
||
|
void DbiStreamBuilder::setPdbDllVersion(uint16_t V) { PdbDllVersion = V; }
|
||
|
|
||
|
void DbiStreamBuilder::setPdbDllRbld(uint16_t R) { PdbDllRbld = R; }
|
||
|
|
||
|
void DbiStreamBuilder::setFlags(uint16_t F) { Flags = F; }
|
||
|
|
||
|
void DbiStreamBuilder::setMachineType(PDB_Machine M) { MachineType = M; }
|
||
|
|
||
|
Expected<std::unique_ptr<DbiStream>> DbiStreamBuilder::build() {
|
||
|
if (!VerHeader.hasValue())
|
||
|
return make_error<RawError>(raw_error_code::unspecified,
|
||
|
"Missing DBI Stream Version");
|
||
|
|
||
|
auto DbiS = MappedBlockStream::createIndexedStream(StreamDBI, File);
|
||
|
if (!DbiS)
|
||
|
return DbiS.takeError();
|
||
|
auto DS = std::move(*DbiS);
|
||
|
DbiStream::HeaderInfo *H =
|
||
|
static_cast<DbiStream::HeaderInfo *>(DS->getAllocator().Allocate(
|
||
|
sizeof(DbiStream::HeaderInfo),
|
||
|
llvm::AlignOf<DbiStream::HeaderInfo>::Alignment));
|
||
|
H->VersionHeader = *VerHeader;
|
||
|
H->VersionSignature = -1;
|
||
|
H->Age = Age;
|
||
|
H->BuildNumber = BuildNumber;
|
||
|
H->Flags = Flags;
|
||
|
H->PdbDllRbld = PdbDllRbld;
|
||
|
H->PdbDllVersion = PdbDllVersion;
|
||
|
H->MachineType = static_cast<uint16_t>(MachineType);
|
||
|
|
||
|
H->ECSubstreamSize = 0;
|
||
|
H->FileInfoSize = 0;
|
||
|
H->ModiSubstreamSize = 0;
|
||
|
H->OptionalDbgHdrSize = 0;
|
||
|
H->SecContrSubstreamSize = 0;
|
||
|
H->SectionMapSize = 0;
|
||
|
H->TypeServerSize = 0;
|
||
|
H->SymRecordStreamIndex = DbiStream::InvalidStreamIndex;
|
||
|
H->PublicSymbolStreamIndex = DbiStream::InvalidStreamIndex;
|
||
|
H->MFCTypeServerIndex = DbiStream::InvalidStreamIndex;
|
||
|
H->GlobalSymbolStreamIndex = DbiStream::InvalidStreamIndex;
|
||
|
|
||
|
auto Dbi = llvm::make_unique<DbiStream>(File, std::move(DS));
|
||
|
Dbi->Header = H;
|
||
|
return std::move(Dbi);
|
||
|
}
|