Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
916caec9
Commit
916caec9
authored
Dec 14, 2011
by
Matthias Braun
Browse files
remove deprecated eset
Replace with equivalent pset_ptr stuff
parent
7b4f6392
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/libfirm/adt/eset.h
deleted
100644 → 0
View file @
7b4f6392
/*
* Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
* This file may be distributed and/or modified under the terms of the
* GNU General Public License version 2 as published by the Free Software
* Foundation and appearing in the file LICENSE.GPL included in the
* packaging of this file.
*
* Licensees holding valid libFirm Professional Edition licenses may use
* this file in accordance with the libFirm Commercial License.
* Agreement provided with the Software.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE.
*/
/**
* @file
* @brief a pointer hashset (WARNING: deprecated, use hashset_new.*
* instead)
* @author Hubert Schmid
* @date 09.06.2002
* @deprecated
*/
#ifndef FIRM_ADT_ESET_H
#define FIRM_ADT_ESET_H
#include <stddef.h>
#include "../begin.h"
/**
* "eset" is a set of addresses. The addresses are used for element
* compare and hash calculation.
* The value "NULL" can not be stored, as it is used as internal sentinel.
*/
typedef
struct
eset
eset
;
/** Creates a new empty set. */
FIRM_API
eset
*
eset_create
(
void
);
/**
* Creates a copy of the given set. Does NOT work if NULL is contained in source. */
FIRM_API
eset
*
eset_copy
(
eset
*
source
);
/** Deletes a set. */
FIRM_API
void
eset_destroy
(
eset
*
s
);
/** Returns the number of elements in the set. */
FIRM_API
size_t
eset_count
(
eset
*
s
);
/** Inserts an address into the set. */
FIRM_API
void
eset_insert
(
eset
*
s
,
void
*
p
);
/** Checks, whether an address is element of a set. */
FIRM_API
int
eset_contains
(
eset
*
s
,
void
*
p
);
/**
* Starts the iteration over a set and returns the first element or NULL
* if the set is empty.
*
* @note: It is NOT possible to add new elements while iterating through a set.
*/
FIRM_API
void
*
eset_first
(
eset
*
s
);
/**
* Continues iteration through a set and returns the next element or NULL if the
* iteration is finished.
*
* @note: It is NOT possible to add new elements while iterating through a set.
*/
FIRM_API
void
*
eset_next
(
eset
*
s
);
/** Inserts all elements of source into target (union). Does NOT work if NULL is contained in source. */
FIRM_API
void
eset_insert_all
(
eset
*
target
,
eset
*
source
);
#define eset_foreach(eset, type, iter) \
for ((iter) = (type)eset_first((eset)); (iter) != NULL; (iter) = (type)eset_next((eset)))
#include "../end.h"
#endif
ir/adt/eset.c
deleted
100644 → 0
View file @
7b4f6392
/*
* Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
* This file may be distributed and/or modified under the terms of the
* GNU General Public License version 2 as published by the Free Software
* Foundation and appearing in the file LICENSE.GPL included in the
* packaging of this file.
*
* Licensees holding valid libFirm Professional Edition licenses may use
* this file in accordance with the libFirm Commercial License.
* Agreement provided with the Software.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE.
*/
/**
* @file
* @brief A pointer hash-set (WARNING: deprecated!)
* @author Hubert Schmid
* @date 09.06.2002
*/
#include "config.h"
#include "eset.h"
#include "set.h"
#include "hashptr.h"
struct
eset
{
int
dummy
;
/* dummy entry */
};
#define INITIAL_SLOTS 64
static
int
pcmp
(
const
void
*
p1
,
const
void
*
p2
,
size_t
size
)
{
const
void
**
q1
=
(
const
void
**
)
p1
;
const
void
**
q2
=
(
const
void
**
)
p2
;
(
void
)
size
;
return
*
q1
!=
*
q2
;
}
eset
*
eset_create
(
void
)
{
return
(
eset
*
)
new_set
(
pcmp
,
INITIAL_SLOTS
);
}
eset
*
eset_copy
(
eset
*
source
)
{
eset
*
ret
=
eset_create
();
void
*
p
;
for
(
p
=
eset_first
(
source
);
p
;
p
=
eset_next
(
source
))
{
eset_insert
(
ret
,
p
);
}
return
ret
;
}
void
eset_destroy
(
eset
*
s
)
{
del_set
((
set
*
)
s
);
}
/* Returns the number of elements in the set. */
size_t
eset_count
(
eset
*
s
)
{
return
set_count
((
set
*
)
s
);
}
void
eset_insert
(
eset
*
s
,
void
*
p
)
{
if
(
!
eset_contains
(
s
,
p
))
{
set_insert
((
set
*
)
s
,
&
p
,
sizeof
(
p
),
hash_ptr
(
p
));
}
}
int
eset_contains
(
eset
*
s
,
void
*
p
)
{
return
set_find
((
set
*
)
s
,
&
p
,
sizeof
(
p
),
hash_ptr
(
p
))
!=
NULL
;
}
void
*
eset_first
(
eset
*
s
)
{
void
*
p
=
set_first
((
set
*
)
s
);
return
p
==
NULL
?
NULL
:
*
((
void
**
)
p
);
}
void
*
eset_next
(
eset
*
s
)
{
void
*
p
=
set_next
((
set
*
)
s
);
return
p
==
NULL
?
NULL
:
*
((
void
**
)
p
);
}
void
eset_insert_all
(
eset
*
target
,
eset
*
source
)
{
void
*
p
;
for
(
p
=
eset_first
(
source
);
p
;
p
=
eset_next
(
source
))
{
eset_insert
(
target
,
p
);
}
}
ir/ana/cgana.c
View file @
916caec9
...
@@ -50,7 +50,6 @@
...
@@ -50,7 +50,6 @@
#include "dbginfo_t.h"
#include "dbginfo_t.h"
#include "iropt_dbg.h"
#include "iropt_dbg.h"
#include "eset.h"
#include "pmap.h"
#include "pmap.h"
#include "array.h"
#include "array.h"
#include "error.h"
#include "error.h"
...
@@ -60,7 +59,7 @@
...
@@ -60,7 +59,7 @@
/* unambiguous address used as a mark. */
/* unambiguous address used as a mark. */
static
void
*
MARK
=
&
MARK
;
static
void
*
MARK
=
&
MARK
;
static
e
set
*
entities
=
NULL
;
static
p
set
*
entities
=
NULL
;
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* The analysis */
/* The analysis */
...
@@ -83,14 +82,14 @@ static eset *entities = NULL;
...
@@ -83,14 +82,14 @@ static eset *entities = NULL;
*
*
* @return Number of entities in set.
* @return Number of entities in set.
*/
*/
static
size_t
collect_impls
(
ir_entity
*
method
,
e
set
*
set
)
static
size_t
collect_impls
(
ir_entity
*
method
,
p
set
*
set
)
{
{
size_t
i
;
size_t
i
;
size_t
size
=
0
;
size_t
size
=
0
;
if
(
get_entity_irg
(
method
)
!=
NULL
)
{
if
(
get_entity_irg
(
method
)
!=
NULL
)
{
/* has an implementation */
/* has an implementation */
e
set_insert
(
set
,
method
);
p
set_insert
_ptr
(
set
,
method
);
++
size
;
++
size
;
}
}
...
@@ -110,7 +109,7 @@ static size_t collect_impls(ir_entity *method, eset *set)
...
@@ -110,7 +109,7 @@ static size_t collect_impls(ir_entity *method, eset *set)
static
ir_entity
**
get_impl_methods
(
ir_entity
*
method
)
static
ir_entity
**
get_impl_methods
(
ir_entity
*
method
)
{
{
ir_entity
**
arr
;
ir_entity
**
arr
;
e
set
*
set
=
e
set_
create
();
p
set
*
set
=
p
set_
new_ptr_default
();
size_t
size
;
size_t
size
;
/* Collect all method entities that can be called here */
/* Collect all method entities that can be called here */
...
@@ -122,10 +121,11 @@ static ir_entity **get_impl_methods(ir_entity *method)
...
@@ -122,10 +121,11 @@ static ir_entity **get_impl_methods(ir_entity *method)
}
else
{
}
else
{
ir_entity
*
ent
;
ir_entity
*
ent
;
arr
=
NEW_ARR_F
(
ir_entity
*
,
size
);
arr
=
NEW_ARR_F
(
ir_entity
*
,
size
);
for
(
ent
=
(
ir_entity
*
)
eset_first
(
set
);
size
>
0
;
ent
=
(
ir_entity
*
)
e
set_next
(
set
))
for
each_pset
(
set
,
ir_entity
*
,
e
nt
)
{
arr
[
--
size
]
=
ent
;
arr
[
--
size
]
=
ent
;
}
}
}
eset_destroy
(
set
);
del_pset
(
set
);
return
arr
;
return
arr
;
}
}
...
@@ -166,12 +166,12 @@ static void sel_methods_walker(ir_node *node, void *env)
...
@@ -166,12 +166,12 @@ static void sel_methods_walker(ir_node *node, void *env)
if
(
is_Sel
(
node
)
&&
is_Method_type
(
get_entity_type
(
get_Sel_entity
(
node
))))
{
if
(
is_Sel
(
node
)
&&
is_Method_type
(
get_entity_type
(
get_Sel_entity
(
node
))))
{
ir_entity
*
ent
=
get_SymConst_entity
(
get_atomic_ent_value
(
get_Sel_entity
(
node
)));
ir_entity
*
ent
=
get_SymConst_entity
(
get_atomic_ent_value
(
get_Sel_entity
(
node
)));
if
(
!
e
set_
contains
(
entities
,
ent
))
{
if
(
!
p
set_
find_ptr
(
entities
,
ent
))
{
/* Entity not yet handled. Find all (internal or external)
/* Entity not yet handled. Find all (internal or external)
* implemented methods that overwrites this entity.
* implemented methods that overwrites this entity.
* This set is stored in the entity link. */
* This set is stored in the entity link. */
set_entity_link
(
ent
,
get_impl_methods
(
ent
));
set_entity_link
(
ent
,
get_impl_methods
(
ent
));
e
set_insert
(
entities
,
ent
);
p
set_insert
_ptr
(
entities
,
ent
);
}
}
/* -- As an add on we get an optimization that removes polymorphic calls.
/* -- As an add on we get an optimization that removes polymorphic calls.
...
@@ -221,7 +221,7 @@ static void sel_methods_init(void)
...
@@ -221,7 +221,7 @@ static void sel_methods_init(void)
pmap
*
ldname_map
=
pmap_create
();
/* Map entity names to entities: to replace
pmap
*
ldname_map
=
pmap_create
();
/* Map entity names to entities: to replace
SymConst(name) by SymConst(ent). */
SymConst(name) by SymConst(ent). */
assert
(
entities
==
NULL
);
assert
(
entities
==
NULL
);
entities
=
e
set_
create
();
entities
=
p
set_
new_ptr_default
();
for
(
i
=
0
,
n
=
get_irp_n_irgs
();
i
<
n
;
++
i
)
{
for
(
i
=
0
,
n
=
get_irp_n_irgs
();
i
<
n
;
++
i
)
{
ir_entity
*
ent
=
get_irg_entity
(
get_irp_irg
(
i
));
ir_entity
*
ent
=
get_irg_entity
(
get_irp_irg
(
i
));
/* only external visible methods are allowed to call by a SymConst_ptr_name */
/* only external visible methods are allowed to call by a SymConst_ptr_name */
...
@@ -291,9 +291,9 @@ static ir_entity * get_Sel_method(ir_node * sel, size_t pos)
...
@@ -291,9 +291,9 @@ static ir_entity * get_Sel_method(ir_node * sel, size_t pos)
}
}
/* forward */
/* forward */
static
void
free_mark
(
ir_node
*
node
,
e
set
*
set
);
static
void
free_mark
(
ir_node
*
node
,
p
set
*
set
);
static
void
free_mark_proj
(
ir_node
*
node
,
long
n
,
e
set
*
set
)
static
void
free_mark_proj
(
ir_node
*
node
,
long
n
,
p
set
*
set
)
{
{
assert
(
get_irn_mode
(
node
)
==
mode_T
);
assert
(
get_irn_mode
(
node
)
==
mode_T
);
if
(
get_irn_link
(
node
)
==
MARK
)
{
if
(
get_irn_link
(
node
)
==
MARK
)
{
...
@@ -348,7 +348,7 @@ static void free_mark_proj(ir_node * node, long n, eset * set)
...
@@ -348,7 +348,7 @@ static void free_mark_proj(ir_node * node, long n, eset * set)
* @param node the current visited node
* @param node the current visited node
* @param set the set of all free methods
* @param set the set of all free methods
*/
*/
static
void
free_mark
(
ir_node
*
node
,
e
set
*
set
)
static
void
free_mark
(
ir_node
*
node
,
p
set
*
set
)
{
{
if
(
get_irn_link
(
node
)
==
MARK
)
if
(
get_irn_link
(
node
)
==
MARK
)
return
;
/* already visited */
return
;
/* already visited */
...
@@ -361,7 +361,7 @@ static void free_mark(ir_node *node, eset * set)
...
@@ -361,7 +361,7 @@ static void free_mark(ir_node *node, eset * set)
if
(
is_method_entity
(
ent
))
{
if
(
is_method_entity
(
ent
))
{
size_t
i
,
n
;
size_t
i
,
n
;
for
(
i
=
0
,
n
=
get_Sel_n_methods
(
node
);
i
<
n
;
++
i
)
{
for
(
i
=
0
,
n
=
get_Sel_n_methods
(
node
);
i
<
n
;
++
i
)
{
e
set_insert
(
set
,
get_Sel_method
(
node
,
i
));
p
set_insert
_ptr
(
set
,
get_Sel_method
(
node
,
i
));
}
}
}
}
break
;
break
;
...
@@ -370,7 +370,7 @@ static void free_mark(ir_node *node, eset * set)
...
@@ -370,7 +370,7 @@ static void free_mark(ir_node *node, eset * set)
if
(
get_SymConst_kind
(
node
)
==
symconst_addr_ent
)
{
if
(
get_SymConst_kind
(
node
)
==
symconst_addr_ent
)
{
ir_entity
*
ent
=
get_SymConst_entity
(
node
);
ir_entity
*
ent
=
get_SymConst_entity
(
node
);
if
(
is_method_entity
(
ent
))
{
if
(
is_method_entity
(
ent
))
{
e
set_insert
(
set
,
ent
);
p
set_insert
_ptr
(
set
,
ent
);
}
}
}
}
break
;
break
;
...
@@ -397,7 +397,7 @@ static void free_mark(ir_node *node, eset * set)
...
@@ -397,7 +397,7 @@ static void free_mark(ir_node *node, eset * set)
*/
*/
static
void
free_ana_walker
(
ir_node
*
node
,
void
*
env
)
static
void
free_ana_walker
(
ir_node
*
node
,
void
*
env
)
{
{
e
set
*
set
=
(
e
set
*
)
env
;
p
set
*
set
=
(
p
set
*
)
env
;
if
(
get_irn_link
(
node
)
==
MARK
)
{
if
(
get_irn_link
(
node
)
==
MARK
)
{
/* already visited */
/* already visited */
...
@@ -456,7 +456,7 @@ static void free_ana_walker(ir_node *node, void *env)
...
@@ -456,7 +456,7 @@ static void free_ana_walker(ir_node *node, void *env)
* which is sometimes used to anchor functions.
* which is sometimes used to anchor functions.
*/
*/
static
void
add_method_address_inititializer
(
ir_initializer_t
*
initializer
,
static
void
add_method_address_inititializer
(
ir_initializer_t
*
initializer
,
e
set
*
set
)
p
set
*
set
)
{
{
ir_node
*
n
;
ir_node
*
n
;
size_t
i
;
size_t
i
;
...
@@ -470,7 +470,7 @@ static void add_method_address_inititializer(ir_initializer_t *initializer,
...
@@ -470,7 +470,7 @@ static void add_method_address_inititializer(ir_initializer_t *initializer,
ir_entity
*
ent
=
get_SymConst_entity
(
n
);
ir_entity
*
ent
=
get_SymConst_entity
(
n
);
if
(
is_Method_type
(
get_entity_type
(
ent
)))
if
(
is_Method_type
(
get_entity_type
(
ent
)))
e
set_insert
(
set
,
ent
);
p
set_insert
_ptr
(
set
,
ent
);
}
}
return
;
return
;
case
IR_INITIALIZER_TARVAL
:
case
IR_INITIALIZER_TARVAL
:
...
@@ -498,7 +498,7 @@ static void add_method_address_inititializer(ir_initializer_t *initializer,
...
@@ -498,7 +498,7 @@ static void add_method_address_inititializer(ir_initializer_t *initializer,
*
*
* which is sometimes used to anchor functions.
* which is sometimes used to anchor functions.
*/
*/
static
void
add_method_address
(
ir_entity
*
ent
,
e
set
*
set
)
static
void
add_method_address
(
ir_entity
*
ent
,
p
set
*
set
)
{
{
ir_type
*
tp
;
ir_type
*
tp
;
...
@@ -521,7 +521,7 @@ static void add_method_address(ir_entity *ent, eset *set)
...
@@ -521,7 +521,7 @@ static void add_method_address(ir_entity *ent, eset *set)
ir_entity
*
ent2
=
get_SymConst_entity
(
irn
);
ir_entity
*
ent2
=
get_SymConst_entity
(
irn
);
if
(
is_Method_type
(
get_entity_type
(
ent2
)))
if
(
is_Method_type
(
get_entity_type
(
ent2
)))
e
set_insert
(
set
,
ent2
);
p
set_insert
_ptr
(
set
,
ent2
);
}
}
}
}
}
}
...
@@ -539,7 +539,7 @@ static void add_method_address(ir_entity *ent, eset *set)
...
@@ -539,7 +539,7 @@ static void add_method_address(ir_entity *ent, eset *set)
*/
*/
static
size_t
get_free_methods
(
ir_entity
***
free_methods
)
static
size_t
get_free_methods
(
ir_entity
***
free_methods
)
{
{
e
set
*
free_set
=
e
set_
create
();
p
set
*
free_set
=
p
set_
new_ptr_default
();
size_t
i
,
n
,
j
,
m
;
size_t
i
,
n
,
j
,
m
;
ir_entity
**
arr
;
ir_entity
**
arr
;
ir_entity
*
ent
;
ir_entity
*
ent
;
...
@@ -554,7 +554,7 @@ static size_t get_free_methods(ir_entity ***free_methods)
...
@@ -554,7 +554,7 @@ static size_t get_free_methods(ir_entity ***free_methods)
linkage
=
get_entity_linkage
(
ent
);
linkage
=
get_entity_linkage
(
ent
);
if
((
linkage
&
IR_LINKAGE_HIDDEN_USER
)
||
entity_is_externally_visible
(
ent
))
{
if
((
linkage
&
IR_LINKAGE_HIDDEN_USER
)
||
entity_is_externally_visible
(
ent
))
{
e
set_insert
(
free_set
,
ent
);
p
set_insert
_ptr
(
free_set
,
ent
);
}
}
ir_reserve_resources
(
irg
,
IR_RESOURCE_IRN_LINK
);
ir_reserve_resources
(
irg
,
IR_RESOURCE_IRN_LINK
);
...
@@ -579,15 +579,16 @@ static size_t get_free_methods(ir_entity ***free_methods)
...
@@ -579,15 +579,16 @@ static size_t get_free_methods(ir_entity ***free_methods)
/* the main program is even then "free", if it's not external visible. */
/* the main program is even then "free", if it's not external visible. */
irg
=
get_irp_main_irg
();
irg
=
get_irp_main_irg
();
if
(
irg
!=
NULL
)
if
(
irg
!=
NULL
)
e
set_insert
(
free_set
,
get_irg_entity
(
irg
));
p
set_insert
_ptr
(
free_set
,
get_irg_entity
(
irg
));
/* Finally, transform the set into an array. */
/* Finally, transform the set into an array. */
length
=
e
set_count
(
free_set
);
length
=
p
set_count
(
free_set
);
arr
=
XMALLOCN
(
ir_entity
*
,
length
);
arr
=
XMALLOCN
(
ir_entity
*
,
length
);
for
(
i
=
0
,
ent
=
(
ir_entity
*
)
eset_first
(
free_set
);
ent
;
ent
=
(
ir_entity
*
)
eset_next
(
free_set
))
{
i
=
0
;
foreach_pset
(
free_set
,
ir_entity
*
,
ent
)
{
arr
[
i
++
]
=
ent
;
arr
[
i
++
]
=
ent
;
}
}
eset_destroy
(
free_set
);
del_pset
(
free_set
);
*
free_methods
=
arr
;
*
free_methods
=
arr
;
return
length
;
return
length
;
...
@@ -597,9 +598,9 @@ static size_t get_free_methods(ir_entity ***free_methods)
...
@@ -597,9 +598,9 @@ static size_t get_free_methods(ir_entity ***free_methods)
/* Callee analysis. */
/* Callee analysis. */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
static
void
callee_ana_node
(
ir_node
*
node
,
e
set
*
methods
);
static
void
callee_ana_node
(
ir_node
*
node
,
p
set
*
methods
);
static
void
callee_ana_proj
(
ir_node
*
node
,
long
n
,
e
set
*
methods
)
static
void
callee_ana_proj
(
ir_node
*
node
,
long
n
,
p
set
*
methods
)
{
{
assert
(
get_irn_mode
(
node
)
==
mode_T
);
assert
(
get_irn_mode
(
node
)
==
mode_T
);
if
(
get_irn_link
(
node
)
==
MARK
)
{
if
(
get_irn_link
(
node
)
==
MARK
)
{
...
@@ -618,7 +619,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
...
@@ -618,7 +619,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
if
(
is_Tuple
(
pred
))
{
if
(
is_Tuple
(
pred
))
{
callee_ana_proj
(
get_Tuple_pred
(
pred
,
get_Proj_proj
(
node
)),
n
,
methods
);
callee_ana_proj
(
get_Tuple_pred
(
pred
,
get_Proj_proj
(
node
)),
n
,
methods
);
}
else
{
}
else
{
e
set_insert
(
methods
,
unknown_entity
);
/* free method -> unknown */
p
set_insert
_ptr
(
methods
,
unknown_entity
);
/* free method -> unknown */
}
}
}
}
break
;
break
;
...
@@ -629,7 +630,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
...
@@ -629,7 +630,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
break
;
break
;
default:
default:
e
set_insert
(
methods
,
unknown_entity
);
/* free method -> unknown */
p
set_insert
_ptr
(
methods
,
unknown_entity
);
/* free method -> unknown */
break
;
break
;
}
}
}
}
...
@@ -640,7 +641,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
...
@@ -640,7 +641,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods)
* @param node the node representing the call address
* @param node the node representing the call address
* @param methods after call contains the set of all possibly called entities
* @param methods after call contains the set of all possibly called entities
*/
*/
static
void
callee_ana_node
(
ir_node
*
node
,
e
set
*
methods
)
static
void
callee_ana_node
(
ir_node
*
node
,
p
set
*
methods
)
{
{
assert
(
mode_is_reference
(
get_irn_mode
(
node
))
||
is_Bad
(
node
));
assert
(
mode_is_reference
(
get_irn_mode
(
node
))
||
is_Bad
(
node
));
/* Beware of recursion */
/* Beware of recursion */
...
@@ -654,13 +655,13 @@ static void callee_ana_node(ir_node *node, eset *methods)
...
@@ -654,13 +655,13 @@ static void callee_ana_node(ir_node *node, eset *methods)
case
iro_Const
:
case
iro_Const
:
/* A direct address call. We tread this as an external
/* A direct address call. We tread this as an external
call and ignore it completely. */
call and ignore it completely. */
e
set_insert
(
methods
,
unknown_entity
);
/* free method -> unknown */
p
set_insert
_ptr
(
methods
,
unknown_entity
);
/* free method -> unknown */
break
;
break
;
case
iro_SymConst
:
{
case
iro_SymConst
:
{
ir_entity
*
ent
=
get_SymConst_entity
(
node
);
ir_entity
*
ent
=
get_SymConst_entity
(
node
);
assert
(
ent
&&
is_method_entity
(
ent
));
assert
(
ent
&&
is_method_entity
(
ent
));
e
set_insert
(
methods
,
ent
);
p
set_insert
_ptr
(
methods
,
ent
);
break
;
break
;
}
}
...
@@ -670,9 +671,9 @@ static void callee_ana_node(ir_node *node, eset *methods)
...
@@ -670,9 +671,9 @@ static void callee_ana_node(ir_node *node, eset *methods)
for
(
i
=
0
,
n
=
get_Sel_n_methods
(
node
);
i
<
n
;
++
i
)
{
for
(
i
=
0
,
n
=
get_Sel_n_methods
(
node
);
i
<
n
;
++
i
)
{
ir_entity
*
ent
=
get_Sel_method
(
node
,
i
);
ir_entity
*
ent
=
get_Sel_method
(
node
,
i
);
if
(
ent
!=
NULL
)
{
if
(
ent
!=
NULL
)
{
e
set_insert
(
methods
,
ent
);
p
set_insert
_ptr
(
methods
,
ent
);
}
else
{
}
else
{
e
set_insert
(
methods
,
unknown_entity
);
p
set_insert
_ptr
(
methods
,
unknown_entity
);
}
}
}
}
break
;
break
;
...
@@ -707,7 +708,7 @@ static void callee_ana_node(ir_node *node, eset *methods)
...
@@ -707,7 +708,7 @@ static void callee_ana_node(ir_node *node, eset *methods)
case
iro_Sub
:
case
iro_Sub
:
case
iro_Conv
:
case
iro_Conv
:
/* extern */
/* extern */
e
set_insert
(
methods
,
unknown_entity
);
/* free method -> unknown */
p
set_insert
_ptr
(
methods
,
unknown_entity
);
/* free method -> unknown */
break
;
break
;
default:
default:
...
@@ -724,14 +725,15 @@ static void callee_walker(ir_node *call, void *env)
...
@@ -724,14 +725,15 @@ static void callee_walker(ir_node *call, void *env)
{
{
(
void
)
env
;
(
void
)
env
;
if
(
is_Call
(
call
))
{
if
(
is_Call
(
call
))
{
e
set
*
methods
=
e
set_
create
();
p
set
*
methods
=
p
set_
new_ptr_default
();
ir_entity
*
ent
;
ir_entity
*
ent
;
ir_entity
**
arr
;
ir_entity
**
arr
;
size_t
i
;
size_t
i
;
callee_ana_node
(
get_Call_ptr
(
call
),
methods
);
callee_ana_node
(
get_Call_ptr
(
call
),
methods
);
arr
=
NEW_ARR_F
(
ir_entity
*
,
eset_count
(
methods
));
arr
=
NEW_ARR_F
(
ir_entity
*
,
pset_count
(
methods
));
for
(
i
=
0
,
ent
=
(
ir_entity
*
)
eset_first
(
methods
);
ent
;
ent
=
(
ir_entity
*
)
eset_next
(
methods
))
{
i
=
0
;
foreach_pset
(
methods
,
ir_entity
*
,
ent
)
{
arr
[
i
]
=
ent
;
arr
[
i
]
=
ent
;
/* we want the unknown_entity on the zero position for easy tests later */
/* we want the unknown_entity on the zero position for easy tests later */
if
(
ent
==
unknown_entity
)
{
if
(
ent
==
unknown_entity
)
{
...
@@ -742,7 +744,7 @@ static void callee_walker(ir_node *call, void *env)
...
@@ -742,7 +744,7 @@ static void callee_walker(ir_node *call, void *env)
}
}
set_Call_callee_arr
(
call
,
ARR_LEN
(
<