On 9/5/22 10:55, Milica Lazarevic wrote: > -static std::string save_restore_list(uint64 rt, uint64 count, uint64 gp) > +static char *save_restore_list(uint64 rt, uint64 count, uint64 gp) > { > - std::string str; > + /* > + * Currently, this file compiles as a cpp file, so the explicit cast here > + * is necessary. Later, the cast will be removed. > + */ > + char *str = (char *)g_malloc(200); > + str[0] = '\0'; > > for (uint64 counter = 0; counter != count; counter++) { > bool use_gp = gp && (counter == count - 1); > uint64 this_rt = use_gp ? 28 : ((rt & 0x10) | (rt + counter)) & > 0x1f; > - str += img_format(",%s", GPR(this_rt)); > + strcat(str, img_format(",%s", GPR(this_rt))); > } > > return str; > }
This would be better written as char *reg_list[33]; assert(count <= 32); for (c = 0; c < count; c++) { bool use_gp = ... uint64 this_rt = ... /* glib usage below requires casting away const */ reg_list[c] = (char *)GPR(this_rt); } reg_list[count] = NULL; return g_strjoinv(",", reg_list); In the implementation you suggested, there's one comma missing in the output. For example, instead of having: > 0x802021ce: 1e12 SAVE 0x10,ra,s0 We're having this: < 0x802021ce: 1e12 SAVE 0x10ra,s0 So, I'm assuming that there needs to exist one more concatenation between the comma and the result of the g_strjoinv function? Maybe something like return g_strconcat((char *)",", (char *)g_strjoinv(",", reg_list), NULL); this? Would it be acceptable to go with a similar implementation as in the patch, but without a call to img_format and with the g_strconcat instead of the strcat function? > @@ -716,7 +617,7 @@ static uint64 extract_op_code_value(const uint16 *data, > int size) > * instruction size - negative is error > * disassembly string - on error will constain error string > */ > -static int Disassemble(const uint16 *data, std::string & dis, > +static int Disassemble(const uint16 *data, char *dis, I think this interface should be char **dis, so that... > @@ -746,25 +647,26 @@ static int Disassemble(const uint16 *data, std::string > & dis, > * an ASE attribute and the requested > version > * not having that attribute > */ > - dis = "ASE attribute mismatch"; > + strcpy(dis, "ASE attribute mismatch"); these become *dis = g_strdup("string"); and the usage in nanomips_dis does not assume a fixed sized buffer. r~ I'm not sure why the fixed size buffer would be a problem here since the buffer size has already been limited by the caller. I.e. in the print_insn_nanomips function, the buf variable is defined as: char buf[200];