aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo/PDB/PDBSymbolData.cpp
blob: bffad8af7513d324fdddda80e55d3a583bb7b132 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//===- PDBSymbolData.cpp - PDB data (e.g. variable) accessors ---*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include <utility>
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbolData.h"

#include "llvm/Support/Format.h"

using namespace llvm;

PDBSymbolData::PDBSymbolData(const IPDBSession &PDBSession,
                             std::unique_ptr<IPDBRawSymbol> DataSymbol)
    : PDBSymbol(PDBSession, std::move(DataSymbol)) {}

void PDBSymbolData::dump(raw_ostream &OS, int Indent,
                         PDB_DumpLevel Level) const {
  OS.indent(Indent);
  if (Level == PDB_DumpLevel::Compact) {
    PDB_LocType Loc = getLocationType();
    OS << Loc << " data [";
    int Length;
    switch (Loc) {
    case PDB_LocType::Static:
      OS << format_hex(getRelativeVirtualAddress(), 10);
      Length = getLength();
      break;
    case PDB_LocType::TLS:
      OS << getAddressSection() << ":" << format_hex(getAddressOffset(), 10);
      break;
    case PDB_LocType::RegRel:
      OS << getRegisterId() << " + " << getOffset() << "]";
      break;
    case PDB_LocType::ThisRel:
      OS << "this + " << getOffset() << "]";
      break;
    case PDB_LocType::Enregistered:
      OS << getRegisterId() << "]";
      break;
    case PDB_LocType::BitField: {
      uint32_t Offset = getOffset();
      uint32_t BitPos = getBitPosition();
      uint32_t Length = getLength();
      uint32_t StartBits = 8 - BitPos;
      uint32_t MiddleBytes = (Length - StartBits) / 8;
      uint32_t EndBits = Length - StartBits - MiddleBytes * 8;
      OS << format_hex(Offset, 10) << ":" << BitPos;
      OS << " - " << format_hex(Offset + MiddleBytes, 10) << ":" << EndBits;
      break;
    }
    case PDB_LocType::Slot:
      OS << getSlot();
    case PDB_LocType::IlRel:
    case PDB_LocType::MetaData:
    case PDB_LocType::Constant:
    default:
      OS << "???";
    }
    OS << "] ";
  }
  OS << getName() << "\n";
}