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 "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 11a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSession.h" 12a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 13a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBExtras.h" 1421473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbol.h" 1521473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 1621473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h" 17a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h" 18c074de04SZachary Turner #include "llvm/Support/Path.h" 19*71f308adSChandler Carruth #include "llvm/Support/raw_ostream.h" 20*71f308adSChandler Carruth #include <utility> 21*71f308adSChandler Carruth #include <vector> 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 29a5549178SZachary Turner void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent, 30a5549178SZachary Turner PDB_DumpLevel Level) const { 31a952c49cSZachary Turner if (Level == PDB_DumpLevel::Detailed) { 32c074de04SZachary Turner std::string FullName = getName(); 33c074de04SZachary Turner StringRef Name = llvm::sys::path::filename(StringRef(FullName.c_str())); 34c074de04SZachary Turner 35c074de04SZachary Turner OS.indent(Indent); 36c074de04SZachary 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"; 50a952c49cSZachary Turner if (Level >= PDB_DumpLevel::Detailed) { 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; 56a952c49cSZachary Turner PDB_DumpLevel ChildLevel = (Level == PDB_DumpLevel::Detailed) 57a952c49cSZachary Turner ? PDB_DumpLevel::Normal 58a952c49cSZachary Turner : PDB_DumpLevel::Compact; 59a952c49cSZachary Turner Child->dump(OS, Indent + 4, ChildLevel); 60a952c49cSZachary Turner OS << "\n"; 61a5549178SZachary Turner } 62a5549178SZachary Turner } 63a5549178SZachary Turner 64c074de04SZachary Turner auto DetailsEnum(findAllChildren<PDBSymbolCompilandDetails>()); 65c074de04SZachary Turner if (auto CD = DetailsEnum->getNext()) { 66a5549178SZachary Turner VersionInfo FE; 67a5549178SZachary Turner VersionInfo BE; 68a5549178SZachary Turner CD->getFrontEndVersion(FE); 69a5549178SZachary Turner CD->getBackEndVersion(BE); 70a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName() 71a5549178SZachary Turner << "\n"; 72a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE 73a952c49cSZachary Turner << "\n"; 74a5549178SZachary Turner 75a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n"; 76a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Attributes: "; 77a5549178SZachary Turner if (CD->hasDebugInfo()) 78a5549178SZachary Turner OS << "DebugInfo "; 79a5549178SZachary Turner if (CD->isDataAligned()) 80a5549178SZachary Turner OS << "DataAligned "; 81a5549178SZachary Turner if (CD->isLTCG()) 82a5549178SZachary Turner OS << "LTCG "; 83a5549178SZachary Turner if (CD->hasSecurityChecks()) 84a5549178SZachary Turner OS << "SecurityChecks "; 85a5549178SZachary Turner if (CD->isHotpatchable()) 86a5549178SZachary Turner OS << "HotPatchable"; 87a5549178SZachary Turner 88a5549178SZachary Turner auto Files(Session.getSourceFilesForCompiland(*this)); 89a952c49cSZachary Turner OS << "\n"; 90a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 91a952c49cSZachary Turner << " source files"; 92a5549178SZachary Turner } 93a5549178SZachary Turner uint32_t Count = DetailsEnum->getChildCount(); 94a952c49cSZachary Turner if (Count > 1) { 95a952c49cSZachary Turner OS << "\n"; 96a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)"; 97a952c49cSZachary Turner } 98a952c49cSZachary Turner } else { 99a952c49cSZachary Turner std::string FullName = getName(); 100a952c49cSZachary Turner OS << stream_indent(Indent) << "Compiland: " << FullName; 101a952c49cSZachary Turner } 10221473f7bSZachary Turner } 103