<div dir="ltr"><div><div> Hie Everyone.<br>I want to to produce LLVM-IR for ACSL programs using CLANG. I am new to<br>CLANG and don't know much about it. What I am looking for is how to learn about architecture of CLANG so that I can make changes in its source code so as to make it support for my ACSL constructs. This language is a specification language<br>
of C. The specifications of the program are written in annotated comments. I want to produce LLVM-IR for such type of code using clang. For this I think I have to add some code in the existing source code of clang. So, what I want to know is learn about clang so as to know what changes to make in it and where. I am writing one simple ACSL program :<br>
<br><pre style="word-break:normal!important;word-wrap:normal!important;white-space:pre!important" class=""><span class="">/* Program verification examples from the book "Software Foundations"
   <a href="http://www.cis.upenn.edu/~bcpierce/sf/">http://www.cis.upenn.edu/~bcpierce/sf/</a>

   Example: Reduce to Zero
*/</span><span class="">

</span><span class="">int</span><span class=""> reduce_to_zero </span><span class="">(</span><span class="">int</span><span class=""> x</span><span class="">)</span><span class="">
</span><span class="">/*
  @requires { x >= 0 }
  @ensures { result = 0 }<br></span><span class="">*/</span><span class="">
</span><span class="">{</span><span class="">
    </span><span class="">while</span><span class=""> </span><span class="">(</span><span class="">x </span><span class="">!=</span><span class=""> </span><span class="">0</span><span class="">)</span><span class=""> </span><span class="">{</span><span class="">
        </span><span class="">/*
          @invariant { x >= 0 }
          @variant { x }
        */</span><span class="">
        x </span><span class="">=</span><span class=""> x </span><span class="">-</span><span class=""> </span><span class="">1</span><span class="">;</span><span class="">
    </span><span class="">}</span><span class="">
    </span><span class="">return</span><span class=""> x</span><span class="">;</span><span class="">
</span><span class="">}</span><br></pre><br>The "requires" annotation ensures that the caller of the function reduce_to_zero() has value of the parameter >= 0 and the "ensures" annotation ensures that the function reduce_to_zero() has result = 0 before it ends its execution. <br>
This is one of the programs for which I want to produce LLVM-IR.<br>I had studied internal manual on clang but din't find it much useful as<br>concerned to my work. I was reading the documentation of clang but I don't think its a great start for beginner's like me.<br>
I had done a course on compiler design as part of my academics and know the basics of lexing, parsing, semantic analysis and compiler architecture. Apart from this, this is my first practical experience with compilers.<br>
This is a part of my academic research work(B.Tech) on compilers which I might continue further as I like this part.<br>Please help me with this as I am seriously interested in working with clang.<br></div>Thanks in advance.<br>
</div>Surbhi<br></div>