+/**
+ * Add all method addresses in global initializers to the set.
+ *
+ * @note
+ * We do NOT check the type here, just it it's an entity address.
+ * The reason for this is code like:
+ *
+ * void *p = function;
+ *
+ * which is sometimes used to anchor functions.
+ */
+static void add_method_address(entity *ent, eset *set)
+{
+ ir_node *n;
+ ir_type *tp;
+ int i;
+
+ /* do not check uninitialized values */
+ if (get_entity_variability(ent) == variability_uninitialized)
+ return;
+
+ if (is_atomic_entity(ent)) {
+ tp = get_entity_type(ent);
+
+ /* ignore methods: these of course reference it's address */
+ if (is_Method_type(tp))
+ return;
+
+ /* let's check if it's the address of a function */
+ n = get_atomic_ent_value(ent);
+ if (get_irn_op(n) == op_SymConst) {
+ if (get_SymConst_kind(n) == symconst_addr_ent) {
+ ent = get_SymConst_entity(n);
+
+ if (is_Method_type(get_entity_type(ent)))
+ eset_insert(set, ent);
+ }
+ }
+ }
+ else {
+ for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) {
+ n = get_compound_ent_value(ent, i);
+
+ /* let's check if it's the address of a function */
+ if (get_irn_op(n) == op_SymConst) {
+ if (get_SymConst_kind(n) == symconst_addr_ent) {
+ entity *ent = get_SymConst_entity(n);
+
+ if (is_Method_type(get_entity_type(ent)))
+ eset_insert(set, ent);
+ }
+ }
+ }
+ }
+}
+