1*67c56014SZachary Turner //===- DbiModuleDescriptor.cpp - PDB module information -------------------===//
2*67c56014SZachary Turner //
3*67c56014SZachary Turner //                     The LLVM Compiler Infrastructure
4*67c56014SZachary Turner //
5*67c56014SZachary Turner // This file is distributed under the University of Illinois Open Source
6*67c56014SZachary Turner // License. See LICENSE.TXT for details.
7*67c56014SZachary Turner //
8*67c56014SZachary Turner //===----------------------------------------------------------------------===//
9*67c56014SZachary Turner 
10*67c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
11*67c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
12*67c56014SZachary Turner #include "llvm/Support/BinaryStreamReader.h"
13*67c56014SZachary Turner #include "llvm/Support/Endian.h"
14*67c56014SZachary Turner #include "llvm/Support/Error.h"
15*67c56014SZachary Turner #include "llvm/Support/MathExtras.h"
16*67c56014SZachary Turner #include <cstdint>
17*67c56014SZachary Turner 
18*67c56014SZachary Turner using namespace llvm;
19*67c56014SZachary Turner using namespace llvm::pdb;
20*67c56014SZachary Turner using namespace llvm::support;
21*67c56014SZachary Turner 
22*67c56014SZachary Turner DbiModuleDescriptor::DbiModuleDescriptor() = default;
23*67c56014SZachary Turner 
24*67c56014SZachary Turner DbiModuleDescriptor::DbiModuleDescriptor(const DbiModuleDescriptor &Info) =
25*67c56014SZachary Turner     default;
26*67c56014SZachary Turner 
27*67c56014SZachary Turner DbiModuleDescriptor::~DbiModuleDescriptor() = default;
28*67c56014SZachary Turner 
29*67c56014SZachary Turner Error DbiModuleDescriptor::initialize(BinaryStreamRef Stream,
30*67c56014SZachary Turner                                       DbiModuleDescriptor &Info) {
31*67c56014SZachary Turner   BinaryStreamReader Reader(Stream);
32*67c56014SZachary Turner   if (auto EC = Reader.readObject(Info.Layout))
33*67c56014SZachary Turner     return EC;
34*67c56014SZachary Turner 
35*67c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ModuleName))
36*67c56014SZachary Turner     return EC;
37*67c56014SZachary Turner 
38*67c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ObjFileName))
39*67c56014SZachary Turner     return EC;
40*67c56014SZachary Turner   return Error::success();
41*67c56014SZachary Turner }
42*67c56014SZachary Turner 
43*67c56014SZachary Turner bool DbiModuleDescriptor::hasECInfo() const {
44*67c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0;
45*67c56014SZachary Turner }
46*67c56014SZachary Turner 
47*67c56014SZachary Turner uint16_t DbiModuleDescriptor::getTypeServerIndex() const {
48*67c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >>
49*67c56014SZachary Turner          ModInfoFlags::TypeServerIndexShift;
50*67c56014SZachary Turner }
51*67c56014SZachary Turner 
52*67c56014SZachary Turner uint16_t DbiModuleDescriptor::getModuleStreamIndex() const {
53*67c56014SZachary Turner   return Layout->ModDiStream;
54*67c56014SZachary Turner }
55*67c56014SZachary Turner 
56*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const {
57*67c56014SZachary Turner   return Layout->SymBytes;
58*67c56014SZachary Turner }
59*67c56014SZachary Turner 
60*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getLineInfoByteSize() const {
61*67c56014SZachary Turner   return Layout->LineBytes;
62*67c56014SZachary Turner }
63*67c56014SZachary Turner 
64*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const {
65*67c56014SZachary Turner   return Layout->C13Bytes;
66*67c56014SZachary Turner }
67*67c56014SZachary Turner 
68*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getNumberOfFiles() const {
69*67c56014SZachary Turner   return Layout->NumFiles;
70*67c56014SZachary Turner }
71*67c56014SZachary Turner 
72*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getSourceFileNameIndex() const {
73*67c56014SZachary Turner   return Layout->SrcFileNameNI;
74*67c56014SZachary Turner }
75*67c56014SZachary Turner 
76*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const {
77*67c56014SZachary Turner   return Layout->PdbFilePathNI;
78*67c56014SZachary Turner }
79*67c56014SZachary Turner 
80*67c56014SZachary Turner StringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; }
81*67c56014SZachary Turner 
82*67c56014SZachary Turner StringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; }
83*67c56014SZachary Turner 
84*67c56014SZachary Turner uint32_t DbiModuleDescriptor::getRecordLength() const {
85*67c56014SZachary Turner   uint32_t M = ModuleName.str().size() + 1;
86*67c56014SZachary Turner   uint32_t O = ObjFileName.str().size() + 1;
87*67c56014SZachary Turner   uint32_t Size = sizeof(ModuleInfoHeader) + M + O;
88*67c56014SZachary Turner   Size = alignTo(Size, 4);
89*67c56014SZachary Turner   return Size;
90*67c56014SZachary Turner }
91