This shows you the differences between two versions of the page.
cpl:labs:llvm-pass [2015/11/23 11:28] laura.vasilescu [Rularea unui Pass] |
cpl:labs:llvm-pass [2015/12/08 00:32] (current) irina.presa [Integrarea unui pas în LLVM] |
||
---|---|---|---|
Line 73: | Line 73: | ||
Vom rula pass-ul default hello pe un cod simplu. | Vom rula pass-ul default hello pe un cod simplu. | ||
- | Codul sursă al pass-ului Hello din LLVM se găsește în directorul ''$LLVM_SRC/lib/Transforms/Hello''. | + | Codul sursă al pass-ului Hello din LLVM se găsește în directorul ''$LLVM_SRC/lib/Transforms/Hello''. Vizualizați codul sursă și makefile-ul. Pentru detalii suplimentare consultați [[http://llvm.org/docs/WritingAnLLVMPass.html|pagina de manual]]. |
După cum ați observat anterior, acesta nu este găsit by default de către tool-ul ''opt''. Va trebui să îi specificăm calea către biblioteca dinamică compilată. | După cum ați observat anterior, acesta nu este găsit by default de către tool-ul ''opt''. Va trebui să îi specificăm calea către biblioteca dinamică compilată. | ||
Line 125: | Line 125: | ||
</code> | </code> | ||
+ | ==== Integrarea unui pas în LLVM ==== | ||
+ | |||
+ | Pentru a nu mai fi nevoiți să specificăm biblioteca dinamică la runtime, aceasta trebuie să fie integrată în codul utilitarelor ''opt'' și ''bugpoint''. Pentru a realiza acest lucru, trebuie să modificăm [[http://llvm.org/docs/WritingAnLLVMPass.html#quickstart|exemplul]] dat în **sursele** de LLVM astfel: | ||
+ | * ''lib/Transforms/Hello/Makefile'' | ||
+ | * se şterge: **LOADABLE_MODULE = 1** | ||
+ | * și se adaugă: **BUILD_ARCHIVE = 1** | ||
+ | * ''tools/opt/CMakeLists.txt'' | ||
+ | * se adaugă noul pass în lista | ||
+ | * **set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} Analysis CodeGen Hello)** | ||
+ | * la fel și pentru ''tools/bugpoint/CMakeLists.txt'' | ||
+ | * se crează fişierul ''include/llvm/Transforms/Hello.h'' cu conţinutul | ||
+ | * <code c> | ||
+ | #ifndef LLVM_TRANSFORMS_HELLO_H | ||
+ | #define LLVM_TRANSFORMS_HELLO_H | ||
+ | namespace llvm { | ||
+ | class FunctionPass; | ||
+ | FunctionPass *createHelloPass(); | ||
+ | } | ||
+ | #endif | ||
+ | </code> | ||
+ | * se creeaza fișierul ''lib/Transforms/Hello/LLVMBuild.txt'' după formatul din [[http://llvm.org/docs/CommandGuide/llvm-build.html|sistemul de build]] llvm. | ||
+ | * ex: <code bash> | ||
+ | [component_0] | ||
+ | type = Library | ||
+ | name = Hello | ||
+ | parent = Transforms | ||
+ | library_name = hello | ||
+ | required_libraries = Analysis Support | ||
+ | </code> | ||
+ | * se updatează și fișierul LLVMBuild.txt din directorul părinte pentru a include sub-directorul ''Hello''. | ||
+ | * ''lib/Transforms/Hello/CMakeLists.txt'' | ||
+ | * se şterge **add_llvm_loadable_module( LLVMHello Hello.cpp )** | ||
+ | * și se adaugă | ||
+ | * **add_llvm_library( LLVMHello Hello.cpp )** | ||
+ | * ''lib/Transforms/Hello/Hello.cpp'' | ||
+ | * se include | ||
+ | * **llvm/Transforms/Hello.h** | ||
+ | * se adaugă | ||
+ | *<code c> | ||
+ | FunctionPass* llvm::createHelloPass() | ||
+ | { | ||
+ | return new Hello(); | ||
+ | } | ||
+ | </code> | ||
+ | * ''include/llvm/LinkAllPasses.h'' | ||
+ | * se include **llvm/Transforms/Hello.h** | ||
+ | * și se adaugă | ||
+ | *<code c> | ||
+ | (void) llvm::createHelloPass(); | ||
+ | </code> | ||
+ | * se creeaza un director nou în care vor fi compilate sursele. De exemplu dacă sursele se află în directorul **llvm-3.3.src** și am creat pe același nivel directorul **llvm**, executăm din **interiorul directorului nou creat** comanda | ||
+ | *<code bash> | ||
+ | cmake -G "Unix Makefiles" ../llvm-3.3.src | ||
+ | </code> | ||
+ | * urmată de comanda <code bash> make </code> |