]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/dwarf2asm.cc
modula2: Tidyup remove unnecessary parameters
[thirdparty/gcc.git] / gcc / dwarf2asm.cc
CommitLineData
2e4b9b8c 1/* Dwarf2 assembler output helper routines.
a945c346 2 Copyright (C) 2001-2024 Free Software Foundation, Inc.
2e4b9b8c 3
1322177d 4This file is part of GCC.
2e4b9b8c 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
2e4b9b8c 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
2e4b9b8c
RH
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
2e4b9b8c
RH
19
20
21#include "config.h"
22#include "system.h"
4977bab6 23#include "coretypes.h"
957060b5
AM
24#include "target.h"
25#include "rtl.h"
2a1ee410 26#include "tree.h"
4d0cdd0c 27#include "memmodel.h"
957060b5 28#include "tm_p.h"
d8a2d370
DN
29#include "stringpool.h"
30#include "varasm.h"
2e4b9b8c
RH
31#include "output.h"
32#include "dwarf2asm.h"
a80b0574 33#include "dwarf2.h"
7180b1a6
RB
34#include "function.h"
35#include "emit-rtl.h"
90841d43 36#include "fold-const.h"
2e4b9b8c 37
7abcdb06
ML
38#ifndef XCOFF_DEBUGGING_INFO
39#define XCOFF_DEBUGGING_INFO 0
40#endif
41
2e4b9b8c 42\f
301d03af
RS
43/* Output an unaligned integer with the given value and size. Prefer not
44 to print a newline, since the caller may want to add a comment. */
45
46void
7080f735 47dw2_assemble_integer (int size, rtx x)
2e4b9b8c 48{
6e44c09b 49 if (size == 2 * (int) DWARF2_ADDR_SIZE && !CONST_SCALAR_INT_P (x))
74237316
JJ
50 {
51 /* On 32-bit targets with -gdwarf64, DImode values with
52 relocations usually result in assembler errors. Assume
53 all such values are positive and emit the relocation only
54 in the least significant half. */
e9ba2ccf 55 const char *op = integer_asm_op (DWARF2_ADDR_SIZE, false);
74237316
JJ
56 if (BYTES_BIG_ENDIAN)
57 {
58 if (op)
59 {
60 fputs (op, asm_out_file);
61 fprint_whex (asm_out_file, 0);
62 fputs (", ", asm_out_file);
63 output_addr_const (asm_out_file, x);
64 }
65 else
66 {
67 assemble_integer (const0_rtx, DWARF2_ADDR_SIZE,
68 BITS_PER_UNIT, 1);
69 putc ('\n', asm_out_file);
70 assemble_integer (x, DWARF2_ADDR_SIZE,
71 BITS_PER_UNIT, 1);
72 }
73 }
74 else
75 {
76 if (op)
77 {
78 fputs (op, asm_out_file);
79 output_addr_const (asm_out_file, x);
80 fputs (", ", asm_out_file);
81 fprint_whex (asm_out_file, 0);
82 }
83 else
84 {
85 assemble_integer (x, DWARF2_ADDR_SIZE,
86 BITS_PER_UNIT, 1);
87 putc ('\n', asm_out_file);
88 assemble_integer (const0_rtx, DWARF2_ADDR_SIZE,
89 BITS_PER_UNIT, 1);
90 }
91 }
92 return;
93 }
94
e9ba2ccf 95 const char *op = integer_asm_op (size, false);
301d03af
RS
96
97 if (op)
2e4b9b8c 98 {
301d03af 99 fputs (op, asm_out_file);
481683e1 100 if (CONST_INT_P (x))
5e3929ed 101 fprint_whex (asm_out_file, (unsigned HOST_WIDE_INT) INTVAL (x));
301d03af
RS
102 else
103 output_addr_const (asm_out_file, x);
2e4b9b8c 104 }
301d03af
RS
105 else
106 assemble_integer (x, size, BITS_PER_UNIT, 1);
2e4b9b8c 107}
3a538a66 108
2e4b9b8c 109
d4ea4622
RH
110/* Output a value of a given size in target byte order. */
111
112void
113dw2_asm_output_data_raw (int size, unsigned HOST_WIDE_INT value)
114{
115 unsigned char bytes[8];
116 int i;
117
118 for (i = 0; i < 8; ++i)
119 {
120 bytes[i] = value & 0xff;
121 value >>= 8;
122 }
123
124 if (BYTES_BIG_ENDIAN)
125 {
126 for (i = size - 1; i > 0; --i)
a3f1cee4
UB
127 fprintf (asm_out_file, "%#x,", bytes[i]);
128 fprintf (asm_out_file, "%#x", bytes[0]);
d4ea4622
RH
129 }
130 else
131 {
132 for (i = 0; i < size - 1; ++i)
a3f1cee4
UB
133 fprintf (asm_out_file, "%#x,", bytes[i]);
134 fprintf (asm_out_file, "%#x", bytes[i]);
d4ea4622
RH
135 }
136}
137
105f48ae 138/* Output an immediate constant in a given SIZE in bytes. */
8e7fa2c8 139
2e4b9b8c 140void
e34d07f2
KG
141dw2_asm_output_data (int size, unsigned HOST_WIDE_INT value,
142 const char *comment, ...)
2e4b9b8c 143{
e34d07f2 144 va_list ap;
e9ba2ccf 145 const char *op = integer_asm_op (size, false);
7080f735 146
e34d07f2 147 va_start (ap, comment);
2e4b9b8c 148
da6af203 149 if (size * 8 < HOST_BITS_PER_WIDE_INT)
dd4786fe 150 value &= ~(HOST_WIDE_INT_M1U << (size * 8));
da6af203 151
d61772b2 152 if (op)
5e3929ed
DA
153 {
154 fputs (op, asm_out_file);
155 fprint_whex (asm_out_file, value);
156 }
d61772b2
GK
157 else
158 assemble_integer (GEN_INT (value), size, BITS_PER_UNIT, 1);
2e4b9b8c
RH
159
160 if (flag_debug_asm && comment)
161 {
5e3929ed 162 fputs ("\t" ASM_COMMENT_START " ", asm_out_file);
2e4b9b8c
RH
163 vfprintf (asm_out_file, comment, ap);
164 }
5e3929ed 165 putc ('\n', asm_out_file);
2e4b9b8c 166
e34d07f2 167 va_end (ap);
2e4b9b8c
RH
168}
169
8e7fa2c8
RH
170/* Output the difference between two symbols in a given size. */
171/* ??? There appear to be assemblers that do not like such
172 subtraction, but do support ASM_SET_OP. It's unfortunately
173 impossible to do here, since the ASM_SET_OP for the difference
174 symbol must appear after both symbols are defined. */
175
2e4b9b8c 176void
e34d07f2
KG
177dw2_asm_output_delta (int size, const char *lab1, const char *lab2,
178 const char *comment, ...)
2e4b9b8c 179{
e34d07f2 180 va_list ap;
7080f735 181
e34d07f2 182 va_start (ap, comment);
2e4b9b8c 183
7606e68f
SS
184#ifdef ASM_OUTPUT_DWARF_DELTA
185 ASM_OUTPUT_DWARF_DELTA (asm_out_file, size, lab1, lab2);
186#else
301d03af
RS
187 dw2_assemble_integer (size,
188 gen_rtx_MINUS (Pmode,
189 gen_rtx_SYMBOL_REF (Pmode, lab1),
190 gen_rtx_SYMBOL_REF (Pmode, lab2)));
7606e68f 191#endif
2e4b9b8c
RH
192 if (flag_debug_asm && comment)
193 {
194 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
195 vfprintf (asm_out_file, comment, ap);
196 }
197 fputc ('\n', asm_out_file);
198
e34d07f2 199 va_end (ap);
2e4b9b8c
RH
200}
201
2cea0398 202#ifdef ASM_OUTPUT_DWARF_VMS_DELTA
67ad2ae7
DR
203/* Output the difference between two symbols in instruction units
204 in a given size. */
205
206void
207dw2_asm_output_vms_delta (int size ATTRIBUTE_UNUSED,
208 const char *lab1, const char *lab2,
209 const char *comment, ...)
210{
211 va_list ap;
212
213 va_start (ap, comment);
214
67ad2ae7
DR
215 ASM_OUTPUT_DWARF_VMS_DELTA (asm_out_file, size, lab1, lab2);
216 if (flag_debug_asm && comment)
217 {
218 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
219 vfprintf (asm_out_file, comment, ap);
220 }
221 fputc ('\n', asm_out_file);
67ad2ae7
DR
222
223 va_end (ap);
224}
2cea0398 225#endif
67ad2ae7 226
192d0f89
GK
227/* Output a section-relative reference to a LABEL, which was placed in
228 BASE. In general this can only be done for debugging symbols.
229 E.g. on most targets with the GNU linker, this is accomplished with
230 a direct reference and the knowledge that the debugging section
231 will be placed at VMA 0. Some targets have special relocations for
232 this that we must use. */
8e7fa2c8 233
2e4b9b8c 234void
79252435
SB
235dw2_asm_output_offset (int size, const char *label,
236 section *base ATTRIBUTE_UNUSED,
e34d07f2 237 const char *comment, ...)
2e4b9b8c 238{
e34d07f2 239 va_list ap;
7080f735 240
e34d07f2 241 va_start (ap, comment);
2e4b9b8c 242
8e7fa2c8 243#ifdef ASM_OUTPUT_DWARF_OFFSET
7180b1a6 244 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, size, label, 0, base);
8e7fa2c8 245#else
301d03af 246 dw2_assemble_integer (size, gen_rtx_SYMBOL_REF (Pmode, label));
2e4b9b8c
RH
247#endif
248
249 if (flag_debug_asm && comment)
250 {
251 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
252 vfprintf (asm_out_file, comment, ap);
253 }
254 fputc ('\n', asm_out_file);
255
e34d07f2 256 va_end (ap);
2e4b9b8c
RH
257}
258
7180b1a6
RB
259void
260dw2_asm_output_offset (int size, const char *label, HOST_WIDE_INT offset,
261 section *base ATTRIBUTE_UNUSED,
262 const char *comment, ...)
263{
264 va_list ap;
265
266 va_start (ap, comment);
267
268#ifdef ASM_OUTPUT_DWARF_OFFSET
269 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, size, label, offset, base);
270#else
271 dw2_assemble_integer (size, gen_rtx_PLUS (Pmode,
272 gen_rtx_SYMBOL_REF (Pmode, label),
273 gen_int_mode (offset, Pmode)));
274#endif
275
276 if (flag_debug_asm && comment)
277 {
278 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
279 vfprintf (asm_out_file, comment, ap);
280 }
281 fputc ('\n', asm_out_file);
282
283 va_end (ap);
284}
285
c8f4fe99
BE
286#if 0
287
8e7fa2c8
RH
288/* Output a self-relative reference to a label, possibly in a
289 different section or object file. */
290
2e4b9b8c 291void
e34d07f2
KG
292dw2_asm_output_pcrel (int size ATTRIBUTE_UNUSED,
293 const char *label ATTRIBUTE_UNUSED,
294 const char *comment, ...)
2e4b9b8c 295{
e34d07f2 296 va_list ap;
7080f735 297
e34d07f2 298 va_start (ap, comment);
2e4b9b8c 299
8e7fa2c8
RH
300#ifdef ASM_OUTPUT_DWARF_PCREL
301 ASM_OUTPUT_DWARF_PCREL (asm_out_file, size, label);
302#else
301d03af
RS
303 dw2_assemble_integer (size,
304 gen_rtx_MINUS (Pmode,
305 gen_rtx_SYMBOL_REF (Pmode, label),
306 pc_rtx));
8e7fa2c8
RH
307#endif
308
309 if (flag_debug_asm && comment)
310 {
311 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
312 vfprintf (asm_out_file, comment, ap);
313 }
314 fputc ('\n', asm_out_file);
315
e34d07f2 316 va_end (ap);
8e7fa2c8 317}
c8f4fe99 318#endif /* 0 */
8e7fa2c8
RH
319
320/* Output an absolute reference to a label. */
321
322void
e34d07f2
KG
323dw2_asm_output_addr (int size, const char *label,
324 const char *comment, ...)
8e7fa2c8 325{
e34d07f2 326 va_list ap;
7080f735 327
e34d07f2 328 va_start (ap, comment);
8e7fa2c8 329
301d03af 330 dw2_assemble_integer (size, gen_rtx_SYMBOL_REF (Pmode, label));
2e4b9b8c
RH
331
332 if (flag_debug_asm && comment)
333 {
334 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
335 vfprintf (asm_out_file, comment, ap);
336 }
337 fputc ('\n', asm_out_file);
338
e34d07f2 339 va_end (ap);
2e4b9b8c
RH
340}
341
8e7fa2c8
RH
342/* Similar, but use an RTX expression instead of a text label. */
343
2e4b9b8c 344void
e34d07f2
KG
345dw2_asm_output_addr_rtx (int size, rtx addr,
346 const char *comment, ...)
2e4b9b8c 347{
e34d07f2 348 va_list ap;
7080f735 349
e34d07f2 350 va_start (ap, comment);
2e4b9b8c 351
301d03af 352 dw2_assemble_integer (size, addr);
2e4b9b8c
RH
353
354 if (flag_debug_asm && comment)
355 {
356 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
357 vfprintf (asm_out_file, comment, ap);
358 }
359 fputc ('\n', asm_out_file);
360
e34d07f2 361 va_end (ap);
2e4b9b8c
RH
362}
363
1e290ba1
JB
364/* Output the first ORIG_LEN characters of STR as a string.
365 If ORIG_LEN is equal to -1, ignore this parameter and output
366 the entire STR instead.
367 If COMMENT is not NULL and comments in the debug information
368 have been requested by the user, append the given COMMENT
369 to the generated output. */
b8698a0f 370
2e4b9b8c 371void
e34d07f2
KG
372dw2_asm_output_nstring (const char *str, size_t orig_len,
373 const char *comment, ...)
2e4b9b8c 374{
7a75edb7 375 size_t i, len;
e34d07f2 376 va_list ap;
2e4b9b8c 377
e34d07f2 378 va_start (ap, comment);
2e4b9b8c 379
7a75edb7 380 len = orig_len;
2e4b9b8c
RH
381
382 if (len == (size_t) -1)
383 len = strlen (str);
384
385 if (flag_debug_asm && comment)
386 {
7abcdb06
ML
387 if (XCOFF_DEBUGGING_INFO)
388 fputs ("\t.byte \"", asm_out_file);
389 else
390 fputs ("\t.ascii \"", asm_out_file);
51fbbb92 391
2e4b9b8c
RH
392 for (i = 0; i < len; i++)
393 {
394 int c = str[i];
7e78cfda 395 if (c == '\"')
7abcdb06 396 fputc (XCOFF_DEBUGGING_INFO ? '\"' : '\\', asm_out_file);
7e78cfda 397 else if (c == '\\')
2e4b9b8c 398 fputc ('\\', asm_out_file);
c3284718 399 if (ISPRINT (c))
2e4b9b8c
RH
400 fputc (c, asm_out_file);
401 else
402 fprintf (asm_out_file, "\\%o", c);
403 }
404 fprintf (asm_out_file, "\\0\"\t%s ", ASM_COMMENT_START);
405 vfprintf (asm_out_file, comment, ap);
406 fputc ('\n', asm_out_file);
407 }
408 else
409 {
410 /* If an explicit length was given, we can't assume there
411 is a null termination in the string buffer. */
412 if (orig_len == (size_t) -1)
413 len += 1;
414 ASM_OUTPUT_ASCII (asm_out_file, str, len);
415 if (orig_len != (size_t) -1)
301d03af 416 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
2e4b9b8c
RH
417 }
418
e34d07f2 419 va_end (ap);
2e4b9b8c
RH
420}
421\f
422
423/* Return the size of an unsigned LEB128 quantity. */
424
425int
7080f735 426size_of_uleb128 (unsigned HOST_WIDE_INT value)
2e4b9b8c 427{
4977bab6 428 int size = 0;
2e4b9b8c
RH
429
430 do
431 {
2e4b9b8c
RH
432 value >>= 7;
433 size += 1;
434 }
435 while (value != 0);
436
437 return size;
438}
439
440/* Return the size of a signed LEB128 quantity. */
441
442int
7080f735 443size_of_sleb128 (HOST_WIDE_INT value)
2e4b9b8c
RH
444{
445 int size = 0, byte;
446
447 do
448 {
449 byte = (value & 0x7f);
450 value >>= 7;
451 size += 1;
452 }
453 while (!((value == 0 && (byte & 0x40) == 0)
454 || (value == -1 && (byte & 0x40) != 0)));
455
456 return size;
457}
458
b627d6fe 459/* Given an encoding, return the number of bytes the format occupies.
3a538a66 460 This is only defined for fixed-size encodings, and so does not
b627d6fe
RH
461 include leb128. */
462
463int
7080f735 464size_of_encoded_value (int encoding)
b627d6fe
RH
465{
466 if (encoding == DW_EH_PE_omit)
467 return 0;
468
469 switch (encoding & 0x07)
470 {
471 case DW_EH_PE_absptr:
50b6ee8b 472 return POINTER_SIZE_UNITS;
b627d6fe
RH
473 case DW_EH_PE_udata2:
474 return 2;
475 case DW_EH_PE_udata4:
476 return 4;
477 case DW_EH_PE_udata8:
478 return 8;
ced3f397
NS
479 default:
480 gcc_unreachable ();
b627d6fe 481 }
b627d6fe
RH
482}
483
e1f9550a
RH
484/* Yield a name for a given pointer encoding. */
485
486const char *
7080f735 487eh_data_format_name (int format)
e1f9550a
RH
488{
489#if HAVE_DESIGNATED_INITIALIZERS
490#define S(p, v) [p] = v,
16dda95e
JJ
491#elif __cpp_constexpr >= 201304L
492#define S(p, v) names[p] = v;
e1f9550a
RH
493#else
494#define S(p, v) case p: return v;
495#endif
496
497#if HAVE_DESIGNATED_INITIALIZERS
498 __extension__ static const char * const format_names[256] = {
16dda95e
JJ
499#elif __cpp_constexpr >= 201304L
500 static constexpr struct format_names_s {
501 const char *names[256];
502 constexpr format_names_s () : names {}
503 {
e1f9550a 504#else
16dda95e
JJ
505 switch (format)
506 {
e1f9550a
RH
507#endif
508
509 S(DW_EH_PE_absptr, "absolute")
510 S(DW_EH_PE_omit, "omit")
099c8b17 511 S(DW_EH_PE_aligned, "aligned absolute")
e1f9550a
RH
512
513 S(DW_EH_PE_uleb128, "uleb128")
514 S(DW_EH_PE_udata2, "udata2")
515 S(DW_EH_PE_udata4, "udata4")
516 S(DW_EH_PE_udata8, "udata8")
517 S(DW_EH_PE_sleb128, "sleb128")
518 S(DW_EH_PE_sdata2, "sdata2")
519 S(DW_EH_PE_sdata4, "sdata4")
520 S(DW_EH_PE_sdata8, "sdata8")
521
f90811a2 522 S(DW_EH_PE_absptr | DW_EH_PE_pcrel, "pcrel")
e1f9550a
RH
523 S(DW_EH_PE_uleb128 | DW_EH_PE_pcrel, "pcrel uleb128")
524 S(DW_EH_PE_udata2 | DW_EH_PE_pcrel, "pcrel udata2")
525 S(DW_EH_PE_udata4 | DW_EH_PE_pcrel, "pcrel udata4")
526 S(DW_EH_PE_udata8 | DW_EH_PE_pcrel, "pcrel udata8")
527 S(DW_EH_PE_sleb128 | DW_EH_PE_pcrel, "pcrel sleb128")
528 S(DW_EH_PE_sdata2 | DW_EH_PE_pcrel, "pcrel sdata2")
529 S(DW_EH_PE_sdata4 | DW_EH_PE_pcrel, "pcrel sdata4")
530 S(DW_EH_PE_sdata8 | DW_EH_PE_pcrel, "pcrel sdata8")
531
f90811a2 532 S(DW_EH_PE_absptr | DW_EH_PE_textrel, "textrel")
e1f9550a
RH
533 S(DW_EH_PE_uleb128 | DW_EH_PE_textrel, "textrel uleb128")
534 S(DW_EH_PE_udata2 | DW_EH_PE_textrel, "textrel udata2")
535 S(DW_EH_PE_udata4 | DW_EH_PE_textrel, "textrel udata4")
536 S(DW_EH_PE_udata8 | DW_EH_PE_textrel, "textrel udata8")
537 S(DW_EH_PE_sleb128 | DW_EH_PE_textrel, "textrel sleb128")
538 S(DW_EH_PE_sdata2 | DW_EH_PE_textrel, "textrel sdata2")
539 S(DW_EH_PE_sdata4 | DW_EH_PE_textrel, "textrel sdata4")
540 S(DW_EH_PE_sdata8 | DW_EH_PE_textrel, "textrel sdata8")
541
f90811a2 542 S(DW_EH_PE_absptr | DW_EH_PE_datarel, "datarel")
e1f9550a
RH
543 S(DW_EH_PE_uleb128 | DW_EH_PE_datarel, "datarel uleb128")
544 S(DW_EH_PE_udata2 | DW_EH_PE_datarel, "datarel udata2")
545 S(DW_EH_PE_udata4 | DW_EH_PE_datarel, "datarel udata4")
546 S(DW_EH_PE_udata8 | DW_EH_PE_datarel, "datarel udata8")
547 S(DW_EH_PE_sleb128 | DW_EH_PE_datarel, "datarel sleb128")
548 S(DW_EH_PE_sdata2 | DW_EH_PE_datarel, "datarel sdata2")
549 S(DW_EH_PE_sdata4 | DW_EH_PE_datarel, "datarel sdata4")
550 S(DW_EH_PE_sdata8 | DW_EH_PE_datarel, "datarel sdata8")
551
f90811a2 552 S(DW_EH_PE_absptr | DW_EH_PE_funcrel, "funcrel")
e1f9550a
RH
553 S(DW_EH_PE_uleb128 | DW_EH_PE_funcrel, "funcrel uleb128")
554 S(DW_EH_PE_udata2 | DW_EH_PE_funcrel, "funcrel udata2")
555 S(DW_EH_PE_udata4 | DW_EH_PE_funcrel, "funcrel udata4")
556 S(DW_EH_PE_udata8 | DW_EH_PE_funcrel, "funcrel udata8")
557 S(DW_EH_PE_sleb128 | DW_EH_PE_funcrel, "funcrel sleb128")
558 S(DW_EH_PE_sdata2 | DW_EH_PE_funcrel, "funcrel sdata2")
559 S(DW_EH_PE_sdata4 | DW_EH_PE_funcrel, "funcrel sdata4")
560 S(DW_EH_PE_sdata8 | DW_EH_PE_funcrel, "funcrel sdata8")
561
49576e25
RS
562 S(DW_EH_PE_indirect | DW_EH_PE_absptr, "indirect absolute")
563
f90811a2
RH
564 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_pcrel,
565 "indirect pcrel")
e1f9550a
RH
566 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_pcrel,
567 "indirect pcrel uleb128")
568 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_pcrel,
569 "indirect pcrel udata2")
570 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_pcrel,
571 "indirect pcrel udata4")
572 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_pcrel,
573 "indirect pcrel udata8")
574 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_pcrel,
575 "indirect pcrel sleb128")
576 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_pcrel,
577 "indirect pcrel sdata2")
578 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_pcrel,
579 "indirect pcrel sdata4")
580 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_pcrel,
581 "indirect pcrel sdata8")
582
f90811a2
RH
583 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_textrel,
584 "indirect textrel")
e1f9550a
RH
585 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_textrel,
586 "indirect textrel uleb128")
587 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_textrel,
588 "indirect textrel udata2")
589 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_textrel,
590 "indirect textrel udata4")
591 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_textrel,
592 "indirect textrel udata8")
593 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_textrel,
594 "indirect textrel sleb128")
595 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_textrel,
596 "indirect textrel sdata2")
597 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_textrel,
598 "indirect textrel sdata4")
599 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_textrel,
600 "indirect textrel sdata8")
601
f90811a2
RH
602 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_datarel,
603 "indirect datarel")
e1f9550a
RH
604 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_datarel,
605 "indirect datarel uleb128")
606 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_datarel,
607 "indirect datarel udata2")
608 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_datarel,
609 "indirect datarel udata4")
610 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_datarel,
611 "indirect datarel udata8")
612 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_datarel,
613 "indirect datarel sleb128")
614 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_datarel,
615 "indirect datarel sdata2")
616 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_datarel,
617 "indirect datarel sdata4")
618 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_datarel,
619 "indirect datarel sdata8")
620
f90811a2
RH
621 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_funcrel,
622 "indirect funcrel")
e1f9550a
RH
623 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_funcrel,
624 "indirect funcrel uleb128")
625 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_funcrel,
626 "indirect funcrel udata2")
627 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_funcrel,
628 "indirect funcrel udata4")
629 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_funcrel,
630 "indirect funcrel udata8")
631 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_funcrel,
632 "indirect funcrel sleb128")
633 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_funcrel,
634 "indirect funcrel sdata2")
635 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_funcrel,
636 "indirect funcrel sdata4")
637 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_funcrel,
638 "indirect funcrel sdata8")
639
640#if HAVE_DESIGNATED_INITIALIZERS
641 };
642
ced3f397 643 gcc_assert (format >= 0 && format < 0x100 && format_names[format]);
b8698a0f 644
e1f9550a 645 return format_names[format];
16dda95e
JJ
646#elif __cpp_constexpr >= 201304L
647 }
648 } format_names;
649
650 gcc_assert (format >= 0 && format < 0x100 && format_names.names[format]);
651
652 return format_names.names[format];
e1f9550a 653#else
16dda95e 654 }
ced3f397 655 gcc_unreachable ();
e1f9550a
RH
656#endif
657}
658
d4ea4622
RH
659/* Output an unsigned LEB128 quantity, but only the byte values. */
660
661void
662dw2_asm_output_data_uleb128_raw (unsigned HOST_WIDE_INT value)
663{
664 while (1)
665 {
666 int byte = (value & 0x7f);
667 value >>= 7;
668 if (value != 0)
669 /* More bytes to follow. */
670 byte |= 0x80;
671
a3f1cee4 672 fprintf (asm_out_file, "%#x", byte);
d4ea4622
RH
673 if (value == 0)
674 break;
675 fputc (',', asm_out_file);
676 }
677}
678
2e4b9b8c
RH
679/* Output an unsigned LEB128 quantity. */
680
681void
e34d07f2
KG
682dw2_asm_output_data_uleb128 (unsigned HOST_WIDE_INT value,
683 const char *comment, ...)
2e4b9b8c 684{
e34d07f2 685 va_list ap;
7080f735 686
e34d07f2 687 va_start (ap, comment);
2e4b9b8c 688
61214be1 689 if (HAVE_AS_LEB128)
2e4b9b8c 690 {
61214be1
TS
691 fputs ("\t.uleb128 ", asm_out_file);
692 fprint_whex (asm_out_file, value);
693
694 if (flag_debug_asm && comment)
695 {
696 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
697 vfprintf (asm_out_file, comment, ap);
698 }
2e4b9b8c 699 }
61214be1 700 else
2e4b9b8c 701 {
61214be1
TS
702 unsigned HOST_WIDE_INT work = value;
703 const char *byte_op = targetm.asm_out.byte_op;
704
705 if (byte_op)
706 fputs (byte_op, asm_out_file);
707 do
2e4b9b8c 708 {
61214be1
TS
709 int byte = (work & 0x7f);
710 work >>= 7;
711 if (work != 0)
712 /* More bytes to follow. */
713 byte |= 0x80;
714
715 if (byte_op)
716 {
717 fprintf (asm_out_file, "%#x", byte);
718 if (work != 0)
719 fputc (',', asm_out_file);
720 }
721 else
722 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
723 }
724 while (work != 0);
725
726 if (flag_debug_asm)
727 {
728 fprintf (asm_out_file, "\t%s uleb128 " HOST_WIDE_INT_PRINT_HEX,
729 ASM_COMMENT_START, value);
730 if (comment)
731 {
732 fputs ("; ", asm_out_file);
733 vfprintf (asm_out_file, comment, ap);
734 }
2e4b9b8c
RH
735 }
736 }
61214be1 737
5e3929ed 738 putc ('\n', asm_out_file);
2e4b9b8c 739
e34d07f2 740 va_end (ap);
2e4b9b8c
RH
741}
742
d4ea4622
RH
743/* Output an signed LEB128 quantity, but only the byte values. */
744
745void
746dw2_asm_output_data_sleb128_raw (HOST_WIDE_INT value)
747{
748 int byte, more;
749
750 while (1)
751 {
752 byte = (value & 0x7f);
753 value >>= 7;
754 more = !((value == 0 && (byte & 0x40) == 0)
755 || (value == -1 && (byte & 0x40) != 0));
756 if (more)
757 byte |= 0x80;
758
a3f1cee4 759 fprintf (asm_out_file, "%#x", byte);
d4ea4622
RH
760 if (!more)
761 break;
762 fputc (',', asm_out_file);
763 }
764}
765
09da1532 766/* Output a signed LEB128 quantity. */
2e4b9b8c
RH
767
768void
e34d07f2
KG
769dw2_asm_output_data_sleb128 (HOST_WIDE_INT value,
770 const char *comment, ...)
2e4b9b8c 771{
e34d07f2 772 va_list ap;
7080f735 773
e34d07f2 774 va_start (ap, comment);
2e4b9b8c 775
61214be1 776 if (HAVE_AS_LEB128)
2e4b9b8c 777 {
61214be1
TS
778 fprintf (asm_out_file, "\t.sleb128 " HOST_WIDE_INT_PRINT_DEC, value);
779
780 if (flag_debug_asm && comment)
781 {
782 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
783 vfprintf (asm_out_file, comment, ap);
784 }
2e4b9b8c 785 }
61214be1 786 else
2e4b9b8c 787 {
61214be1
TS
788 HOST_WIDE_INT work = value;
789 int more, byte;
790 const char *byte_op = targetm.asm_out.byte_op;
791
792 if (byte_op)
793 fputs (byte_op, asm_out_file);
794 do
2e4b9b8c 795 {
61214be1
TS
796 byte = (work & 0x7f);
797 /* arithmetic shift */
798 work >>= 7;
799 more = !((work == 0 && (byte & 0x40) == 0)
800 || (work == -1 && (byte & 0x40) != 0));
801 if (more)
802 byte |= 0x80;
803
804 if (byte_op)
805 {
806 fprintf (asm_out_file, "%#x", byte);
807 if (more)
808 fputc (',', asm_out_file);
809 }
810 else
811 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
812 }
813 while (more);
814
815 if (flag_debug_asm)
816 {
817 fprintf (asm_out_file, "\t%s sleb128 " HOST_WIDE_INT_PRINT_DEC,
818 ASM_COMMENT_START, value);
819 if (comment)
820 {
821 fputs ("; ", asm_out_file);
822 vfprintf (asm_out_file, comment, ap);
823 }
2e4b9b8c
RH
824 }
825 }
61214be1 826
2e4b9b8c
RH
827 fputc ('\n', asm_out_file);
828
e34d07f2 829 va_end (ap);
2e4b9b8c
RH
830}
831
bd2b9f1e
AO
832/* Output symbol LAB1 as an unsigned LEB128 quantity. LAB1 should be
833 an assembler-computed constant, e.g. a view number, because we
834 can't have relocations in LEB128 quantities. */
835
836void
837dw2_asm_output_symname_uleb128 (const char *lab1 ATTRIBUTE_UNUSED,
838 const char *comment, ...)
839{
840 va_list ap;
841
842 va_start (ap, comment);
843
844#ifdef HAVE_AS_LEB128
845 fputs ("\t.uleb128 ", asm_out_file);
846 assemble_name (asm_out_file, lab1);
847#else
848 gcc_unreachable ();
849#endif
850
851 if (flag_debug_asm && comment)
852 {
853 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
854 vfprintf (asm_out_file, comment, ap);
855 }
856 fputc ('\n', asm_out_file);
857
858 va_end (ap);
859}
860
2e4b9b8c 861void
e34d07f2
KG
862dw2_asm_output_delta_uleb128 (const char *lab1 ATTRIBUTE_UNUSED,
863 const char *lab2 ATTRIBUTE_UNUSED,
864 const char *comment, ...)
2e4b9b8c 865{
e34d07f2
KG
866 va_list ap;
867
868 va_start (ap, comment);
2e4b9b8c 869
61214be1
TS
870 gcc_assert (HAVE_AS_LEB128);
871
da6af203 872 fputs ("\t.uleb128 ", asm_out_file);
2e4b9b8c 873 assemble_name (asm_out_file, lab1);
5e3929ed 874 putc ('-', asm_out_file);
e53b6e56 875 /* dwarf2out.cc might give us a label expression (e.g. .LVL548-1)
7728669d
MW
876 as second argument. If so, make it a subexpression, to make
877 sure the substraction is done in the right order. */
878 if (strchr (lab2, '-') != NULL)
879 {
880 putc ('(', asm_out_file);
881 assemble_name (asm_out_file, lab2);
882 putc (')', asm_out_file);
883 }
884 else
885 assemble_name (asm_out_file, lab2);
2e4b9b8c
RH
886
887 if (flag_debug_asm && comment)
888 {
889 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
890 vfprintf (asm_out_file, comment, ap);
891 }
892 fputc ('\n', asm_out_file);
893
e34d07f2 894 va_end (ap);
2e4b9b8c
RH
895}
896
c8f4fe99
BE
897#if 0
898
2e4b9b8c 899void
e34d07f2
KG
900dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED,
901 const char *lab2 ATTRIBUTE_UNUSED,
902 const char *comment, ...)
2e4b9b8c 903{
e34d07f2 904 va_list ap;
7080f735 905
e34d07f2 906 va_start (ap, comment);
2e4b9b8c 907
61214be1
TS
908 gcc_assert (HAVE_AS_LEB128);
909
da6af203 910 fputs ("\t.sleb128 ", asm_out_file);
2e4b9b8c 911 assemble_name (asm_out_file, lab1);
5e3929ed 912 putc ('-', asm_out_file);
2e4b9b8c 913 assemble_name (asm_out_file, lab2);
2e4b9b8c
RH
914
915 if (flag_debug_asm && comment)
916 {
917 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
918 vfprintf (asm_out_file, comment, ap);
919 }
920 fputc ('\n', asm_out_file);
921
e34d07f2 922 va_end (ap);
2e4b9b8c 923}
c8f4fe99 924#endif /* 0 */
2a1ee410 925\f
de144fb2 926static GTY(()) hash_map<const char *, tree> *indirect_pool;
17211ab5
GK
927
928static GTY(()) int dw2_const_labelno;
2a1ee410 929
f31d9224 930#if defined(HAVE_GAS_HIDDEN)
7abcdb06 931# define USE_LINKONCE_INDIRECT (SUPPORTS_ONE_ONLY && !XCOFF_DEBUGGING_INFO)
d6d26764
JJ
932#else
933# define USE_LINKONCE_INDIRECT 0
934#endif
935
de144fb2
TS
936/* Compare two std::pair<const char *, tree> by their first element.
937 Returns <0, 0, or
dc1327cd
AO
938 >0 to indicate whether K1 is less than, equal to, or greater than
939 K2, respectively. */
940
941static int
de144fb2 942compare_strings (const void *a, const void *b)
dc1327cd 943{
de144fb2
TS
944 const char *s1 = ((const std::pair<const char *, tree> *) a)->first;
945 const char *s2 = ((const std::pair<const char *, tree> *) b)->first;
dc1327cd
AO
946 int ret;
947
948 if (s1 == s2)
949 return 0;
950
951 ret = strcmp (s1, s2);
952
953 /* The strings are always those from IDENTIFIER_NODEs, and,
954 therefore, we should never have two copies of the same
955 string. */
956 gcc_assert (ret);
957
958 return ret;
959}
960
e1f9550a
RH
961/* Put X, a SYMBOL_REF, in memory. Return a SYMBOL_REF to the allocated
962 memory. Differs from force_const_mem in that a single pool is used for
963 the entire unit of translation, and the memory is not guaranteed to be
d858f359 964 "near" the function in any interesting sense. IS_PUBLIC controls whether
b03e9863 965 the symbol can be shared across the entire application (or DSO). */
e1f9550a 966
d4ea4622 967rtx
d858f359 968dw2_force_const_mem (rtx x, bool is_public)
2a1ee410 969{
a2649528 970 const char *key;
78bd9046 971 tree decl_id;
2a1ee410
RH
972
973 if (! indirect_pool)
de144fb2 974 indirect_pool = hash_map<const char *, tree>::create_ggc (64);
2a1ee410 975
ced3f397 976 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1ee9fb20 977
a2649528 978 key = XSTR (x, 0);
de144fb2
TS
979 tree *slot = indirect_pool->get (key);
980 if (slot)
981 decl_id = *slot;
2a1ee410
RH
982 else
983 {
2a1ee410 984 tree id;
a2649528 985 const char *str = targetm.strip_name_encoding (key);
2a1ee410 986
d858f359 987 if (is_public && USE_LINKONCE_INDIRECT)
d6d26764 988 {
f883e0a7 989 char *ref_name = XALLOCAVEC (char, strlen (str) + sizeof "DW.ref.");
d6d26764 990
1ee9fb20 991 sprintf (ref_name, "DW.ref.%s", str);
78bd9046
AO
992 gcc_assert (!maybe_get_identifier (ref_name));
993 decl_id = get_identifier (ref_name);
994 TREE_PUBLIC (decl_id) = 1;
d6d26764
JJ
995 }
996 else
997 {
d6d26764
JJ
998 char label[32];
999
17211ab5
GK
1000 ASM_GENERATE_INTERNAL_LABEL (label, "LDFCM", dw2_const_labelno);
1001 ++dw2_const_labelno;
78bd9046
AO
1002 gcc_assert (!maybe_get_identifier (label));
1003 decl_id = get_identifier (label);
d6d26764 1004 }
2a1ee410 1005
1ee9fb20 1006 id = maybe_get_identifier (str);
2a1ee410
RH
1007 if (id)
1008 TREE_SYMBOL_REFERENCED (id) = 1;
1009
de144fb2 1010 indirect_pool->put (key, decl_id);
2a1ee410
RH
1011 }
1012
78bd9046 1013 return gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (decl_id));
2a1ee410
RH
1014}
1015
de144fb2
TS
1016/* A helper function for dw2_output_indirect_constants. Emit one queued
1017 constant to memory. */
e1f9550a 1018
2a1ee410 1019static int
de144fb2 1020dw2_output_indirect_constant_1 (const char *sym, tree id)
2a1ee410 1021{
2a1ee410 1022 rtx sym_ref;
de144fb2 1023 tree decl;
78bd9046 1024
c2255bc4 1025 decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, id, ptr_type_node);
9937ab02 1026 SET_DECL_ASSEMBLER_NAME (decl, id);
78bd9046
AO
1027 DECL_ARTIFICIAL (decl) = 1;
1028 DECL_IGNORED_P (decl) = 1;
90841d43 1029 DECL_INITIAL (decl) = build_fold_addr_expr (decl);
3895ec53 1030 TREE_READONLY (decl) = 1;
56f3e9ac 1031 TREE_STATIC (decl) = 1;
78bd9046
AO
1032
1033 if (TREE_PUBLIC (id))
1034 {
1035 TREE_PUBLIC (decl) = 1;
fc26fae3 1036 make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
ee610fcd
RO
1037 if (USE_LINKONCE_INDIRECT)
1038 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
78bd9046 1039 }
78bd9046 1040
2a1ee410 1041 sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
058494f9
MO
1042 /* Disable ASan for decl because redzones cause ABI breakage between GCC and
1043 libstdc++ for `.LDFCM*' variables. See PR 78651 for details. */
1044 unsigned int save_flag_sanitize = flag_sanitize;
1045 flag_sanitize &= ~(SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS
1046 | SANITIZE_KERNEL_ADDRESS);
d64257a4
JJ
1047 /* And also temporarily disable -fsection-anchors. These indirect constants
1048 are never referenced from code, so it doesn't make any sense to aggregate
1049 them in blocks. */
1050 int save_flag_section_anchors = flag_section_anchors;
1051 flag_section_anchors = 0;
b03e9863 1052 assemble_variable (decl, 1, 1, 1);
d64257a4 1053 flag_section_anchors = save_flag_section_anchors;
058494f9 1054 flag_sanitize = save_flag_sanitize;
50b6ee8b 1055 assemble_integer (sym_ref, POINTER_SIZE_UNITS, POINTER_SIZE, 1);
f13ed3ed
JJ
1056 /* The following is a hack recognized by use_blocks_for_decl_p to disable
1057 section anchor handling of the decl. */
1058 DECL_INITIAL (decl) = decl;
2a1ee410
RH
1059
1060 return 0;
1061}
1062
e1f9550a
RH
1063/* Emit the constants queued through dw2_force_const_mem. */
1064
2a1ee410 1065void
7080f735 1066dw2_output_indirect_constants (void)
2a1ee410 1067{
de144fb2
TS
1068 if (!indirect_pool)
1069 return;
1070
1071 auto_vec<std::pair<const char *, tree> > temp (indirect_pool->elements ());
1072 for (hash_map<const char *, tree>::iterator iter = indirect_pool->begin ();
1073 iter != indirect_pool->end (); ++iter)
1074 temp.quick_push (*iter);
1075
21c0a521 1076 temp.qsort (compare_strings);
de144fb2 1077
21c0a521 1078 for (unsigned int i = 0; i < temp.length (); i++)
de144fb2 1079 dw2_output_indirect_constant_1 (temp[i].first, temp[i].second);
2a1ee410
RH
1080}
1081
b03e9863
EB
1082/* Like dw2_asm_output_addr_rtx, but encode the pointer as directed.
1083 If PUBLIC is set and the encoding is DW_EH_PE_indirect, the indirect
1084 reference is shared across the entire application (or DSO). */
e1f9550a 1085
2a1ee410 1086void
d858f359 1087dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, bool is_public,
e34d07f2 1088 const char *comment, ...)
2a1ee410
RH
1089{
1090 int size;
e34d07f2 1091 va_list ap;
7080f735 1092
e34d07f2 1093 va_start (ap, comment);
e1f9550a
RH
1094
1095 size = size_of_encoded_value (encoding);
2a1ee410 1096
099c8b17
RH
1097 if (encoding == DW_EH_PE_aligned)
1098 {
1099 assemble_align (POINTER_SIZE);
9f5cd0c5 1100 assemble_integer (addr, size, POINTER_SIZE, 1);
0edf1bb2 1101 va_end (ap);
9f5cd0c5 1102 return;
099c8b17
RH
1103 }
1104
3248917b
RK
1105 /* NULL is _always_ represented as a plain zero, as is 1 for Ada's
1106 "all others". */
1107 if (addr == const0_rtx || addr == const1_rtx)
c8af3574 1108 assemble_integer (addr, size, BITS_PER_UNIT, 1);
e1f9550a 1109 else
2a1ee410 1110 {
e1f9550a
RH
1111 restart:
1112 /* Allow the target first crack at emitting this. Some of the
3a538a66 1113 special relocations require special directives instead of
e1f9550a 1114 just ".4byte" or whatever. */
2a1ee410 1115#ifdef ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX
e1f9550a
RH
1116 ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (asm_out_file, encoding, size,
1117 addr, done);
2a1ee410
RH
1118#endif
1119
e1f9550a
RH
1120 /* Indirection is used to get dynamic relocations out of a
1121 read-only section. */
1122 if (encoding & DW_EH_PE_indirect)
1123 {
1124 /* It is very tempting to use force_const_mem so that we share data
1125 with the normal constant pool. However, we've already emitted
1126 the constant pool for this function. Moreover, we'd like to
b03e9863
EB
1127 share these constants across the entire unit of translation and
1128 even, if possible, across the entire application (or DSO). */
d858f359 1129 addr = dw2_force_const_mem (addr, is_public);
e1f9550a
RH
1130 encoding &= ~DW_EH_PE_indirect;
1131 goto restart;
1132 }
2a1ee410 1133
e1f9550a
RH
1134 switch (encoding & 0xF0)
1135 {
1136 case DW_EH_PE_absptr:
301d03af 1137 dw2_assemble_integer (size, addr);
e1f9550a 1138 break;
2a1ee410 1139
04218b35
AD
1140#ifdef ASM_OUTPUT_DWARF_DATAREL
1141 case DW_EH_PE_datarel:
1142 gcc_assert (GET_CODE (addr) == SYMBOL_REF);
1143 ASM_OUTPUT_DWARF_DATAREL (asm_out_file, size, XSTR (addr, 0));
1144 break;
1145#endif
1146
e1f9550a 1147 case DW_EH_PE_pcrel:
ced3f397 1148 gcc_assert (GET_CODE (addr) == SYMBOL_REF);
2a1ee410 1149#ifdef ASM_OUTPUT_DWARF_PCREL
e1f9550a 1150 ASM_OUTPUT_DWARF_PCREL (asm_out_file, size, XSTR (addr, 0));
2a1ee410 1151#else
301d03af 1152 dw2_assemble_integer (size, gen_rtx_MINUS (Pmode, addr, pc_rtx));
2a1ee410 1153#endif
e1f9550a 1154 break;
2a1ee410 1155
e1f9550a 1156 default:
3a538a66 1157 /* Other encodings should have been handled by
e1f9550a 1158 ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX. */
ced3f397 1159 gcc_unreachable ();
e1f9550a 1160 }
2a1ee410
RH
1161
1162#ifdef ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX
e1f9550a 1163 done:;
2a1ee410 1164#endif
e1f9550a
RH
1165 }
1166
1167 if (flag_debug_asm && comment)
1168 {
1169 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
1170 vfprintf (asm_out_file, comment, ap);
1171 }
2a1ee410 1172 fputc ('\n', asm_out_file);
e1f9550a 1173
e34d07f2 1174 va_end (ap);
2a1ee410 1175}
17211ab5
GK
1176
1177#include "gt-dwarf2asm.h"