Skip to content

Commit fbc525f

Browse files
authored
Merge branch 'main' into jo
2 parents a27d071 + 01b3e78 commit fbc525f

59 files changed

Lines changed: 458 additions & 274 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

langs/a86/ast.rkt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
(error n "expects register; given ~v" a1))
4444
(unless (or (exact-integer? a2) (register? a2) (offset? a2))
4545
(error n "expects exact integer, register, or offset; given ~v" a2))
46+
(when (and (exact-integer? a2) (> (integer-length a2) 32))
47+
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-length a2)))
4648
(values a1 a2)))
4749

4850
(define check:register
@@ -59,6 +61,22 @@
5961
(error n "expects register, offset, exact integer, or defined constant; given ~v" a2))
6062
(when (and (offset? a1) (offset? a2))
6163
(error n "cannot use two memory locations; given ~v, ~v" a1 a2))
64+
(when (and (exact-integer? a2) (> (integer-length a2) 32))
65+
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-length a2)))
66+
(when (and (offset? a1) (exact-integer? a2))
67+
(error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2))
68+
(values a1 a2)))
69+
70+
(define check:mov
71+
(λ (a1 a2 n)
72+
(unless (or (register? a1) (offset? a1))
73+
(error n "expects register or offset; given ~v" a1))
74+
(unless (or (register? a2) (offset? a2) (exact-integer? a2) (Const? a2))
75+
(error n "expects register, offset, exact integer, or defined constant; given ~v" a2))
76+
(when (and (offset? a1) (offset? a2))
77+
(error n "cannot use two memory locations; given ~v, ~v" a1 a2))
78+
(when (and (exact-integer? a2) (> (integer-length a2) 64))
79+
(error n "literal must not exceed 64-bits; given ~v (~v bits)" a2 (integer-length a2)))
6280
(when (and (offset? a1) (exact-integer? a2))
6381
(error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2))
6482
(values a1 a2)))
@@ -84,6 +102,8 @@
84102
(λ (a1 n)
85103
(unless (or (exact-integer? a1) (register? a1))
86104
(error n "expects exact integer or register; given ~v" a1))
105+
(when (and (exact-integer? a1) (> (integer-length a1) 32))
106+
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a1 (integer-length a1)))
87107
a1))
88108

89109
(define check:lea
@@ -134,7 +154,7 @@
134154
(instruct Label (x) check:label-symbol)
135155
(instruct Call (x) check:target)
136156
(instruct Ret () check:none)
137-
(instruct Mov (dst src) check:src-dest)
157+
(instruct Mov (dst src) check:mov)
138158
(instruct Add (dst src) check:arith)
139159
(instruct Sub (dst src) check:arith)
140160
(instruct Cmp (a1 a2) check:src-dest)
@@ -192,14 +212,22 @@
192212
(symbol? x)
193213
(integer? x)))
194214

195-
(provide offset? register? instruction? label?)
215+
(provide offset? register? instruction? label? 64-bit-integer? 32-bit-integer?)
196216

197217
(define offset? Offset?)
198218

199219
(define (register? x)
200220
(and (memq x '(cl eax rax rbx rcx rdx rbp rsp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15))
201221
#t))
202222

223+
(define (64-bit-integer? x)
224+
(and (exact-integer? x)
225+
(<= (integer-length x) 64)))
226+
227+
(define (32-bit-integer? x)
228+
(and (exact-integer? x)
229+
(<= (integer-length x) 32)))
230+
203231
(define (label? x)
204232
(and (symbol? x)
205233
(nasm-label? x)

langs/a86/test/errors.rkt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,21 @@
22
(require rackunit "../ast.rkt")
33
(check-exn exn:fail?
44
(thunk (Mov (Offset 'rax 0) 100)))
5+
6+
;; Checking literal widths
7+
(check-exn exn:fail? (thunk (Mov 'rax (expt 2 64))))
8+
(check-not-exn (thunk (Mov 'rax (sub1 (expt 2 64)))))
9+
(check-exn exn:fail? (thunk (Cmp 'rax (expt 2 32))))
10+
(check-not-exn (thunk (Cmp 'rax (sub1 (expt 2 32)))))
11+
(check-exn exn:fail? (thunk (And 'rax (expt 2 32))))
12+
(check-not-exn (thunk (And 'rax (sub1 (expt 2 32)))))
13+
(check-exn exn:fail? (thunk (Or 'rax (expt 2 32))))
14+
(check-not-exn (thunk (Or 'rax (sub1 (expt 2 32)))))
15+
(check-exn exn:fail? (thunk (Xor 'rax (expt 2 32))))
16+
(check-not-exn (thunk (Xor 'rax (sub1 (expt 2 32)))))
17+
(check-exn exn:fail? (thunk (Push (expt 2 32))))
18+
(check-not-exn (thunk (Push (sub1 (expt 2 32)))))
19+
(check-exn exn:fail? (thunk (Add 'rax (expt 2 32))))
20+
(check-not-exn (thunk (Add 'rax (sub1 (expt 2 32)))))
21+
(check-exn exn:fail? (thunk (Sub 'rax (expt 2 32))))
22+
(check-not-exn (thunk (Sub 'rax (sub1 (expt 2 32)))))

langs/abscond/parse.rkt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
9-
[_ (error "Parse error")]))
8+
[(? exact-integer?) (Int s)]
9+
[_ (error "Parse error")]))

langs/blackmail/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
8+
[(? exact-integer?) (Int s)]
99
[(list (? op1? o) e) (Prim1 o (parse e))]
1010
[_ (error "Parse error")]))
1111

langs/con/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
8+
[(? exact-integer?) (Int s)]
99
[(list (? op1? o) e) (Prim1 o (parse e))]
1010
[(list 'if (list 'zero? e1) e2 e3)
1111
(IfZero (parse e1) (parse e2) (parse e3))]

langs/dodger/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
8+
[(? exact-integer?) (Int s)]
99
[(? boolean?) (Bool s)]
1010
[(? char?) (Char s)]
1111
[(list (? op1? o) e) (Prim1 o (parse e))]

langs/dupe/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
8+
[(? exact-integer?) (Int s)]
99
[(? boolean?) (Bool s)]
1010
[(list (? op1? o) e) (Prim1 o (parse e))]
1111
[(list 'if e1 e2 e3)

langs/evildoer/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
(define (parse s)
77
(match s
88
['eof (Eof)]
9-
[(? integer?) (Int s)]
9+
[(? exact-integer?) (Int s)]
1010
[(? boolean?) (Bool s)]
1111
[(? char?) (Char s)]
1212
[(list (? op0? o)) (Prim0 o)]

langs/extort/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer? s) (Int s)]
8+
[(? exact-integer? s) (Int s)]
99
[(? boolean? s) (Bool s)]
1010
[(? char? s) (Char s)]
1111
['eof (Eof)]

langs/fraud/parse.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
;; S-Expr -> Expr
66
(define (parse s)
77
(match s
8-
[(? integer?) (Int s)]
8+
[(? exact-integer?) (Int s)]
99
[(? boolean? s) (Bool s)]
1010
[(? char? s) (Char s)]
1111
['eof (Eof)]

0 commit comments

Comments
 (0)