projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ia32: Remove the ia32_x87_attr_t from ia32_asm_attr_t.
[libfirm]
/
ir
/
opt
/
garbage_collect.c
diff --git
a/ir/opt/garbage_collect.c
b/ir/opt/garbage_collect.c
index
5e8c529
..
4892264
100644
(file)
--- a/
ir/opt/garbage_collect.c
+++ b/
ir/opt/garbage_collect.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (C)
2010
University of Karlsruhe. All right reserved.
+ * Copyright (C)
1995-2011
University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
*
* This file is part of libFirm.
*
@@
-21,7
+21,6
@@
* @file
* @brief Removal of unreachable methods.
* @author Matthias Braun
* @file
* @brief Removal of unreachable methods.
* @author Matthias Braun
- * @version $Id$
*/
#include "config.h"
*/
#include "config.h"
@@
-36,7
+35,7
@@
#include "error.h"
#include "debug.h"
#include "error.h"
#include "debug.h"
-DEBUG_ONLY(static firm_dbg_module_t *dbg
);
+DEBUG_ONLY(static firm_dbg_module_t *dbg
;)
static void visit_entity(ir_entity *entity);
static void visit_entity(ir_entity *entity);
@@
-45,12
+44,16
@@
static void visit_node(ir_node *node, void *env)
ir_entity *entity;
(void) env;
ir_entity *entity;
(void) env;
- if (!is_SymConst(node))
- return;
- if (!SYMCONST_HAS_ENT(get_SymConst_kind(node)))
+ if (is_SymConst(node)) {
+ if (!SYMCONST_HAS_ENT(get_SymConst_kind(node)))
+ return;
+ entity = get_SymConst_entity(node);
+ } else if (is_Sel(node)) {
+ entity = get_Sel_entity(node);
+ } else {
return;
return;
+ }
- entity = get_SymConst_entity(node);
visit_entity(entity);
}
visit_entity(entity);
}
@@
-61,7
+64,6
@@
static void start_visit_node(ir_node *node)
if (get_irg_visited(irg) < get_max_irg_visited()) {
set_irg_visited(irg, get_max_irg_visited());
}
if (get_irg_visited(irg) < get_max_irg_visited()) {
set_irg_visited(irg, get_max_irg_visited());
}
- current_ir_graph = irg;
irg_walk_2(node, visit_node, NULL, NULL);
}
irg_walk_2(node, visit_node, NULL, NULL);
}
@@
-77,7
+79,7
@@
static void visit_initializer(ir_initializer_t *initializer)
case IR_INITIALIZER_COMPOUND: {
size_t i;
case IR_INITIALIZER_COMPOUND: {
size_t i;
- for(i = 0; i < initializer->compound.n_initializers; ++i) {
+ for
(i = 0; i < initializer->compound.n_initializers; ++i) {
ir_initializer_t *subinitializer
= initializer->compound.initializers[i];
visit_initializer(subinitializer);
ir_initializer_t *subinitializer
= initializer->compound.initializers[i];
visit_initializer(subinitializer);
@@
-98,13
+100,6
@@
static void visit_entity(ir_entity *entity)
if (entity->initializer != NULL) {
visit_initializer(entity->initializer);
if (entity->initializer != NULL) {
visit_initializer(entity->initializer);
- } else if (entity_has_compound_ent_values(entity)) {
- int i;
- int n_members = get_compound_ent_n_values(entity);
- for (i = 0; i < n_members; ++i) {
- ir_node *node = get_compound_ent_value(entity, i);
- start_visit_node(node);
- }
}
irg = get_entity_irg(entity);
}
irg = get_entity_irg(entity);
@@
-120,8
+115,9
@@
static void visit_segment(ir_type *segment)
for (i = 0; i < n_entities; ++i) {
ir_entity *entity = get_compound_member(segment, i);
for (i = 0; i < n_entities; ++i) {
ir_entity *entity = get_compound_member(segment, i);
- if (get_entity_visibility(entity) != ir_visibility_default
- && !(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER))
+ if (get_entity_visibility(entity) != ir_visibility_external
+ && !(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER)
+ && !(get_entity_linkage(entity) & IR_LINKAGE_NO_CODEGEN))
continue;
visit_entity(entity);
continue;
visit_entity(entity);
@@
-140,20
+136,19
@@
static void garbage_collect_in_segment(ir_type *segment)
DB((dbg, LEVEL_1, " removing entity %+F\n", entity));
DB((dbg, LEVEL_1, " removing entity %+F\n", entity));
- /* TODO: this is O(n^2) improve our interfaces! */
- remove_class_member(get_entity_owner(entity), entity);
+ free_entity(entity);
}
}
void garbage_collect_entities(void)
{
}
}
void garbage_collect_entities(void)
{
-
int
i;
+
size_t
i;
ir_segment_t s;
FIRM_DBG_REGISTER(dbg, "firm.opt.garbagecollect");
/* start a type walk for all externally visible entities */
ir_segment_t s;
FIRM_DBG_REGISTER(dbg, "firm.opt.garbagecollect");
/* start a type walk for all externally visible entities */
- irp_reserve_resources(irp, IR_RESOURCE_TYPE_VISITED);
+ irp_reserve_resources(irp, IR
P
_RESOURCE_TYPE_VISITED);
inc_master_type_visited();
inc_max_irg_visited();
inc_master_type_visited();
inc_max_irg_visited();
@@
-165,17
+160,17
@@
void garbage_collect_entities(void)
}
/* remove graphs of non-visited functions
}
/* remove graphs of non-visited functions
- * (we have to count backwards
so we can safely call remove_irp_irg
- *
while iterating
) */
- for (i = get_irp_n_irgs()
-1; i >= 0; --i
) {
- ir_graph *irg = get_irp_irg(i);
+ * (we have to count backwards
, because freeing the graph moves the last
+ *
graph in the list to the free position
) */
+ for (i = get_irp_n_irgs()
; i > 0;
) {
+ ir_graph *irg = get_irp_irg(
--
i);
ir_entity *entity = get_irg_entity(irg);
if (entity_visited(entity))
continue;
ir_entity *entity = get_irg_entity(irg);
if (entity_visited(entity))
continue;
- DB((dbg, LEVEL_1, " freeing method %+F\n",
entity));
-
remove_irp_irg
(irg);
+ DB((dbg, LEVEL_1, " freeing method %+F\n", entity));
+
free_ir_graph
(irg);
}
/* we can now remove all non-visited (global) entities */
}
/* we can now remove all non-visited (global) entities */
@@
-183,7
+178,7
@@
void garbage_collect_entities(void)
ir_type *type = get_segment_type(s);
garbage_collect_in_segment(type);
}
ir_type *type = get_segment_type(s);
garbage_collect_in_segment(type);
}
- irp_free_resources(irp, IR_RESOURCE_TYPE_VISITED);
+ irp_free_resources(irp, IR
P
_RESOURCE_TYPE_VISITED);
}
ir_prog_pass_t *garbage_collect_entities_pass(const char *name)
}
ir_prog_pass_t *garbage_collect_entities_pass(const char *name)