diff options
author | Mark Shinwell <mshinwell@gmail.com> | 2017-09-13 10:23:16 +0100 |
---|---|---|
committer | David Allsopp <david.allsopp@metastack.com> | 2022-12-21 17:38:30 +0000 |
commit | b00000c6679804731692362b0baac27fa3fddfd5 (patch) | |
tree | 380a8e7172fd63b2270e6d348ca35877e6d9e461 | |
parent | ead74c13d7c3698f966cd6f40331a91b844d2074 (diff) | |
download | ocaml-b00000c6679804731692362b0baac27fa3fddfd5.tar.gz |
AArch64 GOT fixed
-rw-r--r-- | asmcomp/arm64/emit.mlp | 15 | ||||
-rw-r--r-- | asmcomp/arm64/selection.ml | 4 |
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 *) |