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