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