summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Shinwell <mshinwell@gmail.com>2017-09-13 10:23:16 +0100
committerDavid Allsopp <david.allsopp@metastack.com>2022-12-21 17:38:30 +0000
commitb00000c6679804731692362b0baac27fa3fddfd5 (patch)
tree380a8e7172fd63b2270e6d348ca35877e6d9e461
parentead74c13d7c3698f966cd6f40331a91b844d2074 (diff)
downloadocaml-b00000c6679804731692362b0baac27fa3fddfd5.tar.gz
AArch64 GOT fixed
-rw-r--r--asmcomp/arm64/emit.mlp15
-rw-r--r--asmcomp/arm64/selection.ml4
2 files changed, 15 insertions, 4 deletions
diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp
index f75646e123..729096c576 100644
--- a/asmcomp/arm64/emit.mlp
+++ b/asmcomp/arm64/emit.mlp
@@ -114,6 +114,7 @@ let emit_addressing addr r =
| Iindexed ofs ->
`[{emit_reg r}, #{emit_int ofs}]`
| Ibased(s, ofs) ->
+ assert (not !Clflags.dlcode); (* see selection.ml *)
`[{emit_reg r}, #:lo12:{emit_symbol_offset s ofs}]`
(* Record live pointers at call points *)
@@ -323,7 +324,7 @@ let emit_literals() =
(* Emit code to load the address of a symbol *)
let emit_load_symbol_addr dst s =
- if (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit s then begin
+ if not !Clflags.dlcode then begin
` adrp {emit_reg dst}, {emit_symbol s}\n`;
` add {emit_reg dst}, {emit_reg dst}, #:lo12:{emit_symbol s}\n`
end else begin
@@ -609,6 +610,7 @@ let emit_instr i =
match addr with
| Iindexed _ -> i.arg.(0)
| Ibased(s, ofs) ->
+ assert (not !Clflags.dlcode); (* see selection.ml *)
` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`;
reg_tmp1 in
begin match size with
@@ -636,6 +638,7 @@ let emit_instr i =
match addr with
| Iindexed _ -> i.arg.(1)
| Ibased(s, ofs) ->
+ assert (not !Clflags.dlcode);
` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`;
reg_tmp1 in
begin match size with
@@ -924,7 +927,15 @@ let fundecl fundecl =
let emit_item = function
| Cglobal_symbol s -> ` .globl {emit_symbol s}\n`;
- | Cdefine_symbol s -> `{emit_symbol s}:\n`
+ | Cdefine_symbol s ->
+ if !Clflags.dlcode then begin
+ (* GOT relocations against non-global symbols don't seem to work
+ properly: GOT entries are not created for the symbols and the
+ relocations evaluate to random other GOT entries. For the moment
+ force all symbols to be global. *)
+ ` .globl {emit_symbol s}\n`;
+ end;
+ `{emit_symbol s}:\n`
| Cint8 n -> ` .byte {emit_int n}\n`
| Cint16 n -> ` .short {emit_int n}\n`
| Cint32 n -> ` .long {emit_nativeint n}\n`
diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml
index d8ea7f83bf..b714d0032c 100644
--- a/asmcomp/arm64/selection.ml
+++ b/asmcomp/arm64/selection.ml
@@ -82,8 +82,8 @@ let inline_ops =
[ "sqrt"; "caml_bswap16_direct"; "caml_int32_direct_bswap";
"caml_int64_direct_bswap"; "caml_nativeint_direct_bswap" ]
-let use_direct_addressing symb =
- (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit symb
+let use_direct_addressing _symb =
+ not !Clflags.dlcode
(* Instruction selection *)