Commit 9a631e8e by Richard Stallman

*** empty log message ***

From-SVN: r832
parent c53a8ab6
......@@ -165,8 +165,7 @@ decl_attributes (decl, attributes)
if (!strcmp (specified_name, GET_MODE_NAME (i)))
{
tree type
= type_for_size (GET_MODE_BITSIZE (i),
TREE_UNSIGNED (TREE_TYPE (decl)));
= type_for_mode (i, TREE_UNSIGNED (TREE_TYPE (decl)));
if (type != 0)
{
TREE_TYPE (decl) = type;
......@@ -175,6 +174,7 @@ decl_attributes (decl, attributes)
}
else
error ("no data type for mode `%s'", specified_name);
break;
}
if (i == NUM_MACHINE_MODES)
error ("unknown machine mode `%s'", specified_name);
......@@ -187,12 +187,12 @@ decl_attributes (decl, attributes)
* BITS_PER_UNIT;
if (exact_log2 (align) == -1)
warning_with_decl (decl,
"requested alignment of `%s' is not a power of 2");
error_with_decl (decl,
"requested alignment of `%s' is not a power of 2");
else if (TREE_CODE (decl) != VAR_DECL
&& TREE_CODE (decl) != FIELD_DECL)
warning_with_decl (decl,
"alignment specified for `%s' which is not a variable");
error_with_decl (decl,
"alignment specified for `%s', not a variable");
else
DECL_ALIGN (decl) = align;
}
......@@ -208,8 +208,8 @@ decl_attributes (decl, attributes)
if (TREE_CODE (decl) != FUNCTION_DECL)
{
warning_with_decl (decl,
"argument format specified for non-function `%s'");
error_with_decl (decl,
"argument format specified for non-function `%s'");
return;
}
......@@ -219,13 +219,13 @@ decl_attributes (decl, attributes)
is_scan = 1;
else
{
warning_with_decl (decl,"unrecognized format specifier for `%s'");
error_with_decl (decl, "unrecognized format specifier for `%s'");
return;
}
if (first_arg_num != 0 && first_arg_num <= format_num)
{
warning_with_decl (decl,
error_with_decl (decl,
"format string arg follows the args to be formatted, for `%s'");
return;
}
......
/* Dwarf definitions.
/* Declarations and definitions of codes relating to the DWARF symbolic
debugging information format.
This file is derived from the DWARF specification, Draft #5 by the UNIX
International Programming Languages Special Interest Group dated 10/21/91.
*/
Written by Ron Guilmette (rfg@ncd.com)
/* Tag names and codes: Figure 9. */
#define TAG_padding 0x0000
#define TAG_array_type 0x0001
#define TAG_class_type 0x0002
#define TAG_entry_point 0x0003
#define TAG_enumeration_type 0x0004
#define TAG_formal_parameter 0x0005
#define TAG_global_subroutine 0x0006
#define TAG_global_variable 0x0007
#define TAG_imported_declaration 0x0008
#define TAG_label 0x000a
#define TAG_lexical_block 0x000b
#define TAG_local_variable 0x000c
#define TAG_member 0x000d
#define TAG_pointer_type 0x000f
#define TAG_reference_type 0x0010
#define TAG_compile_unit 0x0011
#define TAG_source_file 0x0011
#define TAG_string_type 0x0012
#define TAG_structure_type 0x0013
#define TAG_subroutine 0x0014
#define TAG_subroutine_type 0x0015
#define TAG_typedef 0x0016
#define TAG_union_type 0x0017
#define TAG_unspecified_parameters 0x0018
#define TAG_variant 0x0019
#define TAG_common_block 0x001a
#define TAG_common_inclusion 0x001b
#define TAG_format 0x001c
#define TAG_inheritance 0x001d
#define TAG_inlined_subroutine 0x001e
#define TAG_module 0x001f
#define TAG_ptr_to_member_type 0x0020
#define TAG_set_type 0x0021
#define TAG_subrange_type 0x0022
#define TAG_with_stmt 0x0023
#define TAG_lo_user 0x8000
#define TAG_hi_user 0xffff
/* Form names and codes: Figure 10. */
#define FORM_ADDR 0x1
#define FORM_REF 0x2
#define FORM_BLOCK2 0x3
#define FORM_BLOCK4 0x4
#define FORM_DATA2 0x5
#define FORM_DATA4 0x6
#define FORM_DATA8 0x7
#define FORM_STRING 0x8
/* Attribute names and codes: Figure 11. */
#define AT_sibling /* reference */ (0x0010|FORM_REF)
#define AT_location /* block2 */ (0x0020|FORM_BLOCK2)
#define AT_name /* string */ (0x0030|FORM_STRING)
#define AT_fund_type /* halfword */ (0x0050|FORM_DATA2)
#define AT_mod_fund_type /* block2 */ (0x0060|FORM_BLOCK2)
#define AT_user_def_type /* reference */ (0x0070|FORM_REF)
#define AT_mod_u_d_type /* block2 */ (0x0080|FORM_BLOCK2)
#define AT_ordering /* halfword */ (0x0090|FORM_DATA2)
#define AT_subscr_data /* block2 */ (0x00a0|FORM_BLOCK2)
#define AT_byte_size /* word */ (0x00b0|FORM_DATA4)
#define AT_bit_offset /* halfword */ (0x00c0|FORM_DATA2)
#define AT_bit_size /* word */ (0x00d0|FORM_DATA4)
#define AT_element_list /* block4 */ (0x00f0|FORM_BLOCK4)
#define AT_stmt_list /* word */ (0x0100|FORM_DATA4)
#define AT_low_pc /* address */ (0x0110|FORM_ADDR)
#define AT_high_pc /* address */ (0x0120|FORM_ADDR)
#define AT_language /* word */ (0x0130|FORM_DATA4)
#define AT_member /* reference */ (0x0140|FORM_REF)
#define AT_discr /* reference */ (0x0150|FORM_REF)
#define AT_discr_value /* block2 */ (0x0160|FORM_BLOCK2)
#define AT_visibility /* halfword */ (0x0170|FORM_DATA2)
#define AT_import /* reference */ (0x0180|FORM_REF)
#define AT_string_length /* block2 */ (0x0190|FORM_BLOCK2)
#define AT_common_reference /* reference */ (0x01a0|FORM_REF)
#define AT_comp_dir /* string */ (0x01b0|FORM_STRING)
#define AT_const_value_string /* string */ (0x01c0|FORM_STRING)
#define AT_const_value_data2 /* halfword */ (0x01c0|FORM_DATA2)
#define AT_const_value_data4 /* word */ (0x01c0|FORM_DATA4)
#define AT_const_value_data8 /* doubleword */(0x01c0|FORM_DATA8)
#define AT_const_value_block2 /* block2 */ (0x01c0|FORM_BLOCK2)
#define AT_const_value_block4 /* block4 */ (0x01c0|FORM_BLOCK4)
#define AT_containing_type /* reference */ (0x01d0|FORM_REF)
#define AT_default_value_addr /* address */ (0x01e0|FORM_ADDR)
#define AT_default_value_data2 /* halfword */ (0x01e0|FORM_DATA2)
#define AT_default_value_data4 /* word */ (0x01e0|FORM_DATA4)
#define AT_default_value_data8 /* doubleword */(0x01e0|FORM_DATA8)
#define AT_default_value_string /* string */ (0x01e0|FORM_STRING)
#define AT_friends /* block2 */ (0x01f0|FORM_BLOCK2)
#define AT_inline /* string */ (0x0200|FORM_STRING)
#define AT_is_optional /* string */ (0x0210|FORM_STRING)
#define AT_lower_bound_ref /* reference */ (0x0220|FORM_REF)
#define AT_lower_bound_data2 /* halfword */ (0x0220|FORM_DATA2)
#define AT_lower_bound_data4 /* word */ (0x0220|FORM_DATA4)
#define AT_lower_bound_data8 /* doubleword */(0x0220|FORM_DATA8)
#define AT_main_program /* string */ (0x0230|FORM_STRING)
#define AT_private /* string */ (0x0240|FORM_STRING)
#define AT_producer /* string */ (0x0250|FORM_STRING)
#define AT_protected /* string */ (0x0260|FORM_STRING)
#define AT_prototyped /* string */ (0x0270|FORM_STRING)
#define AT_public /* string */ (0x0280|FORM_STRING)
#define AT_pure_virtual /* string */ (0x0290|FORM_STRING)
#define AT_return_addr_loc /* block2 */ (0x02a0|FORM_BLOCK2)
#define AT_specification /* reference */ (0x02b0|FORM_REF)
#define AT_start_scope /* word */ (0x02c0|FORM_DATA4)
#define AT_static_link_loc /* block2 */ (0x02d0|FORM_BLOCK2)
#define AT_stride_size /* word */ (0x02e0|FORM_DATA4)
#define AT_upper_bound_ref /* reference */ (0x02f0|FORM_REF)
#define AT_upper_bound_data2 /* halfword */ (0x02f0|FORM_DATA2)
#define AT_upper_bound_data4 /* word */ (0x02f0|FORM_DATA4)
#define AT_upper_bound_data8 /* doubleword */(0x02f0|FORM_DATA8)
#define AT_virtual /* string */ (0x0300|FORM_STRING)
#define AT_frame_base /* block2 */ (0x0310|FORM_BLOCK2)
/* GNU attribute extensions. */
#define AT_sf_names /* word */ (0x8000|FORM_DATA4)
#define AT_src_info /* word */ (0x8010|FORM_DATA4)
#define AT_mac_info /* word */ (0x8020|FORM_DATA4)
#define AT_lo_user /* - */ 0x8000
#define AT_hi_user /* - */ 0xffff
/* Location atom names and codes: Figure 13. */
#define OP_REG 0x01
#define OP_BASEREG 0x02
#define OP_ADDR 0x03
#define OP_CONST 0x04
#define OP_DEREF2 0x05
#define OP_DEREF4 0x06
#define OP_ADD 0x07
#define OP_LO_USER 0x80
#define OP_HI_USER 0xff
/* Fundamental type names and codes: figure 14. */
#define FT_char 0x0001
#define FT_signed_char 0x0002
#define FT_unsigned_char 0x0003
#define FT_short 0x0004
#define FT_signed_short 0x0005
#define FT_unsigned_short 0x0006
#define FT_integer 0x0007
#define FT_signed_integer 0x0008
#define FT_unsigned_integer 0x0009
#define FT_long 0x000a
#define FT_signed_long 0x000b
#define FT_unsigned_long 0x000c
#define FT_pointer 0x000d
#define FT_float 0x000e
#define FT_dbl_prec_float 0x000f
#define FT_ext_prec_float 0x0010 /* not accepted by "classic" svr4 SDB */
#define FT_complex 0x0011 /* not accepted by "classic" svr4 SDB */
#define FT_dbl_prec_complex 0x0012 /* not accepted by "classic" svr4 SDB */
#define FT_void 0x0014
#define FT_boolean 0x0015 /* not accepted by "classic" svr4 SDB */
#define FT_ext_prec_complex 0x0016 /* not accepted by "classic" svr4 SDB */
/* GNU-specific fundamental type codes - not accepted by "classic" svr4 SDB */
Copyright (C) 1992 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* This file is derived from the DWARF specification (a public document)
Revision 1.0.1 (April 8, 1992) developed by the UNIX International
Programming Languages Special Interest Group (UI/PLSIG) and distributed
by UNIX International. Copies of this specification are available from
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
*/
#define FT_long_long 0x8000
#define FT_signed_long_long 0x8001
#define FT_unsigned_long_long 0x8002
/* Tag names and codes. */
enum dwarf_tag {
TAG_padding = 0x0000,
TAG_array_type = 0x0001,
TAG_class_type = 0x0002,
TAG_entry_point = 0x0003,
TAG_enumeration_type = 0x0004,
TAG_formal_parameter = 0x0005,
TAG_global_subroutine = 0x0006,
TAG_global_variable = 0x0007,
/* 0x0008 -- reserved */
/* 0x0009 -- reserved */
TAG_label = 0x000a,
TAG_lexical_block = 0x000b,
TAG_local_variable = 0x000c,
TAG_member = 0x000d,
/* 0x000e -- reserved */
TAG_pointer_type = 0x000f,
TAG_reference_type = 0x0010,
TAG_compile_unit = 0x0011,
TAG_string_type = 0x0012,
TAG_structure_type = 0x0013,
TAG_subroutine = 0x0014,
TAG_subroutine_type = 0x0015,
TAG_typedef = 0x0016,
TAG_union_type = 0x0017,
TAG_unspecified_parameters = 0x0018,
TAG_variant = 0x0019,
TAG_common_block = 0x001a,
TAG_common_inclusion = 0x001b,
TAG_inheritance = 0x001c,
TAG_inlined_subroutine = 0x001d,
TAG_module = 0x001e,
TAG_ptr_to_member_type = 0x001f,
TAG_set_type = 0x0020,
TAG_subrange_type = 0x0021,
TAG_with_stmt = 0x0022,
/* GNU extensions */
TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */
TAG_namelist = 0x8001, /* For Fortran 90 */
TAG_function_template = 0x8002, /* for C++ */
TAG_class_template = 0x8003 /* for C++ */
};
#define TAG_lo_user 0x8000 /* implementation-defined range start */
#define TAG_hi_user 0xffff /* implementation-defined range end */
#define TAG_source_file TAG_compile_unit /* for backward compatability */
/* Form names and codes. */
enum dwarf_form {
FORM_ADDR = 0x1,
FORM_REF = 0x2,
FORM_BLOCK2 = 0x3,
FORM_BLOCK4 = 0x4,
FORM_DATA2 = 0x5,
FORM_DATA4 = 0x6,
FORM_DATA8 = 0x7,
FORM_STRING = 0x8
};
/* Attribute names and codes. */
enum dwarf_attribute {
AT_sibling = (0x0010|FORM_REF),
AT_location = (0x0020|FORM_BLOCK2),
AT_name = (0x0030|FORM_STRING),
AT_fund_type = (0x0050|FORM_DATA2),
AT_mod_fund_type = (0x0060|FORM_BLOCK2),
AT_user_def_type = (0x0070|FORM_REF),
AT_mod_u_d_type = (0x0080|FORM_BLOCK2),
AT_ordering = (0x0090|FORM_DATA2),
AT_subscr_data = (0x00a0|FORM_BLOCK2),
AT_byte_size = (0x00b0|FORM_DATA4),
AT_bit_offset = (0x00c0|FORM_DATA2),
AT_bit_size = (0x00d0|FORM_DATA4),
/* (0x00e0|FORM_xxxx) -- reserved */
AT_element_list = (0x00f0|FORM_BLOCK4),
AT_stmt_list = (0x0100|FORM_DATA4),
AT_low_pc = (0x0110|FORM_ADDR),
AT_high_pc = (0x0120|FORM_ADDR),
AT_language = (0x0130|FORM_DATA4),
AT_member = (0x0140|FORM_REF),
AT_discr = (0x0150|FORM_REF),
AT_discr_value = (0x0160|FORM_BLOCK2),
/* (0x0170|FORM_xxxx) -- reserved */
/* (0x0180|FORM_xxxx) -- reserved */
AT_string_length = (0x0190|FORM_BLOCK2),
AT_common_reference = (0x01a0|FORM_REF),
AT_comp_dir = (0x01b0|FORM_STRING),
AT_const_value_string = (0x01c0|FORM_STRING),
AT_const_value_data2 = (0x01c0|FORM_DATA2),
AT_const_value_data4 = (0x01c0|FORM_DATA4),
AT_const_value_data8 = (0x01c0|FORM_DATA8),
AT_const_value_block2 = (0x01c0|FORM_BLOCK2),
AT_const_value_block4 = (0x01c0|FORM_BLOCK4),
AT_containing_type = (0x01d0|FORM_REF),
AT_default_value_addr = (0x01e0|FORM_ADDR),
AT_default_value_data2 = (0x01e0|FORM_DATA2),
AT_default_value_data4 = (0x01e0|FORM_DATA4),
AT_default_value_data8 = (0x01e0|FORM_DATA8),
AT_default_value_string = (0x01e0|FORM_STRING),
AT_friends = (0x01f0|FORM_BLOCK2),
AT_inline = (0x0200|FORM_STRING),
AT_is_optional = (0x0210|FORM_STRING),
AT_lower_bound_ref = (0x0220|FORM_REF),
AT_lower_bound_data2 = (0x0220|FORM_DATA2),
AT_lower_bound_data4 = (0x0220|FORM_DATA4),
AT_lower_bound_data8 = (0x0220|FORM_DATA8),
AT_private = (0x0230|FORM_STRING),
AT_producer = (0x0240|FORM_STRING),
AT_program = (0x0250|FORM_STRING),
AT_protected = (0x0260|FORM_STRING),
AT_prototyped = (0x0270|FORM_STRING),
AT_public = (0x0280|FORM_STRING),
AT_pure_virtual = (0x0290|FORM_STRING),
AT_return_addr = (0x02a0|FORM_BLOCK2),
AT_specification = (0x02b0|FORM_REF),
AT_start_scope = (0x02c0|FORM_DATA4),
AT_stride_size = (0x02d0|FORM_DATA4),
AT_upper_bound_ref = (0x02e0|FORM_REF),
AT_upper_bound_data2 = (0x02e0|FORM_DATA2),
AT_upper_bound_data4 = (0x02e0|FORM_DATA4),
AT_upper_bound_data8 = (0x02e0|FORM_DATA8),
AT_virtual = (0x02f0|FORM_STRING),
/* GNU extensions. */
AT_sf_names = (0x8000|FORM_DATA4),
AT_src_info = (0x8010|FORM_DATA4),
AT_mac_info = (0x8020|FORM_DATA4),
AT_src_coords = (0x8030|FORM_DATA4)
};
#define AT_lo_user 0x8000 /* implementation-defined range start */
#define AT_hi_user 0xffff /* implementation-defined range end */
/* Location atom names and codes. */
enum dwarf_location_atom {
OP_REG = 0x01,
OP_BASEREG = 0x02,
OP_ADDR = 0x03,
OP_CONST = 0x04,
OP_DEREF2 = 0x05,
OP_DEREF4 = 0x06,
OP_ADD = 0x07
};
#define OP_LO_USER 0x80 /* implementation-defined range start */
#define OP_HI_USER 0xff /* implementation-defined range end */
/* Fundamental type names and codes. */
enum dwarf_fundamental_type {
FT_char = 0x0001,
FT_signed_char = 0x0002,
FT_unsigned_char = 0x0003,
FT_short = 0x0004,
FT_signed_short = 0x0005,
FT_unsigned_short = 0x0006,
FT_integer = 0x0007,
FT_signed_integer = 0x0008,
FT_unsigned_integer = 0x0009,
FT_long = 0x000a,
FT_signed_long = 0x000b,
FT_unsigned_long = 0x000c,
FT_pointer = 0x000d, /* an alias for (void *) */
FT_float = 0x000e,
FT_dbl_prec_float = 0x000f,
FT_ext_prec_float = 0x0010, /* breaks "classic" svr4 SDB */
FT_complex = 0x0011, /* breaks "classic" svr4 SDB */
FT_dbl_prec_complex = 0x0012, /* breaks "classic" svr4 SDB */
/* 0x0013 -- reserved */
FT_void = 0x0014,
FT_boolean = 0x0015, /* breaks "classic" svr4 SDB */
FT_ext_prec_complex = 0x0016, /* breaks "classic" svr4 SDB */
FT_label = 0x0017,
#define FT_lo_user 0x8000
#define FT_hi_user 0xffff
/* Type modifier names and codes: Figure 15. */
#define MOD_pointer_to 0x01
#define MOD_reference_to 0x02
#define MOD_const 0x03
#define MOD_volatile 0x04
#define MOD_lo_user 0x80
#define MOD_hi_user 0xff
/* Visibility names and codes: Figure 16. */
#define VIS_local 0x00
#define VIS_exported 0x01
#define VIS_lo_user 0x80
#define VIS_hi_user 0xff
/* Array ordering names and codes: Figure 18. */
#define ORD_row_major 0
#define ORD_col_major 1
/* Array subscript format names and codes: Figure 19. */
#define FMT_FT_C_C 0x0
#define FMT_FT_C_X 0x1
#define FMT_FT_X_C 0x2
#define FMT_FT_X_X 0x3
#define FMT_UT_C_C 0x4
#define FMT_UT_C_X 0x5
#define FMT_UT_X_C 0x6
#define FMT_UT_X_X 0x7
#define FMT_ET 0x8
/* GNU extensions
The low order byte must indicate the size (in bytes) for the type.
All of these types will probably break "classic" svr4 SDB */
FT_long_long = 0x8008,
FT_signed_long_long = 0x8108,
FT_unsigned_long_long = 0x8208,
FT_int8 = 0x9001,
FT_signed_int8 = 0x9101,
FT_unsigned_int8 = 0x9201,
FT_int16 = 0x9302,
FT_signed_int16 = 0x9402,
FT_unsigned_int16 = 0x9502,
FT_int32 = 0x9604,
FT_signed_int32 = 0x9704,
FT_unsigned_int32 = 0x9804,
FT_int64 = 0x9908,
FT_signed_int64 = 0x9a08,
FT_unsigned_int64 = 0x9b08,
FT_real32 = 0xa004,
FT_real64 = 0xa108,
FT_real96 = 0xa20c,
FT_real128 = 0xa310
};
#define FT_lo_user 0x8000 /* implementation-defined range start */
#define FT_hi_user 0xffff /* implementation defined range end */
/* Type modifier names and codes. */
enum dwarf_type_modifier {
MOD_pointer_to = 0x01,
MOD_reference_to = 0x02,
MOD_const = 0x03,
MOD_volatile = 0x04
};
#define MOD_lo_user 0x80 /* implementation-defined range start */
#define MOD_hi_user 0xff /* implementation-defined range end */
/* Array ordering names and codes. */
enum dwarf_array_dim_ordering {
ORD_row_major = 0,
ORD_col_major = 1
};
/* Array subscript format names and codes. */
enum dwarf_subscr_data_formats {
FMT_FT_C_C = 0x0,
FMT_FT_C_X = 0x1,
FMT_FT_X_C = 0x2,
FMT_FT_X_X = 0x3,
FMT_UT_C_C = 0x4,
FMT_UT_C_X = 0x5,
FMT_UT_X_C = 0x6,
FMT_UT_X_X = 0x7,
FMT_ET = 0x8
};
/* Derived from above for ease of use. */
......@@ -230,25 +280,29 @@
| ((_UB_CONST_P) ? 0 : 2) \
| ((_LB_CONST_P) ? 0 : 1))
/* Source language names and codes: Figure 17. */
/* Source language names and codes. */
#define LANG_C89 0x0001
#define LANG_C 0x0002
#define LANG_ADA83 0x0003
#define LANG_C_PLUS_PLUS 0x0004
#define LANG_COBOL74 0x0005
#define LANG_COBOL85 0x0006
#define LANG_FORTRAN77 0x0007
#define LANG_FORTRAN90 0x0008
#define LANG_PASCAL83 0x0009
#define LANG_MODULA2 0x000a
enum dwarf_source_language {
LANG_C89 = 0x00000001,
LANG_C = 0x00000002,
LANG_ADA83 = 0x00000003,
LANG_C_PLUS_PLUS = 0x00000004,
LANG_COBOL74 = 0x00000005,
LANG_COBOL85 = 0x00000006,
LANG_FORTRAN77 = 0x00000007,
LANG_FORTRAN90 = 0x00000008,
LANG_PASCAL83 = 0x00000009,
LANG_MODULA2 = 0x0000000a
};
#define LANG_LO_USER 0x8000
#define LANG_HI_USER 0xffff
#define LANG_lo_user 0x00008000 /* implementation-defined range start */
#define LANG_hi_user 0x0000ffff /* implementation-defined range end */
/* Names and codes for GNU "macinfo" extension. */
#define MACINFO_start 's'
#define MACINFO_resume 'r'
#define MACINFO_define 'd'
#define MACINFO_undef 'u'
enum dwarf_macinfo_record_type {
MACINFO_start = 's',
MACINFO_resume = 'r',
MACINFO_define = 'd',
MACINFO_undef = 'u'
};
......@@ -31,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "insn-config.h"
#include "reload.h"
#include "output.h"
#include "defaults.h"
/* #define NDEBUG 1 */
#include <assert.h>
......@@ -55,8 +56,7 @@ extern time_t time ();
#define strrchr rindex
#endif
char *getpwd ();
extern char *getpwd ();
/* IMPORTANT NOTE: Please see the file README.DWARF for important details
regarding the GNU implementation of Dwarf. */
......@@ -104,13 +104,6 @@ char *getpwd ();
#define TYPE_USED_FOR_FUNCTION(tagged_type) (TYPE_SIZE (tagged_type) == 0)
#define BITFIELD_OFFSET_BITS(DECL) \
((unsigned) TREE_INT_CST_LOW (DECL_FIELD_BITPOS (DECL)))
#define BITFIELD_OFFSET_UNITS(DECL) \
(BITFIELD_OFFSET_BITS(DECL) / (unsigned) BITS_PER_UNIT)
#define BITFIELD_OFFSET_WORDS_IN_UNITS(DECL) \
((BITFIELD_OFFSET_BITS(DECL) / (unsigned) BITS_PER_WORD) * UNITS_PER_WORD)
extern int flag_traditional;
extern char *version_string;
extern char *language_string;
......@@ -318,12 +311,12 @@ static unsigned lookup_filename ();
#ifndef UNALIGNED_INT_ASM_OP
#define UNALIGNED_INT_ASM_OP ".4byte"
#endif
#ifndef ASM_BYTE_OP
#define ASM_BYTE_OP ".byte"
#endif
#ifndef DEF_ASM_OP
#define DEF_ASM_OP ".set"
#endif
#ifndef ASM_BYTE_OP
#define ASM_BYTE_OP "\t.byte"
#endif
/* Pseudo-ops for pushing the current section onto the section stack (and
simultaneously changing to a new section) and for poping back to the
......@@ -334,10 +327,10 @@ static unsigned lookup_filename ();
OK because we only use at most one level of the section stack herein. */
#ifndef PUSHSECTION_ASM_OP
#define PUSHSECTION_ASM_OP "\t.section"
#define PUSHSECTION_ASM_OP ".section"
#endif
#ifndef POPSECTION_ASM_OP
#define POPSECTION_ASM_OP "\t.previous"
#define POPSECTION_ASM_OP ".previous"
#endif
/* The default format used by the ASM_OUTPUT_PUSH_SECTION macro (see below)
......@@ -394,147 +387,157 @@ static unsigned lookup_filename ();
the -g options is used and DWARF_DEBUGGING_INFO is in effect.
If necessary, these may be overridden from within your tm.h file,
but typically, you should never need to override these. */
but typically, you should never need to override these.
These labels have been hacked (temporarily) so that they all begin with
a `.L' sequence so as to appease the sparc/svr4 assmebler (which needs
to see .L at the start of a label in order to prevent that label from
going into the linker symbol table). When I get time, I'll have to
fix this the right way so that we use ASM_GENERATE_INTERNAL_LABEL and
ASM_OUTPUT_INTERNAL_LABEL throughout dwarfout.c, but that will require
a rather massive set of changes. For the moment, the following definitions
out to produce the right results for all svr4 and svr3 assemblers. -- rfg
*/
#ifndef TEXT_BEGIN_LABEL
#define TEXT_BEGIN_LABEL "._text_b"
#define TEXT_BEGIN_LABEL ".L_text_b"
#endif
#ifndef TEXT_END_LABEL
#define TEXT_END_LABEL "._text_e"
#define TEXT_END_LABEL ".L_text_e"
#endif
#ifndef DATA_BEGIN_LABEL
#define DATA_BEGIN_LABEL "._data_b"
#define DATA_BEGIN_LABEL ".L_data_b"
#endif
#ifndef DATA_END_LABEL
#define DATA_END_LABEL "._data_e"
#define DATA_END_LABEL ".L_data_e"
#endif
#ifndef DATA1_BEGIN_LABEL
#define DATA1_BEGIN_LABEL "._data1_b"
#define DATA1_BEGIN_LABEL ".L_data1_b"
#endif
#ifndef DATA1_END_LABEL
#define DATA1_END_LABEL "._data1_e"
#define DATA1_END_LABEL ".L_data1_e"
#endif
#ifndef RODATA_BEGIN_LABEL
#define RODATA_BEGIN_LABEL "._rodata_b"
#define RODATA_BEGIN_LABEL ".L_rodata_b"
#endif
#ifndef RODATA_END_LABEL
#define RODATA_END_LABEL "._rodata_e"
#define RODATA_END_LABEL ".L_rodata_e"
#endif
#ifndef RODATA1_BEGIN_LABEL
#define RODATA1_BEGIN_LABEL "._rodata1_b"
#define RODATA1_BEGIN_LABEL ".L_rodata1_b"
#endif
#ifndef RODATA1_END_LABEL
#define RODATA1_END_LABEL "._rodata1_e"
#define RODATA1_END_LABEL ".L_rodata1_e"
#endif
#ifndef BSS_BEGIN_LABEL
#define BSS_BEGIN_LABEL "._bss_b"
#define BSS_BEGIN_LABEL ".L_bss_b"
#endif
#ifndef BSS_END_LABEL
#define BSS_END_LABEL "._bss_e"
#define BSS_END_LABEL ".L_bss_e"
#endif
#ifndef LINE_BEGIN_LABEL
#define LINE_BEGIN_LABEL "._line_b"
#define LINE_BEGIN_LABEL ".L_line_b"
#endif
#ifndef LINE_LAST_ENTRY_LABEL
#define LINE_LAST_ENTRY_LABEL "._line_last"
#define LINE_LAST_ENTRY_LABEL ".L_line_last"
#endif
#ifndef LINE_END_LABEL
#define LINE_END_LABEL "._line_e"
#define LINE_END_LABEL ".L_line_e"
#endif
#ifndef DEBUG_BEGIN_LABEL
#define DEBUG_BEGIN_LABEL "._debug_b"
#define DEBUG_BEGIN_LABEL ".L_debug_b"
#endif
#ifndef SFNAMES_BEGIN_LABEL
#define SFNAMES_BEGIN_LABEL "._sfnames_b"
#define SFNAMES_BEGIN_LABEL ".L_sfnames_b"
#endif
#ifndef SRCINFO_BEGIN_LABEL
#define SRCINFO_BEGIN_LABEL "._srcinfo_b"
#define SRCINFO_BEGIN_LABEL ".L_srcinfo_b"
#endif
#ifndef MACINFO_BEGIN_LABEL
#define MACINFO_BEGIN_LABEL "._macinfo_b"
#define MACINFO_BEGIN_LABEL ".L_macinfo_b"
#endif
#ifndef DIE_BEGIN_LABEL_FMT
#define DIE_BEGIN_LABEL_FMT "._D%u"
#define DIE_BEGIN_LABEL_FMT ".L_D%u"
#endif
#ifndef DIE_END_LABEL_FMT
#define DIE_END_LABEL_FMT "._D%u_e"
#define DIE_END_LABEL_FMT ".L_D%u_e"
#endif
#ifndef PUB_DIE_LABEL_FMT
#define PUB_DIE_LABEL_FMT "._P%u"
#define PUB_DIE_LABEL_FMT ".L_P%u"
#endif
#ifndef INSN_LABEL_FMT
#define INSN_LABEL_FMT "._I%u_%u"
#define INSN_LABEL_FMT ".L_I%u_%u"
#endif
#ifndef BLOCK_BEGIN_LABEL_FMT
#define BLOCK_BEGIN_LABEL_FMT "._B%u"
#define BLOCK_BEGIN_LABEL_FMT ".L_B%u"
#endif
#ifndef BLOCK_END_LABEL_FMT
#define BLOCK_END_LABEL_FMT "._B%u_e"
#define BLOCK_END_LABEL_FMT ".L_B%u_e"
#endif
#ifndef SS_BEGIN_LABEL_FMT
#define SS_BEGIN_LABEL_FMT "._s%u"
#define SS_BEGIN_LABEL_FMT ".L_s%u"
#endif
#ifndef SS_END_LABEL_FMT
#define SS_END_LABEL_FMT "._s%u_e"
#define SS_END_LABEL_FMT ".L_s%u_e"
#endif
#ifndef EE_BEGIN_LABEL_FMT
#define EE_BEGIN_LABEL_FMT "._e%u"
#define EE_BEGIN_LABEL_FMT ".L_e%u"
#endif
#ifndef EE_END_LABEL_FMT
#define EE_END_LABEL_FMT "._e%u_e"
#define EE_END_LABEL_FMT ".L_e%u_e"
#endif
#ifndef MT_BEGIN_LABEL_FMT
#define MT_BEGIN_LABEL_FMT "._t%u"
#define MT_BEGIN_LABEL_FMT ".L_t%u"
#endif
#ifndef MT_END_LABEL_FMT
#define MT_END_LABEL_FMT "._t%u_e"
#define MT_END_LABEL_FMT ".L_t%u_e"
#endif
#ifndef LOC_BEGIN_LABEL_FMT
#define LOC_BEGIN_LABEL_FMT "._l%u"
#define LOC_BEGIN_LABEL_FMT ".L_l%u"
#endif
#ifndef LOC_END_LABEL_FMT
#define LOC_END_LABEL_FMT "._l%u_e"
#define LOC_END_LABEL_FMT ".L_l%u_e"
#endif
#ifndef BOUND_BEGIN_LABEL_FMT
#define BOUND_BEGIN_LABEL_FMT "._b%u_%u_%c"
#define BOUND_BEGIN_LABEL_FMT ".L_b%u_%u_%c"
#endif
#ifndef BOUND_END_LABEL_FMT
#define BOUND_END_LABEL_FMT "._b%u_%u_%c_e"
#define BOUND_END_LABEL_FMT ".L_b%u_%u_%c_e"
#endif
#ifndef DERIV_BEGIN_LABEL_FMT
#define DERIV_BEGIN_LABEL_FMT "._d%u"
#define DERIV_BEGIN_LABEL_FMT ".L_d%u"
#endif
#ifndef DERIV_END_LABEL_FMT
#define DERIV_END_LABEL_FMT "._d%u_e"
#define DERIV_END_LABEL_FMT ".L_d%u_e"
#endif
#ifndef SL_BEGIN_LABEL_FMT
#define SL_BEGIN_LABEL_FMT "._sl%u"
#define SL_BEGIN_LABEL_FMT ".L_sl%u"
#endif
#ifndef SL_END_LABEL_FMT
#define SL_END_LABEL_FMT "._sl%u_e"
#define SL_END_LABEL_FMT ".L_sl%u_e"
#endif
#ifndef FUNC_END_LABEL_FMT
#define FUNC_END_LABEL_FMT "._f%u_e"
#define FUNC_END_LABEL_FMT ".L_f%u_e"
#endif
#ifndef TYPE_NAME_FMT
#define TYPE_NAME_FMT "._T%u"
#define TYPE_NAME_FMT ".L_T%u"
#endif
#ifndef LINE_CODE_LABEL_FMT
#define LINE_CODE_LABEL_FMT "._LC%u"
#define LINE_CODE_LABEL_FMT ".L_LC%u"
#endif
#ifndef SFNAMES_ENTRY_LABEL_FMT
#define SFNAMES_ENTRY_LABEL_FMT "._F%u"
#define SFNAMES_ENTRY_LABEL_FMT ".L_F%u"
#endif
#ifndef LINE_ENTRY_LABEL_FMT
#define LINE_ENTRY_LABEL_FMT "._LE%u"
#define LINE_ENTRY_LABEL_FMT ".L_LE%u"
#endif
/* Definitions of defaults for various types of primitive assembly language
......@@ -553,7 +556,7 @@ static unsigned lookup_filename ();
#ifndef ASM_OUTPUT_POP_SECTION
#define ASM_OUTPUT_POP_SECTION(FILE) \
fprintf ((FILE), "%s\n", POPSECTION_ASM_OP)
fprintf ((FILE), "\t%s\n", POPSECTION_ASM_OP)
#endif
#ifndef ASM_OUTPUT_SOURCE_FILENAME
......@@ -593,38 +596,71 @@ static unsigned lookup_filename ();
#ifndef ASM_OUTPUT_DWARF_TAG
#define ASM_OUTPUT_DWARF_TAG(FILE,TAG) \
fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
(unsigned) TAG, ASM_COMMENT_START, tag_name (TAG))
do { \
fprintf ((FILE), "\t%s\t0x%x", \
UNALIGNED_SHORT_ASM_OP, (unsigned) TAG); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_tag_name (TAG)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_ATTRIBUTE
#define ASM_OUTPUT_DWARF_ATTRIBUTE(FILE,ATTRIBUTE) \
fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
(unsigned) ATTRIBUTE, ASM_COMMENT_START, attribute_name (ATTRIBUTE))
#define ASM_OUTPUT_DWARF_ATTRIBUTE(FILE,ATTR) \
do { \
fprintf ((FILE), "\t%s\t0x%x", \
UNALIGNED_SHORT_ASM_OP, (unsigned) ATTR); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_attr_name (ATTR)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_STACK_OP
#define ASM_OUTPUT_DWARF_STACK_OP(FILE,OP) \
fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
(unsigned) OP, ASM_COMMENT_START, stack_op_name (OP))
do { \
fprintf ((FILE), "%s\t0x%x", ASM_BYTE_OP, (unsigned) OP); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_stack_op_name (OP)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_FUND_TYPE
#define ASM_OUTPUT_DWARF_FUND_TYPE(FILE,FT) \
fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
(unsigned) FT, ASM_COMMENT_START, fundamental_type_name (FT))
do { \
fprintf ((FILE), "\t%s\t0x%x", \
UNALIGNED_SHORT_ASM_OP, (unsigned) FT); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_fund_type_name (FT)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_FMT_BYTE
#define ASM_OUTPUT_DWARF_FMT_BYTE(FILE,FMT) \
fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
(unsigned) FMT, ASM_COMMENT_START, format_byte_name (FMT))
do { \
fprintf ((FILE), "%s\t0x%x", ASM_BYTE_OP, (unsigned) FMT); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_fmt_byte_name (FMT)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_TYPE_MODIFIER
#define ASM_OUTPUT_DWARF_TYPE_MODIFIER(FILE,MOD) \
fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
(unsigned) MOD, ASM_COMMENT_START, modifier_name (MOD))
do { \
fprintf ((FILE), "%s\t0x%x", ASM_BYTE_OP, (unsigned) MOD); \
if (flag_verbose_asm) \
fprintf ((FILE), "\t%s %s", \
ASM_COMMENT_START, dwarf_typemod_name (MOD)); \
fputc ('\n', (FILE)); \
} while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_ADDR
......@@ -681,49 +717,6 @@ static unsigned lookup_filename ();
} while (0)
#endif
/* choose a reasonable default for ASM_OUTPUT_ASCII, as that is what
varasm.c does. If the below is changed, please also change
definition in varasm.c Both of these should be factored out, into a
higher layer. */
#ifndef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
do { \
FILE *_hide_asm_out_file = MYFILE; \
char *_hide_p = MYSTRING; \
int _hide_thissize = MYLENGTH; \
{ \
FILE *asm_out_file = _hide_asm_out_file; \
char *p = _hide_p; \
int thissize = _hide_thissize; \
int i; \
fprintf (asm_out_file, "\t.ascii \""); \
\
for (i = 0; i < thissize; i++) \
{ \
register int c = p[i]; \
if (c == '\"' || c == '\\') \
putc ('\\', asm_out_file); \
if (c >= ' ' && c < 0177) \
putc (c, asm_out_file); \
else \
{ \
fprintf (asm_out_file, "\\%o", c); \
/* After an octal-escape, if a digit follows, \
terminate one string constant and start another. \
The Vax assembler fails to stop reading the escape \
after three digits, so this is the only way we \
can get it to parse the data properly. */ \
if (i < thissize - 1 \
&& p[i + 1] >= '0' && p[i + 1] <= '9') \
fprintf (asm_out_file, "\"\n\t.ascii \""); \
} \
} \
fprintf (asm_out_file, "\"\n"); \
} \
} \
while (0)
#endif
#ifndef ASM_OUTPUT_DWARF_STRING
#define ASM_OUTPUT_DWARF_STRING(FILE,P) \
ASM_OUTPUT_ASCII ((FILE), P, strlen (P)+1)
......@@ -742,87 +735,133 @@ xstrdup (s)
}
static char *
tag_name (tag)
dwarf_tag_name (tag)
register unsigned tag;
{
switch (tag)
{
case TAG_padding: return "TAG_padding";
case TAG_array_type: return "TAG_array_type";
case TAG_class_type: return "TAG_class_type";
case TAG_entry_point: return "TAG_entry_point";
case TAG_enumeration_type: return "TAG_enumeration_type";
case TAG_formal_parameter: return "TAG_formal_parameter";
case TAG_global_subroutine: return "TAG_global_subroutine";
case TAG_global_variable: return "TAG_global_variable";
case TAG_imported_declaration: return "TAG_imported_declaration";
case TAG_label: return "TAG_label";
case TAG_lexical_block: return "TAG_lexical_block";
case TAG_local_variable: return "TAG_local_variable";
case TAG_member: return "TAG_member";
case TAG_pointer_type: return "TAG_pointer_type";
case TAG_reference_type: return "TAG_reference_type";
case TAG_compile_unit: return "TAG_compile_unit";
case TAG_string_type: return "TAG_string_type";
case TAG_structure_type: return "TAG_structure_type";
case TAG_subroutine: return "TAG_subroutine";
case TAG_subroutine_type: return "TAG_subroutine_type";
case TAG_typedef: return "TAG_typedef";
case TAG_union_type: return "TAG_union_type";
case TAG_padding: return "TAG_padding";
case TAG_array_type: return "TAG_array_type";
case TAG_class_type: return "TAG_class_type";
case TAG_entry_point: return "TAG_entry_point";
case TAG_enumeration_type: return "TAG_enumeration_type";
case TAG_formal_parameter: return "TAG_formal_parameter";
case TAG_global_subroutine: return "TAG_global_subroutine";
case TAG_global_variable: return "TAG_global_variable";
case TAG_label: return "TAG_label";
case TAG_lexical_block: return "TAG_lexical_block";
case TAG_local_variable: return "TAG_local_variable";
case TAG_member: return "TAG_member";
case TAG_pointer_type: return "TAG_pointer_type";
case TAG_reference_type: return "TAG_reference_type";
case TAG_compile_unit: return "TAG_compile_unit";
case TAG_string_type: return "TAG_string_type";
case TAG_structure_type: return "TAG_structure_type";
case TAG_subroutine: return "TAG_subroutine";
case TAG_subroutine_type: return "TAG_subroutine_type";
case TAG_typedef: return "TAG_typedef";
case TAG_union_type: return "TAG_union_type";
case TAG_unspecified_parameters: return "TAG_unspecified_parameters";
case TAG_variant: return "TAG_variant";
case TAG_format: return "TAG_format";
case TAG_with_stmt: return "TAG_with_stmt";
case TAG_set_type: return "TAG_set_type";
default: return "<unknown tag>";
case TAG_variant: return "TAG_variant";
case TAG_common_block: return "TAG_common_block";
case TAG_common_inclusion: return "TAG_common_inclusion";
case TAG_inheritance: return "TAG_inheritance";
case TAG_inlined_subroutine: return "TAG_inlined_subroutine";
case TAG_module: return "TAG_module";
case TAG_ptr_to_member_type: return "TAG_ptr_to_member_type";
case TAG_set_type: return "TAG_set_type";
case TAG_subrange_type: return "TAG_subrange_type";
case TAG_with_stmt: return "TAG_with_stmt";
/* GNU extensions. */
case TAG_format_label: return "TAG_format_label";
case TAG_namelist: return "TAG_namelist";
case TAG_function_template: return "TAG_function_template";
case TAG_class_template: return "TAG_class_template";
default: return "<unknown tag>";
}
}
static char *
attribute_name (attr)
dwarf_attr_name (attr)
register unsigned attr;
{
switch (attr)
{
case AT_sibling: return "AT_sibling";
case AT_location: return "AT_location";
case AT_name: return "AT_name";
case AT_fund_type: return "AT_fund_type";
case AT_mod_fund_type: return "AT_mod_fund_type";
case AT_user_def_type: return "AT_user_def_type";
case AT_mod_u_d_type: return "AT_mod_u_d_type";
case AT_ordering: return "AT_ordering";
case AT_subscr_data: return "AT_subscr_data";
case AT_byte_size: return "AT_byte_size";
case AT_bit_offset: return "AT_bit_offset";
case AT_bit_size: return "AT_bit_size";
case AT_element_list: return "AT_element_list";
case AT_stmt_list: return "AT_stmt_list";
case AT_low_pc: return "AT_low_pc";
case AT_high_pc: return "AT_high_pc";
case AT_language: return "AT_language";
case AT_member: return "AT_member";
case AT_discr: return "AT_discr";
case AT_discr_value: return "AT_discr_value";
case AT_visibility: return "AT_visibility";
case AT_import: return "AT_import";
case AT_string_length: return "AT_string_length";
case AT_comp_dir: return "AT_comp_dir";
case AT_producer: return "AT_producer";
case AT_frame_base: return "AT_frame_base";
case AT_start_scope: return "AT_start_scope";
case AT_stride_size: return "AT_stride_size";
case AT_src_info: return "AT_src_info";
case AT_prototyped: return "AT_prototyped";
case AT_sibling: return "AT_sibling";
case AT_location: return "AT_location";
case AT_name: return "AT_name";
case AT_fund_type: return "AT_fund_type";
case AT_mod_fund_type: return "AT_mod_fund_type";
case AT_user_def_type: return "AT_user_def_type";
case AT_mod_u_d_type: return "AT_mod_u_d_type";
case AT_ordering: return "AT_ordering";
case AT_subscr_data: return "AT_subscr_data";
case AT_byte_size: return "AT_byte_size";
case AT_bit_offset: return "AT_bit_offset";
case AT_bit_size: return "AT_bit_size";
case AT_element_list: return "AT_element_list";
case AT_stmt_list: return "AT_stmt_list";
case AT_low_pc: return "AT_low_pc";
case AT_high_pc: return "AT_high_pc";
case AT_language: return "AT_language";
case AT_member: return "AT_member";
case AT_discr: return "AT_discr";
case AT_discr_value: return "AT_discr_value";
case AT_string_length: return "AT_string_length";
case AT_common_reference: return "AT_common_reference";
case AT_comp_dir: return "AT_comp_dir";
case AT_const_value_string: return "AT_const_value_string";
case AT_const_value_data2: return "AT_const_value_data2";
case AT_const_value_data4: return "AT_const_value_data4";
case AT_const_value_data8: return "AT_const_value_data8";
case AT_const_value_block2: return "AT_const_value_block2";
case AT_const_value_block4: return "AT_const_value_block4";
case AT_sf_names: return "AT_sf_names";
case AT_mac_info: return "AT_mac_info";
default: return "<unknown attribute>";
case AT_containing_type: return "AT_containing_type";
case AT_default_value_addr: return "AT_default_value_addr";
case AT_default_value_data2: return "AT_default_value_data2";
case AT_default_value_data4: return "AT_default_value_data4";
case AT_default_value_data8: return "AT_default_value_data8";
case AT_default_value_string: return "AT_default_value_string";
case AT_friends: return "AT_friends";
case AT_inline: return "AT_inline";
case AT_is_optional: return "AT_is_optional";
case AT_lower_bound_ref: return "AT_lower_bound_ref";
case AT_lower_bound_data2: return "AT_lower_bound_data2";
case AT_lower_bound_data4: return "AT_lower_bound_data4";
case AT_lower_bound_data8: return "AT_lower_bound_data8";
case AT_private: return "AT_private";
case AT_producer: return "AT_producer";
case AT_program: return "AT_program";
case AT_protected: return "AT_protected";
case AT_prototyped: return "AT_prototyped";
case AT_public: return "AT_public";
case AT_pure_virtual: return "AT_pure_virtual";
case AT_return_addr: return "AT_return_addr";
case AT_specification: return "AT_specification";
case AT_start_scope: return "AT_start_scope";
case AT_stride_size: return "AT_stride_size";
case AT_upper_bound_ref: return "AT_upper_bound_ref";
case AT_upper_bound_data2: return "AT_upper_bound_data2";
case AT_upper_bound_data4: return "AT_upper_bound_data4";
case AT_upper_bound_data8: return "AT_upper_bound_data8";
case AT_virtual: return "AT_virtual";
/* GNU extensions */
case AT_sf_names: return "AT_sf_names";
case AT_src_info: return "AT_src_info";
case AT_mac_info: return "AT_mac_info";
case AT_src_coords: return "AT_src_coords";
default: return "<unknown attribute>";
}
}
static char *
stack_op_name (op)
dwarf_stack_op_name (op)
register unsigned op;
{
switch (op)
......@@ -839,7 +878,7 @@ stack_op_name (op)
}
static char *
modifier_name (mod)
dwarf_typemod_name (mod)
register unsigned mod;
{
switch (mod)
......@@ -853,7 +892,7 @@ modifier_name (mod)
}
static char *
format_byte_name (fmt)
dwarf_fmt_byte_name (fmt)
register unsigned fmt;
{
switch (fmt)
......@@ -871,7 +910,7 @@ format_byte_name (fmt)
}
}
static char *
fundamental_type_name (ft)
dwarf_fund_type_name (ft)
register unsigned ft;
{
switch (ft)
......@@ -896,9 +935,33 @@ fundamental_type_name (ft)
case FT_dbl_prec_complex: return "FT_dbl_prec_complex";
case FT_void: return "FT_void";
case FT_boolean: return "FT_boolean";
case FT_ext_prec_complex: return "FT_ext_prec_complex";
case FT_label: return "FT_label";
/* GNU extensions. */
case FT_long_long: return "FT_long_long";
case FT_signed_long_long: return "FT_signed_long_long";
case FT_unsigned_long_long: return "FT_unsigned_long_long";
case FT_int8: return "FT_int8";
case FT_signed_int8: return "FT_signed_int8";
case FT_unsigned_int8: return "FT_unsigned_int8";
case FT_int16: return "FT_int16";
case FT_signed_int16: return "FT_signed_int16";
case FT_unsigned_int16: return "FT_unsigned_int16";
case FT_int32: return "FT_int32";
case FT_signed_int32: return "FT_signed_int32";
case FT_unsigned_int32: return "FT_unsigned_int32";
case FT_int64: return "FT_int64";
case FT_signed_int64: return "FT_signed_int64";
case FT_unsigned_int64: return "FT_signed_int64";
case FT_real32: return "FT_real32";
case FT_real64: return "FT_real64";
case FT_real96: return "FT_real96";
case FT_real128: return "FT_real128";
default: return "<unknown fundamental type>";
}
}
......@@ -1452,7 +1515,24 @@ location_attribute (rtl)
}
/* Output the specialized form of location attribute used for data members
of struct types. */
of struct types.
In the special case of a FIELD_DECL node which represents a bit-field,
the "offset" part of this special location descriptor must indicate the
distance in bytes from the lowest-addressed byte of the containing
struct or union type to the lowest-addressed byte of the "containing
object" for the bit-field.
For any given bit-field, the "containing object" is a hypothetical
object (of some integral or enum type) within which the given bit-field
lives. The type of this hypothetical "containing object" is always the
same as the declared type of the individual bit-field itself.
Note that it is the size (in bytes) of the hypothetical "containing
object" which will be given in the AT_byte_size attribute for this
bit-field. (See the `byte_size_attribute' function below.)
*/
static void
data_member_location_attribute (decl)
......@@ -1460,6 +1540,12 @@ data_member_location_attribute (decl)
{
char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
register unsigned containing_object_size_in_bytes;
register unsigned containing_object_size_in_bits;
register unsigned member_offset_in_objects;
register unsigned member_offset_in_bytes;
register tree type;
register tree bitpos = DECL_FIELD_BITPOS (decl);
if (TREE_CODE (decl) == ERROR_MARK)
return;
......@@ -1467,6 +1553,19 @@ data_member_location_attribute (decl)
if (TREE_CODE (decl) != FIELD_DECL)
abort ();
/* The bit position given by DECL_FIELD_BITPOS could be non-constant
in the case where one or more variable sized members preceeded this
member in the containing struct type. We could probably correctly
handle this case someday, by it's too complicated to deal with at
the moment (and probably too rare to worry about), so just punt on
the whole AT_location attribute for now. Eventually, we'll have
to analyze the expression given as the DECL_FIELD_BITPOS and turn
it into a member-style AT_location descriptor, but that'll be
tough to do. -- rfg */
if (TREE_CODE (bitpos) != CONST_INT)
return;
ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_location);
sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
......@@ -1474,19 +1573,52 @@ data_member_location_attribute (decl)
ASM_OUTPUT_LABEL (asm_out_file, begin_label);
ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_CONST);
/* This is pretty strange, but existing compilers producing DWARF
apparently calculate the byte offset of a field differently
depending upon whether or not it is a bit-field. If the given
field is *not* a bit-field, then the offset is simply the
the byte offset of the given field from the beginning of the
struct. For bit-fields however, the offset is the offset (in
bytes) of the beginning of the *containing word* from the
beginning of the whole struct. */
type = DECL_BIT_FIELD_TYPE (decl);
if (type == NULL)
type = TREE_TYPE (decl);
ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
(DECL_BIT_FIELD_TYPE (decl))
? BITFIELD_OFFSET_WORDS_IN_UNITS (decl)
: BITFIELD_OFFSET_UNITS (decl));
containing_object_size_in_bytes = int_size_in_bytes (type);
containing_object_size_in_bits
= containing_object_size_in_bytes * BITS_PER_UNIT;
/* WARNING! Note that the GCC front-end doesn't make any attempt to
keep track of the starting bit offset (relative to the start of
the containing structure type) of the hypothetical "containing
object" for a bit-field. (See the comments at the start of this
function.) Thus, when computing the byte offset value for a
bit-field, all we can do is to divide the starting bit offset of
the bit-field by the size of the hypothetical "containing object"
(which we can easily find).
This solution only works right as long as the alignment used by the
compiler for the declared type of the bit-field is the same as the
size of that type.
Since GCC allows type `long long' to be the declared type for a
bit-field, and since some target configurations only align
`long longs' to 4-byte boundaries, we have to check here to see
that the alignment of the containing object is the same as the
size of that object. If it isn't, and if the field in question
is a bit-field, then we may be about to generate bogus Dwarf
output, so we need to warn the user about that.
Of course it would be nice to actually solve this problem, but
that would require a lot of changes elsewhere in the compiler
which could be quite painful, so for now we'll just live with
this minor annoyance.
*/
if ((GET_MODE_ALIGNMENT (mode_for_size (containing_object_size_in_bits))
!= containing_object_size_in_bits)
&& (DECL_BIT_FIELD_TYPE (type) != NULL))
warning_with_decl (decl, "debugging info won't necessarily be reliable");
member_offset_in_objects
= (unsigned) TREE_INT_CST_LOW (bitpos) / containing_object_size_in_bits;
member_offset_in_bytes
= member_offset_in_objects * containing_object_size_in_bytes;
ASM_OUTPUT_DWARF_DATA4 (asm_out_file, member_offset_in_bytes);
ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADD);
ASM_OUTPUT_LABEL (asm_out_file, end_label);
}
......@@ -1591,27 +1723,22 @@ location_or_const_value_attribute (decl)
if ((TREE_CODE (decl) != VAR_DECL) && (TREE_CODE (decl) != PARM_DECL))
abort ();
/* It's not really clear what existing Dwarf debuggers need or expect
as regards to location information for formal parameters. A later
version of the Dwarf specification should resolve such issues, but
for the time being, we assume here that debuggers want information
about the location where the parameter was passed into the function.
That seems to be what USL's CI5 compiler generates. Note that this
will probably be different from the place where the parameter actual
resides during function execution. Dwarf Version 2 will provide us
with a means to describe that location also, but for now we can only
describe the "passing" location. */
#if 1 /* This is probably right, but it leads to a lot of trouble.
Fixing one problem has been exposing another,
all of which seemed to have no ill effects before.
Let's try it again for now. */
/* Existing Dwarf debuggers need and expect the location descriptors for
formal parameters to reflect the place where the parameter are passed,
as opposed to the places where they might reside during the execution
of the function. This isn't clearly spelled out in the current Dwarf
version 1 specification, but it's obvious if you look at the output of
the CI5 compiler, or if you try to use the svr4 SDB debugger. Hopefully,
a later version of the Dwarf specification will clarify this. For now,
we just need to generate the right thing. Note that Dwarf version 2
will provide us with a means to describe *all* of the locations in which
a given variable or parameter resides (and the PC ranges over which it
occupies each one), but for now we can only describe the "passing"
location. */
rtl = (TREE_CODE (decl) == PARM_DECL)
? DECL_INCOMING_RTL (decl)
: DECL_RTL (decl);
#else
rtl = DECL_RTL (decl);
#endif
if (rtl == NULL)
return;
......@@ -1640,17 +1767,14 @@ location_or_const_value_attribute (decl)
}
/* Generate an AT_name attribute given some string value to be included as
the value of the attribute. If the name is null, don't do anything. */
the value of the attribute. */
inline void
name_attribute (name_string)
register char *name_string;
{
if (name_string && *name_string)
{
ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_name);
ASM_OUTPUT_DWARF_STRING (asm_out_file, name_string);
}
ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_name);
ASM_OUTPUT_DWARF_STRING (asm_out_file, name_string);
}
inline void
......@@ -1846,36 +1970,127 @@ byte_size_attribute (tree_node)
break;
case FIELD_DECL:
{
register unsigned words;
register unsigned bits;
bits = TREE_INT_CST_LOW (DECL_SIZE (tree_node));
words = (bits + (BITS_PER_WORD-1)) / BITS_PER_WORD;
size = words * (BITS_PER_WORD / BITS_PER_UNIT);
}
/* For a data member of a struct or union, the AT_byte_size is
always given as the number of bytes normally allocated for
an object of the *declared* type of the member itself. This
is true even for bit-fields. */
size = int_size_in_bytes (DECL_BIT_FIELD_TYPE (tree_node)
? DECL_BIT_FIELD_TYPE (tree_node)
: TREE_TYPE (tree_node));
break;
default:
abort ();
}
/* Note that `size' might be -1 when we get to this point. If it
is, that indicates that the byte size of the entity in question
is variable. We have no good way of expressing this fact in Dwarf
at the present time, so just let the -1 pass on through. */
ASM_OUTPUT_DWARF_DATA4 (asm_out_file, size);
}
/* For a FIELD_DECL node which represents a bit field, output an attribute
which specifies the distance in bits from the start of the *word*
containing the given field to the first bit of the field. */
/* For a FIELD_DECL node which represents a bit-field, output an attribute
which specifies the distance in bits from the highest order bit of the
"containing object" for the bit-field to the highest order bit of the
bit-field itself.
For any given bit-field, the "containing object" is a hypothetical
object (of some integral or enum type) within which the given bit-field
lives. The type of this hypothetical "containing object" is always the
same as the declared type of the individual bit-field itself.
Note that it is the size (in bytes) of the hypothetical "containing
object" which will be given in the AT_byte_size attribute for this
bit-field. (See `byte_size_attribute' above.)
*/
inline void
bit_offset_attribute (decl)
register tree decl;
{
register tree type = DECL_BIT_FIELD_TYPE (decl);
register unsigned containing_object_size_in_bits;
register unsigned dwarf_bit_offset;
register tree bitpos_tree = DECL_FIELD_BITPOS (decl);
register unsigned bitpos;
assert (TREE_CODE (decl) == FIELD_DECL); /* Must be a field. */
assert (DECL_BIT_FIELD_TYPE (decl)); /* Must be a bit field. */
assert (type); /* Must be a bit field. */
/* The bit position given by DECL_FIELD_BITPOS could be non-constant
in the case where one or more variable sized members preceeded this
member in the containing struct type. We could probably correctly
handle this case someday, by it's too complicated to deal with at
the moment, so just punt on the whole AT_bit_offset attribute for
now. Eventually, we'll have to analyze the (variable) expression
given as the DECL_FIELD_BITPOS and see if we can factor out just
the (constant) bit offset part of that expression. -- rfg */
if (TREE_CODE (bitpos_tree) != CONST_INT)
return;
containing_object_size_in_bits = int_size_in_bytes (type) * BITS_PER_UNIT;
/* WARNING! Note that the GCC front-end doesn't make any attempt to
keep track of the starting bit offset (relative to the start of
the containing structure type) of the hypothetical "containing
object" for a bit-field. (See the comments at the start of this
function.) Thus, when computing the AT_bit_offset value for a
bit-field, all we can do is to divide the starting bit offset of
the bit-field by the size of the hypothetical "containing object"
(which we can easily find) and then get the remainder.
This solution only works right as long as the alignment used by the
compiler for the declared type of the bit-field is the same as the
size of that type.
Since GCC allows type `long long' to be the declared type for a
bit-field, and since some target configurations only align
`long longs' to 4-byte boundaries, we really should check here
to see that the alignment of the containing object is the same
as the size of that object and issue a warning if it isn't but
since we will also be generating an AT_location attribute for
the bit-field, and sinec it will generat a warning for this
condition we do not need to do it again here. That would just
cause the user to see two redundant warnings for the same single
bit-field declaration.
Of course it would be nice to actually solve this problem, but
that would require a lot of changes elsewhere in the compiler
which could be quite painful, so for now we'll just live with
this minor annoyance.
*/
#if 0
if (GET_MODE_ALIGNMENT (mode_for_size (containing_object_size_in_bits))
!= containing_object_size_in_bits)
warning_with_decl (decl, "debugging info won't necessarily be reliable");
#endif
bitpos = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
#if (BYTES_BIG_ENDIAN == 1)
{
register unsigned high_order_bitpos = bitpos;
dwarf_bit_offset = high_order_bitpos % containing_object_size_in_bits;
}
#else
{
register unsigned low_order_bitpos = bitpos;
register unsigned field_width
= (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl));
register unsigned high_order_bitpos = low_order_bitpos + field_width;
dwarf_bit_offset = containing_object_size_in_bits
- (high_order_bitpos % containing_object_size_in_bits);
}
#endif
ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_bit_offset);
ASM_OUTPUT_DWARF_DATA2 (asm_out_file,
BITFIELD_OFFSET_BITS (decl) % (unsigned) BITS_PER_WORD);
ASM_OUTPUT_DWARF_DATA2 (asm_out_file, dwarf_bit_offset);
}
/* For a FIELD_DECL node which represents a bit field, output an attribute
......@@ -2077,10 +2292,39 @@ containing_type_attribute (containing_type)
ASM_OUTPUT_DWARF_REF (asm_out_file, label);
}
inline void
src_coords_attribute (src_fileno, src_lineno)
register unsigned src_fileno;
register unsigned src_lineno;
{
#ifdef DWARF_DECL_COORDINATES
ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_src_coords);
ASM_OUTPUT_DWARF_DATA2 (asm_out_file, src_fileno);
ASM_OUTPUT_DWARF_DATA2 (asm_out_file, src_lineno);
#endif
}
/************************* end of attributes *****************************/
/********************* utility routines for DIEs *************************/
/* Output an AT_name attribute and an AT_src_coords attribute for the
given decl, but only if it actually has a name. */
inline void
name_and_src_coords_attributes (decl)
register tree decl;
{
register tree decl_name = DECL_NAME (decl);
if (decl_name && IDENTIFIER_POINTER (decl_name))
{
name_attribute (IDENTIFIER_POINTER (decl_name));
src_coords_attribute (lookup_filename (DECL_SOURCE_FILE (decl)),
DECL_SOURCE_LINE (decl));
}
}
/* Many forms of DIEs contain a "type description" part. The following
routine writes out these "type descriptor" parts. */
......@@ -2219,10 +2463,11 @@ output_array_type_die (arg)
/* I believe that we can default the array ordering. SDB will probably
do the right things even if AT_ordering is not present. It's not
even an issue until we start to get into multidimensional arrays
anyway. If SDB is shown to do the wrong thing in those cases, then
we'll have to put the AT_ordering attribute back in, but only for
multidimensional array. (After all, we don't want to waste space
in the .debug section now do we?) */
anyway. If SDB is ever caught doing the Wrong Thing for multi-
dimensional arrays, then we'll have to put the AT_ordering attribute
back in. (But if and when we find out that we need to put these in,
we will only do so for multidimensional arrays. After all, we don't
want to waste space in the .debug section now do we?) */
#if 0
ordering_attribute (ORD_row_major);
......@@ -2257,8 +2502,7 @@ output_entry_point_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_entry_point);
sibling_attribute ();
dienum_push ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
member_attribute (DECL_CONTEXT (decl));
type_attribute (return_type, 0, 0);
}
......@@ -2321,8 +2565,7 @@ output_formal_parameter_die (arg)
sibling_attribute ();
if (decl)
{
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
location_or_const_value_attribute (decl);
}
......@@ -2344,8 +2587,7 @@ output_global_subroutine_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_subroutine);
sibling_attribute ();
dienum_push ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
inline_attribute (decl);
prototyped_attribute (type);
member_attribute (DECL_CONTEXT (decl));
......@@ -2354,7 +2596,7 @@ output_global_subroutine_die (arg)
{
char func_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
high_pc_attribute (func_end_label);
}
......@@ -2372,8 +2614,7 @@ output_global_variable_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_variable);
sibling_attribute ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
member_attribute (DECL_CONTEXT (decl));
type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
if (!TREE_EXTERNAL (decl))
......@@ -2397,8 +2638,7 @@ output_inline_subroutine_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_inline_subroutine);
sibling_attribute ();
dienum_push ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
prototyped_attribute (type);
member_attribute (DECL_CONTEXT (decl));
type_attribute (return_type, 0, 0);
......@@ -2427,7 +2667,7 @@ output_inline_subroutine_die (arg)
{
char func_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
high_pc_attribute (func_end_label);
}
......@@ -2444,7 +2684,7 @@ output_label_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_label);
sibling_attribute ();
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
/* When optimization is enabled (with -O) the code in jump.c and in flow.c
may cause insns representing one of more of the user's own labels to
......@@ -2516,8 +2756,7 @@ output_local_variable_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_local_variable);
sibling_attribute ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
member_attribute (DECL_CONTEXT (decl));
type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
location_or_const_value_attribute (decl);
......@@ -2531,8 +2770,7 @@ output_member_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_member);
sibling_attribute ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
member_attribute (DECL_CONTEXT (decl));
type_attribute (member_declared_type (decl),
TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
......@@ -2699,8 +2937,7 @@ output_local_subroutine_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_subroutine);
sibling_attribute ();
dienum_push ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
inline_attribute (decl);
prototyped_attribute (type);
member_attribute (DECL_CONTEXT (decl));
......@@ -2711,7 +2948,7 @@ output_local_subroutine_die (arg)
if (TREE_ASM_WRITTEN (decl))
{
low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
high_pc_attribute (func_end_label);
}
......@@ -2742,8 +2979,7 @@ output_typedef_die (arg)
ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_typedef);
sibling_attribute ();
if (DECL_NAME (decl))
name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
name_and_src_coords_attributes (decl);
member_attribute (DECL_CONTEXT (decl));
type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
}
......@@ -3236,22 +3472,43 @@ output_type (type, containing_scope)
if (TYPE_SIZE (type))
{
register tree member;
/* First output info about the data members and type members. */
{
register tree normal_member;
for (member = TYPE_FIELDS (type);
member;
member = TREE_CHAIN (member))
output_decl (member, type);
/* First output info about the data members and type members. */
/* Now output info about the function members (if any). */
for (normal_member = TYPE_FIELDS (type);
normal_member;
normal_member = TREE_CHAIN (normal_member))
output_decl (normal_member, type);
}
if (TYPE_METHODS (type))
for (member = TREE_VEC_ELT (TYPE_METHODS (type), 0);
member;
member = TREE_CHAIN (member))
output_decl (member, type);
{
register tree vec_base;
/* Now output info about the function members (if any). */
vec_base = TYPE_METHODS (type);
if (vec_base)
{
register tree first_func_member = TREE_VEC_ELT (vec_base, 0);
register tree func_member;
/* This isn't documented, but the first element of the
vector of member functions can be NULL in cases where
the class type in question didn't have either a
constructor or a destructor declared for it. We have
to make allowances for that here. */
if (first_func_member == NULL)
first_func_member = TREE_VEC_ELT (vec_base, 1);
for (func_member = first_func_member;
func_member;
func_member = TREE_CHAIN (func_member))
output_decl (func_member, type);
}
}
end_sibling_chain (); /* Terminate member chain. */
}
......@@ -3794,7 +4051,7 @@ dwarfout_file_scope_decl (decl, set_finalizing)
fputc ('\n', asm_out_file);
ASM_OUTPUT_PUSH_SECTION (asm_out_file, ARANGES_SECTION);
ASM_OUTPUT_DWARF_ADDR (asm_out_file,
IDENTIFIER_POINTER (DECL_NAME (decl)));
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
(unsigned) int_size_in_bytes (TREE_TYPE (decl)));
ASM_OUTPUT_POP_SECTION (asm_out_file);
......
......@@ -301,6 +301,13 @@ extern int flag_no_common;
needed for crtstuff.c on other systems. */
extern int flag_inhibit_size_directive;
/* -fverbose-asm causes extra commentary information to be produced in
the generated assembly code (to make it more readable). This option
is generally only of use to those who actually need to read the
generated assembly code (perhaps while debugging the compiler itself). */
extern int flag_verbose_asm;
/* -fgnu-linker specifies use of the GNU linker for initializations.
-fno-gnu-linker says that collect will be used. */
extern int flag_gnu_linker;
......
......@@ -433,6 +433,13 @@ int flag_schedule_insns_after_reload = 0;
needed for crtstuff.c on other systems. */
int flag_inhibit_size_directive = 0;
/* -fverbose-asm causes extra commentary information to be produced in
the generated assembly code (to make it more readable). This option
is generally only of use to those who actually need to read the
generated assembly code (perhaps while debugging the compiler itself). */
int flag_verbose_asm = 0;
/* -fgnu-linker specifies use of the GNU linker for initializations.
(Or, more generally, a linker that handles initializations.)
-fno-gnu-linker says that collect2 will be used. */
......@@ -483,6 +490,7 @@ struct { char *string; int *variable; int on_value;} f_options[] =
{"fast-math", &flag_fast_math, 1},
{"common", &flag_no_common, 0},
{"inhibit-size-directive", &flag_inhibit_size_directive, 1},
{"verbose-asm", &flag_verbose_asm, 1},
{"gnu-linker", &flag_gnu_linker, 1}
};
......
......@@ -35,6 +35,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "expr.h"
#include "hard-reg-set.h"
#include "regs.h"
#include "defaults.h"
#include "obstack.h"
......@@ -615,33 +616,7 @@ assemble_string (p, size)
if (thissize > maximum)
thissize = maximum;
#ifdef ASM_OUTPUT_ASCII
ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
#else
fprintf (asm_out_file, "\t.ascii \"");
for (i = 0; i < thissize; i++)
{
register int c = p[i];
if (c == '\"' || c == '\\')
putc ('\\', asm_out_file);
if (c >= ' ' && c < 0177)
putc (c, asm_out_file);
else
{
fprintf (asm_out_file, "\\%o", c);
/* After an octal-escape, if a digit follows,
terminate one string constant and start another.
The Vax assembler fails to stop reading the escape
after three digits, so this is the only way we
can get it to parse the data properly. */
if (i < thissize - 1
&& p[i + 1] >= '0' && p[i + 1] <= '9')
fprintf (asm_out_file, "\"\n\t.ascii \"");
}
}
fprintf (asm_out_file, "\"\n");
#endif /* no ASM_OUTPUT_ASCII */
pos += thissize;
p += thissize;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment