
Adding @scc@ to the Haskell compiler -- A note of changes required


Haskell Compiler:
----------------

SCC FRONT END SYNTAX:	scc "label" expr

    	hslexer.lex    	scc recognised as SCC	    	
    	hsparser.y    	scc expression parsed    	
    	tree.ugn    	new tree construct  	    	
    	printtree.c 	print scc (k bytecode)	    	
	main.c		-S flag for scc (else warning)	

SCC THROUGH COMPILER:
	reader		PrefixSyn	new construct (SCC')
    		    	ReadPrefix	read k bytecode	    		
			PrefixToHs	-> AbsSyn			

	abstractSyn	HsExpr 		new construct (SCC)		
			BackSubst					
	rename		RenameExpr4	rename body			
	typecheck	TcExpr		no unify, use type of body		
	deSugar		DsExpr		-> CoreSyn			

    Core Syntax & Transformations:
	coreSyn		CoreSyn 	new construct (CoSCC) not primop
			AnnCoreSyn	new construct			
			FreeVars					
			CoreFuns					

	simplCore0	SubstAnal0					
			SimplCore0					
			RmTrivLets0					
			
	simplCore				default: not used	n
	stranal-sem				default: not used	n
	interpreter				york:	 ???		n

    Stg Syntax & Transformations:
	stgSyn		CoreToStg	-> StgSyn		
			StgSyn		new construct (StgSCC)

			StgInfo (new)	pass gathering CC codegen info

			LetFloat		default: not used	n
			StgToStg		default: not used	n
			FreeVariables		default: not used	n

    Abstract C & Code Generation:
	main		Main		-scc flag for update flavour	y
	codeGen		CgMonad		-scc new Cg info		y
	absCSyn		AbsCSyn		new construct (CCostCentre)	y

	codeGen		CodeGen		declaring cost centers		y
	codeGen		ClosureInfo	closure kind			y
						type			y
	codeGen		CgClosure	closure description		y

	abstractC	PprAbsC		info table kind			y
						   description		y
						   type			y
	
     Real Code Generation Changes
	Scc Expression:
		+RCC update frame -- stack space required
		+set new cost centre

	Closure Entry:
		!different sizes for STD and CON update frames
		+single entry now requires RCC update frame
		+resume the CC in closure entered

	Return in Registers:	
		+register return set RetCC (form closure or CCC)
		+register update reset closures CC to RetCC
		+attribute register update allocation to RetCC

	CC_ALLOC calls with heap allocation

     Optimisations:
	update closure entry with scc -- no RCC frame			ToDo


RTS stuff:
---------

Time		interupt				y

Cost centre declaration macros				y

Info table macros with "description" etc?		y

Modify update frames to include cost centres		y
Dummy update frame return vector			y
Recognition of dummy ret vect UpdatePAP			y

Heap profiling (2s)
	Cost Centre					y
	Description					y

Profile info reported					y

Conditionalise need for timer interupt			todo



ADDING GRP_NAME to CC and TYPE to CAT:
-------------------------------------

driver		--  -Ggroup flag			y
main/Main.lhs	--  -Ggroup flag			y
		--  pass to codegen			y
codeGen		--  grp_name passed into CCostCentre	y
absCSyn		--  add group to CCostCentre		y
		--  print group with CC decl		y
		--  print type with INFO_TABLE decl	y
uniType		--  getUniTyDescription			y

runtime 	-- Add group to CostCentre		y
		-- Add group to CC_DECALRE		y
 		-- Add type to ClCategory		y
		-- Add type to CAT_DECLARE		y
		-- Add type to INFO_TABLEs		y

		-- Report group in profiling report	y

		-- Heap profiling with group/module/type
	   	-- selection by mod,grp,typ		y
	        -- profiling by cc,mod,grp,descr,type	y
		    -- always hash on feature		y
		-- report by cc,mod,grp,descr,type	y

	   	This is different to York as we can have unprofiled
	   	costs/heap inherited from other modules/groups.

		TESTING TESTING TESTING TESTING		ToDo

	
AUTO SCCS ...
-------------

driver			--  -prof-auto			y
main/Main.lhs		--  -scc-auto			y
			--  doSCCauto pass (desugared)	Improve?
profiling/SCCauto.lhs	--  sccAutoTop			Improve?

	Need to compare to all explicitly annotated.	ToDo

	I think this needs to be incorperated into	ToDo
	the desugarer/typechecker? as the dict stuff
	currently distorts this.
	OK if we are using lexical scoping !!!
	eg: See tautclause in clausify1.hs  (cl.*)




EXTENDING SCC ANNOTATIONS ...				ToDo
-----------------------------

Front End: 	let   scc "label"
		where scc "label"
		decl  scc "label"

    	hsparser.y    	extended scc expressions parsed    	
    	tree.ugn    	new scc language constructs  	    	
    	printtree.c 	print new scc bytecode forms

Compiler:
	reader		PrefixSyn	new constructs
    		    	ReadPrefix	read bytecodes	    		
			PrefixToHs	-> AbsSyn			

	abstractSyn	HsExpr 		new constructs
			BackSubst					
	rename		RenameExpr4	rename body
	typecheck	TcExpr		no unify, use type of body
	deSugar				desugar new scc constructs -> SCC


LEXICAL/EVALUATION SCOPING ...

driver		--  -prof-eval -prof-lex (def)		y
main/Main.lhs	--  -scc-eval -scc-lex			y
		--  doSCClex pass (stg_binds')		ToDo
???		--  lexical scoping transform pass	ToDo



OTHER POSSIBLE STUFF:
 
codegen/CodeGen.lhs	-- code to declare mod and group strings
			-- use references in CCostCentre

profiling cost report	-- Reporting group / module costs
				with / without components
		   	   Eg sort on group time
				with module time sub-sort
				  with label time sub-sort
