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
4bcaafd9
Commit
4bcaafd9
authored
Dec 13, 1995
by
Ian Lance Taylor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Output N_BINCL and N_EINCL stabs if DBX_USE_BINCL is defined.
From-SVN: r10706
parent
1a6281cb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
152 additions
and
40 deletions
+152
-40
gcc/dbxout.c
+152
-40
No files found.
gcc/dbxout.c
View file @
4bcaafd9
...
...
@@ -205,15 +205,28 @@ static char *cwd;
enum
typestatus
{
TYPE_UNSEEN
,
TYPE_XREF
,
TYPE_DEFINED
};
/* Vector recording the status of describing C data types.
/* Structure recording information about a C data type.
The status element says whether we have yet output
the definition of the type. TYPE_XREF says we have
output it as a cross-reference only.
The file_number and type_number elements are used if DBX_USE_BINCL
is defined. */
struct
typeinfo
{
enum
typestatus
status
;
#ifdef DBX_USE_BINCL
int
file_number
;
int
type_number
;
#endif
};
/* Vector recording information about C data types.
When we first notice a data type (a tree node),
we assign it a number using next_type_number.
That is its index in this vector.
The vector element says whether we have yet output
the definition of the type. TYPE_XREF says we have
output it as a cross-reference only. */
That is its index in this vector. */
enum
typestatus
*
typevec
;
struct
typeinfo
*
typevec
;
/* Number of elements of space allocated in `typevec'. */
...
...
@@ -225,6 +238,29 @@ static int typevec_len;
static
int
next_type_number
;
#ifdef DBX_USE_BINCL
/* When using N_BINCL in dbx output, each type number is actually a
pair of the file number and the type number within the file.
This is a stack of input files. */
struct
dbx_file
{
struct
dbx_file
*
next
;
int
file_number
;
int
next_type_number
;
};
/* This is the top of the stack. */
static
struct
dbx_file
*
current_file
;
/* This is the next file number to use. */
static
int
next_file_number
;
#endif
/* DBX_USE_BINCL */
/* In dbx output, we must assign symbol-blocks id numbers
in the order in which their beginnings are encountered.
We output debugging info that refers to the beginning and
...
...
@@ -282,6 +318,7 @@ static void dbxout_symbol_name ();
static
void
dbxout_symbol_location
();
static
void
dbxout_prepare_symbol
();
static
void
dbxout_finish_symbol
();
static
void
dbxout_type_index
();
static
void
dbxout_continue
();
static
void
print_int_cst_octal
();
static
void
print_octal
();
...
...
@@ -404,7 +441,7 @@ dbxout_init (asm_file, input_file_name, syms)
asmfile
=
asm_file
;
typevec_len
=
100
;
typevec
=
(
enum
typestatus
*
)
xmalloc
(
typevec_len
*
sizeof
typevec
[
0
]);
typevec
=
(
struct
typeinfo
*
)
xmalloc
(
typevec_len
*
sizeof
typevec
[
0
]);
bzero
((
char
*
)
typevec
,
typevec_len
*
sizeof
typevec
[
0
]);
/* Convert Ltext into the appropriate format for local labels in case
...
...
@@ -464,6 +501,14 @@ dbxout_init (asm_file, input_file_name, syms)
next_type_number
=
1
;
next_block_number
=
2
;
#ifdef DBX_USE_BINCL
current_file
=
(
struct
dbx_file
*
)
xmalloc
(
sizeof
*
current_file
);
current_file
->
next
=
NULL
;
current_file
->
file_number
=
0
;
current_file
->
next_type_number
=
1
;
next_file_number
=
1
;
#endif
/* Make sure that types `int' and `char' have numbers 1 and 2.
Definitions of other integer types will refer to those numbers.
(Actually it should no longer matter what their numbers are.
...
...
@@ -505,6 +550,38 @@ dbxout_typedefs (syms)
}
}
/* Change to reading from a new source file. Generate a N_BINCL stab. */
void
dbxout_start_new_source_file
(
filename
)
char
*
filename
;
{
#ifdef DBX_USE_BINCL
struct
dbx_file
*
n
=
(
struct
dbx_file
*
)
xmalloc
(
sizeof
*
n
);
n
->
next
=
current_file
;
n
->
file_number
=
next_file_number
++
;
n
->
next_type_number
=
1
;
current_file
=
n
;
fprintf
(
asmfile
,
"%s
\"
%s
\"
,%d,0,0,0
\n
"
,
ASM_STABS_OP
,
filename
,
N_BINCL
);
#endif
}
/* Revert to reading a previous source file. Generate a N_EINCL stab. */
void
dbxout_resume_previous_source_file
()
{
#ifdef DBX_USE_BINCL
struct
dbx_file
*
next
;
fprintf
(
asmfile
,
"%s %d,0,0,0
\n
"
,
ASM_STABN_OP
,
N_EINCL
);
next
=
current_file
->
next
;
free
(
current_file
);
current_file
=
next
;
#endif
}
/* Output debugging info to FILE to switch to sourcefile FILENAME. */
void
...
...
@@ -568,6 +645,22 @@ dbxout_finish (file, filename)
#endif
/* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
}
/* Output the index of a type. */
static
void
dbxout_type_index
(
type
)
tree
type
;
{
#ifndef DBX_USE_BINCL
fprintf
(
asmfile
,
"%d"
,
TYPE_SYMTAB_ADDRESS
(
type
));
CHARS
(
3
);
#else
struct
typeinfo
*
t
=
&
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)];
fprintf
(
asmfile
,
"(%d,%d)"
,
t
->
file_number
,
t
->
type_number
);
CHARS
(
7
);
#endif
}
/* Continue a symbol-description that gets too big.
End one symbol table entry with a double-backslash
and start a new one, eventually producing something like
...
...
@@ -896,7 +989,7 @@ dbxout_range_type (type)
{
/* This used to say `r1' and we used to take care
to make sure that `int' was type number 1. */
fprintf
(
asmfile
,
"%d"
,
TYPE_SYMTAB_ADDRESS
(
integer_type_node
)
);
dbxout_type_index
(
integer_type_node
);
}
if
(
TREE_CODE
(
TYPE_MIN_VALUE
(
type
))
==
INTEGER_CST
)
fprintf
(
asmfile
,
";%d"
,
...
...
@@ -956,17 +1049,23 @@ dbxout_type (type, full, show_arg_types)
if
(
next_type_number
==
typevec_len
)
{
typevec
=
(
enum
typestatus
*
)
xrealloc
(
typevec
,
(
struct
typeinfo
*
)
xrealloc
(
typevec
,
typevec_len
*
2
*
sizeof
typevec
[
0
]);
bzero
((
char
*
)
(
typevec
+
typevec_len
),
typevec_len
*
sizeof
typevec
[
0
]);
typevec_len
*=
2
;
}
#ifdef DBX_USE_BINCL
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)].
file_number
=
current_file
->
file_number
;
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)].
type_number
=
current_file
->
next_type_number
++
;
#endif
}
/* Output the number of this type, to refer to it. */
fprintf
(
asmfile
,
"%d"
,
TYPE_SYMTAB_ADDRESS
(
type
));
CHARS
(
3
);
dbxout_type_index
(
type
);
#ifdef DBX_TYPE_DEFINED
if
(
DBX_TYPE_DEFINED
(
type
))
...
...
@@ -976,7 +1075,7 @@ dbxout_type (type, full, show_arg_types)
/* If this type's definition has been output or is now being output,
that is all. */
switch
(
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)])
switch
(
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
.
status
)
{
case
TYPE_UNSEEN
:
break
;
...
...
@@ -1014,7 +1113,7 @@ dbxout_type (type, full, show_arg_types)
/* No way in DBX fmt to describe a variable size. */
||
TREE_CODE
(
TYPE_SIZE
(
type
))
!=
INTEGER_CST
)
{
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
=
TYPE_XREF
;
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
.
status
=
TYPE_XREF
;
return
;
}
#endif
...
...
@@ -1027,7 +1126,7 @@ dbxout_type (type, full, show_arg_types)
/* Mark it as defined, so that if it is self-referent
we will not get into an infinite recursion of definitions. */
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
=
TYPE_DEFINED
;
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
.
status
=
TYPE_DEFINED
;
switch
(
TREE_CODE
(
type
))
{
...
...
@@ -1038,25 +1137,30 @@ dbxout_type (type, full, show_arg_types)
without saying what it is. The debugger will make it
a void type when the reference is seen, and nothing will
ever override that default. */
fprintf
(
asmfile
,
"%d"
,
TYPE_SYMTAB_ADDRESS
(
type
));
CHARS
(
3
);
dbxout_type_index
(
type
);
break
;
case
INTEGER_TYPE
:
if
(
type
==
char_type_node
&&
!
TREE_UNSIGNED
(
type
))
/* Output the type `char' as a subrange of itself!
I don't understand this definition, just copied it
from the output of pcc.
This used to use `r2' explicitly and we used to
take care to make sure that `char' was type number 2. */
fprintf
(
asmfile
,
"r%d;0;127;"
,
TYPE_SYMTAB_ADDRESS
(
type
));
{
/* Output the type `char' as a subrange of itself!
I don't understand this definition, just copied it
from the output of pcc.
This used to use `r2' explicitly and we used to
take care to make sure that `char' was type number 2. */
fprintf
(
asmfile
,
"r"
);
dbxout_type_index
(
type
);
fprintf
(
asmfile
,
";0;127;"
);
}
else
if
(
use_gnu_debug_info_extensions
&&
(
TYPE_PRECISION
(
type
)
>
TYPE_PRECISION
(
integer_type_node
)
||
TYPE_PRECISION
(
type
)
>
HOST_BITS_PER_WIDE_INT
))
{
/* This used to say `r1' and we used to take care
to make sure that `int' was type number 1. */
fprintf
(
asmfile
,
"r%d;"
,
TYPE_SYMTAB_ADDRESS
(
integer_type_node
));
fprintf
(
asmfile
,
"r"
);
dbxout_type_index
(
integer_type_node
);
fprintf
(
asmfile
,
";"
);
print_int_cst_octal
(
TYPE_MIN_VALUE
(
type
));
fprintf
(
asmfile
,
";"
);
print_int_cst_octal
(
TYPE_MAX_VALUE
(
type
));
...
...
@@ -1064,15 +1168,16 @@ dbxout_type (type, full, show_arg_types)
}
else
/* Output other integer types as subranges of `int'. */
dbxout_range_type
(
type
);
CHARS
(
2
5
);
CHARS
(
2
2
);
break
;
case
REAL_TYPE
:
/* This used to say `r1' and we used to take care
to make sure that `int' was type number 1. */
fprintf
(
asmfile
,
"r%d;%d;0;"
,
TYPE_SYMTAB_ADDRESS
(
integer_type_node
),
int_size_in_bytes
(
type
));
CHARS
(
16
);
fprintf
(
asmfile
,
"r"
);
dbxout_type_index
(
integer_type_node
);
fprintf
(
asmfile
,
";%d;0;"
,
int_size_in_bytes
(
type
));
CHARS
(
13
);
break
;
case
CHAR_TYPE
:
...
...
@@ -1080,10 +1185,13 @@ dbxout_type (type, full, show_arg_types)
fprintf
(
asmfile
,
"@s%d;-20;"
,
BITS_PER_UNIT
*
int_size_in_bytes
(
type
));
else
/* Output the type `char' as a subrange of itself.
That is what pcc seems to do. */
fprintf
(
asmfile
,
"r%d;0;%d;"
,
TYPE_SYMTAB_ADDRESS
(
char_type_node
),
TREE_UNSIGNED
(
type
)
?
255
:
127
);
{
/* Output the type `char' as a subrange of itself.
That is what pcc seems to do. */
fprintf
(
asmfile
,
"r"
);
dbxout_type_index
(
char_type_node
);
fprintf
(
asmfile
,
";0;%d;"
,
TREE_UNSIGNED
(
type
)
?
255
:
127
);
}
CHARS
(
9
);
break
;
...
...
@@ -1107,10 +1215,11 @@ dbxout_type (type, full, show_arg_types)
if
(
TREE_CODE
(
TREE_TYPE
(
type
))
==
REAL_TYPE
)
{
fprintf
(
asmfile
,
"r%d;%d;0;"
,
TYPE_SYMTAB_ADDRESS
(
type
),
fprintf
(
asmfile
,
"r"
);
dbxout_type_index
(
type
);
fprintf
(
asmfile
,
";%d;0;"
,
int_size_in_bytes
(
TREE_TYPE
(
type
)));
CHARS
(
1
5
);
/* The number is probably incorrect here. */
CHARS
(
1
2
);
/* The number is probably incorrect here. */
}
else
{
...
...
@@ -1164,14 +1273,17 @@ dbxout_type (type, full, show_arg_types)
}
tem
=
TYPE_DOMAIN
(
type
);
if
(
tem
==
NULL
)
fprintf
(
asmfile
,
"ar%d;0;-1;"
,
TYPE_SYMTAB_ADDRESS
(
integer_type_node
));
{
fprintf
(
asmfile
,
"ar"
);
dbxout_type_index
(
integer_type_node
);
fprintf
(
asmfile
,
";0;-1;"
);
}
else
{
fprintf
(
asmfile
,
"a"
);
dbxout_range_type
(
tem
);
}
CHARS
(
1
7
);
CHARS
(
1
4
);
dbxout_type
(
TREE_TYPE
(
type
),
0
,
0
);
break
;
...
...
@@ -1215,7 +1327,7 @@ dbxout_type (type, full, show_arg_types)
else
fprintf
(
asmfile
,
"$$%d"
,
anonymous_type_number
++
);
fprintf
(
asmfile
,
":"
);
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
=
TYPE_XREF
;
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
.
status
=
TYPE_XREF
;
break
;
}
...
...
@@ -1312,7 +1424,7 @@ dbxout_type (type, full, show_arg_types)
fprintf
(
asmfile
,
"xe"
);
CHARS
(
3
);
dbxout_type_name
(
type
);
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
=
TYPE_XREF
;
typevec
[
TYPE_SYMTAB_ADDRESS
(
type
)]
.
status
=
TYPE_XREF
;
fprintf
(
asmfile
,
":"
);
return
;
}
...
...
@@ -1593,7 +1705,7 @@ dbxout_symbol (decl, local)
/* If this typedef name was defined by outputting the type,
don't duplicate it. */
if (typevec[TYPE_SYMTAB_ADDRESS (type)] == TYPE_DEFINED
if (typevec[TYPE_SYMTAB_ADDRESS (type)]
.status
== TYPE_DEFINED
&& TYPE_NAME (TREE_TYPE (decl)) == decl)
return;
#endif
...
...
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