Commit badf5d54 authored by Sylvain HENRY's avatar Sylvain HENRY Committed by Ben Gamari

Detect invalid foreign imports in bytecode compiler

The bytecode compiler doesn't handle every foreign import calling
convention. Instead of crashing during the generation of the foreign
call, we display an error.

Fix lint warnings

Test Plan: prog014 ghci test added

Reviewers: austin, hvr, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1458

GHC Trac Issues: #10462
parent 0f495083
......@@ -598,7 +598,10 @@ schemeT d s p app
-- Case 1
| Just (CCall ccall_spec) <- isFCallId_maybe fn
= generateCCall d s p ccall_spec fn args_r_to_l
= if isSupportedCConv ccall_spec
then generateCCall d s p ccall_spec fn args_r_to_l
else unsupportedCConvException
-- Case 2: Constructor application
| Just con <- maybe_saturated_dcon,
......@@ -1508,13 +1511,25 @@ bcIdUnaryType x = case repType (idType x) of
-- See bug #1257
unboxedTupleException :: a
unboxedTupleException
= throwGhcException
(ProgramError
("Error: bytecode compiler can't handle unboxed tuples.\n"++
" Possibly due to foreign import/export decls in source.\n"++
" Workaround: use -fobject-code, or compile this module to .o separately."))
unboxedTupleException = throwGhcException (ProgramError
("Error: bytecode compiler can't handle unboxed tuples.\n"++
" Possibly due to foreign import/export decls in source.\n"++
" Workaround: use -fobject-code, or compile this module to .o separately."))
-- | Indicate if the calling convention is supported
isSupportedCConv :: CCallSpec -> Bool
isSupportedCConv (CCallSpec _ cconv _) = case cconv of
CCallConv -> True -- we explicitly pattern match on every
StdCallConv -> True -- convention to ensure that a warning
PrimCallConv -> False -- is triggered when a new one is added
JavaScriptCallConv -> False
CApiConv -> False
-- See bug #10462
unsupportedCConvException :: a
unsupportedCConvException = throwGhcException (ProgramError
("Error: bytecode compiler can't handle some foreign calling conventions\n"++
" Workaround: use -fobject-code, or compile this module to .o separately."))
mkSLIDE :: Word16 -> Word -> OrdList BCInstr
mkSLIDE n d
......
TOP=../../..
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/test.mk
clean:
rm -f *.o *.hi
prog014: clean
'$(TEST_HC)' $(TEST_HC_OPTS) -c dummy.c
.PHONY: clean prog014
{-# LANGUAGE GHCForeignImportPrim, MagicHash,
UnliftedFFITypes, UnboxedTuples #-}
import GHC.Exts
foreign import prim "dummy"
dummy :: Word# -> Word#
foreign import prim "dummy2"
dummy2 :: Any -> State# RealWorld -> (# State# RealWorld, Word# #)
void dummy() {
}
void dummy2() {
}
test('prog014',
[ extra_run_opts('dummy.o')
, pre_cmd('$MAKE -s --no-print-directory prog014')
, clean_cmd('rm -f dummy.o')
],
ghci_script,
['prog014.script'])
Error: bytecode compiler can't handle some foreign calling conventions
Workaround: use -fobject-code, or compile this module to .o separately.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment