Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
a9d38797
Commit
a9d38797
authored
Nov 18, 1996
by
Jason Merrill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
x
From-SVN: r13201
parent
9293498f
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
105 additions
and
297 deletions
+105
-297
gcc/dwarf2out.c
+105
-297
No files found.
gcc/dwarf2out.c
View file @
a9d38797
...
@@ -280,35 +280,8 @@ extern char *language_string;
...
@@ -280,35 +280,8 @@ extern char *language_string;
#ifndef CHAR_TYPE_SIZE
#ifndef CHAR_TYPE_SIZE
#define CHAR_TYPE_SIZE BITS_PER_UNIT
#define CHAR_TYPE_SIZE BITS_PER_UNIT
#endif
#endif
#ifndef SHORT_TYPE_SIZE
#define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
#endif
#ifndef INT_TYPE_SIZE
#define INT_TYPE_SIZE BITS_PER_WORD
#endif
#ifndef LONG_TYPE_SIZE
#define LONG_TYPE_SIZE BITS_PER_WORD
#endif
#ifndef LONG_LONG_TYPE_SIZE
#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
#endif
#ifndef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
#endif
#ifndef WCHAR_UNSIGNED
#define WCHAR_UNSIGNED 0
#endif
#ifndef FLOAT_TYPE_SIZE
#define FLOAT_TYPE_SIZE BITS_PER_WORD
#endif
#ifndef DOUBLE_TYPE_SIZE
#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
#endif
#ifndef LONG_DOUBLE_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
#endif
#ifndef PTR_SIZE
#ifndef PTR_SIZE
#define PTR_SIZE (POINTER_SIZE /
8
)
#define PTR_SIZE (POINTER_SIZE /
BITS_PER_UNIT
)
#endif
#endif
/* The size in bytes of a DWARF field indicating an offset or length
/* The size in bytes of a DWARF field indicating an offset or length
...
@@ -563,58 +536,6 @@ static long int current_funcdef_frame_size = 0;
...
@@ -563,58 +536,6 @@ static long int current_funcdef_frame_size = 0;
static
int
current_function_has_inlines
;
static
int
current_function_has_inlines
;
static
int
comp_unit_has_inlines
;
static
int
comp_unit_has_inlines
;
/* DWARF requires that the compiler's primary datatypes
are mapped into a reference to a DIE that defines that
primary (base) type. The base_type_info structure is used
to track the correspondence between the name of a
base type used by GCC, and its corresponding type
characteristics. Note, that the bt_size field below
is the size in bits. */
typedef
struct
base_type_struct
*
base_type_ref
;
typedef
struct
base_type_struct
{
char
*
bt_name
;
enum
dwarf_type
bt_type
;
int
bt_is_signed
;
int
bt_size
;
}
base_type_info
;
/* Characteristics of base types used by the compiler. */
static
base_type_info
base_type_table
[]
=
{
{
"void"
,
DW_ATE_unsigned
,
0
,
0
},
/* TODO: on some architectures, "char" may be signed. */
{
"char"
,
DW_ATE_unsigned_char
,
0
,
CHAR_TYPE_SIZE
},
{
"unsigned char"
,
DW_ATE_unsigned_char
,
0
,
CHAR_TYPE_SIZE
},
{
"signed char"
,
DW_ATE_signed_char
,
1
,
CHAR_TYPE_SIZE
},
{
"int"
,
DW_ATE_signed
,
1
,
/* INT_TYPE_SIZE */
4
*
8
},
{
"unsigned int"
,
DW_ATE_unsigned
,
0
,
/* INT_TYPE_SIZE */
4
*
8
},
{
"short"
,
DW_ATE_signed
,
1
,
SHORT_TYPE_SIZE
},
{
"short int"
,
DW_ATE_signed
,
1
,
SHORT_TYPE_SIZE
},
{
"short unsigned int"
,
DW_ATE_unsigned
,
0
,
SHORT_TYPE_SIZE
},
{
"long"
,
DW_ATE_signed
,
1
,
/* LONG_TYPE_SIZE */
4
*
8
},
{
"long int"
,
DW_ATE_signed
,
1
,
/* LONG_TYPE_SIZE */
4
*
8
},
{
"long unsigned int"
,
DW_ATE_unsigned
,
0
,
/* LONG_TYPE_SIZE */
4
*
8
},
{
"long long int"
,
DW_ATE_signed
,
1
,
LONG_LONG_TYPE_SIZE
},
{
"long long unsigned int"
,
DW_ATE_unsigned
,
0
,
LONG_LONG_TYPE_SIZE
},
{
"float"
,
DW_ATE_float
,
1
,
/* FLOAT_TYPE_SIZE */
4
*
8
},
{
"double"
,
DW_ATE_float
,
1
,
DOUBLE_TYPE_SIZE
},
{
"long double"
,
DW_ATE_float
,
1
,
LONG_DOUBLE_TYPE_SIZE
},
{
"complex"
,
DW_ATE_complex_float
,
1
,
2
*
/* FLOAT_TYPE_SIZE */
4
*
8
},
{
"double complex"
,
DW_ATE_complex_float
,
1
,
2
*
DOUBLE_TYPE_SIZE
},
{
"long double complex"
,
DW_ATE_complex_float
,
1
,
2
*
LONG_DOUBLE_TYPE_SIZE
}
};
#define NUM_BASE_TYPES (sizeof(base_type_table)/sizeof(base_type_info))
/* Record the DIE associated with a given base type This table is
parallel to the base_type_table, and records the DIE genereated
to describe base type that has been previously referenced. */
static
dw_die_ref
base_type_die_table
[
NUM_BASE_TYPES
];
/* This predefined base type is used to create certain anonymous types */
static
dw_die_ref
int_base_type_die
;
/* A pointer to the ..._DECL node which we have most recently been working
/* A pointer to the ..._DECL node which we have most recently been working
on. We keep this around just in case something about it looks screwy and
on. We keep this around just in case something about it looks screwy and
we want to tell the user what the source coordinates for the actual
we want to tell the user what the source coordinates for the actual
...
@@ -2285,6 +2206,21 @@ get_AT_unsigned (die, attr_kind)
...
@@ -2285,6 +2206,21 @@ get_AT_unsigned (die, attr_kind)
return
0
;
return
0
;
}
}
inline
int
is_c_family
()
{
register
unsigned
lang
=
get_AT_unsigned
(
comp_unit_die
,
DW_AT_language
);
return
(
lang
==
DW_LANG_C
||
lang
==
DW_LANG_C89
||
lang
==
DW_LANG_C_plus_plus
);
}
inline
int
is_fortran
()
{
register
unsigned
lang
=
get_AT_unsigned
(
comp_unit_die
,
DW_AT_language
);
return
(
lang
==
DW_LANG_Fortran77
||
lang
==
DW_LANG_Fortran90
);
}
/* Remove the specified attribute if present. */
/* Remove the specified attribute if present. */
inline
void
inline
void
remove_AT
(
die
,
attr_kind
)
remove_AT
(
die
,
attr_kind
)
...
@@ -4660,37 +4596,6 @@ is_body_block (stmt)
...
@@ -4660,37 +4596,6 @@ is_body_block (stmt)
return
0
;
return
0
;
}
}
/* Reset the base type to DIE table, and build a special predefined
base type entry for the "int" signed integer base type. The
"int" base type is used to construct subscript index range
definitions, in situations where an anonymous integer type
is required. */
inline
void
init_base_type_table
()
{
register
int
i
;
register
base_type_ref
bt
;
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
{
base_type_die_table
[
i
]
=
NULL
;
}
assert
(
comp_unit_die
!=
0
);
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
{
bt
=
&
base_type_table
[
i
];
if
(
strcmp
(
bt
->
bt_name
,
"int"
)
==
0
)
{
int_base_type_die
=
new_die
(
DW_TAG_base_type
,
comp_unit_die
);
base_type_die_table
[
i
]
=
int_base_type_die
;
add_AT_string
(
int_base_type_die
,
DW_AT_name
,
bt
->
bt_name
);
add_AT_unsigned
(
int_base_type_die
,
DW_AT_byte_size
,
bt
->
bt_size
/
8
);
add_AT_unsigned
(
int_base_type_die
,
DW_AT_encoding
,
bt
->
bt_type
);
break
;
}
}
}
/* Given a pointer to a tree node for some base type, return a pointer to
/* Given a pointer to a tree node for some base type, return a pointer to
a DIE that describes the given type.
a DIE that describes the given type.
...
@@ -4700,144 +4605,71 @@ static dw_die_ref
...
@@ -4700,144 +4605,71 @@ static dw_die_ref
base_type_die
(
type
)
base_type_die
(
type
)
register
tree
type
;
register
tree
type
;
{
{
register
dw_die_ref
base_type_result
=
NULL
;
register
dw_die_ref
base_type_result
;
register
char
*
type_name
=
NULL
;
register
char
*
type_name
;
register
int
type_index
=
0
;
register
enum
dwarf_type
encoding
;
register
base_type_ref
bt
;
register
int
i
;
if
(
TREE_CODE
(
type
)
==
ERROR_MARK
)
if
(
TREE_CODE
(
type
)
==
ERROR_MARK
||
TREE_CODE
(
type
)
==
VOID_TYPE
)
return
0
;
return
0
;
{
register
tree
name
=
TYPE_NAME
(
type
);
if
(
TREE_CODE
(
name
)
==
TYPE_DECL
)
name
=
DECL_NAME
(
name
);
type_name
=
IDENTIFIER_POINTER
(
name
);
}
switch
(
TREE_CODE
(
type
))
switch
(
TREE_CODE
(
type
))
{
{
case
VOID_TYPE
:
case
ERROR_MARK
:
break
;
case
INTEGER_TYPE
:
case
INTEGER_TYPE
:
/* Carefully distinguish
all the standard types of C
, without messing
/* Carefully distinguish
the C character types
, without messing
up if the language is not C. Note that we check only for the names
up if the language is not C. Note that we check only for the names
that contain spaces; other names might occur by coincidence in other
that contain spaces; other names might occur by coincidence in other
languages. */
languages. */
if
(
TYPE_NAME
(
type
)
!=
0
if
(
!
(
TYPE_PRECISION
(
type
)
==
CHAR_TYPE_SIZE
&&
TREE_CODE
(
TYPE_NAME
(
type
))
==
TYPE_DECL
&&
(
type
==
char_type_node
&&
DECL_NAME
(
TYPE_NAME
(
type
))
!=
0
||
!
strcmp
(
type_name
,
"signed char"
)
&&
TREE_CODE
(
DECL_NAME
(
TYPE_NAME
(
type
)))
==
IDENTIFIER_NODE
)
||
!
strcmp
(
type_name
,
"unsigned char"
)))
)
{
{
type_name
=
IDENTIFIER_POINTER
(
DECL_NAME
(
TYPE_NAME
(
type
)));
if
(
TREE_UNSIGNED
(
type
))
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
encoding
=
DW_ATE_unsigned
;
{
else
bt
=
&
base_type_table
[
i
];
encoding
=
DW_ATE_signed
;
if
(
strcmp
(
type_name
,
bt
->
bt_name
)
==
0
)
break
;
{
type_index
=
i
;
break
;
}
}
}
}
/* else fall through */
/* Most integer types will be sorted out above, however, for the sake
case
CHAR_TYPE
:
of special `array index' integer types, the following code is also
/* GNU Pascal/Ada CHAR type. Not used in C. */
provided. */
if
(
TREE_UNSIGNED
(
type
))
if
(
type_index
==
0
)
encoding
=
DW_ATE_unsigned_char
;
{
else
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
encoding
=
DW_ATE_signed_char
;
{
bt
=
&
base_type_table
[
i
];
if
(
bt
->
bt_size
==
TYPE_PRECISION
(
type
)
&&
(
TREE_UNSIGNED
(
type
)
==
0
)
==
bt
->
bt_is_signed
)
{
type_index
=
i
;
break
;
}
}
}
break
;
break
;
case
REAL_TYPE
:
case
REAL_TYPE
:
/* Carefully distinguish all the standard types of C, without messing
encoding
=
DW_ATE_float
;
up if the language is not C. */
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
{
bt
=
&
base_type_table
[
i
];
if
((
bt
->
bt_type
==
DW_ATE_float
)
&&
(
bt
->
bt_size
==
TYPE_PRECISION
(
type
)))
{
type_index
=
i
;
break
;
}
}
break
;
break
;
case
COMPLEX_TYPE
:
case
COMPLEX_TYPE
:
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
encoding
=
DW_ATE_complex_float
;
{
bt
=
&
base_type_table
[
i
];
if
((
bt
->
bt_type
==
DW_ATE_complex_float
)
&&
(
bt
->
bt_size
==
TYPE_PRECISION
(
type
)))
{
type_index
=
i
;
break
;
}
}
break
;
case
CHAR_TYPE
:
/* GNU Pascal/Ada CHAR type. Not used in C. */
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
{
bt
=
&
base_type_table
[
i
];
if
(
bt
->
bt_type
==
DW_ATE_signed_char
||
bt
->
bt_type
==
DW_ATE_unsigned_char
)
{
if
(
bt
->
bt_size
==
TYPE_PRECISION
(
type
)
&&
((
TREE_UNSIGNED
(
type
)
==
0
)
==
bt
->
bt_is_signed
))
{
type_index
=
i
;
break
;
}
}
}
break
;
break
;
case
BOOLEAN_TYPE
:
case
BOOLEAN_TYPE
:
/* GNU FORTRAN/Ada BOOLEAN type. */
/* GNU FORTRAN/Ada/C++ BOOLEAN type. */
for
(
i
=
0
;
i
<
NUM_BASE_TYPES
;
++
i
)
encoding
=
DW_ATE_boolean
;
{
bt
=
&
base_type_table
[
i
];
if
(
bt
->
bt_type
==
DW_ATE_boolean
&&
bt
->
bt_size
==
TYPE_PRECISION
(
type
))
{
type_index
=
i
;
break
;
}
}
break
;
break
;
default
:
default
:
abort
();
/* No other TREE_CODEs are Dwarf fundamental
abort
();
/* No other TREE_CODEs are Dwarf fundamental types. */
types. */
}
}
if
(
type_index
==
0
)
base_type_result
=
new_die
(
DW_TAG_base_type
,
comp_unit_die
);
{
add_AT_string
(
base_type_result
,
DW_AT_name
,
type_name
);
base_type_result
=
NULL
;
add_AT_unsigned
(
base_type_result
,
DW_AT_byte_size
,
}
TYPE_PRECISION
(
type
)
/
BITS_PER_UNIT
);
else
add_AT_unsigned
(
base_type_result
,
DW_AT_encoding
,
encoding
);
{
base_type_result
=
base_type_die_table
[
type_index
];
if
(
base_type_result
==
NULL
)
{
bt
=
&
base_type_table
[
type_index
];
base_type_result
=
new_die
(
DW_TAG_base_type
,
comp_unit_die
);
base_type_die_table
[
type_index
]
=
base_type_result
;
add_AT_string
(
base_type_result
,
DW_AT_name
,
bt
->
bt_name
);
add_AT_unsigned
(
base_type_result
,
DW_AT_byte_size
,
bt
->
bt_size
/
8
);
add_AT_unsigned
(
base_type_result
,
DW_AT_encoding
,
bt
->
bt_type
);
}
}
return
base_type_result
;
return
base_type_result
;
}
}
...
@@ -4925,7 +4757,9 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
...
@@ -4925,7 +4757,9 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
if
(
code
!=
ERROR_MARK
)
if
(
code
!=
ERROR_MARK
)
{
{
type
=
build_type_variant
(
type
,
is_const_type
,
is_volatile_type
);
/* Take the MAIN_VARIANT here to avoid C typedef types. */
type
=
build_type_variant
(
TYPE_MAIN_VARIANT
(
type
),
is_const_type
,
is_volatile_type
);
mod_type_die
=
lookup_type_die
(
type
);
mod_type_die
=
lookup_type_die
(
type
);
if
(
mod_type_die
)
if
(
mod_type_die
)
...
@@ -4934,15 +4768,12 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
...
@@ -4934,15 +4768,12 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
if
(
is_const_type
)
if
(
is_const_type
)
{
{
mod_type_die
=
new_die
(
DW_TAG_const_type
,
comp_unit_die
);
mod_type_die
=
new_die
(
DW_TAG_const_type
,
comp_unit_die
);
sub_die
=
modified_type_die
sub_die
=
modified_type_die
(
type
,
0
,
is_volatile_type
,
context_die
);
(
build_type_variant
(
type
,
0
,
is_volatile_type
),
0
,
is_volatile_type
,
context_die
);
}
}
else
if
(
is_volatile_type
)
else
if
(
is_volatile_type
)
{
{
mod_type_die
=
new_die
(
DW_TAG_volatile_type
,
comp_unit_die
);
mod_type_die
=
new_die
(
DW_TAG_volatile_type
,
comp_unit_die
);
sub_die
=
modified_type_die
sub_die
=
modified_type_die
(
type
,
0
,
0
,
context_die
);
(
TYPE_MAIN_VARIANT
(
type
),
0
,
0
,
context_die
);
}
}
else
if
(
code
==
POINTER_TYPE
)
else
if
(
code
==
POINTER_TYPE
)
{
{
...
@@ -5703,7 +5534,10 @@ add_name_attribute (die, name_string)
...
@@ -5703,7 +5534,10 @@ add_name_attribute (die, name_string)
}
}
/* Given a tree node describing an array bound (either lower or upper) output
/* Given a tree node describing an array bound (either lower or upper) output
a representation for that bound. */
a representation for that bound.
FIXME: This uses location descriptions for variable bounds, whereas the
DWARF-2 spec only allowes for constants or DIE references. */
static
void
static
void
add_bound_info
(
subrange_die
,
bound_attr
,
bound
)
add_bound_info
(
subrange_die
,
bound_attr
,
bound
)
register
dw_die_ref
subrange_die
;
register
dw_die_ref
subrange_die
;
...
@@ -5811,27 +5645,20 @@ add_subscript_info (type_die, type)
...
@@ -5811,27 +5645,20 @@ add_subscript_info (type_die, type)
lower
=
TYPE_MIN_VALUE
(
domain
);
lower
=
TYPE_MIN_VALUE
(
domain
);
upper
=
TYPE_MAX_VALUE
(
domain
);
upper
=
TYPE_MAX_VALUE
(
domain
);
/* TODO: establish DW_AT_type for the basis type a byte_size
/* define the index type. */
attribute if the byte size is non-standard */
if
(
TREE_TYPE
(
domain
))
add_bound_info
(
subrange_die
,
DW_AT_lower_bound
,
lower
);
add_type_attribute
(
subrange_die
,
TREE_TYPE
(
domain
),
0
,
0
,
type_die
);
if
(
!
is_c_family
()
&&
!
is_fortran
())
add_bound_info
(
subrange_die
,
DW_AT_lower_bound
,
lower
);
add_bound_info
(
subrange_die
,
DW_AT_upper_bound
,
upper
);
add_bound_info
(
subrange_die
,
DW_AT_upper_bound
,
upper
);
}
}
else
else
{
{
/* We have an array type with an unspecified length. For C and C++
/* We have an array type with an unspecified length. The DWARF-2
we can assume that this really means that (a) the index type is
spec does not say how to handle this; let's just leave out the
an integral type, and (b) the lower bound is zero. Note that
bounds. */
Dwarf defines the representation of an unspecified (upper) bound
as being a zero-length location description. */
/* define the (assumed) index type. */
add_AT_die_ref
(
subrange_die
,
DW_AT_type
,
int_base_type_die
);
/* Add the (assumed) lower bound (constant) value. */
add_AT_unsigned
(
subrange_die
,
DW_AT_lower_bound
,
0
);
/* Add the (empty) location description for the upper bound. */
add_AT_loc
(
subrange_die
,
DW_AT_upper_bound
,
NULL
);
}
}
#ifndef MIPS_DEBUGGING_INFO
#ifndef MIPS_DEBUGGING_INFO
}
}
...
@@ -6204,9 +6031,18 @@ gen_array_type_die (type, context_die)
...
@@ -6204,9 +6031,18 @@ gen_array_type_die (type, context_die)
register
dw_die_ref
context_die
;
register
dw_die_ref
context_die
;
{
{
register
dw_die_ref
scope_die
=
scope_die_for
(
type
,
context_die
);
register
dw_die_ref
scope_die
=
scope_die_for
(
type
,
context_die
);
register
dw_die_ref
array_die
=
new_die
(
DW_TAG_array_type
,
scope_die
)
;
register
dw_die_ref
array_die
;
register
tree
element_type
;
register
tree
element_type
;
/* ??? The SGI dwarf reader fails for array of array of enum types unless
the inner array type comes before the outer array type. Thus we must
call gen_type_die before we call new_die. See below also. */
#ifdef MIPS_DEBUGGING_INFO
gen_type_die
(
TREE_TYPE
(
type
),
context_die
);
#endif
array_die
=
new_die
(
DW_TAG_array_type
,
scope_die
);
#if 0
#if 0
/* We default the array ordering. SDB will probably do
/* We default the array ordering. SDB will probably do
the right things even if DW_AT_ordering is not present. It's not even
the right things even if DW_AT_ordering is not present. It's not even
...
@@ -6218,7 +6054,12 @@ gen_array_type_die (type, context_die)
...
@@ -6218,7 +6054,12 @@ gen_array_type_die (type, context_die)
add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
#endif
#endif
add_subscript_info
(
array_die
,
type
);
#ifdef MIPS_DEBUGGING_INFO
if
(
!
TYPE_DOMAIN
(
type
))
add_AT_unsigned
(
array_die
,
DW_AT_declaration
,
1
);
else
#endif
add_subscript_info
(
array_die
,
type
);
equate_type_number_to_die
(
type
,
array_die
);
equate_type_number_to_die
(
type
,
array_die
);
...
@@ -6233,8 +6074,8 @@ gen_array_type_die (type, context_die)
...
@@ -6233,8 +6074,8 @@ gen_array_type_die (type, context_die)
{
{
element_type
=
TREE_TYPE
(
element_type
);
element_type
=
TREE_TYPE
(
element_type
);
}
}
#endif
gen_type_die
(
element_type
,
context_die
);
gen_type_die
(
element_type
,
context_die
);
#endif
add_type_attribute
(
array_die
,
element_type
,
0
,
0
,
context_die
);
add_type_attribute
(
array_die
,
element_type
,
0
,
0
,
context_die
);
}
}
...
@@ -6430,21 +6271,6 @@ gen_unspecified_parameters_die (decl_or_type, context_die)
...
@@ -6430,21 +6271,6 @@ gen_unspecified_parameters_die (decl_or_type, context_die)
{
{
register
dw_die_ref
parm_die
=
new_die
(
DW_TAG_unspecified_parameters
,
register
dw_die_ref
parm_die
=
new_die
(
DW_TAG_unspecified_parameters
,
context_die
);
context_die
);
/* This kludge is here only for the sake of being compatible with what the
USL CI5 C compiler does. The specification of Dwarf Version 1 doesn't
say that DW_TAG_unspecified_parameters DIEs should contain any
attributes other than the DW_AT_sibling attribute, but they are
certainly allowed to contain additional attributes, and the CI5 compiler
generates DW_AT_name, DW_AT_base_type, and DW_AT_location attributes
within DW_TAG_unspecified_parameters DIEs which appear in the child
lists for DIEs representing function definitions, so we do likewise
here. */
if
(
TREE_CODE
(
decl_or_type
)
==
FUNCTION_DECL
&&
DECL_INITIAL
(
decl_or_type
))
{
add_name_attribute
(
parm_die
,
"..."
);
add_AT_die_ref
(
parm_die
,
DW_AT_type
,
int_base_type_die
);
}
}
}
/* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
/* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
...
@@ -7005,26 +6831,22 @@ gen_compile_unit_die (main_input_filename)
...
@@ -7005,26 +6831,22 @@ gen_compile_unit_die (main_input_filename)
#endif
#endif
add_AT_string
(
comp_unit_die
,
DW_AT_producer
,
producer
);
add_AT_string
(
comp_unit_die
,
DW_AT_producer
,
producer
);
if
(
strcmp
(
language_string
,
"GNU C++"
)
==
0
)
if
(
strcmp
(
language_string
,
"GNU C++"
)
==
0
)
{
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C_plus_plus
);
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C_plus_plus
);
}
else
if
(
strcmp
(
language_string
,
"GNU Ada"
)
==
0
)
else
if
(
strcmp
(
language_string
,
"GNU Ada"
)
==
0
)
{
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_Ada83
);
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_Ada83
);
else
if
(
strcmp
(
language_string
,
"GNU F77"
)
==
0
)
}
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_Fortran77
);
else
if
(
flag_traditional
)
else
if
(
flag_traditional
)
{
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C
);
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C
);
}
else
else
{
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C89
);
add_AT_unsigned
(
comp_unit_die
,
DW_AT_language
,
DW_LANG_C89
);
}
#if 0 /* unimplemented */
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
{
add_AT_unsigned (comp_unit_die, DW_AT_macro_info, 0);
add_AT_unsigned
(
comp_unit_die
,
DW_AT_macro_info
,
0
);
#endif
}
}
}
/* Generate a DIE for a string type. */
/* Generate a DIE for a string type. */
...
@@ -7717,19 +7539,9 @@ dwarf2out_file_scope_decl (decl, set_finalizing)
...
@@ -7717,19 +7539,9 @@ dwarf2out_file_scope_decl (decl, set_finalizing)
case
TYPE_DECL
:
case
TYPE_DECL
:
/* Don't bother trying to generate any DIEs to represent any of the
/* Don't bother trying to generate any DIEs to represent any of the
normal built-in types for the language we are compiling, except in
normal built-in types for the language we are compiling. */
cases where the types in question are *not* DWARF fundamental types.
if
(
DECL_SOURCE_LINE
(
decl
)
==
0
)
We make an exception in the case of non-fundamental types for the
return
;
sake of objective C (and perhaps C++) because the GNU front-ends for
these languages may in fact create certain "built-in" types which
are (for example) RECORD_TYPEs. In such cases, we really need to
output these (non-fundamental) types because other DIEs may contain
references to them. */
if
(
DECL_SOURCE_LINE
(
decl
)
==
0
&&
is_base_type
(
TREE_TYPE
(
decl
)))
{
return
;
}
/* If we are in terse mode, don't generate any DIEs to represent any
/* If we are in terse mode, don't generate any DIEs to represent any
actual typedefs. */
actual typedefs. */
...
@@ -8173,10 +7985,6 @@ dwarf2out_init (asm_out_file, main_input_filename)
...
@@ -8173,10 +7985,6 @@ dwarf2out_init (asm_out_file, main_input_filename)
invoked when the given (base) source file was compiled. */
invoked when the given (base) source file was compiled. */
gen_compile_unit_die
(
main_input_filename
);
gen_compile_unit_die
(
main_input_filename
);
/* clear the association between base types and their DIE's */
if
(
debug_info_level
>
DINFO_LEVEL_TERSE
)
init_base_type_table
();
ASM_GENERATE_INTERNAL_LABEL
(
text_end_label
,
TEXT_END_LABEL
,
0
);
ASM_GENERATE_INTERNAL_LABEL
(
text_end_label
,
TEXT_END_LABEL
,
0
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment