diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-24 21:00:17 +0100 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-24 23:26:58 +0100 |
commit | df26b95559fd467abc0a3a4151127c95cb5011b9 (patch) | |
tree | 921aa2442ffbb01079f5900fd5cf6bcab29fcc19 /rts/StgCRun.c | |
parent | 24149528a0a2d17ff9b5b087e0a8249c8c9cef98 (diff) | |
download | haskell-df26b95559fd467abc0a3a4151127c95cb5011b9.tar.gz |
Add NCG support for AIX/ppc32
This extends the previous work to revive the unregisterised GHC build
for AIX/ppc32. Strictly speaking, AIX runs on POWER4 (and later)
hardware, but the PPC32 instructions implemented in the PPC NCG
represent a compatible subset of the POWER4 ISA.
IBM AIX follows the PowerOpen ABI (and shares many similiarites with the
Linux PPC64 ELF V1 NCG backend) but uses the rather limited XCOFF
format (compared to ELF).
This doesn't support dynamic libraries yet.
A major limiting factor is that the AIX assembler does not support the
`@ha`/`@l` relocation types nor the ha16()/lo16() functions Darwin's
assembler supports. Therefore we need to avoid emitting those. In case
of numeric literals we simply compute the functions ourselves, while for
labels we have to use local TOCs and hope everything fits into a 16bit
offset (for ppc32 this gives us at most 16384 entries per TOC section,
which is enough to compile GHC).
Another issue is that XCOFF doesn't seem to have a relocation type for
label-differences, and therefore the label-differences placed into
tables-next-to-code can't be relocated, but the linker may rearrange
different sections, so we need to place all read-only sections into the
same `.text[PR]` section to workaround this.
Finally, the PowerOpen ABI distinguishes between function-descriptors
and actualy entry-point addresses. For AIX we need to be specific when
emitting assembler code whether we want the address of the function
descriptor `printf`) or for the entry-point (`.printf`). So we let the
asm pretty-printer prefix a dot to all emitted subroutine
calls (i.e. `BL`) on AIX only. For now, STG routines' entry-point labels
are not prefixed by a label and don't have any associated
function-descriptor.
Reviewers: austin, trommler, erikd, bgamari
Reviewed By: trommler, erikd, bgamari
Differential Revision: https://phabricator.haskell.org/D2019
Diffstat (limited to 'rts/StgCRun.c')
-rw-r--r-- | rts/StgCRun.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/rts/StgCRun.c b/rts/StgCRun.c index 0a010d464e..cf0c05c395 100644 --- a/rts/StgCRun.c +++ b/rts/StgCRun.c @@ -423,7 +423,11 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { #define STG_HIDDEN ".hidden " #endif -#ifdef darwin_HOST_OS +#if defined(aix_HOST_OS) + +// implementation is in StgCRunAsm.S + +#elif defined(darwin_HOST_OS) void StgRunIsImplementedInAssembler(void) { #if HAVE_SUBSECTIONS_VIA_SYMBOLS |