/
LLVM-based C++ LLVM-based C++

LLVM-based C++ - PowerPoint Presentation

giovanna-bartolotta
giovanna-bartolotta . @giovanna-bartolotta
Follow
405 views
Uploaded On 2017-03-30

LLVM-based C++ - PPT Presentation

Interpreter For ROOT Axel Naumann CERN Lukasz Janyst CERN Philippe Canal Fermilab Prompt same as compiled language IO type database members object from type name Signalslot ID: 531429

axel naumann philippe cling naumann axel cling philippe canal llvm chep 2009 clang interpreter parser root code function compiler reflection func0 front

Share:

Link:

Embed:

Download Presentation from below link

Download Presentation The PPT/PDF document "LLVM-based C++" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.


Presentation Transcript

Slide1

LLVM-based C++ InterpreterFor ROOT

Axel

Naumann

, CERN

Lukasz

Janyst

, CERN

Philippe Canal,

FermilabSlide2

Prompt: same as compiled language!I/O: type database, members, object from type nameSignal/slot,

Plugins

: call function given a stringInterest even outside HEPMain items:Reflection(types, members, sizes…)Calling compiled functions

Why Interpreter?

2009-03-26

2

CHEP'09 • Axel Naumann, Philippe CanalSlide3

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

3Overview Of Reflection Data

Dictionary

Parser

Headers

I/O

Structure

G__My.cxx

rootcint

MyClass.h

ROOT I/O

ExampleSlide4

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

4Overview Of Reflection Data

Dictionary

Parser

Headers

I/O

Structure

My_rflx.cxx

genreflex [GCCXML]

MyClass.h

ROOT I/O

ExampleSlide5

Current Reflection Gathering

CINT

Limited parser (templates, operators, overloading, lookup, file handling, STL / sys headers)GCCXML/ genreflexInhomogeneous: GCC / XML / Python / C++

SlowExtremely difficult to influence / fix; involves three parties (GCC, GCCXML, us), different interests

2009-03-26

5

CHEP'09 • Axel Naumann, Philippe CanalSlide6

Function Calls From String, Current

Maintain table

Stubs generated as part of dictionary:Given call function stub, pass arguments. Needs one stub per function:40% of dictionaries’ size![Disclaimer: code is paraphrased]

6

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

Func_stub

(vector<void*>

args

) {

function_name

((

int

)

args

[0]); }

"

function_name

"

&Func_stub

"

func

(0)"

funcmap

["func"](

make_vector(0))Slide7

LLVM

Open Source project with

Uni Illinois Urbana-Champaign, started around 2002Sponsored by Apple, Adobe, Cray,…Features:drop-in, faster alternative to GCCmodular design with C++ API

liberal NCSA open source licensejust-in-time compilervery active mailing list, very responsive developers

7

2009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide8

LLVM

C++ front-end clang (alternative: GCC front-end)

bytecode layer with optimizers and execution engineback-end for all major platforms: Windows, Linux, MacOS, PS3, Solaris, …

Can already build e.g. ROOT (with GCC front-end)

8

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

Source

clang or GCC

C++ front-end

LLVM

bytecode

LLVM back-end

native binaries

LLVM

bytecode

exec

optimizer

optimizerSlide9

clang

LLVM C[++] front-end: preprocessor etc, result: AST

Clean C++ API: analyze, generate, manipulate code!Already used for C and ObjCC++ still in development:contribute and influence!Apple: “production quality in 2011”

approx 200 commits / week,by far most for C++

2009-03-26

9

CHEP'09 • Axel Naumann, Philippe CanalSlide10

LLVM + clang + X = cling

Requirements:

all CINT features, no user level changes (prompt, ACLiC, gInterpreter etc)Benefits of cling:Interpreter is based on production-grade parser and optimizers; benefit from compiler improvements

ACLiC (.L file.C+) will use JIT instead of native compiler / linker / loader: in-memory compilation!

Modularity eases maintenanceApply >10 years of C++ interpreter to new design

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

10Slide11

Auto-dlopen, -#include, -Declaration

CINT

: loads lib for class on first usage (rootmap)clang

: analyze AST, extract types, load needed librariesCINT

: needs no #include for types with dictionary

clang: intercept parser errors on unknown type; inject type's header into AST and re-parse

CINT: auto-declares variables in assignment

clang

: patch in "auto" keyword as error handling

11

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

auto

h=new TH1F()

h=new TH1F()

transformSlide12

Function Calls With clang / LLVM

LLVM resolves missing symbols in memory from:

shared librariescode already compiled in memorycode not yet compiled: just-in-time (JIT) compile it!JIT already available on

X86, PowerPC, ARM, Alpha with Linux (32 / 64 bit),

MacOS X,

Win32.No stubs anymore, 40% smaller dictionaries!

Also speeds up performance critical interpreted code!2009-03-26

12

CHEP'09 • Axel Naumann, Philippe Canal

!Slide13

The Challenges

As compiler, LLVM expects all code to be available.

cling on the other hand:must allow iterative loadingCompilers parse all,

then compile, then link.Solution

: iterative linking of tiny translation units

13

cling[0] .L func0.C

cling[1]

int

i

= func0();

cling[2] .L func1.C

cling[3]

i

= func1();

2009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide14

The Challenges

As compiler, LLVM expects all code to be available.

cling on the other hand:must allow iterative loadingmust keep stack

Stack not even set up forcompiler.

Solution

: need interpreter context to survive incremental linking

14

cling[0]

int

i

= 12;

cling[1] .L times2.C

cling[2] times2(&

i

);

cling[3]

printf

("%d\

n",i);242009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide15

The Challenges

As compiler, LLVM expects all code to be available.

cling on the other hand:must allow iterative loading

must keep stackmust support unloading

Unthinkable for compilers.Solution

: need to modify AST, re-link, track dependencies,…

15

cling[0] .L func0.C

cling[1] func0();

cling[2] .U func0.C

cling[3]

int

func0 = 0;

2009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide16

More Challenges

Prompt

: use prompt namespace, incremental linkingDynamic scope: automatic variable names

“Multithreading” (multiple interpreter objects):make LLVM thread-safe where needed (rare),

use new, thread-safe Reflex as reflection databasePyROOT, ROOT’s python interpreter interface :

"llvm-py provides Python bindings for LLVM"

16

new

TFile

("

f.root

");

cling.delay

("

hist

->Draw()");

new

TFile

("

f.root

");

hist->Draw();

transform

2009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide17

Objective

Aim at full-blown replacement for existing solutions:

parser replaces CINT, GCCXMLtype info from clang replaces rootcint,

genreflexinterpreter replaces CINT

JIT replaces ACLiC

(.L MyCode.C

+)Works with GCC / MSVC / … as native compiler

No need to switch to LLVM as compiler!

17

2009-03-26

CHEP'09 • Axel Naumann, Philippe CanalSlide18

Summary

LLVM and clang: exciting and promising!

Compile a list of ingredients for a C++ interpreter and code parser for reflection extraction:clang + LLVM is an incredibly good match.Proof-of-concept exists, first steps in prompt, JIT, unloading, calling into shared libraries:CINT will have a competitor!

http://root.cern.ch/viewvc/branches/dev/cling/

2009-03-26

18

CHEP'09 • Axel Naumann, Philippe CanalSlide19

cling: C++ Interpreter Demo

2009-03-26

CHEP'09 • Axel Naumann, Philippe Canal

19

#include "/

usr

/include/

expat.h

"

#include <

stdio.h

>

int

xml() {

printf

("%s\n",

XML_ExpatVersion());

return 0;}

xml.h

[cling]$

auto s = "hello"; printf("%s\n", s);

cling errors.h

[cling]$

.L /usr/lib64/libexpat.so

[cling]$ .x xml.h