Se vuoi fare tutto a mano, per multitarget ti serve solo fare un pass aggiuntivo ed implementare una AST da traversare durante il codegen, con la possibilità di selezionare più di una architettura.LLVM è buono e va scelto, senza troppe paranoie sulle ottimizzazioni del codice (la vera ottimizzazione si fa sull'algoritmo, il codice asm generato è solo un aspetto secondario)
Citazione da: cdimauro - 18 Gennaio 2014, 16:18:28Ma a te per quale architettura serve?immaginaria, ovvero che non esiste, definita su carta e penna ed implementata su simulatore, e' molto simile ad un MIPS (di cui LCC ha un machine description), un pelo + amichevole e con 8 byte fissi per ogni opcode.
Ma a te per quale architettura serve?
Citazione da: cdimauro - 18 Gennaio 2014, 16:24:40Non è secondario, te lo posso assicurare. Non è secondario l'ottimizzazione del codice o il fatto che non si possa ottimizzare ancora di più il codice?
Non è secondario, te lo posso assicurare.
Comunque dipende di che ottimizzazioni stiamo parlando (che poi sarebbe meglio chiamare code improvements, dato che l'ottimizzazione dovrebbe essere il punto di massimo). Gran parte delle ottimizzazioni sono correzioni di codice, in cui basterebbe un warning che c'è del codice merda (tipo loop invariant code motion, etc).Ciò che importa è il register allocation, instruction scheduling e l'addressing. Che venga fatto bene in un backend multitarget dipende molto da come si descrive la macchina e da come si genera il codice di template.
Citazione da: cdimauro - 18 Gennaio 2014, 16:24:40Quindi va benissimo per implementare nuove architetture, e il codice che genera è abbastanza buono. Ma per avere di più a livello bisogna ricorrere ad altro.Di più quanto? Bisogna anche valutare il livello di complexity che si raggiunge lato compilatore (per un guadagno di quanto?), in ambito scientifico un modulo scheduling è sufficiente.Gaius Mulley per GNU Modula-2 (GCC-based) ha impiegato 12 anni e non è ancora molto production ready (ma utilizzabile)
Quindi va benissimo per implementare nuove architetture, e il codice che genera è abbastanza buono. Ma per avere di più a livello bisogna ricorrere ad altro.
Sto ripescando un mio vecchio progetto che emulava 68000 anche se non lo avevo completato, sopratutto mancano istruzioni e modalità di indizzamentocmq quanto implementato e' stato sufficiente per eseguire piccoli programmi compilati da gcc-68k ed caricati come binariCodice: [Seleziona]mon> helpSimulator Commands: help [<cmd>] Print detailed help about command <cmd> exit Exit simulator md [<addr>] [<addr>] Memory display mf <addr> <addr> <val> Memory fill rd Register display rm <reg> <val> Register modify ld <app.bin> Load Binary App go [<cnt>] Execute <cnt> instructions tr [<cnt>] Execute <cnt> instructions with tracing rst reset the systemmon> ld app.bin 1000loaded at 1000, donemon> md 1000001000 : 13 fc 00 68 00 fe 50 00 13 fc 00 41 00 fe 50 00001010 : 13 fc 00 6c 00 fe 50 00 13 fc 00 6c 00 fe 50 00001020 : 13 fc 00 6f 00 fe 50 00 60 00 00 02 46 fc 27 00001030 : 70 68 13 c0 00 fe 50 00 2e 7c 20 04 ff f0 2e 7c001040 : 20 04 ff f0 60 00 00 02 46 fc 27 00 2e 7c 00 00001050 : 20 00 45 f9 00 00 11 6d 4e ba 00 76 4e ba 00 5c001060 : 4e 71 4e 71 45 f9 00 00 11 3d 4e ba 00 64 14 38001070 : 00 0f 4e ba 00 70 45 f9 00 00 11 6d 4e ba 00 52001080 : 4e ba 00 38 45 f9 00 00 11 7e 4e ba 00 44 60 00001090 : 00 12 4e ba 00 5e 4e ba 00 62 0c 00 00 67 66 000010a0 : ff f2 45 f9 00 00 11 5b 4e ba 00 26 4e 71 45 f90010b0 : 00 00 11 04 4e ba 00 1a 4a fc 4e 71 4e 75 61 000010c0 : 00 32 0c 00 00 67 66 00 ff f2 61 00 00 2e 4e 750010d0 : 10 1a 0c 00 00 10 67 00 00 0a 4e ba 00 1e 4e fa0010e0 : ff f0 4e 75 4e 71 4e 71 4e 71 4e 71 5b ca ff f60010f0 : 4e 75 30 39 00 fe 50 00 4e 75 13 c0 00 fe 50 00mon> rm pc 1000CPU.PC=1000mon> gohAllowaiting for key pressedhAllo world again, this is meif you see this lineit means the App is running on a pretty emulated system- kill downapp has been forced to exit with 4AFCreturning to monmon> rm pc 1000CPU.PC=0x1000mon> tr 500001000: 13fc move.b #68,00fe5000.lh00001008: 13fc move.b #41,00fe5000.lA00001010: 13fc move.b #6c,00fe5000.ll00001018: 13fc move.b #6c,00fe5000.ll00001020: 13fc move.b #6f,00fe5000.lomon> exitbyebyeRipesco quel progetto, rimuovo il modulo 68000, ed aggiungo la pepita-machine, così si chiama questo accrocchio bovino dalla ISA immaginaria e super semplificata, il tutto perché torna comoda l'impalcatura del simulatore per le periferiche e per l'interfaccia del mon.Va finito anche il compilatore asm, adesso sto giocano con gli opcode generati a manina, finito l'as si passa al cc, e qui … boh, vedo un po' che si riesce a fare con LLVM, quel link non sembra essere troppo incasinato, pero' … gentoo dai suoi repo fa una fatica bestia a compilare llvm per MIPS nativo (host=target=mips) il che non mi lascia troppo tranquillo, ovvero … ci sarà sicuramente di aspettarsi qualche sorpresa, soprattutto dai repo git.
mon> helpSimulator Commands: help [<cmd>] Print detailed help about command <cmd> exit Exit simulator md [<addr>] [<addr>] Memory display mf <addr> <addr> <val> Memory fill rd Register display rm <reg> <val> Register modify ld <app.bin> Load Binary App go [<cnt>] Execute <cnt> instructions tr [<cnt>] Execute <cnt> instructions with tracing rst reset the systemmon> ld app.bin 1000loaded at 1000, donemon> md 1000001000 : 13 fc 00 68 00 fe 50 00 13 fc 00 41 00 fe 50 00001010 : 13 fc 00 6c 00 fe 50 00 13 fc 00 6c 00 fe 50 00001020 : 13 fc 00 6f 00 fe 50 00 60 00 00 02 46 fc 27 00001030 : 70 68 13 c0 00 fe 50 00 2e 7c 20 04 ff f0 2e 7c001040 : 20 04 ff f0 60 00 00 02 46 fc 27 00 2e 7c 00 00001050 : 20 00 45 f9 00 00 11 6d 4e ba 00 76 4e ba 00 5c001060 : 4e 71 4e 71 45 f9 00 00 11 3d 4e ba 00 64 14 38001070 : 00 0f 4e ba 00 70 45 f9 00 00 11 6d 4e ba 00 52001080 : 4e ba 00 38 45 f9 00 00 11 7e 4e ba 00 44 60 00001090 : 00 12 4e ba 00 5e 4e ba 00 62 0c 00 00 67 66 000010a0 : ff f2 45 f9 00 00 11 5b 4e ba 00 26 4e 71 45 f90010b0 : 00 00 11 04 4e ba 00 1a 4a fc 4e 71 4e 75 61 000010c0 : 00 32 0c 00 00 67 66 00 ff f2 61 00 00 2e 4e 750010d0 : 10 1a 0c 00 00 10 67 00 00 0a 4e ba 00 1e 4e fa0010e0 : ff f0 4e 75 4e 71 4e 71 4e 71 4e 71 5b ca ff f60010f0 : 4e 75 30 39 00 fe 50 00 4e 75 13 c0 00 fe 50 00mon> rm pc 1000CPU.PC=1000mon> gohAllowaiting for key pressedhAllo world again, this is meif you see this lineit means the App is running on a pretty emulated system- kill downapp has been forced to exit with 4AFCreturning to monmon> rm pc 1000CPU.PC=0x1000mon> tr 500001000: 13fc move.b #68,00fe5000.lh00001008: 13fc move.b #41,00fe5000.lA00001010: 13fc move.b #6c,00fe5000.ll00001018: 13fc move.b #6c,00fe5000.ll00001020: 13fc move.b #6f,00fe5000.lomon> exitbyebye
Vai su LLVM, che ti sbrighi molto prima. Non sarà mai il massimo per ottimizzare il codice a causa della sua struttura, ma genera comunque un buon codice.
Che porta a chiedersi how to write an LLVM backend ?
non ne ha poca, ne ha troppa, tutta online, ovvero e non c'e' un book che fa un riassunto comodo come per LCC.
Anche a me non ha dato rogne per host=target=linux/x86, pero' me ne ha date e non poche per host=target=linux/mips.
Se sono passati a LLVM tanto di guadagnato, perché anche SNC aveva le sue rogne, specialmente con alcune caratteristiche più avanzate del C++ che divergevano leggermente dallo standard (molto ferreo invece con GCC).
Citazione da: TheKaneB - 18 Gennaio 2014, 18:40:57Se sono passati a LLVM tanto di guadagnato, perché anche SNC aveva le sue rogne, specialmente con alcune caratteristiche più avanzate del C++ che divergevano leggermente dallo standard (molto ferreo invece con GCC).Info ufficiali di Sony:http://llvm.org/devmtg/2013-11/slides/Robinson-PS4Toolchain.pdf [PDF]