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