X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fdwarf2asm.c;h=fe305d3ed4e4e0786c32d9fadaf726539b7b6cab;hb=09b261578fbb8fece1971913fb94367495762f0d;hp=4e2c9980feb688a583e9404b2f2df4347f504d76;hpb=2452254d308937f722a81173c4ef1cd43ab67107;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c index 4e2c9980feb..fe305d3ed4e 100644 --- a/gcc/dwarf2asm.c +++ b/gcc/dwarf2asm.c @@ -1,5 +1,5 @@ /* Dwarf2 assembler output helper routines. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -29,17 +29,11 @@ along with GCC; see the file COPYING3. If not see #include "output.h" #include "target.h" #include "dwarf2asm.h" -#include "elf/dwarf2.h" +#include "dwarf2.h" #include "splay-tree.h" #include "ggc.h" #include "tm_p.h" - -/* How to start an assembler comment. */ -#ifndef ASM_COMMENT_START -#define ASM_COMMENT_START ";#" -#endif - /* Output an unaligned integer with the given value and size. Prefer not to print a newline, since the caller may want to add a comment. */ @@ -53,8 +47,7 @@ dw2_assemble_integer (int size, rtx x) { fputs (op, asm_out_file); if (CONST_INT_P (x)) - fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, - (unsigned HOST_WIDE_INT) INTVAL (x)); + fprint_whex (asm_out_file, (unsigned HOST_WIDE_INT) INTVAL (x)); else output_addr_const (asm_out_file, x); } @@ -80,14 +73,14 @@ dw2_asm_output_data_raw (int size, unsigned HOST_WIDE_INT value) if (BYTES_BIG_ENDIAN) { for (i = size - 1; i > 0; --i) - fprintf (asm_out_file, "0x%x,", bytes[i]); - fprintf (asm_out_file, "0x%x", bytes[0]); + fprintf (asm_out_file, "%#x,", bytes[i]); + fprintf (asm_out_file, "%#x", bytes[0]); } else { for (i = 0; i < size - 1; ++i) - fprintf (asm_out_file, "0x%x,", bytes[i]); - fprintf (asm_out_file, "0x%x", bytes[i]); + fprintf (asm_out_file, "%#x,", bytes[i]); + fprintf (asm_out_file, "%#x", bytes[i]); } } @@ -106,16 +99,19 @@ dw2_asm_output_data (int size, unsigned HOST_WIDE_INT value, value &= ~(~(unsigned HOST_WIDE_INT) 0 << (size * 8)); if (op) - fprintf (asm_out_file, "%s" HOST_WIDE_INT_PRINT_HEX, op, value); + { + fputs (op, asm_out_file); + fprint_whex (asm_out_file, value); + } else assemble_integer (GEN_INT (value), size, BITS_PER_UNIT, 1); if (flag_debug_asm && comment) { - fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START); + fputs ("\t" ASM_COMMENT_START " ", asm_out_file); vfprintf (asm_out_file, comment, ap); } - fputc ('\n', asm_out_file); + putc ('\n', asm_out_file); va_end (ap); } @@ -152,6 +148,35 @@ dw2_asm_output_delta (int size, const char *lab1, const char *lab2, va_end (ap); } +/* Output the difference between two symbols in instruction units + in a given size. */ + +void +dw2_asm_output_vms_delta (int size ATTRIBUTE_UNUSED, + const char *lab1, const char *lab2, + const char *comment, ...) +{ + va_list ap; + + va_start (ap, comment); + +#ifndef ASM_OUTPUT_DWARF_VMS_DELTA + /* VMS Delta is only special on ia64-vms, but this funtion also gets + called on alpha-vms so it has to do something sane. */ + dw2_asm_output_delta (size, lab1, lab2, comment); +#else + ASM_OUTPUT_DWARF_VMS_DELTA (asm_out_file, size, lab1, lab2); + if (flag_debug_asm && comment) + { + fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START); + vfprintf (asm_out_file, comment, ap); + } + fputc ('\n', asm_out_file); +#endif + + va_end (ap); +} + /* Output a section-relative reference to a LABEL, which was placed in BASE. In general this can only be done for debugging symbols. E.g. on most targets with the GNU linker, this is accomplished with @@ -268,7 +293,7 @@ dw2_asm_output_addr_rtx (int size, rtx addr, If COMMENT is not NULL and comments in the debug information have been requested by the user, append the given COMMENT to the generated output. */ - + void dw2_asm_output_nstring (const char *str, size_t orig_len, const char *comment, ...) @@ -446,6 +471,8 @@ eh_data_format_name (int format) S(DW_EH_PE_sdata4 | DW_EH_PE_funcrel, "funcrel sdata4") S(DW_EH_PE_sdata8 | DW_EH_PE_funcrel, "funcrel sdata8") + S(DW_EH_PE_indirect | DW_EH_PE_absptr, "indirect absolute") + S(DW_EH_PE_indirect | DW_EH_PE_absptr | DW_EH_PE_pcrel, "indirect pcrel") S(DW_EH_PE_indirect | DW_EH_PE_uleb128 | DW_EH_PE_pcrel, @@ -526,7 +553,7 @@ eh_data_format_name (int format) }; gcc_assert (format >= 0 && format < 0x100 && format_names[format]); - + return format_names[format]; #else } @@ -547,7 +574,7 @@ dw2_asm_output_data_uleb128_raw (unsigned HOST_WIDE_INT value) /* More bytes to follow. */ byte |= 0x80; - fprintf (asm_out_file, "0x%x", byte); + fprintf (asm_out_file, "%#x", byte); if (value == 0) break; fputc (',', asm_out_file); @@ -565,7 +592,8 @@ dw2_asm_output_data_uleb128 (unsigned HOST_WIDE_INT value, va_start (ap, comment); #ifdef HAVE_AS_LEB128 - fprintf (asm_out_file, "\t.uleb128 " HOST_WIDE_INT_PRINT_HEX , value); + fputs ("\t.uleb128 ", asm_out_file); + fprint_whex (asm_out_file, value); if (flag_debug_asm && comment) { @@ -589,7 +617,7 @@ dw2_asm_output_data_uleb128 (unsigned HOST_WIDE_INT value, if (byte_op) { - fprintf (asm_out_file, "0x%x", byte); + fprintf (asm_out_file, "%#x", byte); if (work != 0) fputc (',', asm_out_file); } @@ -610,7 +638,7 @@ dw2_asm_output_data_uleb128 (unsigned HOST_WIDE_INT value, } } #endif - fputc ('\n', asm_out_file); + putc ('\n', asm_out_file); va_end (ap); } @@ -631,7 +659,7 @@ dw2_asm_output_data_sleb128_raw (HOST_WIDE_INT value) if (more) byte |= 0x80; - fprintf (asm_out_file, "0x%x", byte); + fprintf (asm_out_file, "%#x", byte); if (!more) break; fputc (',', asm_out_file); @@ -676,7 +704,7 @@ dw2_asm_output_data_sleb128 (HOST_WIDE_INT value, if (byte_op) { - fprintf (asm_out_file, "0x%x", byte); + fprintf (asm_out_file, "%#x", byte); if (more) fputc (',', asm_out_file); } @@ -714,7 +742,7 @@ dw2_asm_output_delta_uleb128 (const char *lab1 ATTRIBUTE_UNUSED, #ifdef HAVE_AS_LEB128 fputs ("\t.uleb128 ", asm_out_file); assemble_name (asm_out_file, lab1); - fputc ('-', asm_out_file); + putc ('-', asm_out_file); assemble_name (asm_out_file, lab2); #else gcc_unreachable (); @@ -744,7 +772,7 @@ dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED, #ifdef HAVE_AS_LEB128 fputs ("\t.sleb128 ", asm_out_file); assemble_name (asm_out_file, lab1); - fputc ('-', asm_out_file); + putc ('-', asm_out_file); assemble_name (asm_out_file, lab2); #else gcc_unreachable (); @@ -767,8 +795,8 @@ static GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool; static GTY(()) int dw2_const_labelno; -#if defined(HAVE_GAS_HIDDEN) && defined(SUPPORTS_ONE_ONLY) -# define USE_LINKONCE_INDIRECT 1 +#if defined(HAVE_GAS_HIDDEN) +# define USE_LINKONCE_INDIRECT (SUPPORTS_ONE_ONLY) #else # define USE_LINKONCE_INDIRECT 0 #endif @@ -814,7 +842,9 @@ dw2_force_const_mem (rtx x, bool is_public) if (! indirect_pool) /* We use strcmp, rather than just comparing pointers, so that the sort order will not depend on the host system. */ - indirect_pool = splay_tree_new_ggc (splay_tree_compare_strings); + indirect_pool = splay_tree_new_ggc (splay_tree_compare_strings, + ggc_alloc_splay_tree_str_tree_node_splay_tree_s, + ggc_alloc_splay_tree_str_tree_node_splay_tree_node_s); gcc_assert (GET_CODE (x) == SYMBOL_REF); @@ -872,22 +902,23 @@ dw2_output_indirect_constant_1 (splay_tree_node node, id = (tree) node->value; decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, id, ptr_type_node); + SET_DECL_ASSEMBLER_NAME (decl, id); DECL_ARTIFICIAL (decl) = 1; DECL_IGNORED_P (decl) = 1; DECL_INITIAL (decl) = decl; + TREE_READONLY (decl) = 1; if (TREE_PUBLIC (id)) { TREE_PUBLIC (decl) = 1; make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl)); + if (USE_LINKONCE_INDIRECT) + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; } else TREE_STATIC (decl) = 1; sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym); - sym = targetm.strip_name_encoding (sym); - if (TREE_PUBLIC (decl) && USE_LINKONCE_INDIRECT) - fprintf (asm_out_file, "\t.hidden %sDW.ref.%s\n", user_label_prefix, sym); assemble_variable (decl, 1, 1, 1); assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); @@ -922,6 +953,7 @@ dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, bool is_public, { assemble_align (POINTER_SIZE); assemble_integer (addr, size, POINTER_SIZE, 1); + va_end (ap); return; }