1317683Sdim//===- DbiModuleDescriptor.cpp - PDB module information -------------------===//
2317683Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6317683Sdim//
7317683Sdim//===----------------------------------------------------------------------===//
8317683Sdim
9317683Sdim#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
10317683Sdim#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
11317683Sdim#include "llvm/Support/BinaryStreamReader.h"
12317683Sdim#include "llvm/Support/Endian.h"
13317683Sdim#include "llvm/Support/Error.h"
14317683Sdim#include "llvm/Support/MathExtras.h"
15317683Sdim#include <cstdint>
16317683Sdim
17317683Sdimusing namespace llvm;
18317683Sdimusing namespace llvm::pdb;
19317683Sdimusing namespace llvm::support;
20317683Sdim
21317683SdimError DbiModuleDescriptor::initialize(BinaryStreamRef Stream,
22317683Sdim                                      DbiModuleDescriptor &Info) {
23317683Sdim  BinaryStreamReader Reader(Stream);
24317683Sdim  if (auto EC = Reader.readObject(Info.Layout))
25317683Sdim    return EC;
26317683Sdim
27317683Sdim  if (auto EC = Reader.readCString(Info.ModuleName))
28317683Sdim    return EC;
29317683Sdim
30317683Sdim  if (auto EC = Reader.readCString(Info.ObjFileName))
31317683Sdim    return EC;
32317683Sdim  return Error::success();
33317683Sdim}
34317683Sdim
35317683Sdimbool DbiModuleDescriptor::hasECInfo() const {
36317683Sdim  return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0;
37317683Sdim}
38317683Sdim
39317683Sdimuint16_t DbiModuleDescriptor::getTypeServerIndex() const {
40317683Sdim  return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >>
41317683Sdim         ModInfoFlags::TypeServerIndexShift;
42317683Sdim}
43317683Sdim
44341825Sdimconst SectionContrib &DbiModuleDescriptor::getSectionContrib() const {
45341825Sdim  return Layout->SC;
46341825Sdim}
47341825Sdim
48317683Sdimuint16_t DbiModuleDescriptor::getModuleStreamIndex() const {
49317683Sdim  return Layout->ModDiStream;
50317683Sdim}
51317683Sdim
52317683Sdimuint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const {
53317683Sdim  return Layout->SymBytes;
54317683Sdim}
55317683Sdim
56317683Sdimuint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const {
57317683Sdim  return Layout->C11Bytes;
58317683Sdim}
59317683Sdim
60317683Sdimuint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const {
61317683Sdim  return Layout->C13Bytes;
62317683Sdim}
63317683Sdim
64317683Sdimuint32_t DbiModuleDescriptor::getNumberOfFiles() const {
65317683Sdim  return Layout->NumFiles;
66317683Sdim}
67317683Sdim
68317683Sdimuint32_t DbiModuleDescriptor::getSourceFileNameIndex() const {
69317683Sdim  return Layout->SrcFileNameNI;
70317683Sdim}
71317683Sdim
72317683Sdimuint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const {
73317683Sdim  return Layout->PdbFilePathNI;
74317683Sdim}
75317683Sdim
76317683SdimStringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; }
77317683Sdim
78317683SdimStringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; }
79317683Sdim
80317683Sdimuint32_t DbiModuleDescriptor::getRecordLength() const {
81317683Sdim  uint32_t M = ModuleName.str().size() + 1;
82317683Sdim  uint32_t O = ObjFileName.str().size() + 1;
83317683Sdim  uint32_t Size = sizeof(ModuleInfoHeader) + M + O;
84317683Sdim  Size = alignTo(Size, 4);
85317683Sdim  return Size;
86317683Sdim}
87