return env;
}
-arch_env_t *arch_env_add_irn_handler(arch_env_t *env,
+arch_env_t *arch_env_push_irn_handler(arch_env_t *env,
const arch_irn_handler_t *handler)
{
assert(env->handlers_tos <= ARCH_MAX_HANDLERS);
return env;
}
+const arch_irn_handler_t *arch_env_pop_irn_handler(arch_env_t *env)
+{
+ assert(env->handlers_tos > 0 && env->handlers_tos <= ARCH_MAX_HANDLERS);
+ return env->handlers[--env->handlers_tos];
+}
+
static const arch_irn_ops_t *fallback_irn_ops = NULL;
int arch_register_class_put(const arch_register_class_t *cls, bitset_t *bs)
return ops->impl->get_irn_reg_req(ops, req, irn, pos);
}
-void arch_set_stack_bias(const arch_env_t *env, ir_node *irn, int bias)
+void arch_set_frame_offset(const arch_env_t *env, ir_node *irn, int offset)
{
const arch_irn_ops_t *ops = get_irn_ops(env, irn);
- ops->impl->set_stack_bias(ops, irn, bias);
+ ops->impl->set_frame_offset(ops, irn, offset);
}
entity *arch_get_frame_entity(const arch_env_t *env, ir_node *irn)
entity *(*get_frame_entity)(const void *self, const ir_node *irn);
/**
- * Set a bias for the stack pointer.
- * If the node in question uses the stack pointer for indexing, it must
- * consider the value of <code>bias</code> additionally.
+ * Set the offset of a node carrying an entity on the stack frame.
* @param self The this pointer.
- * @param irn The node in question.
- * @param bias The bias.
+ * @param irn The node.
+ * @param offset The offset of the node's stack frame entity.
*/
- void (*set_stack_bias)(const void *self, ir_node *irn, int bias);
+ void (*set_frame_offset)(const void *self, ir_node *irn, int offset);
};
/**
const arch_irn_ops_if_t *impl;
};
-extern void
-arch_set_stack_bias(const arch_env_t *env, ir_node *irn, int bias);
+extern void arch_set_frame_offset(const arch_env_t *env, ir_node *irn, int bias);
+
+extern entity *arch_get_frame_entity(const arch_env_t *env, ir_node *irn);
/**
* Get the register requirements for a node.
*/
void (*before_ra)(void *self);
- /**
- * Called after register allocation to lower Spills to Stores
- * @param self The code generator
- * @param spill The spill node to lower
- * @return The new backend node which substitutes the spill
- */
- ir_node *(*lower_spill)(void *self, ir_node *spill);
-
- /**
- * Called after register allocation to lower Reloads to Loads
- * @param self The code generator
- * @param reload The reload node to lower
- * @return The new backend node which substitutes the reload
- */
- ir_node *(*lower_reload)(void *self, ir_node *reload);
-
/**
* Called after everything happened.
* The code generator must also be de-allocated here.
*/
const list_sched_selector_t *(*get_list_sched_selector)(const void *self);
- /**
- * Take a proj from a call, set the correct register and projnum for this proj
- * @param self The isa object.
- * @param proj The proj
- * @param is_keep Non-zero if proj is a Keep argument
- * @return The backend proj number assigned to this proj
- */
- long (*handle_call_proj)(const void *self, ir_node *proj, int is_keep);
};
#define arch_isa_get_n_reg_class(isa) ((isa)->impl->get_n_reg_class(isa))
* @param handler A node handler.
* @return The environment itself.
*/
-extern arch_env_t *arch_env_add_irn_handler(arch_env_t *env, const arch_irn_handler_t *handler);
+extern arch_env_t *arch_env_push_irn_handler(arch_env_t *env, const arch_irn_handler_t *handler);
+
+/**
+ * Remove a node handler from the handler stack.
+ * @param env The architecture environment.
+ * @return The popped handler.
+ */
+extern const arch_irn_handler_t *arch_env_pop_irn_handler(arch_env_t *env);
#endif /* _FIRM_BEARCH_H */