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
f837a861
Commit
f837a861
authored
Aug 08, 1992
by
Michael Meissner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add prototype support.
From-SVN: r1785
parent
e83d45c4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
130 additions
and
3 deletions
+130
-3
gcc/genflags.c
+130
-3
gcc/rtl.h
+0
-0
gcc/tree.h
+0
-0
No files found.
gcc/genflags.c
View file @
f837a861
...
...
@@ -39,18 +39,100 @@ char *xmalloc ();
static
void
fatal
();
void
fancy_abort
();
/* Names for patterns. Need to allow linking with print-rtl. */
char
**
insn_name_ptr
;
/* Obstacks to remember normal, and call insns. */
static
struct
obstack
call_obstack
,
normal_obstack
;
/* Max size of names encountered. */
static
int
max_id_len
;
/* Count the number of match_operand's found. */
static
int
num_operands
(
x
)
rtx
x
;
{
int
count
=
0
;
int
i
,
j
;
enum
rtx_code
code
=
GET_CODE
(
x
);
char
*
format_ptr
=
GET_RTX_FORMAT
(
code
);
if
(
code
==
MATCH_OPERAND
)
return
1
;
if
(
code
==
MATCH_OPERATOR
)
count
++
;
for
(
i
=
0
;
i
<
GET_RTX_LENGTH
(
code
);
i
++
)
{
switch
(
*
format_ptr
++
)
{
case
'u'
:
case
'e'
:
count
+=
num_operands
(
XEXP
(
x
,
i
));
break
;
case
'E'
:
if
(
XVEC
(
x
,
i
)
!=
NULL
)
for
(
j
=
0
;
j
<
XVECLEN
(
x
,
i
);
j
++
)
count
+=
num_operands
(
XVECEXP
(
x
,
i
,
j
));
break
;
}
}
return
count
;
}
/* Print out prototype information for a function. */
static
void
gen_proto
(
insn
)
rtx
insn
;
{
int
num
=
num_operands
(
insn
);
printf
(
"extern rtx gen_%-*s PROTO(("
,
max_id_len
,
XSTR
(
insn
,
0
));
if
(
num
==
0
)
printf
(
"void"
);
else
{
while
(
num
--
>
1
)
printf
(
"rtx, "
);
printf
(
"rtx"
);
}
printf
(
"));
\n
"
);
}
/* Print out a function declaration without a prototype. */
static
void
gen_nonproto
(
insn
)
rtx
insn
;
{
printf
(
"extern rtx gen_%s ();
\n
"
,
XSTR
(
insn
,
0
));
}
static
void
gen_insn
(
insn
)
rtx
insn
;
{
char
*
name
=
XSTR
(
insn
,
0
);
char
*
p
;
struct
obstack
*
obstack_ptr
;
int
len
;
/* Don't mention instructions whose names are the null string.
They are in the machine description just to be recognized. */
if
(
strlen
(
XSTR
(
insn
,
0
))
==
0
)
len
=
strlen
(
name
);
if
(
len
==
0
)
return
;
printf
(
"#define HAVE_%s "
,
XSTR
(
insn
,
0
));
if
(
len
>
max_id_len
)
max_id_len
=
len
;
printf
(
"#define HAVE_%s "
,
name
);
if
(
strlen
(
XSTR
(
insn
,
2
))
==
0
)
printf
(
"1
\n
"
);
else
...
...
@@ -68,7 +150,16 @@ gen_insn (insn)
printf
(
")
\n
"
);
}
printf
(
"extern rtx gen_%s ();
\n
"
,
XSTR
(
insn
,
0
));
/* Save the current insn, so that we can later put out appropriate
prototypes. At present, most md files have the wrong number of
arguments for call and call_value, ignoring the extra arguments
that are passed for some machines, so by default, turn off the
prototype. */
obstack_ptr
=
(
!
strcmp
(
name
,
"call"
)
||
!
strcmp
(
name
,
"call_value"
))
?
&
call_obstack
:
&
normal_obstack
;
obstack_grow
(
obstack_ptr
,
&
insn
,
sizeof
(
rtx
));
}
char
*
...
...
@@ -119,10 +210,16 @@ main (argc, argv)
char
**
argv
;
{
rtx
desc
;
rtx
dummy
;
rtx
*
call_insns
;
rtx
*
normal_insns
;
rtx
*
insn_ptr
;
FILE
*
infile
;
register
int
c
;
obstack_init
(
rtl_obstack
);
obstack_init
(
&
call_obstack
);
obstack_init
(
&
normal_obstack
);
if
(
argc
<=
1
)
fatal
(
"No input file name."
);
...
...
@@ -153,6 +250,36 @@ from the machine description file `md'. */\n\n");
gen_insn
(
desc
);
}
/* Print out the prototypes now. */
dummy
=
(
rtx
)
0
;
obstack_grow
(
&
call_obstack
,
&
dummy
,
sizeof
(
rtx
));
call_insns
=
(
rtx
*
)
obstack_finish
(
&
call_obstack
);
obstack_grow
(
&
normal_obstack
,
&
dummy
,
sizeof
(
rtx
));
normal_insns
=
(
rtx
*
)
obstack_finish
(
&
normal_obstack
);
printf
(
"
\n
#ifndef NO_MD_PROTOTYPES
\n
"
);
for
(
insn_ptr
=
normal_insns
;
*
insn_ptr
;
insn_ptr
++
)
gen_proto
(
*
insn_ptr
);
printf
(
"
\n
#ifdef MD_CALL_PROTOTYPES
\n
"
);
for
(
insn_ptr
=
call_insns
;
*
insn_ptr
;
insn_ptr
++
)
gen_proto
(
*
insn_ptr
);
printf
(
"
\n
#else /* !MD_CALL_PROTOTYPES */
\n
"
);
for
(
insn_ptr
=
call_insns
;
*
insn_ptr
;
insn_ptr
++
)
gen_nonproto
(
*
insn_ptr
);
printf
(
"#endif /* !MD_CALL_PROTOTYPES */
\n
"
);
printf
(
"
\n
#else /* NO_MD_PROTOTYPES */
\n
"
);
for
(
insn_ptr
=
normal_insns
;
*
insn_ptr
;
insn_ptr
++
)
gen_nonproto
(
*
insn_ptr
);
for
(
insn_ptr
=
call_insns
;
*
insn_ptr
;
insn_ptr
++
)
gen_nonproto
(
*
insn_ptr
);
printf
(
"#endif /* NO_MD_PROTOTYPES */
\n
"
);
fflush
(
stdout
);
exit
(
ferror
(
stdout
)
!=
0
?
FATAL_EXIT_CODE
:
SUCCESS_EXIT_CODE
);
/* NOTREACHED */
...
...
gcc/rtl.h
View file @
f837a861
This diff is collapsed.
Click to expand it.
gcc/tree.h
View file @
f837a861
This diff is collapsed.
Click to expand it.
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