*** empty log message ***
From-SVN: r433
This commit is contained in:
parent
d1b765a51a
commit
5b7f1820c6
60
gcc/sdbout.c
60
gcc/sdbout.c
@ -1,5 +1,5 @@
|
|||||||
/* Output sdb-format symbol table information from GNU compiler.
|
/* Output sdb-format symbol table information from GNU compiler.
|
||||||
Copyright (C) 1988-1990 Free Software Foundation, Inc.
|
Copyright (C) 1988, 1992 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ AT&T C compiler. From the example below I would conclude the following:
|
|||||||
#include "insn-config.h"
|
#include "insn-config.h"
|
||||||
#include "reload.h"
|
#include "reload.h"
|
||||||
|
|
||||||
/* Mips systems use the SDB functions to dump out it's symbols, but
|
/* Mips systems use the SDB functions to dump out symbols, but
|
||||||
do not supply usable syms.h include files. */
|
do not supply usable syms.h include files. */
|
||||||
#if defined(USG) && !defined(MIPS)
|
#if defined(USG) && !defined(MIPS)
|
||||||
#include <syms.h>
|
#include <syms.h>
|
||||||
@ -405,8 +405,9 @@ sdbout_record_type_name (type)
|
|||||||
{
|
{
|
||||||
t = TYPE_NAME (type);
|
t = TYPE_NAME (type);
|
||||||
}
|
}
|
||||||
#if 0 /* Don't use typedef names. */
|
#if 1 /* As a temprary hack, use typedef names for C++ only. */
|
||||||
else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
|
else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
|
||||||
|
&& TYPE_LANG_SPECIFIC (type))
|
||||||
{
|
{
|
||||||
t = DECL_NAME (TYPE_NAME (type));
|
t = DECL_NAME (TYPE_NAME (type));
|
||||||
}
|
}
|
||||||
@ -575,7 +576,8 @@ sdbout_syms (syms)
|
|||||||
{
|
{
|
||||||
while (syms)
|
while (syms)
|
||||||
{
|
{
|
||||||
sdbout_symbol (syms, 1);
|
if (TREE_CODE (syms) != LABEL_DECL)
|
||||||
|
sdbout_symbol (syms, 1);
|
||||||
syms = TREE_CHAIN (syms);
|
syms = TREE_CHAIN (syms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -724,7 +726,8 @@ sdbout_symbol (decl, local)
|
|||||||
else if (GET_CODE (value) == MEM
|
else if (GET_CODE (value) == MEM
|
||||||
&& (GET_CODE (XEXP (value, 0)) == MEM
|
&& (GET_CODE (XEXP (value, 0)) == MEM
|
||||||
|| (GET_CODE (XEXP (value, 0)) == REG
|
|| (GET_CODE (XEXP (value, 0)) == REG
|
||||||
&& REGNO (XEXP (value, 0)) != FRAME_POINTER_REGNUM)))
|
&& REGNO (XEXP (value, 0)) != FRAME_POINTER_REGNUM
|
||||||
|
&& REGNO (XEXP (value, 0)) != STACK_POINTER_REGNUM)))
|
||||||
/* If the value is indirect by memory or by a register
|
/* If the value is indirect by memory or by a register
|
||||||
that isn't the frame pointer
|
that isn't the frame pointer
|
||||||
then it means the object is variable-sized and address through
|
then it means the object is variable-sized and address through
|
||||||
@ -761,6 +764,23 @@ sdbout_symbol (decl, local)
|
|||||||
PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET (XEXP (value, 0)));
|
PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET (XEXP (value, 0)));
|
||||||
PUT_SDB_SCL (C_AUTO);
|
PUT_SDB_SCL (C_AUTO);
|
||||||
}
|
}
|
||||||
|
else if (GET_CODE (value) == MEM && GET_CODE (XEXP (value, 0)) == CONST)
|
||||||
|
{
|
||||||
|
/* Handle an obscure case which can arise when optimizing and
|
||||||
|
when there are few available registers. (This is *always*
|
||||||
|
the case for i386/i486 targets). The DECL_RTL looks like
|
||||||
|
(MEM (CONST ...)) even though this variable is a local `auto'
|
||||||
|
or a local `register' variable. In effect, what has happened
|
||||||
|
is that the reload pass has seen that all assignments and
|
||||||
|
references for one such a local variable can be replaced by
|
||||||
|
equivalent assignments and references to some static storage
|
||||||
|
variable, thereby avoiding the need for a register. In such
|
||||||
|
cases we're forced to lie to debuggers and tell them that
|
||||||
|
this variable was itself `static'. */
|
||||||
|
PUT_SDB_DEF (name);
|
||||||
|
PUT_SDB_VAL (XEXP (XEXP (value, 0), 0));
|
||||||
|
PUT_SDB_SCL (C_STAT);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* It is something we don't know how to represent for SDB. */
|
/* It is something we don't know how to represent for SDB. */
|
||||||
@ -948,6 +968,7 @@ sdbout_one_type (type)
|
|||||||
int size = int_size_in_bytes (type);
|
int size = int_size_in_bytes (type);
|
||||||
int member_scl;
|
int member_scl;
|
||||||
tree tem;
|
tree tem;
|
||||||
|
int i, n_baseclasses = 0;
|
||||||
|
|
||||||
/* Record the type tag, but not in its permanent place just yet. */
|
/* Record the type tag, but not in its permanent place just yet. */
|
||||||
sdbout_record_type_name (type);
|
sdbout_record_type_name (type);
|
||||||
@ -978,6 +999,33 @@ sdbout_one_type (type)
|
|||||||
PUT_SDB_SIZE (size);
|
PUT_SDB_SIZE (size);
|
||||||
PUT_SDB_ENDEF;
|
PUT_SDB_ENDEF;
|
||||||
|
|
||||||
|
/* Print out the base class information with fields
|
||||||
|
named after the types they hold. */
|
||||||
|
if (TYPE_BINFO (type)
|
||||||
|
&& TYPE_BINFO_BASETYPES (type))
|
||||||
|
n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
|
||||||
|
for (i = 0; i < n_baseclasses; i++)
|
||||||
|
{
|
||||||
|
tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)), i);
|
||||||
|
tree child_type = BINFO_TYPE (child);
|
||||||
|
tree child_type_name;
|
||||||
|
if (TYPE_NAME (child_type) == 0)
|
||||||
|
continue;
|
||||||
|
if (TREE_CODE (TYPE_NAME (child_type)) == IDENTIFIER_NODE)
|
||||||
|
child_type_name = TYPE_NAME (child_type);
|
||||||
|
else if (TREE_CODE (TYPE_NAME (child_type)) == TYPE_DECL)
|
||||||
|
child_type_name = DECL_NAME (TYPE_NAME (child_type));
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CONTIN;
|
||||||
|
PUT_SDB_DEF (IDENTIFIER_POINTER (child_type_name));
|
||||||
|
PUT_SDB_INT_VAL (TREE_INT_CST_LOW (BINFO_OFFSET (child)));
|
||||||
|
PUT_SDB_SCL (member_scl);
|
||||||
|
sdbout_type (BINFO_TYPE (child));
|
||||||
|
PUT_SDB_ENDEF;
|
||||||
|
}
|
||||||
|
|
||||||
/* output the individual fields */
|
/* output the individual fields */
|
||||||
|
|
||||||
if (TREE_CODE (type) == ENUMERAL_TYPE)
|
if (TREE_CODE (type) == ENUMERAL_TYPE)
|
||||||
|
Loading…
Reference in New Issue
Block a user