167c56014SZachary Turner //===- DbiModuleDescriptor.cpp - PDB module information -------------------===//
267c56014SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667c56014SZachary Turner //
767c56014SZachary Turner //===----------------------------------------------------------------------===//
867c56014SZachary Turner 
967c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
1067c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
1167c56014SZachary Turner #include "llvm/Support/BinaryStreamReader.h"
1267c56014SZachary Turner #include "llvm/Support/Endian.h"
1367c56014SZachary Turner #include "llvm/Support/Error.h"
1467c56014SZachary Turner #include "llvm/Support/MathExtras.h"
1567c56014SZachary Turner #include <cstdint>
1667c56014SZachary Turner 
1767c56014SZachary Turner using namespace llvm;
1867c56014SZachary Turner using namespace llvm::pdb;
1967c56014SZachary Turner using namespace llvm::support;
2067c56014SZachary Turner 
initialize(BinaryStreamRef Stream,DbiModuleDescriptor & Info)2167c56014SZachary Turner Error DbiModuleDescriptor::initialize(BinaryStreamRef Stream,
2267c56014SZachary Turner                                       DbiModuleDescriptor &Info) {
2367c56014SZachary Turner   BinaryStreamReader Reader(Stream);
2467c56014SZachary Turner   if (auto EC = Reader.readObject(Info.Layout))
2567c56014SZachary Turner     return EC;
2667c56014SZachary Turner 
2767c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ModuleName))
2867c56014SZachary Turner     return EC;
2967c56014SZachary Turner 
3067c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ObjFileName))
3167c56014SZachary Turner     return EC;
3267c56014SZachary Turner   return Error::success();
3367c56014SZachary Turner }
3467c56014SZachary Turner 
hasECInfo() const3567c56014SZachary Turner bool DbiModuleDescriptor::hasECInfo() const {
3667c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0;
3767c56014SZachary Turner }
3867c56014SZachary Turner 
getTypeServerIndex() const3967c56014SZachary Turner uint16_t DbiModuleDescriptor::getTypeServerIndex() const {
4067c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >>
4167c56014SZachary Turner          ModInfoFlags::TypeServerIndexShift;
4267c56014SZachary Turner }
4367c56014SZachary Turner 
getSectionContrib() const44bee6c224SZachary Turner const SectionContrib &DbiModuleDescriptor::getSectionContrib() const {
45bee6c224SZachary Turner   return Layout->SC;
46bee6c224SZachary Turner }
47bee6c224SZachary Turner 
getModuleStreamIndex() const4867c56014SZachary Turner uint16_t DbiModuleDescriptor::getModuleStreamIndex() const {
4967c56014SZachary Turner   return Layout->ModDiStream;
5067c56014SZachary Turner }
5167c56014SZachary Turner 
getSymbolDebugInfoByteSize() const5267c56014SZachary Turner uint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const {
5367c56014SZachary Turner   return Layout->SymBytes;
5467c56014SZachary Turner }
5567c56014SZachary Turner 
getC11LineInfoByteSize() const565b6e4e0aSZachary Turner uint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const {
575b6e4e0aSZachary Turner   return Layout->C11Bytes;
5867c56014SZachary Turner }
5967c56014SZachary Turner 
getC13LineInfoByteSize() const6067c56014SZachary Turner uint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const {
6167c56014SZachary Turner   return Layout->C13Bytes;
6267c56014SZachary Turner }
6367c56014SZachary Turner 
getNumberOfFiles() const6467c56014SZachary Turner uint32_t DbiModuleDescriptor::getNumberOfFiles() const {
6567c56014SZachary Turner   return Layout->NumFiles;
6667c56014SZachary Turner }
6767c56014SZachary Turner 
getSourceFileNameIndex() const6867c56014SZachary Turner uint32_t DbiModuleDescriptor::getSourceFileNameIndex() const {
6967c56014SZachary Turner   return Layout->SrcFileNameNI;
7067c56014SZachary Turner }
7167c56014SZachary Turner 
getPdbFilePathNameIndex() const7267c56014SZachary Turner uint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const {
7367c56014SZachary Turner   return Layout->PdbFilePathNI;
7467c56014SZachary Turner }
7567c56014SZachary Turner 
getModuleName() const7667c56014SZachary Turner StringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; }
7767c56014SZachary Turner 
getObjFileName() const7867c56014SZachary Turner StringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; }
7967c56014SZachary Turner 
getRecordLength() const8067c56014SZachary Turner uint32_t DbiModuleDescriptor::getRecordLength() const {
8167c56014SZachary Turner   uint32_t M = ModuleName.str().size() + 1;
8267c56014SZachary Turner   uint32_t O = ObjFileName.str().size() + 1;
8367c56014SZachary Turner   uint32_t Size = sizeof(ModuleInfoHeader) + M + O;
8467c56014SZachary Turner   Size = alignTo(Size, 4);
8567c56014SZachary Turner   return Size;
8667c56014SZachary Turner }
87