GCC Middle and Back End API Reference
inlining-iterator.h
Go to the documentation of this file.
1/* Iterator for walking a chain of inlining locations.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_ANALYZER_INLINING_ITERATOR_H
22#define GCC_ANALYZER_INLINING_ITERATOR_H
23
24/* Iterator for walking a chain of inlining locations.
25
26 The fndecls and locations will be traversed from innermost to outermost.
27 For example, given:
28
29 inline void inner (void)
30 {
31 ...LOCATION HERE...
32 }
33 void outer (void)
34 {
35 inner (); <-- CALLSITE
36 }
37
38 then the fndecl will be "inner" on the initial iteration, and "outer" on
39 the second (final) iteration.
40
41 Compare with lhd_print_error_function, cp_print_error_function,
42 and optrecord_json_writer::inlining_chain_to_json. */
43
45{
46public:
54
55 bool done_p () const { return m_abstract_origin == NULL; }
56
62
63 tree get_fndecl () const { return m_fndecl; }
64 location_t get_callsite () const { return m_callsite; }
65 tree get_block () const { return m_abstract_origin; }
66
67private:
69 {
70 if (done_p ())
71 return;
72 tree block = m_abstract_origin;
74 m_fndecl = NULL;
75 block = BLOCK_SUPERCONTEXT (block);
76 while (block && TREE_CODE (block) == BLOCK
77 && BLOCK_ABSTRACT_ORIGIN (block))
78 {
79 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
80 if (TREE_CODE (ao) == FUNCTION_DECL)
81 {
82 m_fndecl = ao;
83 break;
84 }
85 else if (TREE_CODE (ao) != BLOCK)
86 break;
87
88 block = BLOCK_SUPERCONTEXT (block);
89 }
90 if (m_fndecl)
92 else
93 {
94 while (block && TREE_CODE (block) == BLOCK)
95 block = BLOCK_SUPERCONTEXT (block);
96
97 if (block && TREE_CODE (block) == FUNCTION_DECL)
98 m_fndecl = block;
100 }
101 }
102
104 location_t m_callsite;
107};
108
109/* A class for fixing up fndecls and stack depths in checker_event, based
110 on inlining records.
111
112 The early inliner runs before the analyzer, which can lead to confusing
113 output.
114
115 Tne base fndecl and depth within a checker_event are from call strings
116 in program_points, which reflect the call strings after inlining.
117 This class lets us offset the depth and fix up the reported fndecl and
118 stack depth to better reflect the user's original code. */
119
121{
122public:
123 inlining_info (location_t loc)
124 {
125 inlining_iterator iter (loc);
126 m_inner_fndecl = iter.get_fndecl ();
127 int num_frames = 0;
128 while (!iter.done_p ())
129 {
130 m_outer_fndecl = iter.get_fndecl ();
131 num_frames++;
132 iter.next ();
133 }
134 if (num_frames > 1)
135 m_extra_frames = num_frames - 1;
136 else
137 m_extra_frames = 0;
138 }
139
141 int get_extra_frames () const { return m_extra_frames; }
142
143private:
147};
148
149#endif /* GCC_ANALYZER_INLINING_ITERATOR_H */
Definition inlining-iterator.h:121
int m_extra_frames
Definition inlining-iterator.h:146
tree m_inner_fndecl
Definition inlining-iterator.h:145
int get_extra_frames() const
Definition inlining-iterator.h:141
tree m_outer_fndecl
Definition inlining-iterator.h:144
inlining_info(location_t loc)
Definition inlining-iterator.h:123
tree get_inner_fndecl() const
Definition inlining-iterator.h:140
Definition inlining-iterator.h:45
tree get_block() const
Definition inlining-iterator.h:65
tree m_abstract_origin
Definition inlining-iterator.h:103
tree m_next_abstract_origin
Definition inlining-iterator.h:106
void next()
Definition inlining-iterator.h:57
inlining_iterator(location_t loc)
Definition inlining-iterator.h:47
void prepare_iteration()
Definition inlining-iterator.h:68
tree get_fndecl() const
Definition inlining-iterator.h:63
location_t m_callsite
Definition inlining-iterator.h:104
bool done_p() const
Definition inlining-iterator.h:55
location_t get_callsite() const
Definition inlining-iterator.h:64
tree m_fndecl
Definition inlining-iterator.h:105
union tree_node * tree
Definition coretypes.h:97
#define LOCATION_BLOCK(LOC)
Definition input.h:194
#define UNKNOWN_LOCATION
Definition input.h:32
#define NULL
Definition system.h:50
#define BLOCK_ABSTRACT_ORIGIN(NODE)
Definition tree.h:2210
#define BLOCK_SOURCE_LOCATION(NODE)
Definition tree.h:2256
#define TREE_CODE(NODE)
Definition tree.h:324
#define BLOCK_SUPERCONTEXT(NODE)
Definition tree.h:2203