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 10*52c9f881SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 11*52c9f881SZachary Turner 1221473f7bSZachary Turner #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 13a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSession.h" 14a5549178SZachary Turner #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 15a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBExtras.h" 1621473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbol.h" 1721473f7bSZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h" 18a5549178SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h" 19c074de04SZachary Turner #include "llvm/Support/Path.h" 2071f308adSChandler Carruth #include "llvm/Support/raw_ostream.h" 21*52c9f881SZachary Turner 2271f308adSChandler Carruth #include <utility> 2371f308adSChandler Carruth #include <vector> 2421473f7bSZachary Turner 2521473f7bSZachary Turner using namespace llvm; 2621473f7bSZachary Turner 2798571ed9SZachary Turner PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession, 28bae16b3fSZachary Turner std::unique_ptr<IPDBRawSymbol> Symbol) 29bae16b3fSZachary Turner : PDBSymbol(PDBSession, std::move(Symbol)) {} 3021473f7bSZachary Turner 31a5549178SZachary Turner void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent, 32a5549178SZachary Turner PDB_DumpLevel Level) const { 33a952c49cSZachary Turner if (Level == PDB_DumpLevel::Detailed) { 34c074de04SZachary Turner std::string FullName = getName(); 35c074de04SZachary Turner StringRef Name = llvm::sys::path::filename(StringRef(FullName.c_str())); 36c074de04SZachary Turner 37c074de04SZachary Turner OS.indent(Indent); 38c074de04SZachary Turner OS << "Compiland: " << Name << "\n"; 39a5549178SZachary Turner 40a5549178SZachary Turner std::string Source = getSourceFileName(); 41a5549178SZachary Turner std::string Library = getLibraryName(); 42a5549178SZachary Turner if (!Source.empty()) 43a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Source: " << this->getSourceFileName() 44a5549178SZachary Turner << "\n"; 45a5549178SZachary Turner if (!Library.empty()) 46a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Library: " << this->getLibraryName() 47a5549178SZachary Turner << "\n"; 48a5549178SZachary Turner 49a5549178SZachary Turner TagStats Stats; 50a5549178SZachary Turner auto ChildrenEnum = getChildStats(Stats); 51a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n"; 52a952c49cSZachary Turner if (Level >= PDB_DumpLevel::Detailed) { 53a5549178SZachary Turner while (auto Child = ChildrenEnum->getNext()) { 54a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandDetails>(*Child)) 55a5549178SZachary Turner continue; 56a5549178SZachary Turner if (llvm::isa<PDBSymbolCompilandEnv>(*Child)) 57a5549178SZachary Turner continue; 58a952c49cSZachary Turner PDB_DumpLevel ChildLevel = (Level == PDB_DumpLevel::Detailed) 59a952c49cSZachary Turner ? PDB_DumpLevel::Normal 60a952c49cSZachary Turner : PDB_DumpLevel::Compact; 61a952c49cSZachary Turner Child->dump(OS, Indent + 4, ChildLevel); 62a952c49cSZachary Turner OS << "\n"; 63a5549178SZachary Turner } 64a5549178SZachary Turner } 65a5549178SZachary Turner 66c074de04SZachary Turner auto DetailsEnum(findAllChildren<PDBSymbolCompilandDetails>()); 67c074de04SZachary Turner if (auto CD = DetailsEnum->getNext()) { 68a5549178SZachary Turner VersionInfo FE; 69a5549178SZachary Turner VersionInfo BE; 70a5549178SZachary Turner CD->getFrontEndVersion(FE); 71a5549178SZachary Turner CD->getBackEndVersion(BE); 72a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName() 73a5549178SZachary Turner << "\n"; 74a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE 75a952c49cSZachary Turner << "\n"; 76a5549178SZachary Turner 77a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n"; 78a5549178SZachary Turner OS << stream_indent(Indent + 2) << "Attributes: "; 79a5549178SZachary Turner if (CD->hasDebugInfo()) 80a5549178SZachary Turner OS << "DebugInfo "; 81a5549178SZachary Turner if (CD->isDataAligned()) 82a5549178SZachary Turner OS << "DataAligned "; 83a5549178SZachary Turner if (CD->isLTCG()) 84a5549178SZachary Turner OS << "LTCG "; 85a5549178SZachary Turner if (CD->hasSecurityChecks()) 86a5549178SZachary Turner OS << "SecurityChecks "; 87a5549178SZachary Turner if (CD->isHotpatchable()) 88a5549178SZachary Turner OS << "HotPatchable"; 89a5549178SZachary Turner 90a5549178SZachary Turner auto Files(Session.getSourceFilesForCompiland(*this)); 91a952c49cSZachary Turner OS << "\n"; 92a5549178SZachary Turner OS << stream_indent(Indent + 2) << Files->getChildCount() 93a952c49cSZachary Turner << " source files"; 94a5549178SZachary Turner } 95a5549178SZachary Turner uint32_t Count = DetailsEnum->getChildCount(); 96a952c49cSZachary Turner if (Count > 1) { 97a952c49cSZachary Turner OS << "\n"; 98a952c49cSZachary Turner OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)"; 99a952c49cSZachary Turner } 100a952c49cSZachary Turner } else { 101a952c49cSZachary Turner std::string FullName = getName(); 102a952c49cSZachary Turner OS << stream_indent(Indent) << "Compiland: " << FullName; 103a952c49cSZachary Turner } 10421473f7bSZachary Turner } 105