00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "config.h"
00027 #include "system.h"
00028 #include "flags.h"
00029 #ifdef SGI_MONGOOSE
00030
00031 #include "rtl.h"
00032 #endif
00033 #include "tree.h"
00034 #ifndef SGI_MONGOOSE
00035 #include "rtl.h"
00036 #endif
00037 #include "output.h"
00038 #include "target.h"
00039 #include "dwarf2asm.h"
00040 #include "dwarf2.h"
00041 #include "splay-tree.h"
00042 #include "ggc.h"
00043 #include "tm_p.h"
00044
00045
00046
00047 #ifndef ASM_COMMENT_START
00048 #define ASM_COMMENT_START ";#"
00049 #endif
00050
00051
00052
00053
00054
00055 void
00056 dw2_assemble_integer (size, x)
00057 int size;
00058 rtx x;
00059 {
00060 const char *op = integer_asm_op (size, FALSE);
00061
00062 if (op)
00063 {
00064 fputs (op, asm_out_file);
00065 if (GET_CODE (x) == CONST_INT)
00066 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
00067 else
00068 output_addr_const (asm_out_file, x);
00069 }
00070 else
00071 assemble_integer (x, size, BITS_PER_UNIT, 1);
00072 }
00073
00074
00075
00076
00077 void
00078 dw2_asm_output_data VPARAMS ((int size, unsigned HOST_WIDE_INT value,
00079 const char *comment, ...))
00080 {
00081 VA_OPEN (ap, comment);
00082 VA_FIXEDARG (ap, int, size);
00083 VA_FIXEDARG (ap, unsigned HOST_WIDE_INT, value);
00084 VA_FIXEDARG (ap, const char *, comment);
00085
00086 if (size * 8 < HOST_BITS_PER_WIDE_INT)
00087 value &= ~(~(unsigned HOST_WIDE_INT) 0 << (size * 8));
00088
00089 dw2_assemble_integer (size, GEN_INT (value));
00090
00091 if (flag_debug_asm && comment)
00092 {
00093 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00094 vfprintf (asm_out_file, comment, ap);
00095 }
00096 fputc ('\n', asm_out_file);
00097
00098 VA_CLOSE (ap);
00099 }
00100
00101
00102
00103
00104
00105
00106
00107 void
00108 dw2_asm_output_delta VPARAMS ((int size, const char *lab1, const char *lab2,
00109 const char *comment, ...))
00110 {
00111 VA_OPEN (ap, comment);
00112 VA_FIXEDARG (ap, int, size);
00113 VA_FIXEDARG (ap, const char *, lab1);
00114 VA_FIXEDARG (ap, const char *, lab2);
00115 VA_FIXEDARG (ap, const char *, comment);
00116
00117 #ifdef ASM_OUTPUT_DWARF_DELTA
00118 ASM_OUTPUT_DWARF_DELTA (asm_out_file, size, lab1, lab2);
00119 #else
00120 dw2_assemble_integer (size,
00121 gen_rtx_MINUS (Pmode,
00122 gen_rtx_SYMBOL_REF (Pmode, lab1),
00123 gen_rtx_SYMBOL_REF (Pmode, lab2)));
00124 #endif
00125 if (flag_debug_asm && comment)
00126 {
00127 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00128 vfprintf (asm_out_file, comment, ap);
00129 }
00130 fputc ('\n', asm_out_file);
00131
00132 VA_CLOSE (ap);
00133 }
00134
00135
00136
00137
00138
00139
00140
00141 void
00142 dw2_asm_output_offset VPARAMS ((int size, const char *label,
00143 const char *comment, ...))
00144 {
00145 VA_OPEN (ap, comment);
00146 VA_FIXEDARG (ap, int, size);
00147 VA_FIXEDARG (ap, const char *, label);
00148 VA_FIXEDARG (ap, const char *, comment);
00149
00150 #ifdef ASM_OUTPUT_DWARF_OFFSET
00151 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, size, label);
00152 #else
00153 dw2_assemble_integer (size, gen_rtx_SYMBOL_REF (Pmode, label));
00154 #endif
00155
00156 if (flag_debug_asm && comment)
00157 {
00158 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00159 vfprintf (asm_out_file, comment, ap);
00160 }
00161 fputc ('\n', asm_out_file);
00162
00163 VA_CLOSE (ap);
00164 }
00165
00166
00167
00168
00169 void
00170 dw2_asm_output_pcrel VPARAMS ((int size ATTRIBUTE_UNUSED,
00171 const char *label ATTRIBUTE_UNUSED,
00172 const char *comment, ...))
00173 {
00174 VA_OPEN (ap, comment);
00175 VA_FIXEDARG (ap, int, size);
00176 VA_FIXEDARG (ap, const char *, label);
00177 VA_FIXEDARG (ap, const char *, comment);
00178
00179 #ifdef ASM_OUTPUT_DWARF_PCREL
00180 ASM_OUTPUT_DWARF_PCREL (asm_out_file, size, label);
00181 #else
00182 dw2_assemble_integer (size,
00183 gen_rtx_MINUS (Pmode,
00184 gen_rtx_SYMBOL_REF (Pmode, label),
00185 pc_rtx));
00186 #endif
00187
00188 if (flag_debug_asm && comment)
00189 {
00190 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00191 vfprintf (asm_out_file, comment, ap);
00192 }
00193 fputc ('\n', asm_out_file);
00194
00195 VA_CLOSE (ap);
00196 }
00197
00198
00199
00200 void
00201 dw2_asm_output_addr VPARAMS ((int size, const char *label,
00202 const char *comment, ...))
00203 {
00204 VA_OPEN (ap, comment);
00205 VA_FIXEDARG (ap, int, size);
00206 VA_FIXEDARG (ap, const char *, label);
00207 VA_FIXEDARG (ap, const char *, comment);
00208
00209 dw2_assemble_integer (size, gen_rtx_SYMBOL_REF (Pmode, label));
00210
00211 if (flag_debug_asm && comment)
00212 {
00213 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00214 vfprintf (asm_out_file, comment, ap);
00215 }
00216 fputc ('\n', asm_out_file);
00217
00218 VA_CLOSE (ap);
00219 }
00220
00221
00222
00223 void
00224 dw2_asm_output_addr_rtx VPARAMS ((int size, rtx addr,
00225 const char *comment, ...))
00226 {
00227 VA_OPEN (ap, comment);
00228 VA_FIXEDARG (ap, int, size);
00229 VA_FIXEDARG (ap, rtx, addr);
00230 VA_FIXEDARG (ap, const char *, comment);
00231
00232 dw2_assemble_integer (size, addr);
00233
00234 if (flag_debug_asm && comment)
00235 {
00236 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00237 vfprintf (asm_out_file, comment, ap);
00238 }
00239 fputc ('\n', asm_out_file);
00240
00241 VA_CLOSE (ap);
00242 }
00243
00244 void
00245 dw2_asm_output_nstring VPARAMS ((const char *str, size_t orig_len,
00246 const char *comment, ...))
00247 {
00248 size_t i, len;
00249
00250 VA_OPEN (ap, comment);
00251 VA_FIXEDARG (ap, const char *, str);
00252 VA_FIXEDARG (ap, size_t, orig_len);
00253 VA_FIXEDARG (ap, const char *, comment);
00254
00255 len = orig_len;
00256
00257 if (len == (size_t) -1)
00258 len = strlen (str);
00259
00260 if (flag_debug_asm && comment)
00261 {
00262 fputs ("\t.ascii \"", asm_out_file);
00263 for (i = 0; i < len; i++)
00264 {
00265 int c = str[i];
00266 if (c == '\"' || c == '\\')
00267 fputc ('\\', asm_out_file);
00268 if (ISPRINT(c))
00269 fputc (c, asm_out_file);
00270 else
00271 fprintf (asm_out_file, "\\%o", c);
00272 }
00273 fprintf (asm_out_file, "\\0\"\t%s ", ASM_COMMENT_START);
00274 vfprintf (asm_out_file, comment, ap);
00275 fputc ('\n', asm_out_file);
00276 }
00277 else
00278 {
00279
00280
00281 if (orig_len == (size_t) -1)
00282 len += 1;
00283 ASM_OUTPUT_ASCII (asm_out_file, str, len);
00284 if (orig_len != (size_t) -1)
00285 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
00286 }
00287
00288 VA_CLOSE (ap);
00289 }
00290
00291
00292
00293
00294 int
00295 size_of_uleb128 (value)
00296 unsigned HOST_WIDE_INT value;
00297 {
00298 int size = 0, byte;
00299
00300 do
00301 {
00302 byte = (value & 0x7f);
00303 value >>= 7;
00304 size += 1;
00305 }
00306 while (value != 0);
00307
00308 return size;
00309 }
00310
00311
00312
00313 int
00314 size_of_sleb128 (value)
00315 HOST_WIDE_INT value;
00316 {
00317 int size = 0, byte;
00318
00319 do
00320 {
00321 byte = (value & 0x7f);
00322 value >>= 7;
00323 size += 1;
00324 }
00325 while (!((value == 0 && (byte & 0x40) == 0)
00326 || (value == -1 && (byte & 0x40) != 0)));
00327
00328 return size;
00329 }
00330
00331
00332
00333
00334
00335 int
00336 size_of_encoded_value (encoding)
00337 int encoding;
00338 {
00339 if (encoding == DW_EH_PE_omit)
00340 return 0;
00341
00342 switch (encoding & 0x07)
00343 {
00344 case DW_EH_PE_absptr:
00345 return POINTER_SIZE / BITS_PER_UNIT;
00346 case DW_EH_PE_udata2:
00347 return 2;
00348 case DW_EH_PE_udata4:
00349 return 4;
00350 case DW_EH_PE_udata8:
00351 return 8;
00352 }
00353 abort ();
00354 }
00355
00356
00357
00358 const char *
00359 eh_data_format_name (format)
00360 int format;
00361 {
00362 #if HAVE_DESIGNATED_INITIALIZERS
00363 #define S(p, v) [p] = v,
00364 #else
00365 #define S(p, v) case p: return v;
00366 #endif
00367
00368 #if HAVE_DESIGNATED_INITIALIZERS
00369 __extension__ static const char * const format_names[256] = {
00370 #else
00371 switch (format) {
00372 #endif
00373
00374 S(DW_EH_PE_absptr, "absolute")
00375 S(DW_EH_PE_omit, "omit")
00376 S(DW_EH_PE_aligned, "aligned absolute")
00377
00378 S(DW_EH_PE_uleb128, "uleb128")
00379 S(DW_EH_PE_udata2, "udata2")
00380 S(DW_EH_PE_udata4, "udata4")
00381 S(DW_EH_PE_udata8, "udata8")
00382 S(DW_EH_PE_sleb128, "sleb128")
00383 S(DW_EH_PE_sdata2, "sdata2")
00384 S(DW_EH_PE_sdata4, "sdata4")
00385 S(DW_EH_PE_sdata8, "sdata8")
00386
00387 S(DW_EH_PE_absptr | DW_EH_PE_pcrel, "pcrel")
00388 S(DW_EH_PE_uleb128 | DW_EH_PE_pcrel, "pcrel uleb128")
00389 S(DW_EH_PE_udata2 | DW_EH_PE_pcrel, "pcrel udata2")
00390 S(DW_EH_PE_udata4 | DW_EH_PE_pcrel, "pcrel udata4")
00391 S(DW_EH_PE_udata8 | DW_EH_PE_pcrel, "pcrel udata8")
00392 S(DW_EH_PE_sleb128 | DW_EH_PE_pcrel, "pcrel sleb128")
00393 S(DW_EH_PE_sdata2 | DW_EH_PE_pcrel, "pcrel sdata2")
00394 S(DW_EH_PE_sdata4 | DW_EH_PE_pcrel, "pcrel sdata4")
00395 S(DW_EH_PE_sdata8 | DW_EH_PE_pcrel, "pcrel sdata8")
00396
00397 S(DW_EH_PE_absptr | DW_EH_PE_textrel, "textrel")
00398 S(DW_EH_PE_uleb128 | DW_EH_PE_textrel, "textrel uleb128")
00399 S(DW_EH_PE_udata2 | DW_EH_PE_textrel, "textrel udata2")
00400 S(DW_EH_PE_udata4 | DW_EH_PE_textrel, "textrel udata4")
00401 S(DW_EH_PE_udata8 | DW_EH_PE_textrel, "textrel udata8")
00402 S(DW_EH_PE_sleb128 | DW_EH_PE_textrel, "textrel sleb128")
00403 S(DW_EH_PE_sdata2 | DW_EH_PE_textrel, "textrel sdata2")
00404 S(DW_EH_PE_sdata4 | DW_EH_PE_textrel, "textrel sdata4")
00405 S(DW_EH_PE_sdata8 | DW_EH_PE_textrel, "textrel sdata8")
00406
00407 S(DW_EH_PE_absptr | DW_EH_PE_datarel, "datarel")
00408 S(DW_EH_PE_uleb128 | DW_EH_PE_datarel, "datarel uleb128")
00409 S(DW_EH_PE_udata2 | DW_EH_PE_datarel, "datarel udata2")
00410 S(DW_EH_PE_udata4 | DW_EH_PE_datarel, "datarel udata4")
00411 S(DW_EH_PE_udata8 | DW_EH_PE_datarel, "datarel udata8")
00412 S(DW_EH_PE_sleb128 | DW_EH_PE_datarel, "datarel sleb128")
00413 S(DW_EH_PE_sdata2 | DW_EH_PE_datarel, "datarel sdata2")
00414 S(DW_EH_PE_sdata4 | DW_EH_PE_datarel, "datarel sdata4")
00415 S(DW_EH_PE_sdata8 | DW_EH_PE_datarel, "datarel sdata8")
00416
00417 S(DW_EH_PE_absptr | DW_EH_PE_funcrel, "funcrel")
00418 S(DW_EH_PE_uleb128 | DW_EH_PE_funcrel, "funcrel uleb128")
00419 S(DW_EH_PE_udata2 | DW_EH_PE_funcrel, "funcrel udata2")
00420 S(DW_EH_PE_udata4 | DW_EH_PE_funcrel, "funcrel udata4")
00421 S(DW_EH_PE_udata8 | DW_EH_PE_funcrel, "funcrel udata8")
00422 S(DW_EH_PE_sleb128 | DW_EH_PE_funcrel, "funcrel sleb128")
00423 S(DW_EH_PE_sdata2 | DW_EH_PE_funcrel, "funcrel sdata2")
00424 S(DW_EH_PE_sdata4 | DW_EH_PE_funcrel, "funcrel sdata4")
00425 S(DW_EH_PE_sdata8 | DW_EH_PE_funcrel, "funcrel sdata8")
00426
00427 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_pcrel,
00428 "indirect pcrel")
00429 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_pcrel,
00430 "indirect pcrel uleb128")
00431 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_pcrel,
00432 "indirect pcrel udata2")
00433 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_pcrel,
00434 "indirect pcrel udata4")
00435 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_pcrel,
00436 "indirect pcrel udata8")
00437 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_pcrel,
00438 "indirect pcrel sleb128")
00439 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_pcrel,
00440 "indirect pcrel sdata2")
00441 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_pcrel,
00442 "indirect pcrel sdata4")
00443 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_pcrel,
00444 "indirect pcrel sdata8")
00445
00446 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_textrel,
00447 "indirect textrel")
00448 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_textrel,
00449 "indirect textrel uleb128")
00450 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_textrel,
00451 "indirect textrel udata2")
00452 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_textrel,
00453 "indirect textrel udata4")
00454 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_textrel,
00455 "indirect textrel udata8")
00456 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_textrel,
00457 "indirect textrel sleb128")
00458 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_textrel,
00459 "indirect textrel sdata2")
00460 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_textrel,
00461 "indirect textrel sdata4")
00462 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_textrel,
00463 "indirect textrel sdata8")
00464
00465 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_datarel,
00466 "indirect datarel")
00467 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_datarel,
00468 "indirect datarel uleb128")
00469 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_datarel,
00470 "indirect datarel udata2")
00471 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_datarel,
00472 "indirect datarel udata4")
00473 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_datarel,
00474 "indirect datarel udata8")
00475 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_datarel,
00476 "indirect datarel sleb128")
00477 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_datarel,
00478 "indirect datarel sdata2")
00479 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_datarel,
00480 "indirect datarel sdata4")
00481 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_datarel,
00482 "indirect datarel sdata8")
00483
00484 S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_funcrel,
00485 "indirect funcrel")
00486 S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_funcrel,
00487 "indirect funcrel uleb128")
00488 S(DW_EH_PE_indirect | DW_EH_PE_udata2 | DW_EH_PE_funcrel,
00489 "indirect funcrel udata2")
00490 S(DW_EH_PE_indirect | DW_EH_PE_udata4 | DW_EH_PE_funcrel,
00491 "indirect funcrel udata4")
00492 S(DW_EH_PE_indirect | DW_EH_PE_udata8 | DW_EH_PE_funcrel,
00493 "indirect funcrel udata8")
00494 S(DW_EH_PE_indirect | DW_EH_PE_sleb128 | DW_EH_PE_funcrel,
00495 "indirect funcrel sleb128")
00496 S(DW_EH_PE_indirect | DW_EH_PE_sdata2 | DW_EH_PE_funcrel,
00497 "indirect funcrel sdata2")
00498 S(DW_EH_PE_indirect | DW_EH_PE_sdata4 | DW_EH_PE_funcrel,
00499 "indirect funcrel sdata4")
00500 S(DW_EH_PE_indirect | DW_EH_PE_sdata8 | DW_EH_PE_funcrel,
00501 "indirect funcrel sdata8")
00502
00503 #if HAVE_DESIGNATED_INITIALIZERS
00504 };
00505
00506 if (format < 0 || format > 0xff || format_names[format] == NULL)
00507 abort ();
00508 return format_names[format];
00509 #else
00510 }
00511 abort ();
00512 #endif
00513 }
00514
00515
00516
00517 void
00518 dw2_asm_output_data_uleb128 VPARAMS ((unsigned HOST_WIDE_INT value,
00519 const char *comment, ...))
00520 {
00521 VA_OPEN (ap, comment);
00522 VA_FIXEDARG (ap, unsigned HOST_WIDE_INT, value);
00523 VA_FIXEDARG (ap, const char *, comment);
00524
00525 #ifdef HAVE_AS_LEB128
00526 fputs ("\t.uleb128 ", asm_out_file);
00527 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
00528
00529 if (flag_debug_asm && comment)
00530 {
00531 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00532 vfprintf (asm_out_file, comment, ap);
00533 }
00534 #else
00535 {
00536 unsigned HOST_WIDE_INT work = value;
00537 const char *byte_op = targetm.asm_out.byte_op;
00538
00539 if (byte_op)
00540 fputs (byte_op, asm_out_file);
00541 do
00542 {
00543 int byte = (work & 0x7f);
00544 work >>= 7;
00545 if (work != 0)
00546
00547 byte |= 0x80;
00548
00549 if (byte_op)
00550 {
00551 fprintf (asm_out_file, "0x%x", byte);
00552 if (work != 0)
00553 fputc (',', asm_out_file);
00554 }
00555 else
00556 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
00557 }
00558 while (work != 0);
00559
00560 if (flag_debug_asm)
00561 {
00562 fprintf (asm_out_file, "\t%s uleb128 ", ASM_COMMENT_START);
00563 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
00564 if (comment)
00565 {
00566 fputs ("; ", asm_out_file);
00567 vfprintf (asm_out_file, comment, ap);
00568 }
00569 }
00570 }
00571 #endif
00572 fputc ('\n', asm_out_file);
00573
00574 VA_CLOSE (ap);
00575 }
00576
00577
00578
00579 void
00580 dw2_asm_output_data_sleb128 VPARAMS ((HOST_WIDE_INT value,
00581 const char *comment, ...))
00582 {
00583 VA_OPEN (ap, comment);
00584 VA_FIXEDARG (ap, HOST_WIDE_INT, value);
00585 VA_FIXEDARG (ap, const char *, comment);
00586
00587 #ifdef HAVE_AS_LEB128
00588 fputs ("\t.sleb128 ", asm_out_file);
00589 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, value);
00590
00591 if (flag_debug_asm && comment)
00592 {
00593 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00594 vfprintf (asm_out_file, comment, ap);
00595 }
00596 #else
00597 {
00598 HOST_WIDE_INT work = value;
00599 int more, byte;
00600 const char *byte_op = targetm.asm_out.byte_op;
00601
00602 if (byte_op)
00603 fputs (byte_op, asm_out_file);
00604 do
00605 {
00606 byte = (work & 0x7f);
00607
00608 work >>= 7;
00609 more = !((work == 0 && (byte & 0x40) == 0)
00610 || (work == -1 && (byte & 0x40) != 0));
00611 if (more)
00612 byte |= 0x80;
00613
00614 if (byte_op)
00615 {
00616 fprintf (asm_out_file, "0x%x", byte);
00617 if (more)
00618 fputc (',', asm_out_file);
00619 }
00620 else
00621 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
00622 }
00623 while (more);
00624
00625 if (flag_debug_asm)
00626 {
00627 fprintf (asm_out_file, "\t%s sleb128 ", ASM_COMMENT_START);
00628 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, value);
00629 if (comment)
00630 {
00631 fputs ("; ", asm_out_file);
00632 vfprintf (asm_out_file, comment, ap);
00633 }
00634 }
00635 }
00636 #endif
00637 fputc ('\n', asm_out_file);
00638
00639 VA_CLOSE (ap);
00640 }
00641
00642 void
00643 dw2_asm_output_delta_uleb128 VPARAMS ((const char *lab1 ATTRIBUTE_UNUSED,
00644 const char *lab2 ATTRIBUTE_UNUSED,
00645 const char *comment, ...))
00646 {
00647 VA_OPEN (ap, comment);
00648 VA_FIXEDARG (ap, const char *, lab1);
00649 VA_FIXEDARG (ap, const char *, lab2);
00650 VA_FIXEDARG (ap, const char *, comment);
00651
00652 #ifdef HAVE_AS_LEB128
00653 fputs ("\t.uleb128 ", asm_out_file);
00654 assemble_name (asm_out_file, lab1);
00655 fputc ('-', asm_out_file);
00656 assemble_name (asm_out_file, lab2);
00657 #else
00658 abort ();
00659 #endif
00660
00661 if (flag_debug_asm && comment)
00662 {
00663 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00664 vfprintf (asm_out_file, comment, ap);
00665 }
00666 fputc ('\n', asm_out_file);
00667
00668 VA_CLOSE (ap);
00669 }
00670
00671 void
00672 dw2_asm_output_delta_sleb128 VPARAMS ((const char *lab1 ATTRIBUTE_UNUSED,
00673 const char *lab2 ATTRIBUTE_UNUSED,
00674 const char *comment, ...))
00675 {
00676 VA_OPEN (ap, comment);
00677 VA_FIXEDARG (ap, const char *, lab1);
00678 VA_FIXEDARG (ap, const char *, lab2);
00679 VA_FIXEDARG (ap, const char *, comment);
00680
00681 #ifdef HAVE_AS_LEB128
00682 fputs ("\t.sleb128 ", asm_out_file);
00683 assemble_name (asm_out_file, lab1);
00684 fputc ('-', asm_out_file);
00685 assemble_name (asm_out_file, lab2);
00686 #else
00687 abort ();
00688 #endif
00689
00690 if (flag_debug_asm && comment)
00691 {
00692 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00693 vfprintf (asm_out_file, comment, ap);
00694 }
00695 fputc ('\n', asm_out_file);
00696
00697 VA_CLOSE (ap);
00698 }
00699
00700 static int mark_indirect_pool_entry PARAMS ((splay_tree_node, void *));
00701 static void mark_indirect_pool PARAMS ((PTR arg));
00702 static rtx dw2_force_const_mem PARAMS ((rtx));
00703 static int dw2_output_indirect_constant_1 PARAMS ((splay_tree_node, void *));
00704
00705 static splay_tree indirect_pool;
00706
00707 #if defined(HAVE_GAS_HIDDEN) && defined(SUPPORTS_ONE_ONLY)
00708 # define USE_LINKONCE_INDIRECT 1
00709 #else
00710 # define USE_LINKONCE_INDIRECT 0
00711 #endif
00712
00713
00714
00715 static int
00716 mark_indirect_pool_entry (node, data)
00717 splay_tree_node node;
00718 void* data ATTRIBUTE_UNUSED;
00719 {
00720 ggc_mark_tree ((tree) node->value);
00721 return 0;
00722 }
00723
00724
00725
00726 static void
00727 mark_indirect_pool (arg)
00728 PTR arg ATTRIBUTE_UNUSED;
00729 {
00730 splay_tree_foreach (indirect_pool, mark_indirect_pool_entry, NULL);
00731 }
00732
00733
00734
00735
00736
00737
00738 static rtx
00739 dw2_force_const_mem (x)
00740 rtx x;
00741 {
00742 splay_tree_node node;
00743 const char *str;
00744 tree decl;
00745
00746 if (! indirect_pool)
00747 {
00748 indirect_pool = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
00749 ggc_add_root (&indirect_pool, 1, sizeof indirect_pool, mark_indirect_pool);
00750 }
00751
00752 if (GET_CODE (x) != SYMBOL_REF)
00753 abort ();
00754
00755 str = (* targetm.strip_name_encoding) (XSTR (x, 0));
00756 node = splay_tree_lookup (indirect_pool, (splay_tree_key) str);
00757 if (node)
00758 decl = (tree) node->value;
00759 else
00760 {
00761 tree id;
00762
00763 if (USE_LINKONCE_INDIRECT)
00764 {
00765 char *ref_name = alloca (strlen (str) + sizeof "DW.ref.");
00766
00767 sprintf (ref_name, "DW.ref.%s", str);
00768 id = get_identifier (ref_name);
00769 decl = build_decl (VAR_DECL, id, ptr_type_node);
00770 DECL_ARTIFICIAL (decl) = 1;
00771 TREE_PUBLIC (decl) = 1;
00772 DECL_INITIAL (decl) = decl;
00773 make_decl_one_only (decl);
00774 }
00775 else
00776 {
00777 extern int const_labelno;
00778 char label[32];
00779
00780 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
00781 ++const_labelno;
00782 id = get_identifier (label);
00783 decl = build_decl (VAR_DECL, id, ptr_type_node);
00784 DECL_ARTIFICIAL (decl) = 1;
00785 TREE_STATIC (decl) = 1;
00786 DECL_INITIAL (decl) = decl;
00787 }
00788
00789 id = maybe_get_identifier (str);
00790 if (id)
00791 TREE_SYMBOL_REFERENCED (id) = 1;
00792
00793 splay_tree_insert (indirect_pool, (splay_tree_key) str,
00794 (splay_tree_value) decl);
00795 }
00796
00797 return XEXP (DECL_RTL (decl), 0);
00798 }
00799
00800
00801
00802
00803 static int
00804 dw2_output_indirect_constant_1 (node, data)
00805 splay_tree_node node;
00806 void* data ATTRIBUTE_UNUSED;
00807 {
00808 const char *sym;
00809 rtx sym_ref;
00810
00811 sym = (const char *) node->key;
00812 sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
00813 if (USE_LINKONCE_INDIRECT)
00814 fprintf (asm_out_file, "\t.hidden DW.ref.%s\n", sym);
00815 assemble_variable ((tree) node->value, 1, 1, 1);
00816 assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
00817
00818 return 0;
00819 }
00820
00821
00822
00823 void
00824 dw2_output_indirect_constants ()
00825 {
00826 if (indirect_pool)
00827 splay_tree_foreach (indirect_pool, dw2_output_indirect_constant_1, NULL);
00828 }
00829
00830
00831
00832 void
00833 dw2_asm_output_encoded_addr_rtx VPARAMS ((int encoding,
00834 rtx addr,
00835 const char *comment, ...))
00836 {
00837 int size;
00838
00839 VA_OPEN (ap, comment);
00840 VA_FIXEDARG (ap, int, encoding);
00841 VA_FIXEDARG (ap, rtx, addr);
00842 VA_FIXEDARG (ap, const char *, comment);
00843
00844 size = size_of_encoded_value (encoding);
00845
00846 if (encoding == DW_EH_PE_aligned)
00847 {
00848 assemble_align (POINTER_SIZE);
00849 assemble_integer (addr, size, POINTER_SIZE, 1);
00850 return;
00851 }
00852
00853
00854
00855 if (addr == const0_rtx || addr == const1_rtx)
00856 assemble_integer (addr, size, BITS_PER_UNIT, 1);
00857 else
00858 {
00859 restart:
00860
00861
00862
00863 #ifdef ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX
00864 ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (asm_out_file, encoding, size,
00865 addr, done);
00866 #endif
00867
00868
00869
00870 if (encoding & DW_EH_PE_indirect)
00871 {
00872
00873
00874
00875
00876
00877 addr = dw2_force_const_mem (addr);
00878 encoding &= ~DW_EH_PE_indirect;
00879 goto restart;
00880 }
00881
00882 switch (encoding & 0xF0)
00883 {
00884 case DW_EH_PE_absptr:
00885 dw2_assemble_integer (size, addr);
00886 break;
00887
00888 case DW_EH_PE_pcrel:
00889 if (GET_CODE (addr) != SYMBOL_REF)
00890 abort ();
00891 #ifdef ASM_OUTPUT_DWARF_PCREL
00892 ASM_OUTPUT_DWARF_PCREL (asm_out_file, size, XSTR (addr, 0));
00893 #else
00894 dw2_assemble_integer (size, gen_rtx_MINUS (Pmode, addr, pc_rtx));
00895 #endif
00896 break;
00897
00898 default:
00899
00900
00901 abort ();
00902 }
00903
00904 #ifdef ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX
00905 done:;
00906 #endif
00907 }
00908
00909 if (flag_debug_asm && comment)
00910 {
00911 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
00912 vfprintf (asm_out_file, comment, ap);
00913 }
00914 fputc ('\n', asm_out_file);
00915
00916 VA_CLOSE (ap);
00917 }