blob: 7be9cc32db96377d8cf809a8d3f214df08f796b7 [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
12#include "llvm/DebugInfo/CodeView/StreamWriter.h"
13#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
14#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
15#include "llvm/DebugInfo/PDB/Raw/RawError.h"
16
17using namespace llvm;
18using namespace llvm::codeview;
19using namespace llvm::pdb;
20
Zachary Turnerfaa554b2016-07-15 22:16:56 +000021InfoStreamBuilder::InfoStreamBuilder() {}
Zachary Turnerdbeaea72016-07-11 21:45:26 +000022
23void InfoStreamBuilder::setVersion(PdbRaw_ImplVer V) { Ver = V; }
24
25void InfoStreamBuilder::setSignature(uint32_t S) { Sig = S; }
26
27void InfoStreamBuilder::setAge(uint32_t A) { Age = A; }
28
29void InfoStreamBuilder::setGuid(PDB_UniqueId G) { Guid = G; }
30
Zachary Turner5e534c72016-07-15 22:17:08 +000031NameMapBuilder &InfoStreamBuilder::getNamedStreamsBuilder() {
32 return NamedStreams;
33}
34
Zachary Turnerfaa554b2016-07-15 22:16:56 +000035uint32_t InfoStreamBuilder::calculateSerializedLength() const {
36 return sizeof(InfoStream::HeaderInfo) +
37 NamedStreams.calculateSerializedLength();
38}
39
40Expected<std::unique_ptr<InfoStream>> InfoStreamBuilder::build(PDBFile &File) {
Zachary Turnerdbeaea72016-07-11 21:45:26 +000041 if (!Ver.hasValue())
42 return make_error<RawError>(raw_error_code::unspecified,
43 "Missing PDB Stream Version");
44 if (!Sig.hasValue())
45 return make_error<RawError>(raw_error_code::unspecified,
46 "Missing PDB Stream Signature");
47 if (!Age.hasValue())
48 return make_error<RawError>(raw_error_code::unspecified,
49 "Missing PDB Stream Age");
50 if (!Guid.hasValue())
51 return make_error<RawError>(raw_error_code::unspecified,
52 "Missing PDB Stream Guid");
53
54 auto InfoS = MappedBlockStream::createIndexedStream(StreamPDB, File);
55 if (!InfoS)
56 return InfoS.takeError();
57 auto Info = llvm::make_unique<InfoStream>(std::move(*InfoS));
58 Info->Version = *Ver;
59 Info->Signature = *Sig;
60 Info->Age = *Age;
61 Info->Guid = *Guid;
Zachary Turner5e534c72016-07-15 22:17:08 +000062 auto NS = NamedStreams.build();
63 if (!NS)
64 return NS.takeError();
65 Info->NamedStreams = **NS;
Zachary Turnerdbeaea72016-07-11 21:45:26 +000066 return std::move(Info);
67}