/** Sets/resets the compiler generated flag. */
void set_entity_compiler_generated(ir_entity *ent, int flag);
-/** Checks if an entity is marked by the backend. */
-int is_entity_backend_marked(const ir_entity *ent);
-
-/** Sets/resets the backend marker flag. */
-void set_entity_backend_marked(ir_entity *ent, int flag);
-
/**
* Bitfield type indicating the way an entity is used.
*/
TEMPLATE_isa_t *isa = self;
/* emit now all global declarations */
- be_gas_emit_decls(isa->arch_env.main_env, 0);
+ be_gas_emit_decls(isa->arch_env.main_env);
be_emit_exit();
free(self);
sym_or_tv_t key, *entry;
unsigned label;
- set_entity_backend_marked(attr->entity, 1);
-
key.u.id = get_entity_ld_ident(attr->entity);
key.is_ident = 1;
key.label = 0;
static void arm_emit_entity(ir_entity *entity)
{
- set_entity_backend_marked(entity, 1);
be_emit_ident(get_entity_ld_ident(entity));
}
static void arm_done(void *self) {
arm_isa_t *isa = self;
- be_gas_emit_decls(isa->arch_env.main_env, 1);
+ be_gas_emit_decls(isa->arch_env.main_env);
be_emit_exit();
free(self);
#include "tv.h"
#include "irnode.h"
#include "irprog.h"
-#include "pdeq.h"
#include "entity_t.h"
#include "error.h"
/** by default, we generate assembler code for the Linux gas */
object_file_format_t be_gas_object_file_format = OBJECT_FILE_FORMAT_ELF;
bool be_gas_emit_types = true;
-char be_gas_elf_type_char = '@';
+char be_gas_elf_type_char = '@';
static be_gas_section_t current_section = (be_gas_section_t) -1;
*/
typedef struct _be_gas_decl_env {
be_gas_section_t section;
- waitq *worklist; /**< A worklist we use to place not yet handled entities on. */
- const be_main_env_t *main_env;
+ const be_main_env_t *main_env;
} be_gas_decl_env_t;
/************************************************************************/
case symconst_addr_ent:
ent = get_SymConst_entity(init);
- if (!is_entity_backend_marked(ent)) {
- waitq_put(env->worklist, ent);
- set_entity_backend_marked(ent, 1);
- }
be_gas_emit_entity(ent);
break;
*
* @param gt a global like type, either the global or the TLS one
* @param env an environment
- * @param only_emit_marked if non-zero, external allocated entities that do not have
- * its visited flag set are ignored
*/
-static void be_gas_dump_globals(ir_type *gt, be_gas_decl_env_t *env,
- int only_emit_marked)
+static void be_gas_dump_globals(ir_type *gt, be_gas_decl_env_t *env)
{
int i, n = get_compound_n_members(gt);
- waitq *worklist = new_waitq();
-
- if (only_emit_marked) {
- for (i = 0; i < n; i++) {
- ir_entity *ent = get_compound_member(gt, i);
- if (is_entity_backend_marked(ent) || entity_has_definition(ent)) {
- waitq_put(worklist, ent);
- set_entity_backend_marked(ent, 1);
- }
- }
- } else {
- for (i = 0; i < n; i++) {
- ir_entity *ent = get_compound_member(gt, i);
- set_entity_backend_marked(ent, 1);
- waitq_put(worklist, ent);
- }
- }
-
- env->worklist = worklist;
-
- while (!waitq_empty(worklist)) {
- ir_entity *ent = waitq_get(worklist);
+ for (i = 0; i < n; i++) {
+ ir_entity *ent = get_compound_member(gt, i);
dump_global(env, ent);
}
-
- del_waitq(worklist);
- env->worklist = NULL;
}
/************************************************************************/
/* Generate all entities. */
-void be_gas_emit_decls(const be_main_env_t *main_env,
- int only_emit_marked_entities)
+void be_gas_emit_decls(const be_main_env_t *main_env)
{
be_gas_decl_env_t env;
memset(&env, 0, sizeof(env));
env.main_env = main_env;
env.section = (be_gas_section_t) -1;
- be_gas_dump_globals(get_glob_type(), &env, only_emit_marked_entities);
- be_gas_dump_globals(get_tls_type(), &env, only_emit_marked_entities);
- be_gas_dump_globals(get_segment_type(IR_SEGMENT_CONSTRUCTORS), &env,
- only_emit_marked_entities);
- be_gas_dump_globals(get_segment_type(IR_SEGMENT_DESTRUCTORS), &env,
- only_emit_marked_entities);
- be_gas_dump_globals(main_env->pic_symbols_type, &env,
- only_emit_marked_entities);
- be_gas_dump_globals(main_env->pic_trampolines_type, &env,
- only_emit_marked_entities);
+ be_gas_dump_globals(get_glob_type(), &env);
+ be_gas_dump_globals(get_tls_type(), &env);
+ be_gas_dump_globals(get_segment_type(IR_SEGMENT_CONSTRUCTORS), &env);
+ be_gas_dump_globals(get_segment_type(IR_SEGMENT_DESTRUCTORS), &env);
+ be_gas_dump_globals(main_env->pic_symbols_type, &env);
+ be_gas_dump_globals(main_env->pic_trampolines_type, &env);
/**
* ".subsections_via_symbols marks object files which are OK to divide
* Generate all entities.
* @param main_env the main backend environment
* @param emit_commons if non-zero, emit commons (non-local uninitialized entities)
- * @param only_emit_marked if non-zero, external allocated entities that do not have
- * its visited flag set are ignored
*/
-void be_gas_emit_decls(const be_main_env_t *main_env,
- int only_emit_marked_entities);
+void be_gas_emit_decls(const be_main_env_t *main_env);
/**
* Emit an entity (the entities name or a block label)
ia32_isa_t *isa = self;
/* emit now all global declarations */
- be_gas_emit_decls(isa->arch_env.main_env, 1);
+ be_gas_emit_decls(isa->arch_env.main_env);
pmap_destroy(isa->regs_16bit);
pmap_destroy(isa->regs_8bit);
static void ia32_emit_entity(ir_entity *entity, int no_pic_adjust)
{
- set_entity_backend_marked(entity, 1);
be_gas_emit_entity(entity);
if (get_entity_owner(entity) == get_tls_type()) {
be_emit_cstring("\t.long ");
if (entity_sign)
be_emit_char('-');
- set_entity_backend_marked(entity, 1);
be_gas_emit_entity(entity);
if (get_entity_owner(entity) == get_tls_type()) {
{
mips_isa_t *isa = self;
- be_gas_emit_decls(isa->arch_env.main_env, 1);
+ be_gas_emit_decls(isa->arch_env.main_env);
be_emit_exit();
free(isa);
if (is_SymConst(node)) {
ir_entity *ent = get_SymConst_entity(node);
- set_entity_backend_marked(ent, 1);
pset_insert_ptr(symbol_set, ent);
}
}
static void ppc32_done(void *self) {
ppc32_isa_t *isa = self;
- be_gas_emit_decls(isa->arch_env.main_env, 1);
+ be_gas_emit_decls(isa->arch_env.main_env);
be_gas_emit_switch_section(GAS_SECTION_DATA);
ppc32_dump_indirect_symbols(isa);
ir_entity *call_ent = be_Call_get_entity(irn);
if (call_ent) {
- set_entity_backend_marked(call_ent, 1);
be_emit_irprintf("\tbl %s", get_entity_ld_name(call_ent));
} else {
be_emit_cstring("\tmtlr ");
sparc_isa_t *isa = self;
/* emit now all global declarations */
- be_gas_emit_decls(isa->arch_env.main_env, 0);
+ be_gas_emit_decls(isa->arch_env.main_env);
be_emit_exit();
free(self);
*/
static void sparc_emit_entity(ir_entity *entity)
{
- set_entity_backend_marked(entity, 1);
be_emit_ident(get_entity_ld_ident(entity));
}
res->aligned = align_is_aligned;
res->usage = ir_usage_unknown;
res->compiler_gen = 0;
- res->backend_marked = 0;
res->offset = -1;
res->offset_bit_remainder = 0;
res->alignment = 0;
_set_entity_compiler_generated(ent, flag);
} /* set_entity_compiler_generated */
-/* Checks if an entity is marked by the backend */
-int (is_entity_backend_marked)(const ir_entity *ent) {
- return _is_entity_backend_marked(ent);
-} /* is_entity_backend_marked */
-
-/* Sets/resets the compiler generated flag */
-void (set_entity_backend_marked)(ir_entity *ent, int flag) {
- _set_entity_backend_marked(ent, flag);
-} /* set_entity_backend_marked */
-
ir_entity_usage (get_entity_usage)(const ir_entity *ent) {
return _get_entity_usage(ent);
}
see ir_entity_usage. */
unsigned compiler_gen:1; /**< If set, this entity was compiler generated.
*/
- unsigned backend_marked:1; /**< If set, this entity was marked by the
- backend for emission. */
unsigned visibility:3; /**< @deprecated */
unsigned allocation:3; /**< @deprecated */
unsigned peculiarity:3; /**< @deprecated */
ent->compiler_gen = flag ? 1 : 0;
}
-static inline int
-_is_entity_backend_marked(const ir_entity *ent) {
- assert(ent && ent->kind == k_entity);
- return ent->backend_marked;
-}
-
-static inline void
-_set_entity_backend_marked(ir_entity *ent, int flag) {
- assert(ent && ent->kind == k_entity);
- ent->backend_marked = flag ? 1 : 0;
-}
-
static inline ir_entity_usage
_get_entity_usage(const ir_entity *ent) {
assert(ent && ent->kind == k_entity);
#define set_entity_align(ent, a) _set_entity_align(ent, a)
#define is_entity_compiler_generated(ent) _is_entity_compiler_generated(ent)
#define set_entity_compiler_generated(ent, flag) _set_entity_compiler_generated(ent, flag)
-#define is_entity_backend_marked(ent) _is_entity_backend_marked(ent)
-#define set_entity_backend_marked(ent, flag) _set_entity_backend_marked(ent, flag)
#define get_entity_usage(ent) _get_entity_usage(ent)
#define set_entity_usage(ent, flags) _set_entity_usage(ent, flags)
#define get_entity_offset(ent) _get_entity_offset(ent)