-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Lecture: resurrect LLVM-IR lesson (#264)
Hatten wir früher mal als Überblick über LLVM-IR - da @bcg7 dieses Jahr wieder so einen Überblick geben will, sollte das File aus den Tiefen der Git-Historie wieder rausgefischt und im Readme.md verlinkt werden. Dann kann @bcg7 darauf weiter arbeiten. closes #263 --------- Co-authored-by: B.C. George <bc.george@fh-bielefeld.de>
- Loading branch information
Showing
8 changed files
with
251 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
digraph "CFG for 'f' function" { | ||
label="CFG for 'f' function"; | ||
|
||
Node0x55c39ee69b80 [shape=record,color="#b70d28ff", style=filled, fillcolor="#b70d2870",label="{bb:\l %i = icmp sgt i64 %arg, %arg1\l br i1 %i, label %bb2, label %bb4\l|{<s0>T|<s1>F}}"]; | ||
Node0x55c39ee69b80:s0 -> Node0x55c39ee69c30; | ||
Node0x55c39ee69b80:s1 -> Node0x55c39ee69ca0; | ||
Node0x55c39ee69c30 [shape=record,color="#3d50c3ff", style=filled, fillcolor="#f59c7d70",label="{bb2: \l %i3 = add nsw i64 1, 20\l br label %bb6\l}"]; | ||
Node0x55c39ee69c30 -> Node0x55c39ee6a4b0; | ||
Node0x55c39ee69ca0 [shape=record,color="#3d50c3ff", style=filled, fillcolor="#f59c7d70",label="{bb4: \l %i5 = add nsw i64 1, %arg1\l br label %bb6\l}"]; | ||
Node0x55c39ee69ca0 -> Node0x55c39ee6a4b0; | ||
Node0x55c39ee6a4b0 [shape=record,color="#b70d28ff", style=filled, fillcolor="#b70d2870",label="{bb6: \l %.0 = phi i64 [ %i3, %bb2 ], [ %i5, %bb4 ]\l ret i64 %.0\l}"]; | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
<mxfile host="app.diagrams.net" modified="2021-11-26T19:58:32.678Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36" etag="8XtzKbfFfksSlM463IJs" version="15.8.6" type="device"><diagram id="m6JEGxdE_mDFu569vAXz" name="Page-1">3ZnbjpswEIafhptKrQBjApcle5RaqVJ60O5N5YAJbowdOaZJ9ulrFudA7G1TFRK6VzH/GIO/Gc8YxwHjcn0r0KL4yDNMHd/N1g64cnzfC7xY/dTKplFGftgIM0Ey3WkvTMgT1qKr1YpkeNnqKDmnkizaYsoZw6lsaUgIvmp3yzltP3WBZtgQJimipvqNZLLQqhfGe8MdJrNCPzryR42hRNvOeibLAmV8dSCBaweMBeeyaZXrMaY1vC2X5r6bF6y7FxOYyVNuKB7v0yfP/fIUx9Xy4cfdQ/zdfatH+YlopSesX1ZutgQEr1iG60E8BySrgkg8WaC0tq6Uz5VWyJJqMxKp9mGgrnJC6ZhTLp5HAnmU4jRV+lIKPscHlmkEA+gqi34dLCRevzhPb0dPhR3mJZZio7psbxhp4DrifFdfrw78F8FGKw5c5we6I9IxM9uNvceqGprsX1AGBmW1UCpqoFaTlm2ebVKMM3yEVUuIkhlTl6mChJWe1AiJCuP32lCSLKsfY3Xg3sUd+WC3fH/nA9fiA9CXC4LeAh12FLbREbKRBVloQeaFfTGDJjOY3FRsLglnywzPKRKobjvw6s2/4ewCYOy/gy2EAFoQbhf5WaJuZCN4S/m0ri+++xUJgqaqOVB+3qX5RQa/PbzJppzyuvV6k+ixQ6w5wT2nQ+I/pIScMDLkjBBfOqI9c8f1SDAlLOeifE6mmHVVmXzQU2kCJ5am3iiCsLdyHpr71gzhKLfuW8M0wtO8G8rgmHIAT9wAwN4wm/Vru9Zfb9oNjveuNj+cde8KzDKosu57MavKek5DSLWBa9YqCzb/nKkWWItVgpYkVWpCeTofKDsAL81uWxMP2F2z5q0bcAOE5l0cWn+nKbaqBHGUBbaqFPlTEIbdcIbHpymn1n4v7g2zb2BuL+pXW5pC9wRnnPdYxTza+oCm2DzaOnd+gMbe3w8tsM6bHyyHUDC5Zyoaq/lgvppMciC4ODnzKOozFiVhSKrlOkBi0cWJWb6QYPKpIEr7DyLOdl7cET91uf/T5dl28NcVuP4F</diagram></mxfile> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
<mxfile host="app.diagrams.net" modified="2021-11-26T15:10:46.196Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36" etag="FL98ZvHm7KTgNXDTDXKF" version="15.8.6" type="device"><diagram id="Q6zoeQBmvapHs_SZyqo1" name="Page-1">5Vpdc6IwFP01PtYBAiqPVdvdfejUaXf24zGFKBkDYUKsur9+EwkKxC5sB421Lw65CYGce07uvYYemMSbLwym0QMNEek5VrjpgWnPcQbuSPxKwzY3+IVhwXCYm+yD4Rn/QcpoKesKhyirDOSUEo7TqjGgSYICXrFBxui6OmxOSfWpKVwgzfAcQKJbf+KQR8pqD/xDx1eEF5F69MgZ5h0xLAarlWQRDOm6ZAJ3PTBhlPL8Kt5MEJHYFbjk992/0bt/MYYS3uYGPp1ZKfZv5y8wpd/dH/Qpc2/ULK+QrNSC1cvybYHAOsIcPacwkO21cHIPjCMeE9GyxSXM0hz3Od4g8aixmhExjjZvvqq9B0AQB9EYcbYVQ4obXIWZIg0YqPb64ILCFJXAL2xQOX2xn/mAi7hQ0PwHTI4G0z2jCUdJqMElVs2rCGWc0SWaUEKZsCQ0ESPHc0xIzQQJXiSiGQiUkLCPJYZYUPFWdcQ4DOVjxsdcwugqCaUDptaJnDD0WjkBnMoJoJmrwiG3UvQSRQKzDAdVV1RBEkCw7a9y47ds9L2iOd2UO6fbCrgo1HaOGrTi1eiKBegfa1KQcsgWiDfpVHdVyRXeEVcUNoYI5Pi1+rrH/KOeMKNYLOTABKvGBL/m4nyZ6q7yFlSbCIDqRG5dsDkO2kQ7uuyX/X4GeRqDYoiTfqDxSOzVKdopk7+ltxKrXmCwXOyo9bjiBEsx7+whZMtHcRfmO+b0LUmsLA9xttONSr3mndLzzrhTDjoX6QbzX6pHXpckKloHhcpGIdALEHaRqzQJe2RS2M6oI2E79VhRn+jEwh5prPv2dL2R2bFHjZHZOWdkLpJ1s6rvUL1mVTmoute13qtKr8aTM6vS1quLmfC8Ro2q6xuCbRf6qeNyRD/grPrR64urjJrNaS4wGw4b9NI6z7UMC08vla45HmpwG4+H7iXoucN4aFaXwOsoIALXsC71AvQiAqKGi/GAOLwEAV1CQDSaiYJhVwHRNyy8z1UganAbD4j+59BzcyAdtRR+6YjIgPBdt6OI6wKzwnf0fybGMFgeO7gxcM7lXtw514cuRHetGWJYgCF34a7Fa1iTTkea9GqnMG01KbwOt6VhqRyQnUS1ev36ALMgwglKAhqi643cmm+ORG7/nJHbaVHKFqdlwYqR7ZjJ/ZU31y0H7PIWF+KgEvEbv6sT7EEVTNdqlwadbnvV678Jgcnievls184nXaC7wD0rn/VK4MPwGdhWHzjV/QG4fWvYitWOZfeLPzi7h1VP8GnKr5fXwNJcYZzaQM91Pw61PVDltaNnwkdJXc9dukNTP7wi5DW+CSi74vxD/0LnyEdfg05I3ZPf0BUfP+aZ4+ELUnD3Fw==</diagram></mxfile> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,234 @@ | ||
--- | ||
archetype: lecture-bc | ||
title: "LLVM als IR" | ||
author: "BC George (HSBI)" | ||
readings: | ||
- key: "LLVM-org" | ||
- key: "LLVM-doc" | ||
outcomes: | ||
- k1: "Konzept von LLVM" | ||
- k1: "Module von LLVM" | ||
- k1: "SSA" | ||
attachments: | ||
- link: "https://raw.githubusercontent.com/Compiler-CampusMinden/AnnotatedSlides/master/llvm-ir.ann.ba.pdf" | ||
name: "Annotierte Folien: LLVM-IR" | ||
--- | ||
|
||
|
||
# Motivation | ||
|
||
::: slides | ||
## Motivation | ||
::: | ||
|
||
Es ist ein neuer Prozessor entwickelt worden mit einem neuen Befehlssatz, und es | ||
sollen für zwei Programmiersprachen Compiler entwickelt werden, die diesen Befehlssatz | ||
als Ziel haben. | ||
|
||
Was tun? | ||
|
||
|
||
## Thema für heute: *Ein* Zwischencodeformat für verschiedene Programmiersprachen und Prozessoren | ||
|
||
:::notes | ||
Hier entsteht ein Tafelbild. | ||
::: | ||
|
||
|
||
|
||
# LLVM - Ein Überblick | ||
|
||
## Was ist LLVM? | ||
|
||
* **ursprünglich**: **L**ow **L**evel **V**irtual **M**achine | ||
* Open-Source-Framework | ||
* zur modularen Entwicklung von Compilern u. ä. | ||
* für Frontends für beliebige Programmiersprachen | ||
* für Backends für beliebige Befehlssatzarchitekturen | ||
|
||
"Macht aus dem Zwischencode LLVR IR automatisch Maschinencode oder eine VM." | ||
|
||
## Kernstücke des LLVM: | ||
|
||
* ein virtueller Befehlssatz | ||
* ein virtuelle Maschine | ||
* LLVM IR: eine streng typisierte Zwischensprache | ||
* ein flexibel konfigurierbarer Optimierer | ||
* ein Codegenerator für zahlreiche Architekturen | ||
* LMIR: mit Dialekten des IR arbeiten | ||
|
||
|
||
## Was kann man damit entwickeln? | ||
|
||
* Debugger | ||
* JIT-Systeme (virtuelle Maschine) | ||
* AOT-Compiler | ||
* virtuelle Maschinen | ||
* Optimierer | ||
* Systeme zur statischen Analyse | ||
* etc. | ||
|
||
mit entkoppelten Komponenten, die über APIs kommunizieren (Modularität) | ||
|
||
|
||
## Wie arbeitet man damit? | ||
|
||
* (mit Generatoren) ein Frontend entwickeln, das Programme über einen AST in | ||
LLVM IR übersetzt | ||
* mit LLVM den Zwischencode optimieren | ||
* mit LLVM Maschinencode oder VM-Code generieren | ||
|
||
|
||
## Was bringt uns das? | ||
|
||
*n* Sprachen für *m* Architekturen übersetzen: | ||
|
||
* *n* Frontends entwickeln | ||
* Optimierungen spezifizieren | ||
* *m* Codegeneratoren spezifizieren | ||
|
||
|
||
statt *n x m* Compiler zu schreiben. | ||
|
||
|
||
|
||
## Wer setzt LLVM ein? | ||
|
||
Adobe\ \ \ AMD\ \ \ Apple\ \ \ ARM\ \ \ Google | ||
|
||
IBM\ \ \ \ Intel\ \ \ \ Mozilla\ \ \ Nvidia\ \ \ Qualcomm | ||
|
||
Samsung\ \ \ \ ... | ||
|
||
|
||
|
||
## Externe LLVM-Projekte | ||
|
||
Für folgende Sprachen gibt es Compiler oder Anbindungen an LLVM (neben Clang): | ||
\bigskip | ||
|
||
Crack\ \ \ Go\ \ \ Haskell\ \ \ Java\ \ \ Julia\ \ \ Kotlin | ||
|
||
Lua\ \ \ Numba\ \ \ Python\ \ \ Ruby\ \ \ Rust\ \ \ Swift\ \ \ ... | ||
|
||
\bigskip | ||
|
||
Für weitere Projekte siehe [Projects built with LLVM](https://llvm.org/ProjectsWithLLVM/) | ||
|
||
|
||
## Unterstützte Prozessorarchitekturen | ||
|
||
x86\ \ \ AMD64\ \ \ PowerPC\ \ \ PowerPC 64Bit\ \ \ Thumb | ||
|
||
|
||
SPARC\ \ \ Alpha\ \ \ CellSPU\ \ \ PIC16\ \ \ MIPS | ||
|
||
|
||
MSP430\ \ \ System z\ \ \ XMOS\ \ \ Xcore\ \ \ ... | ||
|
||
|
||
|
||
# Einige Komponenten von LLVM | ||
|
||
## Einige Komponenten (Projekte) von LLVM | ||
|
||
* Der LLVM-Kern incl. Optimierer | ||
* MLIR für IR-Dialekte | ||
* Der Compiler Clang | ||
* Die Compiler-Runtime-Bibliothek | ||
|
||
## Der LLVM-Kern | ||
|
||
**LLVM Core**: Optimierer und Codegenerator für viele CPU- und auch GPU-Architekturen | ||
|
||
* Optimierer arbeitet unabhängig von der Zielarchitektur (nur auf der LLVM IR) | ||
* sehr gut dokumentiert | ||
* verwendete Optimierungspässe fein konfigurierbar | ||
* Optimierer auch einzeln als Tool `opt` aufrufbar | ||
* wird für eigene Sprachen als Optimierer und Codegenerator eingesetzt | ||
|
||
|
||
## Wozu ein Optimierer? | ||
|
||
* zur Reduzierung der Codegröße | ||
* zur Generierung von möglichst schnellem Code | ||
* Zur Generierung von Code, der möglichst wenig Energie verbraucht | ||
|
||
|
||
# Allgegenwärtig in LLVM: Der Optimierer | ||
|
||
## Der Optimierer in LLVM | ||
|
||
* Teil von LLVM Core | ||
* kann zur Compilezeit, Linkzeit und Laufzeit eingesetzt werden | ||
* nutzt auch Leerlaufzeit des Prozessors | ||
* läuft in einzelnen unabhängig konfigurierbaren Pässen über den Code | ||
|
||
|
||
## Einige Optimierungen in LLVM | ||
|
||
* Dead Code Elimination | ||
* Aggressive Dead Code Elimination | ||
* Dead Argument Elimination | ||
* Dead Type Elimination | ||
* Dead Instruction Elimination | ||
* Dead Store Elimination | ||
* Dead Global Elimination | ||
|
||
|
||
## MLIR | ||
|
||
* Framework zur Definition eigener Zwischensprachendialekte | ||
* zur high-level Darstellung spezieller Eigenschaften der zu übersetzenden Sprache | ||
* erleichtert die Umsetzung des AST in Zwischencode | ||
* z. B. für domänenspezifische Sprachen (DSLs) | ||
* z. B. für bestimmte Hardware | ||
* mehrere Abstraktionen gleichzeitig benutzbar | ||
|
||
|
||
|
||
|
||
## Der Compiler Clang | ||
|
||
**Clang**: schneller C/C++/Objective-C - Compiler auf Basis von LLVM mit aussagekräftigen | ||
Fehlermeldungen und Warnungen | ||
|
||
![](./images/opt_chain.png) | ||
|
||
## Die Sanitizer in der Compiler-Runtime-Bibliothek | ||
|
||
Sanitizer: Methoden zur Instrumentierung (Code der in das kompilierte Programm eingebettet wird) zur Erleichterung der Lokalisierung und Analyse verschiedenster Fehlerquellen, z. B.: | ||
|
||
* Speicherfehler und Speicherlecks (z. B. use-after-free) | ||
* Race Conditions | ||
* undefiniertes Verhalten (Overflows, Benutzung von Null-Pointern) | ||
* Benutzung von nicht-initialisierten Variablen | ||
|
||
|
||
# Wrap-Up | ||
|
||
::: slides | ||
## Wrap-Up | ||
::: | ||
|
||
LLVM ist eine (fast) komplette Infrastruktur zur Entwicklung von Compilern | ||
und compilerähnlichen Programmen. | ||
|
||
Die wichtigsten Bestandteile: | ||
|
||
* der Zwischencode LLVM IR | ||
* der LLVM Optimierer | ||
* der Codegenarator mit Sanitizern | ||
|
||
|
||
|
||
|
||
|
||
|
||
<!-- DO NOT REMOVE - THIS IS A LAST SLIDE TO INDICATE THE LICENSE AND POSSIBLE EXCEPTIONS (IMAGES, ...). --> | ||
::: slides | ||
## LICENSE | ||
![](https://licensebuttons.net/l/by-sa/4.0/88x31.png) | ||
|
||
Unless otherwise noted, this work is licensed under CC BY-SA 4.0. | ||
::: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters