1*0b57cec5SDimitry Andric //===- DbiModuleDescriptor.cpp - PDB module information -------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
10*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
11*0b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamReader.h"
12*0b57cec5SDimitry Andric #include "llvm/Support/Endian.h"
13*0b57cec5SDimitry Andric #include "llvm/Support/Error.h"
14*0b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h"
15*0b57cec5SDimitry Andric #include <cstdint>
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric using namespace llvm;
18*0b57cec5SDimitry Andric using namespace llvm::pdb;
19*0b57cec5SDimitry Andric using namespace llvm::support;
20*0b57cec5SDimitry Andric 
initialize(BinaryStreamRef Stream,DbiModuleDescriptor & Info)21*0b57cec5SDimitry Andric Error DbiModuleDescriptor::initialize(BinaryStreamRef Stream,
22*0b57cec5SDimitry Andric                                       DbiModuleDescriptor &Info) {
23*0b57cec5SDimitry Andric   BinaryStreamReader Reader(Stream);
24*0b57cec5SDimitry Andric   if (auto EC = Reader.readObject(Info.Layout))
25*0b57cec5SDimitry Andric     return EC;
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric   if (auto EC = Reader.readCString(Info.ModuleName))
28*0b57cec5SDimitry Andric     return EC;
29*0b57cec5SDimitry Andric 
30*0b57cec5SDimitry Andric   if (auto EC = Reader.readCString(Info.ObjFileName))
31*0b57cec5SDimitry Andric     return EC;
32*0b57cec5SDimitry Andric   return Error::success();
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
hasECInfo() const35*0b57cec5SDimitry Andric bool DbiModuleDescriptor::hasECInfo() const {
36*0b57cec5SDimitry Andric   return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0;
37*0b57cec5SDimitry Andric }
38*0b57cec5SDimitry Andric 
getTypeServerIndex() const39*0b57cec5SDimitry Andric uint16_t DbiModuleDescriptor::getTypeServerIndex() const {
40*0b57cec5SDimitry Andric   return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >>
41*0b57cec5SDimitry Andric          ModInfoFlags::TypeServerIndexShift;
42*0b57cec5SDimitry Andric }
43*0b57cec5SDimitry Andric 
getSectionContrib() const44*0b57cec5SDimitry Andric const SectionContrib &DbiModuleDescriptor::getSectionContrib() const {
45*0b57cec5SDimitry Andric   return Layout->SC;
46*0b57cec5SDimitry Andric }
47*0b57cec5SDimitry Andric 
getModuleStreamIndex() const48*0b57cec5SDimitry Andric uint16_t DbiModuleDescriptor::getModuleStreamIndex() const {
49*0b57cec5SDimitry Andric   return Layout->ModDiStream;
50*0b57cec5SDimitry Andric }
51*0b57cec5SDimitry Andric 
getSymbolDebugInfoByteSize() const52*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const {
53*0b57cec5SDimitry Andric   return Layout->SymBytes;
54*0b57cec5SDimitry Andric }
55*0b57cec5SDimitry Andric 
getC11LineInfoByteSize() const56*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const {
57*0b57cec5SDimitry Andric   return Layout->C11Bytes;
58*0b57cec5SDimitry Andric }
59*0b57cec5SDimitry Andric 
getC13LineInfoByteSize() const60*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const {
61*0b57cec5SDimitry Andric   return Layout->C13Bytes;
62*0b57cec5SDimitry Andric }
63*0b57cec5SDimitry Andric 
getNumberOfFiles() const64*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getNumberOfFiles() const {
65*0b57cec5SDimitry Andric   return Layout->NumFiles;
66*0b57cec5SDimitry Andric }
67*0b57cec5SDimitry Andric 
getSourceFileNameIndex() const68*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getSourceFileNameIndex() const {
69*0b57cec5SDimitry Andric   return Layout->SrcFileNameNI;
70*0b57cec5SDimitry Andric }
71*0b57cec5SDimitry Andric 
getPdbFilePathNameIndex() const72*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const {
73*0b57cec5SDimitry Andric   return Layout->PdbFilePathNI;
74*0b57cec5SDimitry Andric }
75*0b57cec5SDimitry Andric 
getModuleName() const76*0b57cec5SDimitry Andric StringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; }
77*0b57cec5SDimitry Andric 
getObjFileName() const78*0b57cec5SDimitry Andric StringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; }
79*0b57cec5SDimitry Andric 
getRecordLength() const80*0b57cec5SDimitry Andric uint32_t DbiModuleDescriptor::getRecordLength() const {
81*0b57cec5SDimitry Andric   uint32_t M = ModuleName.str().size() + 1;
82*0b57cec5SDimitry Andric   uint32_t O = ObjFileName.str().size() + 1;
83*0b57cec5SDimitry Andric   uint32_t Size = sizeof(ModuleInfoHeader) + M + O;
84*0b57cec5SDimitry Andric   Size = alignTo(Size, 4);
85*0b57cec5SDimitry Andric   return Size;
86*0b57cec5SDimitry Andric }
87*0b57cec5SDimitry Andric