This shows you the differences between two versions of the page.
cpl:labs:09 [2016/12/04 21:51] bogdan.nitulescu [LLVM pass] |
cpl:labs:09 [2016/12/06 23:02] (current) bogdan.nitulescu [Ex.3 - Loops (3p)] |
||
---|---|---|---|
Line 235: | Line 235: | ||
<code bash> | <code bash> | ||
- | student@cpl-vm ~/llvm-3.6.2 $ opt -load llvm-3.6.2/install/lib/LLVMHello.so --help | + | student@cpl-vm ~/llvm-3.6.2 $ opt -load llvm-3.8.0/lib/LLVMHello.so --help |
OVERVIEW: llvm .bc -> .bc modular optimizer and analysis printer | OVERVIEW: llvm .bc -> .bc modular optimizer and analysis printer | ||
Line 339: | Line 339: | ||
====== Exerciții de laborator ======= | ====== Exerciții de laborator ======= | ||
- | + | {{:cpl:labs:lab09.zip|Arhiva}} laboratorului. | |
- | ==== Ex.1 - Mem2Reg. Constant Propagation. Deadcode Elimination ==== | + | ==== Ex.1 - Mem2Reg. Constant Propagation. Deadcode Elimination (3p) ==== |
Intrati in folderul 'ex1' din arhiva de laborator. | Intrati in folderul 'ex1' din arhiva de laborator. | ||
Line 348: | Line 348: | ||
La fiecare pas treceti fisierul optimizat in forma human readable si observati schimbarile fata de fisierul anterior. (Hint: folositi llvm-dis) | La fiecare pas treceti fisierul optimizat in forma human readable si observati schimbarile fata de fisierul anterior. (Hint: folositi llvm-dis) | ||
- | ==== Ex.2 - O3 ==== | + | ==== Ex.2 - O3 (3p) ==== |
Folosindu-va de acelasi fisier sursa (ex1.c), compilati pana la nivel LLVM IR, atat in forma human readable, cat si forma binara. | Folosindu-va de acelasi fisier sursa (ex1.c), compilati pana la nivel LLVM IR, atat in forma human readable, cat si forma binara. | ||
Line 356: | Line 356: | ||
Pass-urile executate, impreuna cu output-ul generat dupa fiecare optimizare se gaseste in fisierul passes.txt. | Pass-urile executate, impreuna cu output-ul generat dupa fiecare optimizare se gaseste in fisierul passes.txt. | ||
- | ==== Ex.3 - Loops ==== | + | ==== Ex.3 - Loops (3p) ==== |
Intrati in folder-ul ex.2 din arhiva de laborator. Compilati in cele 2 forme LLVM IR fisierul loops.c. | Intrati in folder-ul ex.2 din arhiva de laborator. Compilati in cele 2 forme LLVM IR fisierul loops.c. | ||
- | Faceti urmatoarele optimizari: mem2reg, simplifycfg, loops, loop-simplify, loop-rotate, loop-unroll. | + | Faceti urmatoarele optimizari: mem2reg, simplifycfg, loops, loop-rotate, loop-unroll. |
Observati modificarile. | Observati modificarile. | ||
==== Ex. 4 - LLVM pass (6p) ==== | ==== Ex. 4 - LLVM pass (6p) ==== | ||
Line 369: | Line 369: | ||
Rulati pass-ul ca folosind calea catre bilioteca dinamica compilata. | Rulati pass-ul ca folosind calea catre bilioteca dinamica compilata. | ||
+ | |||
+ | |||
+ | Cel mai simplu mod pentru a crea pass-ul este sa copiati folderul hello din \$PathToLLVMSrc/lib/Transforms/Hello in \$PathTooLLVMSrc/lib/Transforms/\$MyPass. | ||
+ | |||
+ | <code> | ||
+ | $PathToLLVMSrc/lib/Transforms/$MyPass/CMakeLists.txt | ||
+ | $PathToLLVMSrc/lib/Transforms/$MyPass/Makefile | ||
+ | $PathToLLVMSrc/lib/Transforms/CMakeLists.txt | ||
+ | </code> | ||
+ | |||
+ | Redenumiti \$PathToLLVMSrc/lib/Transforms/\$MyPass/Hello.exports in \$PathToLLVMSrc/lib/Transforms/\$MyPass/\$MyPass.exports | ||
+ | |||
+ | |||
+ | Mergeti in folderul de build. Pe calculatoarele din laborator este ~/cpl/build. Rulati | ||
+ | <code> | ||
+ | cmake $PathToLLVMSrc | ||
+ | </code> | ||
+ | Pentru calculatoarele din laborator acesta este | ||
+ | <code> | ||
+ | cmake ../llvm-3.8.0.src | ||
+ | </code> | ||
+ | |||
+ | Apoi rulati make in folderul nou create din ~/cpl/build/lib/Transforms/$MyPass. | ||
+ | |||
+ | Trebuie sa rerulati cmake si make pentru fiecare modificare pe care o faceti in sursa pass-ului vostru. | ||
+ | Pass-ul compilat sub forma de biblioteca dinamica se va gasi in ~/cpl/build/lib. | ||
+ | |||
Hints: | Hints: |