Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
0d5be817
Commit
0d5be817
authored
Apr 10, 2006
by
Michael Beck
Browse files
be_Return nodes now have an attribute telling the number of "real" return values
parent
392c5a01
Changes
3
Hide whitespace changes
Inline
Side-by-side
ir/be/beabi.c
View file @
0d5be817
...
...
@@ -1181,7 +1181,7 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, i
stack
=
be_abi_reg_map_get
(
env
->
regs
,
isa
->
sp
);
if
(
keep
)
{
stack
=
get_irn_n
(
keep
,
0
);
set_irn_n
(
keep
,
0
,
new_r_Bad
(
env
->
birg
->
irg
));
exchange
(
keep
,
new_r_Bad
(
env
->
birg
->
irg
));
}
be_abi_reg_map_set
(
reg_map
,
isa
->
sp
,
stack
);
...
...
@@ -1241,7 +1241,7 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, i
}
/* The in array for the new back end return is now ready. */
ret
=
be_new_Return
(
irn
?
get_irn_dbg_info
(
irn
)
:
NULL
,
env
->
birg
->
irg
,
bl
,
n
,
in
);
ret
=
be_new_Return
(
irn
?
get_irn_dbg_info
(
irn
)
:
NULL
,
env
->
birg
->
irg
,
bl
,
n_res
,
n
,
in
);
/* Set the register classes of the return's parameter accordingly. */
for
(
i
=
0
;
i
<
n
;
++
i
)
...
...
ir/be/benode.c
View file @
0d5be817
...
...
@@ -90,6 +90,12 @@ typedef struct {
be_reg_data_t
*
reg_data
;
}
be_node_attr_t
;
/** The be_Return nodes attribute type. */
typedef
struct
{
be_node_attr_t
node_attr
;
int
num_ret_vals
;
/**< number of return values */
}
be_return_attr_t
;
/** The be_Stack attribute type. */
typedef
struct
{
be_node_attr_t
node_attr
;
...
...
@@ -163,23 +169,23 @@ void be_node_init(void) {
/* Acquire all needed opcodes. */
beo_base
=
get_next_ir_opcodes
(
beo_Last
-
1
);
op_be_Spill
=
new_ir_op
(
beo_base
+
beo_Spill
,
"be_Spill"
,
op_pin_state_mem_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_spill_attr_t
),
&
be_node_op_ops
);
op_be_Reload
=
new_ir_op
(
beo_base
+
beo_Reload
,
"be_Reload"
,
op_pin_state_mem_pinned
,
N
,
oparity_zero
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_Perm
=
new_ir_op
(
beo_base
+
beo_Perm
,
"be_Perm"
,
op_pin_state_pinned
,
N
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Copy
=
new_ir_op
(
beo_base
+
beo_Copy
,
"be_Copy"
,
op_pin_state_floats
,
N
,
oparity_unary
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Keep
=
new_ir_op
(
beo_base
+
beo_Keep
,
"be_Keep"
,
op_pin_state_pinned
,
K
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_CopyKeep
=
new_ir_op
(
beo_base
+
beo_CopyKeep
,
"be_CopyKeep"
,
op_pin_state_pinned
,
K
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Call
=
new_ir_op
(
beo_base
+
beo_Call
,
"be_Call"
,
op_pin_state_pinned
,
N
,
oparity_variable
,
0
,
sizeof
(
be_call_attr_t
),
&
be_node_op_ops
);
op_be_Return
=
new_ir_op
(
beo_base
+
beo_Return
,
"be_Return"
,
op_pin_state_pinned
,
X
,
oparity_variable
,
0
,
sizeof
(
be_
node
_attr_t
),
&
be_node_op_ops
);
op_be_AddSP
=
new_ir_op
(
beo_base
+
beo_AddSP
,
"be_AddSP"
,
op_pin_state_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_SetSP
=
new_ir_op
(
beo_base
+
beo_SetSP
,
"be_SetSP"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_stack_attr_t
),
&
be_node_op_ops
);
op_be_IncSP
=
new_ir_op
(
beo_base
+
beo_IncSP
,
"be_IncSP"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_stack_attr_t
),
&
be_node_op_ops
);
op_be_RegParams
=
new_ir_op
(
beo_base
+
beo_RegParams
,
"be_RegParams"
,
op_pin_state_pinned
,
N
,
oparity_zero
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_StackParam
=
new_ir_op
(
beo_base
+
beo_StackParam
,
"be_StackParam"
,
op_pin_state_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameAddr
=
new_ir_op
(
beo_base
+
beo_FrameAddr
,
"be_FrameAddr"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameLoad
=
new_ir_op
(
beo_base
+
beo_FrameLoad
,
"be_FrameLoad"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameStore
=
new_ir_op
(
beo_base
+
beo_FrameStore
,
"be_FrameStore"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_Barrier
=
new_ir_op
(
beo_base
+
beo_Barrier
,
"be_Barrier"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Spill
=
new_ir_op
(
beo_base
+
beo_Spill
,
"be_Spill"
,
op_pin_state_mem_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_spill_attr_t
),
&
be_node_op_ops
);
op_be_Reload
=
new_ir_op
(
beo_base
+
beo_Reload
,
"be_Reload"
,
op_pin_state_mem_pinned
,
N
,
oparity_zero
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_Perm
=
new_ir_op
(
beo_base
+
beo_Perm
,
"be_Perm"
,
op_pin_state_pinned
,
N
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Copy
=
new_ir_op
(
beo_base
+
beo_Copy
,
"be_Copy"
,
op_pin_state_floats
,
N
,
oparity_unary
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Keep
=
new_ir_op
(
beo_base
+
beo_Keep
,
"be_Keep"
,
op_pin_state_pinned
,
K
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_CopyKeep
=
new_ir_op
(
beo_base
+
beo_CopyKeep
,
"be_CopyKeep"
,
op_pin_state_pinned
,
K
,
oparity_variable
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_Call
=
new_ir_op
(
beo_base
+
beo_Call
,
"be_Call"
,
op_pin_state_pinned
,
N
,
oparity_variable
,
0
,
sizeof
(
be_call_attr_t
),
&
be_node_op_ops
);
op_be_Return
=
new_ir_op
(
beo_base
+
beo_Return
,
"be_Return"
,
op_pin_state_pinned
,
X
,
oparity_variable
,
0
,
sizeof
(
be_
return
_attr_t
),
&
be_node_op_ops
);
op_be_AddSP
=
new_ir_op
(
beo_base
+
beo_AddSP
,
"be_AddSP"
,
op_pin_state_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_SetSP
=
new_ir_op
(
beo_base
+
beo_SetSP
,
"be_SetSP"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_stack_attr_t
),
&
be_node_op_ops
);
op_be_IncSP
=
new_ir_op
(
beo_base
+
beo_IncSP
,
"be_IncSP"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_stack_attr_t
),
&
be_node_op_ops
);
op_be_RegParams
=
new_ir_op
(
beo_base
+
beo_RegParams
,
"be_RegParams"
,
op_pin_state_pinned
,
N
,
oparity_zero
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
op_be_StackParam
=
new_ir_op
(
beo_base
+
beo_StackParam
,
"be_StackParam"
,
op_pin_state_pinned
,
N
,
oparity_unary
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameAddr
=
new_ir_op
(
beo_base
+
beo_FrameAddr
,
"be_FrameAddr"
,
op_pin_state_pinned
,
N
,
oparity_binary
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameLoad
=
new_ir_op
(
beo_base
+
beo_FrameLoad
,
"be_FrameLoad"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_FrameStore
=
new_ir_op
(
beo_base
+
beo_FrameStore
,
"be_FrameStore"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_frame_attr_t
),
&
be_node_op_ops
);
op_be_Barrier
=
new_ir_op
(
beo_base
+
beo_Barrier
,
"be_Barrier"
,
op_pin_state_pinned
,
N
,
oparity_any
,
0
,
sizeof
(
be_node_attr_t
),
&
be_node_op_ops
);
set_op_tag
(
op_be_Spill
,
&
be_node_tag
);
set_op_tag
(
op_be_Reload
,
&
be_node_tag
);
...
...
@@ -402,15 +408,25 @@ void be_Call_set_type(ir_node *call, ir_type *call_tp) {
a
->
call_tp
=
call_tp
;
}
ir_node
*
be_new_Return
(
dbg_info
*
dbg
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
n
,
ir_node
*
in
[])
/* Construct a new be_Return. */
ir_node
*
be_new_Return
(
dbg_info
*
dbg
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
n_res
,
int
n
,
ir_node
*
in
[])
{
be_return_attr_t
*
a
;
ir_node
*
irn
=
new_ir_node
(
dbg
,
irg
,
bl
,
op_be_Return
,
mode_X
,
n
,
in
);
init_node_attr
(
irn
,
n
);
a
=
get_irn_attr
(
irn
);
a
->
num_ret_vals
=
n_res
;
return
irn
;
}
/* Returns the number of real returns values */
int
be_Return_get_n_rets
(
ir_node
*
ret
)
{
be_return_attr_t
*
a
=
get_irn_attr
(
ret
);
return
a
->
num_ret_vals
;
}
ir_node
*
be_new_IncSP
(
const
arch_register_t
*
sp
,
ir_graph
*
irg
,
ir_node
*
bl
,
ir_node
*
old_sp
,
ir_node
*
mem
,
unsigned
offset
,
be_stack_dir_t
dir
)
{
be_stack_attr_t
*
a
;
...
...
ir/be/benode_t.h
View file @
0d5be817
...
...
@@ -13,7 +13,6 @@
#define _BENODE_T_H
#include "firm_config.h"
#include "pmap.h"
#include "irmode.h"
#include "irnode.h"
...
...
@@ -91,24 +90,49 @@ typedef enum {
*/
void
be_node_init
(
void
);
/**
* Position numbers for the be_Spill inputs.
*/
enum
{
be_pos_Spill_frame
=
0
,
be_pos_Spill_val
=
1
};
/**
* Make a new Spill node.
*/
ir_node
*
be_new_Spill
(
const
arch_register_class_t
*
cls
,
const
arch_register_class_t
*
cls_frame
,
ir_graph
*
irg
,
ir_node
*
bl
,
ir_node
*
frame
,
ir_node
*
node_to_spill
,
ir_node
*
ctx
);
/**
* Position numbers for the be_Reload inputs.
*/
enum
{
be_pos_Reload_frame
=
0
,
be_pos_Reload_mem
=
1
};
/**
* Make a new Reload node.
*/
ir_node
*
be_new_Reload
(
const
arch_register_class_t
*
cls
,
const
arch_register_class_t
*
cls_frame
,
ir_graph
*
irg
,
ir_node
*
bl
,
ir_node
*
frame
,
ir_node
*
spill_node
,
ir_mode
*
mode
);
/**
* Position numbers for the be_Copy inputs.
*/
enum
{
be_pos_Copy_op
=
0
};
/**
* Make a new Copy node.
*/
ir_node
*
be_new_Copy
(
const
arch_register_class_t
*
cls
,
ir_graph
*
irg
,
ir_node
*
block
,
ir_node
*
in
);
/** Returns the Copy Argument. */
ir_node
*
be_get_Copy_op
(
const
ir_node
*
cpy
);
/**
* Make a new Perm node.
*/
ir_node
*
be_new_Perm
(
const
arch_register_class_t
*
cls
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
arity
,
ir_node
*
in
[]);
ir_node
*
be_new_Keep
(
const
arch_register_class_t
*
cls
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
arity
,
ir_node
*
in
[]);
...
...
@@ -118,6 +142,9 @@ ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_re
ir_graph
*
irg
,
ir_node
*
bl
,
ir_node
*
mem
,
ir_node
*
frame
,
ir_node
*
data
,
entity
*
ent
);
ir_node
*
be_new_FrameAddr
(
const
arch_register_class_t
*
cls_frame
,
ir_graph
*
irg
,
ir_node
*
bl
,
ir_node
*
frame
,
entity
*
ent
);
/**
* Position numbers for the be_AddSP inputs
*/
enum
{
be_pos_AddSP_old_sp
=
0
,
be_pos_AddSP_size
=
1
,
...
...
@@ -184,6 +211,9 @@ ir_type *be_Call_get_type(ir_node *call);
/** Sets the call type. */
void
be_Call_set_type
(
ir_node
*
call
,
ir_type
*
call_tp
);
/**
* Position numbers for the be_Call inputs.
*/
enum
{
be_pos_Call_mem
=
0
,
/**< memory input of a be_Call node */
be_pos_Call_sp
=
1
,
/**< stack pointer input of a be_Call node */
...
...
@@ -206,9 +236,30 @@ ir_node *be_new_Call(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem, ir
int
n_outs
,
int
n
,
ir_node
*
in
[],
ir_type
*
call_tp
);
/**
* Construct a new be_Return
* Position numbers for the be_Return inputs.
*/
enum
{
be_pos_Return_mem
=
0
,
/**< memory input of a be_Return node */
be_pos_Return_sp
=
1
,
/**< stack pointer input of a be_Return node */
be_pos_Return_val
=
2
,
/**< first "real" return value if any */
};
/**
* Construct a new be_Return.
* @param irg the graph where the new node will be placed
* @param bl the block where the new node will be placed
* @param n_res number of "real" results
* @param n number of inputs
* @param in input array
*/
ir_node
*
be_new_Return
(
dbg_info
*
dbg
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
n_res
,
int
n
,
ir_node
*
in
[]);
/** Returns the number of real returns values */
int
be_Return_get_n_rets
(
ir_node
*
ret
);
/**
* Construct a new Stack Parameter node.
*/
ir_node
*
be_new_Return
(
dbg_info
*
dbg
,
ir_graph
*
irg
,
ir_node
*
bl
,
int
n
,
ir_node
*
in
[]);
ir_node
*
be_new_StackParam
(
const
arch_register_class_t
*
cls
,
const
arch_register_class_t
*
cls_frame
,
ir_graph
*
irg
,
ir_node
*
bl
,
ir_mode
*
mode
,
ir_node
*
frame_pointer
,
entity
*
ent
);
ir_node
*
be_new_RegParams
(
ir_graph
*
irg
,
ir_node
*
bl
,
int
n_out
);
...
...
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