Differences

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

Link to this comparison view

cpl:teme:tema2 [2015/11/24 18:14]
bogdan.nitulescu
cpl:teme:tema2 [2018/01/19 13:23] (current)
bogdan.nitulescu [Informații organizatorice]
Line 1: Line 1:
-====== Tema de casă 2 - Analiza semantică și generarea de cod ======+====== Tema 2 - Optimizari ​====== 
 +Obiectivul acestei teme este să scrieți unul sau mai mulți pași de optimizare, folosind framework-ul LLVM, astfel încât să reduceți cât mai mult dimensiunea codului rezultat.
  
-În cadrul acestei teme veti implementa atât analiza semnatică pentru ​limbajul LCPL.+===== Informații organizatorice ===== 
 +  * **Deadline**:​ Termenul limită până când se poate participa la concurs este **27 ianuarie 2018, ora 23:59**. Deadline-ul este final - după această oră nu se vor mai accepta soluții. 
 +  * **Colaborare**:​ Fiecare soluție este **individuală**. 
 +  * **Condiții** de punctare 
 +    * Soluția generează cod corect ​pentru ​toate testele din benchmark. (Nu se modifica semantica codului, rezultatul executiei este acelasi) 
 +    * Soluția face cel putin doua transformari non-triviale ale codului. 
 +    * Codul soluției nu este copiat dintr-un [[http://​releases.llvm.org/​3.8.1/​docs/​Passes.html#​transform-passes|pass de transformare existent din LLVM]] 
 +    * Arhiva trebuie sa contina un fisier README in care sa fie descrise optimizarile propuse si modul de implementare.
  
-===== Informaţii organizatorice ​=====+===== Infrastructură ​===== 
 +  * Codul va folosi **LLVM 3.8** 
 +  * Soluțiile vor fi trimise prin vmchecker 
 +===== Enunț ===== 
 +Premisa acestei teme este să scrieți un optimizor care va obține un rezultat bun in benchmarkul "​CPLMark"​ . Veți extinde utilitarul **opt** din LLVM, adăugând o bibliotecă ce conține pașii voștri de optimizare.
  
-  * **Deadline**:​ Termenul limită până când se pot trimite temele fără depunctări de întârziere ​este **vineri, 4 decembrie 2015, ora 23:59**. Pentru mai multe detalii, consultaţi [[:​cpl:​teme:​general|regulamentul]] aferent temelor de casă. +Scorul CPLMark ​este dimensiunea totală a secțiunilor ​.text din fișierele din benchmark, după ce au trecut prin optimizorul vostru si apoi au fost compilate cu **llc** pentru arhitectura ARM.
-  * **Colaborare**:​ Tema va fi rezolvată **individual**. +
-  * **Punctare**:​ 125p pentru implementarea completă şi corectă+
  
 +Fișierele din benchmark sunt în format .ll , dar pentru referință am adăugat și fișierele C originale.
  
-===== Enunţ =====+<​note>​**opt** nu va rula decât pașii voștri de optimizare, nu și cei "​built-in"​. Toate transformările codului vor fi scrise de voi. O strategie posibilă ar fi să examinați fișierele din benchmark, să estimați care sunt optimizările care ar putea aduce reduce dimensiunea codului - de exemplu eliminarea codului mort, optimizarea salturilor, eliminarea subexpresiilor comune - și să le implementați pe cele mai promițătoare.</​note>​
  
-Va trebui să realizaţi în limbajul C++, porţiunea responsabilă cu analiza semantică ​codului rezultat in urma temei 1. Programul vostru va trebui să primească la intrare output-ul temei 1 şi să genereze [...], in cazul in care analiza semnatica nu a detectat erori, sau o lista de erori.+Pentru ​calcula scorul unui test se folosește următoarea secvență de comenzi:
  
-===== Analiza Semantica =====+<code bash> 
 +# Transform the test .ll file in binary format 
 +llvm-as test.ll -o test.bc 
 +# Run your optimization passes 
 +opt -load=./​libLLVMCpl-Contest.so -cpl-my-1st-pass -cpl-my-2nd-pass test.bc > test-optimized.bc 
 +# Generate an optimized object file for the ARM architecture 
 +llc test-optimized.bc -march=arm -filetype=obj -o test.o 
 +# Compute the size of the text section in the object file 
 +llvm-size -A test.o 
 +</​code>​
  
-În cadrul analizei semantice va trebui să colectați informații semantice (de extipul expresiilor) și să verificați că programul reprezentat de AST-ul construit la tema 1 respectă restricțiile impuse de limbajul LCPL (a se consulta în acest sens manualul). Analiza va avea doua scopuri:+Scorul final este suma scorului individual pentru fiecare test.
  
-1) Obținerea informațiilor ce sunt necesare pentru generarea de cod: 
-  *   Tipul fiecărei expresii, variabile locale, metode, parametru formal sau atribut 
-  *   Clasa de baza a fiecarei clase derivate. 
-  *   ​Pentru fiecare simbol folosit, se va identifica variabila pe care il refera (locala, parametru formal, atribut) 
-  *   ​Pentru fiecare apel de metoda, se vor identifica metoda care va fi apelata si clasa din care face parte. 
  
  
-2) Verificarea corectitudinea definirii structurii de clase a programului. Câteva exemple de probleme care ar trebui semnalate la acest pas: 
-  *   ​definirea unei clase de mai multe ori sau redefinirea uneia de bază - deja implementată în arhiva de pornire 
-  *   ​moștenirea unui tip care nu poate avea succesori (String, Int) - deja implementată în arhiva de pornire 
-  *   ​absența unei clase Main cu metoda main - deja implementată în arhiva de pornire 
-  *   ​moșteniri recursive (A moștenește B care moștenește A) 
-  *   ​variabilă sau clasă nedefinită 
-  *   ​metodă inexistentă sau apel nevalid (de ex. ca nr. de parametri) 
-  *   ​incompatibilitate de tipuri (între operanzi și operator, în argumentele unei funcții etc.) 
  
-În procesul de a obține informațiile din primul paragraf, puteți întâlni erori, cum sunt cele exemplificate in al doilea paragraf. Aceste erori trebuie raportate ca erori semantice. 
  
-===== Arhiva de pornire ===== 
  
-Arhiva initiala ({{:​cpl:​teme:​lcpl-semant-1.0.tgz|lcpl-semant-1.0.tgz}}) conține o implementare parțială a analizei semantice pentru LCPL. Ceea ce trebuie să faceți este să identificați porțiunile lipsa (marcate cu un comentariu **TODO** in cod ) și să completați cu logica necesară conform indicațiilor de acolo. 
  
-Porțiunile lipsă se găsesc în fișierele **src/​SemanticAnalysis.cpp** si **src/​TypeTable.cpp** . Puteți modifica sau adăuga și alte fișiere, dar nu este neapărat necesar. Dacă simțiți nevoia unui fișier #include suplimentar,​ puteți folosi **include/​SemanticAnalysisImpl.h** . 
  
-Framework-ul conține: +===== Implementare =====
-  *   ​**include/​*.h** - structurile de date pentru AST +
-  *   ​**src/​SymbolTable.cpp** - implementarea unei tabele de simboli +
-  *   ​**src/​TypeTable.cpp** - implementarea unei liste de tipuri, și câteva funcții ajutătoare +
-  *   ​**src/​SemanticAnalysis** - implementarea analizei semantice folosind visitor pattern. Clasa conține o funcție visit pentru fiecare nod din AST.+
  
 +Pentru a începe implementarea pașilor LLVM, puteți urmării pașii de mai jos:
  
-===== Testare ===== +  - Descărcați {{:​cpl:​concurs-arhiva.zip|arhiva de start}} și dezarhivați-o 
-Pentru a putea face un build și a rula testele, aveți nevoie de o mașină Linux cu pachetele //gcc////​automake//​ si //cmake// instalate.+  - Creați ​un director de build și intrați în el (Exemplu: ''​mkdir build; cd build''​) 
 +  - Rulați ''​cmake''​ cu calea directorului unde ați dezarhivat arhiva (Exemplu: ''​cmake ..''​) 
 +  - Compilați pasul (Exemplu: ''​make''​) 
 +  - Dacă totul s-a compilat ​cu succesar trebui să se genereze biblioteca ''​libLLVMCpl-Contest.so''​ în directorul de build.
  
-Puteți ​urma pașii de mai jos:+Arhiva de start conține trei fișiere sursă, fiecare dintre acestea conținând scheletul de cod pentru un tip de pas de optimizare. ​Puteți ​să ii modificați,​ să îi ștergeți sau să adăugați alți pași. Dacă adăugați sau scoateți fișiere din proiect, trebuie să modifcați fișierul **CMakeLists.txt** 
 + 
 +Numele fiecărui pas trebuie să inceapă cu **cpl-** . Linia de comandă cu care va fi apelat **opt** va conține acești pași în ordine alfabetică. 
 + 
 +Din infrastructura existentă LLVM puteți folosi [[http://​releases.llvm.org/​3.8.1/​docs/​Passes.html#​analysis-passes|pașii de analiză]], dar nu și pe cei de transformare;​ nici direct (nu aveți voie să îi apelați), nici indirect (nu aveți voie să preluați cod). 
 + 
 +Pentru a rula testele, dezarhivați arhiva ce conține {{:cpl:​concurs-teste.zip|benchmarkul CPLMark}} în directorul de build, si apoi rulați **./​cplmark.sh**
  
-<​code>​ 
- tar zxf lcpl-semant-1.0.tgz ​        # Extrageți conținutul arhivei 
- cd lcpl-semant 
- cmake .                         # Utilitarul CMake va crea Makefile-uri pentru build și teste 
- ​make ​                           # Build pentru teste și analiză sintactică 
- make run-hello ​                 # Rulează testul hello.lcpl 
- make run-all ​                   # Rulează toate testele 
-</​code>​ 
  
-<note important>//​Out of the box//, dacă rulați **make run-parent_loop** așa cum vine din arhiva de pornire, programul se blochează într-o buclă infinită. Este un bug care va trebui fixat de către voi, adăugând cod care verifică dacă ierarhia de clase este corectă!</​note>​+===== Resurse =====
  
-Pentru ca implementarea este incompleta, o parte din teste trec, o alta parte din teste esueazaScopul vostru este sa faceti in final sa treaca toate testele.+  * {{:​cpl:​concurs-arhiva.zip|Arhiva de start}} 
 +  * {{:​cpl:​concurs-teste.zip|CPLMark}} 
 +  * [[http://​llvm.org/​docs/​WritingAnLLVMPass.html|Writing an LLVM Pass]] ​
  
cpl/teme/tema2.1448381648.txt.gz · Last modified: 2015/11/24 18:14 by bogdan.nitulescu
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