all’interno di clang e llvm · 2015. 10. 27. · italian c++ community – roma 24 ottobre 2015...

30
www.italiancpp.org All’interno di Clang e LLVM Concetti, design e implementazione

Upload: others

Post on 03-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

www.italiancpp.org

All’internodiClangeLLVMConcetti,des igne implementazione

Page 2: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

• LLVM eClang◦ Strutturadelprogetto◦ Architetturagenerale

• Clang:designeimplementazione◦ Lexer◦ Parser◦ Strutturadell’AST◦ Manipolazione dell’AST◦ Analisisemantica◦ Generazionedelcodiceintermedio

• Varieedeventuali

2

Dicosaparleremo

Page 3: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Cos’èLLVM?

• Unprogettoadampiospettrochefornisceunavastagammadistrumentiperlarealizzazionedicompilatoriedinterpreti

• Insiemedilibreriaperlagenerazione,manipolazioneeottimizzazionedelLLVMIntermediateRepresentation (IR)

• Copretuttal’infrastruttura,dall’IRinpoi:debugger,linker,binutils,interpreteconJust-In-Timecompilation,ecc…

3

IlprogettoLLVM

Page 4: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Vieneusatocomebackend perungrannumerodilinguaggisiainterpretatisiacompilati,ediprogetticorrelati.Adesempio:

4

IlprogettoLLVM

Linguaggio Progettoe/oProduttoreC,C++eObjective-C ClangC++→ asm.js Emscripten/MozillaInterpreteC++ Root/CERNHaskell GHCRust MozillaJavaScript WebKitOpenCL eGLSL Intel,nVidia,Apple.NET IL MonoPython PyPy

Page 5: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Cos’èClang:

• ParteintegrantedelprogettoLLVM• UncompilatoreperilinguaggiC,C++eObjective-C

• Unampioinsiemedilibrerieperleggere,manipolare,analizzare,generarecodicescrittoinquestilinguaggi

5

Clang

Page 6: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Goaldelprogetto:

• Bassitempidicompilazione• Ottimizzazionedelcodicegenerato

• Messaggidierrorechiariebenstrutturati

• Eccellenteaderenzaaglistandard:◦ C89,C99,C11◦ C++98/03,C++11,C++14◦ OpenCL

• Integrazionecontool eIDE:◦ Codecompletion, syntax highlighting, indexing, refactoring,ecc…

• Compatibilitàdrop-in conGCC(eVC++,sperimentale)

6

Clang

Page 7: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

• 2002– ChrisLattner pubblicalasuatesididottoratoalloUCLA:LLVM:AnInfrastructure forMulti-StageOptimization• 2005– AppleadottailprogettoeincorporaLLVMnellostack OpenGLdiOSX10.4

• 2007– NasceilprogettoClang

• 2010– Clang2.7supportailC++tantodariuscireacompilaresestesso• 2010– Nasceilprogettolibc++ perreimplementare unalibreriastandardC++11

• 2012– Clang3.3supportacompletamenteilC++11

• 2014– Clang3.5supportailC++14primachevengastandardizzato😎

• 2015– Microsoftannuncial’inclusionediClanginVisualStudio

7

Storiadelprogetto

Page 8: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Architetturagenerale

8

Ottimizzatore Lowering LinkerOttimizzatoreMC

IR

Lexer Parser CodeGenSema

Clang

LLVM

Sorgente

Binario

Page 9: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

LLVMsioccupadellapartedibackend:

• Definisceunlinguaggiodirappresentazioneintermedia• Fornisceunaserieditool percreare,manipolare,analizzareprogrammiscrittiinIR

• Ilcodiceintermediovieneanalizzatoemanipolatodaunaseriedipassi,adesempio:◦ DeadCodeElimination,Constant Propagation,AliasAnalysis,Tail CallElimination

• Ognipassomodificalocalmentel’IRe/oestraeinformazioniutiliaipassisuccessivi

• Lafasedilowering traducel’IRinassembly specificoperl’architetturaselezionata

9

Backend

Page 10: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Dueparolesull’IR:

• CodiceRISC-like dibassolivellomatarget-independent• Ognioperazioneosservaunsemplicemarigidotype-system

• Notazioneesplicitaperchiamateafunzione,gestionedelleeccezioni,aritmeticadeipuntatori,istruzionivettoriali,ecc…

10

CodiceintermediodiLLVM

Page 11: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

InquestotalkciconcentreremosuClang,ilfrontend:

• Architetturagenerale• Designdellestrutturedatiutilizzate• ProblematichespecifichedelC++:istanziazione deitemplate,valutazionefunzioniconstexpr,gestionedellefeature supportatedaidiversistandardimplementati,ecc….

• Interfacciaconl’esterno• Unosguardoalcodice

11

Frontend

Page 12: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Clangè formatodauninsiemedicomponentiindipendenti,tracui:

• libBasic–Utilitygenerali,descrizionedeitarget,gestionedell’I/O,infrastrutturaperlediagnostiche

• libLexer– Implementailpreprocessore eilLexer

• libAST – Dichiaralastrutturadatidell’Abstract Syntax Tree• libParser – Producel’ASTapartiredalflussoditoken generatodalLexer

• libSema – Effettual’analisisemanticadelcodice:type-check,lookup deinomi,istanziazione deitemplate,ecc…• libCodeGen–GenerailControlFlowGraph apartiredall’ASTedemetteilcodiceintermedioLLVM

• clang – Ilcompilatoreveroeproprio,utilizzabiledaterminale

12

Strutturadelprogetto

Page 13: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

IlmoduloLexer diClangimplementainunsingolopassolefasidipreprocessing eanalisilessicale delcodice:• Iltestosorgenteviene trasformatoinunasequenzaditoken

• IlLexer stessosioccupadellagestionedellemacro

• LaclasseSourceManager,perogniToken,tienetracciadi:◦ Dichetipoditoken sitratta◦ Laposizione deltoken all’internodelfile◦ Laprovenienzadeltoken nello stack diespansionedellemacro

13

IlLexer

Page 14: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

prova.cpp:8:2: error: assigning to ’int *’ from incompatible type ’int’

THREE(p);~~~~~~~~

prova.cpp:3:18: note: expanded from macro ’THREE’ #define THREE(x) TWO(x)

~~~~~~prova.cpp:2:16: note: expanded from macro ’TWO’ #define TWO(x) ONE(x)

~~~~~~prova.cpp:1:18: note: expanded from macro ’ONE’#define ONE(x) x = 1

^ ~

14

IlLexerRisultato:

Page 15: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Hands on

15

Page 16: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

IlParser diClangèscrittoamano,nonsiutilizzanotool digenerazioneautomaticacomeYacc oBison:• Generazionedellediagnostichemoltopiùpulitaeprecisa

• Maggiorecontrollosulleperformancedelcodice

• Unparser unicodevesupportareunagrandevarietàdilinguaggidiversi:◦ C,C++,Objective-C,OpenCL,ecc...inunavarietà diversioniedestensionidiverse◦ Impossibiledamantenereinunparser generatoinautomatico

• Lagenerazionedell’ASTdapartedelParser è intervallataallasuaanalisidapartedilibSema:◦ Parsing eanalisiavvengono inun’unicapassata◦ NonvienemaiprodottounAST“parziale”

16

IlParser

Page 17: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

L’Abstract SyntaxTree èlastrutturadaticherappresentalaformasintatticadelcodice.

Ildesigndell’ASTdiClangèinfluenzatodavarirequisiti:• Efficienzaeusodimemoria

• Possibilitàdigenerarediagnostichechiareeprecise• Altafedeltàalcodiceoriginariopericasid’usodiversidallasemplicecompilazione:◦ Indexing◦ Codecompletion◦ Refactoring◦ …

17

Strutturadell’AST

Page 18: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Alcunesceltedidesignseguonodaquantodetto:

• Ogninodomantienetracciadellaprecisaposizionedeitoken dacuiproviene• L’ASTnonè solosintattico,macontienetutteleinformazionisemanticheestrattedalibSema:◦ Tipodelleespressioni◦ Posizionedelleconversioniditipoimplicite◦ L’ASTdelladichiarazionedeitemplate ediognisingola istanza

• Sisfruttailpiu` possibilelosharing disottoalberiincomune(complicalagestionedellamemoria?tl;dr:no)

18

Strutturadell’AST

Page 19: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Tuttiglielementidell’ASTvivonosottoilcontrollodiunoggettoditipoASTContext,cheneèilproprietario:• UnASTContextgestiscelacompilazionediunasingolacompilationunit

• Gestiscel’allocazionedellamemoriapertuttiinodidell’AST:◦ Qualsiasinodo dell’ASTvienecreatotramitel’ASTContext◦ L’ASTContext sipreoccupadiverificarnel’unicità (per itipidinodichedevonoessereunici)◦ Alterminedellacompilazione l’ASTContext distrugge tuttol’ASTinuncolposolo

• Vantaggi:◦ Gestionedellamemoriafortementesemplificata:usoliberodipuntatorigrezzi◦ Allocazionecontiguadioggettidell’ASTcherappresentanopezzidicodicevicini

• L’oggettoASTContext èserializzabile

19

Contestodiparsing

Page 20: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

InClangognitipoèrappresentatodaunoggettodiunasottoclassediType:

• Itipisono“unici”:ogniriferimentoa“int”èrappresentatodallostessooggettoditipoIntTy (limitatamenteadunsingoloASTContext)

• GlioggettiType sonoassociatiatipinonqualificati• IltipoQualType rappresentauntipocondeiqualificatoriassociati(const,volatile,…)• Lapresenzadeiqualificatoriè mantenutadaQualType neibitmenosignificatividelpuntatorealType:◦ L’uguaglianzaditipirestaunconfronto traduepuntatori◦ L’utilizzodimemoriarestaquellodiunsingolopuntatore◦ Operazionetrasparentenascostadall’interfacciadiQualType (cheèunregulartype)

20

Gestionedeitipi

Page 21: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Ènecessario teneretracciadicomeitipivengonoeffettivamente indicatidalprogrammatorenelcodicesorgente:• SappiamocheiltipodiunavariabileèT,ma:◦ IlprogrammatorehascrittoproprioT?◦ Hausatoun typedef?◦ Iltypedef erainscopeoraggiunto tramiteunqualificatore(es.a::b::type)?◦ Dovesonodichiaratiitipie/oitypedef usati?

• Typedef,elaborated types,ecc… sonoindicatidaoggettiType appositi.

• OgniType hailproprio“canonical type”,chepuntaalverotipo.

21

Gestionedeitipi

Page 22: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

L’ASTdiClangèpensatoperessereutilizzatodavaritipiditool disviluppoperottenereinformazionisulsorgente:• Peresigenzecomuni,rivolgersiallelibrerieausiliariededicate:◦ libTooling◦ libFormat◦ libEdit◦ libRewrite

• L’entrypoint pervisitaredirettamentel’ASTèlaclasseASTConsumer:◦ Ogni“client”dell’ASTdeveessereunconsumer◦ Interfacciainsitle SAX:ilconsumer ricevepartidell’ASTmentrevengono trovate

• Lanavigazionedell’alberoèinvecedelegateagliASTMatcher:◦ Interfacciainstile“patternmatching”perscenderenell’alberoinmododichiarativo

22

Consumarel’AST

Page 23: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Interfacciadichiarativapervisitarel’ASTedestrarreinodidiinteresse.

Esempio:recordDecl(hasDescendant(

ifStmt(hasThen(stmt(hasDescendant(

ifStmt()))))))

Questaespressione identificaqualunquenodoche:

• Èladichiarazionediun“record”(struct/class/union)che…• …hacomediscendentequalsiasiun’istruzione“if”…• …ilcuiblocco“then”èun’istruzioneche…• ...traidiscendenticontieneun’altraistruzione“if”

23

ASTMatchers

class C {void func(int x, int y) {if(x > 0) {

while(true) {if(y > 0) break;

}}

}};

Page 24: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Hands on

24

Page 25: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

• IlmodulolibSemasioccupadellafasesemanticadellacompilazione:◦ Lookup deinomi◦ Overload resolution◦ Type-checking◦ Istanziazione deitemplate◦ …

• Icontrolliflow-dependent (es.noreturn allafinediunafunzione)vengonoeseguiticreandounControlFlowGraph:◦ Grafoorientatodiblocchidiistruzionidibase◦ Unarcoadogni salto◦ Rappresentazioneesplicitadelflussodicontrolloimplicitocomecostruttori,distruttori,eccezioni,ecc…◦ StrutturacondivisaconlibAnalysis (cheimplementaloStaticAnalyzer)

25

Analisisemantica

Page 26: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Lagestionedeitemplate èunodeipuntipiùdelicatidiuncompilatoreC++.

L’implementazionediClangsegueleduefasigiàdefinitedallostandard:

• Iltemplate vieneparsato nelmomentoincuivienedichiarato,esiproduce(adesempio)unadichiarazioneditipoClassTemplateDecl

• Ognitipotype-dependent vienerappresentatodaoggettiditipoTemplateTypeParmTypeealtri(es.DependentDecltypeType)

• L’istanziazione vieneeseguitadaunasottoclassediTreeTransform:◦ Classeastratta(CRTP,inrealtà)perl’implementazione ditrasformazionidell’AST◦ L’ASTdelladichiarazionedeltemplate vienetraformato sostituendo iparametri◦ IlrisultatodiventaunadichiarazioneClassTemplateSpecializationDecl (osimileperlefunzioni)eaggiuntoall’ASTassiemealresto

26

Templates

Page 27: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

IlcodiceintermedioLLVMvienegeneratodalmodulolibCodeGen:

• L’ASTvienevisitatoinmododepth-firstpergenerareilcodiceintermedio• InquestopuntovienegestitalaABI:◦ layout◦ gestionedelleeccezioni◦ name mangling◦ …

• Nonsiripetonofeaturesfornitegiàdalbackend:◦ Quasinienteconstantfolding◦ Ilcodiceègeneratonelmodopiùsemplicepossibile, ilbackendpoiottimizzerà◦ Ilcalcolodeglioffsetedell’aritmeticadeipuntatorièdelegatoalleappositeistruzioni IR

27

Generazionedelcodice

Page 28: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Hands on

28

Page 29: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Cosamancaalnostrotour:

• Irestantidettaglidelprocessodicompilazione:◦ libFrontend – APIpergestireadaltolivellolefasidellacompilazione◦ libDriver – Gestionedellatoolchain,gestionedellacross-compilazione, invocazionedeisottoprocessi,…

• Librerieperl’analisielamodificadirettadelsorgente◦ libTooling – Frameworkgeneraleperlarealizzazioneditool basatisuClang◦ libRewrite – Refactoring◦ libFormat – Riformattazione delcodicesecondodeterminatelineeguida◦ libclang – APICstabileversoilparser el’AST(utileperbindings adaltrilinguaggi)

29

Cosaresta

Page 30: All’interno di Clang e LLVM · 2015. 10. 27. · Italian C++ Community – Roma 24 Ottobre 2015 LLVM si occupa della parte di backend: • Definisce un linguaggio di rappresentazione

Italian C++ Community – Roma 24 Ottobre 2015

Domande?

30