Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen

Ähnliche Präsentationen


Präsentation zum Thema: "Das Compilerwerkzeug TIL Aufbau und Datenstrukturen"—  Präsentation transkript:

1 Das Compilerwerkzeug TIL Aufbau und Datenstrukturen
Department of EE & IT University of Paderborn Prof. Dr.-Ing. J. Teich Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik Interner Vortrag Mai 2001

2 Übersicht Einleitung: Compilerphasen Compilerphasen in TIL
elementare Datenstrukturen Verzeichnisstruktur von TIL Programmstruktur

3 Compilerphasen Frontend Backend Hochsprache Zwischensprache
Fortran C Pascal Frontend maschinenunabhg. Darstellung Zwischensprache Analyse maschinenunabhg. Optimierung Assembler Code Maschinensprache Backend maschinenabhg. Codegenerierung

4 Compilerphasen: Backend
maschinenunabhängige Zwischendarstellung Abhängigkeitsanalyse Maschinenmodell Instruktionssatz Befehlsauswahl Scheduling FU-Zuweisung Registerzuweisung Backend Funktionale Einheiten Registersatz Assembler

5 Compilerphasen C-Programm burg_rcc –options <file.c>
lcc-Frontend Optimierung -O <strategy> TIL-backend TIL-view Visualisierung Code Selektion Abhg. Analyse MAML Fkt. Einheiten Register Instruktionssatz Machinenmodell ODG-view FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

6 Abhängigkeitsanalyse
Verzeichnisstruktur /home/TIL/ analysis/ optim/ algtrans/ unreach/ unroll/ Abhängigkeitsanalyse DUUD Ketten, Alias-Analyse, Omega Test frontend/ lcc3.6 Optimierungsmodul Für jede mögliche Optimierungstransformation existiert ein eigenes Verzeichnis mit den ent- sprechenden Routinen und Deklarations-Dateien

7 Hilfsfunktionen für Benutzer
Verzeichnisstruktur /home/TIL/ support/ Hilfsfunktionen für Benutzer Behandlung von Eingabeoptionen, Fehlermeldungen vliwsupp/ Bearbeitung von ODGs til/ Zwischendarstellung tiladt/ Aufbau interner Datenstrukturen (CDG, Variablentabelle, Codegraph) til2adt/ Bearbeiten von TIL Objekten i2til/ Einlesen von TIL-Datei til2i/ Ausgabe in .i-Datei targtdep/ Festlegung von maschinenspezifischen Formaten

8 Verzeichnisstruktur /home/TIL/ til/ tilsupp/
Hilfs- und Ausgabefunktionen common/ allgemeine Funktionen matrix/ Matrizenoperationen tillnest/ Schleifenschachteln tillook/ formatierte Ausgabe tilview/ graphische Ausgabe tilmenu/ globhead/ globale Headerfiles für TIL-Schnittstelle

9 Architekturspezifische Module
Verzeichnisstruktur /home/TIL/ backend/ Architekturspezifische Module tilburg/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ powerpc/ Skripten für Generierung von Baumgrammatik Baumzerteiler Generator BURG BURG Präprozessor Generator für Beschreibung des Registersatzes Strategien für Zwischencode-Optimierung Gucklochoptimierer Codegenerierung für SPARC Prozessor Codegenerierung für PowerPC VLIW/ model/ Maschinenmodell source/ Scheduler, FU-Zuweisung odgview/ graphische Ausgabe ODG

10 Daten Strukturen ... proc 1 proc 2 proc n adtprog block 2 block 4
adtcdg Für jede Prozedur static temp const local assign deref adtcode adtodg Für jeden Block Für jeden Block

11 CDG typedef struct cdg { proginfo ppi; /* Prozedurnummer */
cdg_basicblock graph; /* Flußgraph */ cdg_labhash labtab; /* Label-Hashtabelle */ label maxlab; /* max. benutztes Label */ cdg_swlist swides; /* Switchdeskriptoren */ int nxtblock; /* nächste Blocknummer */ bool istopol; /* ist topol. sortiert? */ cdgblock first_topol; /* erster in Top.Sort. */ cdgblock last_topol; /* letzter in Top.Sort. */ cdgblock bbentry; /* Eingangsblock */ cdgblock bbexit; /* Ausgangsblock */ struct cdg *next; /* nächster Eintrag */ int graph_tab_entries; } *cdg_cdglist;

12 CDG->cdg_basicblock
typedef struct cdg_bb { bool deleted; /* gelöscht */ cdg_edgeptr pred; /* Liste der Vorgänger */ cdg_edgeptr succ; /* Liste der Nachfolger */ short num_preds; /* Anzahl Vorg"anger */ short num_succs; /* Anzahl Nachfolger */ int bbflag; /* Grundblock-Flags */ void *optinfo; /* Optimierungsinfo. */ proplist props; /* Eigenschafteninfo. */ label start; /* Anfangslabel */ int line; /* Anfangszeile */ int labinfo; /* Label-Information */ cdgblock next_topol; /* nächster in Top.Sort. */ cdgblock prev_topol; /* vorheriger in Top.Sort */ int topolnum; /* für topologische Sort. */ int topollev; /* Ebene f"ur Ausgabe */ } *cdg_basicblock;

13 CDG->cdg_bbedge typedef struct cdg_bbedge {
cdgblock bbnum; /* Grundblock-Nummer */ int bbcolour; /* Kantenfarbe */ void *bboptinfo; /* Optimierungsinfo.*/ struct cdg_bbedge *bbnxt; /* nächster Eintrag */ } *cdg_edgeptr;

14 ODG struct odg_struct { edgeptr pred; /* Vorgängerfeldzeiger */
edgeptr succ; /* Nachfolgerfeldzeiger */ short num_preds; /* Anzahl Vorgänger */ short num_succs; /* Anzahl Nachfolger */ short local_preds; /* lokale Vorgänger */ short local_succs; /* lokale Nachfolger */ cdgblock onblock; /* Block des Knotens */ short number; /* Knotennummer */ short auxnum; /* für Ausgabe/Traversierung. */ short visitnum; /* für Traversierung */ short visit2; struct con_component components; /* starke Zusammenhangskomponenten */ void *optinf; /* Optimierungsinfo */ proplist prop; /* Eigenschaftenliste */ odgtype ontype; /* Knotentyp */ void *onoper; /* Operation */ odgnode nxttop; /* next Top-/Def-Knoten im Block */ odgnode pretop; /* voheriger */ odgnode nxtbot; /* nächster Bot-/Use-Knoten imBlock*/ odgnode prebot; /* voheriger */ };

15 Programmstruktur TIL_beginunit() myproc_rcc -optionen <file>
FU-Zuteilung Scheduling Register- zuteilung VLIW-Code C-Code Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion C-Code TIL_beginunit() Initialisierungen: Programmflußgraph: adtcdg.c Informationsliste für jede Prozedur: adtprog.c Zwischencodegraph für jeden Block und jede Prozedur: adtcode.c Variablentabelle: adtvtab.c Aufruf der Funktion t2a_beginunit(): /backend/tilburg/myproc/myprocburg.c Initialisierung Dominatorbaum dom_init(): /til/tilsupp/tilloop/domcalc.c Initialisierung Schleifeninformation loo_init(): /til/tilsupp/tilloop/adtloop.c Initialisierung ODG odg_init(): /backend/tilburg/myproc/VLIW/source/adtodg.c /backend/tilburg/myproc/cmdline.c parse cmd_line TIL_beginprocedure() TIL_endprocedure() TIL_branch() TIL_condbranch() TIL_switch_stat() TIL_defaultswitch() TIL_passaddr() TIL_passvalue() TIL_precall() TIL_postcall() TIL_returnvalue() TIL_call() TIL_unary() TIL_binary() TIL_localobject() TIL_staticobject() TIL_constant() TIL_deref() TIL_tmpdescr() TIL_addindex() TIL_placelabel() /til/til2adt/ Suffix <file> <file.c> Start lcc /frontend/lcc36/ src/til/ Analyse TIL-Code Initialisierung <file.i> /til/tiladt/ Masch.unabhg. Optimierungen readcode() tis_process() /til/i2til/ tiladt/ i2til til2adt targtdep support til til2i vliwsupp /home/TIL/ adtcdg.c adtcode.c adtconst.c adtprog.c adttype.c adtvd.c adtvtab.c Abhg. Analyse begin unit ? readcode() do_stmt() n Code-Selektion tiladt/ I2til/ til2adt/ targtdep support til til2i/ vliwsupp /home/TIL/ basicio.c i2til.c readcode.c readdefs.c TIL_beginunit() /til/til2adt/ FU-Zuteilung tiladt/ i2til/ til2adt/ targtdep/ support til til2i/ vliwsupp /home/TIL/ til2adt.c tiladt/ i2til/ til2adt/ targtdep/ support til til2i/ vliwsupp /home/TIL/ til2adt.c Scheduling TIL Typ ? Register- zuteilung TIL_endunit() /til/til2adt/ VLIW-Code

16 Programmstruktur TIL_endunit() opt_unit() /til/til2adt/til2adt.c
FU-Zuteilung Scheduling Register- zuteilung VLIW-Code C-Code Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion t2a_endunit() /backend/tilburg/myproc/myproc.c Ende Frontend-Phase Start der Codegenerierung Til-Code -> Assembler Optimierungen gemäß Spezifikationen in der Kommandozeile opt_unit() /backend/tilburg/myproc/optimizer.c TIL-Code opt_unit() nostd n Einfache Standardoptimierungen Masch.unabhg. Optimierungen MULTIPLY_SHIFT_OPT() unreachable_code_elim() transform_mod() DEADJUMPELIM() Abhg. Analyse opt Code-Selektion last proc n Strategie auswerten und Hooks setzen bei Änderungen norm_loops_unit() join_blocks_unit() Schleifennormalisierung Verschmelzen von Basisblöcken j FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

17 Code Optimization Code motion Conditional pruning Constant folding
Copy propagation Dead code elimination Block fusion Loop merging Loop unrolling Constant propagation Recursive tail elimination Unreachable code elimination Algebraic transformations Dead jump elimination Faint variable elimination Branch swapping STRATEGY DO tail_rec_elimination; DO constant_propagation; CONSTANT_FOLDING; UNTIL(stable); DO DEAD_CODE_ELIM; UNTIL(stable); /*COPY_PROPAGATION;*/ CONDITIONAL_PRUNING; DO LOOP_MERGING; UNTIL(stable); block_fusion; unreach_code_elim; UNTIL (stable); END

18 /analysis/dep/adttildg.c
Programmstruktur TIL_endunit() t2a_endunit() FU-Zuteilung Scheduling Register- zuteilung VLIW-Code C-Code Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion tdg_init() /analysis/dep/adttildg.c Hänge leere Liste an jeden Knoten des TIL Code Graphen und generiere Property Key öffne Ausgabedatei Abhg. Analyse Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

19 Programmstruktur TIL_endunit() t2a_endunit() FU-Zuteilung Scheduling
Register- zuteilung VLIW-Code C-Code Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion tdg_init() /analysis/dep/adttildg.c Initialisiere Codegenerierung für Übersetzungseinheit. Deklariere externe Variablen und Prozeduren. Generiere Ausgabeheader und Assembler Prolog Initialisiere ASM-Syntax öffne Ausgabedatei cgen_init() /backend/tilburg/myproc/codegen.c Scheduling ? n Initialisiere Maschinenmodell /backend/tilburg/myproc/schedule.c lege Analysedatei <file.ana> an /backend/tilburg/myproc/VLIW/model/machspec.c sil_init() Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

20 Programmstruktur TIL_endunit() t2a_endunit() FU-Zuteilung Scheduling
Register- zuteilung VLIW-Code C-Code Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion Für alle Prozeduren cgen_proc() /backend/tilburg/myproc/codegen.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c cgen_done() Nachoptimierung tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ Code-Selektion Schedule ? fclose(<file.ana>) N FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

21 Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code
VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c t2a_endunit() C-Code Erkennen von Schleifenstrukturen im Kontrollflußgraph Initialisierung von Schleifeninformation (Schachtelungstiefe, Schleifenkopf, -rumpf) in Datenstruktur adtloop Alloziere Speicherplatz für Codeinformation für alle Operanden Initialisiere neue Prozedur Zurücksetzen von globalen Prozedurinformationen auf Initialwert. Initialisiere Prozedur mit Information für Spilling (max. Anzahl Parameter, max Framegröße ...) Allokation von virtuellen Registern und benötigtem Speicherplatz Generiere Information für Targeting dominator_calc() til/tilsupp/tilloop/domcalc.c Berechne Dominatorbaum Analyse find_loops() til/tilsupp/tilloop/findloop.c TIL-Code support til vliwsupp /home/TIL/ adt2i globhead i2til interfac til2i tiladt tilsupp common matrix tillnest tillook tilloop tilmenu tilview support til vliwsupp /home/TIL/ adt2i globhead i2til interfac til2i tiladt tilsupp common matrix tillnest tillook tilloop tilmenu tilview Masch.unabhg. Optimierungen spill_init() /backend/tilburg/myproc/spill.c tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ Abhg. Analyse Abhg. Analyse Abhg. Analyse imo_proc() /backend/tilburg/myproc/intermobj.c Code-Selektion Code-Selektion FU-Zuteilung FU-Zuteilung vari_scan_proc() /backend/tilburg/myproc/varinfo.c Scheduling Scheduling cdi_init() /backend/tilburg/myproc/codinfo.c adtdom.c adtloo.c domcalc.c findloop.c join11.c normloop.c splitedg.c adtdom.c adtloo.c domcalc.c findloop.c join11.c normloop.c splitedg.c Register- zuteilung Register- zuteilung cdi_target() /backend/tilburg/myproc/codinfo.c VLIW-Code VLIW-Code

22 Programmstruktur * * TIL_endunit() cgen_proc() cgen_block()
t2a_endunit() C-Code Generiere neuen Bezeichner für aktuelle Variable VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c Initialisiere Strukturen für Generierung von ODG Generiere Label für jeden Block der aktuellen Prozedur Generiere Assembler Prolog für aktuelle Prozedur. Werte Information über formale Parameterliste aus und setze Information für Registerzuweisung. Initialisiere Feld für statistische Information bzgl. aktueller Prozedur cgen_block() /backend/tilburg/myproc/codegen.c Baumüberdeckung: Für jedes Statement des aktuellen Blocks wird durch den von dem Werkzeug BURG generierten Baumzerteiler überprüft, ob der Teilbaum ein gültiges Statement gemäß der spezifizierten Baumgrammatik darstellt und versucht, eine möglichst günstige Codesequenz zu generieren. cgen_stmt() * treecover() reduce() /backend/tilburg/myproc/treecover.c rule_dispatch() /backend/tilburg/myproc/rules.spec Codeerzeugung /backend/tilburg/myproc/rules.gen /backend/tilburg/myproc/rules.c lab_labeled_proc() Analyse Eigentliche Codeselektion durch Baumüberdeckung bdo_init_graph() TIL-Code Masch.unabhg. Optimierungen stt_start_proc() tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ Abhg. Analyse Abhg. Analyse asm_restart_id() Code-Selektion Code-Selektion FU-Zuteilung FU-Zuteilung asu_prologue() Scheduling Scheduling cgen_block() * Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

23 Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code
Scheduling ? Starte Abhängigkeitsanalyse /analysis/dep/dep_anal.c local_dep_anal() global_dep_anal() Falls Flag in Kommandozeile gesetzt ist, wird Schleifeninfor- mation extrahiert: find_loop() /til/tilsupp/tilloop/findloop.c und die Analyse mittels Omega-Test durchgeführt /analysis/dep/depomega/ Abhängigkeitsvektoren werden ggf in <file.iter> gespeichert Y sil_prepare_proc() /backend/tilburg/myproc/schedule.c Analyse TIL-Code bdo_build_graph() /backend/tilburg/myproc/VLIW/source/adtodg.c Masch.unabhg. Optimierungen Bilde Datenabhängigkeitsgraph ODG sil_schedule_proc() /backend/tilburg/myproc/schedule.c Abhg. Analyse Abhg. Analyse Abhg. Analyse Abhg. Analyse /backend/tilburg/myproc/VLIW/source/ List-Scheduling schedule_list_proc() schedule_list_ALAP_proc() schedule_list_move_proc() schedule_list_lam_proc() slack_sched_proc() Software-Pipelining schedule_softpipe_proc() Aufruf des Schedulers gemäß Option in der Kommandozeile Code-Selektion Code-Selektion dom_calc() /til/tilsupp/tilloop/domcalc.c FU-Zuteilung FU-Zuteilung Berechne Dominatorbaum neu find_loops() /til/tilsupp/tilloop/findloops.c Scheduling Scheduling Scheduling Scheduling Suche erneut nach Schleifen Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

24 Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code
asu_regalloc() /backend/tilburg/myproc/asmutil.c Analyse TIL-Code RegsUsed() /backend/tilburg/myproc/srapdf.c Initialisiert Registerzuteilungsmodul aus der Registersatzspezifikation /backend/tilburg/myproc/srapdf.c Startet ersten Pass der Registerzuteilung Meldet potentielle Register zur Belegung an Bestimmt Lebensintervalle von virtuellen Registern Registerfärbung gemäß Anzahl zur Verfügung stehender Register Gegebenenfalls Erzeugung von Spillcode Sartet zweiten Pass der Registerzuteilung Ersetzen von virtuellen Registern durch physikalische Masch.unabhg. Optimierungen Markiere alle benutzten Register für alle Registerklassen Generiere Codesequenz Für jeden Block Für jeden Block wird Liste von Assemblerinstruktionen generiert. Anschließend wird Assembler Prä- und Postambel creiert und an die Liste angehängt. Abhg. Analyse Code-Selektion /backend/tilburg/myproc/asminstr.c FU-Zuteilung FU-Zuteilung Scheduling Scheduling /backend/tilburg/myproc/peephole.c Nachoptimierung Register- zuteilung Register- zuteilung Register- zuteilung Gucklochoptimierung, sofern nicht per Kommandozeile abgestellt Ausgabe VLIW-Code VLIW-Code

25 Logische Register typedef struct assignreg /* logisches Register unter dem mehrere physikalische liegen koennen */ { struct assignreg *next; /* Liste aller logischen Register einer Klasse */ PHYSREGLIST *first; /* Liste aller physikalischen Register, die unter diesem logischen liegen */ ClusterSet physregset; /* Menge der physik. Register für Ueberlappungstests */ VIRTREG *bound; /* Liste der an dieses logische Register zugeord- neten virtuellen */ int classnr; /* eigene Klassennummer */ int regnr; /* Registernummer innerhalb der Klasse*/ char used; /* Merker fuer die RegsUsed-Funktion */ char locked; /* log. Reg. als gesperrt markieren */ } ASSIGNREG;

26 Physikalische Register
typedef struct physreg{ unsigned id; /* eindeutige ID */ VIRTREG *vreg; /* momentan an dieses virtuelle Register zugeordnet oder */ int gennr; /* Nummer der ältesten benutzenden In struktion (für Auswahl beim Auslagern) */ char used; /* Merker fuer die RegsUsed-Funktion */ char locked; /* markiert phys. Register als gesperrt */ char collock; /* durch Färbung gesperrt ( = reserviert) */ } PHYSREG; typedef struct physreglist /* Liste physikalischer Register */ { struct physreglist *next; /* Listenverkettung */ PHYSREG *preg; /* Verweis auf phys. Register */ } PHYSREGLIST;

27 Virtuelle Register typedef struct virtreg{
int id; /* eindeutige Kennzeichnung */ struct assignreg *bound; /*zugeordnetes log. Register*/ int classnr, /* Klasse des logischen Registers */ hintclass; /* Klasse des Wunschregisters, falls hintreg nicht -1*/ int regnr, /* Nummer des log. Regs innerhalb der Klasse oder -1 */ hintreg; /* RegisterNr eines Wunschregisters oder -1 */ char spilled; /* Wert des virtuellen Registers gerade ausgelagert? */ REGUSES *first, /* erster Benutzungsvermerk (Definition) */ *last; /* letzer Benutzungsvermerk */ struct virtreg *next; /* Verkettung fuer Liste freier/belegter virt. Regs */ struct virtreg *link; /* tmp Verkettung zur Verwaltung/Freigabe virt. Regs.*/ long descr; /* Deskriptor fuer Speicherstelle für Spilling*/ int lastgen; /* Instr. bei der zuletzt UseReg2 fuer dieses virt.Reg aufgerufen wurde */ int lastclassnr; /* dabei zurueckgemeldete Klasse */ int lastregnr; /* dabei zurueckgemeldete RegisterNr */ char lastmemuse; /* dabei zurueckgemeldetes Flag für Speicherbenutzung*/ struct virtreg *alias;/* Verweis auf virtuelles Aliasregister */ void *user_info; /* Info, kann vom User gesetzt und gelesen werden */ int valid; /* Tag mit magischem Wert zum Abfangen ungült. Zeiger*/ }VIRTREG;

28 Assembler Instruktionsliste
typedef struct asm_instr { struct asm_instr *next, *prev; /* cyclic linked list of instructions */ AsmOpcode opc; /* opcode of instruction */ AsmOperand opd[ASM_MAX_OPD]; /* operands of instruction */ odgnode on; /* corresponding node in odg */ unsigned id; /* unique ID if odgnode present, else NO_INSTR_ID */ codop cop; /* til codop "owning" this instr */ void *info; /* user info, used for param vregs with calls */ long infosize; /* size of memory referenced by above ptr */ char option; /* special instruction option */ } *AsmInstr;

29 Operanden typedef struct asm_opd {
AsmOpdKind kind; /* kind of Operand */ AsmModifier mod; /* modifier to be applied to Operand */ long offs; /* offset to be applied to operand */ union { /* specific data */ struct asm_opd *link; /* used while on free-list */ struct { VIRTREG *vreg; /* reference to virtual register */ int regclass; /* class of phys. Reg. allocated */ int regnr; /* nr of phys. regs allocated */ } virtreg; int regclass; /* regclass of physical register */ int regnr; /* nr of physical register */ } physreg; int intval; /* value of signed const */ unsigned uintval; /* value of unsigned const */ float floatval; /* value of float const */ double doubleval; /* value of double const */ char *charptr; /* reference to chars of string */ int length; /* nr of chars, not a C-string */ } string; char *name; /* name as a \0-terminated C-string */ } opdata; } *AsmOperand;


Herunterladen ppt "Das Compilerwerkzeug TIL Aufbau und Datenstrukturen"

Ähnliche Präsentationen


Google-Anzeigen