easy::jit - llvmllvm.org/devmtg/2018-04/slides/caamano-easy_jit.pdf · 2019-10-30 · introduction...

18
Easy::Jit Just-In-Time compilation for C++ codes Serge Guelton Juan Manuel Martinez Caamaño (me) from Quarkslab

Upload: others

Post on 18-Mar-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::JitJust-In-Time compilation for C++ codes

Serge GueltonJuan Manuel Martinez Caamaño (me) from Quarkslab

Page 2: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Introduction

✔ Compiler-assisted library for runtime code generation

● Easy to understand C++ wrapper around the LLVM

✘ An omniscient virtual machine

✘ Read-Eval-Print Loop

✘ Building blocks for a Just-in-Time compiler

Page 3: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: by example

static void apply_filter(const char *mask, unsigned mask_size, unsigned mask_area,

cv::Mat &image, cv::Mat *&out) {

kernel(mask, mask_size, mask_area,

image.ptr(0,0), out->ptr(0,0),

image.rows, image.cols, image.channels());

}

Page 4: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: by example

static void apply_filter(const char *mask, unsigned mask_size, unsigned mask_area,

cv::Mat &image, cv::Mat *&out) {

kernel(mask, mask_size, mask_area,

image.ptr(0,0), out->ptr(0,0),

image.rows, image.cols, image.channels());

}

Page 5: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: by example

static void apply_filter(const char *mask, unsigned mask_size, unsigned mask_area,

cv::Mat &image, cv::Mat *&out) {

kernel(mask, mask_size, mask_area,

image.ptr(0,0), out->ptr(0,0),

image.rows, image.cols, image.channels());

}

Page 6: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

#include <easy/jit.h>

static void apply_filter(const char *mask, unsigned mask_size, unsigned mask_area,

cv::Mat &image, cv::Mat *&out) {

using namespace std::placeholder;

auto callme = easy::jit(kernel, mask, mask_size, mask_area,

_1, _2, image.rows, image.cols, image.channels());

callme(image.ptr(0,0), out->ptr(0,0));

}

Easy::Jit: by example

Page 7: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

#include <easy/code_cache.h>

static void apply_filter(const char *mask, unsigned mask_size, unsigned mask_area,

cv::Mat &image, cv::Mat *&out) {

using namespace std::placeholder;

static easy::Cache<> cache;

auto const& callme = cache.jit(kernel, mask, mask_size, mask_area,

_1, _2, image.rows, image.cols, image.channels());

callme(image.ptr(0,0), out->ptr(0,0));

}

Easy::Jit: by example

Page 8: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

How?

Page 9: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Internals

1. Parse calls to easy::jit and embed bitcode

Page 10: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Internals

2. Associate function pointers with bitcode

Page 11: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Internals

3. Recover the bitcode using the function pointer, specialize, apply classical optimizations

Page 12: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Internals

4. Generate code

Page 13: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Internals

5. Wrap in an opaque object

Page 14: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: The numbers

Page 15: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Final words

Page 16: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Stuff not mentioned

● Serialization / Deserialization on standard streams

● Inlining of function

● Composition of generated code

● Devirtualization of virtual method calls

Page 17: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Easy::Jit: Contribute!

● C API (work started)

● Cache: Threading + Persistency

● Member functions and function objects

● Partial Evaluationvoid eval(AST* ast, int variables[]);

...

auto program = easy::jit(eval, my_ast, _1);

program(var_values)

Page 18: Easy::Jit - LLVMllvm.org/devmtg/2018-04/slides/Caamano-Easy_Jit.pdf · 2019-10-30 · Introduction Compiler-assisted library for runtime code generation Easy to understand C++ wrapper

Contribute!github.com/jmmartinez/easy-just-in-time

Merci Quarkslab :)