Skip to content
  • takano-akio's avatar
    Allow top-level string literals in Core (#8472) · d49b2bb2
    takano-akio authored and Ben Gamari's avatar Ben Gamari committed
    This commits relaxes the invariants of the Core syntax so that a
    top-level variable can be bound to a primitive string literal of type
    Addr#.
    
    This commit:
    
    * Relaxes the invatiants of the Core, and allows top-level bindings whose
      type is Addr# as long as their RHS is either a primitive string literal or
      another variable.
    
    * Allows the simplifier and the full-laziness transformer to float out
      primitive string literals to the top leve.
    
    * Introduces the new StgGenTopBinding type to accomodate top-level Addr#
      bindings.
    
    * Introduces a new type of labels in the object code, with the suffix "_bytes",
      for exported top-level Addr# bindings.
    
    * Makes some built-in rules more robust. This was necessary to keep them
      functional after the above changes.
    
    This is a continuation of D2554.
    
    Rebasing notes:
    This had two slightly suspicious performance regressions:
    
    * T12425: bytes allocated regressed by roughly 5%
    * T4029: bytes allocated regressed by a bit over 1%
    * T13035: bytes allocated regressed by a bit over 5%
    
    These deserve additional investigation.
    
    Rebased by: bgamari.
    
    Test Plan: ./validate --slow
    
    Reviewers: goldfire, trofi, simonmar, simonpj, austin, hvr, bgamari
    
    Reviewed By: trofi, simonpj, bgamari
    
    Subscribers: trofi, simonpj, gridaphobe, thomie
    
    Differential Revision: https://phabricator.haskell.org/D2605
    
    GHC Trac Issues: #8472
    d49b2bb2