This shows you the differences between two versions of the page.
|
cpl:labs:09 [2016/12/04 21:45] bogdan.nitulescu [Ex.2 - O3] |
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.bc. | + | 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. | ||
| - | ==== LLVM pass ==== | + | ==== Ex. 4 - LLVM pass (6p) ==== |
| Folosindu-va de modelul pass-ului Hello world explicat mai sus, scrieți un LLVM pass pentru a afișa: | Folosindu-va de modelul pass-ului Hello world explicat mai sus, scrieți un LLVM pass pentru a afișa: | ||
| 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: | ||