content: {-# LANGUAGE CPP #-}
  
  module GHC.Exts.Heap.FFIClosures (module Reexport) where
  
  -- NOTE [hsc and CPP workaround]
  --
  -- # Problem
  --
  -- Often, .hsc files are used to get the correct offsets of C struct fields.
  -- Those structs may be affected by CPP directives e.g. profiled vs not profiled
  -- closure headers is affected by the PROFILED cpp define. Since we are building
  -- multiple variants of the RTS, we must support all possible offsets e.g. by
  -- running hsc2hs with cpp defines corresponding to each RTS flavour. The
  -- problem is that GHC's build system runs hsc2hs *only once* per .hsc file
  -- without properly setting cpp defines. This results in the same (probably
  -- incorrect) offsets into our C structs.
  --
  --
  -- # Workaround
  --
  -- To work around this issue, we create multiple .hsc files each manually
  -- defining thir cpp defines (see e.g. FFIClosures_ProfilingDisabled.hsc and
  -- FFIClosures_ProfilingEnabled.hsc). Then we rely on cpp defines working
  -- correctly in .hs files and use CPP to switch on which .hsc module to
  -- re-export (see below). In each case we import the desired .hsc module as
  -- `Reexport` and we import `()` (i.e. nothing) from all other .hsc variants
  -- just so that the build system sees all .hsc file as dependencies.
  --
  --
  -- # Future Work
  --
  -- - Duplication of the code in the .hsc files could be reduced simply by
  --   placing the code in a single .hsc.in file and `#include`ing it from each
  --   .hsc file. The .hsc files would only be responsible for setting the correct
  --   cpp defines. This currently doesn't work as hadrian doesn't know to copy
  --   the .hsc.in file to the build directory.
  -- - The correct solution would be for the build system to run `hsc2hs` with the
  --   correct cpp defines once per RTS flavour.
  --
  
  #if defined(PROFILING)
  import GHC.Exts.Heap.FFIClosures_ProfilingEnabled as Reexport
  import GHC.Exts.Heap.FFIClosures_ProfilingDisabled ()
    -- See Note [No way-dependent imports] in GHC.Exts.Heap.Closures
  
  #else
  import GHC.Exts.Heap.FFIClosures_ProfilingDisabled as Reexport
  import GHC.Exts.Heap.FFIClosures_ProfilingEnabled ()
    -- See Note [No way-dependent imports] in GHC.Exts.Heap.Closures
  
  #endif
  