Hi Bill and Mike,

thanks a lot for these pointers! This is great example code.

I'll give it a try today. I'm not sure if I can use the method of splitting
blocks. I presume this introduces additional branches. Their overhead would
probably be as large as the overhead from the instructions that I try to
eliminate. I will look at your code, experiment a bit, and see what happens.

Best,
Jonas


On Wed, Jan 6, 2016 at 9:39 PM Mike Lam <lam...@jmu.edu> wrote:

> Jonas,
>
> I'm Mike Lam, the original author of CRAFT. If you're interested in
> using Dyninst to replace certain instructions, I'd encourage you to
> look over the buildReplacement function in fpinst.cpp:
>
> http://sourceforge.net/p/crafthpc/code/ci/master/tree/src/fpinst.cpp
>
> That function calls buildDefaultReplacementCode (which is different
> depending on what kind of FPAnalysis gets passed in), to get a Dyninst
> snippet object. However, you shouldn't need to worry about that if
> you're replacing with a nop because I think you can just use a
> BPatch_nullExpr.
>
> The rest of the code splits the original basic block twice to remove
> the given instruction, creates a new block for the snippet, and then
> rearranges all necessary edges to insert the new block in the place of
> the old instruction.
>
> If you have questions I can attempt to answer them although I haven't
> touched this code in a while. Also, the code hasn't been updated from
> 8.1.2 yet so there may be a couple of minor API changes that you'll
> need to work around.
>
> -- mike
>
>
> On Wed, Jan 6, 2016 at 11:57 AM, Bill Williams <b...@cs.wisc.edu> wrote:
> > On 01/06/2016 07:38 AM, Jonas Wagner wrote:
> >
> > Hello,
> >
> > I’d like to dynamically modify a binary and change branches to NOPs and
> > back. I wondered whether DynInst (in particular PatchAPI) would be a
> > suitable tool for this. What do you think?
> >
> > Here’s what I’d like to do in more detail: I have a program that contains
> > branches like the one below.
> >
> > ... some code ...
> > 21d0:   cmpb   $0x0, branch_flag
> >       ↓ jne    2221
> > ... some more code ...
> >
> > These branches are usually not taken because the branch_flag is set to
> zero.
> > Nevertheless, there is some cost for loading the flag and the non-taken
> > branch. I would like to get rid of this cost as much as possible, by
> > replacing that sequence of instructions with NOPs.
> >
> > In a later stage, I’d also like to undo some of these replacements, or
> even
> > change the conditional branch into an unconditional branch.
> >
> > PatchAPI is indeed a right tool for the job here out of the Dyninst
> toolkit,
> > and the CRAFT tool is our best example of how to perform this type of
> > instruction replacement (http://sourceforge.net/projects/crafthpc/)
> >
> > The general idea is that you split the block containing the instructions
> you
> > want to replace into those instructions and the remainder, replace the
> block
> > with just the undesirable instructions with your desired code, and stitch
> > things back together.
> >
> > There are probably better ways to do this specific sort of manipulation,
> > given that you can guarantee that you're either modifying whole
> instructions
> > or opcode bytes one-for-one. It might be more efficient and natural to
> look
> > at the ProcControl breakpoint mechanism and look at building something
> based
> > on that infrastructure combined with ParseAPI's knowledge of instruction
> > locations.
> >
> > Hope this is helpful, and let us know how it works out.
> >
> > --bw
> >
> > Would PatchAPI be suitable for these kind of tasks? Do you have any hints
> > for how I could use it, or what would be a better alternative?
> >
> > Thanks a lot!
> > Jonas
> >
> >
> >
> > _______________________________________________
> > Dyninst-api mailing list
> > Dyninst-api@cs.wisc.edu
> > https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api
> >
> >
>
_______________________________________________
Dyninst-api mailing list
Dyninst-api@cs.wisc.edu
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api

Reply via email to