1 //===- PDBSymbolData.cpp - PDB data (e.g. variable) accessors ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include <utility> 11 #include "llvm/DebugInfo/PDB/PDBExtras.h" 12 #include "llvm/DebugInfo/PDB/PDBSymbolData.h" 13 14 #include "llvm/Support/Format.h" 15 16 using namespace llvm; 17 18 PDBSymbolData::PDBSymbolData(const IPDBSession &PDBSession, 19 std::unique_ptr<IPDBRawSymbol> DataSymbol) 20 : PDBSymbol(PDBSession, std::move(DataSymbol)) {} 21 22 void PDBSymbolData::dump(raw_ostream &OS, int Indent, 23 PDB_DumpLevel Level) const { 24 OS.indent(Indent); 25 if (Level == PDB_DumpLevel::Compact) { 26 PDB_LocType Loc = getLocationType(); 27 OS << Loc << " data ["; 28 int Length; 29 switch (Loc) { 30 case PDB_LocType::Static: 31 OS << format_hex(getRelativeVirtualAddress(), 10); 32 Length = getLength(); 33 break; 34 case PDB_LocType::TLS: 35 OS << getAddressSection() << ":" << format_hex(getAddressOffset(), 10); 36 break; 37 case PDB_LocType::RegRel: 38 OS << getRegisterId() << " + " << getOffset() << "]"; 39 break; 40 case PDB_LocType::ThisRel: 41 OS << "this + " << getOffset() << "]"; 42 break; 43 case PDB_LocType::Enregistered: 44 OS << getRegisterId() << "]"; 45 break; 46 case PDB_LocType::BitField: { 47 uint32_t Offset = getOffset(); 48 uint32_t BitPos = getBitPosition(); 49 uint32_t Length = getLength(); 50 uint32_t StartBits = 8 - BitPos; 51 uint32_t MiddleBytes = (Length - StartBits) / 8; 52 uint32_t EndBits = Length - StartBits - MiddleBytes * 8; 53 OS << format_hex(Offset, 10) << ":" << BitPos; 54 OS << " - " << format_hex(Offset + MiddleBytes, 10) << ":" << EndBits; 55 break; 56 } 57 case PDB_LocType::Slot: 58 OS << getSlot(); 59 case PDB_LocType::IlRel: 60 case PDB_LocType::MetaData: 61 case PDB_LocType::Constant: 62 default: 63 OS << "???"; 64 } 65 OS << "] "; 66 } 67 OS << getName() << "\n"; 68 }