Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 1 | //===- ModInfo.cpp - PDB module information -------------------------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "llvm/DebugInfo/PDB/Raw/ModInfo.h" |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 11 | |
Zachary Turner | bac69d3 | 2016-07-22 19:56:05 +0000 | [diff] [blame] | 12 | #include "llvm/DebugInfo/Msf/StreamReader.h" |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 13 | #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" |
| 14 | #include "llvm/Support/Endian.h" |
| 15 | |
| 16 | using namespace llvm; |
Zachary Turner | bac69d3 | 2016-07-22 19:56:05 +0000 | [diff] [blame] | 17 | using namespace llvm::msf; |
Zachary Turner | 2f09b50 | 2016-04-29 17:28:47 +0000 | [diff] [blame] | 18 | using namespace llvm::pdb; |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 19 | using namespace llvm::support; |
| 20 | |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 21 | |
Zachary Turner | 1de49c9 | 2016-05-27 18:47:20 +0000 | [diff] [blame] | 22 | ModInfo::ModInfo() : Layout(nullptr) {} |
| 23 | |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 24 | ModInfo::ModInfo(const ModInfo &Info) |
| 25 | : ModuleName(Info.ModuleName), ObjFileName(Info.ObjFileName), |
| 26 | Layout(Info.Layout) {} |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 27 | |
| 28 | ModInfo::~ModInfo() {} |
| 29 | |
Zachary Turner | d66889c | 2016-07-28 19:12:28 +0000 | [diff] [blame] | 30 | Error ModInfo::initialize(ReadableStreamRef Stream, ModInfo &Info) { |
Zachary Turner | bac69d3 | 2016-07-22 19:56:05 +0000 | [diff] [blame] | 31 | StreamReader Reader(Stream); |
Zachary Turner | 0d43c1c | 2016-05-28 05:21:57 +0000 | [diff] [blame] | 32 | if (auto EC = Reader.readObject(Info.Layout)) |
| 33 | return EC; |
| 34 | |
| 35 | if (auto EC = Reader.readZeroString(Info.ModuleName)) |
| 36 | return EC; |
| 37 | |
| 38 | if (auto EC = Reader.readZeroString(Info.ObjFileName)) |
| 39 | return EC; |
| 40 | return Error::success(); |
| 41 | } |
| 42 | |
Zachary Turner | b383d62 | 2016-07-22 15:46:46 +0000 | [diff] [blame] | 43 | bool ModInfo::hasECInfo() const { |
| 44 | return (Layout->Flags & ModInfoFlags::HasECFlagMask) != 0; |
| 45 | } |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 46 | |
| 47 | uint16_t ModInfo::getTypeServerIndex() const { |
Zachary Turner | b383d62 | 2016-07-22 15:46:46 +0000 | [diff] [blame] | 48 | return (Layout->Flags & ModInfoFlags::TypeServerIndexMask) >> |
| 49 | ModInfoFlags::TypeServerIndexShift; |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | uint16_t ModInfo::getModuleStreamIndex() const { return Layout->ModDiStream; } |
| 53 | |
| 54 | uint32_t ModInfo::getSymbolDebugInfoByteSize() const { |
| 55 | return Layout->SymBytes; |
| 56 | } |
| 57 | |
| 58 | uint32_t ModInfo::getLineInfoByteSize() const { return Layout->LineBytes; } |
| 59 | |
| 60 | uint32_t ModInfo::getC13LineInfoByteSize() const { return Layout->C13Bytes; } |
| 61 | |
| 62 | uint32_t ModInfo::getNumberOfFiles() const { return Layout->NumFiles; } |
| 63 | |
| 64 | uint32_t ModInfo::getSourceFileNameIndex() const { |
| 65 | return Layout->SrcFileNameNI; |
| 66 | } |
| 67 | |
| 68 | uint32_t ModInfo::getPdbFilePathNameIndex() const { |
| 69 | return Layout->PdbFilePathNI; |
| 70 | } |
| 71 | |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 72 | StringRef ModInfo::getModuleName() const { return ModuleName; } |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 73 | |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 74 | StringRef ModInfo::getObjFileName() const { return ObjFileName; } |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 75 | |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 76 | uint32_t ModInfo::getRecordLength() const { |
| 77 | uint32_t M = ModuleName.str().size() + 1; |
| 78 | uint32_t O = ObjFileName.str().size() + 1; |
Zachary Turner | b383d62 | 2016-07-22 15:46:46 +0000 | [diff] [blame] | 79 | uint32_t Size = sizeof(ModuleInfoHeader) + M + O; |
Zachary Turner | 8dbe362 | 2016-05-27 01:54:44 +0000 | [diff] [blame] | 80 | Size = llvm::alignTo(Size, 4); |
| 81 | return Size; |
Zachary Turner | 1822af54 | 2016-04-27 23:41:42 +0000 | [diff] [blame] | 82 | } |