<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Hi Rajesh,<br>
<br>
>> I bundle the Clang/LLVM libraries (along with the modified code from clang-interpreter) into a shared library and am able to invoke the JIT functionality both statically and dynamically. However, the size of the shared library is ~54 MB,</span>
<span style="font-size:11.0pt;font-family:"Calibri",sans-serif">which I feel is too large. Am I doing something wrong, and is there a way to strip out unneeded bits and reduce the size? Or, is this the price I have to pay for removing any runtime dependency
 on Clang/LLVM?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I don’t know which specific numbers you need to expect, but the size of LLVM+Clang might be large. For example, take a look at the slides from the EuroLLVM 2019 [0] from Russell
 Gallop about size of clang compiler on windows <br>
<br>
>> 2. This is more of a general JIT query: my current plan is to dump the generated C code to a file and invoke clang on this file through the API. I haven't tested out the performance implications of this yet, but wanted to know if this is kosher. This method
 has the advantage that my interaction with the clang API is quite coarse-grained as opposed to using (other) finer-grained API calls.<br>
<br>
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I cannot say much here because I’ve never tried to do so, but as I can see, ROCm-OpenCL-Driver [1] uses such method, you could try to reach developers of this library and ask
 them.<br>
<br>
[0]: <a href="https://www.youtube.com/watch?v=N1CbQNQYs-8">https://www.youtube.com/watch?v=N1CbQNQYs-8</a><br>
[1]: <a href="https://github.com/RadeonOpenCompute/ROCm-OpenCL-Driver">https://github.com/RadeonOpenCompute/ROCm-OpenCL-Driver</a>
<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></a></p>
<p class="MsoNormal"><a name="_____replyseparator"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> cfe-dev [mailto:cfe-dev-bounces@lists.llvm.org]
<b>On Behalf Of </b>Rajesh Jayaprakash via cfe-dev<br>
<b>Sent:</b> Monday, May 13, 2019 8:56 AM<br>
<b>To:</b> cfe-dev <cfe-dev@lists.llvm.org><br>
<b>Subject:</b> Re: [cfe-dev] [llvm-dev] Query about JIT<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Dear cfe-dev mailing list,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I had posted earlier in this list with some queries about JIT. Thanks Alexey and Mehdi for your help.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I have liberally borrowed from the provided clang-interpreter example and have more or less managed to meet my objectives. Two concerns remain, however:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">1. I bundle the Clang/LLVM libraries (along with the modified code from clang-interpreter) into a shared library and am able to invoke the JIT functionality both statically and dynamically. However, the size of the shared library is ~54
 MB, which I feel is too large. Am I doing something wrong, and is there a way to strip out unneeded bits and reduce the size? Or, is this the price I have to pay for removing any runtime dependency on Clang/LLVM?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">2. This is more of a general JIT query: my current plan is to dump the generated C code to a file and invoke clang on this file through the API. I haven't tested out the performance implications of this yet, but wanted to know if this is
 kosher. This method has the advantage that my interaction with the clang API is quite coarse-grained as opposed to using (other) finer-grained API calls.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Any help would be greatly appreciated.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Rajesh Jayaprakash<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#500050">(</span><a href="https://github.com/shikantaza/plisp" target="_blank">https://github.com/shikantaza/plisp</a><span style="color:#500050">)</span><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Mar 13, 2019 at 2:56 PM Rajesh Jayaprakash <<a href="mailto:rajesh.jayaprakash@gmail.com">rajesh.jayaprakash@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal">Thanks Mehdi!<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Rajesh<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Mar 13, 2019 at 2:42 PM Mehdi AMINI <<a href="mailto:joker.eph@gmail.com" target="_blank">joker.eph@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<div>
<p class="MsoNormal">Hi Rajesh,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Adding the cfe-dev (Clang FrontEnd) mailing list as your question seems to be more targeted towards clang (your input is C code if I understood correctly).<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">At the LLVM level, there is a (limited but "stable") C API here: <a href="https://github.com/llvm/llvm-project/tree/master/llvm/include/llvm-c" target="_blank">https://github.com/llvm/llvm-project/tree/master/llvm/include/llvm-c</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">For the JIT, this file seems relevant: <a href="https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm-c/OrcBindings.h" target="_blank">https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm-c/OrcBindings.h</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">But this assumes you get LLVM IR in the first place, and I don't know of a C API for clang for this.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Best,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">-- <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Mehdi<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Tue, Mar 12, 2019 at 7:05 AM Rajesh Jayaprakash via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal">Hi Alexey,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thank you very much for your detailed reply, will look into the resources indicated. I'd like to avoid C++ if possible, let me see how it goes.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Rajesh Jayaprakash<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Tue 12 Mar, 2019, 6:35 PM Sachkov, Alexey, <<a href="mailto:alexey.sachkov@intel.com" target="_blank">alexey.sachkov@intel.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Hi Rajesh,<br>
<br>
If I understand correctly, libclang is a C interface to Clang features, not LLVM. That means that you cannot get LLVM IR via libclang: The C Interface to Clang provides a relatively small API that exposes facilities for parsing source code into an abstract
 syntax tree (AST), loading already-parsed ASTs, traversing the AST, associating physical source locations with elements within the AST, and other facilities that support Clang-based development tools.<br>
<br>
To get LLVM IR and perform JIT compilation you need to use C++ API of Clang and LLVM.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Here is some links which might be helpful:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">* [cfe-dev] How to use clang and llvm for JIT, preferably via the C API  </span><a href="http://lists.llvm.org/pipermail/cfe-dev/2015-August/044869.html" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">http://lists.llvm.org/pipermail/cfe-dev/2015-August/044869.html</span></a><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">* [cfe-dev] Help on Generating LLVM Module from C++ file using libClang 
</span><a href="http://lists.llvm.org/pipermail/cfe-dev/2017-November/056033.html" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">http://lists.llvm.org/pipermail/cfe-dev/2017-November/056033.html</span></a><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">* [LLVMdev] libclang JIT frontend 
</span><a href="http://lists.llvm.org/pipermail/llvm-dev/2013-October/066088.html" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">http://lists.llvm.org/pipermail/llvm-dev/2013-October/066088.html</span></a><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">* Generate assembly from C code in memory using libclang 
</span><a href="https://stackoverflow.com/questions/34828480/generate-assembly-from-c-code-in-memory-using-libclang" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">https://stackoverflow.com/questions/34828480/generate-assembly-from-c-code-in-memory-using-libclang</span></a><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">BTW, there is a library for translating OpenCL C source code into a LLVM IR which features in-memory translation:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">*
</span><a href="https://github.com/intel/opencl-clang" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">https://github.com/intel/opencl-clang</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><br>
It is not suitable for performing the whole JIT compilation, but it is used by </span>
<a href="https://github.com/intel/intel-graphics-compiler" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">https://github.com/intel/intel-graphics-compiler</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 as a front-end. Also I’m not sure that you will be able to use it as-is for your purposes, but at least it can be used as an example</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><a name="m_-2786330223304187469_m_-81746844771452"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 llvm-dev [mailto:<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>]
<b>On Behalf Of </b>Rajesh Jayaprakash via llvm-dev<br>
<b>Sent:</b> Friday, March 8, 2019 2:14 PM<br>
<b>To:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> [llvm-dev] Query about JIT</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Dear llvm-dev list,<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Apologies if this list is not the right venue for this query - suitable redirection would be appreciated in that case.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I have a JIT use case that I'd like to know the best way to implement using LLVM.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I am looking to migrate from the existing native compilation option (Tiny C Compiler - TCC) for pLisp, a Lisp dialect and IDE.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">At present, the native compilation is done by converting the Lisp code to C, storing the C code in a char buffer, and passing it to TCC programmatically via the API provided. I
 get a function pointer in return, which I store and invoke as needed.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Delving into the LLVM documentation, I found that one possible way to achieve the same functionality in LLVM is to use clag/libclang to convert the C source to LLVM IR, load this
 IR into the the JIT context and (skipping some steps I'm yet to figure out) get the desired function pointer.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Is this approach the right one? One issue I foresee is that libclang's clang_parseTranslateUnit() function expects the C code to be from a file (although the file can be in-memory),
 whereas in my case the C code needs to be picked up from a char buffer - necessitating fmemopen(), etc.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thanks for your assistance.<br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Regards,<br>
Rajesh Jayaprakash<o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt">(<a href="https://github.com/shikantaza/plisp" target="_blank">https://github.com/shikantaza/plisp</a>)<o:p></o:p></p>
</div>
<p><br>
--------------------------------------------------------------------<br>
Joint Stock Company Intel A/O<br>
Registered legal address: Krylatsky Hills Business Park, <br>
17 Krylatskaya Str., Bldg 4, Moscow 121614, <br>
Russian Federation<o:p></o:p></p>
<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.<o:p></o:p></p>
</div>
</blockquote>
</div>
<p class="MsoNormal">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
</blockquote>
</div>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Regards,<br>
Rajesh<o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">Regards,<br>
Rajesh<o:p></o:p></p>
</div>
<p><br>--------------------------------------------------------------------<br>Joint Stock Company Intel A/O<br>Registered legal address: Krylatsky Hills Business Park, <br>17 Krylatskaya Str., Bldg 4, Moscow 121614, <br>Russian Federation</p><p>This e-mail and any attachments may contain confidential material for<br>the sole use of the intended recipient(s). Any review or distribution<br>by others is strictly prohibited. If you are not the intended<br>recipient, please contact the sender and delete all copies.</p>
</body>
</html>