Differences

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

Link to this comparison view

cpl:teme:tema2 [2015/11/25 22:40]
bogdan.nitulescu [Arhiva de pornire]
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 **<​del>​vineri,​ 4 decembrie 2015</​del>​ duminică, 6 decembrie 2015, ora 23:59**Pentru mai multe detaliiconsultaţi [[:​cpl:​teme:​general|regulamentul]] aferent temelor de casă+Scorul CPLMark ​este dimensiunea totală a secțiunilor ​.text din fișierele din benchmarkdupă 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ă a codului rezultat in urma temei 1. Programul vostru va trebui să primească la intrare output-ul temei 1 şi să genereze  +Pentru a calcula scorul unui test se folosește următoarea secvență de comenzi:
-  *   Pentru ​testele pozitive: PASS daca programul este corect; FAIL, insotit de o descriere si linia erorii, daca este incorect. +
-  *   ​Pentru testele negative: PASS daca analiza sintactică întoarce eroarea ​teptată; FAIL dacă analiza sintactică nu detectează eroarea sau detectează un alt tip de eroare.+
  
 +<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>​
  
-===== Analiza Semantica =====+Scorul final este suma scorului individual pentru fiecare test.
  
-În cadrul analizei semantice va trebui să colectați informații semantice (de ex. tipul 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: 
  
-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** .+===== Implementare =====
  
-Framework-ul conține: +Pentru a începe ​implementarea ​pașilor LLVMputeți urmării pașii de mai jos:
-  *   ​**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. +
-  * **tests/​error/​*TestRig.cpp** - unit teste pentru cazurile ​de eroare din suita de teste.+
  
 +  - Descărcați {{:​cpl:​concurs-arhiva.zip|arhiva de start}} și dezarhivați-o
 +  - 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 succes, ar trebui să se genereze biblioteca ''​libLLVMCpl-Contest.so''​ în directorul de build.
  
-===== Testare ===== +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 proiecttrebuie să modifcați fișierul **CMakeLists.txt**
-Pentru a putea face un build și a rula testeleaveți nevoie de o mașină Linux cu pachetele //gcc////​automake//​ si //cmake// instalate.+
  
-Puteți urma pașii de mai jos:+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ă.
  
-<​code>​ +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).
- 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 voiadăugând cod care verifică dacă ierarhia de clase este corectă!<​/note>+Pentru a rula testeledezarhivați arhiva ​ce conține {{:​cpl:​concurs-teste.zip|benchmarkul CPLMark}} în directorul ​de buildsi apoi rulați **./cplmark.sh**
  
-Pentru ca implementarea este incompleta, o parte din teste trec, o alta parte din teste esueaza. Scopul vostru este sa faceti in final sa treaca toate testele. 
  
-(//​25.11.2015//​) +===== Resurse =====
-Un test se consideră trecut corect dacă nu aruncă nicio excepție la rulare, și prin urmare afișează //PASS//. Testele din directorul //error// sunt diferite - la rularea lor, analizorul semantic trebuie să arunce un anumit tip de excepție. Pentru a putea vedea care este acea excepție, trebuie să analizați fișierul tests/​error/​**test-name**TestRig.cpp și să observați cazul pe care se execută metoda //pass()//.+
  
 +  * {{:​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.1448484051.txt.gz · Last modified: 2015/11/25 22:40 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