#ifndef INFOTABLES_H
#define INFOTABLES_H
+/* ----------------------------------------------------------------------------
+ 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.
+
+ 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.
+
+ 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.
+
+ 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.
+ ------------------------------------------------------------------------- */
+
+#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;
/* -----------------------------------------------------------------------------
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
------------------------------------------------------------------------- */
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
/*
+ * 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 */