[LLVMdev] Getting basic block address offset from its parent function

David Blaikie dblaikie at gmail.com
Sat Feb 28 18:29:48 PST 2015


On Sat, Feb 28, 2015 at 7:39 AM, Ziqiang Patrick Huang <
ziqiang.huang1001 at gmail.com> wrote:

> Hi John
>
> Thanks for your suggestions, they all sound reasonable to me. The way I'm
> thinking right now is to write a MachineFuncionPass that iterate through
> each MachinBasicBlock, for each MBB, adds up the instructions counts of
> previous MBBs, that number multiply by 4 should be the offset of that MBB
> from its MachineFunction. In order to correctly count the instructions,
> this pass should be inserted after the last transform pass ..
>
> Does this sound reasonable ?
>

I could be wrong, but I'm not sure that's possible - my understanding was
that the particular length of a sequence could depend on assembler-level
choices of instruction encoding & the like. I believe the right/only way to
do this is with label differences that the assembler will resolve/compute
for you. But I could quite well be wrong - it's certainly not my area of
expertise.

- David


>
> Thanks,
> Patrick
>
> 2015-02-28 9:07 GMT-05:00 John Criswell <jtcriswel at gmail.com>:
>
>  On 2/27/15 6:30 PM, Ziqiang Patrick Huang wrote:
>>
>> Hi, all
>>
>>  Is there a way of getting the basic block offset from its parent
>> function ?
>>
>>
>> At the LLVM IR level, no.  At the code generator layer
>> (MachineFunctionPass layer or the MC layer), probably yes.
>>
>>
>>  What I'm trying to do is to get an execution count of each basic
>> blocks, so I need to know the starting address of each basic blocks.
>> Obviously we can't get the absolute address before linking the program, but
>> the offset relative to parent function should be available so I can take it
>> and get the function start address from objdump then figure out each basic
>> block's absolute address.
>>
>>  Or is there another way of doing this ...
>>
>>
>> On way to do it would be to instrument the program so that each basic
>> block increments a counter every time it is executed.  This would be
>> trivial to do.  To optimize it, you could analyze the CFG so that control
>> equivalent basic blocks use a single counter (e.g., the single-entry block
>> and the single-exit block are executed the same number of times, so they
>> only need 1 counter).
>>
>> Another option might be to use the pcmarker intrinsic.  Apparently it's
>> used for matching up LLVM IR to machine instructions for use in processor
>> simulators, though I have never used it myself.
>>
>> The Giri project has support for recording the execution of every basic
>> block, but it might be more heavy-weight than you need.  I also don't
>> recall off-hand from where to download it; search the llvmdev archives for
>> emails from Swarup Sahoo to get that information.
>>
>> Hope this helps,
>>
>> John Criswell
>>
>> --
>> John Criswell
>> Assistant Professor
>> Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell
>>
>>
>
>
> --
> *Ziqiang Huang*
> *Electrical and Computer Engineering*
> *Hudson 213c, Duke University*
> *Tel: 919-491-3677 <919-491-3677>*
> *Email: ziqiang.huang at duke.edu <ziqiang.huang at duke.edu>*
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150228/6d36db3e/attachment.html>


More information about the llvm-dev mailing list