Backport of GC branch patches part 1: kill eh status saving.
From-SVN: r28357
This commit is contained in:
parent
6261ede720
commit
b384405b34
21 changed files with 644 additions and 637 deletions
|
@ -1,3 +1,47 @@
|
|||
Sat Jul 31 11:10:07 1999 Bernd Schmidt <bernds@cygnus.co.uk>
|
||||
|
||||
* c-pragma.c: Don't include "except.h".
|
||||
* emit-rtl.c: Likewise.
|
||||
* stor-layout.c: Likewise.
|
||||
* tree.c: Likewise.
|
||||
* varasm.c: Likewise.
|
||||
|
||||
* flow.c: Include "function.h".
|
||||
* tree.h (init_dummy_function_start): Declare new function.
|
||||
|
||||
* except.h (struct eh_status): New structure.
|
||||
(struct label_node, struct eh_entry): Declare even if tree.h hasn't
|
||||
been included.
|
||||
(eh_return_stub_label, ehstack, catchstack, ehqueue,
|
||||
catch_clauses, false_label_stack, caught_return_label_stack,
|
||||
protect_list, current_function_ehc): Add accessor macros for the
|
||||
corresponding fields in current_function->eh; delete declarations
|
||||
for all items that used to be declared here.
|
||||
* except.c (eh_return_stub_label, ehstack, catchstack, ehqueue,
|
||||
catch_clauses, false_label_stack, caught_return_label_stack,
|
||||
protect_list, current_function_ehc): Delete variables.
|
||||
(init_eh_for_function): Allocate current_function->eh.
|
||||
(save_eh_status, restore_eh_status): Delete functions.
|
||||
|
||||
* function.h (struct function): Add fields next_global and eh.
|
||||
Delete all exception handling related fields.
|
||||
* function.c (current_function): New variable.
|
||||
(all_functions): New variable.
|
||||
(push_function_context_to): Don't allocate a struct function,
|
||||
use current_function instead. Call init_dummy_function_start when
|
||||
outside a function. Clear current_function before returning.
|
||||
(pop_function_context_from): Restore current_function.
|
||||
Don't free the restored struct function.
|
||||
(prepare_function_start): New function.
|
||||
(init_dummy_function_start): New function.
|
||||
(init_function_start): Break out some code into prepare_function_start
|
||||
and call it here.
|
||||
|
||||
* stmt.c (save_stmt_status): Don't call save_eh_status.
|
||||
(restore_stmt_status): Don't call restore_eh_status.
|
||||
|
||||
* Makefile.in: Update dependencies.
|
||||
|
||||
Sat Jul 31 04:10:01 1999 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* pa.c (compute_frame_size): Use STARTINg_FRAME_OFFSET instead
|
||||
|
|
|
@ -1348,8 +1348,8 @@ c-lex.o : c-lex.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-lex.h c-tree.h \
|
|||
c-aux-info.o : c-aux-info.c $(CONFIG_H) system.h $(TREE_H) c-tree.h \
|
||||
c-common.h flags.h toplev.h
|
||||
c-convert.o : c-convert.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h
|
||||
c-pragma.o: c-pragma.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) except.h \
|
||||
function.h defaults.h c-pragma.h toplev.h
|
||||
c-pragma.o: c-pragma.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) function.h \
|
||||
defaults.h c-pragma.h toplev.h
|
||||
c-iterate.o: c-iterate.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-tree.h \
|
||||
c-common.h flags.h toplev.h $(EXPR_H)
|
||||
mbchar.o: mbchar.c $(CONFIG_H) system.h mbchar.h
|
||||
|
@ -1449,10 +1449,10 @@ prefix.o: prefix.c $(CONFIG_H) system.h Makefile prefix.h
|
|||
|
||||
convert.o: convert.c $(CONFIG_H) $(TREE_H) flags.h convert.h toplev.h
|
||||
|
||||
tree.o : tree.c $(CONFIG_H) system.h $(TREE_H) flags.h function.h toplev.h except.h
|
||||
tree.o : tree.c $(CONFIG_H) system.h $(TREE_H) flags.h function.h toplev.h
|
||||
print-tree.o : print-tree.c $(CONFIG_H) system.h $(TREE_H)
|
||||
stor-layout.o : stor-layout.c $(CONFIG_H) system.h $(TREE_H) flags.h \
|
||||
function.h $(EXPR_H) $(RTL_H) toplev.h except.h
|
||||
function.h $(EXPR_H) $(RTL_H) toplev.h
|
||||
fold-const.o : fold-const.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h \
|
||||
$(RTL_H)
|
||||
toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) \
|
||||
|
@ -1471,7 +1471,7 @@ rtlanal.o : rtlanal.c $(CONFIG_H) system.h $(RTL_H)
|
|||
|
||||
varasm.o : varasm.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) flags.h \
|
||||
function.h defaults.h $(EXPR_H) hard-reg-set.h $(REGS_H) \
|
||||
xcoffout.h output.h c-pragma.h toplev.h except.h dbxout.h sdbout.h
|
||||
xcoffout.h output.h c-pragma.h toplev.h dbxout.h sdbout.h
|
||||
function.o : function.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
|
||||
function.h insn-flags.h insn-codes.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
|
||||
insn-config.h $(RECOG_H) output.h toplev.h except.h hash.h
|
||||
|
@ -1513,7 +1513,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf2.h \
|
|||
xcoffout.o : xcoffout.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) xcoffout.h \
|
||||
flags.h toplev.h output.h dbxout.h
|
||||
emit-rtl.o : emit-rtl.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
|
||||
except.h function.h $(REGS_H) insn-config.h $(RECOG_H) real.h \
|
||||
function.h $(REGS_H) insn-config.h $(RECOG_H) real.h \
|
||||
$(EXPR_H) $(srcdir)/../include/obstack.h hard-reg-set.h bitmap.h toplev.h
|
||||
real.o : real.c $(CONFIG_H) system.h $(TREE_H) toplev.h
|
||||
getpwd.o : getpwd.c $(CONFIG_H) system.h
|
||||
|
@ -1547,7 +1547,7 @@ unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
|
|||
integrate.h $(REGS_H) $(RECOG_H) flags.h $(EXPR_H) loop.h toplev.h varray.h
|
||||
flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) flags.h insn-config.h \
|
||||
$(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h recog.h \
|
||||
insn-flags.h
|
||||
insn-flags.h function.h
|
||||
combine.o : combine.c $(CONFIG_H) system.h $(RTL_H) flags.h \
|
||||
insn-config.h insn-flags.h insn-codes.h insn-attr.h $(REGS_H) $(EXPR_H) \
|
||||
$(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h
|
||||
|
|
|
@ -22,7 +22,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "system.h"
|
||||
#include "rtl.h"
|
||||
#include "tree.h"
|
||||
#include "except.h"
|
||||
#include "function.h"
|
||||
#include "defaults.h"
|
||||
#include "c-pragma.h"
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
1999-07-31 Bernd Schmidt <bernds@cygnus.co.uk>
|
||||
|
||||
* except.c (catch_clauses): Delete declaration.
|
||||
|
||||
1999-07-30 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* call.c (build_conditional_expr): Call convert_from_reference to
|
||||
|
|
|
@ -169,17 +169,6 @@ static tree Unwind;
|
|||
|
||||
/* ========================================================================= */
|
||||
|
||||
|
||||
|
||||
/* local globals - these local globals are for storing data necessary for
|
||||
generating the exception table and code in the correct order.
|
||||
|
||||
========================================================================= */
|
||||
|
||||
extern rtx catch_clauses;
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
/* sets up all the global eh stuff that needs to be initialized at the
|
||||
start of compilation.
|
||||
|
||||
|
|
|
@ -40,7 +40,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "rtl.h"
|
||||
#include "tree.h"
|
||||
#include "flags.h"
|
||||
#include "except.h"
|
||||
#include "function.h"
|
||||
#include "expr.h"
|
||||
#include "regs.h"
|
||||
|
|
113
gcc/except.c
113
gcc/except.c
|
@ -428,70 +428,11 @@ int protect_cleanup_actions_with_terminate;
|
|||
|
||||
rtx exception_handler_labels;
|
||||
|
||||
/* The EH context. Nonzero if the function has already
|
||||
fetched a pointer to the EH context for exception handling. */
|
||||
|
||||
rtx current_function_ehc;
|
||||
|
||||
/* A stack used for keeping track of the currently active exception
|
||||
handling region. As each exception region is started, an entry
|
||||
describing the region is pushed onto this stack. The current
|
||||
region can be found by looking at the top of the stack, and as we
|
||||
exit regions, the corresponding entries are popped.
|
||||
|
||||
Entries cannot overlap; they can be nested. So there is only one
|
||||
entry at most that corresponds to the current instruction, and that
|
||||
is the entry on the top of the stack. */
|
||||
|
||||
static struct eh_stack ehstack;
|
||||
|
||||
|
||||
/* This stack is used to represent what the current eh region is
|
||||
for the catch blocks beings processed */
|
||||
|
||||
static struct eh_stack catchstack;
|
||||
|
||||
/* A queue used for tracking which exception regions have closed but
|
||||
whose handlers have not yet been expanded. Regions are emitted in
|
||||
groups in an attempt to improve paging performance.
|
||||
|
||||
As we exit a region, we enqueue a new entry. The entries are then
|
||||
dequeued during expand_leftover_cleanups and expand_start_all_catch,
|
||||
|
||||
We should redo things so that we either take RTL for the handler,
|
||||
or we expand the handler expressed as a tree immediately at region
|
||||
end time. */
|
||||
|
||||
static struct eh_queue ehqueue;
|
||||
|
||||
/* Insns for all of the exception handlers for the current function.
|
||||
They are currently emitted by the frontend code. */
|
||||
|
||||
rtx catch_clauses;
|
||||
|
||||
/* A TREE_CHAINed list of handlers for regions that are not yet
|
||||
closed. The TREE_VALUE of each entry contains the handler for the
|
||||
corresponding entry on the ehstack. */
|
||||
|
||||
static tree protect_list;
|
||||
|
||||
/* Stacks to keep track of various labels. */
|
||||
|
||||
/* Keeps track of the label to resume to should one want to resume
|
||||
normal control flow out of a handler (instead of, say, returning to
|
||||
the caller of the current function or exiting the program). */
|
||||
|
||||
struct label_node *caught_return_label_stack = NULL;
|
||||
|
||||
/* Keeps track of the label used as the context of a throw to rethrow an
|
||||
exception to the outer exception region. */
|
||||
|
||||
struct label_node *outer_context_label_stack = NULL;
|
||||
|
||||
/* A random data area for the front end's own use. */
|
||||
|
||||
struct label_node *false_label_stack = NULL;
|
||||
|
||||
/* Pseudos used to hold exception return data in the interim between
|
||||
__builtin_eh_return and the end of the function. */
|
||||
|
||||
|
@ -499,11 +440,6 @@ static rtx eh_return_context;
|
|||
static rtx eh_return_stack_adjust;
|
||||
static rtx eh_return_handler;
|
||||
|
||||
/* Used to mark the eh return stub for flow, so that the Right Thing
|
||||
happens with the values for the hardregs therin. */
|
||||
|
||||
rtx eh_return_stub_label;
|
||||
|
||||
/* This is used for targets which can call rethrow with an offset instead
|
||||
of an address. This is subtracted from the rethrow label we are
|
||||
interested in. */
|
||||
|
@ -2415,6 +2351,8 @@ init_eh ()
|
|||
void
|
||||
init_eh_for_function ()
|
||||
{
|
||||
current_function->eh = (struct eh_status *) xmalloc (sizeof (struct eh_status));
|
||||
|
||||
ehstack.top = 0;
|
||||
catchstack.top = 0;
|
||||
ehqueue.head = ehqueue.tail = 0;
|
||||
|
@ -2428,53 +2366,6 @@ init_eh_for_function ()
|
|||
eh_return_handler = NULL_RTX;
|
||||
eh_return_stub_label = NULL_RTX;
|
||||
}
|
||||
|
||||
/* Save some of the per-function EH info into the save area denoted by
|
||||
P.
|
||||
|
||||
This is currently called from save_stmt_status. */
|
||||
|
||||
void
|
||||
save_eh_status (p)
|
||||
struct function *p;
|
||||
{
|
||||
if (p == NULL)
|
||||
abort ();
|
||||
|
||||
p->ehstack = ehstack;
|
||||
p->catchstack = catchstack;
|
||||
p->ehqueue = ehqueue;
|
||||
p->catch_clauses = catch_clauses;
|
||||
p->false_label_stack = false_label_stack;
|
||||
p->caught_return_label_stack = caught_return_label_stack;
|
||||
p->protect_list = protect_list;
|
||||
p->ehc = current_function_ehc;
|
||||
p->eh_return_stub_label = eh_return_stub_label;
|
||||
|
||||
init_eh_for_function ();
|
||||
}
|
||||
|
||||
/* Restore the per-function EH info saved into the area denoted by P.
|
||||
|
||||
This is currently called from restore_stmt_status. */
|
||||
|
||||
void
|
||||
restore_eh_status (p)
|
||||
struct function *p;
|
||||
{
|
||||
if (p == NULL)
|
||||
abort ();
|
||||
|
||||
protect_list = p->protect_list;
|
||||
caught_return_label_stack = p->caught_return_label_stack;
|
||||
false_label_stack = p->false_label_stack;
|
||||
catch_clauses = p->catch_clauses;
|
||||
ehqueue = p->ehqueue;
|
||||
ehstack = p->ehstack;
|
||||
catchstack = p->catchstack;
|
||||
current_function_ehc = p->ehc;
|
||||
eh_return_stub_label = p->eh_return_stub_label;
|
||||
}
|
||||
|
||||
/* This section is for the exception handling specific optimization
|
||||
pass. First are the internal routines, and then the main
|
||||
|
|
80
gcc/except.h
80
gcc/except.h
|
@ -24,10 +24,6 @@ typedef struct rtx_def *_except_rtx;
|
|||
#define rtx _except_rtx
|
||||
#endif
|
||||
|
||||
/* The label generated by expand_builtin_eh_return. */
|
||||
|
||||
extern rtx eh_return_stub_label;
|
||||
|
||||
#ifdef TREE_CODE
|
||||
|
||||
/* A stack of labels. CHAIN points to the next entry in the stack. */
|
||||
|
@ -67,6 +63,10 @@ struct eh_entry {
|
|||
rtx false_label;
|
||||
rtx rethrow_label;
|
||||
};
|
||||
#else
|
||||
struct label_node;
|
||||
struct eh_entry;
|
||||
#endif
|
||||
|
||||
/* A list of EH_ENTRYs. ENTRY is the entry; CHAIN points to the next
|
||||
entry in the list, or is NULL if this is the last entry. */
|
||||
|
@ -92,6 +92,64 @@ struct eh_queue {
|
|||
struct eh_node *tail;
|
||||
};
|
||||
|
||||
/* Used to save exception handling status for each function. */
|
||||
struct eh_status
|
||||
{
|
||||
/* A stack used for keeping track of the currently active exception
|
||||
handling region. As each exception region is started, an entry
|
||||
describing the region is pushed onto this stack. The current
|
||||
region can be found by looking at the top of the stack, and as we
|
||||
exit regions, the corresponding entries are popped.
|
||||
|
||||
Entries cannot overlap; they can be nested. So there is only one
|
||||
entry at most that corresponds to the current instruction, and that
|
||||
is the entry on the top of the stack. */
|
||||
struct eh_stack x_ehstack;
|
||||
/* This stack is used to represent what the current eh region is
|
||||
for the catch blocks beings processed */
|
||||
struct eh_stack x_catchstack;
|
||||
/* A queue used for tracking which exception regions have closed but
|
||||
whose handlers have not yet been expanded. Regions are emitted in
|
||||
groups in an attempt to improve paging performance.
|
||||
|
||||
As we exit a region, we enqueue a new entry. The entries are then
|
||||
dequeued during expand_leftover_cleanups and expand_start_all_catch,
|
||||
|
||||
We should redo things so that we either take RTL for the handler,
|
||||
or we expand the handler expressed as a tree immediately at region
|
||||
end time. */
|
||||
struct eh_queue x_ehqueue;
|
||||
/* Insns for all of the exception handlers for the current function.
|
||||
They are currently emitted by the frontend code. */
|
||||
rtx x_catch_clauses;
|
||||
/* A random data area for the front end's own use. */
|
||||
struct label_node *x_false_label_stack;
|
||||
/* Keeps track of the label to resume to should one want to resume
|
||||
normal control flow out of a handler (instead of, say, returning to
|
||||
the caller of the current function or exiting the program). */
|
||||
struct label_node *x_caught_return_label_stack;
|
||||
/* A TREE_CHAINed list of handlers for regions that are not yet
|
||||
closed. The TREE_VALUE of each entry contains the handler for the
|
||||
corresponding entry on the ehstack. */
|
||||
union tree_node *x_protect_list;
|
||||
/* The EH context. Nonzero if the function has already
|
||||
fetched a pointer to the EH context for exception handling. */
|
||||
rtx ehc;
|
||||
/* The label generated by expand_builtin_eh_return. */
|
||||
rtx x_eh_return_stub_label;
|
||||
};
|
||||
|
||||
#define ehstack (current_function->eh->x_ehstack)
|
||||
#define catchstack (current_function->eh->x_catchstack)
|
||||
#define ehqueue (current_function->eh->x_ehqueue)
|
||||
#define catch_clauses (current_function->eh->x_catch_clauses)
|
||||
#define false_label_stack (current_function->eh->x_false_label_stack)
|
||||
#define caught_return_label_stack (current_function->eh->x_caught_return_label_stack)
|
||||
#define protect_list (current_function->eh->x_protect_list)
|
||||
#define current_function_ehc (current_function->eh->ehc)
|
||||
#define eh_return_stub_label (current_function->eh->x_eh_return_stub_label)
|
||||
|
||||
#ifdef TREE_CODE
|
||||
/* Start an exception handling region. All instructions emitted after
|
||||
this point are considered to be part of the region until
|
||||
expand_eh_region_end () is invoked. */
|
||||
|
@ -145,11 +203,6 @@ extern rtx pop_label_entry PROTO((struct label_node **labelstack));
|
|||
|
||||
extern tree top_label_entry PROTO((struct label_node **labelstack));
|
||||
|
||||
/* A set of insns for the catch clauses in the current function. They
|
||||
will be emitted at the end of the current function. */
|
||||
|
||||
extern rtx catch_clauses;
|
||||
|
||||
#endif
|
||||
|
||||
/* Test: is exception handling turned on? */
|
||||
|
@ -318,20 +371,11 @@ extern int is_exception_handler_label PROTO((int));
|
|||
|
||||
extern void check_exception_handler_labels PROTO((void));
|
||||
|
||||
/* A stack used to keep track of the label used to resume normal program
|
||||
flow out of the current exception handler region. */
|
||||
|
||||
extern struct label_node *caught_return_label_stack;
|
||||
|
||||
/* Keeps track of the label used as the context of a throw to rethrow an
|
||||
exception to the outer exception region. */
|
||||
|
||||
extern struct label_node *outer_context_label_stack;
|
||||
|
||||
/* A random area used for purposes elsewhere. */
|
||||
|
||||
extern struct label_node *false_label_stack;
|
||||
|
||||
/* A list of labels used for exception handlers. It is created by
|
||||
find_exception_handler_labels for the optimization passes. */
|
||||
|
||||
|
|
|
@ -127,6 +127,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "hard-reg-set.h"
|
||||
#include "flags.h"
|
||||
#include "output.h"
|
||||
#include "function.h"
|
||||
#include "except.h"
|
||||
#include "toplev.h"
|
||||
#include "recog.h"
|
||||
|
|
113
gcc/function.c
113
gcc/function.c
|
@ -370,6 +370,12 @@ void (*restore_machine_status) PROTO((struct function *));
|
|||
|
||||
extern int rtx_equal_function_value_matters;
|
||||
extern tree sequence_rtl_expr;
|
||||
|
||||
/* The currently compiled function. */
|
||||
struct function *current_function = 0;
|
||||
|
||||
/* Global list of all compiled functions. */
|
||||
struct function *all_functions = 0;
|
||||
|
||||
/* In order to evaluate some expressions, such as function calls returning
|
||||
structures in memory, we need to temporarily allocate stack locations.
|
||||
|
@ -551,7 +557,11 @@ void
|
|||
push_function_context_to (context)
|
||||
tree context;
|
||||
{
|
||||
struct function *p = (struct function *) xmalloc (sizeof (struct function));
|
||||
struct function *p;
|
||||
|
||||
if (current_function == 0)
|
||||
init_dummy_function_start ();
|
||||
p = current_function;
|
||||
|
||||
p->next = outer_function_chain;
|
||||
outer_function_chain = p;
|
||||
|
@ -620,6 +630,8 @@ push_function_context_to (context)
|
|||
save_varasm_status (p, context);
|
||||
if (save_machine_status)
|
||||
(*save_machine_status) (p);
|
||||
|
||||
current_function = 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -638,6 +650,7 @@ pop_function_context_from (context)
|
|||
struct function *p = outer_function_chain;
|
||||
struct var_refs_queue *queue;
|
||||
|
||||
current_function = p;
|
||||
outer_function_chain = p->next;
|
||||
|
||||
current_function_contains_functions
|
||||
|
@ -714,8 +727,6 @@ pop_function_context_from (context)
|
|||
fixup_var_refs (queue->modified, queue->promoted_mode,
|
||||
queue->unsignedp, 0);
|
||||
|
||||
free (p);
|
||||
|
||||
/* Reset variables that have known state during rtx generation. */
|
||||
rtx_equal_function_value_matters = 1;
|
||||
virtuals_instantiated = 0;
|
||||
|
@ -5869,16 +5880,12 @@ all_blocks (block, vector)
|
|||
return n_blocks;
|
||||
}
|
||||
|
||||
/* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
|
||||
and initialize static variables for generating RTL for the statements
|
||||
of the function. */
|
||||
|
||||
void
|
||||
init_function_start (subr, filename, line)
|
||||
tree subr;
|
||||
char *filename;
|
||||
int line;
|
||||
/* Allocate a function structure and reset its contents to the defaults. */
|
||||
static void
|
||||
prepare_function_start ()
|
||||
{
|
||||
current_function = (struct function *) xcalloc (1, sizeof (struct function));
|
||||
|
||||
init_stmt_for_function ();
|
||||
|
||||
cse_not_expected = ! optimize;
|
||||
|
@ -5889,6 +5896,9 @@ init_function_start (subr, filename, line)
|
|||
/* No stack slots have been made yet. */
|
||||
stack_slot_list = 0;
|
||||
|
||||
current_function_has_nonlocal_label = 0;
|
||||
current_function_has_nonlocal_goto = 0;
|
||||
|
||||
/* There is no stack slot for handling nonlocal gotos. */
|
||||
nonlocal_goto_handler_slots = 0;
|
||||
nonlocal_goto_stack_level = 0;
|
||||
|
@ -5910,20 +5920,12 @@ init_function_start (subr, filename, line)
|
|||
/* Initialize the queue of pending postincrement and postdecrements,
|
||||
and some other info in expr.c. */
|
||||
init_expr ();
|
||||
|
||||
|
||||
/* We haven't done register allocation yet. */
|
||||
reg_renumber = 0;
|
||||
|
||||
init_const_rtx_hash_table ();
|
||||
|
||||
current_function_name = (*decl_printable_name) (subr, 2);
|
||||
|
||||
/* Nonzero if this is a nested function that uses a static chain. */
|
||||
|
||||
current_function_needs_context
|
||||
= (decl_function_context (current_function_decl) != 0
|
||||
&& ! DECL_NO_STATIC_CHAIN (current_function_decl));
|
||||
|
||||
/* Set if a call to setjmp is seen. */
|
||||
current_function_calls_setjmp = 0;
|
||||
|
||||
|
@ -5931,8 +5933,6 @@ init_function_start (subr, filename, line)
|
|||
current_function_calls_longjmp = 0;
|
||||
|
||||
current_function_calls_alloca = 0;
|
||||
current_function_has_nonlocal_label = 0;
|
||||
current_function_has_nonlocal_goto = 0;
|
||||
current_function_contains_functions = 0;
|
||||
current_function_is_leaf = 0;
|
||||
current_function_sp_is_unchanging = 0;
|
||||
|
@ -5951,7 +5951,6 @@ init_function_start (subr, filename, line)
|
|||
tail_recursion_label = 0;
|
||||
|
||||
/* We haven't had a need to make a save area for ap yet. */
|
||||
|
||||
arg_pointer_save_area = 0;
|
||||
|
||||
/* No stack slots allocated yet. */
|
||||
|
@ -5966,8 +5965,19 @@ init_function_start (subr, filename, line)
|
|||
/* Set up to allocate temporaries. */
|
||||
init_temp_slots ();
|
||||
|
||||
/* Within function body, compute a type's size as soon it is laid out. */
|
||||
immediate_size_expand++;
|
||||
/* Indicate that we need to distinguish between the return value of the
|
||||
present function and the return value of a function being called. */
|
||||
rtx_equal_function_value_matters = 1;
|
||||
|
||||
/* Indicate that we have not instantiated virtual registers yet. */
|
||||
virtuals_instantiated = 0;
|
||||
|
||||
/* Indicate we have no need of a frame pointer yet. */
|
||||
frame_pointer_needed = 0;
|
||||
|
||||
/* By default assume not varargs or stdarg. */
|
||||
current_function_varargs = 0;
|
||||
current_function_stdarg = 0;
|
||||
|
||||
/* We haven't made any trampolines for this function yet. */
|
||||
trampoline_list = 0;
|
||||
|
@ -5976,6 +5986,43 @@ init_function_start (subr, filename, line)
|
|||
inhibit_defer_pop = 0;
|
||||
|
||||
current_function_outgoing_args_size = 0;
|
||||
}
|
||||
|
||||
/* Initialize the rtl expansion mechanism so that we can do simple things
|
||||
like generate sequences. This is used to provide a context during global
|
||||
initialization of some passes. */
|
||||
void
|
||||
init_dummy_function_start ()
|
||||
{
|
||||
prepare_function_start ();
|
||||
}
|
||||
|
||||
/* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
|
||||
and initialize static variables for generating RTL for the statements
|
||||
of the function. */
|
||||
|
||||
void
|
||||
init_function_start (subr, filename, line)
|
||||
tree subr;
|
||||
char *filename;
|
||||
int line;
|
||||
{
|
||||
prepare_function_start ();
|
||||
|
||||
/* Remember this function for later. */
|
||||
current_function->next_global = all_functions;
|
||||
all_functions = current_function;
|
||||
|
||||
current_function_name = (*decl_printable_name) (subr, 2);
|
||||
|
||||
/* Nonzero if this is a nested function that uses a static chain. */
|
||||
|
||||
current_function_needs_context
|
||||
= (decl_function_context (current_function_decl) != 0
|
||||
&& ! DECL_NO_STATIC_CHAIN (current_function_decl));
|
||||
|
||||
/* Within function body, compute a type's size as soon it is laid out. */
|
||||
immediate_size_expand++;
|
||||
|
||||
/* Prevent ever trying to delete the first instruction of a function.
|
||||
Also tell final how to output a linenum before the function prologue.
|
||||
|
@ -6005,20 +6052,6 @@ init_function_start (subr, filename, line)
|
|||
|
||||
current_function_returns_pointer
|
||||
= POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (subr)));
|
||||
|
||||
/* Indicate that we need to distinguish between the return value of the
|
||||
present function and the return value of a function being called. */
|
||||
rtx_equal_function_value_matters = 1;
|
||||
|
||||
/* Indicate that we have not instantiated virtual registers yet. */
|
||||
virtuals_instantiated = 0;
|
||||
|
||||
/* Indicate we have no need of a frame pointer yet. */
|
||||
frame_pointer_needed = 0;
|
||||
|
||||
/* By default assume not varargs or stdarg. */
|
||||
current_function_varargs = 0;
|
||||
current_function_stdarg = 0;
|
||||
}
|
||||
|
||||
/* Indicate that the current function uses extra args
|
||||
|
|
|
@ -64,8 +64,11 @@ struct simple_obstack_stack
|
|||
|
||||
struct function
|
||||
{
|
||||
struct function *next_global;
|
||||
struct function *next;
|
||||
|
||||
struct eh_status *eh;
|
||||
|
||||
/* For function.c. */
|
||||
char *name;
|
||||
tree decl;
|
||||
|
@ -137,17 +140,6 @@ struct function
|
|||
int emit_lineno;
|
||||
struct goto_fixup *goto_fixup_chain;
|
||||
|
||||
/* For exception handling information. */
|
||||
struct eh_stack ehstack;
|
||||
struct eh_stack catchstack;
|
||||
struct eh_queue ehqueue;
|
||||
rtx catch_clauses;
|
||||
struct label_node *false_label_stack;
|
||||
struct label_node *caught_return_label_stack;
|
||||
tree protect_list;
|
||||
rtx ehc;
|
||||
rtx eh_return_stub_label;
|
||||
|
||||
/* For expr.c. */
|
||||
rtx pending_chain;
|
||||
int pending_stack_adjust;
|
||||
|
@ -214,6 +206,9 @@ struct function
|
|||
rtx const_double_chain;
|
||||
};
|
||||
|
||||
extern struct function *current_function;
|
||||
extern struct function *all_functions;
|
||||
|
||||
/* The FUNCTION_DECL for an inline function currently being expanded. */
|
||||
extern tree inline_function_decl;
|
||||
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
1999-07-31 Bernd Schmidt <bernds@cygnus.co.uk>
|
||||
|
||||
* decl.c: Include "function.h".
|
||||
* except.c: Likewise.
|
||||
* parse.y: Likewise.
|
||||
* Makefile.in: Update dependencies.
|
||||
|
||||
1999-07-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* expr.c (build_java_soft_divmod): Provide a default case in switch.
|
||||
|
|
|
@ -273,7 +273,8 @@ clean: mostlyclean
|
|||
|
||||
force:
|
||||
|
||||
parse.o : $(PARSE_C) jcf-reader.c $(CONFIG_H) $(srcdir)/../system.h
|
||||
parse.o : $(PARSE_C) jcf-reader.c $(CONFIG_H) $(srcdir)/../system.h \
|
||||
$(srcdir)/../function.h
|
||||
jcf-dump.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) jcf-dump.c \
|
||||
jcf-reader.c jcf.h javaop.h javaop.def
|
||||
gjavah.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) gjavah.c \
|
||||
|
@ -289,10 +290,11 @@ class.o : class.c $(CONFIG_H) $(JAVA_TREE_H) $(RTL_H) jcf.h $(PARSE_H) \
|
|||
constants.o : constants.c $(CONFIG_H) $(JAVA_TREE_H) jcf.h \
|
||||
$(srcdir)/../toplev.h $(srcdir)/../system.h
|
||||
decl.o : decl.c $(CONFIG_H) $(JAVA_TREE_H) jcf.h \
|
||||
$(srcdir)/../toplev.h $(srcdir)/../system.h
|
||||
$(srcdir)/../toplev.h $(srcdir)/../system.h $(srcdir)/../function.h
|
||||
except.o : except.c $(CONFIG_H) $(JAVA_TREE_H) jcf.h $(srcdir)/../real.h \
|
||||
$(RTL_H) javaop.h java-opcodes.h $(srcdir)/../except.h java-except.h \
|
||||
$(srcdir)/../eh-common.h $(srcdir)/../toplev.h $(srcdir)/../system.h
|
||||
$(srcdir)/../eh-common.h $(srcdir)/../toplev.h $(srcdir)/../system.h \
|
||||
$(srcdir)/../function.h
|
||||
expr.o : expr.c $(CONFIG_H) $(JAVA_TREE_H) jcf.h $(srcdir)/../real.h \
|
||||
$(RTL_H) $(EXPR_H) javaop.h java-opcodes.h $(srcdir)/../except.h \
|
||||
java-except.h java-except.h parse.h $(srcdir)/../toplev.h \
|
||||
|
|
|
@ -32,6 +32,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
|
|||
#include "java-tree.h"
|
||||
#include "jcf.h"
|
||||
#include "toplev.h"
|
||||
#include "function.h"
|
||||
#include "except.h"
|
||||
|
||||
static tree push_jvm_slot PROTO ((int, tree));
|
||||
|
|
|
@ -31,6 +31,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
|
|||
#include "javaop.h"
|
||||
#include "java-opcodes.h"
|
||||
#include "jcf.h"
|
||||
#include "function.h"
|
||||
#include "except.h"
|
||||
#include "java-except.h"
|
||||
#include "eh-common.h"
|
||||
|
|
859
gcc/java/parse.c
859
gcc/java/parse.c
File diff suppressed because it is too large
Load diff
|
@ -62,6 +62,7 @@ definitions and other extensions. */
|
|||
#include "convert.h"
|
||||
#include "buffer.h"
|
||||
#include "xref.h"
|
||||
#include "function.h"
|
||||
#include "except.h"
|
||||
|
||||
#ifndef DIR_SEPARATOR
|
||||
|
|
|
@ -467,7 +467,6 @@ save_stmt_status (p)
|
|||
p->emit_filename = emit_filename;
|
||||
p->emit_lineno = emit_lineno;
|
||||
p->goto_fixup_chain = goto_fixup_chain;
|
||||
save_eh_status (p);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -488,7 +487,6 @@ restore_stmt_status (p)
|
|||
emit_filename = p->emit_filename;
|
||||
emit_lineno = p->emit_lineno;
|
||||
goto_fixup_chain = p->goto_fixup_chain;
|
||||
restore_eh_status (p);
|
||||
}
|
||||
|
||||
/* Emit a no-op instruction. */
|
||||
|
|
|
@ -25,7 +25,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "tree.h"
|
||||
#include "rtl.h"
|
||||
#include "flags.h"
|
||||
#include "except.h"
|
||||
#include "function.h"
|
||||
#include "expr.h"
|
||||
#include "toplev.h"
|
||||
|
|
|
@ -37,7 +37,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "system.h"
|
||||
#include "flags.h"
|
||||
#include "tree.h"
|
||||
#include "except.h"
|
||||
#include "function.h"
|
||||
#include "obstack.h"
|
||||
#include "toplev.h"
|
||||
|
|
|
@ -33,7 +33,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "rtl.h"
|
||||
#include "tree.h"
|
||||
#include "flags.h"
|
||||
#include "except.h"
|
||||
#include "function.h"
|
||||
#include "expr.h"
|
||||
#include "output.h"
|
||||
|
|
Loading…
Add table
Reference in a new issue