Hi, On Sat, 2009-10-24 at 10:12 +0100, Richard Sandiford wrote: > Thanks for the patch. [...] > > How about this patch, I think it does what you suggest. > > > > When we pass -pg -mmcount-raloc, the address of the return address > > relative to sp is passed in $12 to _mcount. If the return address is > > not saved, $12 will be zero. I think this will work as registers are > > never saved with an offset of zero. $12 is a temporary register that is > > not part of the ABI. > > Hmm, well, the suggestion was to pass a pointer rather than an offset, > but both you and Wu Zhangjin seem to prefer the offset. Is there a > reason for that? I suggested a pointer because > > (a) they're more C-like > (b) they're just as quick and easy to compute > (c) MIPS doesn't have indexed addresses (well, except for a few > special cases) so the callee is going to have to compute the > pointer at some stage anyway > Agree with you. if not with -fno-omit-frame-pointer, we also need to calculate the frame pointer, and then plus it with the offset. with pointer, we can get it directly, but it may need a more instruction(lui..., addiu...) for loading the pointer. of course, at last, the pointer will save more time for us :-) so, David, could you please use pointer instead? and then I will test it asap(cloning the latest gcc currently). thanks! > (It sounds from Wu Zhangjin's reply like he'd alread suggested the > offset thing before I sent my message. If so, sorry for not using > that earlier message as context.) > It doesn't matter, Seems at that time, you were not added in the CC list, but added by David Daney later. > > + if (TARGET_RALOC) > > + { > > + /* If TARGET_RALOC load $12 with the offset of the ra save > > + location. */ > > + if (mips_raloc_in_delay_slot_p()) > > + emit_small_ra_offset = 1; > > + else > > + { > > + if (Pmode == DImode) > > + fprintf (file, "\tdli\t%s,%d\t\t# offset of ra\n", reg_names[12], > > + cfun->machine->frame.ra_fp_offset); > > + else > > + fprintf (file, "\tli\t%s,%d\t\t# offset of ra\n", reg_names[12], > > + cfun->machine->frame.ra_fp_offset); > > + } > > + } > > We shouldn't need to do the delay slot dance. With either the pointer > ((D)LA) or offset ((D)LI) approach, the macro won't use $at, so we can > insert the new code immediately before the jump, leaving the assembler > to fill the delay slot. This is simpler and should mean that the delay > slot gets filled more often in the multi-insn-macro cases. > > Looks good otherwise, but I'd be interested in other suggestions for > the option name. I kept misreading "raloc" as a typo for "reloc". > The same misreading to me, what about -mmcount-ra-loc? add one "-", or -mcount-ra-location? BTW: Just made dynamic function tracer for MIPS support module tracing with the help of -mlong-calls. after some more tests, I will send it as -v5 revision later. hope the -v6 revision work with this new feature of gcc from David Daney. Regards, Wu Zhangjin