Hello,

I've noticed that libraries that are compiled even with -dynamic are
really huge:
libHScairo-0.12.0-ghc6.12.1.so - 1.4 M
libHSgio-0.12.0-ghc6.12.1.so - 1.6 M
libHSgtk-0.12.0-ghc6.12.1.so - 14 M

(ldd confirms that these libraries are really linked dynamically with
the rest of the world)

just to name a few. All of them are striped with "strip -s".
At this point *bindings* to C libraries are larger that the libraries
themselves, which I find unacceptable.

So I decided to dig a bit deeper and when examining cairo-0.12.0 I found
that Types.o object file consumes 1.5 MB. So I "cleaned" up Types.hs and
tried to compile it separately from the rest of the library:

 % ghc -c Types.hs && ls -lh | grep Types.o
-rw-r--r-- 1 angel angel  69K 2010-12-14 18:24 Types.o
 % rm Types.o
 % ghc -c Types.hs -O && ls -lh | grep Types.o
-rw-r--r-- 1 angel angel 1.1M 2010-12-14 18:25 Types.o

So adding -O when compiling Types.hs makes the size of object file jump
from 69K to 1.1M. Just think about it - the file contains *two* *enums*
and nothing more. And yet it twice as large as a full-blown application
like gedit.

So I would like to ask you whether such behavior is known and should
such this be considered as a bug?

I've attached the testcase. It also can be found here:
http://hpaste.org/42331/something

Btw, I'm using GHC 6.12.1, x86_64.

Best regards,
  Audrius


module Graphics.Rendering.Cairo.Types (
    Status(..)
  , Content(..)
  ) where

data Status = StatusSuccess
            | StatusNoMemory
            | StatusInvalidRestore
            | StatusInvalidPopGroup
            | StatusNoCurrentPoint
            | StatusInvalidMatrix
            | StatusInvalidStatus
            | StatusNullPointer
            | StatusInvalidString
            | StatusInvalidPathData
            | StatusReadError
            | StatusWriteError
            | StatusSurfaceFinished
            | StatusSurfaceTypeMismatch
            | StatusPatternTypeMismatch
            | StatusInvalidContent
            | StatusInvalidFormat
            | StatusInvalidVisual
            | StatusFileNotFound
            | StatusInvalidDash
            | StatusInvalidDscComment
            | StatusInvalidIndex
            | StatusClipNotRepresentable
            | StatusTempFileError
            | StatusInvalidStride
            | StatusFontTypeMismatch
            | StatusUserFontImmutable
            | StatusUserFontError
            | StatusNegativeCount
            | StatusInvalidClusters
            | StatusInvalidSlant
            | StatusInvalidWeight
            | StatusInvalidSize
            | StatusUserFontNotImplemented
            | StatusDeviceTypeMismatch
            | StatusDeviceError
            | StatusLastStatus
            deriving (Eq,Show)
instance Enum Status where
  fromEnum StatusSuccess = 0
  fromEnum StatusNoMemory = 1
  fromEnum StatusInvalidRestore = 2
  fromEnum StatusInvalidPopGroup = 3
  fromEnum StatusNoCurrentPoint = 4
  fromEnum StatusInvalidMatrix = 5
  fromEnum StatusInvalidStatus = 6
  fromEnum StatusNullPointer = 7
  fromEnum StatusInvalidString = 8
  fromEnum StatusInvalidPathData = 9
  fromEnum StatusReadError = 10
  fromEnum StatusWriteError = 11
  fromEnum StatusSurfaceFinished = 12
  fromEnum StatusSurfaceTypeMismatch = 13
  fromEnum StatusPatternTypeMismatch = 14
  fromEnum StatusInvalidContent = 15
  fromEnum StatusInvalidFormat = 16
  fromEnum StatusInvalidVisual = 17
  fromEnum StatusFileNotFound = 18
  fromEnum StatusInvalidDash = 19
  fromEnum StatusInvalidDscComment = 20
  fromEnum StatusInvalidIndex = 21
  fromEnum StatusClipNotRepresentable = 22
  fromEnum StatusTempFileError = 23
  fromEnum StatusInvalidStride = 24
  fromEnum StatusFontTypeMismatch = 25
  fromEnum StatusUserFontImmutable = 26
  fromEnum StatusUserFontError = 27
  fromEnum StatusNegativeCount = 28
  fromEnum StatusInvalidClusters = 29
  fromEnum StatusInvalidSlant = 30
  fromEnum StatusInvalidWeight = 31
  fromEnum StatusInvalidSize = 32
  fromEnum StatusUserFontNotImplemented = 33
  fromEnum StatusDeviceTypeMismatch = 34
  fromEnum StatusDeviceError = 35
  fromEnum StatusLastStatus = 36

  toEnum 0 = StatusSuccess
  toEnum 1 = StatusNoMemory
  toEnum 2 = StatusInvalidRestore
  toEnum 3 = StatusInvalidPopGroup
  toEnum 4 = StatusNoCurrentPoint
  toEnum 5 = StatusInvalidMatrix
  toEnum 6 = StatusInvalidStatus
  toEnum 7 = StatusNullPointer
  toEnum 8 = StatusInvalidString
  toEnum 9 = StatusInvalidPathData
  toEnum 10 = StatusReadError
  toEnum 11 = StatusWriteError
  toEnum 12 = StatusSurfaceFinished
  toEnum 13 = StatusSurfaceTypeMismatch
  toEnum 14 = StatusPatternTypeMismatch
  toEnum 15 = StatusInvalidContent
  toEnum 16 = StatusInvalidFormat
  toEnum 17 = StatusInvalidVisual
  toEnum 18 = StatusFileNotFound
  toEnum 19 = StatusInvalidDash
  toEnum 20 = StatusInvalidDscComment
  toEnum 21 = StatusInvalidIndex
  toEnum 22 = StatusClipNotRepresentable
  toEnum 23 = StatusTempFileError
  toEnum 24 = StatusInvalidStride
  toEnum 25 = StatusFontTypeMismatch
  toEnum 26 = StatusUserFontImmutable
  toEnum 27 = StatusUserFontError
  toEnum 28 = StatusNegativeCount
  toEnum 29 = StatusInvalidClusters
  toEnum 30 = StatusInvalidSlant
  toEnum 31 = StatusInvalidWeight
  toEnum 32 = StatusInvalidSize
  toEnum 33 = StatusUserFontNotImplemented
  toEnum 34 = StatusDeviceTypeMismatch
  toEnum 35 = StatusDeviceError
  toEnum 36 = StatusLastStatus
  toEnum unmatched = error ("Status.toEnum: Cannot match " ++ show unmatched)

  succ StatusSuccess = StatusNoMemory
  succ StatusNoMemory = StatusInvalidRestore
  succ StatusInvalidRestore = StatusInvalidPopGroup
  succ StatusInvalidPopGroup = StatusNoCurrentPoint
  succ StatusNoCurrentPoint = StatusInvalidMatrix
  succ StatusInvalidMatrix = StatusInvalidStatus
  succ StatusInvalidStatus = StatusNullPointer
  succ StatusNullPointer = StatusInvalidString
  succ StatusInvalidString = StatusInvalidPathData
  succ StatusInvalidPathData = StatusReadError
  succ StatusReadError = StatusWriteError
  succ StatusWriteError = StatusSurfaceFinished
  succ StatusSurfaceFinished = StatusSurfaceTypeMismatch
  succ StatusSurfaceTypeMismatch = StatusPatternTypeMismatch
  succ StatusPatternTypeMismatch = StatusInvalidContent
  succ StatusInvalidContent = StatusInvalidFormat
  succ StatusInvalidFormat = StatusInvalidVisual
  succ StatusInvalidVisual = StatusFileNotFound
  succ StatusFileNotFound = StatusInvalidDash
  succ StatusInvalidDash = StatusInvalidDscComment
  succ StatusInvalidDscComment = StatusInvalidIndex
  succ StatusInvalidIndex = StatusClipNotRepresentable
  succ StatusClipNotRepresentable = StatusTempFileError
  succ StatusTempFileError = StatusInvalidStride
  succ StatusInvalidStride = StatusFontTypeMismatch
  succ StatusFontTypeMismatch = StatusUserFontImmutable
  succ StatusUserFontImmutable = StatusUserFontError
  succ StatusUserFontError = StatusNegativeCount
  succ StatusNegativeCount = StatusInvalidClusters
  succ StatusInvalidClusters = StatusInvalidSlant
  succ StatusInvalidSlant = StatusInvalidWeight
  succ StatusInvalidWeight = StatusInvalidSize
  succ StatusInvalidSize = StatusUserFontNotImplemented
  succ StatusUserFontNotImplemented = StatusDeviceTypeMismatch
  succ StatusDeviceTypeMismatch = StatusDeviceError
  succ StatusDeviceError = StatusLastStatus
  succ _ = undefined

  pred StatusNoMemory = StatusSuccess
  pred StatusInvalidRestore = StatusNoMemory
  pred StatusInvalidPopGroup = StatusInvalidRestore
  pred StatusNoCurrentPoint = StatusInvalidPopGroup
  pred StatusInvalidMatrix = StatusNoCurrentPoint
  pred StatusInvalidStatus = StatusInvalidMatrix
  pred StatusNullPointer = StatusInvalidStatus
  pred StatusInvalidString = StatusNullPointer
  pred StatusInvalidPathData = StatusInvalidString
  pred StatusReadError = StatusInvalidPathData
  pred StatusWriteError = StatusReadError
  pred StatusSurfaceFinished = StatusWriteError
  pred StatusSurfaceTypeMismatch = StatusSurfaceFinished
  pred StatusPatternTypeMismatch = StatusSurfaceTypeMismatch
  pred StatusInvalidContent = StatusPatternTypeMismatch
  pred StatusInvalidFormat = StatusInvalidContent
  pred StatusInvalidVisual = StatusInvalidFormat
  pred StatusFileNotFound = StatusInvalidVisual
  pred StatusInvalidDash = StatusFileNotFound
  pred StatusInvalidDscComment = StatusInvalidDash
  pred StatusInvalidIndex = StatusInvalidDscComment
  pred StatusClipNotRepresentable = StatusInvalidIndex
  pred StatusTempFileError = StatusClipNotRepresentable
  pred StatusInvalidStride = StatusTempFileError
  pred StatusFontTypeMismatch = StatusInvalidStride
  pred StatusUserFontImmutable = StatusFontTypeMismatch
  pred StatusUserFontError = StatusUserFontImmutable
  pred StatusNegativeCount = StatusUserFontError
  pred StatusInvalidClusters = StatusNegativeCount
  pred StatusInvalidSlant = StatusInvalidClusters
  pred StatusInvalidWeight = StatusInvalidSlant
  pred StatusInvalidSize = StatusInvalidWeight
  pred StatusUserFontNotImplemented = StatusInvalidSize
  pred StatusDeviceTypeMismatch = StatusUserFontNotImplemented
  pred StatusDeviceError = StatusDeviceTypeMismatch
  pred StatusLastStatus = StatusDeviceError
  pred _ = undefined

  enumFromTo x y | fromEnum x == fromEnum y = [ y ]
                 | otherwise = x : enumFromTo (succ x) y
  enumFrom x = enumFromTo x StatusLastStatus
  enumFromThen _ _ =     error "Enum Status: enumFromThen not implemented"
  enumFromThenTo _ _ _ =     error "Enum Status: enumFromThenTo not implemented"

data Content = ContentColor
             | ContentAlpha
             | ContentColorAlpha
             deriving (Eq,Show)
instance Enum Content where
  fromEnum ContentColor = 4096
  fromEnum ContentAlpha = 8192
  fromEnum ContentColorAlpha = 12288

  toEnum 4096 = ContentColor
  toEnum 8192 = ContentAlpha
  toEnum 12288 = ContentColorAlpha
  toEnum unmatched = error ("Content.toEnum: Cannot match " ++ show unmatched)

  succ ContentColor = ContentAlpha
  succ ContentAlpha = ContentColorAlpha
  succ _ = undefined

  pred ContentAlpha = ContentColor
  pred ContentColorAlpha = ContentAlpha
  pred _ = undefined

  enumFromTo x y | fromEnum x == fromEnum y = [ y ]
                 | otherwise = x : enumFromTo (succ x) y
  enumFrom x = enumFromTo x ContentColorAlpha
  enumFromThen _ _ =     error "Enum Content: enumFromThen not implemented"
  enumFromThenTo _ _ _ =     error "Enum Content: enumFromThenTo not implemented"

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to