The Base Package Compiles

Wolfgang Thaller wolfgang.thaller at gmx.net
Wed Feb 11 00:19:36 EST 2004


Hi everyone,

I've got a shiny new libHSbase.a for Mac OS X on my hard now. Yipee!
In fact, GHC went right ahead and compiled the other packages, too 
(well, I didn't enable OpenGL or X11 or anything fancy).

Of course, the generated code is slightly bogus - I can't even link a 
program yet, because there are undefined references to some closures 
(well, to 2888 different closures, to be exact).

I had to make two more changes to the codeGen - diffs are attached.
Number one is in CgUtils.hs - mk_switch was _emitting_ some 
instructions, when it was just supposed to return them.
The second one is in CodeGen.hs; module_registered used to be generated 
as a rts data label, which was externally visible (but shouldn't be).

That's it for today. I've had some wine since I made the changes below, 
so I better don't touch any more code until I'm completely sober 
again...

Cheers,

Wolfgang


-- cut here --

Index: compiler/codeGen/CgUtils.hs
===================================================================
RCS file: /home/cvs/root/fptools/ghc/compiler/codeGen/Attic/CgUtils.hs,v
retrieving revision 1.1.2.22
diff -c -r1.1.2.22 CgUtils.hs
*** compiler/codeGen/CgUtils.hs	6 Feb 2004 15:13:09 -0000	1.1.2.22
--- compiler/codeGen/CgUtils.hs	10 Feb 2004 22:58:35 -0000
***************
*** 311,322 ****
   	; return (BasicBlock blk_id [switch_stmt] : deflt_blks ++ 
other_blocks) }

     | otherwise	-- Use an if-tree
!   = do	{ tag_expr' <- assignTemp tag_expr	-- To avoid duplication
   	; lo_blks <- mk_switch tag_expr' lo_branches mb_deflt lo_tag 
(mid_tag-1)
   	; hi_blks <- mk_switch tag_expr' hi_branches mb_deflt mid_tag hi_tag
   	; let cond = cmmULtWord tag_expr' (CmmLit (mkIntCLit mid_tag))
   	      branch_stmt = CmmCondBranch cond (getEntryIdB lo_blks)
! 	; return (consStmtB branch_stmt hi_blks ++ lo_blks) }
     where
       other_blocks = concat (map snd branches)
       use_switch 	 = ASSERT( n_branches > 1 && n_tags > 1 )
--- 311,323 ----
   	; return (BasicBlock blk_id [switch_stmt] : deflt_blks ++ 
other_blocks) }

     | otherwise	-- Use an if-tree
!   = do	{ (maybe_assign_tmp, tag_expr')
!                 <- assignTemp' tag_expr -- To avoid duplication
   	; lo_blks <- mk_switch tag_expr' lo_branches mb_deflt lo_tag 
(mid_tag-1)
   	; hi_blks <- mk_switch tag_expr' hi_branches mb_deflt mid_tag hi_tag
   	; let cond = cmmULtWord tag_expr' (CmmLit (mkIntCLit mid_tag))
   	      branch_stmt = CmmCondBranch cond (getEntryIdB lo_blks)
! 	; return (maybe_assign_tmp (consStmtB branch_stmt hi_blks) ++ 
lo_blks) }
     where
       other_blocks = concat (map snd branches)
       use_switch 	 = ASSERT( n_branches > 1 && n_tags > 1 )
***************
*** 357,362 ****
--- 358,369 ----

       jump_to_impossible
         = CmmJump (mkLblExpr (mkRtsCodeLabel SLIT("ImpossibleBranch"))) 
[]
+
+     assignTemp' e
+         | isTrivialCmmExpr e = return (id, e)
+         | otherwise          = do { reg <- newTemp (cmmExprRep e)
+                                   ; return (consStmtB (CmmAssign reg 
e),
+                                             CmmReg reg) }


   emitLitSwitch :: CmmExpr			-- Tag to switch on
Index: compiler/codeGen/CodeGen.lhs
===================================================================
RCS file: /home/cvs/root/fptools/ghc/compiler/codeGen/CodeGen.lhs,v
retrieving revision 1.58.2.5
diff -c -r1.58.2.5 CodeGen.lhs
*** compiler/codeGen/CodeGen.lhs	3 Feb 2004 22:47:03 -0000	1.58.2.5
--- compiler/codeGen/CodeGen.lhs	10 Feb 2004 22:58:36 -0000
***************
*** 34,40 ****
   import CgUtils		( cmmRegOffW, emitIf, emitDataLits, cmmEqWord )
   import CLabel		( mkSRTLabel, mkClosureLabel,
   			  mkPlainModuleInitLabel, mkModuleInitLabel,
! 			  mkRtsDataLabel )
   import Cmm
   import CmmUtils		( zeroCLit, mkIntCLit, mkLblExpr )
   import PprCmm		( pprCmms )
--- 34,40 ----
   import CgUtils		( cmmRegOffW, emitIf, emitDataLits, cmmEqWord )
   import CLabel		( mkSRTLabel, mkClosureLabel,
   			  mkPlainModuleInitLabel, mkModuleInitLabel,
! 			  mkRtsDataLabel, moduleRegdLabel )
   import Cmm
   import CmmUtils		( zeroCLit, mkIntCLit, mkLblExpr )
   import PprCmm		( pprCmms )
***************
*** 157,163 ****

   	-- Allocate the static boolean that records if this
   	-- module has been registered already
! 	; emitData Data [CmmDataLabel mod_reg_lbl,
   			 CmmStaticLit zeroCLit]

   	; emitSimpleProc real_init_lbl $ do
--- 157,163 ----

   	-- Allocate the static boolean that records if this
   	-- module has been registered already
! 	; emitData Data [CmmDataLabel moduleRegdLabel,
   			 CmmStaticLit zeroCLit]

   	; emitSimpleProc real_init_lbl $ do
***************
*** 195,206 ****

       jump_to_init = absC (CmmJump (mkLblExpr real_init_lbl) [])

!     mod_reg_lbl = mkRtsDataLabel SLIT("_module_registered")
!     mod_reg_val = CmmLoad (mkLblExpr mod_reg_lbl) wordRep

       mod_init_code = do
   	{ 	-- Set mod_reg to 1 to record that we've been here
! 	  absC (CmmStore (mkLblExpr mod_reg_lbl) (CmmLit (mkIntCLit 1)))

   		-- Now do local stuff
   	; registerForeignExports foreign_stubs
--- 195,205 ----

       jump_to_init = absC (CmmJump (mkLblExpr real_init_lbl) [])

!     mod_reg_val = CmmLoad (mkLblExpr moduleRegdLabel) wordRep

       mod_init_code = do
   	{ 	-- Set mod_reg to 1 to record that we've been here
! 	  absC (CmmStore (mkLblExpr moduleRegdLabel) (CmmLit (mkIntCLit 1)))

   		-- Now do local stuff
   	; registerForeignExports foreign_stubs



More information about the Cvs-ghc mailing list