@@ -106,6 +106,7 @@ module type SYSTEM =
106
106
val comment : string
107
107
val raw_symbol : out_channel -> string -> unit
108
108
val symbol : out_channel -> P .t -> unit
109
+ val symbol_paren : out_channel -> P .t -> unit
109
110
val label : out_channel -> int -> unit
110
111
val name_of_section : section_name -> string
111
112
val stack_alignment : int
@@ -130,6 +131,12 @@ module ELF_System : SYSTEM =
130
131
131
132
let symbol = elf_symbol
132
133
134
+ let symbol_paren oc symb =
135
+ let s = extern_atom symb in
136
+ if String. length s > 0 && s.[0 ] = '$'
137
+ then fprintf oc " (%s)" s
138
+ else fprintf oc " %s" s
139
+
133
140
let label = elf_label
134
141
135
142
let name_of_section = function
@@ -164,8 +171,8 @@ module ELF_System : SYSTEM =
164
171
165
172
let print_mov_rs oc rd id =
166
173
if Archi. ptr64
167
- then fprintf oc " movq %a@GOTPCREL(%%rip), %a\n " symbol id ireg64 rd
168
- else fprintf oc " movl $%a, %a\n " symbol id ireg32 rd
174
+ then fprintf oc " movq %a@GOTPCREL(%%rip), %a\n " symbol_paren id ireg64 rd
175
+ else fprintf oc " movl $%a, %a\n " symbol_paren id ireg32 rd
169
176
170
177
let print_fun_info = elf_print_fun_info
171
178
@@ -196,6 +203,9 @@ module MacOS_System : SYSTEM =
196
203
let symbol oc symb =
197
204
raw_symbol oc (extern_atom symb)
198
205
206
+ let symbol_paren = symbol
207
+ (* the leading '_' protects the leading '$' *)
208
+
199
209
let label oc lbl =
200
210
fprintf oc " L%d" lbl
201
211
@@ -262,6 +272,12 @@ module Cygwin_System : SYSTEM =
262
272
let symbol oc symb =
263
273
raw_symbol oc (extern_atom symb)
264
274
275
+ let symbol_paren oc symb =
276
+ let s = extern_atom symb in
277
+ if String. length s > 0 && s.[0 ] = '$'
278
+ then fprintf oc " (%a)" raw_symbol s
279
+ else raw_symbol oc s
280
+
265
281
let label oc lbl =
266
282
fprintf oc " L%d" lbl
267
283
@@ -341,13 +357,13 @@ module Target(System: SYSTEM):TARGET =
341
357
(* RIP-relative addressing *)
342
358
let ofs' = Z. to_int64 ofs in
343
359
if ofs' = 0L
344
- then fprintf oc " %a(%%rip)" symbol id
360
+ then fprintf oc " %a(%%rip)" symbol_paren id
345
361
else fprintf oc " (%a + %Ld)(%%rip)" symbol id ofs'
346
362
end else begin
347
363
(* Absolute addressing *)
348
364
let ofs' = Z. to_int32 ofs in
349
365
if ofs' = 0l
350
- then fprintf oc " %a" symbol id
366
+ then fprintf oc " %a" symbol_paren id
351
367
else fprintf oc " (%a + %ld)" symbol id ofs'
352
368
end
353
369
end ;
@@ -707,7 +723,7 @@ module Target(System: SYSTEM):TARGET =
707
723
| Pjmp_l (l ) ->
708
724
fprintf oc " jmp %a\n " label (transl_label l)
709
725
| Pjmp_s (f , sg ) ->
710
- fprintf oc " jmp %a\n " symbol f
726
+ fprintf oc " jmp %a\n " symbol_paren f
711
727
| Pjmp_r (r , sg ) ->
712
728
fprintf oc " jmp *%a\n " ireg r
713
729
| Pjcc (c , l ) ->
@@ -733,7 +749,7 @@ module Target(System: SYSTEM):TARGET =
733
749
fprintf oc " jmp *%a(, %a, 4)\n " label l ireg r
734
750
end
735
751
| Pcall_s (f , sg ) ->
736
- fprintf oc " call %a\n " symbol f;
752
+ fprintf oc " call %a\n " symbol_paren f;
737
753
if (not Archi. ptr64) && sg.sig_cc.cc_structret then
738
754
fprintf oc " pushl %%eax\n "
739
755
| Pcall_r (r , sg ) ->
0 commit comments