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" 22*c074de04SZachary 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*c074de04SZachary Turner std::string FullName = getName(); 33*c074de04SZachary Turner StringRef Name = llvm::sys::path::filename(StringRef(FullName.c_str())); 34*c074de04SZachary Turner 35*c074de04SZachary Turner OS.indent(Indent); 36*c074de04SZachary Turner OS << "Compiland: " << Name << "\n"; 37a5549178SZachary Turner 38a5549178SZachary Turner std::string Source = getSourceFileName(); 39a5549178SZachary Turner std::string Library = getLibraryName(); 40a5549178SZachary Turner if (!Source.empty()) 41a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Source: " << this->getSourceFileName() 42a5549178SZachary Turner << "\n"; 43a5549178SZachary Turner if (!Library.empty()) 44a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Library: " << this->getLibraryName() 45a5549178SZachary Turner << "\n"; 46a5549178SZachary Turner 47a5549178SZachary Turner TagStats Stats; 48a5549178SZachary Turner auto ChildrenEnum = getChildStats(Stats); 49a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n"; 50a5549178SZachary Turner if (Level >= PDB_DumpLevel::Normal) { 51a5549178SZachary Turner while (auto Child = ChildrenEnum->getNext()) { 52a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandDetails>(*Child)) 53a5549178SZachary Turner continue; 54a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandEnv>(*Child)) 55a5549178SZachary Turner continue; 56a5549178SZachary Turner Child->dump(OS, Indent + 4, PDB_DumpLevel::Compact); 57a5549178SZachary Turner } 58a5549178SZachary Turner } 59a5549178SZachary Turner 60*c074de04SZachary Turner auto DetailsEnum(findAllChildren<PDBSymbolCompilandDetails>()); 61*c074de04SZachary Turner if (auto CD = DetailsEnum->getNext()) { 62a5549178SZachary Turner VersionInfo FE; 63a5549178SZachary Turner VersionInfo BE; 64a5549178SZachary Turner CD->getFrontEndVersion(FE); 65a5549178SZachary Turner CD->getBackEndVersion(BE); 66a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName() 67a5549178SZachary Turner << "\n"; 68a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE << "\n"; 69a5549178SZachary Turner 70a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n"; 71a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Attributes: "; 72a5549178SZachary Turner if (CD->hasDebugInfo()) 73a5549178SZachary Turner OS << "DebugInfo "; 74a5549178SZachary Turner if (CD->isDataAligned()) 75a5549178SZachary Turner OS << "DataAligned "; 76a5549178SZachary Turner if (CD->isLTCG()) 77a5549178SZachary Turner OS << "LTCG "; 78a5549178SZachary Turner if (CD->hasSecurityChecks()) 79a5549178SZachary Turner OS << "SecurityChecks "; 80a5549178SZachary Turner if (CD->isHotpatchable()) 81a5549178SZachary Turner OS << "HotPatchable"; 82a5549178SZachary Turner 83a5549178SZachary Turner OS << "\n"; 84a5549178SZachary Turner auto Files(Session.getSourceFilesForCompiland(*this)); 85a5549178SZachary Turner if (Level >= PDB_DumpLevel::Detailed) { 86a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 87a5549178SZachary Turner << " source files:\n"; 88a5549178SZachary Turner while (auto File = Files->getNext()) 89a5549178SZachary Turner File->dump(OS, Indent + 4, PDB_DumpLevel::Compact); 90a5549178SZachary Turner } else { 91a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 92a5549178SZachary Turner << " source files\n"; 93a5549178SZachary Turner } 94a5549178SZachary Turner } 95a5549178SZachary Turner uint32_t Count = DetailsEnum->getChildCount(); 96a5549178SZachary Turner if (Count > 1) 97a5549178SZachary Turner OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)\n"; 9821473f7bSZachary Turner } 99