2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-10 00:01:35 +08:00

dwarf2.h (dwarf_calling_convention): Add enum for renesas sh abi.

2004-09-30  Eric Christopher  <echristo@redhat.com>

	* dwarf2.h (dwarf_calling_convention): Add enum for renesas
	sh abi.
	* dwarf2out.c (add_calling_convention_attribute): New function.
	(gen_subroutine_type_die): Use.
	* target-def.h (TARGET_DWARF_CALLING_CONVENTION): New hook.
	* target.h (gcc_target): Add dwarf_calling_convention.
	* hooks.c (hook_int_tree_0): New function.
	* hooks.h: Prototype.
	* config/sh/sh.c: Include dwarf2.h.
	(sh_dwarf_calling_convention): New function.
	(TARGET_DWARF_CALLING_CONVENTION): Use.
	* doc/tm.texi (TARGET_DWARF_CALLING_CONVENTION): Document.

From-SVN: r88382
This commit is contained in:
Eric Christopher 2004-10-01 05:08:59 +00:00
parent 049bc40445
commit a1c496cb43
10 changed files with 111 additions and 41 deletions

@ -1,3 +1,18 @@
2004-09-30 Eric Christopher <echristo@redhat.com>
* dwarf2.h (dwarf_calling_convention): Add enum for renesas
sh abi.
* dwarf2out.c (add_calling_convention_attribute): New function.
(gen_subroutine_type_die): Use.
* target-def.h (TARGET_DWARF_CALLING_CONVENTION): New hook.
* target.h (gcc_target): Add dwarf_calling_convention.
* hooks.c (hook_int_tree_0): New function.
* hooks.h: Prototype.
* config/sh/sh.c: Include dwarf2.h.
(sh_dwarf_calling_convention): New function.
(TARGET_DWARF_CALLING_CONVENTION): Use.
* doc/tm.texi (TARGET_DWARF_CALLING_CONVENTION): Document.
2004-09-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
@ -102,7 +117,7 @@
s390_update_frame_layout instead of s390_register_info. Handle
prologue/epilogue insns that touch only RETURN_REGNUM.
(s390_reorg): Remove base_used. Clear split_branches_pending_p.
(s390_register_info): Remove base_used and return_addr_used
(s390_register_info): Remove base_used and return_addr_used
arguments, compute special register usage inline. Return live
register data to caller.
(s390_frame_info): Remove arguments, do not call s390_register_info.

@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA. */
#include "recog.h"
#include "c-pragma.h"
#include "integrate.h"
#include "dwarf2.h"
#include "tm_p.h"
#include "target.h"
#include "target-def.h"
@ -285,6 +286,7 @@ static bool sh_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
static bool sh_callee_copies (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
static int sh_dwarf_calling_convention (tree);
/* Initialize the GCC target structure. */
@ -454,6 +456,9 @@ static bool sh_callee_copies (CUMULATIVE_ARGS *, enum machine_mode,
#undef TARGET_PCH_VALID_P
#define TARGET_PCH_VALID_P sh_pch_valid_p
#undef TARGET_DWARF_CALLING_CONVENTION
#define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention
/* Return regmode weight for insn. */
#define INSN_REGMODE_WEIGHT(INSN, MODE) regmode_weight[((MODE) == SImode) ? 0 : 1][INSN_UID (INSN)]
@ -9402,6 +9407,17 @@ sh_vector_mode_supported_p (enum machine_mode mode)
return false;
}
/* Implements target hook dwarf_calling_convention. Return an enum
of dwarf_calling_convention. */
int
sh_dwarf_calling_convention (tree func)
{
if (sh_attr_renesas_p (func))
return DW_CC_renesas_sh;
return DW_CC_normal;
}
static void
sh_init_builtins (void)
{

@ -3747,7 +3747,7 @@ known to be passed by reference. The hook should return true if the
function argument should be copied by the callee instead of copied
by the caller.
For any argument for which the hook returns true, if it can be
For any argument for which the hook returns true, if it can be
determined that the argument is not modified, then a copy need
not be generated.
@ -8061,6 +8061,12 @@ for SDB in response to the @option{-g} option.
Define this macro if GCC should produce dwarf version 2 format
debugging output in response to the @option{-g} option.
@deftypefn {Target Hook} int TARGET_DWARF_CALLING_CONVENTION (tree @var{function})
Define this to enable the dwarf attribute @code{DW_AT_calling_convention} to
be emitted for each function. Instead of an integer return the enum
value for the @code{DW_CC_} tag.
@end deftypefn
To support optional call frame debugging information, you must also
define @code{INCOMING_RETURN_ADDR_RTX} and either set
@code{RTX_FRAME_RELATED_P} on the prologue insns if you use RTL for the

@ -474,7 +474,8 @@ enum dwarf_calling_convention
{
DW_CC_normal = 0x1,
DW_CC_program = 0x2,
DW_CC_nocall = 0x3
DW_CC_nocall = 0x3,
DW_CC_renesas_sh = 0x40
};
#define DW_CC_lo_user 0x40

@ -116,7 +116,7 @@ dwarf2out_do_frame (void)
/* Various versions of targetm.eh_frame_section. Note these must appear
outside the DWARF2_DEBUGGING_INFO || DWARF2_UNWIND_INFO macro guards. */
/* Version of targetm.eh_frame_section for systems with named sections. */
/* Version of targetm.eh_frame_section for systems with named sections. */
void
named_section_eh_frame_section (void)
{
@ -142,7 +142,7 @@ named_section_eh_frame_section (void)
#endif
}
/* Version of targetm.eh_frame_section for systems using collect2. */
/* Version of targetm.eh_frame_section for systems using collect2. */
void
collect2_eh_frame_section (void)
{
@ -1150,7 +1150,7 @@ struct reg_saved_in_data GTY(()) {
more efficient data structure. */
static GTY(()) struct reg_saved_in_data regs_saved_in_regs[4];
static GTY(()) size_t num_regs_saved_in_regs;
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
static const char *last_reg_save_label;
@ -1253,7 +1253,7 @@ reg_saved_in (rtx reg)
unsigned int regn = REGNO (reg);
size_t i;
struct queued_reg_save *q;
for (q = queued_reg_saves; q; q = q->next)
if (q->saved_reg && regn == REGNO (q->saved_reg))
return q->reg;
@ -1311,7 +1311,7 @@ static dw_cfa_location cfa_temp;
the intent is to save the value of SP from the previous frame.
In addition, if a register has previously been saved to a different
register,
register,
Invariants / Summaries of Rules
@ -1480,7 +1480,7 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
{
/* Rule 1 */
/* Update the CFA rule wrt SP or FP. Make sure src is
relative to the current CFA register.
relative to the current CFA register.
We used to require that dest be either SP or FP, but the
ARM copies SP to a temporary register, and from there to
@ -1677,14 +1677,14 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
case LO_SUM:
{
int regno;
gcc_assert (GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT);
offset = INTVAL (XEXP (XEXP (dest, 0), 1));
if (GET_CODE (XEXP (dest, 0)) == MINUS)
offset = -offset;
regno = REGNO (XEXP (XEXP (dest, 0), 0));
if (cfa_store.reg == (unsigned) regno)
offset -= cfa_store.offset;
else
@ -1700,7 +1700,7 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
case REG:
{
int regno = REGNO (XEXP (dest, 0));
if (cfa_store.reg == (unsigned) regno)
offset = -cfa_store.offset;
else
@ -1778,7 +1778,7 @@ dwarf2out_frame_debug (rtx insn)
if (insn == NULL_RTX)
{
size_t i;
/* Flush any queued register saves. */
flush_queued_reg_saves ();
@ -1791,7 +1791,7 @@ dwarf2out_frame_debug (rtx insn)
cfa_store = cfa;
cfa_temp.reg = -1;
cfa_temp.offset = 0;
for (i = 0; i < num_regs_saved_in_regs; i++)
{
regs_saved_in_regs[i].orig_reg = NULL_RTX;
@ -3930,6 +3930,7 @@ static dw_die_ref scope_die_for (tree, dw_die_ref);
static inline int local_scope_p (dw_die_ref);
static inline int class_or_namespace_scope_p (dw_die_ref);
static void add_type_attribute (dw_die_ref, tree, int, int, dw_die_ref);
static void add_calling_convention_attribute (dw_die_ref, tree);
static const char *type_tag (tree);
static tree member_declared_type (tree);
#if 0
@ -4809,11 +4810,11 @@ AT_string_form (dw_attr_ref a)
char label[32];
gcc_assert (a && AT_class (a) == dw_val_class_str);
node = a->dw_attr_val.v.val_str;
if (node->form)
return node->form;
len = strlen (node->str) + 1;
/* If the string is shorter or equal to the size of the reference, it is
@ -8637,7 +8638,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
case ASHIFT:
op = DW_OP_shl;
goto do_binop;
case ASHIFTRT:
op = DW_OP_shra;
goto do_binop;
@ -9283,7 +9284,7 @@ field_byte_offset (tree decl)
if (TREE_CODE (decl) == ERROR_MARK)
return 0;
gcc_assert (TREE_CODE (decl) == FIELD_DECL);
type = field_type (decl);
@ -9557,7 +9558,7 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
if (val < 0)
add_AT_int (die, DW_AT_const_value, val);
else
else
add_AT_unsigned (die, DW_AT_const_value, (unsigned HOST_WIDE_INT) val);
}
break;
@ -9605,30 +9606,30 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
{
rtx elt = CONST_VECTOR_ELT (rtl, i);
HOST_WIDE_INT lo, hi;
switch (GET_CODE (elt))
{
case CONST_INT:
lo = INTVAL (elt);
hi = -(lo < 0);
break;
case CONST_DOUBLE:
lo = CONST_DOUBLE_LOW (elt);
hi = CONST_DOUBLE_HIGH (elt);
break;
default:
gcc_unreachable ();
}
if (elt_size <= sizeof (HOST_WIDE_INT))
insert_int (lo, elt_size, p);
else
{
unsigned char *p0 = p;
unsigned char *p1 = p + sizeof (HOST_WIDE_INT);
gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT));
if (WORDS_BIG_ENDIAN)
{
@ -10621,6 +10622,20 @@ add_type_attribute (dw_die_ref object_die, tree type, int decl_const,
add_AT_die_ref (object_die, DW_AT_type, type_die);
}
/* Given an object die, add the calling convention attribute for the
function call type. */
static void
add_calling_convention_attribute (dw_die_ref subr_die, tree type)
{
enum dwarf_calling_convention value = DW_CC_normal;
value = targetm.dwarf_calling_convention (type);
/* Only add the attribute if the backend requests it. */
if (value)
add_AT_unsigned (subr_die, DW_AT_calling_convention, value);
}
/* Given a tree pointer to a struct, class, union, or enum type node, return
a pointer to the (string) tag name for the given type, or zero if the type
was declared without a tag. */
@ -11165,7 +11180,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
subr_die = old_die;
/* Clear out the declaration attribute and the formal parameters.
Do not remove all children, because it is possible that this
Do not remove all children, because it is possible that this
declaration die was forced using force_decl_die(). In such
cases die that forced declaration die (e.g. TAG_imported_module)
is one of the children that we do not want to remove. */
@ -11218,7 +11233,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
/* The first time we see a member function, it is in the context of
the class to which it belongs. We make sure of this by emitting
the class first. The next time is the definition, which is
handled above. The two may come from the same source text.
handled above. The two may come from the same source text.
Note that force_decl_die() forces function declaration die. It is
later reused to represent definition. */
@ -11917,6 +11932,7 @@ gen_subroutine_type_die (tree type, dw_die_ref context_die)
equate_type_number_to_die (type, subr_die);
add_prototyped_attribute (subr_die, type);
add_type_attribute (subr_die, return_type, 0, 0, context_die);
add_calling_convention_attribute (subr_die, type);
gen_formal_types_die (type, subr_die);
}
@ -12356,7 +12372,7 @@ force_decl_die (tree decl)
save_fn = current_function_decl;
current_function_decl = NULL_TREE;
gen_subprogram_die (decl, context_die);
current_function_decl = save_fn;
current_function_decl = save_fn;
break;
case VAR_DECL:
@ -12375,14 +12391,14 @@ force_decl_die (tree decl)
default:
gcc_unreachable ();
}
/* See if we can find the die for this deci now.
If not then abort. */
if (!decl_die)
decl_die = lookup_decl_die (decl);
gcc_assert (decl_die);
}
return decl_die;
}
@ -12696,8 +12712,8 @@ dwarf2out_type_decl (tree decl, int local)
dwarf2out_decl (decl);
}
/* Output debug information for imported module or decl. */
/* Output debug information for imported module or decl. */
static void
dwarf2out_imported_module_or_decl (tree decl, tree context)
{
@ -12705,14 +12721,14 @@ dwarf2out_imported_module_or_decl (tree decl, tree context)
dw_die_ref scope_die;
unsigned file_index;
expanded_location xloc;
if (debug_info_level <= DINFO_LEVEL_TERSE)
return;
gcc_assert (decl);
/* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
We need decl DIE for reference and scope die. First, get DIE for the decl
We need decl DIE for reference and scope die. First, get DIE for the decl
itself. */
/* Get the scope die for decl context. Use comp_unit_die for global module
@ -12729,8 +12745,8 @@ dwarf2out_imported_module_or_decl (tree decl, tree context)
at_import_die = force_type_die (TREE_TYPE (decl));
else
at_import_die = force_decl_die (decl);
/* OK, now we have DIEs for decl as well as scope. Emit imported die. */
/* OK, now we have DIEs for decl as well as scope. Emit imported die. */
if (TREE_CODE (decl) == NAMESPACE_DECL)
imported_die = new_die (DW_TAG_imported_module, scope_die, context);
else
@ -13440,7 +13456,7 @@ static void
prune_unused_types_prune (dw_die_ref die)
{
dw_die_ref c, p, n;
gcc_assert (die->die_mark);
p = NULL;
@ -13568,9 +13584,9 @@ dwarf2out_finish (const char *filename)
context = DECL_CONTEXT (node->created_for);
else if (TYPE_P (node->created_for))
context = TYPE_CONTEXT (node->created_for);
gcc_assert (context && TREE_CODE (context) == FUNCTION_DECL);
origin = lookup_decl_die (context);
if (origin)
add_child_die (origin, die);

@ -117,6 +117,12 @@ default_can_output_mi_thunk_no_vcall (tree a ATTRIBUTE_UNUSED,
return c == 0;
}
int
hook_int_tree_0 (tree a ATTRIBUTE_UNUSED)
{
return 0;
}
/* ??? Used for comp_type_attributes, which ought to return bool. */
int
hook_int_tree_tree_1 (tree a ATTRIBUTE_UNUSED, tree b ATTRIBUTE_UNUSED)
@ -245,4 +251,3 @@ hook_tree_tree_bool_null (tree t ATTRIBUTE_UNUSED, bool ignore ATTRIBUTE_UNUSED)
{
return NULL;
}

@ -46,6 +46,7 @@ extern void hook_void_FILEptr_constcharptr (FILE *, const char *);
extern void hook_void_tree (tree);
extern void hook_void_tree_treeptr (tree, tree *);
extern int hook_int_tree_0 (tree);
extern int hook_int_tree_tree_1 (tree, tree);
extern int hook_int_rtx_0 (rtx);
extern int hook_int_size_t_constcharptr_int_0 (size_t, const char *, int);

@ -379,6 +379,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_MD_ASM_CLOBBERS hook_tree_tree_identity
#define TARGET_DWARF_CALLING_CONVENTION hook_int_tree_0
#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_false
#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_false
#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_false
@ -523,6 +525,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_DEFAULT_SHORT_ENUMS, \
TARGET_BUILTIN_SETJMP_FRAME_VALUE, \
TARGET_MD_ASM_CLOBBERS, \
TARGET_DWARF_CALLING_CONVENTION, \
TARGET_CALLS, \
TARGET_CXX, \
TARGET_HAVE_NAMED_SECTIONS, \

@ -488,6 +488,13 @@ struct gcc_target
the port wishes to automatically clobber for all asms. */
tree (* md_asm_clobbers) (tree);
/* This target hook allows the backend to specify a calling convention
in the debug information. This function actually returns an
enum dwarf_calling_convention, but because of forward declarations
and not wanting to include dwarf2.h everywhere target.h is included
the function is being declared as an int. */
int (* dwarf_calling_convention) (tree);
/* Functions relating to calls - argument passing, returns, etc. */
struct calls {
bool (*promote_function_args) (tree fntype);

@ -129,7 +129,7 @@ default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
!= default_setup_incoming_varargs);
}
enum machine_mode
enum machine_mode
default_eh_return_filter_mode (void)
{
return word_mode;
@ -173,7 +173,7 @@ default_cxx_get_cookie_size (tree type)
(true_type)) bytes. */
tree sizetype_size;
tree type_align;
sizetype_size = size_in_bytes (sizetype);
type_align = size_int (TYPE_ALIGN_UNIT (type));
if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))