static void sparc_determine_frameoffset(ir_node *const node, int const sp_offset) { if (is_sparc_FrameAddr(node)) { sparc_attr_t *const attr = get_sparc_attr(node); ir_entity const *const entity = attr->immediate_value_entity; if (entity != NULL) { attr->immediate_value += get_entity_offset(entity); if (node_has_sp_base(node)) attr->immediate_value += sp_offset + SPARC_MIN_STACKSIZE; } } else if (sparc_has_load_store_attr(node)) { sparc_load_store_attr_t *const attr = get_sparc_load_store_attr(node); if (!attr->is_frame_entity) return; ir_entity const *const entity = attr->base.immediate_value_entity; if (entity != NULL) { attr->base.immediate_value += get_entity_offset(entity); if (node_has_sp_base(node)) attr->base.immediate_value += sp_offset + SPARC_MIN_STACKSIZE; } } else if (be_is_MemPerm(node)) { ir_graph *irg = get_irn_irg(node); if (sparc_get_irg_data(irg)->omit_fp) be_set_MemPerm_offset(node, sp_offset + SPARC_MIN_STACKSIZE); } }
int be_get_MemPerm_offset(const ir_node *irn) { assert(be_is_MemPerm(irn)); const be_memperm_attr_t *attr = (const be_memperm_attr_t*)get_irn_generic_attr_const(irn); return attr->offset; }
static void sparc_set_frame_offset(ir_node *node, int offset) { if (be_is_MemPerm(node)) { be_set_MemPerm_offset(node, offset); } else { sparc_attr_t *attr = get_sparc_attr(node); attr->immediate_value += offset; /* must be a FrameAddr or a load/store node with frame_entity */ assert(is_sparc_FrameAddr(node) || get_sparc_load_store_attr_const(node)->is_frame_entity); } }
ir_entity *sparc_get_frame_entity(const ir_node *node) { if (be_is_MemPerm(node)) return be_get_MemPerm_in_entity(node, 0); if (is_sparc_FrameAddr(node)) { const sparc_attr_t *attr = get_sparc_attr_const(node); return attr->immediate_value_entity; } if (sparc_has_load_store_attr(node)) { const sparc_load_store_attr_t *load_store_attr = get_sparc_load_store_attr_const(node); if (load_store_attr->is_frame_entity) { return load_store_attr->base.immediate_value_entity; } } return NULL; }
unsigned be_get_MemPerm_entity_arity(const ir_node *irn) { assert(be_is_MemPerm(irn)); return get_irn_arity(irn); }
void be_set_MemPerm_offset(ir_node *irn, int offset) { assert(be_is_MemPerm(irn)); be_memperm_attr_t *attr = (be_memperm_attr_t*)get_irn_generic_attr(irn); attr->offset = offset; }