2 * Copyright © 2010 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
25 * \file opt_dead_functions.cpp
27 * Eliminates unused functions from the linked program.
31 #include "ir_visitor.h"
32 #include "ir_expression_flattening.h"
33 #include "glsl_types.h"
37 class signature_entry
: public exec_node
40 signature_entry(ir_function_signature
*sig
)
42 this->signature
= sig
;
46 ir_function_signature
*signature
;
50 class ir_dead_functions_visitor
: public ir_hierarchical_visitor
{
52 ir_dead_functions_visitor()
54 this->mem_ctx
= ralloc_context(NULL
);
57 ~ir_dead_functions_visitor()
59 ralloc_free(this->mem_ctx
);
62 virtual ir_visitor_status
visit_enter(ir_function_signature
*);
63 virtual ir_visitor_status
visit_enter(ir_call
*);
65 signature_entry
*get_signature_entry(ir_function_signature
*var
);
67 /* List of signature_entry */
68 exec_list signature_list
;
72 } /* unnamed namespace */
75 ir_dead_functions_visitor::get_signature_entry(ir_function_signature
*sig
)
77 foreach_iter(exec_list_iterator
, iter
, this->signature_list
) {
78 signature_entry
*entry
= (signature_entry
*)iter
.get();
79 if (entry
->signature
== sig
)
83 signature_entry
*entry
= new(mem_ctx
) signature_entry(sig
);
84 this->signature_list
.push_tail(entry
);
90 ir_dead_functions_visitor::visit_enter(ir_function_signature
*ir
)
92 signature_entry
*entry
= this->get_signature_entry(ir
);
94 if (strcmp(ir
->function_name(), "main") == 0) {
100 return visit_continue
;
105 ir_dead_functions_visitor::visit_enter(ir_call
*ir
)
107 signature_entry
*entry
= this->get_signature_entry(ir
->callee
);
111 return visit_continue
;
115 do_dead_functions(exec_list
*instructions
)
117 ir_dead_functions_visitor v
;
118 bool progress
= false;
120 visit_list_elements(&v
, instructions
);
122 /* Now that we've figured out which function signatures are used, remove
123 * the unused ones, and remove function definitions that have no more
126 foreach_iter(exec_list_iterator
, iter
, v
.signature_list
) {
127 signature_entry
*entry
= (signature_entry
*)iter
.get();
130 entry
->signature
->remove();
131 delete entry
->signature
;
137 /* We don't just do this above when we nuked a signature because of
140 foreach_iter(exec_list_iterator
, iter
, *instructions
) {
141 ir_instruction
*ir
= (ir_instruction
*)iter
.get();
142 ir_function
*func
= ir
->as_function();
144 if (func
&& func
->signatures
.is_empty()) {
145 /* At this point (post-linking), the symbol table is no
146 * longer in use, so not removing the function from the
147 * symbol table should be OK.