Line data Source code
1 : //===-- DebugLoc.cpp - Implement DebugLoc class ---------------------------===//
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/IR/DebugLoc.h"
11 : #include "LLVMContextImpl.h"
12 : #include "llvm/Config/llvm-config.h"
13 : #include "llvm/IR/DebugInfo.h"
14 : using namespace llvm;
15 :
16 : //===----------------------------------------------------------------------===//
17 : // DebugLoc Implementation
18 : //===----------------------------------------------------------------------===//
19 6235696 : DebugLoc::DebugLoc(const DILocation *L) : Loc(const_cast<DILocation *>(L)) {}
20 24783 : DebugLoc::DebugLoc(const MDNode *L) : Loc(const_cast<MDNode *>(L)) {}
21 :
22 31568292 : DILocation *DebugLoc::get() const {
23 31568292 : return cast_or_null<DILocation>(Loc.get());
24 : }
25 :
26 7249787 : unsigned DebugLoc::getLine() const {
27 : assert(get() && "Expected valid DebugLoc");
28 7249787 : return get()->getLine();
29 : }
30 :
31 2877781 : unsigned DebugLoc::getCol() const {
32 : assert(get() && "Expected valid DebugLoc");
33 2877781 : return get()->getColumn();
34 : }
35 :
36 3047415 : MDNode *DebugLoc::getScope() const {
37 : assert(get() && "Expected valid DebugLoc");
38 3047415 : return get()->getScope();
39 : }
40 :
41 4118 : DILocation *DebugLoc::getInlinedAt() const {
42 : assert(get() && "Expected valid DebugLoc");
43 4118 : return get()->getInlinedAt();
44 : }
45 :
46 200 : MDNode *DebugLoc::getInlinedAtScope() const {
47 200 : return cast<DILocation>(Loc)->getInlinedAtScope();
48 : }
49 :
50 186 : DebugLoc DebugLoc::getFnDebugLoc() const {
51 : // FIXME: Add a method on \a DILocation that does this work.
52 186 : const MDNode *Scope = getInlinedAtScope();
53 186 : if (auto *SP = getDISubprogram(Scope))
54 186 : return DebugLoc::get(SP->getScopeLine(), 0, SP);
55 :
56 0 : return DebugLoc();
57 : }
58 :
59 486736 : bool DebugLoc::isImplicitCode() const {
60 486736 : if (DILocation *Loc = get()) {
61 486736 : return Loc->isImplicitCode();
62 : }
63 : return true;
64 : }
65 :
66 0 : void DebugLoc::setImplicitCode(bool ImplicitCode) {
67 0 : if (DILocation *Loc = get()) {
68 : Loc->setImplicitCode(ImplicitCode);
69 : }
70 0 : }
71 :
72 3594375 : DebugLoc DebugLoc::get(unsigned Line, unsigned Col, const MDNode *Scope,
73 : const MDNode *InlinedAt, bool ImplicitCode) {
74 : // If no scope is available, this is an unknown location.
75 3594375 : if (!Scope)
76 329 : return DebugLoc();
77 :
78 3594046 : return DILocation::get(Scope->getContext(), Line, Col,
79 : const_cast<MDNode *>(Scope),
80 3594046 : const_cast<MDNode *>(InlinedAt), ImplicitCode);
81 : }
82 :
83 2252997 : DebugLoc DebugLoc::appendInlinedAt(DebugLoc DL, DILocation *InlinedAt,
84 : LLVMContext &Ctx,
85 : DenseMap<const MDNode *, MDNode *> &Cache,
86 : bool ReplaceLast) {
87 : SmallVector<DILocation *, 3> InlinedAtLocations;
88 : DILocation *Last = InlinedAt;
89 : DILocation *CurInlinedAt = DL;
90 :
91 : // Gather all the inlined-at nodes.
92 2417524 : while (DILocation *IA = CurInlinedAt->getInlinedAt()) {
93 : // Skip any we've already built nodes for.
94 1445848 : if (auto *Found = Cache[IA]) {
95 : Last = cast<DILocation>(Found);
96 : break;
97 : }
98 :
99 164527 : if (ReplaceLast && !IA->getInlinedAt())
100 : break;
101 164527 : InlinedAtLocations.push_back(IA);
102 164527 : CurInlinedAt = IA;
103 164527 : }
104 :
105 : // Starting from the top, rebuild the nodes to point to the new inlined-at
106 : // location (then rebuilding the rest of the chain behind it) and update the
107 : // map of already-constructed inlined-at nodes.
108 2417524 : for (const DILocation *MD : reverse(InlinedAtLocations))
109 329054 : Cache[MD] = Last = DILocation::getDistinct(
110 : Ctx, MD->getLine(), MD->getColumn(), MD->getScope(), Last);
111 :
112 2252997 : return Last;
113 : }
114 :
115 : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
116 : LLVM_DUMP_METHOD void DebugLoc::dump() const { print(dbgs()); }
117 : #endif
118 :
119 4100 : void DebugLoc::print(raw_ostream &OS) const {
120 4100 : if (!Loc)
121 : return;
122 :
123 : // Print source line info.
124 4100 : auto *Scope = cast<DIScope>(getScope());
125 4100 : OS << Scope->getFilename();
126 4100 : OS << ':' << getLine();
127 4100 : if (getCol() != 0)
128 3820 : OS << ':' << getCol();
129 :
130 4100 : if (DebugLoc InlinedAtDL = getInlinedAt()) {
131 0 : OS << " @[ ";
132 0 : InlinedAtDL.print(OS);
133 0 : OS << " ]";
134 : }
135 : }
|