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