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/Endian.h" 13*0b57cec5SDimitry Andric #include "llvm/Support/Error.h" 14*0b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h" 15*0b57cec5SDimitry Andric #include <cstdint> 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric using namespace llvm; 18*0b57cec5SDimitry Andric using namespace llvm::pdb; 19*0b57cec5SDimitry Andric using namespace llvm::support; 20*0b57cec5SDimitry Andric initialize(BinaryStreamRef Stream,DbiModuleDescriptor & Info)21*0b57cec5SDimitry AndricError DbiModuleDescriptor::initialize(BinaryStreamRef Stream, 22*0b57cec5SDimitry Andric DbiModuleDescriptor &Info) { 23*0b57cec5SDimitry Andric BinaryStreamReader Reader(Stream); 24*0b57cec5SDimitry Andric if (auto EC = Reader.readObject(Info.Layout)) 25*0b57cec5SDimitry Andric return EC; 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric if (auto EC = Reader.readCString(Info.ModuleName)) 28*0b57cec5SDimitry Andric return EC; 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric if (auto EC = Reader.readCString(Info.ObjFileName)) 31*0b57cec5SDimitry Andric return EC; 32*0b57cec5SDimitry Andric return Error::success(); 33*0b57cec5SDimitry Andric } 34*0b57cec5SDimitry Andric hasECInfo() const35*0b57cec5SDimitry Andricbool DbiModuleDescriptor::hasECInfo() const { 36*0b57cec5SDimitry Andric return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0; 37*0b57cec5SDimitry Andric } 38*0b57cec5SDimitry Andric getTypeServerIndex() const39*0b57cec5SDimitry Andricuint16_t DbiModuleDescriptor::getTypeServerIndex() const { 40*0b57cec5SDimitry Andric return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >> 41*0b57cec5SDimitry Andric ModInfoFlags::TypeServerIndexShift; 42*0b57cec5SDimitry Andric } 43*0b57cec5SDimitry Andric getSectionContrib() const44*0b57cec5SDimitry Andricconst SectionContrib &DbiModuleDescriptor::getSectionContrib() const { 45*0b57cec5SDimitry Andric return Layout->SC; 46*0b57cec5SDimitry Andric } 47*0b57cec5SDimitry Andric getModuleStreamIndex() const48*0b57cec5SDimitry Andricuint16_t DbiModuleDescriptor::getModuleStreamIndex() const { 49*0b57cec5SDimitry Andric return Layout->ModDiStream; 50*0b57cec5SDimitry Andric } 51*0b57cec5SDimitry Andric getSymbolDebugInfoByteSize() const52*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const { 53*0b57cec5SDimitry Andric return Layout->SymBytes; 54*0b57cec5SDimitry Andric } 55*0b57cec5SDimitry Andric getC11LineInfoByteSize() const56*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const { 57*0b57cec5SDimitry Andric return Layout->C11Bytes; 58*0b57cec5SDimitry Andric } 59*0b57cec5SDimitry Andric getC13LineInfoByteSize() const60*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const { 61*0b57cec5SDimitry Andric return Layout->C13Bytes; 62*0b57cec5SDimitry Andric } 63*0b57cec5SDimitry Andric getNumberOfFiles() const64*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getNumberOfFiles() const { 65*0b57cec5SDimitry Andric return Layout->NumFiles; 66*0b57cec5SDimitry Andric } 67*0b57cec5SDimitry Andric getSourceFileNameIndex() const68*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getSourceFileNameIndex() const { 69*0b57cec5SDimitry Andric return Layout->SrcFileNameNI; 70*0b57cec5SDimitry Andric } 71*0b57cec5SDimitry Andric getPdbFilePathNameIndex() const72*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const { 73*0b57cec5SDimitry Andric return Layout->PdbFilePathNI; 74*0b57cec5SDimitry Andric } 75*0b57cec5SDimitry Andric getModuleName() const76*0b57cec5SDimitry AndricStringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; } 77*0b57cec5SDimitry Andric getObjFileName() const78*0b57cec5SDimitry AndricStringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; } 79*0b57cec5SDimitry Andric getRecordLength() const80*0b57cec5SDimitry Andricuint32_t DbiModuleDescriptor::getRecordLength() const { 81*0b57cec5SDimitry Andric uint32_t M = ModuleName.str().size() + 1; 82*0b57cec5SDimitry Andric uint32_t O = ObjFileName.str().size() + 1; 83*0b57cec5SDimitry Andric uint32_t Size = sizeof(ModuleInfoHeader) + M + O; 84*0b57cec5SDimitry Andric Size = alignTo(Size, 4); 85*0b57cec5SDimitry Andric return Size; 86*0b57cec5SDimitry Andric } 87*0b57cec5SDimitry Andric