68 lines
2.6 KiB
Diff
68 lines
2.6 KiB
Diff
|
From 2cc11dbf4e046610e85e66139f0d1ffc9e1cff65 Mon Sep 17 00:00:00 2001
|
||
|
From: Jiong Wang <jiong.wang@foss.arm.com>
|
||
|
Date: Fri, 28 Jul 2017 19:00:00 +0200
|
||
|
Subject: [PATCH 12/12] Mark certain symbols as .hidden in arm64 codegen,
|
||
|
possibly fixes MPR#7585
|
||
|
|
||
|
binutils 2.29 arm64 linker is more strict about when to perform pc-relative
|
||
|
relocations for global symbols. Specifically, they must be marked as .hidden.
|
||
|
ocaml arm64 codegen does not do this, so tests/lib-dynlink-native/ fails as
|
||
|
some symbols were not relocated. This patch fixes that by marking (hopefully)
|
||
|
the appropriate symbols as .hidden.
|
||
|
---
|
||
|
asmcomp/arm64/emit.mlp | 4 ++++
|
||
|
asmcomp/compilenv.ml | 1 -
|
||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp
|
||
|
index f75646e12..ee72c114f 100644
|
||
|
--- a/asmcomp/arm64/emit.mlp
|
||
|
+++ b/asmcomp/arm64/emit.mlp
|
||
|
@@ -324,6 +324,7 @@ let emit_literals() =
|
||
|
|
||
|
let emit_load_symbol_addr dst s =
|
||
|
if (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit s then begin
|
||
|
+ ` .hidden {emit_symbol s}\n`;
|
||
|
` adrp {emit_reg dst}, {emit_symbol s}\n`;
|
||
|
` add {emit_reg dst}, {emit_reg dst}, #:lo12:{emit_symbol s}\n`
|
||
|
end else begin
|
||
|
@@ -575,6 +576,7 @@ let emit_instr i =
|
||
|
` fmov {emit_reg i.res.(0)}, #{emit_printf "0x%Lx" f}\n`
|
||
|
else begin
|
||
|
let lbl = float_literal f in
|
||
|
+ ` .hidden {emit_label lbl}\n`;
|
||
|
` adrp {emit_reg reg_tmp1}, {emit_label lbl}\n`;
|
||
|
` ldr {emit_reg i.res.(0)}, [{emit_reg reg_tmp1}, #:lo12:{emit_label lbl}]\n`
|
||
|
end
|
||
|
@@ -609,6 +611,7 @@ let emit_instr i =
|
||
|
match addr with
|
||
|
| Iindexed _ -> i.arg.(0)
|
||
|
| Ibased(s, ofs) ->
|
||
|
+ ` .hidden {emit_symbol s}\n`;
|
||
|
` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`;
|
||
|
reg_tmp1 in
|
||
|
begin match size with
|
||
|
@@ -636,6 +639,7 @@ let emit_instr i =
|
||
|
match addr with
|
||
|
| Iindexed _ -> i.arg.(1)
|
||
|
| Ibased(s, ofs) ->
|
||
|
+ ` .hidden {emit_symbol s}\n`;
|
||
|
` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`;
|
||
|
reg_tmp1 in
|
||
|
begin match size with
|
||
|
diff --git a/asmcomp/compilenv.ml b/asmcomp/compilenv.ml
|
||
|
index a50c57f45..32f8bf1da 100644
|
||
|
--- a/asmcomp/compilenv.ml
|
||
|
+++ b/asmcomp/compilenv.ml
|
||
|
@@ -161,7 +161,6 @@ let make_symbol ?(unitname = current_unit.ui_symbol) idopt =
|
||
|
|
||
|
let symbol_in_current_unit name =
|
||
|
let prefix = "caml" ^ current_unit.ui_symbol in
|
||
|
- name = prefix ||
|
||
|
(let lp = String.length prefix in
|
||
|
String.length name >= 2 + lp
|
||
|
&& String.sub name 0 lp = prefix
|
||
|
--
|
||
|
2.13.1
|
||
|
|