+ waitq *worklist = new_waitq();
+
+ if(only_emit_marked) {
+ for (i = 0; i < n; i++) {
+ ir_entity *ent = get_compound_member(gt, i);
+ if(entity_visited(ent) ||
+ get_entity_visibility(ent) != visibility_external_allocated) {
+ waitq_put(worklist, ent);
+ mark_entity_visited(ent);
+ }
+ }
+ } else {
+ inc_master_type_visited();
+ for (i = 0; i < n; i++) {
+ ir_entity *ent = get_compound_member(gt, i);
+ mark_entity_visited(ent);
+ waitq_put(worklist, ent);
+ }
+ }
+
+ env->worklist = worklist;
+
+ while(!waitq_empty(worklist)) {
+ ir_entity *ent = waitq_get(worklist);