summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Cmm/Info/Build.hs75
1 files changed, 50 insertions, 25 deletions
diff --git a/compiler/GHC/Cmm/Info/Build.hs b/compiler/GHC/Cmm/Info/Build.hs
index d450594ffe..4d5b277f52 100644
--- a/compiler/GHC/Cmm/Info/Build.hs
+++ b/compiler/GHC/Cmm/Info/Build.hs
@@ -113,55 +113,80 @@ The following things have SRTs:
- Static thunks (THUNK), ie. CAFs
- Continuations (RET_SMALL, etc.)
-In each case, the info table points to the SRT. There are three ways which we
-may encode the location of the SRT in the info table, described below.
+In each case, the info table points to the SRT, if there is one.
-USE_SRT_OFFSET
---------------
-In this case we use the info->srt to encode whether or not there is an
-SRT and if so encode the offset to its location in info->f.srt_offset:
+- info->srt is 0 if there's no SRT
+- otherwise, there are three ways which we may encode the location of the SRT in
+ the info table, described below.
-- info->srt is 0 if there's no SRT, otherwise,
-- info->srt == 1 and info->f.srt_offset points to the SRT
+USE_SRT_POINTER
+---------------
+Most general implementation. Can always be used, but other ways are more efficient.
-e.g. for a FUN with an SRT:
+- info->srt is a pointer
-StgFunInfoTable +------+
- info->f.srt_offset | ------------> offset to SRT object
-StgStdInfoTable +------+
+We encode an **absolute pointer** to the SRT in info->srt. e.g. for a FUN
+with an SRT:
+
+StgInfoTable +------+
info->layout.ptrs | ... |
info->layout.nptrs | ... |
- info->srt | 1 |
+ info->srt | ------------> pointer to SRT object
info->type | ... |
|------|
-USE_SRT_POINTER
----------------
-When tables-next-to-code isn't in use we rather encode an absolute pointer to
-the SRT in info->srt. e.g. for a FUN with an SRT:
+USE_SRT_OFFSET
+--------------
+Requires:
+ - tables-next-to-code enabled
+
+In this case we use the info->srt to encode whether or not there is an SRT and
+if so encode the offset to its location in info->f.srt_offset:
+
+- info->srt is a half-word
+- info->f.srt_offset is a 32-bit int
+- info->srt is 0 if there's no SRT, otherwise,
+- info->srt == 1 and info->f.srt_offset is a offset to the SRT, relative to the
+field address itself
+
+e.g. for a FUN with an SRT:
StgFunInfoTable +------+
- info->f.srt_offset | ------------> pointer to SRT object
-StgStdInfoTable +------+
+ info->f.srt_offset | ------------> offset to SRT object
+StgInfoTable +------+
info->layout.ptrs | ... |
info->layout.nptrs | ... |
info->srt | 1 |
info->type | ... |
|------|
+
USE_INLINE_SRT_FIELD
--------------------
-When using TNTC on x86_64 (and other platforms using the small memory model),
-we optimise the info table representation further. The offset to the SRT can
+Requires:
+ - tables-next-to-code enabled
+ - 64-bit architecture
+ - small memory model
+
+Currently it is only enabled on x86_64 with TABLES_NEXT_TO_CODE.
+
+It is claimed that MachO doesn't support it due to #15169. However I believe
+that two kinds of SRT inlining have been confused:
+- inlining the SRT offset in the info->srt field
+ - should always be fine
+- inlining singleton SRT (i.e. SRT containing one reference)
+ - this can lead to a relative reference to an object external to the
+ compilation unit (c.f. #15169)
+
+We optimise the info table representation further. The offset to the SRT can
be stored in 32 bits (all code lives within a 2GB region in x86_64's small
memory model), so we can save a word in the info table by storing the
srt_offset in the srt field, which is half a word.
-On x86_64 with TABLES_NEXT_TO_CODE (except on MachO, due to #15169):
-
-- info->srt is zero if there's no SRT, otherwise:
+- info->srt is a half-word
+- info->srt is 0 if there's no SRT, otherwise:
- info->srt is an offset from the info pointer to the SRT object
-StgStdInfoTable +------+
+StgInfoTable +------+
info->layout.ptrs | |
info->layout.nptrs | |
info->srt | ------------> offset to SRT object