brintos

brintos / llvm-project-archived public Read only

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