121473f7bSZachary Turner //===- PDBSymbolCompiland.cpp - compiland details --------*- C++ -*-===// 221473f7bSZachary Turner // 321473f7bSZachary Turner // The LLVM Compiler Infrastructure 421473f7bSZachary Turner // 521473f7bSZachary Turner // This file is distributed under the University of Illinois Open Source 621473f7bSZachary Turner // License. See LICENSE.TXT for details. 721473f7bSZachary Turner // 821473f7bSZachary Turner //===----------------------------------------------------------------------===// 921473f7bSZachary Turner 1021473f7bSZachary Turner #include <utility> 11a5549178SZachary Turner #include <vector> 1221473f7bSZachary Turner 1321473f7bSZachary Turner #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 14a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSession.h" 15a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 16a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBExtras.h" 1721473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbol.h" 1821473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 1921473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h" 20a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h" 2121473f7bSZachary Turner #include "llvm/Support/raw_ostream.h" 22c074de04SZachary Turner #include "llvm/Support/Path.h" 2321473f7bSZachary Turner 2421473f7bSZachary Turner using namespace llvm; 2521473f7bSZachary Turner 2698571ed9SZachary Turner PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession, 27bae16b3fSZachary Turner std::unique_ptr<IPDBRawSymbol> Symbol) 28bae16b3fSZachary Turner : PDBSymbol(PDBSession, std::move(Symbol)) {} 2921473f7bSZachary Turner 30a5549178SZachary Turner void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent, 31a5549178SZachary Turner PDB_DumpLevel Level) const { 32*a952c49cSZachary Turner if (Level == PDB_DumpLevel::Detailed) { 33c074de04SZachary Turner std::string FullName = getName(); 34c074de04SZachary Turner StringRef Name = llvm::sys::path::filename(StringRef(FullName.c_str())); 35c074de04SZachary Turner 36c074de04SZachary Turner OS.indent(Indent); 37c074de04SZachary Turner OS << "Compiland: " << Name << "\n"; 38a5549178SZachary Turner 39a5549178SZachary Turner std::string Source = getSourceFileName(); 40a5549178SZachary Turner std::string Library = getLibraryName(); 41a5549178SZachary Turner if (!Source.empty()) 42a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Source: " << this->getSourceFileName() 43a5549178SZachary Turner << "\n"; 44a5549178SZachary Turner if (!Library.empty()) 45a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Library: " << this->getLibraryName() 46a5549178SZachary Turner << "\n"; 47a5549178SZachary Turner 48a5549178SZachary Turner TagStats Stats; 49a5549178SZachary Turner auto ChildrenEnum = getChildStats(Stats); 50a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n"; 51*a952c49cSZachary Turner if (Level >= PDB_DumpLevel::Detailed) { 52a5549178SZachary Turner while (auto Child = ChildrenEnum->getNext()) { 53a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandDetails>(*Child)) 54a5549178SZachary Turner continue; 55a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandEnv>(*Child)) 56a5549178SZachary Turner continue; 57*a952c49cSZachary Turner PDB_DumpLevel ChildLevel = (Level == PDB_DumpLevel::Detailed) 58*a952c49cSZachary Turner ? PDB_DumpLevel::Normal 59*a952c49cSZachary Turner : PDB_DumpLevel::Compact; 60*a952c49cSZachary Turner Child->dump(OS, Indent + 4, ChildLevel); 61*a952c49cSZachary Turner OS << "\n"; 62a5549178SZachary Turner } 63a5549178SZachary Turner } 64a5549178SZachary Turner 65c074de04SZachary Turner auto DetailsEnum(findAllChildren<PDBSymbolCompilandDetails>()); 66c074de04SZachary Turner if (auto CD = DetailsEnum->getNext()) { 67a5549178SZachary Turner VersionInfo FE; 68a5549178SZachary Turner VersionInfo BE; 69a5549178SZachary Turner CD->getFrontEndVersion(FE); 70a5549178SZachary Turner CD->getBackEndVersion(BE); 71a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName() 72a5549178SZachary Turner << "\n"; 73*a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE 74*a952c49cSZachary Turner << "\n"; 75a5549178SZachary Turner 76a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n"; 77a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Attributes: "; 78a5549178SZachary Turner if (CD->hasDebugInfo()) 79a5549178SZachary Turner OS << "DebugInfo "; 80a5549178SZachary Turner if (CD->isDataAligned()) 81a5549178SZachary Turner OS << "DataAligned "; 82a5549178SZachary Turner if (CD->isLTCG()) 83a5549178SZachary Turner OS << "LTCG "; 84a5549178SZachary Turner if (CD->hasSecurityChecks()) 85a5549178SZachary Turner OS << "SecurityChecks "; 86a5549178SZachary Turner if (CD->isHotpatchable()) 87a5549178SZachary Turner OS << "HotPatchable"; 88a5549178SZachary Turner 89a5549178SZachary Turner auto Files(Session.getSourceFilesForCompiland(*this)); 90*a952c49cSZachary Turner OS << "\n"; 91a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 92*a952c49cSZachary Turner << " source files"; 93a5549178SZachary Turner } 94a5549178SZachary Turner uint32_t Count = DetailsEnum->getChildCount(); 95*a952c49cSZachary Turner if (Count > 1) { 96*a952c49cSZachary Turner OS << "\n"; 97*a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)"; 98*a952c49cSZachary Turner } 99*a952c49cSZachary Turner } else { 100*a952c49cSZachary Turner std::string FullName = getName(); 101*a952c49cSZachary Turner OS << stream_indent(Indent) << "Compiland: " << FullName; 102*a952c49cSZachary Turner } 10321473f7bSZachary Turner } 104