Commit d90f94a1 authored by Götz Lindenmaier's avatar Götz Lindenmaier
Browse files

fixes of pseudo irgs

[r4375]
parent 6a775aaa
......@@ -489,8 +489,10 @@ int get_Call_arity (ir_node *node);
*
* The callee information lists all method entities that can be called
* from this node. If the address expression can not be analyzed fully,
* e.g., as there are external methods that could be called, the array
* contains a single NULL entry.
* e.g., as entities can be called that are not in the compilation unit,
* the array contains the unknown_entity. The array contains only entities
* with peculiarity_existent, but with all kinds of visibility. The entities
* not necessarily contain an irg.
*
* The array is only accessible if callee information is valid. See flag
* in graph.
......
......@@ -123,11 +123,12 @@ void add_irp_irg(ir_graph *irg) {
/* Removes irg from the list or irgs, shrinks the list by one. */
void remove_irp_irg(ir_graph *irg){
int i;
int i, found = false;
assert(irg);
free_ir_graph(irg);
for (i = 0; i < (ARR_LEN (irp->graphs)); i++) {
if (irp->graphs[i] == irg) {
found = true;
for(; i < (ARR_LEN (irp->graphs)) - 1; i++) {
irp->graphs[i] = irp->graphs[i+1];
}
......@@ -135,6 +136,17 @@ void remove_irp_irg(ir_graph *irg){
break;
}
}
if (!found) {
for (i = 0; i < (ARR_LEN (irp->pseudo_graphs)); i++) {
if (irp->pseudo_graphs[i] == irg) {
for(; i < (ARR_LEN (irp->pseudo_graphs)) - 1; i++) {
irp->pseudo_graphs[i] = irp->pseudo_graphs[i+1];
}
ARR_SETLEN(ir_graph*, irp->pseudo_graphs, (ARR_LEN(irp->pseudo_graphs)) - 1);
break;
}
}
}
}
int (get_irp_n_irgs)(void) {
......@@ -160,11 +172,13 @@ int get_irp_n_allirgs(void) {
/* Returns the ir graph at position pos of all graphs (including
pseudo graphs). Visits first graphs, then pseudo graphs. */
ir_graph *get_irp_allirg(int pos) {
int n_irgs = get_irp_n_irgs();
if (pos < n_irgs)
int n_irgs = ARR_LEN((irp)->graphs);
assert(0 <= pos);
if (pos < n_irgs) {
return (irp)->graphs[pos];
else
} else {
return get_irp_pseudo_irg(pos-n_irgs);
}
}
......
......@@ -88,8 +88,8 @@ __get_irp_n_irgs(void) {
static INLINE ir_graph *
__get_irp_irg(int pos){
assert (irp && irp->graphs);
if (get_visit_pseudo_irgs()) return get_irp_allirg(pos);
assert(0 <= pos && pos <= get_irp_n_irgs());
return irp->graphs[pos];
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment