summary refs log tree commit diff
path: root/pkgs/development/compilers/ocaml/mips64.patch
blob: cdef9cafb9323e977de61182b88ca82fda625fdf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
http://caml.inria.fr/mantis/view.php?id=4849

diff -bur ocaml-3.11.1/asmcomp/mips/arch.ml my_ocaml/asmcomp/mips/arch.ml
--- asmcomp/mips/arch.ml	2002-11-29 16:03:36.000000000 +0100
+++ asmcomp/mips/arch.ml	2009-08-09 23:18:31.000000000 +0200
@@ -35,7 +35,7 @@
 
 let big_endian =
   match Config.system with
-    "ultrix" -> false
+    "ultrix" | "gnu" -> false
   | "irix" -> true
   | _ -> fatal_error "Arch_mips.big_endian"
 
diff -bur ocaml-3.11.1/asmcomp/mips/emit.mlp my_ocaml/asmcomp/mips/emit.mlp
--- asmcomp/mips/emit.mlp	2004-01-05 21:25:56.000000000 +0100
+++ asmcomp/mips/emit.mlp	2009-08-23 12:11:58.000000000 +0200
@@ -58,7 +58,7 @@
     !stack_offset +
     4 * num_stack_slots.(0) + 8 * num_stack_slots.(1) +
     (if !contains_calls then if !uses_gp then 8 else 4 else 0) in
-  Misc.align size 16
+  Misc.align size 16	(* n32 require quadword alignment *)
 
 let slot_offset loc cl =
   match loc with
@@ -252,7 +252,7 @@
     | Lop(Icall_ind) ->
         `	move	$25, {emit_reg i.arg.(0)}\n`;
         liveregs i live_25;
-        `	jal	{emit_reg i.arg.(0)}\n`;
+        `	jal	$25\n`; (* {emit_reg i.arg.(0)}\n; Equivalent but avoids "Warning: MIPS PIC call to register other than $25" on GNU as *)
         `{record_frame i.live}\n`
     | Lop(Icall_imm s) ->
         liveregs i 0;
@@ -269,7 +269,7 @@
         liveregs i 0;
         `	move	$25, {emit_reg i.arg.(0)}\n`;
         liveregs i live_25;
-        `	j	{emit_reg i.arg.(0)}\n`
+        `	j	$25\n`
     | Lop(Itailcall_imm s) ->
         if s = !function_name then begin
           `	b	{emit_label !tailrec_entry_point}\n`
@@ -277,11 +277,11 @@
           let n = frame_size() in
           if !contains_calls then
             `	lw	$31, {emit_int(n - 4)}($sp)\n`;
+          `	la	$25, {emit_symbol s}\n`;	(* Rxd: put before gp restore *)
           if !uses_gp then
             `	lw	$gp, {emit_int(n - 8)}($sp)\n`;
           if n > 0 then
             `	addu	$sp, $sp, {emit_int n}\n`;
-          `	la	$25, {emit_symbol s}\n`;
           liveregs i live_25;
           `	j	$25\n`
         end
@@ -305,8 +305,13 @@
         begin match chunk with
           Double_u ->
             (* Destination is not 8-aligned, hence cannot use l.d *)
+            if big_endian then begin
             `	ldl	$24, {emit_addressing addr i.arg 0}\n`;
-            `	ldr	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`;
+              `	ldr	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`
+            end else begin
+              `	ldl	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`;
+              `	ldr	$24, {emit_addressing addr i.arg 0}\n`
+            end;
             `	dmtc1	$24, {emit_reg dest}\n`
         | Single ->
             `	l.s	{emit_reg dest}, {emit_addressing addr i.arg 0}\n`;
@@ -328,8 +333,13 @@
           Double_u ->
             (* Destination is not 8-aligned, hence cannot use l.d *)
             `	dmfc1	$24, {emit_reg src}\n`;
+            if big_endian then begin
             `	sdl	$24, {emit_addressing addr i.arg 1}\n`;
             `	sdr	$24, {emit_addressing (offset_addressing addr 7) i.arg 1}\n`
+            end else begin
+              `	sdl	$24, {emit_addressing (offset_addressing addr 7) i.arg 1}\n`;
+              `	sdr	$24, {emit_addressing addr i.arg 1}\n`
+            end
         | Single ->
             `	cvt.s.d	$f31, {emit_reg src}\n`;
             `	s.s	$f31, {emit_addressing addr i.arg 1}\n`
@@ -552,6 +562,7 @@
   (* There are really two groups of registers:
       $sp and $30 always point to stack locations
       $2 - $21 never point to stack locations. *)
+  if Config.system = "irix" then begin
   `	.noalias $2,$sp;  .noalias $2,$30;  .noalias $3,$sp;  .noalias $3,$30\n`;
   `	.noalias $4,$sp;  .noalias $4,$30;  .noalias $5,$sp;  .noalias $5,$30\n`;
   `	.noalias $6,$sp;  .noalias $6,$30;  .noalias $7,$sp;  .noalias $7,$30\n`;
@@ -561,7 +572,8 @@
   `	.noalias $14,$sp; .noalias $14,$30; .noalias $15,$sp; .noalias $15,$30\n`;
   `	.noalias $16,$sp; .noalias $16,$30; .noalias $17,$sp; .noalias $17,$30\n`;
   `	.noalias $18,$sp; .noalias $18,$30; .noalias $19,$sp; .noalias $19,$30\n`;
-  `	.noalias $20,$sp; .noalias $20,$30; .noalias $21,$sp; .noalias $21,$30\n\n`;
+    `	.noalias $20,$sp; .noalias $20,$30; .noalias $21,$sp; .noalias $21,$30\n\n`
+  end;
   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
   `	.data\n`;
   `	.globl	{emit_symbol lbl_begin}\n`;
diff -bur ocaml-3.11.1/asmrun/mips.s my_ocaml/asmrun/mips.s
--- asmrun/mips.s	2004-07-13 14:18:53.000000000 +0200
+++ asmrun/mips.s	2009-08-20 09:34:36.000000000 +0200
@@ -187,7 +187,7 @@
         sw      $30, caml_exception_pointer
     /* Call C function */
         move    $25, $24
-        jal     $24
+        jal     $25	/* Rxd: $24 replaced by $25 to avoid this "Warning: MIPS PIC call to register other than $25" ? */
     /* Reload return address, alloc ptr, alloc limit */
         lw      $31, 0($16)     /* caml_last_return_address */
         lw      $22, 0($17)     /* caml_young_ptr */
@@ -254,7 +254,7 @@
         sw      $0, caml_last_return_address
     /* Call the Caml code */
         move    $25, $24
-        jal     $24
+        jal     $25	/* Rxd: 24 replaced by 25 */
 $104:
     /* Pop the trap frame, restoring caml_exception_pointer */
         lw      $24, 0($sp)
@@ -384,3 +384,8 @@
         .word   $104            /* return address into callback */
         .half   -1              /* negative frame size => use callback link */
         .half   0               /* no roots here */
+
+#if defined(SYS_linux)
+    /* Mark stack as non-executable, PR#4564 */
+        .section .note.GNU-stack,"",%progbits
+#endif
diff -bur ocaml-3.11.1/configure my_ocaml/configure
--- configure	2009-05-20 17:33:09.000000000 +0200
+++ configure	2009-08-23 10:55:44.000000000 +0200
@@ -40,7 +40,7 @@
 verbose=no
 withcurses=yes
 withsharedlibs=yes
-gcc_warnings="-Wall"
+gcc_warnings="-W -Wall"
 partialld="ld -r"
 
 # Try to turn internationalization off, can cause config.guess to malfunction!
@@ -292,6 +292,9 @@
     # (For those who want to force "cc -64")
     # Turn off warning "unused library"
     bytecclinkopts="-Wl,-woff,84";;
+  gcc*,mips64el-*)
+    bytecccompopts=""
+    bytecclinkopts="-fno-defer-pop $gcc_warnings -Wl,-O1 -Wl,--as-needed";;
   *,alpha*-*-unicos*)
     # For the Cray T3E
     bytecccompopts="-DUMK";;
@@ -468,6 +471,8 @@
         echo "64-bit integers must be doubleword-aligned."
         echo "#define ARCH_ALIGN_INT64" >> m.h
       fi;;
+    mips64el-*)
+    	echo "#define ARCH_ALIGN_INT64" >> m.h;;
     *)
       sh ./runtest int64align.c
       case $? in
@@ -636,6 +641,7 @@
                                 fi;;
   i[3456]86-*-gnu*)             arch=i386; system=gnu;;
   mips-*-irix6*)                arch=mips; system=irix;;
+  mips*-gnu*)                   arch=mips; system=gnu;;
   hppa1.1-*-hpux*)              arch=hppa; system=hpux;;
   hppa2.0*-*-hpux*)             arch=hppa; system=hpux;;
   hppa*-*-linux*)               arch=hppa; system=linux;;
@@ -672,7 +678,7 @@
 if test -z "$ccoption"; then
   case "$arch,$system,$cc" in
     alpha,digital,gcc*) nativecc=cc;;
-    mips,*,gcc*) nativecc=cc;;
+    mips,irix,gcc*) nativecc=cc;;
     *) nativecc="$bytecc";;
   esac
 else
@@ -687,6 +693,9 @@
   alpha,cc*,digital,*) nativecccompopts=-std1;;
   mips,cc*,irix,*)     nativecccompopts=-n32
                        nativecclinkopts="-n32 -Wl,-woff,84";;
+  mips,gcc*,gnu,mips64el-*)
+                       nativecccompopts="$gcc_warnings -fPIC"
+                       nativecclinkopts="--as-needed";;
   *,*,nextstep,*)      nativecccompopts="$gcc_warnings -U__GNUC__ -posix"
                        nativecclinkopts="-posix";;
   *,*,rhapsody,*darwin[1-5].*)
@@ -725,6 +734,8 @@
                     aspp='gcc -c -Wa,-xexplicit';;
   mips,*,irix)      as='as -n32 -O2 -nocpp -g0'
                     aspp='as -n32 -O2';;
+  mips,*,gnu)       as='as -KPIC'
+                    aspp='gcc -c -fPIC';;	# got bus error without fPIC ?
   power,*,elf)      as='as -u -m ppc'
                     aspp='gcc -c';;
   power,*,bsd)      as='as'
@@ -756,6 +767,7 @@
     case "$nativecc" in gcc*) ;; *) cc_profile='-xpg';; esac;;
   amd64,*,linux) profiling='prof';;
   amd64,*,gnu) profiling='prof';;
+  mips,*,gnu) profiling='prof';;
   *) profiling='noprof';;
 esac
 
diff -bur ocaml-3.11.1/asmcomp/mips/proc.ml my_ocaml/asmcomp/mips/proc.ml
--- asmcomp/mips/proc.ml	2007-10-30 13:37:16.000000000 +0100
+++ asmcomp/mips/proc.ml	2010-03-18 08:08:06.000000000 +0100
@@ -114,7 +114,7 @@
           incr int
         end else begin
           loc.(i) <- stack_slot (make_stack !ofs) ty;
-          ofs := !ofs + size_int
+          ofs := !ofs + 8
         end
     | Float ->
         if !float <= last_float then begin
@@ -143,7 +143,7 @@
    or float regs $f12...$f19.  Each argument "consumes" both one slot
    in the int register file and one slot in the float register file.
    Extra arguments are passed on stack, in a 64-bits slot, right-justified
-   (i.e. at +4 from natural address). *)   
+   (i.e. at +4 from natural address for big endians). *)   
 
 let loc_external_arguments arg =
   let loc = Array.create (Array.length arg) Reg.dummy in
@@ -158,7 +158,7 @@
     end else begin
       begin match arg.(i).typ with
         Float -> loc.(i) <- stack_slot (Outgoing !ofs) Float
-      | ty    -> loc.(i) <- stack_slot (Outgoing (!ofs + 4)) ty
+      | ty    -> loc.(i) <- stack_slot (Outgoing (!ofs + (if big_endian then 4 else 0))) ty
       end;
       ofs := !ofs + 8
     end