From: Maynard J. <may...@us...> - 2008-01-18 17:04:26
|
Daniel Hansel wrote: > Hi! > > As the subject says the alignment amount is not stored in the record > header anymore. The variable is only used to align the records header. > The code that is written for jr_code_load records is 8-byte-aligned > normally. > > Please review and give comments on that. Daniel, Sorry I was too busy to try this patch out before you committed it. It fails in my testing: POWER5, SLES 10 SP1, IBM 1.50, both JVMPI and JVMTI. The opjitconv program fails with: "length mismatchJIT convert error -1" I reversed the patch and then things worked OK again. Can you take a look at your changes to see why opjitconv might break in some situations. Thanks. -Maynard > > Kind regards, > Daniel Hansel > > > ------------------------------------------------------------------------ > > diff -prauN -X excludelist.txt oprofile/ChangeLog oprofile_work/ChangeLog > --- oprofile/ChangeLog 2008-01-15 11:39:19.000000000 +0100 > +++ oprofile_work/ChangeLog 2008-01-15 12:40:58.000000000 +0100 > @@ -1,5 +1,13 @@ > 2008-01-15 Daniel Hansel <dan...@li...> > > + * libopagent/jitdump.h: > + * libopagent/opagent.c: > + * opjitconv/parse_dump.c: Changed padding counter of jr_code_load structure > + to an alignment member. It is not used to store the amount of padding bytes > + anymore. The padding of the code block is done normally. > + > +2008-01-15 Daniel Hansel <dan...@li...> > + > * libopagent/opagent.c: Fixed locked file bug for nr_entry == 0 early exit > * opjitconv/parse_dump.c: Updated comment according to the current > implementation > diff -prauN -X excludelist.txt oprofile/libopagent/jitdump.h oprofile_work/libopagent/jitdump.h > --- oprofile/libopagent/jitdump.h 2008-01-09 10:54:42.000000000 +0100 > +++ oprofile_work/libopagent/jitdump.h 2008-01-15 12:20:14.000000000 +0100 > @@ -61,7 +61,7 @@ struct jr_code_load { > u64 vma; > u64 code_addr; > u32 code_size; > - u32 pad_cnt; > + u32 align; > }; > > /* record1 (id=1) logs a code unload */ > diff -prauN -X excludelist.txt oprofile/libopagent/opagent.c oprofile_work/libopagent/opagent.c > --- oprofile/libopagent/opagent.c 2008-01-15 11:38:43.000000000 +0100 > +++ oprofile_work/libopagent/opagent.c 2008-01-15 12:20:27.000000000 +0100 > @@ -172,6 +172,7 @@ int op_write_native_code(op_agent_t hdl, > struct timeval tv; > size_t sz_symb_name; > char pad_bytes[7] = { 0, 0, 0, 0, 0, 0, 0 }; > + size_t padding_count; > FILE * dumpfile = (FILE *) hdl; > > if (!dumpfile) { > @@ -188,8 +189,8 @@ int op_write_native_code(op_agent_t hdl, > rec.total_size = code ? sizeof(rec) + sz_symb_name + size : > sizeof(rec) + sz_symb_name; > /* calculate amount of padding '\0' */ > - rec.pad_cnt = (((rec.total_size + 7) & 7) ^ 7); > - rec.total_size += rec.pad_cnt; > + padding_count = (((rec.total_size + 7) & 7) ^ 7); > + rec.total_size += padding_count; > if (gettimeofday(&tv, NULL)) { > fprintf(stderr, "gettimeofday failed\n"); > return -1; > @@ -207,8 +208,8 @@ int op_write_native_code(op_agent_t hdl, > fwrite_unlocked(symbol_name, sz_symb_name, 1, dumpfile)) { > if (code) > fwrite_unlocked(code, size, 1, dumpfile); > - if (rec.pad_cnt) > - fwrite_unlocked(pad_bytes, rec.pad_cnt, 1, dumpfile); > + if (padding_count) > + fwrite_unlocked(pad_bytes, padding_count, 1, dumpfile); > /* Always flush to ensure conversion code to elf will see > * data as soon as possible */ > fflush_unlocked(dumpfile); > diff -prauN -X excludelist.txt oprofile/opjitconv/parse_dump.c oprofile_work/opjitconv/parse_dump.c > --- oprofile/opjitconv/parse_dump.c 2008-01-15 11:39:06.000000000 +0100 > +++ oprofile_work/opjitconv/parse_dump.c 2008-01-15 12:26:24.000000000 +0100 > @@ -30,6 +30,7 @@ static int parse_code_load(void const * > char const * ptr = ptr_arg; > struct jr_code_load const * rec = ptr_arg; > char const * end; > + size_t padding_count; > end = rec->code_addr ? ptr + size : NULL; > > entry = xcalloc(1, sizeof(struct jitentry)); > @@ -55,14 +56,16 @@ static int parse_code_load(void const * > entry->next = jitentry_list; > jitentry_list = entry; > > + padding_count = (((rec->total_size + 7) & 7) ^ 7); > + > verbprintf(debug, "record0: name=%s, vma=%llx, code_size=%i, " > - "life_start=%lli, life_end=%lli\n", entry->symbol_name, > - entry->vma, entry->code_size, entry->life_start, > + "padding_count=%i, life_start=%lli, life_end=%lli\n", entry->symbol_name, > + entry->vma, entry->code_size, padding_count, entry->life_start, > entry->life_end); > /* If end == NULL, the dump does not include code, and this sanity > * check is skipped. > */ > - if (end && (ptr + entry->code_size + rec->pad_cnt != end)) { > + if (end && (ptr + entry->code_size + padding_count != end)) { > verbprintf(debug, "length mismatch"); > rc = OP_JIT_CONV_FAIL; > } > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > > > ------------------------------------------------------------------------ > > _______________________________________________ > oprofile-list mailing list > opr...@li... > https://lists.sourceforge.net/lists/listinfo/oprofile-list |