summaryrefslogtreecommitdiff
path: root/utils/genapply
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2015-12-17 12:13:17 +0100
committerBen Gamari <ben@smart-cactus.org>2015-12-17 12:54:31 +0100
commit0cc4aad36f91570b1b489e3d239256d1c781daac (patch)
tree9c78efbbd45b010741ff5010eaa0e88b23eadf3f /utils/genapply
parent27f47cda4a2d91bbeaeeb5efa8d0e3a908798120 (diff)
downloadhaskell-0cc4aad36f91570b1b489e3d239256d1c781daac.tar.gz
Build system: Cabalize genapply
Test Plan: Validate Reviewers: thomie, austin Reviewed By: thomie, austin Differential Revision: https://phabricator.haskell.org/D1639
Diffstat (limited to 'utils/genapply')
-rw-r--r--utils/genapply/Main.hs (renamed from utils/genapply/GenApply.hs)55
-rw-r--r--utils/genapply/genapply.cabal26
-rw-r--r--utils/genapply/ghc.mk14
3 files changed, 58 insertions, 37 deletions
diff --git a/utils/genapply/GenApply.hs b/utils/genapply/Main.hs
index 26b5154395..e58a496f6a 100644
--- a/utils/genapply/GenApply.hs
+++ b/utils/genapply/Main.hs
@@ -31,7 +31,7 @@ import Control.Arrow ((***))
-- -----------------------------------------------------------------------------
-- Argument kinds (rougly equivalent to PrimRep)
-data ArgRep
+data ArgRep
= N -- non-ptr
| P -- ptr
| V -- void
@@ -96,7 +96,7 @@ longRegs n = [ "L" ++ show m | m <- [1..n] ]
-- Loading/saving register arguments to the stack
loadRegArgs :: RegStatus -> Int -> [ArgRep] -> (Doc,Int)
-loadRegArgs regstatus sp args
+loadRegArgs regstatus sp args
= (loadRegOffs reg_locs, sp')
where (reg_locs, _, sp') = assignRegs regstatus sp args
@@ -120,7 +120,7 @@ assign sp [] regs doc = (doc, [], sp)
assign sp (V : args) regs doc = assign sp args regs doc
assign sp (arg : args) regs doc
= case findAvailableReg arg regs of
- Just (reg, regs') -> assign (sp + argSize arg) args regs'
+ Just (reg, regs') -> assign (sp + argSize arg) args regs'
((reg, sp) : doc)
Nothing -> (doc, (arg:args), sp)
@@ -178,7 +178,7 @@ mkBitmap args = foldr f 0 args
-- The entry convention to an stg_ap_ function is as follows: all the
-- arguments are on the stack (we might revisit this at some point,
-- but it doesn't make any difference on x86), and THERE IS AN EXTRA
--- EMPTY STACK SLOT at the top of the stack.
+-- EMPTY STACK SLOT at the top of the stack.
--
-- Why? Because in several cases, stg_ap_* will need an extra stack
-- slot, eg. to push a return address in the THUNK case, and this is a
@@ -312,10 +312,10 @@ genMkPAP regstatus macro jump live ticker disamb
-- for a PAP, we have to arrange that the stack contains a
-- return address in the event that stg_PAP_entry fails its
-- heap check. See stg_PAP_entry in Apply.hc for details.
- if is_pap
+ if is_pap
then text "R2 = " <> mkApplyInfoName this_call_args <> semi
- else empty,
+ else empty,
if is_fun_case then mb_tag_node arity else empty,
if overflow_regs
then text "jump_SAVE_CCCS" <> parens (text jump) <> semi
@@ -328,7 +328,7 @@ genMkPAP regstatus macro jump live ticker disamb
= assignRegs regstatus stk_args_offset args
-- register assignment for *this function call*
- (reg_locs', reg_call_leftovers, reg_call_sp_stk_args)
+ (reg_locs', reg_call_leftovers, reg_call_sp_stk_args)
= assignRegs regstatus stk_args_offset (take arity args)
load_regs
@@ -350,14 +350,14 @@ genMkPAP regstatus macro jump live ticker disamb
| otherwise = reg_call_leftovers
stack_args_size = sum (map argSize this_call_stack_args)
-
+
overflow_regs = args_in_regs && length reg_locs > length reg_locs'
save_extra_regs = (doc, (size,size))
where
-- we have extra arguments in registers to save
extra_reg_locs = drop (length reg_locs') (reverse reg_locs)
- adj_reg_locs = [ (reg, off - adj + 1) |
+ adj_reg_locs = [ (reg, off - adj + 1) |
(reg,off) <- extra_reg_locs ]
adj = case extra_reg_locs of
(reg, fst_off):_ -> fst_off
@@ -413,7 +413,7 @@ genMkPAP regstatus macro jump live ticker disamb
-- Sp++;
-- JMP_(GET_ENTRY(R1.cl));
- exact_arity_case
+ exact_arity_case
= text "if (arity == " <> int n_args <> text ") {" $$
let
(reg_doc, sp')
@@ -424,7 +424,7 @@ genMkPAP regstatus macro jump live ticker disamb
-- text "TICK_SLOW_CALL_" <> text ticker <> text "_CORRECT();",
reg_doc,
text "Sp_adj(" <> int sp' <> text ");",
- if is_pap
+ if is_pap
then text "R2 = " <> fun_info_label <> semi
else empty,
if is_fun_case then mb_tag_node n_args else empty,
@@ -451,7 +451,7 @@ genMkPAP regstatus macro jump live ticker disamb
text "} else {" $$
let
save_regs
- | args_in_regs =
+ | args_in_regs =
text "Sp_adj(" <> int (-sp_offset) <> text ");" $$
saveRegOffs reg_locs
| otherwise =
@@ -469,8 +469,8 @@ genMkPAP regstatus macro jump live ticker disamb
]
else empty
,
- text macro <> char '(' <> int n_args <> comma <>
- int all_args_size <>
+ text macro <> char '(' <> int n_args <> comma <>
+ int all_args_size <>
text "," <> fun_info_label <>
text "," <> text disamb <>
text ");"
@@ -634,10 +634,10 @@ genApply regstatus args =
-- print " [IND_STATIC] &&ind_lbl,"
-- print " [IND_PERM] &&ind_lbl,"
-- print " };"
-
+
tickForArity (length args),
text "",
- text "IF_DEBUG(apply,foreign \"C\" debugBelch(\"" <> fun_ret_label <>
+ text "IF_DEBUG(apply,foreign \"C\" debugBelch(\"" <> fun_ret_label <>
text "... \"); foreign \"C\" printClosure(R1 \"ptr\"));",
text "IF_DEBUG(sanity,foreign \"C\" checkStackFrame(Sp+WDS(" <> int (1 + all_args_size)
@@ -645,14 +645,14 @@ genApply regstatus args =
-- text "IF_DEBUG(sanity,checkStackChunk(Sp+" <> int (1 + all_args_size) <>
-- text ", CurrentTSO->stack + CurrentTSO->stack_size));",
-
+
-- text "TICK_SLOW_CALL(" <> int (length args) <> text ");",
let do_assert [] _ = []
do_assert (arg:args) offset
| isPtr arg = this : rest
| otherwise = rest
- where this = text "ASSERT(LOOKS_LIKE_CLOSURE_PTR(Sp("
+ where this = text "ASSERT(LOOKS_LIKE_CLOSURE_PTR(Sp("
<> int offset <> text ")));"
rest = do_assert args (offset + argSize arg)
in
@@ -767,7 +767,7 @@ genApply regstatus args =
text "foreign \"C\" barf(\"" <> fun_ret_label <> text "\") never returns;"
),
text "}"
-
+
]),
text "}"
]),
@@ -797,7 +797,7 @@ genApplyFast regstatus args =
vcat [
fun_fast_label,
char '{',
- nest 4 (vcat [
+ nest 4 (vcat [
text "W_ info;",
text "W_ arity;",
@@ -827,7 +827,7 @@ genApplyFast regstatus args =
fun_doc
]),
char '}',
-
+
text "default: {",
nest 4 (vcat [
text "Sp_adj" <> parens (int (-sp_offset)) <> semi,
@@ -861,7 +861,7 @@ mkStackApplyEntryLabel:: [ArgRep] -> Doc
mkStackApplyEntryLabel args = text "stg_ap_stk_" <> text (concatMap showArg args)
genStackApply :: RegStatus -> [ArgRep] -> Doc
-genStackApply regstatus args =
+genStackApply regstatus args =
let fn_entry_label = mkStackApplyEntryLabel args in
vcat [
fn_entry_label,
@@ -926,12 +926,12 @@ main = do
text "#include \"AutoApply.h\"",
text "",
- vcat (intersperse (text "") $
+ vcat (intersperse (text "") $
map (genApply regstatus) applyTypes),
- vcat (intersperse (text "") $
+ vcat (intersperse (text "") $
map (genStackFns regstatus) stackApplyTypes),
- vcat (intersperse (text "") $
+ vcat (intersperse (text "") $
map (genApplyFast regstatus) applyTypes),
genStackApplyArray stackApplyTypes,
@@ -1001,7 +1001,7 @@ stackApplyTypes = [
[P,P,P,P,P,P,P,P]
]
-genStackFns regstatus args
+genStackFns regstatus args
= genStackApply regstatus args
$$ genStackSave regstatus args
@@ -1039,7 +1039,6 @@ genBitmapArray types =
]
where
gen_bitmap ty = text "W_" <+> int bitmap_val <> semi
- where bitmap_val =
+ where bitmap_val =
(fromIntegral (mkBitmap ty) `shiftL` BITMAP_BITS_SHIFT)
.|. sum (map argSize ty)
-
diff --git a/utils/genapply/genapply.cabal b/utils/genapply/genapply.cabal
new file mode 100644
index 0000000000..dba3b6d166
--- /dev/null
+++ b/utils/genapply/genapply.cabal
@@ -0,0 +1,26 @@
+Name: genapply
+Version: 0.1
+Copyright: XXX
+License: BSD3
+-- XXX License-File: LICENSE
+-- XXX Author:
+-- XXX Maintainer:
+Synopsis: XXX
+Description:
+ XXX
+build-type: Simple
+cabal-version: >=1.10
+
+Flag unregisterised
+ description: Are we building an unregisterised compiler?
+ default: False
+ manual: True
+
+Executable genapply
+ Default-Language: Haskell2010
+ Main-Is: Main.hs
+ Build-Depends: base >= 3 && < 5,
+ pretty
+
+ if flag(unregisterised)
+ Cpp-Options: -DNO_REGS
diff --git a/utils/genapply/ghc.mk b/utils/genapply/ghc.mk
index 2eea233ea5..e0e5886521 100644
--- a/utils/genapply/ghc.mk
+++ b/utils/genapply/ghc.mk
@@ -10,18 +10,14 @@
#
# -----------------------------------------------------------------------------
-utils/genapply_dist_MODULES = GenApply
-utils/genapply_dist_PROGNAME = genapply
+utils/genapply_USES_CABAL = YES
+utils/genapply_PACKAGE = genapply
+utils/genapply_dist_PROGNAME = genapply
+utils/genapply_dist_INSTALL = NO
utils/genapply_dist_INSTALL_INPLACE = YES
-utils/genapply_HC_OPTS += -package pretty
-
ifeq "$(GhcUnregisterised)" "YES"
-utils/genapply_HC_OPTS += -DNO_REGS
+utils/genapply_CONFIGURE_OPTS = --flag unregisterised
endif
-utils/genapply/GenApply.hs : includes/ghcconfig.h
-utils/genapply/GenApply.hs : includes/MachRegs.h
-utils/genapply/GenApply.hs : includes/Constants.h
-
$(eval $(call build-prog,utils/genapply,dist,0))