[GHC] #14677: Code generator does not correctly tag a pointer

GHC ghc-devs at haskell.org
Fri Jan 26 08:25:29 UTC 2018


#14677: Code generator does not correctly tag a pointer
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:  14626
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by alexbiehl):

 Ha, got it!

 `evtWrite` is defined as

 {{{
 -- | The file descriptor is ready to accept a write.
 evtWrite :: Event
 evtWrite = Event 2
 }}}

 This compiles to this CMM:

 {{{
 ==================== Optimised Cmm ====================
 2018-01-26 08:16:02.207998 UTC

 section ""data" . evtWrite1_r3aU_closure" {
     evtWrite1_r3aU_closure:
         const GHC.Types.I#_con_info;
         const 2;
 }


 ==================== Optimised Cmm ====================
 2018-01-26 08:16:02.209627 UTC

 section ""data" . T14677_1.evtWrite_closure" {
     T14677_1.evtWrite_closure:
         const stg_IND_STATIC_info;
         const evtWrite1_r3aU_closure+1;
         const 0;
         const 0;
 }
 }}}

 Now as seen in my previous comment we refer to `evtWrite_closure` like
 this:

 ```
           ...
           R2 = PicBaseReg + (GHC.Event.Internal.evtWrite_closure+1);
           call Main.f1_info(R2) args: 8, res: 0, upd: 8;
           ...
 ```

 Now, take a look at the CMM for `evtWrite_closure` again.
 `evtWrite_closure` is basically an IND_STATIC closure pointing to the
 actual closure data! So by tagging the pointer we don't enter and never
 get the desired value! Our tests were working on the address of
 `evtWrite1_r3aU_closure+1`. What follows is a test which confirms the
 theory:

 T14677_1.hs
 {{{

 module T14677_1 where

 import Data.Bits
 import Data.List

 newtype Event = Event { toInt :: Int }
         deriving (Eq)

 evtNothing :: Event
 evtNothing = Event 0
 {-# INLINE evtNothing #-}

 -- | Data is available to be read.
 evtRead :: Event
 evtRead = Event 1
 {-# INLINE evtRead #-}

 -- | The file descriptor is ready to accept a write.
 evtWrite :: Event
 evtWrite = Event 2
 {-# INLINE evtWrite #-}

 -- | Another thread closed the file descriptor.
 evtClose :: Event
 evtClose = Event 4
 {-# INLINE evtClose #-}

 eventIs :: Event -> Event -> Bool
 eventIs (Event a) (Event b) = a .&. b /= 0

 -- | @since 4.3.1.0
 instance Show Event where
     show e = '[' : (intercalate "," . filter (not . null) $
                     [evtRead `so` "evtRead",
                      evtWrite `so` "evtWrite",
                      evtClose `so` "evtClose"]) ++ "]"
         where ev `so` disp | e `eventIs` ev = disp
                            | otherwise      = ""

 }}}

 T14677_2
 {{{
 module Main where

 import T14677_1

 f e2 = do
   print (toInt e2)
   print e2
   print (e2 == evtRead)

 main = f evtWrite
 }}}

 This prints for my machine:

 {{{
 $ inplace/bin/ghc-stage1 T14677_2.hs T14677_1.hs -O2
 $ ./T14677_2
 4307143777
 [evtRead]
 False
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14677#comment:15>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list