static const char *parse_def(RReg *reg, char **tok, const int n) { RRegItem *item; char *end; int type; if (n != 5 && n != 6) return "Invalid syntax"; type = r_reg_type_by_name (tok[0]); if (type < 0) { return "Invalid register type"; } item = R_NEW0 (RRegItem); if (!item) return "Unable to allocate memory"; item->type = type; item->name = strdup (tok[1]); // All the numeric arguments are strictly checked item->size = parse_size (tok[2], &end); if (*end != '\0' || !item->size) { r_reg_item_free (item); return "Invalid size"; } item->offset = parse_size (tok[3], &end); if (*end != '\0') { r_reg_item_free (item); return "Invalid offset"; } item->packed_size = parse_size (tok[4], &end); if (*end != '\0') { r_reg_item_free (item); return "Invalid packed size"; } // Dynamically update the list of supported bit sizes reg->bits |= item->size; // This is optional if (n == 6) item->flags = strdup (tok[5]); // Don't allow duplicate registers if (r_reg_get (reg, item->name, R_REG_TYPE_ALL)) { r_reg_item_free (item); return "Duplicate register definition"; } /* Hack to put flags in the same arena as gpr */ if (type == R_REG_TYPE_FLG) { type = R_REG_TYPE_GPR; } r_list_append (reg->regset[item->type].regs, item); // Update the overall profile size if (item->offset + item->size > reg->size) { reg->size = item->offset + item->size; } return NULL; }
static const char *parse_def(RReg *reg, char **tok, const int n) { RRegItem *item; char *end, *p; int type, type2; if (n != 5 && n != 6) { return "Invalid syntax: Wrong number of columns"; } p = strchr (tok[0], '@'); if (p) { char *tok0 = strdup (tok[0]); char *at = tok0 + (p - tok[0]); *at++ = 0; type = r_reg_type_by_name (tok0); type2 = r_reg_type_by_name (at); free (tok0); } else { type2 = type = r_reg_type_by_name (tok[0]); if (type == R_REG_TYPE_FLG) { type2 = R_REG_TYPE_GPR; } } if (type < 0 || type2 < 0) { return "Invalid register type"; } item = R_NEW0 (RRegItem); if (!item) { return "Unable to allocate memory"; } item->type = type; item->arena = type2; item->name = strdup (tok[1]); // All the numeric arguments are strictly checked item->size = parse_size (tok[2], &end); if (*end != '\0' || !item->size) { r_reg_item_free (item); return "Invalid size"; } item->offset = parse_size (tok[3], &end); if (*end != '\0') { r_reg_item_free (item); return "Invalid offset"; } item->packed_size = parse_size (tok[4], &end); if (*end != '\0') { r_reg_item_free (item); return "Invalid packed size"; } // Dynamically update the list of supported bit sizes reg->bits |= item->size; // This is optional if (n == 6) { item->flags = strdup (tok[5]); } // Don't allow duplicate registers if (r_reg_get (reg, item->name, R_REG_TYPE_ALL)) { r_reg_item_free (item); return "Duplicate register definition"; } /* Hack to put flags in the same arena as gpr */ if (type == R_REG_TYPE_FLG) { type2 = R_REG_TYPE_GPR; } r_list_append (reg->regset[type2].regs, item); // Update the overall profile size if (item->offset + item->size > reg->size) { reg->size = item->offset + item->size; } // Update the overall type of registers into a regset reg->regset[type2].maskregstype |= ((int)1 << type); return NULL; }