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
d93d4205
Commit
d93d4205
authored
Jul 08, 1994
by
Mike Stump
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix temp lifetime (FOR TARGET_EXPRs only)
From-SVN: r7681
parent
311862c8
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
36 additions
and
6 deletions
+36
-6
gcc/expr.c
+15
-1
gcc/expr.h
+6
-0
gcc/function.c
+15
-5
No files found.
gcc/expr.c
View file @
d93d4205
...
...
@@ -95,6 +95,12 @@ int inhibit_defer_pop;
function calls being expanded by expand_call. */
tree
cleanups_this_call
;
/* When temporaries are created by TARGET_EXPRs, they are created at
this level of temp_slot_level, so that they can remain allocated
until no longer needed. CLEANUP_POINT_EXPRs define the lifetime
of TARGET_EXPRs. */
int
target_temp_slot_level
;
/* Nonzero means __builtin_saveregs has already been done in this function.
The value is the pseudoreg containing the value __builtin_saveregs
returned. */
...
...
@@ -4623,9 +4629,17 @@ expand_expr (exp, target, tmode, modifier)
case
CLEANUP_POINT_EXPR
:
{
extern
int
temp_slot_level
;
tree
old_cleanups
=
cleanups_this_call
;
int
old_temp_level
=
target_temp_slot_level
;
push_temp_slots
();
target_temp_slot_level
=
temp_slot_level
;
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
target
,
VOIDmode
,
modifier
);
expand_cleanups_to
(
old_cleanups
);
preserve_temp_slots
(
op0
);
free_temp_slots
();
pop_temp_slots
();
target_temp_slot_level
=
old_temp_level
;
}
return
op0
;
...
...
@@ -5695,7 +5709,7 @@ expand_expr (exp, target, tmode, modifier)
}
else
{
target
=
assign_stack_temp
(
mode
,
int_size_in_bytes
(
type
),
0
);
target
=
assign_stack_temp
(
mode
,
int_size_in_bytes
(
type
),
2
);
/* All temp slots at this level must not conflict. */
preserve_temp_slots
(
target
);
DECL_RTL
(
slot
)
=
target
;
...
...
gcc/expr.h
View file @
d93d4205
...
...
@@ -119,6 +119,12 @@ extern int pending_stack_adjust;
#ifdef TREE_CODE
/* Don't lose if tree.h not included. */
extern
tree
cleanups_this_call
;
#endif
/* When temporaries are created by TARGET_EXPRs, they are created at
this level of temp_slot_level, so that they can remain allocated
until no longer needed. CLEANUP_POINT_EXPRs define the lifetime
of TARGET_EXPRs. */
extern
int
target_temp_slot_level
;
#ifdef TREE_CODE
/* Don't lose if tree.h not included. */
/* Structure to record the size of a sequence of arguments
...
...
gcc/function.c
View file @
d93d4205
...
...
@@ -771,9 +771,10 @@ assign_outer_stack_local (mode, size, align, function)
SIZE is the size in units of the space required. We do no rounding here
since assign_stack_local will do any required rounding.
KEEP is non-zero if this slot is to be retained after a call to
free_temp_slots. Automatic variables for a block are allocated with this
flag. */
KEEP is 1 if this slot is to be retained after a call to
free_temp_slots. Automatic variables for a block are allocated
with this flag. KEEP is 2, if we allocate a longer term temporary,
whose lifetime is controlled by CLEANUP_POINT_EXPRs. */
rtx
assign_stack_temp
(
mode
,
size
,
keep
)
...
...
@@ -845,8 +846,16 @@ assign_stack_temp (mode, size, keep)
p
->
in_use
=
1
;
p
->
rtl_expr
=
sequence_rtl_expr
;
p
->
level
=
temp_slot_level
;
p
->
keep
=
keep
;
if
(
keep
==
2
)
{
p
->
level
=
target_temp_slot_level
;
p
->
keep
=
0
;
}
else
{
p
->
level
=
temp_slot_level
;
p
->
keep
=
keep
;
}
return
p
->
slot
;
}
...
...
@@ -4615,6 +4624,7 @@ init_function_start (subr, filename, line)
/* We have not allocated any temporaries yet. */
temp_slots
=
0
;
temp_slot_level
=
0
;
target_temp_slot_level
=
0
;
/* Within function body, compute a type's size as soon it is laid out. */
immediate_size_expand
++
;
...
...
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