#ifndef INFOTABLES_H
#define INFOTABLES_H
-/* -----------------------------------------------------------------------------
- Profiling info
- -------------------------------------------------------------------------- */
-
-typedef struct {
- char *closure_type;
- char *closure_desc;
-} StgProfInfo;
-
-/* -----------------------------------------------------------------------------
- Parallelism info
- -------------------------------------------------------------------------- */
-
-#if 0 && (defined(PAR) || defined(GRAN))
-
-/* CURRENTLY UNUSED
- ToDo: use this in StgInfoTable (mutually recursive) -- HWL */
-
-typedef struct {
- StgInfoTable *rbh_infoptr; /* infoptr to the RBH */
-} StgParInfo;
-
-#endif /* 0 */
-
-/*
- Copied from ghc-0.29; ToDo: check this code -- HWL
-
- In the parallel system, all updatable closures have corresponding
- revertible black holes. When we are assembly-mangling, we guarantee
- that the revertible black hole code precedes the normal entry code, so
- that the RBH info table resides at a fixed offset from the normal info
- table. Otherwise, we add the RBH info table pointer to the end of the
- normal info table and vice versa.
-
- Currently has to use a !RBH_MAGIC_OFFSET setting.
- Still todo: init of par.infoptr field in all infotables!!
-*/
-
-#if defined(PAR) || defined(GRAN)
-
-# ifdef RBH_MAGIC_OFFSET
-
-# error magic offset not yet implemented
-
-# define RBH_INFO_WORDS 0
-# define INCLUDE_RBH_INFO(infoptr)
-
-# define RBH_INFOPTR(infoptr) (((P_)infoptr) - RBH_MAGIC_OFFSET)
-# define REVERT_INFOPTR(infoptr) (((P_)infoptr) + RBH_MAGIC_OFFSET)
+/* ----------------------------------------------------------------------------
+ Relative pointers
-# else
+ Several pointer fields in info tables are expressed as offsets
+ relative to the info pointer, so that we can generate
+ position-independent code.
-# define RBH_INFO_WORDS 1
-# define INCLUDE_RBH_INFO(info) rbh_infoptr : &(info)
+ Note [x86-64-relative]
+ There is a complication on the x86_64 platform, where pointeres are
+ 64 bits, but the tools don't support 64-bit relative relocations.
+ However, the default memory model (small) ensures that all symbols
+ have values in the lower 2Gb of the address space, so offsets all
+ fit in 32 bits. Hence we can use 32-bit offset fields.
-# define RBH_INFOPTR(infoptr) (((StgInfoTable *)(infoptr))->rbh_infoptr)
-# define REVERT_INFOPTR(infoptr) (((StgInfoTable *)(infoptr))->rbh_infoptr)
+ When going via-C, the mangler arranges that we only generate
+ relative relocations between symbols in the same segment (the text
+ segment). The NCG, however, puts things in the right sections and
+ uses 32-bit relative offsets instead.
-# endif
+ Somewhere between binutils-2.16.1 and binutils-2.16.91.0.6,
+ support for 64-bit PC-relative relocations was added, so maybe this
+ hackery can go away sometime.
+ ------------------------------------------------------------------------- */
-/* see ParallelRts.h */
-/*
-EXTFUN(RBH_entry);
-StgClosure *convertToRBH(StgClosure *closure);
-#if defined(GRAN)
-void convertFromRBH(StgClosure *closure);
-#elif defined(PAR)
-void convertToFetchMe(StgPtr closure, globalAddr *ga);
+#if x86_64_TARGET_ARCH
+#define OFFSET_FIELD(n) StgHalfInt n; StgHalfWord __pad_##n;
+#else
+#define OFFSET_FIELD(n) StgInt n;
#endif
-*/
+/* -----------------------------------------------------------------------------
+ Profiling info
+ -------------------------------------------------------------------------- */
+
+typedef struct {
+#ifndef TABLES_NEXT_TO_CODE
+ char *closure_type;
+ char *closure_desc;
+#else
+ OFFSET_FIELD(closure_type_off);
+ OFFSET_FIELD(closure_desc_off);
#endif
+} StgProfInfo;
/* -----------------------------------------------------------------------------
Ticky info
extern StgWord16 closure_flags[];
-#define closureFlags(c) (closure_flags[get_itbl(c)->type])
+#define closureFlags(c) (closure_flags[get_itbl(UNTAG_CLOSURE(c))->type])
#define closure_HNF(c) ( closureFlags(c) & _HNF)
#define closure_BITMAP(c) ( closureFlags(c) & _BTM)
} StgLargeSRT;
/* ----------------------------------------------------------------------------
- Relative pointers
-
- Several pointer fields in info tables are expressed as offsets
- relative to the info pointer, so that we can generate
- position-independent code.
-
- There is a complication on the x86_64 platform, where pointeres are
- 64 bits, but the tools don't support 64-bit relative relocations.
- However, the default memory model (small) ensures that all symbols
- have values in the lower 2Gb of the address space, so offsets all
- fit in 32 bits. Hence we can use 32-bit offset fields.
- ------------------------------------------------------------------------- */
-
-#if x86_64_TARGET_ARCH
-#define OFFSET_FIELD(n) StgHalfInt n; StgHalfWord __pad_##n;
-#else
-#define OFFSET_FIELD(n) StgInt n;
-#endif
-
-/* ----------------------------------------------------------------------------
Info Tables
------------------------------------------------------------------------- */
StgFunPtr entry; /* pointer to the entry code */
#endif
-#if defined(PAR) || defined(GRAN)
- struct _StgInfoTable *rbh_infoptr;
-#endif
#ifdef PROFILING
StgProfInfo prof;
#endif
#else
StgInfoTable i;
StgSRT *srt; /* pointer to the SRT table */
- StgFunPtr vector[FLEXIBLE_ARRAY];
#endif
} StgRetInfoTable;
#endif
} StgThunkInfoTable;
+/* -----------------------------------------------------------------------------
+ Constructor info tables
+ -------------------------------------------------------------------------- */
+
+typedef struct _StgConInfoTable {
+#if !defined(TABLES_NEXT_TO_CODE)
+ StgInfoTable i;
+#endif
+
+#ifndef TABLES_NEXT_TO_CODE
+ char *con_desc;
+#else
+ OFFSET_FIELD(con_desc) // the name of the data constructor
+ // as: Package:Module.Name
+#endif
+
+#if defined(TABLES_NEXT_TO_CODE)
+ StgInfoTable i;
+#endif
+} StgConInfoTable;
+
/* -----------------------------------------------------------------------------
Accessor macros for fields that might be offsets (C version)
#endif
/*
+ * GET_CON_DESC(info)
+ * info must be a StgConInfoTable*.
+ */
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_CON_DESC(info) ((char *)((StgWord)((info)+1) + (info->con_desc)))
+#else
+#define GET_CON_DESC(info) ((info)->con_desc)
+#endif
+
+/*
* GET_FUN_SRT(info)
* info must be a StgFunInfoTable*
*/
#define GET_FUN_LARGE_BITMAP(info) ((StgLargeBitmap*) ((info)->f.b.bitmap))
#endif
-
+/*
+ * GET_PROF_TYPE, GET_PROF_DESC
+ */
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_PROF_TYPE(info) ((char *)((StgWord)((info)+1) + (info->prof.closure_type_off)))
+#else
+#define GET_PROF_TYPE(info) ((info)->prof.closure_type)
+#endif
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_PROF_DESC(info) ((char *)((StgWord)((info)+1) + (info->prof.closure_desc_off)))
+#else
+#define GET_PROF_DESC(info) ((info)->prof.closure_desc)
+#endif
#endif /* INFOTABLES_H */