all’interno di clang e llvm · 2015. 10. 27. · italian c++ community – roma 24 ottobre 2015...
TRANSCRIPT
www.italiancpp.org
All’internodiClangeLLVMConcetti,des igne implementazione
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
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
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
Italian C++ Community – Roma 24 Ottobre 2015
Cos’èClang:
• ParteintegrantedelprogettoLLVM• UncompilatoreperilinguaggiC,C++eObjective-C
• Unampioinsiemedilibrerieperleggere,manipolare,analizzare,generarecodicescrittoinquestilinguaggi
5
Clang
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
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
Italian C++ Community – Roma 24 Ottobre 2015
Architetturagenerale
8
Ottimizzatore Lowering LinkerOttimizzatoreMC
IR
Lexer Parser CodeGenSema
Clang
LLVM
Sorgente
Binario
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
Italian C++ Community – Roma 24 Ottobre 2015
Dueparolesull’IR:
• CodiceRISC-like dibassolivellomatarget-independent• Ognioperazioneosservaunsemplicemarigidotype-system
• Notazioneesplicitaperchiamateafunzione,gestionedelleeccezioni,aritmeticadeipuntatori,istruzionivettoriali,ecc…
10
CodiceintermediodiLLVM
Italian C++ Community – Roma 24 Ottobre 2015
InquestotalkciconcentreremosuClang,ilfrontend:
• Architetturagenerale• Designdellestrutturedatiutilizzate• ProblematichespecifichedelC++:istanziazione deitemplate,valutazionefunzioniconstexpr,gestionedellefeature supportatedaidiversistandardimplementati,ecc….
• Interfacciaconl’esterno• Unosguardoalcodice
11
Frontend
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
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
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:
Italian C++ Community – Roma 24 Ottobre 2015
Hands on
15
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
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
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
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
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
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
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
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;
}}
}};
Italian C++ Community – Roma 24 Ottobre 2015
Hands on
24
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
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
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
Italian C++ Community – Roma 24 Ottobre 2015
Hands on
28
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
Italian C++ Community – Roma 24 Ottobre 2015
Domande?
30