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/Error.h" 13*0b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h" 14*0b57cec5SDimitry Andric #include <cstdint> 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric using namespace llvm; 17*0b57cec5SDimitry Andric using namespace llvm::pdb; 18*0b57cec5SDimitry Andric using namespace llvm::support; 19*0b57cec5SDimitry Andric initialize(BinaryStreamRef Stream,DbiModuleDescriptor & Info)20*0b57cec5SDimitry AndricError DbiModuleDescriptor::initialize(BinaryStreamRef Stream, 21*0b57cec5SDimitry Andric DbiModuleDescriptor &Info) { 22*0b57cec5SDimitry Andric BinaryStreamReader Reader(Stream); 23*0b57cec5SDimitry Andric if (auto EC = Reader.readObject(Info.Layout)) 24*0b57cec5SDimitry Andric return EC; 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric if (auto EC = Reader.readCString(Info.ModuleName)) 27*0b57cec5SDimitry Andric return EC; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric if (auto EC = Reader.readCString(Info.ObjFileName)) 30*0b57cec5SDimitry Andric return EC; 31*0b57cec5SDimitry Andric return Error::success(); 32*0b57cec5SDimitry Andric } 33*0b57cec5SDimitry Andric hasECInfo() const34*0b57cec5SDimitry Andricbool DbiModuleDescriptor::hasECInfo() const { 35*0b57cec5SDimitry Andric return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0; 36*0b57cec5SDimitry Andric } 37*0b57cec5SDimitry Andric getTypeServerIndex() const38*0b57cec5SDimitry Andricuint16_t DbiModuleDescriptor::getTypeServerIndex() const { 39*0b57cec5SDimitry Andric return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >> 40*0b57cec5SDimitry Andric ModInfoFlags::TypeServerIndexShift; 41*0b57cec5SDimitry Andric } 42*0b57cec5SDimitry Andric getSectionContrib() const43*0b57cec5SDimitry Andricconst SectionContrib &DbiModuleDescriptor::getSectionContrib() const { 44*0b57cec5SDimitry Andric return Layout->SC; 45*0b57cec5SDimitry Andric } 46*0b57cec5SDimitry Andric getModuleStreamIndex() const47*0b57cec5SDimitry Andricuint16_t DbiModuleDescriptor::getModuleStreamIndex() const { 48*0b57cec5SDimitry Andric return Layout->ModDiStream; 49*0b57cec5SDimitry Andric } 50*0b57cec5SDimitry Andric getSymbolDebugInfoByteSize() const51*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const { 52*0b57cec5SDimitry Andric return Layout->SymBytes; 53*0b57cec5SDimitry Andric } 54*0b57cec5SDimitry Andric getC11LineInfoByteSize() const55*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const { 56*0b57cec5SDimitry Andric return Layout->C11Bytes; 57*0b57cec5SDimitry Andric } 58*0b57cec5SDimitry Andric getC13LineInfoByteSize() const59*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const { 60*0b57cec5SDimitry Andric return Layout->C13Bytes; 61*0b57cec5SDimitry Andric } 62*0b57cec5SDimitry Andric getNumberOfFiles() const63*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getNumberOfFiles() const { 64*0b57cec5SDimitry Andric return Layout->NumFiles; 65*0b57cec5SDimitry Andric } 66*0b57cec5SDimitry Andric getSourceFileNameIndex() const67*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getSourceFileNameIndex() const { 68*0b57cec5SDimitry Andric return Layout->SrcFileNameNI; 69*0b57cec5SDimitry Andric } 70*0b57cec5SDimitry Andric getPdbFilePathNameIndex() const71*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const { 72*0b57cec5SDimitry Andric return Layout->PdbFilePathNI; 73*0b57cec5SDimitry Andric } 74*0b57cec5SDimitry Andric getModuleName() const75*0b57cec5SDimitry AndricStringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; } 76*0b57cec5SDimitry Andric getObjFileName() const77*0b57cec5SDimitry AndricStringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; } 78*0b57cec5SDimitry Andric getRecordLength() const79*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getRecordLength() const { 80*0b57cec5SDimitry Andric uint32_t M = ModuleName.str().size() + 1; 81*0b57cec5SDimitry Andric uint32_t O = ObjFileName.str().size() + 1; 82*0b57cec5SDimitry Andric uint32_t Size = sizeof(ModuleInfoHeader) + M + O; 83*0b57cec5SDimitry Andric Size = alignTo(Size, 4); 84*0b57cec5SDimitry Andric return Size; 85*0b57cec5SDimitry Andric } 86