bug-mes
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] x86_64: generate position independent binaries.


From: Andrius Štikonas
Subject: [PATCH] x86_64: generate position independent binaries.
Date: Sat, 20 Jan 2024 01:10:36 +0000

* lib/x86_64-mes/x86_64.M1: add new M1 defines.
* module/mescc/x86_64/as.scm: use offsets instead of absolute addresses.
* module/mescc/M1.scm: add additional matches for #:offset
---
 lib/x86_64-mes/x86_64.M1   | 17 ++++++++++-------
 module/mescc/M1.scm        | 12 ++++++++++++
 module/mescc/x86_64/as.scm | 29 +++++++++++++++--------------
 3 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/lib/x86_64-mes/x86_64.M1 b/lib/x86_64-mes/x86_64.M1
index 50081c66..9b84d0cc 100644
--- a/lib/x86_64-mes/x86_64.M1
+++ b/lib/x86_64-mes/x86_64.M1
@@ -20,7 +20,7 @@
 
 # reduced instruction set: rax, rdi (some rcx for shift, rdx for mul, div)
 # and r10 as i64 immediate helper
-# 212 instructions
+# 222 instructions
 
 DEFINE add____$i32,%rax 4805
 DEFINE add____$i32,%rbp 4881c5
@@ -78,6 +78,9 @@ DEFINE jmp32 e9
 DEFINE jmp____*%rbx ffe3
 DEFINE jne32 0f85
 DEFINE lahf 9f
+DEFINE lea____$i32(%rip),%rax 488d05
+DEFINE lea____$i32(%rip),%rdi 488d3d
+DEFINE lea____$i32(%rip),%r10 4c8d15
 DEFINE mov____$i32,%rax 48c7c0
 DEFINE mov____$i32,%rdi 48c7c7
 DEFINE mov____$i32,0x8(%rbp) c745
@@ -90,10 +93,12 @@ DEFINE mov____%al,(%rdi) 8807
 DEFINE mov____%al,0x32(%rbp) 8885
 DEFINE mov____%al,0x8(%rbp) 8845
 DEFINE mov____%ax,(%rdi) 668907
+DEFINE mov____%ax,(%r10) 66418902
 DEFINE mov____%ax,0x8(%rbp) 668945
 DEFINE mov____%eax,%eax 89c0
 DEFINE mov____%eax,%rax 89c0
 DEFINE mov____%eax,(%rdi) 8907
+DEFINE mov____%eax,(%r10) 418902
 DEFINE mov____%eax,0x32(%rbp)  8985
 DEFINE mov____%eax,0x8(%rbp) 8945
 DEFINE mov____%edi,%edi 89ff
@@ -106,7 +111,7 @@ DEFINE mov____%r8,%rdi 4c89c7
 DEFINE mov____%rax,%rax 4889c0
 DEFINE mov____%rax,%rdi 4889c7
 DEFINE mov____%rax,(%rdi) 488907
-DEFINE mov____%rax,0x32 48890425
+DEFINE mov____%rax,(%r10) 498902
 DEFINE mov____%rax,0x32(%rbp) 488985
 DEFINE mov____%rax,0x8(%rbp) 488945
 DEFINE mov____%rax,0x8(%rdi) 488947
@@ -136,6 +141,8 @@ DEFINE mov____(%rax),%si 668b30
 DEFINE mov____(%rax),%sil 408a30
 DEFINE mov____(%rdi),%edi 8b3f
 DEFINE mov____(%rdi),%rdi 488b3f
+DEFINE mov____(%r10),%rax 498b02
+DEFINE mov____(%r10),%rdi 498b3a
 DEFINE mov____0x32(%rbp),%rax 488b85
 DEFINE mov____0x32(%rbp),%rdi 488bbd
 DEFINE mov____0x32,%rax 488b0425
@@ -154,8 +161,6 @@ DEFINE mov____0x8(%rbp),%rsp 488b65
 DEFINE mov____0x8(%rdi),%rax 488b47
 DEFINE mov____0x8(%rdi),%rbp 488b6f
 DEFINE mov____0x8(%rdi),%rsp 488b67
-DEFINE movl___%eax,0x32 890425
-DEFINE movl___%edi,0x32 893c25
 DEFINE movl___%esi,(%rdi) 8937
 DEFINE movl___(%rax),%esi 8b30
 DEFINE movsbq_%al,%rax 480fbec0
@@ -170,8 +175,6 @@ DEFINE movswq_%ax,%rax 480fbfc0
 DEFINE movswq_%di,%rdi 480fbfff
 DEFINE movswq_(%rax),%rax 480fbf00
 DEFINE movswq_(%rdi),%rdi 480fbf3f
-DEFINE movw___%ax,0x32 66890425
-DEFINE movw___%di,0x32 66893c25
 DEFINE movz___(%rax),%rax 480fb600
 DEFINE movzbq_%al,%rax 480fb6c0
 DEFINE movzbq_%dil,%rdi 480fb6ff
@@ -194,7 +197,7 @@ DEFINE pop____%rax 58
 DEFINE pop____%rbp 5d
 DEFINE pop____%rdi 5f
 DEFINE pop____%rdx 5a
-DEFINE push___$i32 68
+DEFINE push___%r10 4152
 DEFINE push___%r15 4157
 DEFINE push___%rax 50
 DEFINE push___%rbp 55
diff --git a/module/mescc/M1.scm b/module/mescc/M1.scm
index b5445343..23773ef7 100644
--- a/module/mescc/M1.scm
+++ b/module/mescc/M1.scm
@@ -186,6 +186,18 @@
           ((#:address8 ,global) (guard (global? global))
            (hex2:address8 (global->string global)))
 
+          ((#:offset ,global) (guard (global? global))
+           (hex2:offset (global->string global)))
+
+          ((#:offset (#:string ,string))
+           (hex2:offset (string->label `(#:string ,string))))
+          ((#:offset (#:address ,address)) (guard (string? address))
+           (hex2:offset address))
+          ((#:offset ,function) (guard (function? function))
+           (hex2:offset (function->string function)))
+          ((#:offset (#:address ,global)) (guard (global? global))
+           (hex2:offset (global->string global)))
+
           ((#:offset ,offset) (hex2:offset offset))
           ((#:offset1 ,offset1) (hex2:offset1 offset1))
           ((#:offset2 ,offset2) (hex2:offset2 offset2))
diff --git a/module/mescc/x86_64/as.scm b/module/mescc/x86_64/as.scm
index 9b1e2755..43858b71 100644
--- a/module/mescc/x86_64/as.scm
+++ b/module/mescc/x86_64/as.scm
@@ -135,12 +135,8 @@
     `((,(string-append "push___%" r)))))
 
 (define (x86_64:label->arg info label i)
-  `(("push___$i32" (#:address ,label))))
-
-;; FIXME?
-;; (define (x86_64:label->arg info label i)
-;;   `((,(string-append "mov____$i64,%r15") (#:address8 ,label))
-;;     ("push___%r15" (#:address ,label))))
+  `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+    (,(string-append "push___%r10"))))
 
 (define (x86_64:r0+r1 info)
   (let ((r1 (get-r1 info))
@@ -197,7 +193,7 @@
 
 (define (x86_64:label->r info label)
   (let ((r (get-r info)))
-    `((,(string-append "mov____$i64,%" r) (#:address8 ,label)))))
+    `((,(string-append "lea____$i32(%rip),%" r) (#:offset ,label)))))
 
 (define (x86_64:r0->r1 info)
   (let ((r0 (get-r0 info))
@@ -285,7 +281,8 @@
 
 (define (x86_64:label-mem->r info label)
   (let ((r (get-r info)))
-    `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
+    `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+      (,(string-append "mov____(%r10),%" r)))))
 
 (define (x86_64:word-mem->r info)
   (let ((r (get-r info)))
@@ -306,8 +303,8 @@
                 `("add____$i32,0x32(%rbp)" (#:immediate ,n) (#:immediate 
,v)))))) ;; FIXME: 64b
 
 (define (x86_64:label-mem-add info label v)
-  `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 
,v))
-         `("add____$i32,0x32" (#:address ,label) (#:immediate ,v))))) ;; 
FIXME: 64b
+  `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:offset ,label) (#:immediate1 
,v))
+         `("add____$i32,0x32" (#:offset ,label) (#:immediate ,v))))) ;; FIXME: 
64b
 
 (define (x86_64:nop info)
   '(("nop")))
@@ -373,22 +370,26 @@
 
 (define (x86_64:r->label info label)
   (let ((r (get-r info)))
-    `((,(string-append "mov____%" r ",0x32") (#:address ,label))))) ;; FIXME: 
64 bits
+  `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label)) ;; FIXME: 64 
bits
+      (,(string-append "mov____%" r ",(%r10)")))))
 
 (define (x86_64:r->byte-label info label)
   (let* ((r (get-r info))
          (l (r->l r)))
-    `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
+    `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+      (,(string-append "mov____%" l ",(%r10)")))))
 
 (define (x86_64:r->word-label info label)
   (let* ((r (get-r info))
         (x (r->x r)))
-    `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
+    `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+      (,(string-append "mov____%" x ",(%r10)")))))
 
 (define (x86_64:r->long-label info label)
   (let* ((r (get-r info))
         (e (r->e r)))
-    `((,(string-append "movl___%" e ",0x32") (#:address ,label)))))
+    `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+      (,(string-append "mov____%" e ",(%r10)")))))
 
 (define (x86_64:call-r info n)
   (let ((r (get-r info)))
-- 
2.43.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]