Skip to content

Commit e265d7c

Browse files
committed
Merge pull request mruby#1082 from masuidrive/add_debug_info
Added debug infomation section into .mrb file
2 parents 8299104 + f3ebb89 commit e265d7c

4 files changed

Lines changed: 277 additions & 12 deletions

File tree

include/mruby/dump.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ extern "C" {
1414
#include "mruby.h"
1515

1616
#ifdef ENABLE_STDIO
17-
int mrb_dump_irep_binary(mrb_state*, size_t, FILE*);
18-
int mrb_dump_irep_cfunc(mrb_state *mrb, size_t n, FILE *f, const char *initname);
17+
int mrb_dump_irep_binary(mrb_state*, size_t, int, FILE*);
18+
int mrb_dump_irep_cfunc(mrb_state *mrb, size_t n, int, FILE *f, const char *initname);
1919
int32_t mrb_read_irep_file(mrb_state*, FILE*);
2020
#endif
2121
int mrb_read_irep(mrb_state*, const uint8_t*);
@@ -51,6 +51,7 @@ mrb_value mrb_load_irep_file(mrb_state*,FILE*);
5151

5252
#define RITE_BINARY_EOF "END\0"
5353
#define RITE_SECTION_IREP_IDENTIFIER "IREP"
54+
#define RITE_SECTION_LIENO_IDENTIFIER "LINE"
5455

5556
#define MRB_DUMP_DEFAULT_STR_LEN 128
5657

@@ -81,6 +82,13 @@ struct rite_section_irep_header {
8182
uint8_t sirep[2]; // Start index
8283
};
8384

85+
struct rite_section_lineno_header {
86+
RITE_SECTION_HEADER;
87+
88+
uint8_t nirep[2]; // Number of ireps
89+
uint8_t sirep[2]; // Start index
90+
};
91+
8492
struct rite_binary_footer {
8593
RITE_SECTION_HEADER;
8694
};

src/dump.c

Lines changed: 120 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,97 @@ mrb_write_section_irep(mrb_state *mrb, size_t start_index, uint8_t *bin)
333333
return MRB_DUMP_OK;
334334
}
335335

336+
static int
337+
mrb_write_section_lineno_header(mrb_state *mrb, uint32_t section_size, uint16_t nirep, uint16_t sirep, uint8_t *bin)
338+
{
339+
struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin;
340+
341+
// TODO
342+
memcpy(header->section_identify, RITE_SECTION_LIENO_IDENTIFIER, sizeof(header->section_identify));
343+
uint32_to_bin(section_size, header->section_size);
344+
uint16_to_bin(nirep, header->nirep);
345+
uint16_to_bin(sirep, header->sirep);
346+
347+
return MRB_DUMP_OK;
348+
}
349+
350+
static size_t
351+
get_debug_record_size(mrb_state *mrb, mrb_irep *irep)
352+
{
353+
size_t size = 0;
354+
355+
size += sizeof(uint32_t); // record size
356+
size += sizeof(uint16_t); // filename size
357+
if(irep->filename) {
358+
size += strlen(irep->filename); // filename
359+
}
360+
size += sizeof(uint32_t); // niseq
361+
if(irep->lines) {
362+
size += sizeof(uint16_t) * irep->ilen; // lineno
363+
}
364+
365+
return size;
366+
}
367+
368+
static int
369+
write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
370+
{
371+
uint8_t *cur = bin;
372+
size_t filename_len = 0;
373+
int iseq_no;
374+
375+
cur += sizeof(uint32_t); /* record size */
376+
377+
if(irep->filename) {
378+
filename_len = strlen(irep->filename);
379+
}
380+
cur += uint16_to_bin(filename_len, cur); /* filename size */
381+
382+
if(filename_len) {
383+
memcpy(cur, irep->filename, filename_len);
384+
cur += filename_len; /* filename */
385+
}
386+
387+
if(irep->lines) {
388+
cur += uint32_to_bin(irep->ilen, cur); /* niseq */
389+
for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
390+
cur += uint16_to_bin(irep->lines[iseq_no], cur); /* opcode */
391+
}
392+
}
393+
else {
394+
cur += uint32_to_bin(0, cur); /* niseq */
395+
}
396+
397+
uint32_to_bin(cur - bin, bin); /* record size */
398+
399+
return (cur - bin);
400+
}
401+
402+
static int
403+
mrb_write_section_lineno(mrb_state *mrb, int start_index, uint8_t *bin)
404+
{
405+
int irep_no;
406+
uint32_t section_size = 0, rlen = 0; /* size of irep record */
407+
uint8_t *cur = bin;
408+
409+
if (mrb == NULL || start_index < 0 || start_index >= mrb->irep_len || bin == NULL) {
410+
return MRB_DUMP_INVALID_ARGUMENT;
411+
}
412+
413+
cur += sizeof(struct rite_section_lineno_header);
414+
section_size += sizeof(struct rite_section_lineno_header);
415+
416+
for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) {
417+
rlen = write_lineno_record(mrb, mrb->irep[irep_no], cur);
418+
cur += rlen;
419+
section_size += rlen;
420+
}
421+
422+
mrb_write_section_lineno_header(mrb, section_size, mrb->irep_len - start_index, start_index, bin);
423+
424+
return MRB_DUMP_OK;
425+
}
426+
336427
static int
337428
write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t* bin)
338429
{
@@ -354,10 +445,12 @@ write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t* bin)
354445
}
355446

356447
static int
357-
mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_size)
448+
mrb_dump_irep(mrb_state *mrb, size_t start_index, int debug_info, uint8_t **bin, size_t *bin_size)
358449
{
359450
int result = MRB_DUMP_GENERAL_FAILURE;
451+
size_t section_size = 0;
360452
size_t section_irep_size;
453+
size_t section_lineno_size = 0;
361454
size_t irep_no;
362455
uint8_t *cur = NULL;
363456

@@ -370,8 +463,18 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
370463
for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) {
371464
section_irep_size += get_irep_record_size(mrb, mrb->irep[irep_no]);
372465
}
466+
section_size += section_irep_size;
467+
468+
/* DEBUG section size */
469+
if(debug_info) {
470+
section_lineno_size += sizeof(struct rite_section_lineno_header);
471+
for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) {
472+
section_lineno_size += get_debug_record_size(mrb, mrb->irep[irep_no]);
473+
}
474+
section_size += section_lineno_size;
475+
}
373476

374-
*bin_size += sizeof(struct rite_binary_header) + section_irep_size + sizeof(struct rite_binary_footer);
477+
*bin_size += sizeof(struct rite_binary_header) + section_size + sizeof(struct rite_binary_footer);
375478
cur = *bin = (uint8_t *)mrb_malloc(mrb, *bin_size);
376479
if(cur == NULL) {
377480
goto error_exit;
@@ -383,8 +486,18 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
383486
if (result != MRB_DUMP_OK) {
384487
goto error_exit;
385488
}
386-
489+
387490
cur += section_irep_size;
491+
492+
/* write DEBUG section */
493+
if(debug_info) {
494+
result = mrb_write_section_lineno(mrb, start_index, cur);
495+
if (result != MRB_DUMP_OK) {
496+
goto error_exit;
497+
}
498+
cur += section_lineno_size;
499+
}
500+
388501
mrb_write_eof(mrb, cur);
389502

390503
result = write_rite_binary_header(mrb, *bin_size, *bin);
@@ -401,7 +514,7 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
401514
#ifdef ENABLE_STDIO
402515

403516
int
404-
mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, FILE* fp)
517+
mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, int debug_info, FILE* fp)
405518
{
406519
uint8_t *bin = NULL;
407520
size_t bin_size = 0;
@@ -411,7 +524,7 @@ mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, FILE* fp)
411524
return MRB_DUMP_INVALID_ARGUMENT;
412525
}
413526

414-
result = mrb_dump_irep(mrb, start_index, &bin, &bin_size);
527+
result = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size);
415528
if (result == MRB_DUMP_OK) {
416529
fwrite(bin, bin_size, 1, fp);
417530
}
@@ -421,7 +534,7 @@ mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, FILE* fp)
421534
}
422535

423536
int
424-
mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, FILE *fp, const char *initname)
537+
mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, int debug_info, FILE *fp, const char *initname)
425538
{
426539
uint8_t *bin = NULL;
427540
size_t bin_size = 0, bin_idx = 0;
@@ -431,7 +544,7 @@ mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, FILE *fp, const char *in
431544
return MRB_DUMP_INVALID_ARGUMENT;
432545
}
433546

434-
result = mrb_dump_irep(mrb, start_index, &bin, &bin_size);
547+
result = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size);
435548
if (result == MRB_DUMP_OK) {
436549
fprintf(fp, "const uint8_t %s[] = {", initname);
437550
while (bin_idx < bin_size) {

0 commit comments

Comments
 (0)