<div dir="ltr"><div>Hi Tim, </div><div>Thank you so much for your answer. </div>I like the approach in which a register can be reserved so the compiler don't use it. How can I do that easily at the backend ?<br>Besides, do you have any reference for instrumentation based on this or any other approach you mentioned. <br>Thank you very much for your help and time.<br>Best Regards,<br>MAW<br><br></div><br><div class="gmail_quote"><div dir="ltr">Le mar. 28 févr. 2017 à 15:57, Tim Northover <<a href="mailto:t.p.northover@gmail.com">t.p.northover@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Abdul,<br class="gmail_msg">
<br class="gmail_msg">
On 28 February 2017 at 03:22, Abdul Wahab via llvm-dev<br class="gmail_msg">
<<a href="mailto:llvm-dev@lists.llvm.org" class="gmail_msg" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br class="gmail_msg">
> However, I don't know how<br class="gmail_msg">
> to control the instrumentation address. Can anybody give me pointer on this?<br class="gmail_msg">
<br class="gmail_msg">
A couple of options spring to mind.<br class="gmail_msg">
<br class="gmail_msg">
You could allocate a buffer somewhere and store its address into a<br class="gmail_msg">
chosen variable. Then your instrumentation would consist of loading<br class="gmail_msg">
the buffer's address from this global into a vreg; storing your data<br class="gmail_msg">
there; incrementing the buffer's address; and finally storing the<br class="gmail_msg">
buffer back to the global.<br class="gmail_msg">
<br class="gmail_msg">
Converting that whole sequence to a call might be better for<br class="gmail_msg">
performance, and certainly more versatile. Then you'd put your data<br class="gmail_msg">
into argument registers, emit a "BL __handle_store" or whatever, and<br class="gmail_msg">
that function (which could be written in C++) would log the store.<br class="gmail_msg">
<br class="gmail_msg">
A completely different approach would be to reserve some non-essential<br class="gmail_msg">
register in LLVM (r9 is traditional) so the compiler doesn't use it.<br class="gmail_msg">
Then if you arrange for startup code to set it to a buffer's address<br class="gmail_msg">
you can simply store to r9 and increment it during your<br class="gmail_msg">
instrumentation.<br class="gmail_msg">
<br class="gmail_msg">
The tricky bit will be that this all has to be done after register<br class="gmail_msg">
allocation (otherwise you miss spills & fills). You might have to<br class="gmail_msg">
surround your entire instrumentation block with push/pop instructions<br class="gmail_msg">
to give you some free registers to use.<br class="gmail_msg">
<br class="gmail_msg">
Cheers.<br class="gmail_msg">
<br class="gmail_msg">
Tim.<br class="gmail_msg">
</blockquote></div>