blob: 444aba6be0b1add474164641b4d2126d58b9e651 [file] [log] [blame]
Zachary Turnerdbeaea72016-07-11 21:45:26 +00001//===- InfoStreamBuilder.cpp - PDB Info Stream Creation ---------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h"
11
Zachary Turnerbac69d32016-07-22 19:56:05 +000012#include "llvm/DebugInfo/Msf/MappedBlockStream.h"
13#include "llvm/DebugInfo/Msf/StreamWriter.h"
Zachary Turnerdbeaea72016-07-11 21:45:26 +000014#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
Zachary Turnerdbeaea72016-07-11 21:45:26 +000015#include "llvm/DebugInfo/PDB/Raw/RawError.h"
16
17using namespace llvm;
18using namespace llvm::codeview;
Zachary Turnerbac69d32016-07-22 19:56:05 +000019using namespace llvm::msf;
Zachary Turnerdbeaea72016-07-11 21:45:26 +000020using namespace llvm::pdb;
21
Zachary Turnerfaa554b2016-07-15 22:16:56 +000022InfoStreamBuilder::InfoStreamBuilder() {}
Zachary Turnerdbeaea72016-07-11 21:45:26 +000023
24void InfoStreamBuilder::setVersion(PdbRaw_ImplVer V) { Ver = V; }
25
26void InfoStreamBuilder::setSignature(uint32_t S) { Sig = S; }
27
28void InfoStreamBuilder::setAge(uint32_t A) { Age = A; }
29
30void InfoStreamBuilder::setGuid(PDB_UniqueId G) { Guid = G; }
31
Zachary Turner5e534c72016-07-15 22:17:08 +000032NameMapBuilder &InfoStreamBuilder::getNamedStreamsBuilder() {
33 return NamedStreams;
34}
35
Zachary Turnerfaa554b2016-07-15 22:16:56 +000036uint32_t InfoStreamBuilder::calculateSerializedLength() const {
37 return sizeof(InfoStream::HeaderInfo) +
38 NamedStreams.calculateSerializedLength();
39}
40
41Expected<std::unique_ptr<InfoStream>> InfoStreamBuilder::build(PDBFile &File) {
Zachary Turnerdbeaea72016-07-11 21:45:26 +000042 if (!Ver.hasValue())
43 return make_error<RawError>(raw_error_code::unspecified,
44 "Missing PDB Stream Version");
45 if (!Sig.hasValue())
46 return make_error<RawError>(raw_error_code::unspecified,
47 "Missing PDB Stream Signature");
48 if (!Age.hasValue())
49 return make_error<RawError>(raw_error_code::unspecified,
50 "Missing PDB Stream Age");
51 if (!Guid.hasValue())
52 return make_error<RawError>(raw_error_code::unspecified,
53 "Missing PDB Stream Guid");
54
55 auto InfoS = MappedBlockStream::createIndexedStream(StreamPDB, File);
56 if (!InfoS)
57 return InfoS.takeError();
58 auto Info = llvm::make_unique<InfoStream>(std::move(*InfoS));
59 Info->Version = *Ver;
60 Info->Signature = *Sig;
61 Info->Age = *Age;
62 Info->Guid = *Guid;
Zachary Turner5e534c72016-07-15 22:17:08 +000063 auto NS = NamedStreams.build();
64 if (!NS)
65 return NS.takeError();
66 Info->NamedStreams = **NS;
Zachary Turnerdbeaea72016-07-11 21:45:26 +000067 return std::move(Info);
68}