Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich...

28
Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik {weper}@date.upb.de Interner Vortrag Mai 2001 Department of EE & IT University of Paderborn Prof. Dr.-Ing. J. Teich

Transcript of Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich...

Page 1: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Das Compilerwerkzeug TILAufbau und Datenstrukturen

Ralph Weper

Universität Paderborn

Fachbereich Elektrotechnik und Informationstechnik

AG Datentechnik

{weper}@date.upb.de

Interner VortragMai 2001

Department of EE & ITUniversity of PaderbornProf. Dr.-Ing. J. Teich

Page 2: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Übersicht

1. Einleitung: Compilerphasen

2. Compilerphasen in TIL

3. elementare Datenstrukturen

4. Verzeichnisstruktur von TIL

5. Programmstruktur

Page 3: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Compilerphasen

maschinenunabhg.Optimierung

HochspracheFortran

CPascal

Analyse

Fro

nten

d

maschinenunabhg.Darstellung

Zwischensprache

Assembler CodeMaschinensprache

Backen

d

maschinenabhg.Codegenerierung

Page 4: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Compilerphasen: BackendB

ackend

maschinenunabhängigeZwischendarstellung

Assembler

Befehlsauswahl

Abhängigkeitsanalyse

Funktionale Einheiten

Registersatz

Maschinenmodell

Instruktionssatz

Scheduling

FU-Zuweisung

Registerzuweisung

Page 5: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Compilerphasen

Code SelektionAbhg. Analyse

ODG-view

Scheduling

VLIW-Code

TIL-backend

lcc-Frontend

MAML

Fkt. Einheiten

Register

Instruktionssatz

Machinenmodell

FU-Zuteilung

Register-zuteilung

C-Programmburg_rcc –options <file.c>

Optimierung -O <strategy>

TIL-view

Visualisierung

Page 6: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Verzeichnisstruktur

Abhängigkeitsanalyse

frontend/ lcc3.6

/home/TIL/

analysis/

optim/

algtrans/

unreach/unroll/

Optimierungsmodul

Für jede mögliche Optimierungstransformationexistiert ein eigenes Verzeichnis mit den ent-sprechenden Routinen und Deklarations-Dateien

DUUD Ketten, Alias-Analyse, Omega Test

Page 7: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Verzeichnisstruktur

Hilfsfunktionen für Benutzer

Zwischendarstellung

tiladt/ Aufbau interner Datenstrukturen(CDG, Variablentabelle, Codegraph)

Behandlung von Eingabeoptionen, Fehlermeldungen

i2til/ Einlesen von TIL-Datei

til2adt/ Bearbeiten von TIL Objekten

Ausgabe in .i-Datei

targtdep/ Festlegung von maschinenspezifischen Formaten

Bearbeitung von ODGs

support/

til/

til2i/

vliwsupp/

/home/TIL/

Page 8: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Verzeichnisstruktur

tilsupp/

common/

Hilfs- und Ausgabefunktionen

matrix/ Matrizenoperationen

tillnest/ Schleifenschachteln

tillook/ formatierte Ausgabe

tilview/graphische Ausgabe

tilmenu/

globhead/ globale Headerfiles für TIL-Schnittstelle

allgemeine Funktionen

/home/TIL/til/

Page 9: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Verzeichnisstruktur

backend/

tilburg/

Baumzerteiler Generator BURG

BURG Präprozessor

Skripten für Generierung von Baumgrammatik

Generator für Beschreibung des Registersatzes

Strategien für Zwischencode-Optimierung

Gucklochoptimierer

Architekturspezifische Module

Codegenerierung für SPARC Prozessor

Codegenerierung für PowerPC

awk/

burg/

burgpp/

rd/

strategies/

peeprules/

sparc/

powerpc/

VLIW/model/ Maschinenmodell

source/ Scheduler, FU-Zuweisung

odgview/ graphische Ausgabe ODG

/home/TIL/

Page 10: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Daten Strukturen

block 2

block 4block 3

block 5

block 6

block 1adtcdg

adtodg

Für jede Prozedur

Für jeden Block

proc 1

proc 2

proc n

...

adtprog

Für jeden Block

static

temp constlocal

assign

deref

assignadtcode

Page 11: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 12: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 13: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 14: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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

};

Page 15: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

/backend/tilburg/myproc/cmdline.c

Programmstrukturmyproc_rcc -optionen <file>

parse cmd_line

Suffix<file>

begin unit?

readcode() do_stmt()

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/

Initialisierung

<file.i>

Initialisierung/til/tiladt/

readcode() tis_process()/til/i2til/

TIL Typ?

TIL_beginunit() /til/til2adt/FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

C-Code

<file.c> Start lcc

/frontend/lcc36/src/til/

n

TIL_endunit() /til/til2adt/

tiladt/

i2tiltil2adt

targtdep

support

til

til2i

vliwsupp

/home/TIL/

adtcdg.cadtcode.cadtconst.cadtprog.cadttype.cadtvd.cadtvtab.c

tiladt/

I2til/

til2adt/

targtdep

support

til

til2i/

vliwsupp

/home/TIL/

basicio.ci2til.creadcode.creaddefs.c

tiladt/

i2til/

til2adt/

targtdep/

support

til

til2i/

vliwsupp

/home/TIL/

til2adt.c

tiladt/

i2til/

til2adt/

targtdep/

support

til

til2i/

vliwsupp

/home/TIL/

til2adt.c

TIL_beginunit()

Initialisierungen:Programmflußgraph: adtcdg.cInformationsliste für jede Prozedur: adtprog.cZwischencodegraph für jeden Block und jede Prozedur: adtcode.cVariablentabelle: 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

Page 16: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

TIL-Code

Abhg. Analyse

Code-Selektion

Masch.unabhg.

Optimierungen

TIL_endunit()/til/til2adt/til2adt.c

Ende Frontend-PhaseStart der Codegenerierung Til-Code -> Assembler

t2a_endunit()

/backend/tilburg/myproc/myproc.c

opt_unit()

/backend/tilburg/myproc/optimizer.c

opt_unit()

Optimierungen gemäß Spezifikationen in der Kommandozeile

MULTIPLY_SHIFT_OPT()

unreachable_code_elim()

transform_mod()

DEADJUMPELIM()

Einfache Standardoptimierungen

opt

norm_loops_unit()

join_blocks_unit()

Schleifennormalisierung

Verschmelzen von Basisblöcken

j

lastproc

nStrategie auswertenund Hooks setzenbei Änderungen

nostd n

Page 17: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Abhg. Analyse

Code-Selektion

TIL_endunit()t2a_endunit()

tdg_init()

/analysis/dep/adttildg.c

öffne Ausgabedatei

Hänge leere Liste an jeden Knotendes TIL Code Graphen und generiereProperty Key

Page 18: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Code-Selektion

TIL_endunit()t2a_endunit()

tdg_init()

/analysis/dep/adttildg.c

öffne Ausgabedatei

cgen_init()

/backend/tilburg/myproc/codegen.c

• Initialisiere Codegenerierung für Übersetzungseinheit.• Deklariere externe Variablen und Prozeduren.• Generiere Ausgabeheader und Assembler Prolog• Initialisiere ASM-Syntax

Scheduling?

n

Initialisiere Maschinenmodell

/backend/tilburg/myproc/schedule.c

lege Analysedatei<file.ana> an

/backend/tilburg/myproc/VLIW/model/machspec.c

sil_init()

Page 19: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Code-Selektion

TIL_endunit()t2a_endunit()

cgen_done()

Nachoptimierung

Für alle Prozeduren

cgen_proc()

/backend/tilburg/myproc/codegen.c

Schedule?

fclose(<file.ana>)N

tilburg/

frontend/backend/

/home/TIL/

awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

Page 20: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Code-Selektion

TIL_endunit()t2a_endunit() cgen_proc()

find_loops()

til/tilsupp/tilloop/findloop.c

spill_init()

/backend/tilburg/myproc/spill.c

imo_proc()

/backend/tilburg/myproc/intermobj.c

vari_scan_proc()

/backend/tilburg/myproc/varinfo.c

cdi_init()

/backend/tilburg/myproc/codinfo.c

cdi_target()

/backend/tilburg/myproc/codinfo.c

dominator_calc()

til/tilsupp/tilloop/domcalc.cBerechne Dominatorbaum

Erkennen von Schleifenstrukturen im KontrollflußgraphInitialisierung von Schleifeninformation(Schachtelungstiefe, Schleifenkopf, -rumpf) in Datenstruktur adtloop

Abhg. Analyse

Initialisiere Prozedur mit Information für Spilling (max. Anzahl Parameter,max Framegröße ...)

Initialisiere neue ProzedurZurücksetzen von globalen Prozedurinformationenauf Initialwert.

Allokation von virtuellenRegistern und benötigtemSpeicherplatz

Alloziere Speicherplatzfür Codeinformation füralle Operanden

Generiere Information für Targeting

tilburg/

frontend/backend/

/home/TIL/

awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

support

tilvliwsupp

/home/TIL/

adt2iglobheadi2tilinterfactil2itiladttilsupp

commonmatrixtillnesttillooktillooptilmenutilview

support

tilvliwsupp

/home/TIL/

adt2iglobheadi2tilinterfactil2itiladttilsupp

commonmatrixtillnesttillooktillooptilmenutilview

adtdom.cadtloo.cdomcalc.cfindloop.cjoin11.cnormloop.csplitedg.c

adtdom.cadtloo.cdomcalc.cfindloop.cjoin11.cnormloop.csplitedg.c

Abhg. Analyse

Page 21: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Code-Selektion

TIL_endunit()t2a_endunit() cgen_proc()

bdo_init_graph()

stt_start_proc()

asm_restart_id()

asu_prologue()

lab_labeled_proc()

Generiere Label für jedenBlock der aktuellen ProzedurInitialisiere Strukturen fürGenerierung von ODG

Abhg. Analyse

Initialisiere Feld für statistischeInformation bzgl. aktueller Prozedur

Generiere neuen Bezeichnerfür aktuelle Variable

Eigentliche Codeselektion durch Baumüberdeckung

tilburg/

frontend/backend/

/home/TIL/

awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c

Generiere Assembler Prolog für aktuelle Prozedur. Werte Information über formale Parameterliste aus und setze Information für Registerzuweisung.

cgen_block() *

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

Page 22: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

Code-Selektion

TIL_endunit()t2a_endunit() cgen_proc()

Abhg. Analyse

Scheduling?

Ysil_prepare_proc()

/backend/tilburg/myproc/schedule.c • 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

bdo_build_graph()

/backend/tilburg/myproc/VLIW/source/adtodg.c

Bilde Datenabhängigkeitsgraph ODG

Abhg. Analysesil_schedule_proc()

/backend/tilburg/myproc/schedule.c

dom_calc()

/til/tilsupp/tilloop/domcalc.c

find_loops()

/til/tilsupp/tilloop/findloops.c

Berechne Dominatorbaum neu

Suche erneut nach Schleifen

SchedulingScheduling

Abhg. AnalyseAufruf des Schedulers gemäßOption in der Kommandozeile

/backend/tilburg/myproc/VLIW/source/

List-Schedulingschedule_list_proc()schedule_list_ALAP_proc()schedule_list_move_proc()schedule_list_lam_proc()slack_sched_proc()

Software-Pipeliningschedule_softpipe_proc()

Page 23: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Programmstruktur

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

C-Code

Analyse

TIL-Code

Masch.unabhg.

Optimierungen

Abhg. Analyse

Code-Selektion

FU-Zuteilung

Scheduling

Register-zuteilung

VLIW-Code

TIL_endunit()t2a_endunit() cgen_proc()

asu_regalloc()

/backend/tilburg/myproc/asmutil.c

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

Markiere alle benutzten Register für alle Registerklassen

Register-zuteilung

/backend/tilburg/myproc/asminstr.c

Generiere Codesequenz

Fürjeden Block

Nachoptimierung

Ausgabe

Für jeden Block wird Liste von Assemblerinstruktionen generiert. Anschließend wird Assembler Prä- und Postambel creiert und an die Liste angehängt.

Gucklochoptimierung, sofern nicht per Kommandozeile abgestellt

/backend/tilburg/myproc/peephole.c

Page 24: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 25: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 26: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 27: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;

Page 28: Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

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;struct {

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 */struct {

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;