<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="moz-cite-prefix">On 7/11/20 12:10 AM, Hal Finkel wrote:<br>
</div>
<blockquote type="cite"
cite="mid:f2c4681d-c501-862a-b20c-0ef9e0a75084@anl.gov">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<p><br>
</p>
<div class="moz-cite-prefix">On 7/10/20 4:00 PM, JF Bastien wrote:<br>
</div>
<blockquote type="cite"
cite="mid:FAF919EA-DD62-4BE3-AB8D-4B5CF321BBA2@apple.com"> <br
class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Jul 10, 2020, at 1:55 PM, Hal Finkel <<a
href="mailto:hfinkel@anl.gov" class=""
moz-do-not-send="true">hfinkel@anl.gov</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class=""><br style="caret-color: rgb(0, 0, 0);
font-family: Helvetica; font-size: 12px; font-style:
normal; font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">On 7/10/20 1:57 PM, Vassil
Vassilev wrote:</span><br style="caret-color: rgb(0, 0,
0); font-family: Helvetica; font-size: 12px; font-style:
normal; font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<blockquote type="cite" style="font-family: Helvetica;
font-size: 12px; font-style: normal; font-variant-caps:
normal; font-weight: normal; letter-spacing: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows: auto;
word-spacing: 0px; -webkit-text-size-adjust: auto;
-webkit-text-stroke-width: 0px; text-decoration: none;"
class="">On 7/10/20 6:43 AM, JF Bastien wrote:<br
class="">
<blockquote type="cite" class="">I like cling, and
having it integrated with the rest of the project
would be neat. I agree with Hal’s suggestion to
explain the design of what remains. It sounds like a
pretty small amount of code.<br class="">
</blockquote>
<br class="">
<br class="">
<span class="Apple-converted-space"> </span>JF, Hal,
did you mean you want a design document of how cling in
general or a design RFC for the patches we have? A
design document for cling would be quite large and will
take us some time to write up. OTOH, we could relatively
easily give a rationale for each patch.<br class="">
</blockquote>
<br style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<br style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">I had in mind something that's
probably in between. Something that explains the patches
and enough about how they fit into a larger system that
we can reason about the context.</span><br
style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>Maybe a purpose would be more useful to understand your
request? I assume you meant “I’d like us to understand what
we’re signing up to maintain, and why it’s useful to do
things this way”. In particular, if there’s undue burden in
a particular component, and the code could be changed to
work differently with less support overhead, then we’d want
to identify this fact ahead of time.</div>
<div><br class="">
</div>
<div>I’m guessing at what Hal is asking, LMK if that’s not
what you had in mind!</div>
</div>
</blockquote>
<p><br>
</p>
<p>Yes. To understand how all of the pieces fit together to enable
support for incremental compilation of C++ code. Once everything
is in place, if I wanted to use the infrastructure to do some
kind of incremental compilation of C++, what would I do? And
what do the set of patches aim to do to get us there?<br>
</p>
</blockquote>
<p><br>
</p>
<p> It took us a while... We have published a blog post on
interactive C++ with cling at the LLVM blog. <a
moz-do-not-send="true"
href="https://blog.llvm.org/posts/2020-11-17-interactive-cpp-with-cling/">Direct
link</a>. I realize this touches only on some aspects of
interactive C++ and cling. We have a longer document with more
information but I am not yet comfortable in giving a public
pointer to it. If you are interested in that document please ping
me off-list and I will give you access.<br>
</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:f2c4681d-c501-862a-b20c-0ef9e0a75084@anl.gov">
<p> </p>
<p> -Hal<br>
</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:FAF919EA-DD62-4BE3-AB8D-4B5CF321BBA2@apple.com">
<div>
<div><br class="">
</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0);
font-family: Helvetica; font-size: 12px; font-style:
normal; font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class=""> -Hal</span><br
style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<br style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<br style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<blockquote type="cite" style="font-family: Helvetica;
font-size: 12px; font-style: normal; font-variant-caps:
normal; font-weight: normal; letter-spacing: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows: auto;
word-spacing: 0px; -webkit-text-size-adjust: auto;
-webkit-text-stroke-width: 0px; text-decoration: none;"
class=""><br class="">
<br class="">
<blockquote type="cite" class=""><br class="">
<br class="">
<blockquote type="cite" class="">On Jul 9, 2020, at
7:25 PM, Hal Finkel via cfe-dev <<a
href="mailto:cfe-dev@lists.llvm.org" class=""
moz-do-not-send="true">cfe-dev@lists.llvm.org</a>>
wrote:<br class="">
<br class="">
I think that it would be great to have
infrastructure for incremental C++ compilation,
supporting interactive use, just-in-time
compilation, and so on. I think that the best way to
deal with the patches, etc., as well as
IncrementalAction, is to first send an RFC
explaining the overall design.<br class="">
<br class="">
<span class="Apple-converted-space"> </span>-Hal<br
class="">
<br class="">
On 7/9/20 3:46 PM, Vassil Vassilev via cfe-dev
wrote:<br class="">
<blockquote type="cite" class="">Motivation<br
class="">
===<br class="">
<br class="">
Over the last decade we have developed an
interactive, interpretative C++ (aka REPL) as part
of the high-energy physics (HEP) data analysis
project -- ROOT [1-2]. We invested a significant
effort to replace the CINT C++ interpreter with a
newly implemented REPL based on llvm -- cling [3].
The cling infrastructure is a core component of
the data analysis framework of ROOT and runs in
production for approximately 5 years.<br class="">
<br class="">
Cling is also a standalone tool, which has a
growing community outside of our field. Cling’s
user community includes users in finance, biology
and in a few companies with proprietary software.
For example, there is a xeus-cling jupyter kernel
[4]. One of the major challenges we face to foster
that community is our cling-related patches in
llvm and clang forks. The benefits of using the
LLVM community standards for code reviews, release
cycles and integration has been mentioned a number
of times by our "external" users.<br class="">
<br class="">
Last year we were awarded an NSF grant to improve
cling's sustainability and make it a standalone
tool. We thank the LLVM Foundation Board for
supporting us with a non-binding letter of
collaboration which was essential for getting this
grant.<br class="">
<br class="">
<br class="">
Background<br class="">
===<br class="">
<br class="">
Cling is a C++ interpreter built on top of clang
and llvm. In a nutshell, it uses clang's
incremental compilation facilities to process code
chunk-by-chunk by assuming an ever-growing
translation unit [5]. Then code is lowered into
llvm IR and run by the llvm jit. Cling has
implemented some language "extensions" such as
execution statements on the global scope and error
recovery. Cling is in the core of HEP -- it is
heavily used during data analysis of exabytes of
particle physics data coming from the Large Hadron
Collider (LHC) and other particle physics
experiments.<br class="">
<br class="">
<br class="">
Plans<br class="">
===<br class="">
<br class="">
The project foresees three main directions -- move
parts of cling upstream along with the clang and
llvm features that enable them; extend and
generalize the language interoperability layer
around cling; and extend and generalize the
OpenCL/CUDA support in cling. We are at the early
stages of the project and this email intends to be
an RFC for the first part -- upstreaming parts of
cling. Please do share your thoughts on the rest,
too.<br class="">
<br class="">
<br class="">
Moving Parts of Cling Upstream<br class="">
---<br class="">
<br class="">
Over the years we have slowly moved some patches
upstream. However we still have around 100 patches
in the clang fork. Most of them are in the context
of extending the incremental compilation support
for clang. The incremental compilation poses some
challenges in the clang infrastructure. For
example, we need to tune CodeGen to work with
multiple llvm::Module instances, and finalize per
each end-of-translation unit (we have multiple of
them). Other changes include small adjustments in
the FileManager's caching mechanism, and bug fixes
in the SourceManager (code which can be reached
mostly from within our setup). One conclusion we
can draw from our research is that the clang
infrastructure fits amazingly well to something
which was not its main use case. The grand total
of our diffs against clang-9 is: `62 files
changed, 1294 insertions(+), 231 deletions(-)`.
Cling is currently being upgraded from llvm-5 to
llvm-9.<br class="">
<br class="">
A major weakness of cling's infrastructure is that
it does not work with the clang Action
infrastructure due to the lack of an
IncrementalAction. A possible way forward would
be to implement a clang::IncrementalAction as a
starting point. This way we should be able to
reduce the amount of setup necessary to use the
incremental infrastructure in clang. However, this
will be a bit of a testing challenge -- cling
lives downstream and some of the new code may be
impossible to pick straight away and use. Building
a mainline example tool such as clang-repl which
gives us a way to test that incremental case or
repurpose the already existing clang-interpreter
may be able to address the issue. The major risk
of the task is avoiding code in the clang mainline
which is untested by its HEP production
environment.<br class="">
There are several other types of patches to the
ROOT fork of Clang, including ones in the context
of performance,towards C++ modules support
(D41416), and storage (does not have a patch yet
but has an open projects entry and somebody
working on it). These patches can be considered in
parallel independently on the rest.<br class="">
<br class="">
Extend and Generalize the Language
Interoperability Layer Around Cling<br class="">
---<br class="">
<br class="">
HEP has extensive experience with on-demand python
interoperability using cppyy[6], which is built
around the type information provided by cling.
Unlike tools with custom parsers such as swig and
sip and tools built on top of C-APIs such as
boost.python and pybind11, cling can provide
information about memory management patterns (eg
refcounting) and instantiate templates on the
fly.We feel that functionality may not be of
general interest to the llvm community but we will
prepare another RFC and send it here later on to
gather feedback.<br class="">
<br class="">
<br class="">
Extend and Generalize the OpenCL/CUDA Support in
Cling<br class="">
---<br class="">
<br class="">
Cling can incrementally compile CUDA code [7-8]
allowing easier set up and enabling some
interesting use cases. There are a number of
planned improvements including talking to HIP [9]
and SYCL to support more hardware architectures.<br
class="">
<br class="">
<br class="">
<br class="">
The primary focus of our work is to upstreaming
functionality required to build an incremental
compiler and rework cling build against vanilla
clang and llvm. The last two points are to give
the scope of the work which we will be doing the
next 2-3 years. We will send here RFCs for both of
them to trigger technical discussion if there is
interest in pursuing this direction.<br class="">
<br class="">
<br class="">
Collaboration<br class="">
===<br class="">
<br class="">
Open source development nowadays relies on
reviewers. LLVM is no different and we will
probably disturb a good number of people in the
community ;)We would like to invite anybody
interested in joining our incremental C++
activities to our open every second week calls.
Announcements will be done via google group:
compiler-research-announce (<a
href="https://groups.google.com/g/compiler-research-announce"
class="" moz-do-not-send="true">https://groups.google.com/g/compiler-research-announce</a>).<br
class="">
<br class="">
<br class="">
<br class="">
Many thanks!<br class="">
<br class="">
<br class="">
David & Vassil<br class="">
<br class="">
References<br class="">
===<br class="">
[1] ROOT GitHub <a
href="https://github.com/root-project/root"
class="" moz-do-not-send="true">https://github.com/root-project/root</a><br
class="">
[2] ROOT <a href="https://root.cern" class=""
moz-do-not-send="true">https://root.cern</a><br
class="">
[3] Cling <a
href="https://github.com/root-project/cling"
class="" moz-do-not-send="true">https://github.com/root-project/cling</a><br
class="">
[4] Xeus-Cling <a
href="https://blog.jupyter.org/xeus-is-now-a-jupyter-subproject-c4ec5a1bf30b"
class="" moz-do-not-send="true">https://blog.jupyter.org/xeus-is-now-a-jupyter-subproject-c4ec5a1bf30b</a><br
class="">
[5] Cling – The New Interactive Interpreter for
ROOT 6, <a
href="https://iopscience.iop.org/article/10.1088/1742-6596/396/5/052071"
class="" moz-do-not-send="true">https://iopscience.iop.org/article/10.1088/1742-6596/396/5/052071</a><br
class="">
[6] High-performance Python-C++ bindings with PyPy
and Cling, <a
href="https://dl.acm.org/doi/10.5555/3019083.3019087"
class="" moz-do-not-send="true">https://dl.acm.org/doi/10.5555/3019083.3019087</a><br
class="">
[7] <a
href="https://indico.cern.ch/event/697389/contributions/3085538/attachments/1712698/2761717/2018_09_10_cling_CUDA.pdf"
class="" moz-do-not-send="true">https://indico.cern.ch/event/697389/contributions/3085538/attachments/1712698/2761717/2018_09_10_cling_CUDA.pdf</a><br
class="">
[8] CUDA C++ in Jupyter: Adding CUDA Runtime
Support to Cling', <a
href="https://zenodo.org/record/3713753#.Xu8jqvJRXxU"
class="" moz-do-not-send="true">https://zenodo.org/record/3713753#.Xu8jqvJRXxU</a><br
class="">
[9] HIP Programming Guide <a
href="https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP-GUIDE.html"
class="" moz-do-not-send="true">https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP-GUIDE.html</a><br
class="">
<br class="">
_______________________________________________<br
class="">
cfe-dev mailing list<br class="">
<a href="mailto:cfe-dev@lists.llvm.org" class=""
moz-do-not-send="true">cfe-dev@lists.llvm.org</a><br
class="">
<a class="moz-txt-link-freetext"
href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev"
moz-do-not-send="true">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br
class="">
</blockquote>
--<span class="Apple-converted-space"> </span><br
class="">
Hal Finkel<br class="">
Lead, Compiler Technology and Programming Languages<br
class="">
Leadership Computing Facility<br class="">
Argonne National Laboratory<br class="">
<br class="">
_______________________________________________<br
class="">
cfe-dev mailing list<br class="">
<a href="mailto:cfe-dev@lists.llvm.org" class=""
moz-do-not-send="true">cfe-dev@lists.llvm.org</a><br
class="">
<a class="moz-txt-link-freetext"
href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev"
moz-do-not-send="true">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br
class="">
</blockquote>
</blockquote>
<br class="">
<br class="">
</blockquote>
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">--<span
class="Apple-converted-space"> </span></span><br
style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">Hal Finkel</span><br
style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">Lead, Compiler Technology and
Programming Languages</span><br style="caret-color:
rgb(0, 0, 0); font-family: Helvetica; font-size: 12px;
font-style: normal; font-variant-caps: normal;
font-weight: normal; letter-spacing: normal; text-align:
start; text-indent: 0px; text-transform: none;
white-space: normal; word-spacing: 0px;
-webkit-text-stroke-width: 0px; text-decoration: none;"
class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">Leadership Computing Facility</span><br
style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family:
Helvetica; font-size: 12px; font-style: normal;
font-variant-caps: normal; font-weight: normal;
letter-spacing: normal; text-align: start; text-indent:
0px; text-transform: none; white-space: normal;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
text-decoration: none; float: none; display: inline
!important;" class="">Argonne National Laboratory</span></div>
</blockquote>
</div>
<br class="">
</blockquote>
<pre class="moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</blockquote>
<p><br>
</p>
</body>
</html>