Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/PDB/PDBExtras.cpp
35266 views
//===- PDBExtras.cpp - helper functions and classes for PDBs --------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/DebugInfo/PDB/PDBExtras.h"9#include "llvm/Support/raw_ostream.h"1011using namespace llvm;12using namespace llvm::pdb;1314#define CASE_OUTPUT_ENUM_CLASS_STR(Class, Value, Str, Stream) \15case Class::Value: \16Stream << Str; \17break;1819#define CASE_OUTPUT_ENUM_CLASS_NAME(Class, Value, Stream) \20CASE_OUTPUT_ENUM_CLASS_STR(Class, Value, #Value, Stream)2122raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,23const PDB_VariantType &Type) {24switch (Type) {25CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Bool, OS)26CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Single, OS)27CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Double, OS)28CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Int8, OS)29CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Int16, OS)30CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Int32, OS)31CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Int64, OS)32CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, UInt8, OS)33CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, UInt16, OS)34CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, UInt32, OS)35CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, UInt64, OS)36default:37OS << "Unknown";38}39return OS;40}4142raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,43const PDB_BuiltinType &Type) {44switch (Type) {45CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, None, OS)46CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Void, OS)47CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Char, OS)48CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, WCharT, OS)49CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Int, OS)50CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, UInt, OS)51CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Float, OS)52CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, BCD, OS)53CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Bool, OS)54CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Long, OS)55CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, ULong, OS)56CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Currency, OS)57CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Date, OS)58CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Variant, OS)59CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Complex, OS)60CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Bitfield, OS)61CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, BSTR, OS)62CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, HResult, OS)63CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Char16, OS)64CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Char32, OS)65CASE_OUTPUT_ENUM_CLASS_NAME(PDB_BuiltinType, Char8, OS)66}67return OS;68}6970raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,71const PDB_CallingConv &Conv) {72OS << "__";73switch (Conv) {74CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearC , "cdecl", OS)75CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarC , "cdecl", OS)76CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearPascal , "pascal", OS)77CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarPascal , "pascal", OS)78CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearFast , "fastcall", OS)79CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarFast , "fastcall", OS)80CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearStdCall, "stdcall", OS)81CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarStdCall , "stdcall", OS)82CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearSysCall, "syscall", OS)83CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarSysCall , "syscall", OS)84CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ThisCall , "thiscall", OS)85CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, MipsCall , "mipscall", OS)86CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Generic , "genericcall", OS)87CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, AlphaCall , "alphacall", OS)88CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, PpcCall , "ppccall", OS)89CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, SHCall , "superhcall", OS)90CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ArmCall , "armcall", OS)91CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, AM33Call , "am33call", OS)92CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, TriCall , "tricall", OS)93CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, SH5Call , "sh5call", OS)94CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, M32RCall , "m32rcall", OS)95CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ClrCall , "clrcall", OS)96CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Inline , "inlinecall", OS)97CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearVector , "vectorcall", OS)98CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Swift, "swiftcall", OS)99}100return OS;101}102103raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_DataKind &Data) {104switch (Data) {105CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Unknown, "unknown", OS)106CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Local, "local", OS)107CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, StaticLocal, "static local", OS)108CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Param, "param", OS)109CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, ObjectPtr, "this ptr", OS)110CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, FileStatic, "static global", OS)111CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Global, "global", OS)112CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Member, "member", OS)113CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, StaticMember, "static member", OS)114CASE_OUTPUT_ENUM_CLASS_STR(PDB_DataKind, Constant, "const", OS)115}116return OS;117}118119raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,120const llvm::codeview::CPURegister &CpuReg) {121if (CpuReg.Cpu == llvm::codeview::CPUType::ARMNT) {122switch (CpuReg.Reg) {123#define CV_REGISTERS_ARM124#define CV_REGISTER(name, val) \125case codeview::RegisterId::name: \126OS << #name; \127return OS;128#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"129#undef CV_REGISTER130#undef CV_REGISTERS_ARM131132default:133break;134}135} else if (CpuReg.Cpu == llvm::codeview::CPUType::ARM64) {136switch (CpuReg.Reg) {137#define CV_REGISTERS_ARM64138#define CV_REGISTER(name, val) \139case codeview::RegisterId::name: \140OS << #name; \141return OS;142#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"143#undef CV_REGISTER144#undef CV_REGISTERS_ARM64145146default:147break;148}149} else {150switch (CpuReg.Reg) {151#define CV_REGISTERS_X86152#define CV_REGISTER(name, val) \153case codeview::RegisterId::name: \154OS << #name; \155return OS;156#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"157#undef CV_REGISTER158#undef CV_REGISTERS_X86159160default:161break;162}163}164OS << static_cast<int>(CpuReg.Reg);165return OS;166}167168raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_LocType &Loc) {169switch (Loc) {170CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, Static, "static", OS)171CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, TLS, "tls", OS)172CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, RegRel, "regrel", OS)173CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, ThisRel, "thisrel", OS)174CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, Enregistered, "register", OS)175CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, BitField, "bitfield", OS)176CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, Slot, "slot", OS)177CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, IlRel, "IL rel", OS)178CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, MetaData, "metadata", OS)179CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, Constant, "constant", OS)180CASE_OUTPUT_ENUM_CLASS_STR(PDB_LocType, RegRelAliasIndir,181"regrelaliasindir", OS)182default:183OS << "Unknown";184}185return OS;186}187188raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,189const codeview::ThunkOrdinal &Thunk) {190switch (Thunk) {191CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, BranchIsland, OS)192CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, Pcode, OS)193CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, Standard, OS)194CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, ThisAdjustor, OS)195CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, TrampIncremental, OS)196CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, UnknownLoad, OS)197CASE_OUTPUT_ENUM_CLASS_NAME(codeview::ThunkOrdinal, Vcall, OS)198}199return OS;200}201202raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,203const PDB_Checksum &Checksum) {204switch (Checksum) {205CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, None, OS)206CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, MD5, OS)207CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, SHA1, OS)208CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, SHA256, OS)209}210return OS;211}212213raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_Lang &Lang) {214switch (Lang) {215CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, C, OS)216CASE_OUTPUT_ENUM_CLASS_STR(PDB_Lang, Cpp, "C++", OS)217CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Fortran, OS)218CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Masm, OS)219CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Pascal, OS)220CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Basic, OS)221CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cobol, OS)222CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Link, OS)223CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cvtres, OS)224CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cvtpgd, OS)225CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, CSharp, OS)226CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, VB, OS)227CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, ILAsm, OS)228CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Java, OS)229CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, JScript, OS)230CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, MSIL, OS)231CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, HLSL, OS)232CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, D, OS)233CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Swift, OS)234CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Rust, OS)235CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, ObjC, OS)236CASE_OUTPUT_ENUM_CLASS_STR(PDB_Lang, ObjCpp, "ObjC++", OS)237CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, AliasObj, OS)238CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Go, OS)239CASE_OUTPUT_ENUM_CLASS_STR(PDB_Lang, OldSwift, "Swift", OS)240}241return OS;242}243244raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_SymType &Tag) {245switch (Tag) {246CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Exe, OS)247CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Compiland, OS)248CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CompilandDetails, OS)249CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CompilandEnv, OS)250CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Function, OS)251CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Block, OS)252CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Data, OS)253CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Annotation, OS)254CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Label, OS)255CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, PublicSymbol, OS)256CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, UDT, OS)257CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Enum, OS)258CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FunctionSig, OS)259CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, PointerType, OS)260CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, ArrayType, OS)261CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, BuiltinType, OS)262CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Typedef, OS)263CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, BaseClass, OS)264CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Friend, OS)265CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FunctionArg, OS)266CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FuncDebugStart, OS)267CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FuncDebugEnd, OS)268CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, UsingNamespace, OS)269CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, VTableShape, OS)270CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, VTable, OS)271CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Custom, OS)272CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Thunk, OS)273CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CustomType, OS)274CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, ManagedType, OS)275CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Dimension, OS)276CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CallSite, OS)277CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, InlineSite, OS)278CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, BaseInterface, OS)279CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, VectorType, OS)280CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, MatrixType, OS)281CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, HLSLType, OS)282CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Caller, OS)283CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Callee, OS)284CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Export, OS)285CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, HeapAllocationSite, OS)286CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CoffGroup, OS)287CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Inlinee, OS)288default:289OS << "Unknown SymTag " << uint32_t(Tag);290}291return OS;292}293294raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,295const PDB_MemberAccess &Access) {296switch (Access) {297CASE_OUTPUT_ENUM_CLASS_STR(PDB_MemberAccess, Public, "public", OS)298CASE_OUTPUT_ENUM_CLASS_STR(PDB_MemberAccess, Protected, "protected", OS)299CASE_OUTPUT_ENUM_CLASS_STR(PDB_MemberAccess, Private, "private", OS)300}301return OS;302}303304raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_UdtType &Type) {305switch (Type) {306CASE_OUTPUT_ENUM_CLASS_STR(PDB_UdtType, Class, "class", OS)307CASE_OUTPUT_ENUM_CLASS_STR(PDB_UdtType, Struct, "struct", OS)308CASE_OUTPUT_ENUM_CLASS_STR(PDB_UdtType, Interface, "interface", OS)309CASE_OUTPUT_ENUM_CLASS_STR(PDB_UdtType, Union, "union", OS)310}311return OS;312}313314raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,315const PDB_Machine &Machine) {316switch (Machine) {317CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Am33, OS)318CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Amd64, OS)319CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Arm, OS)320CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, ArmNT, OS)321CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Ebc, OS)322CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, x86, OS)323CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Ia64, OS)324CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, M32R, OS)325CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Mips16, OS)326CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, MipsFpu, OS)327CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, MipsFpu16, OS)328CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, PowerPC, OS)329CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, PowerPCFP, OS)330CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, R4000, OS)331CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, SH3, OS)332CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, SH3DSP, OS)333CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, SH4, OS)334CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, SH5, OS)335CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, Thumb, OS)336CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Machine, WceMipsV2, OS)337default:338OS << "Unknown";339}340return OS;341}342343raw_ostream &llvm::pdb::dumpPDBSourceCompression(raw_ostream &OS,344uint32_t Compression) {345switch (Compression) {346CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SourceCompression, None, OS)347CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SourceCompression, Huffman, OS)348CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SourceCompression, LZ, OS)349CASE_OUTPUT_ENUM_CLASS_STR(PDB_SourceCompression, RunLengthEncoded, "RLE",350OS)351CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SourceCompression, DotNet, OS)352default:353OS << "Unknown (" << Compression << ")";354}355return OS;356}357358raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const Variant &Value) {359switch (Value.Type) {360case PDB_VariantType::Bool:361OS << (Value.Value.Bool ? "true" : "false");362break;363case PDB_VariantType::Double:364OS << Value.Value.Double;365break;366case PDB_VariantType::Int16:367OS << Value.Value.Int16;368break;369case PDB_VariantType::Int32:370OS << Value.Value.Int32;371break;372case PDB_VariantType::Int64:373OS << Value.Value.Int64;374break;375case PDB_VariantType::Int8:376OS << static_cast<int>(Value.Value.Int8);377break;378case PDB_VariantType::Single:379OS << Value.Value.Single;380break;381case PDB_VariantType::UInt16:382OS << Value.Value.UInt16;383break;384case PDB_VariantType::UInt32:385OS << Value.Value.UInt32;386break;387case PDB_VariantType::UInt64:388OS << Value.Value.UInt64;389break;390case PDB_VariantType::UInt8:391OS << static_cast<unsigned>(Value.Value.UInt8);392break;393case PDB_VariantType::String:394OS << Value.Value.String;395break;396default:397OS << Value.Type;398}399return OS;400}401402raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,403const VersionInfo &Version) {404OS << Version.Major << "." << Version.Minor << "." << Version.Build;405return OS;406}407408raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const TagStats &Stats) {409for (auto Tag : Stats) {410OS << Tag.first << ":" << Tag.second << " ";411}412return OS;413}414415416