Mercurial > hg > CbC > CbC_llvm
comparison lib/DebugInfo/PDB/PDBSymbolFunc.cpp @ 83:60c9769439b8 LLVM3.7
LLVM 3.7
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 18 Feb 2015 14:55:36 +0900 |
parents | |
children | afa8332a0e37 |
comparison
equal
deleted
inserted
replaced
78:af83660cff7b | 83:60c9769439b8 |
---|---|
1 //===- PDBSymbolFunc.cpp - --------------------------------------*- 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 "llvm/DebugInfo/PDB/PDBSymbolFunc.h" | |
11 | |
12 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" | |
13 #include "llvm/DebugInfo/PDB/IPDBSession.h" | |
14 #include "llvm/DebugInfo/PDB/PDBSymbol.h" | |
15 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h" | |
16 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h" | |
17 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h" | |
18 #include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h" | |
19 #include "llvm/Support/Format.h" | |
20 #include <utility> | |
21 | |
22 using namespace llvm; | |
23 PDBSymbolFunc::PDBSymbolFunc(const IPDBSession &PDBSession, | |
24 std::unique_ptr<IPDBRawSymbol> Symbol) | |
25 : PDBSymbol(PDBSession, std::move(Symbol)) {} | |
26 | |
27 std::unique_ptr<PDBSymbolTypeFunctionSig> PDBSymbolFunc::getSignature() const { | |
28 return Session.getConcreteSymbolById<PDBSymbolTypeFunctionSig>(getTypeId()); | |
29 } | |
30 | |
31 void PDBSymbolFunc::dump(raw_ostream &OS, int Indent, | |
32 PDB_DumpLevel Level, PDB_DumpFlags Flags) const { | |
33 uint32_t FuncStart = getRelativeVirtualAddress(); | |
34 uint32_t FuncEnd = FuncStart + getLength(); | |
35 OS << stream_indent(Indent); | |
36 if (FuncStart == 0 && FuncEnd == 0) { | |
37 OS << "func [???] "; | |
38 } else { | |
39 OS << "func "; | |
40 OS << "[" << format_hex(FuncStart, 8); | |
41 if (auto DebugStart = findOneChild<PDBSymbolFuncDebugStart>()) | |
42 OS << "+" << DebugStart->getRelativeVirtualAddress() - FuncStart; | |
43 OS << " - " << format_hex(FuncEnd, 8); | |
44 if (auto DebugEnd = findOneChild<PDBSymbolFuncDebugEnd>()) | |
45 OS << "-" << FuncEnd - DebugEnd->getRelativeVirtualAddress(); | |
46 OS << "] "; | |
47 } | |
48 | |
49 PDB_RegisterId Reg = getLocalBasePointerRegisterId(); | |
50 if (Reg == PDB_RegisterId::VFrame) | |
51 OS << "(VFrame)"; | |
52 else if (hasFramePointer()) | |
53 OS << "(" << Reg << ")"; | |
54 else | |
55 OS << "(FPO)"; | |
56 | |
57 OS << " "; | |
58 if (isVirtual() || isPureVirtual()) | |
59 OS << "virtual "; | |
60 | |
61 if (auto FuncSig = getSignature()) { | |
62 // If we have a signature, dump the name with the signature. | |
63 if (auto ReturnType = FuncSig->getReturnType()) { | |
64 ReturnType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children); | |
65 OS << " "; | |
66 } | |
67 | |
68 OS << FuncSig->getCallingConvention() << " "; | |
69 | |
70 OS << getName(); | |
71 FuncSig->dumpArgList(OS); | |
72 if (isPureVirtual()) | |
73 OS << " = 0"; | |
74 } else { | |
75 uint32_t ClassId = getClassParentId(); | |
76 if (ClassId != 0) { | |
77 if (auto Class = Session.getSymbolById(ClassId)) { | |
78 if (auto UDT = dyn_cast<PDBSymbolTypeUDT>(Class.get())) | |
79 OS << UDT->getName() << "::"; | |
80 else | |
81 OS << "{class " << Class->getSymTag() << "}::"; | |
82 } | |
83 } | |
84 OS << getName(); | |
85 } | |
86 } |