167c56014SZachary Turner //===- DbiModuleDescriptor.cpp - PDB module information -------------------===//
267c56014SZachary Turner //
367c56014SZachary Turner //                     The LLVM Compiler Infrastructure
467c56014SZachary Turner //
567c56014SZachary Turner // This file is distributed under the University of Illinois Open Source
667c56014SZachary Turner // License. See LICENSE.TXT for details.
767c56014SZachary Turner //
867c56014SZachary Turner //===----------------------------------------------------------------------===//
967c56014SZachary Turner 
1067c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
1167c56014SZachary Turner #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
1267c56014SZachary Turner #include "llvm/Support/BinaryStreamReader.h"
1367c56014SZachary Turner #include "llvm/Support/Endian.h"
1467c56014SZachary Turner #include "llvm/Support/Error.h"
1567c56014SZachary Turner #include "llvm/Support/MathExtras.h"
1667c56014SZachary Turner #include <cstdint>
1767c56014SZachary Turner 
1867c56014SZachary Turner using namespace llvm;
1967c56014SZachary Turner using namespace llvm::pdb;
2067c56014SZachary Turner using namespace llvm::support;
2167c56014SZachary Turner 
2267c56014SZachary Turner DbiModuleDescriptor::DbiModuleDescriptor() = default;
2367c56014SZachary Turner 
2467c56014SZachary Turner DbiModuleDescriptor::DbiModuleDescriptor(const DbiModuleDescriptor &Info) =
2567c56014SZachary Turner     default;
2667c56014SZachary Turner 
2767c56014SZachary Turner DbiModuleDescriptor::~DbiModuleDescriptor() = default;
2867c56014SZachary Turner 
2967c56014SZachary Turner Error DbiModuleDescriptor::initialize(BinaryStreamRef Stream,
3067c56014SZachary Turner                                       DbiModuleDescriptor &Info) {
3167c56014SZachary Turner   BinaryStreamReader Reader(Stream);
3267c56014SZachary Turner   if (auto EC = Reader.readObject(Info.Layout))
3367c56014SZachary Turner     return EC;
3467c56014SZachary Turner 
3567c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ModuleName))
3667c56014SZachary Turner     return EC;
3767c56014SZachary Turner 
3867c56014SZachary Turner   if (auto EC = Reader.readCString(Info.ObjFileName))
3967c56014SZachary Turner     return EC;
4067c56014SZachary Turner   return Error::success();
4167c56014SZachary Turner }
4267c56014SZachary Turner 
4367c56014SZachary Turner bool DbiModuleDescriptor::hasECInfo() const {
4467c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0;
4567c56014SZachary Turner }
4667c56014SZachary Turner 
4767c56014SZachary Turner uint16_t DbiModuleDescriptor::getTypeServerIndex() const {
4867c56014SZachary Turner   return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >>
4967c56014SZachary Turner          ModInfoFlags::TypeServerIndexShift;
5067c56014SZachary Turner }
5167c56014SZachary Turner 
5267c56014SZachary Turner uint16_t DbiModuleDescriptor::getModuleStreamIndex() const {
5367c56014SZachary Turner   return Layout->ModDiStream;
5467c56014SZachary Turner }
5567c56014SZachary Turner 
5667c56014SZachary Turner uint32_t DbiModuleDescriptor::getSymbolDebugInfoByteSize() const {
5767c56014SZachary Turner   return Layout->SymBytes;
5867c56014SZachary Turner }
5967c56014SZachary Turner 
60*5b6e4e0aSZachary Turner uint32_t DbiModuleDescriptor::getC11LineInfoByteSize() const {
61*5b6e4e0aSZachary Turner   return Layout->C11Bytes;
6267c56014SZachary Turner }
6367c56014SZachary Turner 
6467c56014SZachary Turner uint32_t DbiModuleDescriptor::getC13LineInfoByteSize() const {
6567c56014SZachary Turner   return Layout->C13Bytes;
6667c56014SZachary Turner }
6767c56014SZachary Turner 
6867c56014SZachary Turner uint32_t DbiModuleDescriptor::getNumberOfFiles() const {
6967c56014SZachary Turner   return Layout->NumFiles;
7067c56014SZachary Turner }
7167c56014SZachary Turner 
7267c56014SZachary Turner uint32_t DbiModuleDescriptor::getSourceFileNameIndex() const {
7367c56014SZachary Turner   return Layout->SrcFileNameNI;
7467c56014SZachary Turner }
7567c56014SZachary Turner 
7667c56014SZachary Turner uint32_t DbiModuleDescriptor::getPdbFilePathNameIndex() const {
7767c56014SZachary Turner   return Layout->PdbFilePathNI;
7867c56014SZachary Turner }
7967c56014SZachary Turner 
8067c56014SZachary Turner StringRef DbiModuleDescriptor::getModuleName() const { return ModuleName; }
8167c56014SZachary Turner 
8267c56014SZachary Turner StringRef DbiModuleDescriptor::getObjFileName() const { return ObjFileName; }
8367c56014SZachary Turner 
8467c56014SZachary Turner uint32_t DbiModuleDescriptor::getRecordLength() const {
8567c56014SZachary Turner   uint32_t M = ModuleName.str().size() + 1;
8667c56014SZachary Turner   uint32_t O = ObjFileName.str().size() + 1;
8767c56014SZachary Turner   uint32_t Size = sizeof(ModuleInfoHeader) + M + O;
8867c56014SZachary Turner   Size = alignTo(Size, 4);
8967c56014SZachary Turner   return Size;
9067c56014SZachary Turner }
91