1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- InfoStreamBuilder.cpp - PDB Info Stream Creation ---------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h"
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/StreamWriter.h"
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/Raw/RawError.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm;
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm::codeview;
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm::pdb;
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarInfoStreamBuilder::InfoStreamBuilder(IPDBFile &File) : File(File) {}
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid InfoStreamBuilder::setVersion(PdbRaw_ImplVer V) { Ver = V; }
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid InfoStreamBuilder::setSignature(uint32_t S) { Sig = S; }
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid InfoStreamBuilder::setAge(uint32_t A) { Age = A; }
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid InfoStreamBuilder::setGuid(PDB_UniqueId G) { Guid = G; }
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarExpected<std::unique_ptr<InfoStream>> InfoStreamBuilder::build() {
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Ver.hasValue())
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return make_error<RawError>(raw_error_code::unspecified,
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                "Missing PDB Stream Version");
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Sig.hasValue())
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return make_error<RawError>(raw_error_code::unspecified,
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                "Missing PDB Stream Signature");
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Age.hasValue())
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return make_error<RawError>(raw_error_code::unspecified,
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                "Missing PDB Stream Age");
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Guid.hasValue())
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return make_error<RawError>(raw_error_code::unspecified,
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                "Missing PDB Stream Guid");
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto InfoS = MappedBlockStream::createIndexedStream(StreamPDB, File);
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!InfoS)
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return InfoS.takeError();
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto Info = llvm::make_unique<InfoStream>(std::move(*InfoS));
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info->Version = *Ver;
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info->Signature = *Sig;
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info->Age = *Age;
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info->Guid = *Guid;
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return std::move(Info);
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
55