Ich habe versucht, LLVM IR mit Python auszugeben

Python hat ein Paket namens llvmlite, das sehr nützlich war! LLVM IR kann einfach ausgegeben werden! Ich denke, es ist ein großartiger erster Schritt für LLVM.

Deshalb werde ich versuchen, "llvmlite zu installieren" - "es ein wenig zu versuchen"!

Umgebung

Ich habe Ubuntu unter Windows 7 mit VirtualBox virtualisiert und installiert. Grundsätzlich funktioniert es, wenn es sich um eine von Ubuntu abgeleitete Distribution handelt. Tatsächlich habe ich Linux Mint 17.3 (Cinnamon 64bit) mit dem gleichen Verfahren installiert, aber es funktioniert einwandfrei.

Bereiten Sie mit apt-get vorerst vor, was Sie brauchen

Bereiten Sie die Erstellung von LLVM und die Vorbereitung der Python 3-Entwicklungsumgebung vor.

$ sudo apt-get install build-essential cmake python3-dev python3-pip python3-setuptools zlib1g-dev libtool

Erstellen Sie LLVM

Von der Website herunterladen

llvmlite erfordert LLVM 3.6. Sie können es mit apt-get erhalten, aber ich möchte das Installationsverzeichnis selbst verwalten, also erstelle ich es selbst.

$ wget http://llvm.org/releases/3.6.2/llvm-3.6.2.src.tar.xz

Bauen

Ich benutze gerne cmake. Das Erstellen von LLVM dauert eine Weile. Warten Sie also geduldig. (Verwenden Sie make -j4 für den parallelen Build.)

$ tar xvf llvm-3.6.2.src.tar.xz
$ cd llvm-3.6.2.src
$ mkdir build
$ cd build
$ cmake -D CMAKE_INSTALL_PREFIX=/usr/local/llvm-3.6 ..
$ make
$ sudo make install

bashrc Einstellungen

Machen Sie es auf dem Weg zu LLVM

export LLVM_HOME=/usr/local/llvm-3.6
export PATH=${LLVM_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${LLVM_HOME}/lib:${LD_LIBRARY_PATH}
export LLVM_CONFIG=${LLVM_HOME}/bin/llvm-config

#Stellen Sie auch den C-Include-Pfad für alle Fälle ein
export C_INCLUDE_PATH=${LLVM_HOME}/include:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=${LLVM_HOME}/include:${CPLUS_INCLUDE_PATH}

prüfen

$ llvm-config --version
3.6.2

Installieren Sie llvmlite

Bereiten Sie die Python-Bibliothek vor

Installieren Sie, was Sie wahrscheinlich benötigen. Einige können unnötig sein. Die Python-Bibliothek ist apt-get, pip und es gibt verschiedene Installationsmethoden. Nur scipy und matplotlib konnten nicht mit pip gemacht werden, also habe ich es mit apt-get installiert.

$ sudo -E pip3 install numpy
$ sudo apt-get install python3-scipy python3-matplotlib
$ sudo -E pip3 install pandas statsmodels sympy

Installieren Sie llvmlite

Installieren Sie llvmlite schnell mit pip

$ sudo -E pip3 install llvmlite

Das ist es!

Versuch

Probelauf

Probieren wir es aus! Wenn Sie die folgende Python-Datei ausführen können, funktioniert es!

Unten ist ein Beispiel, das ich entsprechend gemacht habe.

Stichprobe

from ctypes import CFUNCTYPE, c_int

import llvmlite.ir as ll
import llvmlite.binding as llvm

"""
Machen Sie dies mit LLVM IR.
def func(x, y):
    a = x
    b = y
    c = 1000
    d = a
    return a + b + c + d
"""

#Initialisieren
llvm.initialize()
llvm.initialize_native_target()
llvm.initialize_native_asmprinter()

i32 = ll.IntType(32)

# int func(int, int)
fnty = ll.FunctionType(i32, [i32, i32])
module = ll.Module()
func = ll.Function(module, fnty, name="func")
bb_entry = func.append_basic_block()

builder = ll.IRBuilder()
builder.position_at_end(bb_entry)

#Argument x, y
x, y = func.args

#Variable a,b,c,Definieren Sie d
ptr_a = builder.alloca(i32)
ptr_b = builder.alloca(i32)
ptr_c = builder.alloca(i32)
ptr_d = builder.alloca(i32)

# store
builder.store(x, ptr_a)
builder.store(y, ptr_b)
builder.store(ll.Constant(i32, 1000), ptr_c)

# load
a = builder.load(ptr_a)
b = builder.load(ptr_b)
c = builder.load(ptr_c)

#Auch speichern
builder.store(a, ptr_d)

#Hinzufügen und zurückgeben
ret1 = builder.add(a, b, name="res")
ret2 = builder.add(ret1, c, name="res2")
ret3 = builder.add(ret2, builder.load(ptr_d), name="res3")
builder.ret(ret3)

llvm_ir = str(module)
llvm_ir_parsed = llvm.parse_assembly(llvm_ir)

print("== LLVM IR ====================")
print(llvm_ir_parsed)

# pass
pmb = llvm.create_pass_manager_builder()
pmb.opt_level = 1
pm = llvm.create_module_pass_manager()
pmb.populate(pm)

pm.run(llvm_ir_parsed)

print("== LLVM IR(opt) ===============")
print(llvm_ir_parsed)

target_machine = llvm.Target.from_default_triple().create_target_machine()

print("== Result =====================")
with llvm.create_mcjit_compiler(llvm_ir_parsed, target_machine) as ee:
    ee.finalize_object()
    cfptr = ee.get_function_address("func")

    cfunc = CFUNCTYPE(c_int, c_int, c_int)(cfptr)
    res = cfunc(100, 2)

    print("res: " + str(res))

Ausführungsergebnis

== LLVM IR ====================
; ModuleID = '<string>'
target triple = "unknown-unknown-unknown"

define i32 @func(i32 %.1, i32 %.2) {
.4:
  %.5 = alloca i32
  %.6 = alloca i32
  %.7 = alloca i32
  %.8 = alloca i32
  store i32 %.1, i32* %.5
  store i32 %.2, i32* %.6
  store i32 1000, i32* %.7
  %.12 = load i32* %.5
  %.13 = load i32* %.6
  %.14 = load i32* %.7
  store i32 %.12, i32* %.8
  %res = add i32 %.12, %.13
  %res2 = add i32 %res, %.14
  %.16 = load i32* %.8
  %res3 = add i32 %res2, %.16
  ret i32 %res3
}

== LLVM IR(opt) ===============
; ModuleID = '<string>'
target triple = "unknown-unknown-unknown"

; Function Attrs: nounwind readnone
define i32 @func(i32 %.1, i32 %.2) #0 {
.4:
  %factor = shl i32 %.1, 1
  %res2 = add i32 %.2, 1000
  %res3 = add i32 %res2, %factor
  ret i32 %res3
}

attributes #0 = { nounwind readnone }

== Result =====================
res: 1202

Betrachtet man LLVM IR (opt). Sie können sehen, dass es kein nutzloses Teil wie Geschäft gibt.

example Es gibt auch ein Beispiel für den ursprünglichen Github, auf den Sie sich beziehen können. https://github.com/numba/llvmlite

andere Referenzen

Die LLVM-Kopffamilie hat ein Tutorial namens Kaleidoskop. Das Folgende ist eine Implementierung mit llvmlite, was sehr hilfreich ist, daher werde ich es vorstellen.

https://github.com/eliben/pykaleidoscope

Recommended Posts

Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, Python zu berühren (Installation)
Ausgabe in eine CSV-Datei mit Python
Ich habe versucht, WebScraping mit Python.
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Geben Sie Farbzeichen mit Python zu hübsch aus
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, PLSA in Python 2 zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich wollte ABC160 mit Python lösen
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich wollte ABC172 mit Python lösen
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen