Skip to content

Commit 2a2ec67

Browse files
jyasskingraydon
authored andcommitted
Fix opeq.rs for LLVM by implementing simple augmented-assignment operators.
1 parent 9d0d350 commit 2a2ec67

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

src/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,6 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \
433433
obj-recursion.rs \
434434
obj-return-polytypes.rs \
435435
obj-with-vec.rs \
436-
opeq.rs \
437436
output-slot-variants.rs \
438437
pred.rs \
439438
preempt.rs \

src/boot/fe/ast.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,7 @@ let ty_children (ty:ty) : ty array =
13771377
[| |]
13781378
;;
13791379

1380+
let sprintf_binop = sprintf_fmt fmt_binop;;
13801381
let sprintf_expr = sprintf_fmt fmt_expr;;
13811382
let sprintf_name = sprintf_fmt fmt_name;;
13821383
let sprintf_name_component = sprintf_fmt fmt_name_component;;

src/boot/llvm/lltrans.ml

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,25 @@ let trans_crate
731731
Llvm.build_load (trans_lval lval) (anon_llid "tmp") llbuilder
732732
in
733733

734+
let build_binop (op:Ast.binop) (lllhs:Llvm.llvalue) (llrhs:Llvm.llvalue)
735+
: Llvm.llvalue =
736+
let llid = anon_llid "expr" in
737+
match op with
738+
Ast.BINOP_eq ->
739+
(* TODO: equality works on more than just integers *)
740+
Llvm.build_icmp Llvm.Icmp.Eq lllhs llrhs llid llbuilder
741+
742+
(* TODO: signed/unsigned distinction, floating point *)
743+
| Ast.BINOP_add -> Llvm.build_add lllhs llrhs llid llbuilder
744+
| Ast.BINOP_sub -> Llvm.build_sub lllhs llrhs llid llbuilder
745+
| Ast.BINOP_mul -> Llvm.build_mul lllhs llrhs llid llbuilder
746+
| Ast.BINOP_div -> Llvm.build_sdiv lllhs llrhs llid llbuilder
747+
| Ast.BINOP_mod -> Llvm.build_srem lllhs llrhs llid llbuilder
748+
749+
| _ -> raise
750+
(Not_implemented ("build_binop " ^ (Ast.sprintf_binop() op)))
751+
in
752+
734753
let trans_binary_expr
735754
((op:Ast.binop), (lhs:Ast.atom), (rhs:Ast.atom))
736755
: Llvm.llvalue =
@@ -748,23 +767,7 @@ let trans_crate
748767
let lllhs = trans_atom lhs in
749768
(lllhs, llrhs)
750769
in
751-
let llid = anon_llid "expr" in
752-
match op with
753-
Ast.BINOP_eq ->
754-
(* TODO: equality works on more than just integers *)
755-
Llvm.build_icmp Llvm.Icmp.Eq lllhs llrhs llid llbuilder
756-
757-
(* TODO: signed/unsigned distinction, floating point *)
758-
| Ast.BINOP_add -> Llvm.build_add lllhs llrhs llid llbuilder
759-
| Ast.BINOP_sub -> Llvm.build_sub lllhs llrhs llid llbuilder
760-
| Ast.BINOP_mul -> Llvm.build_mul lllhs llrhs llid llbuilder
761-
| Ast.BINOP_div -> Llvm.build_sdiv lllhs llrhs llid llbuilder
762-
| Ast.BINOP_mod -> Llvm.build_srem lllhs llrhs llid llbuilder
763-
764-
| _ -> raise
765-
(Not_implemented
766-
("trans_binary_expr " ^
767-
(Ast.sprintf_expr() (Ast.EXPR_binary (op,lhs,rhs)))))
770+
build_binop op lllhs llrhs
768771
in
769772

770773
let trans_unary_expr e = raise
@@ -854,6 +857,17 @@ let trans_crate
854857
ignore (Llvm.build_store llsrc lldest llbuilder);
855858
trans_tail ()
856859

860+
| Ast.STMT_copy_binop (dest, op, src) ->
861+
let lldest = trans_lval dest in
862+
let llsrc = trans_atom src in
863+
(* FIXME: Handle vecs and strs. *)
864+
let lldest_deref =
865+
Llvm.build_load lldest (anon_llid "dest_init") llbuilder
866+
in
867+
let llres = build_binop op lldest_deref llsrc in
868+
ignore (Llvm.build_store llres lldest llbuilder);
869+
trans_tail ()
870+
857871
| Ast.STMT_call (dest, fn, args) ->
858872
let llargs = Array.map trans_atom args in
859873
let lldest = trans_lval dest in

0 commit comments

Comments
 (0)