Skip to content

Commit a28f735

Browse files
committed
extract prelude.ll. Will need to read this file and then add its contents into the module somehow
1 parent c5f94a3 commit a28f735

File tree

2 files changed

+134
-2
lines changed

2 files changed

+134
-2
lines changed

prelude.ll

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
; LLVM prelude that is linked against when building the module
2+
@balloon_int = constant i32 0
3+
@balloon_float = constant i32 1
4+
@balloon_boolean = constant i32 2
5+
6+
; Function Attrs: argmemonly nounwind
7+
declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i32, i1) #0
8+
9+
declare i8* @malloc(i32)
10+
11+
declare void @free(i8*)
12+
13+
declare i32 @write(i32, i8*, i32)
14+
15+
declare i32 @putchar(i32)
16+
17+
declare i32 @getchar()
18+
19+
define { i32, i64 }* @box_balloon_int(i64 %input) {
20+
entry:
21+
%mallocmem = call i8* @malloc(i32 ptrtoint ({ i32, i64 }* getelementptr ({ i32, i64 }, { i32, i64 }* null, i32 1) to i32))
22+
%box = bitcast i8* %mallocmem to { i32, i64 }*
23+
%slotp = getelementptr inbounds { i32, i64 }, { i32, i64 }* %box, i32 0, i32 1
24+
store i64 %input, i64* %slotp
25+
%tagval = load i32, i32* @balloon_int
26+
%box_tag = getelementptr inbounds { i32, i64 }, { i32, i64 }* %box, i32 0, i32 0
27+
store i32 %tagval, i32* %box_tag
28+
ret { i32, i64 }* %box
29+
}
30+
31+
define i64 @unbox_balloon_int({ i32, i64 }* %boxp) {
32+
entry:
33+
%slotp = getelementptr inbounds { i32, i64 }, { i32, i64 }* %boxp, i32 0, i32 1
34+
%rawval = load i64, i64* %slotp
35+
ret i64 %rawval
36+
}
37+
38+
define { i32, i64 }* @box_balloon_float(double %input) {
39+
entry:
40+
%f64_to_i64 = bitcast double %input to i64
41+
%mallocmem = call i8* @malloc(i32 ptrtoint ({ i32, i64 }* getelementptr ({ i32, i64 }, { i32, i64 }* null, i32 1) to i32))
42+
%box = bitcast i8* %mallocmem to { i32, i64 }*
43+
%slotp = getelementptr inbounds { i32, i64 }, { i32, i64 }* %box, i32 0, i32 1
44+
store i64 %f64_to_i64, i64* %slotp
45+
%tagval = load i32, i32* @balloon_float
46+
%box_tag = getelementptr inbounds { i32, i64 }, { i32, i64 }* %box, i32 0, i32 0
47+
store i32 %tagval, i32* %box_tag
48+
ret { i32, i64 }* %box
49+
}
50+
51+
define double @unbox_balloon_float({ i32, i64 }* %boxp) {
52+
entry:
53+
%slotp = getelementptr inbounds { i32, i64 }, { i32, i64 }* %boxp, i32 0, i32 1
54+
%rawval = load i64, i64* %slotp
55+
%i64_to_f64 = bitcast i64 %rawval to double
56+
ret double %i64_to_f64
57+
}
58+
59+
define i32 @unbox_tag({ i32, i64 }* %boxp) {
60+
entry:
61+
%tagp = getelementptr inbounds { i32, i64 }, { i32, i64 }* %boxp, i32 0, i32 0
62+
%tag = load i32, i32* %tagp
63+
ret i32 %tag
64+
}
65+
66+
define { i32, i64 }* @balloon_add_box_f64_box_f64({ i32, i64 }* %box1, { i32, i64 }* %box2) {
67+
entry:
68+
%raw1 = call double @unbox_balloon_float({ i32, i64 }* %box1)
69+
%raw2 = call double @unbox_balloon_float({ i32, i64 }* %box2)
70+
%sum = fadd double %raw1, %raw2
71+
%boxed_sum = call { i32, i64 }* @box_balloon_float(double %sum)
72+
ret { i32, i64 }* %boxed_sum
73+
}
74+
75+
define { i32, i64 }* @balloon_add_box_i64_box_f64({ i32, i64 }* %box1, { i32, i64 }* %box2) {
76+
entry:
77+
%raw1 = call i64 @unbox_balloon_int({ i32, i64 }* %box1)
78+
%raw2 = call double @unbox_balloon_float({ i32, i64 }* %box2)
79+
%raw1_float = sitofp i64 %raw1 to double
80+
%sum = fadd double %raw1_float, %raw2
81+
%boxed_sum = call { i32, i64 }* @box_balloon_float(double %sum)
82+
ret { i32, i64 }* %boxed_sum
83+
}
84+
85+
define { i32, i64 }* @balloon_add_box_i64_box_i64({ i32, i64 }* %box1, { i32, i64 }* %box2) {
86+
entry:
87+
%raw1 = call i64 @unbox_balloon_int({ i32, i64 }* %box1)
88+
%raw2 = call i64 @unbox_balloon_int({ i32, i64 }* %box2)
89+
%sum = add i64 %raw1, %raw2
90+
%boxed_sum = call { i32, i64 }* @box_balloon_int(i64 %sum)
91+
ret { i32, i64 }* %boxed_sum
92+
}
93+
94+
define { i32, i64 }* @balloon_add_box_box({ i32, i64 }* %box1, { i32, i64 }* %box2) {
95+
entry:
96+
%tag1 = call i32 @unbox_tag({ i32, i64 }* %box1)
97+
%tag2 = call i32 @unbox_tag({ i32, i64 }* %box2)
98+
switch i32 %tag1, label %unknown_add_types [
99+
i32 0, label %int_wildcard
100+
i32 1, label %float_wildcard
101+
]
102+
103+
unknown_add_types: ; preds = %entry, %float_wildcard, %int_wildcard
104+
%errorbox = call { i32, i64 }* @box_balloon_int(i64 -42)
105+
ret { i32, i64 }* %errorbox
106+
107+
float_float: ; preds = %float_wildcard
108+
%sum = call { i32, i64 }* @balloon_add_box_f64_box_f64({ i32, i64 }* %box1, { i32, i64 }* %box2)
109+
ret { i32, i64 }* %sum
110+
111+
int_int: ; preds = %int_wildcard
112+
%sum1 = call { i32, i64 }* @balloon_add_box_i64_box_i64({ i32, i64 }* %box1, { i32, i64 }* %box2)
113+
ret { i32, i64 }* %sum1
114+
115+
float_int: ; preds = %float_wildcard
116+
%sum2 = call { i32, i64 }* @balloon_add_box_i64_box_f64({ i32, i64 }* %box2, { i32, i64 }* %box1)
117+
ret { i32, i64 }* %sum2
118+
119+
int_float: ; preds = %int_wildcard
120+
%sum3 = call { i32, i64 }* @balloon_add_box_i64_box_f64({ i32, i64 }* %box1, { i32, i64 }* %box2)
121+
ret { i32, i64 }* %sum3
122+
123+
int_wildcard: ; preds = %entry
124+
switch i32 %tag2, label %unknown_add_types [
125+
i32 0, label %int_int
126+
i32 1, label %int_float
127+
]
128+
129+
float_wildcard: ; preds = %entry
130+
switch i32 %tag2, label %unknown_add_types [
131+
i32 0, label %float_int
132+
i32 1, label %float_float
133+
]
134+
}

src/llvm_interpreter.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// sample LLVM code lifted from
2-
// https://github.com/Wilfred/bfc/blob/master/src/llvm.rs
31
use std::rc::Rc;
42
use std::cell::RefCell;
53
use std::fmt;

0 commit comments

Comments
 (0)