[LLVMdev] Problems in instrumentation

Qiuping Yi yiqiuping at gmail.com
Wed May 14 07:47:43 PDT 2014


Hi, John Criswell

Thank you for your detail notes, which give me much invaluable information.


--------------------------------------------
Qiuping Yi
Institute Of Software
Chinese Academy of Sciences


On Tue, May 13, 2014 at 9:40 PM, John Criswell <criswell at illinois.edu>wrote:

>  On 5/13/14, 3:56 AM, Qiuping Yi wrote:
>
>  Hi everyone,
>
>  I have some trouble in instrumenting load instructions. I want to
> instrument load instructions as follow: Firstly, I judge whether the loaded
> pointer(*any type is possible*) is NULL. If so, I want to explicitly
> allocate the corresponding address space of its type to the pointer.
>
>  For example, in source code level I want to translate the next statement
>
>
>  *p = 1;
>
>  into the next statements
>
>  if (p == NULL)
>     *p = malloc(sizeof(*p));
> *p = 1;
>
>  For simplicity, I want to wrapper the first two statements into function
> init. And then I can implement as follow:
>
>  init((void*)p, sizeof(*p));
> *p = 1;
>
>  where
>
>  void init(void *p, int size) {
>      if (p == NULL)
>          p = malloc(size);
> }
>
> I am trying to use the next pass for instrumentation:
>
>
> Just three notes:
>
> 1) You may want to ensure that you're not invalidating the
> BasicBlock::iterator variable i by inserting the Call instruction.  If you
> are invalidating the iterator, then your code may skip over load
> instructions or instrument a single load twice.
>
> 2) It may be better make your class derive from the InstVisitor class.
>
> 3) You may want to instrument atomic operations as well as the Load
> Instruction.  This is because the atomic operations also perform a load (as
> well as a store).  The same applies to some of the intrinsics (e.g., the
> memcpy/memcmp intrinsics).
>
>
>
>  for (Module::iterator f=M.begin(), fe=M.end(); f!=fe; ++f) {
>    for (Function::iterator b=f->begin(), be=f->end(); b!=be; ++b) {
>       for (BasicBlock::iterator i=b->begin(), ie=b->end()l i!=ie; ++i)  {
>           if (i->getOpcode() == Instruction::Load) {
>
> *             CallInst::create(....); // add a call inst before inst i to
> invoke function init*
>
>
>            }
>       }
>    }
> }
>
>  So my question is How should I create the previous call inst to execute
> invocation: init((void*)p, sizeof(p)). Because any pointer type is
> possible, so I let the first parameter of function init as 'void*'.
>
>
> A "void *" in the LLVM IR is a pointer to an integer of size 1 (i.e., a
> char *).
>
>
>  Furthermore, how should I get the size of *p? I check Type.h, and found
> class Type only provide function getPrimitiveSizeInBits() to return the
> size of the primitive types. How can I know the size of other types, eg.
> the size of a structure type.
>
>
> You can use the DataLayout analysis pass to find the size of various
> types.  You can read the doxygen documentation on it at
> http://llvm.org/doxygen/classllvm_1_1DataLayout.html.
>
> Regards,
>
> John Criswell
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140514/29386b17/attachment.html>


More information about the llvm-dev mailing list