Skip to content

Commit 36a944a

Browse files
committed
Add Fib100 example that overflows
1 parent d8a232e commit 36a944a

8 files changed

Lines changed: 1480 additions & 0 deletions

examples/Fib100.lc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
recFib : Int -> Int -> Int -> Int -> Int;;
2+
recFib = \n -> \l -> \x -> \y ->
3+
if n < l
4+
then 0
5+
else printInt l before
6+
printInt x before
7+
recFib n (l + 1) y (x + y)
8+
;;
9+
10+
fib = \(n : Int) -> recFib n 0 0 1
11+
;;
12+
13+
main = fib 100

test/golden/Fib100.lc.cbpv

Lines changed: 594 additions & 0 deletions
Large diffs are not rendered by default.

test/golden/Fib100.lc.code.gen.am

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
[ TmDefCodeSection
2+
{ tmDefCode =
3+
[ ISetReturn
4+
( VaThunk "sys_thunk_1" [] )
5+
, IDefine "top_e_recFib"
6+
]
7+
}
8+
, TmDefCodeSection
9+
{ tmDefCode =
10+
[ ISetReturn
11+
( VaThunk "sys_thunk_2" [] )
12+
, IDefine "top_e_fib"
13+
]
14+
}
15+
, TmDefCodeSection
16+
{ tmDefCode =
17+
[ IPush
18+
( VaInt 100 )
19+
, ICall
20+
( VaAddr
21+
( AIdent "top_e_fib" )
22+
)
23+
, IDefine "top_e_main"
24+
]
25+
}
26+
, ThunkCodeSection
27+
{ thunkCodeSectionName = "sys_thunk_0"
28+
, thunkCode =
29+
[ IPop
30+
( AIdent "var_aa_0_1" )
31+
, IPop
32+
( AIdent "var_aa_1_1" )
33+
, IScope
34+
, IPush
35+
( VaAddr
36+
( AIdent "var_aa_0_1" )
37+
)
38+
, IPush
39+
( VaAddr
40+
( AIdent "var_aa_1_1" )
41+
)
42+
, IPrimBinOp PrimILt
43+
, IEndScope
44+
, IReceive
45+
( AIdent "var_c_c_1" )
46+
, IPop
47+
( AIdent "var_aa_2_1" )
48+
, IPop
49+
( AIdent "var_aa_3_1" )
50+
, ICondJump
51+
( VaAddr
52+
( AIdent "var_c_c_1" )
53+
) 2
54+
, ISetReturn
55+
( VaInt 0 )
56+
, IJump 19
57+
, IScope
58+
, IPush
59+
( VaAddr
60+
( AIdent "var_aa_1_1" )
61+
)
62+
, IPush
63+
( VaInt 1 )
64+
, IPrimBinOp PrimIAdd
65+
, IEndScope
66+
, IReceive
67+
( AIdent "var_c_a1_6" )
68+
, IScope
69+
, IPush
70+
( VaAddr
71+
( AIdent "var_aa_2_1" )
72+
)
73+
, IPush
74+
( VaAddr
75+
( AIdent "var_aa_3_1" )
76+
)
77+
, IPrimBinOp PrimIAdd
78+
, IEndScope
79+
, IReceive
80+
( AIdent "var_c_a3_6" )
81+
, IPrintInt
82+
( VaAddr
83+
( AIdent "var_aa_1_1" )
84+
)
85+
, IPrintInt
86+
( VaAddr
87+
( AIdent "var_aa_2_1" )
88+
)
89+
, IPush
90+
( VaAddr
91+
( AIdent "var_c_a3_6" )
92+
)
93+
, IPush
94+
( VaAddr
95+
( AIdent "var_aa_3_1" )
96+
)
97+
, IPush
98+
( VaAddr
99+
( AIdent "var_c_a1_6" )
100+
)
101+
, IPush
102+
( VaAddr
103+
( AIdent "var_aa_0_1" )
104+
)
105+
, ICall
106+
( VaAddr
107+
( ALocalEnv 0 )
108+
)
109+
, IExit
110+
]
111+
, thunkEnvSize = 1
112+
}
113+
, ThunkCodeSection
114+
{ thunkCodeSectionName = "sys_thunk_1"
115+
, thunkCode =
116+
[ IPop
117+
( AIdent "var_aa_0_2" )
118+
, IPop
119+
( AIdent "var_aa_1_2" )
120+
, IPop
121+
( AIdent "var_aa_2_2" )
122+
, IPop
123+
( AIdent "var_aa_3_2" )
124+
, IPush
125+
( VaAddr
126+
( AIdent "var_aa_3_2" )
127+
)
128+
, IPush
129+
( VaAddr
130+
( AIdent "var_aa_2_2" )
131+
)
132+
, IPush
133+
( VaAddr
134+
( AIdent "var_aa_1_2" )
135+
)
136+
, IPush
137+
( VaAddr
138+
( AIdent "var_aa_0_2" )
139+
)
140+
, IRecAssign
141+
( AIdent "var_e_recFib" ) "sys_thunk_0"
142+
[ AIdent "var_e_recFib" ]
143+
, ICall
144+
( VaAddr
145+
( AIdent "var_e_recFib" )
146+
)
147+
, IExit
148+
]
149+
, thunkEnvSize = 0
150+
}
151+
, ThunkCodeSection
152+
{ thunkCodeSectionName = "sys_thunk_2"
153+
, thunkCode =
154+
[ IPop
155+
( AIdent "var_aa_0_0" )
156+
, IPush
157+
( VaInt 1 )
158+
, IPush
159+
( VaInt 0 )
160+
, IPush
161+
( VaInt 0 )
162+
, IPush
163+
( VaAddr
164+
( AIdent "var_aa_0_0" )
165+
)
166+
, ICall
167+
( VaAddr
168+
( AIdent "top_e_recFib" )
169+
)
170+
, IExit
171+
]
172+
, thunkEnvSize = 0
173+
}
174+
]

test/golden/Fib100.lc.code.gen.c

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#include <runtime.h>
2+
3+
void sys_thunk_7(item *const env, item *const ret);
4+
void sys_thunk_8(item *const env, item *const ret);
5+
void sys_thunk_9(item *const env, item *const ret);
6+
item top_e_recFib;
7+
void sys_thunk_12(item *const env, item *const ret);
8+
void sys_thunk_13(item *const env, item *const ret);
9+
item top_e_fib;
10+
void sys_thunk_16(item *const env, item *const ret);
11+
item top_e_main;
12+
13+
void sys_thunk_7(item *const env, item *const ret)
14+
{
15+
/* TmLam (Param {paramName = "aa_0_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_1", paramType = TpInt}) (TmTo (TmPrimBinOp PrimILt (TmVar "aa_0_1") (TmVar "aa_1_1")) "c_c_1" (TmLam (Param {paramName = "aa_2_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_1", paramType = TpInt}) (TmIf (TmVar "c_c_1") (TmReturn (TmInt 0)) (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_1_1") (TmInt 1)) "c_a1_6" (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_2_1") (TmVar "aa_3_1")) "c_a3_6" (TmPrintInt (TmVar "aa_1_1") (TmPrintInt (TmVar "aa_2_1") (TmApp (TmApp (TmApp (TmApp (TmForce (TmVar "e_recFib")) (TmVar "aa_0_1")) (TmVar "c_a1_6")) (TmVar "aa_3_1")) (TmVar "c_a3_6"))))))))))) */
16+
const item var_aa_0_1 = (global_stack.items[--global_stack.top]);
17+
const item var_aa_1_1 = (global_stack.items[--global_stack.top]);
18+
const item sys_arg0_0 = var_aa_0_1;
19+
const item sys_arg1_0 = var_aa_1_1;
20+
(*ret).int_item = sys_arg0_0.int_item < sys_arg1_0.int_item;
21+
const item var_c_c_1 = (*ret);
22+
const item var_aa_2_1 = (global_stack.items[--global_stack.top]);
23+
const item var_aa_3_1 = (global_stack.items[--global_stack.top]);
24+
const item sys_c_6 = var_c_c_1;
25+
if (sys_c_6.int_item)
26+
{
27+
(*ret).int_item = 0;
28+
}
29+
else
30+
{
31+
const item sys_arg0_1 = var_aa_1_1;
32+
const item sys_arg1_1 = {.int_item = 1};
33+
(*ret).int_item = sys_arg0_1.int_item + sys_arg1_1.int_item;
34+
const item var_c_a1_6 = (*ret);
35+
const item sys_arg0_2 = var_aa_2_1;
36+
const item sys_arg1_2 = var_aa_3_1;
37+
(*ret).int_item = sys_arg0_2.int_item + sys_arg1_2.int_item;
38+
const item var_c_a3_6 = (*ret);
39+
const item sys_msg_5 = var_aa_1_1;
40+
printf("%d\n", sys_msg_5.int_item);
41+
const item sys_msg_4 = var_aa_2_1;
42+
printf("%d\n", sys_msg_4.int_item);
43+
(global_stack.items[global_stack.top++]) = var_c_a3_6;
44+
(global_stack.items[global_stack.top++]) = var_aa_3_1;
45+
(global_stack.items[global_stack.top++]) = var_c_a1_6;
46+
(global_stack.items[global_stack.top++]) = var_aa_0_1;
47+
const item sys_t_3 = (env[0]);
48+
sys_t_3.thunk_item.code(sys_t_3.thunk_item.env, ret);
49+
}
50+
51+
}
52+
53+
void sys_thunk_8(item *const _, item *const ret)
54+
{
55+
/* TmLam (Param {paramName = "aa_0_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_2_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_2", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmRec (Param {paramName = "e_recFib", paramType = TpUp (TpInt :->: (TpInt :->: (TpInt :->: (TpInt :->: TpDown TpInt))))}) (TmLam (Param {paramName = "aa_0_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_1", paramType = TpInt}) (TmTo (TmPrimBinOp PrimILt (TmVar "aa_0_1") (TmVar "aa_1_1")) "c_c_1" (TmLam (Param {paramName = "aa_2_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_1", paramType = TpInt}) (TmIf (TmVar "c_c_1") (TmReturn (TmInt 0)) (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_1_1") (TmInt 1)) "c_a1_6" (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_2_1") (TmVar "aa_3_1")) "c_a3_6" (TmPrintInt (TmVar "aa_1_1") (TmPrintInt (TmVar "aa_2_1") (TmApp (TmApp (TmApp (TmApp (TmForce (TmVar "e_recFib")) (TmVar "aa_0_1")) (TmVar "c_a1_6")) (TmVar "aa_3_1")) (TmVar "c_a3_6"))))))))))))) (TmVar "aa_0_2")) (TmVar "aa_1_2")) (TmVar "aa_2_2")) (TmVar "aa_3_2"))))) */
56+
const item var_aa_0_2 = (global_stack.items[--global_stack.top]);
57+
const item var_aa_1_2 = (global_stack.items[--global_stack.top]);
58+
const item var_aa_2_2 = (global_stack.items[--global_stack.top]);
59+
const item var_aa_3_2 = (global_stack.items[--global_stack.top]);
60+
(global_stack.items[global_stack.top++]) = var_aa_3_2;
61+
(global_stack.items[global_stack.top++]) = var_aa_2_2;
62+
(global_stack.items[global_stack.top++]) = var_aa_1_2;
63+
(global_stack.items[global_stack.top++]) = var_aa_0_2;
64+
const item var_e_recFib = {.thunk_item = {.code = sys_thunk_7, .env = (item *) malloc(1 * sizeof(item))}};
65+
(var_e_recFib.thunk_item.env[0]) = var_e_recFib;
66+
var_e_recFib.thunk_item.code(var_e_recFib.thunk_item.env, ret);
67+
}
68+
69+
void sys_thunk_9(item *const _, item *const ret)
70+
{
71+
/* TmReturn (TmThunk (TmLam (Param {paramName = "aa_0_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_2_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_2", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmRec (Param {paramName = "e_recFib", paramType = TpUp (TpInt :->: (TpInt :->: (TpInt :->: (TpInt :->: TpDown TpInt))))}) (TmLam (Param {paramName = "aa_0_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_1", paramType = TpInt}) (TmTo (TmPrimBinOp PrimILt (TmVar "aa_0_1") (TmVar "aa_1_1")) "c_c_1" (TmLam (Param {paramName = "aa_2_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_1", paramType = TpInt}) (TmIf (TmVar "c_c_1") (TmReturn (TmInt 0)) (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_1_1") (TmInt 1)) "c_a1_6" (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_2_1") (TmVar "aa_3_1")) "c_a3_6" (TmPrintInt (TmVar "aa_1_1") (TmPrintInt (TmVar "aa_2_1") (TmApp (TmApp (TmApp (TmApp (TmForce (TmVar "e_recFib")) (TmVar "aa_0_1")) (TmVar "c_a1_6")) (TmVar "aa_3_1")) (TmVar "c_a3_6"))))))))))))) (TmVar "aa_0_2")) (TmVar "aa_1_2")) (TmVar "aa_2_2")) (TmVar "aa_3_2"))))))) */
72+
(*ret).thunk_item.code = sys_thunk_8;
73+
(*ret).thunk_item.env = NULL;
74+
}
75+
76+
77+
void sys_thunk_12(item *const _, item *const ret)
78+
{
79+
/* TmLam (Param {paramName = "aa_0_0", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmForce (TmGlobal "e_recFib")) (TmVar "aa_0_0")) (TmInt 0)) (TmInt 0)) (TmInt 1)) */
80+
const item var_aa_0_0 = (global_stack.items[--global_stack.top]);
81+
(global_stack.items[global_stack.top++]).int_item = 1;
82+
(global_stack.items[global_stack.top++]).int_item = 0;
83+
(global_stack.items[global_stack.top++]).int_item = 0;
84+
(global_stack.items[global_stack.top++]) = var_aa_0_0;
85+
const item sys_t_11 = top_e_recFib;
86+
sys_t_11.thunk_item.code(sys_t_11.thunk_item.env, ret);
87+
}
88+
89+
void sys_thunk_13(item *const _, item *const ret)
90+
{
91+
/* TmReturn (TmThunk (TmLam (Param {paramName = "aa_0_0", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmForce (TmGlobal "e_recFib")) (TmVar "aa_0_0")) (TmInt 0)) (TmInt 0)) (TmInt 1)))) */
92+
(*ret).thunk_item.code = sys_thunk_12;
93+
(*ret).thunk_item.env = NULL;
94+
}
95+
96+
97+
void sys_thunk_16(item *const _, item *const ret)
98+
{
99+
/* TmApp (TmForce (TmGlobal "e_fib")) (TmInt 100) */
100+
(global_stack.items[global_stack.top++]).int_item = 100;
101+
const item sys_t_15 = top_e_fib;
102+
sys_t_15.thunk_item.code(sys_t_15.thunk_item.env, ret);
103+
}
104+
105+
106+
int main(void)
107+
{
108+
item retv;
109+
{
110+
item *const ret = &retv;
111+
/* TmReturn (TmThunk (TmLam (Param {paramName = "aa_0_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_2_2", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_2", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmRec (Param {paramName = "e_recFib", paramType = TpUp (TpInt :->: (TpInt :->: (TpInt :->: (TpInt :->: TpDown TpInt))))}) (TmLam (Param {paramName = "aa_0_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_1_1", paramType = TpInt}) (TmTo (TmPrimBinOp PrimILt (TmVar "aa_0_1") (TmVar "aa_1_1")) "c_c_1" (TmLam (Param {paramName = "aa_2_1", paramType = TpInt}) (TmLam (Param {paramName = "aa_3_1", paramType = TpInt}) (TmIf (TmVar "c_c_1") (TmReturn (TmInt 0)) (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_1_1") (TmInt 1)) "c_a1_6" (TmTo (TmPrimBinOp PrimIAdd (TmVar "aa_2_1") (TmVar "aa_3_1")) "c_a3_6" (TmPrintInt (TmVar "aa_1_1") (TmPrintInt (TmVar "aa_2_1") (TmApp (TmApp (TmApp (TmApp (TmForce (TmVar "e_recFib")) (TmVar "aa_0_1")) (TmVar "c_a1_6")) (TmVar "aa_3_1")) (TmVar "c_a3_6"))))))))))))) (TmVar "aa_0_2")) (TmVar "aa_1_2")) (TmVar "aa_2_2")) (TmVar "aa_3_2"))))))) */
112+
const item sys_t_10 = {.thunk_item = {.code = sys_thunk_9, .env = NULL}};
113+
sys_t_10.thunk_item.code(sys_t_10.thunk_item.env, ret);
114+
top_e_recFib = (*ret);
115+
/* TmReturn (TmThunk (TmLam (Param {paramName = "aa_0_0", paramType = TpInt}) (TmApp (TmApp (TmApp (TmApp (TmForce (TmGlobal "e_recFib")) (TmVar "aa_0_0")) (TmInt 0)) (TmInt 0)) (TmInt 1)))) */
116+
const item sys_t_14 = {.thunk_item = {.code = sys_thunk_13, .env = NULL}};
117+
sys_t_14.thunk_item.code(sys_t_14.thunk_item.env, ret);
118+
top_e_fib = (*ret);
119+
/* TmApp (TmForce (TmGlobal "e_fib")) (TmInt 100) */
120+
const item sys_t_17 = {.thunk_item = {.code = sys_thunk_16, .env = NULL}};
121+
sys_t_17.thunk_item.code(sys_t_17.thunk_item.env, ret);
122+
top_e_main = (*ret);
123+
}
124+
return top_e_main.int_item;
125+
}
126+

test/golden/Fib100.lc.compile.c.log

Whitespace-only changes.

0 commit comments

Comments
 (0)