Skip to content

String literals are wasting space

For D199 I looked into how string literals are compiled down by GHC.

On 64-bit OS X, a simple string "AAA" turns into assembly:

.const
.align 3
.align 0
c38E_str:
	.byte	65
	.byte	65
	.byte	65
	.byte	0

(And also something that invokes unpackCString#, but that isn't relevant here.)

(MkCore.mkStringExprFS -> CmmUtils.mkByteStringCLit -> compiler/nativeGen/X86/Ppr.pprSectionHeader.)

Note how this:

  • Is 8 byte aligned.
  • Is a .const section.

I can't find any reason why string literals would need to be 8-byte aligned on OS X. There might be a small benefit in performance to read data starting 8-byte aligned, but I doubt doing that for string literals would be a meaningful difference. Assembly from both clang and gcc does not align string literals.

The trivial program:

main :: IO ()
main = return ()

has almost 5kB of wasted space of padding between all strings the Prelude brings in, built with GHC HEAD.

The fact that it is a .const section, instead of .cstring (https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/Assembler/040-Assembler_Directives/asm_directives.html#//apple_ref/doc/uid/TP30000823-TPXREF127) means duplicate strings aren't shared by the assembler. GHC floats out string literals to the top-level and uses CSE to eliminate duplicates, but that only works in a single modules. Strings shared between different modules end up as duplicate strings in an executable.

The same program as above also has ~4kB of wasted space due to duplicate Prelude strings ("base" occurs 16 times!). Compared to the total binary size (4MB after stripping), removing this redundant data wouldn't be a big improvement (0.2%), but I still think it can be a worthwile optimization.

I think this can be solved quite easily by creating a new section header for literal strings, which is unaligned and of type .cstring.

Trac metadata
Trac field Value
Version 7.8.2
Type Bug
TypeOfFailure OtherFailure
Priority low
Resolution Unresolved
Component Compiler (NCG)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC simonmar
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information