Das Compilerwerkzeug TIL Aufbau und Datenstrukturen

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

ALP II: Objektorientierte Programmierung Sommersemester 2006
der Universität Oldenburg
Imperative Programmierung
der Universität Oldenburg
Ausführen.
Forschungszentrum caesar
Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Informatik 12 | DAES Compilerbau Wintersemester 2010 / 2011 Dr. Heiko Falk Technische Universität Dortmund Lehrstuhl Informatik 12 Entwurfsautomatisierung.
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
10. Grundlagen imperativer Programmiersprachen
der Universität Oldenburg
der Universität Oldenburg
Verteilte Software - Java - Prozedurale Programmierung 1
Gliederung Motivation / Grundlagen Sortierverfahren
Sortieren mit Binären Bäumen
Java: Objektorientierte Programmierung
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Indirekte Adressierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Union-Find-Strukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
1 Linux Paging, Caching und Swapping. 1 Vortragsstruktur Paging – Das Virtuelle Speichermodell –Die Page Table im Detail –Page Allocation und Page Deallocation.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Einführung in Visual C++
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Einführung in die Programmierung Datensammlung
FH-Hof 1 XML-Parser Richard Göbel. FH-Hof 2 XML-Parser- DOM Object Tree Parser Objekt der Klasse 'DocumentBuilderFactory' mit 'newInstance()' erzeugen.
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
HORIZONT 1 XINFO ® Das IT - Informationssystem Assembler HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 /
Dynamische Datentypen
Arduino Kurs Abend 2.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
MODULA-2.
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
BMEVIEEA100 Grundlagen der Programmierung
Hochschule Fulda – FB ET Sommersemester 2014
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
2 Datenabstraktion Geheimnisprinzip:
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Datenflussanalyse - Klassisch Seminar “Progammanalyse” (SS 2009) Referent: Lorenz Schauer Vortrag:
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Namensliste Teil der semantischen Aktionen
«Delegierter» Methoden Schablone Funktionszeiger
Implementieren von Klassen
 Präsentation transkript:

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 {weper}@date.upb.de Interner Vortrag Mai 2001

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

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

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

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

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

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

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

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

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

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;

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;

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;

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 ... */ };

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

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

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

/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

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

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

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

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

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

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

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;

Physikalische Register typedef struct physreg{ unsigned id; /* eindeutige ID */ VIRTREG *vreg; /* momentan an dieses virtuelle Register zugeordnet oder 0 */ 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;

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;

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;

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;