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); } }
/** * Dumper interface for dumping sparc nodes in vcg. * @param F the output file * @param n the node to dump * @param reason indicates which kind of information should be dumped */ static void sparc_dump_node(FILE *F, const ir_node *n, dump_reason_t reason) { switch (reason) { case dump_node_opcode_txt: fprintf(F, "%s", get_irn_opname(n)); break; case dump_node_mode_txt: break; case dump_node_info_txt: arch_dump_reqs_and_registers(F, n); const sparc_attr_t *sparc_attr = get_sparc_attr_const(n); if (sparc_attr->immediate_value_entity) { ir_fprintf(F, "entity: %+F (offset %d)\n", sparc_attr->immediate_value_entity, sparc_attr->immediate_value); } else { ir_fprintf(F, "immediate value: %d\n", sparc_attr->immediate_value); } if (sparc_has_load_store_attr(n)) { const sparc_load_store_attr_t *attr = get_sparc_load_store_attr_const(n); ir_fprintf(F, "load store mode: %+F\n", attr->load_store_mode); fprintf(F, "is frame entity: %s\n", attr->is_frame_entity ? "true" : "false"); } if (has_jmp_cond_attr(n)) { const sparc_jmp_cond_attr_t *attr = get_sparc_jmp_cond_attr_const(n); fprintf(F, "relation: %d (%s)\n", (int)attr->relation, get_relation_string(attr->relation)); fprintf(F, "unsigned: %s\n", attr->is_unsigned ? "true" : "false"); } if (has_fp_attr(n)) { const sparc_fp_attr_t *attr = get_sparc_fp_attr_const(n); ir_fprintf(F, "fp_mode: %+F\n", attr->fp_mode); } if (has_fp_conv_attr(n)) { const sparc_fp_conv_attr_t *attr = get_sparc_fp_conv_attr_const(n); ir_fprintf(F, "conv from: %+F\n", attr->src_mode); ir_fprintf(F, "conv to: %+F\n", attr->dest_mode); } break; case dump_node_nodeattr_txt: break; } }
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; }
const sparc_load_store_attr_t *get_sparc_load_store_attr_const(const ir_node *node) { assert(sparc_has_load_store_attr(node)); return (const sparc_load_store_attr_t*) get_irn_generic_attr_const(node); }