Add concrete type overloads to PDBSymbol::findChildren().
[oota-llvm.git] / lib / DebugInfo / PDB / PDBSymbolData.cpp
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 }