On 01/07/2016 05:11 AM, Jonas Wagner wrote:
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.
Yeah, splitting blocks introduces function-level relocation, and
probably bumps your overhead back up by ~0.5%. A few of us were kicking
ideas around off-list, and I think the approach of generalizing
ProcControl breakpoints to other byte-for-byte substitutions is likely
to work better for your particular application.
Best,
Jonas
On Wed, Jan 6, 2016 at 9:39 PM Mike Lam <lam...@jmu.edu
<mailto: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
<mailto: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 <mailto: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