Skip to content

Commit 0865aca

Browse files
committed
Revise handling of square bracket printing for labels
Previous implementations manually added the `rip` address under certain conditions, but these did not always work properly in the presence of labels. This change dynamically tracks whether a label occurs within the bounds of square-bracket notation and only injects `rip` under these circumstances.
1 parent 058ce7a commit 0865aca

1 file changed

Lines changed: 45 additions & 16 deletions

File tree

a86/printer.rkt

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@
1414
(define (asm-string a)
1515
(with-output-to-string (lambda () (asm-display a))))
1616

17+
(define label-occurred? (make-parameter #f))
18+
(define-syntax (sqbracket stx)
19+
(syntax-case stx ()
20+
[(_ e)
21+
#'(parameterize ([label-occurred? #f])
22+
(let ([v e])
23+
(string-append "["
24+
v
25+
(if (label-occurred?)
26+
" + rip"
27+
"")
28+
"]")))]))
29+
1730
(define tab (make-string 8 #\space))
1831

1932
(define (comment->string c)
@@ -28,8 +41,14 @@
2841
;; prefix with _ for Mac
2942
(define label-symbol->string
3043
(match (system-type 'os)
31-
['macosx (λ (s) (string-append "_" (symbol->string s)))]
32-
[_ (λ (s) (symbol->string s))]))
44+
['macosx
45+
(λ (s)
46+
(label-occurred? #t)
47+
(string-append "_" (symbol->string s)))]
48+
[_
49+
(λ (s)
50+
(label-occurred? #t)
51+
(symbol->string s))]))
3352

3453
;(if (and (current-shared?) (memq s (current-extern-labels)))
3554
; hack for ELF64 shared libraries in service of
@@ -39,9 +58,15 @@
3958

4059
(define extern-label-decl-symbol->string
4160
(match (system-type 'os)
42-
['macosx (λ (s) (string-append "_" (symbol->string s)))]
43-
[_ (λ (s) (symbol->string s))]))
44-
61+
['macosx
62+
(λ (s)
63+
(label-occurred? #t)
64+
(string-append "_" (symbol->string s)))]
65+
[_
66+
(λ (s)
67+
(label-occurred? #t)
68+
(symbol->string s))]))
69+
4570
;; Instruction -> String
4671
(define (common-instruction->string i)
4772
(let ((as (instruction-args i)))
@@ -66,7 +91,7 @@
6691
(match x
6792
[(? integer?) (number->string x)]
6893
[(? symbol?) (symbol->string x)]
69-
[($ x) (string-append (label-symbol->string x) " + rip ")]))
94+
[($ x) (label-symbol->string x)]))
7095
(match m
7196
[(Mem l b i o s)
7297
(string-append
@@ -80,11 +105,14 @@
80105
(define (arg->string e)
81106
(match e
82107
[(? register?) (symbol->string e)]
83-
[(? Mem?) (string-append "[" (mem->string e) "]")]
84-
[(Offset (? register? r)) (string-append "[" (symbol->string r) "]")]
85-
[(Offset ($ (? label? r))) (string-append "[" (label-symbol->string r) " + rip]")]
86-
[(Offset e)
87-
(string-append "[" (exp->string e) "]")]
108+
#;[(? Mem?) (string-append "[" (mem->string e) "]")]
109+
#;[(Offset (? register? r)) (string-append "[" (symbol->string r) "]")]
110+
#;[(Offset ($ (? label? r))) (string-append "[" (label-symbol->string r) " + rip]")]
111+
#;[(Offset e) (string-append "[" (exp->string e) "]")]
112+
[(? Mem?) (sqbracket (mem->string e))]
113+
[(Offset (? register? r)) (sqbracket (symbol->string r))]
114+
[(Offset ($ (? label? r))) (sqbracket (label-symbol->string r))]
115+
[(Offset e) (sqbracket (exp->string e))]
88116
[_ (exp->string e)]))
89117

90118
;; Exp -> String
@@ -93,6 +121,7 @@
93121
[(? register?) (symbol->string e)]
94122
[(? integer?) (number->string e)]
95123
[($ x) (label-symbol->string x)]
124+
;; [($ x) (string-append (label-symbol->string x) " + rip")]
96125
[(list '? e1 e2 e3)
97126
(string-append "(" (exp->string e1) " ? " (exp->string e2) " : " (exp->string e3) ")")]
98127
[(list (? exp-unop? o) e1)
@@ -118,17 +147,17 @@
118147
[(Data) (string-append tab ".data\n\t .p2align 3")] ; 8-byte aligned data
119148
[(Data n) (string-append tab (data-section n))]
120149
[(Extern ($ l)) (string-append tab ".extern " (extern-label-decl-symbol->string l))]
121-
[(Global ($ l)) (string-append tab ".global " (label-symbol->string l))]
150+
[(Global ($ l)) (string-append tab ".global " (label-symbol->string l))]
122151
;;[(Label ($ l)) (string-append "_" (symbol->string l) ":")]
123152
[(Label ($ l)) (string-append (label-symbol->string l) ":")]
124153
[(Lea d (? Mem? m))
125154
(string-append tab "lea "
126-
(arg->string d) ", [rip + "
127-
(mem->string m) "]")]
155+
(arg->string d) ", "
156+
(sqbracket (mem->string m)))]
128157
[(Lea d e)
129158
(string-append tab "lea "
130-
(arg->string d) ", [rip + "
131-
(arg->string e) "]")]
159+
(arg->string d) ", "
160+
(sqbracket (arg->string e)))]
132161
[(Equ x c)
133162
(string-append tab
134163
(symbol->string x)

0 commit comments

Comments
 (0)