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> 11*a5549178SZachary Turner #include <vector> 1221473f7bSZachary Turner 1321473f7bSZachary Turner #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 14*a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSession.h" 15*a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 16*a5549178SZachary 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" 20*a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h" 2121473f7bSZachary Turner #include "llvm/Support/raw_ostream.h" 2221473f7bSZachary Turner 2321473f7bSZachary Turner using namespace llvm; 2421473f7bSZachary Turner 2598571ed9SZachary Turner PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession, 26bae16b3fSZachary Turner std::unique_ptr<IPDBRawSymbol> Symbol) 27bae16b3fSZachary Turner : PDBSymbol(PDBSession, std::move(Symbol)) {} 2821473f7bSZachary Turner 29*a5549178SZachary Turner void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent, 30*a5549178SZachary Turner PDB_DumpLevel Level) const { 31*a5549178SZachary Turner std::string Name = getName(); 32*a5549178SZachary Turner OS << "---- [IDX: " << getSymIndexId() << "] Compiland: " << Name 33*a5549178SZachary Turner << " ----\n"; 34*a5549178SZachary Turner 35*a5549178SZachary Turner std::string Source = getSourceFileName(); 36*a5549178SZachary Turner std::string Library = getLibraryName(); 37*a5549178SZachary Turner if (!Source.empty()) 38*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Source: " << this->getSourceFileName() 39*a5549178SZachary Turner << "\n"; 40*a5549178SZachary Turner if (!Library.empty()) 41*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Library: " << this->getLibraryName() 42*a5549178SZachary Turner << "\n"; 43*a5549178SZachary Turner 44*a5549178SZachary Turner TagStats Stats; 45*a5549178SZachary Turner auto ChildrenEnum = getChildStats(Stats); 46*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n"; 47*a5549178SZachary Turner if (Level >= PDB_DumpLevel::Normal) { 48*a5549178SZachary Turner while (auto Child = ChildrenEnum->getNext()) { 49*a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandDetails>(*Child)) 50*a5549178SZachary Turner continue; 51*a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandEnv>(*Child)) 52*a5549178SZachary Turner continue; 53*a5549178SZachary Turner Child->dump(OS, Indent + 4, PDB_DumpLevel::Compact); 54*a5549178SZachary Turner } 55*a5549178SZachary Turner } 56*a5549178SZachary Turner 57*a5549178SZachary Turner std::unique_ptr<IPDBEnumSymbols> DetailsEnum( 58*a5549178SZachary Turner findChildren(PDB_SymType::CompilandDetails)); 59*a5549178SZachary Turner if (auto DetailsPtr = DetailsEnum->getNext()) { 60*a5549178SZachary Turner const auto *CD = dyn_cast<PDBSymbolCompilandDetails>(DetailsPtr.get()); 61*a5549178SZachary Turner assert(CD && "We only asked for compilands, but got something else!"); 62*a5549178SZachary Turner VersionInfo FE; 63*a5549178SZachary Turner VersionInfo BE; 64*a5549178SZachary Turner CD->getFrontEndVersion(FE); 65*a5549178SZachary Turner CD->getBackEndVersion(BE); 66*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName() 67*a5549178SZachary Turner << "\n"; 68*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE << "\n"; 69*a5549178SZachary Turner 70*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n"; 71*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Attributes: "; 72*a5549178SZachary Turner if (CD->hasDebugInfo()) 73*a5549178SZachary Turner OS << "DebugInfo "; 74*a5549178SZachary Turner if (CD->isDataAligned()) 75*a5549178SZachary Turner OS << "DataAligned "; 76*a5549178SZachary Turner if (CD->isLTCG()) 77*a5549178SZachary Turner OS << "LTCG "; 78*a5549178SZachary Turner if (CD->hasSecurityChecks()) 79*a5549178SZachary Turner OS << "SecurityChecks "; 80*a5549178SZachary Turner if (CD->isHotpatchable()) 81*a5549178SZachary Turner OS << "HotPatchable"; 82*a5549178SZachary Turner 83*a5549178SZachary Turner OS << "\n"; 84*a5549178SZachary Turner auto Files(Session.getSourceFilesForCompiland(*this)); 85*a5549178SZachary Turner if (Level >= PDB_DumpLevel::Detailed) { 86*a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 87*a5549178SZachary Turner << " source files:\n"; 88*a5549178SZachary Turner while (auto File = Files->getNext()) 89*a5549178SZachary Turner File->dump(OS, Indent + 4, PDB_DumpLevel::Compact); 90*a5549178SZachary Turner } else { 91*a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 92*a5549178SZachary Turner << " source files\n"; 93*a5549178SZachary Turner } 94*a5549178SZachary Turner } 95*a5549178SZachary Turner uint32_t Count = DetailsEnum->getChildCount(); 96*a5549178SZachary Turner if (Count > 1) 97*a5549178SZachary Turner OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)\n"; 9821473f7bSZachary Turner } 99