[cfe-dev] [RFC] Moving (parts of) the Cling REPL in Clang
Vassil Vassilev via cfe-dev
cfe-dev at lists.llvm.org
Tue Dec 1 10:50:56 PST 2020
On 7/11/20 12:10 AM, Hal Finkel wrote:
>
>
> On 7/10/20 4:00 PM, JF Bastien wrote:
>>
>>
>>> On Jul 10, 2020, at 1:55 PM, Hal Finkel <hfinkel at anl.gov
>>> <mailto:hfinkel at anl.gov>> wrote:
>>>
>>>
>>> On 7/10/20 1:57 PM, Vassil Vassilev wrote:
>>>> On 7/10/20 6:43 AM, JF Bastien wrote:
>>>>> 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.
>>>>
>>>>
>>>> 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.
>>>
>>>
>>> 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.
>>
>> 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.
>>
>> I’m guessing at what Hal is asking, LMK if that’s not what you had in
>> mind!
>
>
> 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?
>
It took us a while... We have published a blog post on interactive
C++ with cling at the LLVM blog. Direct link
<https://blog.llvm.org/posts/2020-11-17-interactive-cpp-with-cling/>. 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.
> -Hal
>
>
>>
>>
>>> -Hal
>>>
>>>
>>>>
>>>>
>>>>>
>>>>>
>>>>>> On Jul 9, 2020, at 7:25 PM, Hal Finkel via cfe-dev
>>>>>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>> -Hal
>>>>>>
>>>>>> On 7/9/20 3:46 PM, Vassil Vassilev via cfe-dev wrote:
>>>>>>> Motivation
>>>>>>> ===
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>> Background
>>>>>>> ===
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>> Plans
>>>>>>> ===
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>> Moving Parts of Cling Upstream
>>>>>>> ---
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>> 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.
>>>>>>> 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.
>>>>>>>
>>>>>>> Extend and Generalize the Language Interoperability Layer Around
>>>>>>> Cling
>>>>>>> ---
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>> Extend and Generalize the OpenCL/CUDA Support in Cling
>>>>>>> ---
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 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.
>>>>>>>
>>>>>>>
>>>>>>> Collaboration
>>>>>>> ===
>>>>>>>
>>>>>>> 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
>>>>>>> (https://groups.google.com/g/compiler-research-announce
>>>>>>> <https://groups.google.com/g/compiler-research-announce>).
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Many thanks!
>>>>>>>
>>>>>>>
>>>>>>> David & Vassil
>>>>>>>
>>>>>>> References
>>>>>>> ===
>>>>>>> [1] ROOT GitHub https://github.com/root-project/root
>>>>>>> <https://github.com/root-project/root>
>>>>>>> [2] ROOT https://root.cern <https://root.cern>
>>>>>>> [3] Cling https://github.com/root-project/cling
>>>>>>> <https://github.com/root-project/cling>
>>>>>>> [4] Xeus-Cling
>>>>>>> https://blog.jupyter.org/xeus-is-now-a-jupyter-subproject-c4ec5a1bf30b
>>>>>>> <https://blog.jupyter.org/xeus-is-now-a-jupyter-subproject-c4ec5a1bf30b>
>>>>>>> [5] Cling – The New Interactive Interpreter for ROOT 6,
>>>>>>> https://iopscience.iop.org/article/10.1088/1742-6596/396/5/052071
>>>>>>> <https://iopscience.iop.org/article/10.1088/1742-6596/396/5/052071>
>>>>>>> [6] High-performance Python-C++ bindings with PyPy and Cling,
>>>>>>> https://dl.acm.org/doi/10.5555/3019083.3019087
>>>>>>> <https://dl.acm.org/doi/10.5555/3019083.3019087>
>>>>>>> [7]
>>>>>>> https://indico.cern.ch/event/697389/contributions/3085538/attachments/1712698/2761717/2018_09_10_cling_CUDA.pdf
>>>>>>> <https://indico.cern.ch/event/697389/contributions/3085538/attachments/1712698/2761717/2018_09_10_cling_CUDA.pdf>
>>>>>>> [8] CUDA C++ in Jupyter: Adding CUDA Runtime Support to Cling',
>>>>>>> https://zenodo.org/record/3713753#.Xu8jqvJRXxU
>>>>>>> <https://zenodo.org/record/3713753#.Xu8jqvJRXxU>
>>>>>>> [9] HIP Programming Guide
>>>>>>> https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP-GUIDE.html
>>>>>>> <https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP-GUIDE.html>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> cfe-dev mailing list
>>>>>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>> --
>>>>>> Hal Finkel
>>>>>> Lead, Compiler Technology and Programming Languages
>>>>>> Leadership Computing Facility
>>>>>> Argonne National Laboratory
>>>>>>
>>>>>> _______________________________________________
>>>>>> cfe-dev mailing list
>>>>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>
>>>>
>>> --
>>> Hal Finkel
>>> Lead, Compiler Technology and Programming Languages
>>> Leadership Computing Facility
>>> Argonne National Laboratory
>>
> --
> Hal Finkel
> Lead, Compiler Technology and Programming Languages
> Leadership Computing Facility
> Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201201/6755710d/attachment-0001.html>
More information about the cfe-dev
mailing list