Skip to content

Commit

Permalink
Lecture: resurrect LLVM-IR lesson (#264)
Browse files Browse the repository at this point in the history
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
cagix and bcg7 authored Nov 27, 2024
1 parent 603663e commit a694a5d
Show file tree
Hide file tree
Showing 8 changed files with 251 additions and 2 deletions.
12 changes: 12 additions & 0 deletions lecture/04-intermediate/images/func_cfg.dot
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}"];
}
Binary file added lecture/04-intermediate/images/func_cfg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lecture/04-intermediate/images/hierarchy.drawio
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>
Binary file added lecture/04-intermediate/images/hierarchy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lecture/04-intermediate/images/opt_chain.drawio
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>
Binary file added lecture/04-intermediate/images/opt_chain.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
234 changes: 234 additions & 0 deletions lecture/04-intermediate/llvm-ir.md
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.
:::
5 changes: 3 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ Abgabe der Übungsblätter jeweils **Montag bis 09:00 Uhr** im [ILIAS](https://w
| | 46 | 13.: [Überblick Symboltabellen], [Symboltabellen: Scopes], [Symboltabellen: Funktionen], [Symboltabellen: Klassen] | Carsten | 11.: [B03] ANTLR | 11. / 12. / 15. (Carsten, *online*) |
| | 47 | 20.: [**A-L: 09:45 - 10:30 Uhr, M-Z: 10:45 - 11:30 Uhr (B40): Parcoursprüfung: Station 1 ILIAS (Grammar, Lexing, Parsing), siehe Ankündigung**]{.alert} | | 18.: [B04] Semantische Analyse | 18. / 19. / 22. (Carsten, *online*) |
| | 48 | 26.: **18:00 - 19:30 Uhr (online): Edmonton II: Vorträge Mindener Projekte** | _Minden_ | | |
| | 48 | 27.: [Überblick Zwischencode], Überblick Backend (LLVM) | BC, Carsten | | |
| | 48 | 27.: [Überblick Zwischencode], [Überblick Backend (LLVM)] | BC, Carsten | | |
| Dezember | 49 | 03.: **18:00 - 19:30 Uhr (online): Edmonton III: Vorträge Edmontoner Projekte** | _Edmonton_ | | |
| | 49 | 04.: [AST-basierte Interpreter 1], [AST-basierte Interpreter 2] | Carsten | | |
| | 50 | 11.: C++ I: [Basics], [Pointer & Referenzen], [Klassen], [Big 3] | Carsten | 09.: [B05] Interpreter | 09. / 10. / 13. (Carsten, *online*) |
Expand Down Expand Up @@ -337,7 +337,7 @@ Abgabe der Übungsblätter jeweils **Mittwoch bis 09:00 Uhr** im [ILIAS](https:/
| | 13. | [Überblick Symboltabellen], [Symboltabellen: Scopes], [Symboltabellen: Funktionen], [Symboltabellen: Klassen] | Carsten | [B03] ANTLR (Carsten, *online*) |
| | 20. | | | |
| | 26. | **18:00 - 19:30 Uhr (online): Edmonton II: Vorträge Mindener Projekte** | _Minden (S5)_ | |
| | 27. | [Überblick Zwischencode], Überblick Backend (LLVM) | BC, Carsten | [**Parcoursprüfung: Station 1: Vorstellung der Lösung von [B04x] (online, 3 Teams, siehe Ankündigung)**]{.alert} |
| | 27. | [Überblick Zwischencode], [Überblick Backend (LLVM)] | BC, Carsten | [**Parcoursprüfung: Station 1: Vorstellung der Lösung von [B04x] (online, 3 Teams, siehe Ankündigung)**]{.alert} |
| Dezember | 03. | **18:00 - 19:30 Uhr (online): Edmonton III: Vorträge Edmontoner Projekte** | _Edmonton_ | |
| | 04. | [AST-basierte Interpreter 1], [AST-basierte Interpreter 2] | Carsten | [**Parcoursprüfung: Station 1: Vorstellung der Lösung von [B04x] (online, 2 Teams, siehe Ankündigung)**]{.alert} |
| | 11. | C++ I: [Basics], [Pointer & Referenzen], [Klassen], [Big 3] | Carsten | [B05x] Interpreter (Carsten, *online*) |
Expand Down Expand Up @@ -378,6 +378,7 @@ Abgabe der Übungsblätter jeweils **Mittwoch bis 09:00 Uhr** im [ILIAS](https:/
[Symboltabellen: Klassen]: lecture/03-semantics/symbtab3-classes.md

[Überblick Zwischencode]: lecture/04-intermediate/intro-ir.md
[Überblick Backend (LLVM)]: lecture/04-intermediate/llvm-ir.md

<!-- [Syntaxgesteuerte Interpreter]: lecture/06-interpretation/syntaxdriven.md -->
[AST-basierte Interpreter 1]: lecture/06-interpretation/astdriven-part1.md
Expand Down

0 comments on commit a694a5d

Please sign in to comment.