[LLVMdev] Instrumenting C/C++ programs

Himanshu Shekhar imhimanshu91 at gmail.com
Wed Sep 28 03:05:24 PDT 2011


Hey Xiaoming, Thanks for those source codes. Can you please explain what
this llvm-memory-profiling.patch does ?

Thanks,
Himanshu

On Wed, Sep 28, 2011 at 6:49 AM, xiaoming gu <xiaoming.gu at gmail.com> wrote:

> Hi, Himanshu. I once wrote an LLVM IR-based memory profiling
> pass. Basically, I followed the code for EdgeProfiling. The source code is
> enclosed here, which worked with LLVM 2.8. Hope it is helpful.
>
>     MemoryProfiling.cpp---the instrumentation pass, which inserts profiling
> function calls into the original program
>     MemoryProfiling.c---the profiling library containing the profiling
> calls
>     llvm-memory-profiling.patch---the other modifications
>     notes.txt---some information collected when I was working on this
> profiling pass
>
> Xiaoming
>
> On Tue, Sep 27, 2011 at 7:13 PM, Himanshu Shekhar <imhimanshu91 at gmail.com>wrote:
>
>> Hey John,
>> Thank you for the detailed reply.
>> I tried to figure out myself which IR should I use for my purpose (
>> Clang's Abstract Syntax Tree (AST) or LLVM's SSA Intermediate Representation
>> (IR). ), but couldn't really figure out which one to use.
>> Here is what I m trying to do.
>> Given any C/C++ program (like the one given below), I am trying to insert
>> calls to some function, before and after *every instruction that
>> reads/writes to/from memory*. For example consider the below C++  program
>> ( Account.cpp)
>> /***********************************************************/
>>
>> #include <stdio.h>
>>
>> class Account {
>>   int balance;
>>
>> public:
>>   Account(int b)
>>  {
>>     balance = b;
>>   }
>>   ~Account(){ }
>>
>>   int read() {
>>     int r;
>>     r = balance;
>>     return r;
>>   }
>>
>>   void deposit(int n) {
>>       balance = balance + n;
>>   }
>>
>>   void withdraw(int n) {
>>       int r = read();
>>       balance = r - n;
>>   }
>> };
>>
>> int main (){
>>   Account* a = new Account(10);
>>   a->deposit(1);
>>   a->withdraw(2);
>>   delete a;
>> }
>>
>> /***********************************************************/
>> So after the instrumentation my program should look like :
>>
>> /***********************************************************/
>>
>> #include <stdio.h>
>>
>> class Account {
>>   int balance;
>>
>> public:
>>   Account(int b)
>>  {
>>     balance = b;
>>   }
>>   ~Account(){ }
>>
>>   int read() {
>>     int r;
>>     foo();
>>     r = balance;
>>     foo();
>>     return r;
>>   }
>>
>>   void deposit(int n) {
>>       foo();
>>       balance = balance + n;
>>       foo();
>>   }
>>
>>   void withdraw(int n) {
>>       foo();
>>       int r = read();
>>       foo();
>>       foo();
>>       balance = r - n;
>>       foo();
>>   }
>> };
>>
>> int main (){
>>   Account* a = new Account(10);
>>   a->deposit(1);
>>   a->withdraw(2);
>>   delete a;
>> }
>>
>> /***********************************************************/
>> where *foo() *may be any function like get the current system time or
>> increment a counter .. so on. I understand that to insert function like
>> above I will have to first get the IR and then run an instrumentation pass
>> on the IR which will insert such calls into the IR, but I don't really know
>> how to achieve it. Please suggest me with examples how to go about it.
>> Also I understand that once I compile the program into the IR, it would be
>> really difficult to get 1:1 mapping between my original program and the
>> instrumented IR. So, is it possible to reflect the changes made in the IR (
>> because of instrumentation ) into the original program.
>>
>> In order to get started with LLVM pass and how to make one on my own, I
>> looked at an example of a pass that adds run-time checks to LLVM IR loads
>> and stores, the SAFECode's load/store instrumentation pass (
>> http://llvm.org/viewvc/llvm-project/safecode/trunk/include/safecode/LoadStoreChecks.h?view=markupand
>> http://llvm.org/viewvc/llvm-project/safecode/trunk/lib/InsertPoolChecks/LoadStoreChecks.cpp?view=markup).
>> But I couldn't figure out how to run this pass. Please give me steps how to
>> run this pass on some program say the above Account.cpp.
>>
>> Thanks,
>> Himanshu
>>
>>
>>
>>
>> On Fri, Sep 23, 2011 at 11:13 PM, John Criswell <criswell at illinois.edu>wrote:
>>
>>>  On 9/23/11 12:24 PM, Himanshu Shekhar wrote:
>>>
>>> I just  read that LLVM project could be used to do static analysis on
>>> C/C++ codes using the analyzer Clang which the front end of LLVM. I wanted
>>> to know if it is possible to extract all the accesses to memory(variables,
>>> local as well as global) in the source code using LLVM.
>>>
>>>
>>> When doing analysis with Clang and LLVM, you first must make a choice
>>> about which IR to use: Clang's Abstract Syntax Tree (AST) or LLVM's SSA
>>> Intermediate Representation (IR).  Clang takes source code and converts it
>>> into an AST; it later takes the AST and converts it to LLVM IR.  LLVM then
>>> performs mid-level compiler analysis and optimization on code in LLVM IR
>>> form and then translates from LLVM IR to native code.
>>>
>>> Clang ASTs will give you much higher level information than LLVM IR.  On
>>> the other hand, LLVM IR is probably easier to work with and is programming
>>> language agnostic.
>>>
>>> You might want to read about the LLVM Language Reference Manual (
>>> http://llvm.org/docs/LangRef.html) to get a feel of whether it is
>>> suitable for your analysis.  There may be a similar document for Clang, but
>>> I'm not familiar with it since I haven't worked with Clang ASTs myself.
>>>
>>>
>>> Is there any inbuilt library present in LLVM which I could use to extract
>>> this information. If not please suggest me how to write functions to do the
>>> same.(existing source code, reference, tutorial, example...)
>>>
>>>
>>> It is easy to write an LLVM pass that plugs into the opt tool that
>>> searches for explicit accesses to memory.  The LLVM load and store
>>> instructions access memory (similar to how loads and stores are used to
>>> access memory in a RISC instruction set).  That said, it is not clear
>>> whether this is what you want to do.  Some source-level variables are
>>> translated into one or more SSA virtual registers, so you'll never see a
>>> load or store to them (as they may never exist in memory but only in
>>> registers).  Additionally, some loads and stores to memory are not visible
>>> at the LLVM IR level.  For example, loads and stores to stack spill slots
>>> are not visible at the LLVM IR level because they're only created during
>>> code generation (and technically, they're generated in a third IR called
>>> Machine Instructions that is used specifically for code generation).
>>>
>>>
>>>
>>> Of what i studied is, I need to first convert the source code into LLVM
>>> IR and then make an instrumenting pass which would go over this bitcode file
>>> and insert calls to do the analysis, but don't know exactly how to do it.
>>>
>>>
>>> The first thing you need to do is figure out which representation of the
>>> program (Clang ASTs, LLVM IR, LLVM's code generation IR) is the best for
>>> solving your particular problem.  If you want, you can provide more details
>>> on what you're trying to do; people on the list can then provide feedback on
>>> which representation is most suitable for what you want to do.
>>>
>>> If you decide to work with LLVM IR, I then recommend reading the "How to
>>> Write an LLVM Pass" document (
>>> http://llvm.org/docs/WritingAnLLVMPass.html) as well as the Programmer's
>>> Guide (http://llvm.org/docs/ProgrammersManual.html).  Doxygen is also
>>> valuable (http://llvm.org/doxygen/).
>>>
>>> For an example of a pass that adds run-time checks to LLVM IR loads and
>>> stores, look at SAFECode's load/store instrumentation pass (
>>> http://llvm.org/viewvc/llvm-project/safecode/trunk/include/safecode/LoadStoreChecks.h?view=markupand
>>> http://llvm.org/viewvc/llvm-project/safecode/trunk/lib/InsertPoolChecks/LoadStoreChecks.cpp?view=markup).
>>> It's about as simple as an instrumentation pass gets.
>>>
>>> -- John T.
>>>
>>>
>>> Please suggest me how to go about it .
>>> thanks
>>> himanshu
>>> --
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing listLLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>
>>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> 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/20110928/c96bb766/attachment.html>


More information about the llvm-dev mailing list