Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpl:labs:llvm-pass [2015/11/23 11:27]
laura.vasilescu [Crearea unui Pass]
cpl:labs:llvm-pass [2015/12/08 00:32] (current)
irina.presa [Integrarea unui pas în LLVM]
Line 5: Line 5:
 Există numeroase pass-uri deja implementate în versiunea oficială LLVM. Acestea primesc ca input cod ''​LLVM IR''​ și oferă ca output fie ''​LLVM IR''​ (în cazul în care este un pass de transformare),​ fie un text cu diverse statistici (în cazul în care este un pass de analiză). Există numeroase pass-uri deja implementate în versiunea oficială LLVM. Acestea primesc ca input cod ''​LLVM IR''​ și oferă ca output fie ''​LLVM IR''​ (în cazul în care este un pass de transformare),​ fie un text cu diverse statistici (în cazul în care este un pass de analiză).
  
-===== Rularea ​unui Pass =====+===== Crearea ​unui Pass =====
  
 ''​LLVM Passes''​ pot fi rulate cu ajutorul tool-ului ''​opt''​. ''​LLVM Passes''​ pot fi rulate cu ajutorul tool-ului ''​opt''​.
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>​
cpl/labs/llvm-pass.1448270854.txt.gz · Last modified: 2015/11/23 11:27 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0