Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
brainfucker
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Taddeüs Kroes
brainfucker
Commits
50b028d2
Commit
50b028d2
authored
10 years ago
by
Taddeüs Kroes
Browse files
Options
Downloads
Patches
Plain Diff
Code + makefile cleanup
parent
bf263fa2
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Makefile
+5
-4
5 additions, 4 deletions
Makefile
bf.ml
+13
-15
13 additions, 15 deletions
bf.ml
with
18 additions
and
19 deletions
Makefile
+
5
−
4
View file @
50b028d2
LD
:=
clang
LDFLAGS
:=
-nostartfiles
BFILES
:=
$(
wildcard
*
.b
)
BFILES
:=
$(
patsubst %.b,%,
$(
wildcard
*
.b
)
)
.PHONY
:
clean
.PRECIOUS
:
$(
patsubst %.b
,
%.ll %
-opt.ll
,
$(BFILES))
.PRECIOUS
:
$(
addsuffix .ll
,
$(BFILES)) $(addsuffix
-opt.ll
,
$(BFILES))
bf
:
bf.ml
ocamlopt
-o
$@
-g
-I
/usr/lib/ocaml/llvm-3.5 llvm.cmxa
$^
ocamlopt
-o
$@
-g
-I
/usr/lib/ocaml/llvm-3.5 llvm.cmxa
$<
rm
-f
$@
.cmi
$@
.cmx
$@
.o
%
:
%.o
$(
LD
)
-o
$@
$<
$(
LDFLAGS
)
...
...
@@ -24,4 +25,4 @@ bf: bf.ml
./bf <
$<
>
$@
clean
:
rm
-f
bf
*
.cmi
*
.cmx
*
.ll
*
.bc
*
.o
$(
patsubst %.b,%
,
$(
BFILES
))
rm
-f
bf
*
.cmi
*
.cmx
*
.ll
*
.bc
*
.o
$(
BFILES
)
$(
addsuffix
-opt
,
$(
BFILES
))
This diff is collapsed.
Click to expand it.
bf.ml
+
13
−
15
View file @
50b028d2
...
...
@@ -49,14 +49,15 @@ let compile memsize program =
let
byte_ty
=
i8_type
ctx
in
let
byteptr_ty
=
pointer_type
byte_ty
in
let
i1
_ty
=
i1_type
ctx
in
let
bool
_ty
=
i1_type
ctx
in
let
i32_ty
=
i32_type
ctx
in
let
int_ty
=
i32_ty
in
let
void_ty
=
void_type
ctx
in
let
putchar
=
declare_function
"putchar"
(
function_type
i
nt
_ty
[
|
byte_ty
|
])
m
in
let
putchar
=
declare_function
"putchar"
(
function_type
i
32
_ty
[
|
byte_ty
|
])
m
in
let
getchar
=
declare_function
"getchar"
(
function_type
byte_ty
[
||
])
m
in
let
cexit
=
declare_function
"exit"
(
function_type
void_ty
[
|
i32_ty
|
])
m
in
(* use custom _start symbol rather than main function to reduce complexity *)
let
f
=
define_function
"_start"
(
function_type
void_ty
[
||
])
m
in
let
bb_cur
=
ref
(
entry_block
f
)
in
let
b
=
builder_at_end
ctx
!
bb_cur
in
...
...
@@ -66,13 +67,11 @@ let compile memsize program =
bb_cur
:=
bb
in
let
i
n
=
const_int
i
nt
_ty
n
in
let
i
n
=
const_int
i
32
_ty
n
in
let
i8
n
=
const_int
byte_ty
n
in
(*let mem = define_global "mem" (const_null (array_type byte_ty memsize)) m in
set_linkage Linkage.Private mem;*)
let
mem
=
build_alloca
(
array_type
byte_ty
memsize
)
"mem"
b
in
let
idx
=
build_alloca
i
nt
_ty
"idx"
b
in
let
idx
=
build_alloca
i
32
_ty
"idx"
b
in
let
gep
()
=
build_in_bounds_gep
mem
[
|
i
0
;
build_load
idx
""
b
|
]
""
b
in
let
load
ptr
=
build_load
ptr
""
b
in
...
...
@@ -97,14 +96,14 @@ let compile memsize program =
let
bb_body
=
insert_block
ctx
""
bb_end
in
let
bb_cond
=
insert_block
ctx
""
bb_body
in
ignore
(
build_br
bb_cond
b
)
;
build_br
bb_cond
b
|>
ignore
;
position_at_end
bb_cond
b
;
let
cond
=
build_icmp
Icmp
.
Eq
(
load
(
gep
()
))
(
i8
0
)
""
b
in
ignore
(
build_cond_br
cond
bb_end
bb_body
b
)
;
build_cond_br
cond
bb_end
bb_body
b
|>
ignore
;
set_cur_bb
bb_body
;
List
.
iter
compile_command
p
;
ignore
(
build_br
bb_cond
b
)
;
build_br
bb_cond
b
|>
ignore
;
set_cur_bb
bb_end
in
...
...
@@ -112,20 +111,19 @@ let compile memsize program =
(* zero-initialize memory (use intrinsic for optimization assumptions) *)
set_data_layout
"e"
m
;
(* little-endian, needed for optimization *)
let
memset
=
let
arg_types
=
[
|
byteptr_ty
;
byte_ty
;
i32_ty
;
i32_ty
;
i1
_ty
|
]
in
let
arg_types
=
[
|
byteptr_ty
;
byte_ty
;
i32_ty
;
i32_ty
;
bool
_ty
|
]
in
declare_function
"llvm.memset.p0i8.i32"
(
function_type
void_ty
arg_types
)
m
in
let
ptr
=
build_bitcast
mem
byteptr_ty
""
b
in
build_call
memset
[
|
ptr
;
i8
0
;
i
memsize
;
i
0
;
const_int
i1
_ty
0
|
]
""
b
|>
ignore
;
build_call
memset
[
|
ptr
;
i8
0
;
i
memsize
;
i
0
;
const_int
bool
_ty
0
|
]
""
b
|>
ignore
;
(* set pivot to index 0 and compile program commands *)
store
idx
(
i
0
);
List
.
iter
compile_command
program
;
(* exit gracefully *)
let
cexit
=
declare_function
"exit"
(
function_type
void_ty
[
|
i32_ty
|
])
m
in
ignore
(
build_call
cexit
[
|
i
0
|
]
""
b
);
ignore
(
build_ret_void
b
);
build_call
cexit
[
|
i
0
|
]
""
b
|>
ignore
;
build_ret_void
b
|>
ignore
;
m
let
()
=
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment