Line data Source code
1 : //===- 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/Native/InfoStreamBuilder.h"
11 :
12 : #include "llvm/DebugInfo/MSF/MSFBuilder.h"
13 : #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
14 : #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
15 : #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h"
16 : #include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
17 : #include "llvm/DebugInfo/PDB/Native/RawError.h"
18 : #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
19 : #include "llvm/Support/BinaryStreamWriter.h"
20 :
21 : using namespace llvm;
22 : using namespace llvm::codeview;
23 : using namespace llvm::msf;
24 : using namespace llvm::pdb;
25 :
26 111 : InfoStreamBuilder::InfoStreamBuilder(msf::MSFBuilder &Msf,
27 111 : NamedStreamMap &NamedStreams)
28 : : Msf(Msf), Ver(PdbRaw_ImplVer::PdbImplVC70), Age(0),
29 333 : NamedStreams(NamedStreams) {
30 111 : ::memset(&Guid, 0, sizeof(Guid));
31 111 : }
32 :
33 108 : void InfoStreamBuilder::setVersion(PdbRaw_ImplVer V) { Ver = V; }
34 :
35 48 : void InfoStreamBuilder::addFeature(PdbRaw_FeatureSig Sig) {
36 48 : Features.push_back(Sig);
37 48 : }
38 :
39 88 : void InfoStreamBuilder::setHashPDBContentsToGUID(bool B) {
40 88 : HashPDBContentsToGUID = B;
41 88 : }
42 :
43 20 : void InfoStreamBuilder::setAge(uint32_t A) { Age = A; }
44 :
45 20 : void InfoStreamBuilder::setSignature(uint32_t S) { Signature = S; }
46 :
47 20 : void InfoStreamBuilder::setGuid(GUID G) { Guid = G; }
48 :
49 :
50 222 : Error InfoStreamBuilder::finalizeMsfLayout() {
51 : uint32_t Length = sizeof(InfoStreamHeader) +
52 222 : NamedStreams.calculateSerializedLength() +
53 222 : (Features.size() + 1) * sizeof(uint32_t);
54 444 : if (auto EC = Msf.setStreamSize(StreamPDB, Length))
55 : return EC;
56 : return Error::success();
57 : }
58 :
59 111 : Error InfoStreamBuilder::commit(const msf::MSFLayout &Layout,
60 : WritableBinaryStreamRef Buffer) const {
61 : auto InfoS = WritableMappedBlockStream::createIndexedStream(
62 333 : Layout, Buffer, StreamPDB, Msf.getAllocator());
63 111 : BinaryStreamWriter Writer(*InfoS);
64 :
65 : InfoStreamHeader H;
66 : // Leave the build id fields 0 so they can be set as the last step before
67 : // committing the file to disk.
68 111 : ::memset(&H, 0, sizeof(H));
69 111 : H.Version = Ver;
70 111 : if (auto EC = Writer.writeObject(H))
71 : return EC;
72 :
73 222 : if (auto EC = NamedStreams.commit(Writer))
74 : return EC;
75 222 : if (auto EC = Writer.writeInteger(0))
76 : return EC;
77 159 : for (auto E : Features) {
78 48 : if (auto EC = Writer.writeEnum(E))
79 : return EC;
80 : }
81 : assert(Writer.bytesRemaining() == 0);
82 : return Error::success();
83 : }
|