diff options
| author | Ian Lynagh <igloo@earth.li> | 2009-02-06 14:02:49 +0000 |
|---|---|---|
| committer | Ian Lynagh <igloo@earth.li> | 2009-02-06 14:02:49 +0000 |
| commit | 497302c44ad08c6c27d0e15d94a787f332c0cfec (patch) | |
| tree | a78fd252a39c2d49b5a5219a2c968004c5a1c029 /compiler/nativeGen | |
| parent | 1353826e5159c9a5a81e75e0b7459271f27c08ea (diff) | |
| download | haskell-497302c44ad08c6c27d0e15d94a787f332c0cfec.tar.gz | |
When generating C, don't pretend functions are data
We used to generated things like:
extern StgWordArray (newCAF) __attribute__((aligned (8)));
((void (*)(void *))(W_)&newCAF)((void *)R1.w);
(which is to say, pretend that newCAF is some data, then cast it to a
function and call it).
This goes wrong on at least IA64, where:
A function pointer on the ia64 does not point to the first byte of
code. Intsead, it points to a structure that describes the function.
The first quadword in the structure is the address of the first byte
of code
so we end up dereferencing function pointers one time too many, and
segfaulting.
Diffstat (limited to 'compiler/nativeGen')
| -rw-r--r-- | compiler/nativeGen/MachCodeGen.hs | 7 | ||||
| -rw-r--r-- | compiler/nativeGen/PositionIndependentCode.hs | 2 |
2 files changed, 5 insertions, 4 deletions
diff --git a/compiler/nativeGen/MachCodeGen.hs b/compiler/nativeGen/MachCodeGen.hs index d16962cfbe..d94a906bbd 100644 --- a/compiler/nativeGen/MachCodeGen.hs +++ b/compiler/nativeGen/MachCodeGen.hs @@ -40,6 +40,7 @@ import CLabel import ClosureInfo ( C_SRT(..) ) -- The rest: +import BasicTypes import StaticFlags ( opt_PIC ) import ForeignCall ( CCallConv(..) ) import OrdList @@ -3408,7 +3409,7 @@ outOfLineFloatOp mop res args code2 <- stmtToInstrs (CmmAssign (CmmLocal res) (CmmReg (CmmLocal tmp))) return (code1 `appOL` code2) where - lbl = mkForeignLabel fn Nothing False + lbl = mkForeignLabel fn Nothing False IsFunction fn = case mop of MO_F32_Sqrt -> fsLit "sqrtf" @@ -3841,7 +3842,7 @@ outOfLineFloatOp mop dflags <- getDynFlagsNat mopExpr <- cmmMakeDynamicReference dflags addImportNat CallReference - $ mkForeignLabel functionName Nothing True + $ mkForeignLabel functionName Nothing True IsFunction let mopLabelOrExpr = case mopExpr of @@ -4112,7 +4113,7 @@ genCCall target dest_regs argsAndHints do dflags <- getDynFlagsNat mopExpr <- cmmMakeDynamicReference dflags addImportNat CallReference $ - mkForeignLabel functionName Nothing True + mkForeignLabel functionName Nothing True IsFunction let mopLabelOrExpr = case mopExpr of CmmLit (CmmLabel lbl) -> Left lbl _ -> Right mopExpr diff --git a/compiler/nativeGen/PositionIndependentCode.hs b/compiler/nativeGen/PositionIndependentCode.hs index 16359094a8..d74a627d0a 100644 --- a/compiler/nativeGen/PositionIndependentCode.hs +++ b/compiler/nativeGen/PositionIndependentCode.hs @@ -525,7 +525,7 @@ needImportedSymbols = not opt_Static && not opt_PIC -- The label used to refer to our "fake GOT" from -- position-independent code. gotLabel = mkForeignLabel -- HACK: it's not really foreign - (fsLit ".LCTOC1") Nothing False + (fsLit ".LCTOC1") Nothing False IsData -- pprGotDeclaration -- Output whatever needs to be output once per .s file. |
