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
cf9c1673
Commit
cf9c1673
authored
May 23, 2008
by
Matthias Braun
Browse files
- Aus arch_isa_t wird arch_env_t sonst ändert sich nix...
[r19740]
parent
c23b5587
Changes
45
Hide whitespace changes
Inline
Side-by-side
ir/be/TEMPLATE/bearch_TEMPLATE.c
View file @
cf9c1673
...
...
@@ -325,7 +325,7 @@ static const arch_code_generator_if_t TEMPLATE_code_gen_if = {
*/
static
void
*
TEMPLATE_cg_init
(
be_irg_t
*
birg
)
{
const
arch_env_t
*
arch_env
=
be_get_birg_arch_env
(
birg
);
TEMPLATE_isa_t
*
isa
=
(
TEMPLATE_isa_t
*
)
arch_env
->
isa
;
TEMPLATE_isa_t
*
isa
=
(
TEMPLATE_isa_t
*
)
arch_env
;
TEMPLATE_code_gen_t
*
cg
=
xmalloc
(
sizeof
(
*
cg
));
cg
->
impl
=
&
TEMPLATE_code_gen_if
;
...
...
@@ -369,7 +369,7 @@ static TEMPLATE_isa_t TEMPLATE_isa_template = {
/**
* Initializes the backend ISA and opens the output file.
*/
static
void
*
TEMPLATE_init
(
FILE
*
outfile
)
{
static
arch_env_t
*
TEMPLATE_init
(
FILE
*
outfile
)
{
static
int
run_once
=
0
;
TEMPLATE_isa_t
*
isa
;
...
...
@@ -385,7 +385,7 @@ static void *TEMPLATE_init(FILE *outfile) {
TEMPLATE_register_init
();
TEMPLATE_create_opcodes
(
&
TEMPLATE_irn_ops
);
return
isa
;
return
&
isa
->
arch_env
;
}
...
...
@@ -397,7 +397,7 @@ static void TEMPLATE_done(void *self) {
TEMPLATE_isa_t
*
isa
=
self
;
/* emit now all global declarations */
be_gas_emit_decls
(
isa
->
arch_
isa
.
main_env
,
0
);
be_gas_emit_decls
(
isa
->
arch_
env
.
main_env
,
0
);
be_emit_exit
();
free
(
self
);
...
...
@@ -442,7 +442,6 @@ const arch_register_class_t *TEMPLATE_get_reg_class_for_mode(const void *self,
typedef
struct
{
be_abi_call_flags_bits_t
flags
;
const
arch_env_t
*
arch_env
;
const
arch_isa_t
*
isa
;
ir_graph
*
irg
;
}
TEMPLATE_abi_env_t
;
...
...
@@ -453,7 +452,6 @@ static void *TEMPLATE_abi_init(const be_abi_call_t *call, const arch_env_t *arch
env
->
flags
=
fl
.
bits
;
env
->
irg
=
irg
;
env
->
arch_env
=
arch_env
;
env
->
isa
=
arch_env
->
isa
;
return
env
;
}
...
...
@@ -490,7 +488,7 @@ static void TEMPLATE_abi_dont_save_regs(void *self, pset *s)
TEMPLATE_abi_env_t
*
env
=
self
;
if
(
env
->
flags
.
try_omit_fp
)
{
/* insert the BP register into the ignore set */
pset_insert_ptr
(
s
,
env
->
isa
->
bp
);
pset_insert_ptr
(
s
,
env
->
arch_env
->
bp
);
}
}
...
...
@@ -505,8 +503,8 @@ static const arch_register_t *TEMPLATE_abi_prologue(void *self, ir_node **mem,
(
void
)
mem
;
if
(
env
->
flags
.
try_omit_fp
)
return
env
->
isa
->
sp
;
return
env
->
isa
->
bp
;
return
env
->
arch_env
->
sp
;
return
env
->
arch_env
->
bp
;
}
/* Build the epilog */
...
...
ir/be/TEMPLATE/bearch_TEMPLATE_t.h
View file @
cf9c1673
...
...
@@ -47,7 +47,7 @@ struct TEMPLATE_code_gen_t {
};
struct
TEMPLATE_isa_t
{
arch_
isa
_t
arch_
isa
;
/**< must be derived from arch_isa */
arch_
env
_t
arch_
env
;
/**< must be derived from arch_isa */
};
/**
...
...
ir/be/arm/arm_emitter.c
View file @
cf9c1673
...
...
@@ -1131,7 +1131,7 @@ void arm_gen_routine(const arm_code_gen_t *arm_cg, ir_graph *irg) {
ir_node
*
last_block
=
NULL
;
cg
=
arm_cg
;
isa
=
(
const
arm_isa_t
*
)
cg
->
arch_env
->
isa
;
isa
=
(
const
arm_isa_t
*
)
cg
->
arch_env
;
arch_env
=
cg
->
arch_env
;
sym_or_tv
=
new_set
(
cmp_sym_or_tv
,
8
);
...
...
ir/be/arm/bearch_arm.c
View file @
cf9c1673
...
...
@@ -574,7 +574,7 @@ static const arch_code_generator_if_t arm_code_gen_if = {
*/
static
void
*
arm_cg_init
(
be_irg_t
*
birg
)
{
static
ir_type
*
int_tp
=
NULL
;
arm_isa_t
*
isa
=
(
arm_isa_t
*
)
birg
->
main_env
->
arch_env
.
isa
;
arm_isa_t
*
isa
=
(
arm_isa_t
*
)
birg
->
main_env
->
arch_env
;
arm_code_gen_t
*
cg
;
if
(
!
int_tp
)
{
...
...
@@ -586,7 +586,7 @@ static void *arm_cg_init(be_irg_t *birg) {
cg
->
impl
=
&
arm_code_gen_if
;
cg
->
irg
=
birg
->
irg
;
cg
->
reg_set
=
new_set
(
arm_cmp_irn_reg_assoc
,
1024
);
cg
->
arch_env
=
&
birg
->
main_env
->
arch_env
;
cg
->
arch_env
=
birg
->
main_env
->
arch_env
;
cg
->
isa
=
isa
;
cg
->
birg
=
birg
;
cg
->
int_tp
=
int_tp
;
...
...
@@ -761,7 +761,7 @@ static arm_isa_t arm_isa_template = {
/**
* Initializes the backend ISA and opens the output file.
*/
static
void
*
arm_init
(
FILE
*
file_handle
)
{
static
arch_env_t
*
arm_init
(
FILE
*
file_handle
)
{
static
int
inited
=
0
;
arm_isa_t
*
isa
;
...
...
@@ -786,7 +786,7 @@ static void *arm_init(FILE *file_handle) {
inc_master_type_visited
();
inited
=
1
;
return
isa
;
return
&
isa
->
arch_env
;
}
...
...
@@ -797,7 +797,7 @@ static void *arm_init(FILE *file_handle) {
static
void
arm_done
(
void
*
self
)
{
arm_isa_t
*
isa
=
self
;
be_gas_emit_decls
(
isa
->
arch_
isa
.
main_env
,
1
);
be_gas_emit_decls
(
isa
->
arch_
env
.
main_env
,
1
);
be_emit_exit
();
free
(
self
);
...
...
@@ -870,7 +870,6 @@ static ir_type *arm_get_between_type(void *self) {
typedef
struct
{
be_abi_call_flags_bits_t
flags
;
const
arch_env_t
*
arch_env
;
const
arch_isa_t
*
isa
;
ir_graph
*
irg
;
}
arm_abi_env_t
;
...
...
@@ -881,7 +880,6 @@ static void *arm_abi_init(const be_abi_call_t *call, const arch_env_t *arch_env,
env
->
flags
=
fl
.
bits
;
env
->
irg
=
irg
;
env
->
arch_env
=
arch_env
;
env
->
isa
=
arch_env
->
isa
;
return
env
;
}
...
...
@@ -889,7 +887,7 @@ static void arm_abi_dont_save_regs(void *self, pset *s)
{
arm_abi_env_t
*
env
=
self
;
if
(
env
->
flags
.
try_omit_fp
)
pset_insert_ptr
(
s
,
env
->
isa
->
bp
);
pset_insert_ptr
(
s
,
env
->
arch_env
->
bp
);
}
...
...
@@ -904,14 +902,14 @@ static const arch_register_t *arm_abi_prologue(void *self, ir_node **mem, pmap *
ir_node
*
block
=
get_irg_start_block
(
irg
);
arch_register_class_t
*
gp
=
&
arm_reg_classes
[
CLASS_arm_gp
];
ir_node
*
fp
=
be_abi_reg_map_get
(
reg_map
,
env
->
isa
->
bp
);
ir_node
*
fp
=
be_abi_reg_map_get
(
reg_map
,
env
->
arch_env
->
bp
);
ir_node
*
ip
=
be_abi_reg_map_get
(
reg_map
,
&
arm_gp_regs
[
REG_R12
]);
ir_node
*
sp
=
be_abi_reg_map_get
(
reg_map
,
env
->
isa
->
sp
);
ir_node
*
sp
=
be_abi_reg_map_get
(
reg_map
,
env
->
arch_env
->
sp
);
ir_node
*
lr
=
be_abi_reg_map_get
(
reg_map
,
&
arm_gp_regs
[
REG_LR
]);
ir_node
*
pc
=
be_abi_reg_map_get
(
reg_map
,
&
arm_gp_regs
[
REG_PC
]);
if
(
env
->
flags
.
try_omit_fp
)
return
env
->
isa
->
sp
;
return
env
->
arch_env
->
sp
;
ip
=
be_new_Copy
(
gp
,
irg
,
block
,
sp
);
arch_set_irn_register
(
env
->
arch_env
,
ip
,
&
arm_gp_regs
[
REG_R12
]);
...
...
@@ -919,8 +917,8 @@ static const arch_register_t *arm_abi_prologue(void *self, ir_node **mem, pmap *
store
=
new_rd_arm_StoreStackM4Inc
(
NULL
,
irg
,
block
,
sp
,
fp
,
ip
,
lr
,
pc
,
*
mem
);
sp
=
new_r_Proj
(
irg
,
block
,
store
,
env
->
isa
->
sp
->
reg_class
->
mode
,
pn_arm_StoreStackM4Inc_ptr
);
arch_set_irn_register
(
env
->
arch_env
,
sp
,
env
->
isa
->
sp
);
sp
=
new_r_Proj
(
irg
,
block
,
store
,
env
->
arch_env
->
sp
->
reg_class
->
mode
,
pn_arm_StoreStackM4Inc_ptr
);
arch_set_irn_register
(
env
->
arch_env
,
sp
,
env
->
arch_env
->
sp
);
*
mem
=
new_r_Proj
(
irg
,
block
,
store
,
mode_M
,
pn_arm_StoreStackM4Inc_M
);
keep
=
be_new_CopyKeep_single
(
gp
,
irg
,
block
,
ip
,
sp
,
get_irn_mode
(
ip
));
...
...
@@ -929,15 +927,15 @@ static const arch_register_t *arm_abi_prologue(void *self, ir_node **mem, pmap *
be_set_constr_single_reg
(
keep
,
BE_OUT_POS
(
0
),
&
arm_gp_regs
[
REG_R12
]
);
fp
=
new_rd_arm_Sub_i
(
NULL
,
irg
,
block
,
keep
,
get_irn_mode
(
fp
),
4
);
arch_set_irn_register
(
env
->
arch_env
,
fp
,
env
->
isa
->
bp
);
arch_set_irn_register
(
env
->
arch_env
,
fp
,
env
->
arch_env
->
bp
);
be_abi_reg_map_set
(
reg_map
,
env
->
isa
->
bp
,
fp
);
be_abi_reg_map_set
(
reg_map
,
env
->
arch_env
->
bp
,
fp
);
be_abi_reg_map_set
(
reg_map
,
&
arm_gp_regs
[
REG_R12
],
keep
);
be_abi_reg_map_set
(
reg_map
,
env
->
isa
->
sp
,
sp
);
be_abi_reg_map_set
(
reg_map
,
env
->
arch_env
->
sp
,
sp
);
be_abi_reg_map_set
(
reg_map
,
&
arm_gp_regs
[
REG_LR
],
lr
);
be_abi_reg_map_set
(
reg_map
,
&
arm_gp_regs
[
REG_PC
],
pc
);
return
env
->
isa
->
bp
;
return
env
->
arch_env
->
bp
;
}
/**
...
...
@@ -945,14 +943,14 @@ static const arch_register_t *arm_abi_prologue(void *self, ir_node **mem, pmap *
*/
static
void
arm_abi_epilogue
(
void
*
self
,
ir_node
*
bl
,
ir_node
**
mem
,
pmap
*
reg_map
)
{
arm_abi_env_t
*
env
=
self
;
ir_node
*
curr_sp
=
be_abi_reg_map_get
(
reg_map
,
env
->
isa
->
sp
);
ir_node
*
curr_bp
=
be_abi_reg_map_get
(
reg_map
,
env
->
isa
->
bp
);
ir_node
*
curr_sp
=
be_abi_reg_map_get
(
reg_map
,
env
->
arch_env
->
sp
);
ir_node
*
curr_bp
=
be_abi_reg_map_get
(
reg_map
,
env
->
arch_env
->
bp
);
ir_node
*
curr_pc
=
be_abi_reg_map_get
(
reg_map
,
&
arm_gp_regs
[
REG_PC
]);
ir_node
*
curr_lr
=
be_abi_reg_map_get
(
reg_map
,
&
arm_gp_regs
[
REG_LR
]);
// TODO: Activate Omit fp in epilogue
if
(
env
->
flags
.
try_omit_fp
)
{
curr_sp
=
be_new_IncSP
(
env
->
isa
->
sp
,
env
->
irg
,
bl
,
curr_sp
,
BE_STACK_FRAME_SIZE_SHRINK
,
0
);
curr_sp
=
be_new_IncSP
(
env
->
arch_env
->
sp
,
env
->
irg
,
bl
,
curr_sp
,
BE_STACK_FRAME_SIZE_SHRINK
,
0
);
add_irn_dep
(
curr_sp
,
*
mem
);
curr_lr
=
be_new_CopyKeep_single
(
&
arm_reg_classes
[
CLASS_arm_gp
],
env
->
irg
,
bl
,
curr_lr
,
curr_sp
,
get_irn_mode
(
curr_lr
));
...
...
@@ -970,22 +968,22 @@ static void arm_abi_epilogue(void *self, ir_node *bl, ir_node **mem, pmap *reg_m
sub12_node
=
new_rd_arm_Sub_i
(
NULL
,
env
->
irg
,
bl
,
curr_bp
,
mode_Iu
,
12
);
// FIXME
//set_arm_req_out_all(sub12_node, sub12_req);
arch_set_irn_register
(
env
->
arch_env
,
sub12_node
,
env
->
isa
->
sp
);
arch_set_irn_register
(
env
->
arch_env
,
sub12_node
,
env
->
arch_env
->
sp
);
load_node
=
new_rd_arm_LoadStackM3
(
NULL
,
env
->
irg
,
bl
,
sub12_node
,
*
mem
);
// FIXME
//set_arm_req_out(load_node, &arm_default_req_arm_gp_r11, 0);
//set_arm_req_out(load_node, &arm_default_req_arm_gp_sp, 1);
//set_arm_req_out(load_node, &arm_default_req_arm_gp_pc, 2);
curr_bp
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
env
->
isa
->
bp
->
reg_class
->
mode
,
pn_arm_LoadStackM3_res0
);
curr_sp
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
env
->
isa
->
sp
->
reg_class
->
mode
,
pn_arm_LoadStackM3_res1
);
curr_bp
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
env
->
arch_env
->
bp
->
reg_class
->
mode
,
pn_arm_LoadStackM3_res0
);
curr_sp
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
env
->
arch_env
->
sp
->
reg_class
->
mode
,
pn_arm_LoadStackM3_res1
);
curr_pc
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
mode_Iu
,
pn_arm_LoadStackM3_res2
);
*
mem
=
new_r_Proj
(
env
->
irg
,
bl
,
load_node
,
mode_M
,
pn_arm_LoadStackM3_M
);
arch_set_irn_register
(
env
->
arch_env
,
curr_bp
,
env
->
isa
->
bp
);
arch_set_irn_register
(
env
->
arch_env
,
curr_sp
,
env
->
isa
->
sp
);
arch_set_irn_register
(
env
->
arch_env
,
curr_bp
,
env
->
arch_env
->
bp
);
arch_set_irn_register
(
env
->
arch_env
,
curr_sp
,
env
->
arch_env
->
sp
);
arch_set_irn_register
(
env
->
arch_env
,
curr_pc
,
&
arm_gp_regs
[
REG_PC
]);
}
be_abi_reg_map_set
(
reg_map
,
env
->
isa
->
sp
,
curr_sp
);
be_abi_reg_map_set
(
reg_map
,
env
->
isa
->
bp
,
curr_bp
);
be_abi_reg_map_set
(
reg_map
,
env
->
arch_env
->
sp
,
curr_sp
);
be_abi_reg_map_set
(
reg_map
,
env
->
arch_env
->
bp
,
curr_bp
);
be_abi_reg_map_set
(
reg_map
,
&
arm_gp_regs
[
REG_LR
],
curr_lr
);
be_abi_reg_map_set
(
reg_map
,
&
arm_gp_regs
[
REG_PC
],
curr_pc
);
}
...
...
ir/be/arm/bearch_arm_t.h
View file @
cf9c1673
...
...
@@ -153,7 +153,7 @@ typedef struct _arm_code_gen_t {
struct
_arm_isa_t
{
arch_
isa
_t
arch_
isa
;
/**< must be derived from arch_
isa
_t */
arch_
env
_t
arch_
env
;
/**< must be derived from arch_
env
_t */
int
gen_reg_names
;
/**< use generic register names instead of SP, LR, PC */
int
fpu_arch
;
/**< FPU architecture */
arm_code_gen_t
*
cg
;
/**< current code generator */
...
...
ir/be/be_t.h
View file @
cf9c1673
...
...
@@ -80,7 +80,7 @@ struct be_options_t {
};
struct
be_main_env_t
{
arch_env_t
arch_env
;
arch_env_t
*
arch_env
;
be_options_t
*
options
;
/**< backend options */
arch_code_generator_t
*
cg
;
const
char
*
cup_name
;
/**< name of the compilation unit */
...
...
ir/be/beabi.c
View file @
cf9c1673
...
...
@@ -83,7 +83,7 @@ struct _be_abi_irg_t {
struct
obstack
obst
;
be_stack_layout_t
*
frame
;
/**< The stack frame model. */
be_irg_t
*
birg
;
/**< The back end IRG. */
const
arch_
isa
_t
*
isa
;
/**< The isa. */
const
arch_
env
_t
*
arch_env
;
survive_dce_t
*
dce_survivor
;
be_abi_call_t
*
call
;
/**< The ABI call information. */
...
...
@@ -409,8 +409,7 @@ static INLINE int is_on_stack(be_abi_call_t *call, int pos)
static
ir_node
*
adjust_call
(
be_abi_irg_t
*
env
,
ir_node
*
irn
,
ir_node
*
curr_sp
)
{
ir_graph
*
irg
=
env
->
birg
->
irg
;
const
arch_env_t
*
arch_env
=
&
env
->
birg
->
main_env
->
arch_env
;
const
arch_isa_t
*
isa
=
arch_env
->
isa
;
const
arch_env_t
*
arch_env
=
env
->
birg
->
main_env
->
arch_env
;
ir_type
*
call_tp
=
get_Call_type
(
irn
);
ir_node
*
call_ptr
=
get_Call_ptr
(
irn
);
int
n_params
=
get_method_n_params
(
call_tp
);
...
...
@@ -420,8 +419,8 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
pset
*
caller_save
=
pset_new_ptr
(
8
);
pset
*
states
=
pset_new_ptr
(
2
);
int
stack_size
=
0
;
int
stack_dir
=
arch_
isa
_stack_dir
(
isa
);
const
arch_register_t
*
sp
=
arch_
isa
_sp
(
isa
);
int
stack_dir
=
arch_
env
_stack_dir
(
arch_env
);
const
arch_register_t
*
sp
=
arch_
env
_sp
(
arch_env
);
be_abi_call_t
*
call
=
be_abi_call_new
(
sp
->
reg_class
);
ir_mode
*
mach_mode
=
sp
->
reg_class
->
mode
;
struct
obstack
*
obst
=
&
env
->
obst
;
...
...
@@ -445,7 +444,7 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
int
i
,
n
;
/* Let the isa fill out the abi description for that call node. */
arch_
isa
_get_call_abi
(
isa
,
call_tp
,
call
);
arch_
env
_get_call_abi
(
arch_env
,
call_tp
,
call
);
/* Insert code to put the stack arguments on the stack. */
assert
(
get_Call_n_params
(
irn
)
==
n_params
);
...
...
@@ -583,9 +582,9 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
}
/* Collect caller save registers */
for
(
i
=
0
,
n
=
arch_
isa
_get_n_reg_class
(
isa
);
i
<
n
;
++
i
)
{
for
(
i
=
0
,
n
=
arch_
env
_get_n_reg_class
(
arch_env
);
i
<
n
;
++
i
)
{
unsigned
j
;
const
arch_register_class_t
*
cls
=
arch_
isa
_get_reg_class
(
isa
,
i
);
const
arch_register_class_t
*
cls
=
arch_
env
_get_reg_class
(
arch_env
,
i
);
for
(
j
=
0
;
j
<
cls
->
n_regs
;
++
j
)
{
const
arch_register_t
*
reg
=
arch_register_for_index
(
cls
,
j
);
if
(
arch_register_type_is
(
reg
,
caller_save
))
{
...
...
@@ -925,9 +924,9 @@ static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp
We cannot omit it. */
env
->
call
->
flags
.
bits
.
try_omit_fp
=
0
;
stack_alignment
=
env
->
isa
->
stack_alignment
;
stack_alignment
=
env
->
arch_env
->
stack_alignment
;
size
=
adjust_alloc_size
(
stack_alignment
,
size
,
irg
,
block
,
dbg
);
new_alloc
=
be_new_AddSP
(
env
->
isa
->
sp
,
irg
,
block
,
curr_sp
,
size
);
new_alloc
=
be_new_AddSP
(
env
->
arch_env
->
sp
,
irg
,
block
,
curr_sp
,
size
);
set_irn_dbg_info
(
new_alloc
,
dbg
);
if
(
alloc_mem
!=
NULL
)
{
...
...
@@ -980,7 +979,7 @@ static ir_node *adjust_free(be_abi_irg_t *env, ir_node *free, ir_node *curr_sp)
block
=
get_nodes_block
(
free
);
irg
=
get_irn_irg
(
block
);
type
=
get_Free_type
(
free
);
sp_mode
=
env
->
isa
->
sp
->
reg_class
->
mode
;
sp_mode
=
env
->
arch_env
->
sp
->
reg_class
->
mode
;
dbg
=
get_irn_dbg_info
(
free
);
/* we might need to multiply the size with the element size */
...
...
@@ -994,13 +993,13 @@ static ir_node *adjust_free(be_abi_irg_t *env, ir_node *free, ir_node *curr_sp)
size
=
get_Free_size
(
free
);
}
stack_alignment
=
env
->
isa
->
stack_alignment
;
stack_alignment
=
env
->
arch_env
->
stack_alignment
;
size
=
adjust_alloc_size
(
stack_alignment
,
size
,
irg
,
block
,
dbg
);
/* The stack pointer will be modified in an unknown manner.
We cannot omit it. */
env
->
call
->
flags
.
bits
.
try_omit_fp
=
0
;
subsp
=
be_new_SubSP
(
env
->
isa
->
sp
,
irg
,
block
,
curr_sp
,
size
);
subsp
=
be_new_SubSP
(
env
->
arch_env
->
sp
,
irg
,
block
,
curr_sp
,
size
);
set_irn_dbg_info
(
subsp
,
dbg
);
mem
=
new_r_Proj
(
irg
,
block
,
subsp
,
mode_M
,
pn_be_SubSP_M
);
...
...
@@ -1162,8 +1161,8 @@ static void process_calls_in_block(ir_node *bl, void *data)
if
(
curr_sp
!=
env
->
init_sp
&&
!
(
is_Proj
(
curr_sp
)
&&
be_is_Call
(
get_Proj_pred
(
curr_sp
))))
{
nodes
[
0
]
=
curr_sp
;
keep
=
be_new_Keep
(
env
->
isa
->
sp
->
reg_class
,
get_irn_irg
(
bl
),
bl
,
1
,
nodes
);
keep
=
be_new_Keep
(
env
->
arch_env
->
sp
->
reg_class
,
get_irn_irg
(
bl
),
bl
,
1
,
nodes
);
pmap_insert
(
env
->
keep_map
,
bl
,
keep
);
}
}
...
...
@@ -1201,7 +1200,7 @@ static void process_calls(be_abi_irg_t *env)
static
ir_type
*
compute_arg_type
(
be_abi_irg_t
*
env
,
be_abi_call_t
*
call
,
ir_type
*
method_type
,
ir_entity
***
param_map
)
{
int
dir
=
env
->
call
->
flags
.
bits
.
left_to_right
?
1
:
-
1
;
int
inc
=
env
->
birg
->
main_env
->
arch_env
.
isa
->
stack_dir
*
dir
;
int
inc
=
env
->
birg
->
main_env
->
arch_env
->
stack_dir
*
dir
;
int
n
=
get_method_n_params
(
method_type
);
int
curr
=
inc
>
0
?
0
:
n
-
1
;
int
ofs
=
0
;
...
...
@@ -1362,13 +1361,13 @@ static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pm
be_set_constr_single_reg
(
irn
,
n
,
reg
);
be_set_constr_single_reg
(
irn
,
pos
,
reg
);
be_node_set_reg_class
(
irn
,
pos
,
reg
->
reg_class
);
arch_set_irn_register
(
&
env
->
birg
->
main_env
->
arch_env
,
proj
,
reg
);
arch_set_irn_register
(
env
->
birg
->
main_env
->
arch_env
,
proj
,
reg
);
/* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
if
(
arch_register_type_is
(
reg
,
ignore
)
||
arch_irn_is
(
&
env
->
birg
->
main_env
->
arch_env
,
in
[
n
],
ignore
))
if
(
arch_register_type_is
(
reg
,
ignore
)
||
arch_irn_is
(
env
->
birg
->
main_env
->
arch_env
,
in
[
n
],
ignore
))
flags
|=
arch_irn_flags_ignore
;
if
(
arch_irn_is
(
&
env
->
birg
->
main_env
->
arch_env
,
in
[
n
],
modify_sp
))
if
(
arch_irn_is
(
env
->
birg
->
main_env
->
arch_env
,
in
[
n
],
modify_sp
))
flags
|=
arch_irn_flags_modify_sp
;
be_node_set_flags
(
irn
,
pos
,
flags
);
...
...
@@ -1396,8 +1395,8 @@ static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pm
static
ir_node
*
create_be_return
(
be_abi_irg_t
*
env
,
ir_node
*
irn
,
ir_node
*
bl
,
ir_node
*
mem
,
int
n_res
)
{
be_abi_call_t
*
call
=
env
->
call
;
const
arch_
isa
_t
*
isa
=
env
->
birg
->
main_env
->
arch_env
.
isa
;
be_abi_call_t
*
call
=
env
->
call
;
const
arch_
env
_t
*
arch_env
=
env
->
birg
->
main_env
->
arch_env
;
dbg_info
*
dbgi
;
pmap
*
reg_map
=
pmap_create
();
ir_node
*
keep
=
pmap_get
(
env
->
keep_map
,
bl
);
...
...
@@ -1417,7 +1416,7 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
it then. Else we use the stack from the start block and let
the ssa construction fix the usage.
*/
stack
=
be_abi_reg_map_get
(
env
->
regs
,
isa
->
sp
);
stack
=
be_abi_reg_map_get
(
env
->
regs
,
arch_env
->
sp
);
if
(
keep
)
{
stack
=
get_irn_n
(
keep
,
0
);
be_kill_node
(
keep
);
...
...
@@ -1439,7 +1438,7 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
pmap_insert
(
reg_map
,
ent
->
key
,
ent
->
value
);
}
be_abi_reg_map_set
(
reg_map
,
isa
->
sp
,
stack
);
be_abi_reg_map_set
(
reg_map
,
arch_env
->
sp
,
stack
);
/* Make the Epilogue node and call the arch's epilogue maker. */
create_barrier
(
env
,
bl
,
&
mem
,
reg_map
,
1
);
...
...
@@ -1455,13 +1454,13 @@ static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
regs
=
obstack_alloc
(
&
env
->
obst
,
in_max
*
sizeof
(
regs
[
0
]));
in
[
0
]
=
mem
;
in
[
1
]
=
be_abi_reg_map_get
(
reg_map
,
isa
->
sp
);
in
[
1
]
=
be_abi_reg_map_get
(
reg_map
,
arch_env
->
sp
);
regs
[
0
]
=
NULL
;
regs
[
1
]
=
isa
->
sp
;
regs
[
1
]
=
arch_env
->
sp
;
n
=
2
;
/* clear SP entry, since it has already been grown. */
pmap_insert
(
reg_map
,
(
void
*
)
isa
->
sp
,
NULL
);
pmap_insert
(
reg_map
,
(
void
*
)
arch_env
->
sp
,
NULL
);
for
(
i
=
0
;
i
<
n_res
;
++
i
)
{
be_abi_call_arg_t
*
arg
=
get_call_arg
(
call
,
1
,
i
);
...
...
@@ -1528,7 +1527,7 @@ static void lower_frame_sels_walker(ir_node *irn, void *data) {
ir_node
*
bl
=
get_nodes_block
(
irn
);
ir_node
*
nw
;
nw
=
be_new_FrameAddr
(
env
->
isa
->
sp
->
reg_class
,
irg
,
bl
,
frame
,
ent
);
nw
=
be_new_FrameAddr
(
env
->
arch_env
->
sp
->
reg_class
,
irg
,
bl
,
frame
,
ent
);
exchange
(
irn
,
nw
);
/* check, if it's a param sel and if have not seen this entity before */
...
...
@@ -1617,7 +1616,7 @@ static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_entity *value_
ir_node
*
addr
;
/* address for the backing store */
addr
=
be_new_FrameAddr
(
env
->
isa
->
sp
->
reg_class
,
irg
,
first_bl
,
frame
,
ent
);
addr
=
be_new_FrameAddr
(
env
->
arch_env
->
sp
->
reg_class
,
irg
,
first_bl
,
frame
,
ent
);
if
(
store
)
mem
=
new_r_Proj
(
irg
,
first_bl
,
store
,
mode_M
,
pn_Store_M
);
...
...
@@ -1695,8 +1694,8 @@ static void fix_start_block(ir_node *block, void *env) {
static
void
modify_irg
(
be_abi_irg_t
*
env
)
{
be_abi_call_t
*
call
=
env
->
call
;
const
arch_
isa
_t
*
isa
=
env
->
birg
->
main_env
->
arch_env
.
isa
;
const
arch_register_t
*
sp
=
arch_
isa
_sp
(
isa
);
const
arch_
env
_t
*
arch_env
=
env
->
birg
->
main_env
->
arch_env
;
const
arch_register_t
*
sp
=
arch_
env
_sp
(
arch_env
);
ir_graph
*
irg
=
env
->
birg
->
irg
;
ir_node
*
bl
=
get_irg_start_block
(
irg
);
ir_node
*
end
=
get_irg_end_block
(
irg
);
...
...
@@ -1779,7 +1778,7 @@ static void modify_irg(be_abi_irg_t *env)
arg_type
=
compute_arg_type
(
env
,
call
,
method_type
,
&
param_map
);
bet_type
=
call
->
cb
->
get_between_type
(
env
->
cb
);
stack_frame_init
(
env
->
frame
,
arg_type
,
bet_type
,
get_irg_frame_type
(
irg
),
isa
->
stack_dir
,
param_map
);
stack_frame_init
(
env
->
frame
,
arg_type
,
bet_type
,
get_irg_frame_type
(
irg
),
arch_env
->
stack_dir
,
param_map
);
/* Count the register params and add them to the number of Projs for the RegParams node */
for
(
i
=
0
;
i
<
n_params
;
++
i
)
{
...
...
@@ -1796,8 +1795,8 @@ static void modify_irg(be_abi_irg_t *env)
}
/* Collect all callee-save registers */
for
(
i
=
0
,
n
=
arch_
isa
_get_n_reg_class
(
isa
);
i
<
n
;
++
i
)
{
const
arch_register_class_t
*
cls
=
arch_
isa
_get_reg_class
(
isa
,
i
);
for
(
i
=
0
,
n
=
arch_
env
_get_n_reg_class
(
arch_env
);
i
<
n
;
++
i
)
{
const
arch_register_class_t
*
cls
=
arch_
env
_get_reg_class
(
arch_env
,
i
);
for
(
j
=
0
;
j
<
cls
->
n_regs
;
++
j
)
{
const
arch_register_t
*
reg
=
&
cls
->
regs
[
j
];
if
(
arch_register_type_is
(
reg
,
callee_save
)
||
...
...
@@ -1808,7 +1807,7 @@ static void modify_irg(be_abi_irg_t *env)
}
pmap_insert
(
env
->
regs
,
(
void
*
)
sp
,
NULL
);
pmap_insert
(
env
->
regs
,
(
void
*
)
isa
->
bp
,
NULL
);
pmap_insert
(
env
->
regs
,
(
void
*
)
arch_env
->
bp
,
NULL
);
reg_params_bl
=
get_irg_start_block
(
irg
);
env
->
reg_params
=
be_new_RegParams
(
irg
,
reg_params_bl
,
pmap_count
(
env
->
regs
));
add_irn_dep
(
env
->
reg_params
,
get_irg_start
(
irg
));
...
...
@@ -1836,7 +1835,7 @@ static void modify_irg(be_abi_irg_t *env)
proj
=
new_r_Proj
(
irg
,
reg_params_bl
,
env
->
reg_params
,
mode
,
nr
);
pmap_insert
(
env
->
regs
,
(
void
*
)
reg
,
proj
);
be_set_constr_single_reg
(
env
->
reg_params
,
pos
,
reg
);
arch_set_irn_register
(
&
env
->
birg
->
main_env
->
arch_env
,
proj
,
reg
);
arch_set_irn_register
(
env
->
birg
->
main_env
->
arch_env
,
proj
,
reg
);
/*
* If the register is an ignore register,
...
...
@@ -1873,7 +1872,7 @@ static void modify_irg(be_abi_irg_t *env)
create_barrier
(
env
,
bl
,
&
mem
,
env
->
regs
,
0
);
env
->
init_sp
=
be_abi_reg_map_get
(
env
->
regs
,
sp
);
arch_set_irn_register
(
&
env
->
birg
->
main_env
->
arch_env
,
env
->
init_sp
,
sp
);
arch_set_irn_register
(
env
->
birg
->
main_env
->
arch_env
,
env
->
init_sp
,
sp
);
frame_pointer
=
be_abi_reg_map_get
(
env
->
regs
,
fp_reg
);
set_irg_frame
(
irg
,
frame_pointer
);
...
...
@@ -1968,15 +1967,15 @@ static void modify_irg(be_abi_irg_t *env)
static
void
fix_call_state_inputs
(
be_abi_irg_t
*
env
)
{
const
arch_
isa
_t
*
isa
=
env
->
isa
;
const
arch_
env
_t
*
arch_env
=
env
->
arch_env
;
int
i
,
n
,
n_states
;
arch_register_t
**
stateregs
=
NEW_ARR_F
(
arch_register_t
*
,
0
);
/* Collect caller save registers */
n
=
arch_
isa
_get_n_reg_class
(
isa
);
n
=
arch_
env
_get_n_reg_class
(
arch_env
);
for
(
i
=
0
;
i
<
n
;
++
i
)
{
unsigned
j
;
const
arch_register_class_t
*
cls
=
arch_
isa
_get_reg_class
(
isa
,
i
);
const
arch_register_class_t
*
cls
=
arch_
env
_get_reg_class
(
arch_env
,
i
);
for
(
j
=
0
;
j
<
cls
->
n_regs
;
++
j
)
{
const
arch_register_t
*
reg
=
arch_register_for_index
(
cls
,
j
);
if
(
arch_register_type_is
(
reg
,
state
))
{
...
...
@@ -2128,10 +2127,10 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
obstack_init
(
&
env
->
obst
);
env
->
isa
=
birg
->
main_env
->
arch_env
.
isa
;
env
->
arch_env
=
birg
->
main_env
->
arch_env
;
env
->
method_type
=
get_entity_type
(
get_irg_entity
(
irg
));
env
->
call
=
be_abi_call_new
(
env
->
isa
->
sp
->
reg_class
);
arch_
isa
_get_call_abi
(
env
->
isa
,
env
->
method_type
,
env
->
call
);
env
->
call
=
be_abi_call_new
(
env
->
arch_env
->
sp
->
reg_class
);
arch_
env
_get_call_abi
(
env
->
arch_env
,
env
->
method_type
,
env
->
call
);
env
->
ignore_regs
=
pset_new_ptr_default
();
env
->
keep_map
=
pmap_create
();
...
...
@@ -2139,19 +2138,19 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
env
->
birg
=
birg
;
env
->
sp_req
.
type
=
arch_register_req_type_limited
;
env
->
sp_req
.
cls
=
arch_register_get_class
(
env
->
isa
->
sp
);
env
->
sp_req
.
cls
=
arch_register_get_class
(
env
->
arch_env
->
sp
);
limited_bitset
=
rbitset_obstack_alloc
(
&
env
->
obst
,
env
->
sp_req
.
cls
->
n_regs
);
rbitset_set
(
limited_bitset
,
arch_register_get_index
(
env
->
isa
->
sp
));
rbitset_set
(
limited_bitset
,
arch_register_get_index
(
env
->
arch_env
->
sp
));
env
->
sp_req
.
limited
=
limited_bitset
;
env
->
sp_cls_req
.
type
=
arch_register_req_type_normal
;
env
->
sp_cls_req
.
cls
=
arch_register_get_class
(
env
->
isa
->
sp
);
env
->
sp_cls_req
.
cls
=
arch_register_get_class
(
env
->
arch_env
->
sp
);
/* Beware: later we replace this node by the real one, ensure it is not CSE'd
to another Unknown or the stack pointer gets used */
save_optimization_state
(
&
state
);
set_optimize
(
0
);
env
->
init_sp
=
dummy
=
new_r_Unknown
(
irg
,
env
->
isa
->
sp
->
reg_class
->
mode
);
env
->
init_sp
=
dummy
=
new_r_Unknown
(
irg
,
env
->
arch_env
->
sp
->
reg_class
->
mode
);
restore_optimization_state
(
&
state
);
FIRM_DBG_REGISTER
(
env
->
dbg
,
"firm.be.abi"
);
...
...
@@ -2168,7 +2167,7 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
Beware: init backend abi call object after processing calls,
otherwise some information might be not yet available.
*/
env
->
cb
=
env
->
call
->
cb
->
init
(
env
->
call
,
&
birg
->
main_env
->
arch_env
,
irg
);
env
->
cb
=
env
->
call
->
cb
->
init
(
env
->
call
,
birg
->
main_env
->
arch_env
,
irg
);
/* Process the IRG */
modify_irg
(
env
);
...
...
@@ -2261,11 +2260,9 @@ void be_abi_fix_stack_nodes(be_abi_irg_t *env)
be_irg_t
*
birg
=
env
->
birg
;
be_lv_t
*
lv
=
be_get_birg_liveness
(
birg
);
fix_stack_walker_env_t
walker_env
;
arch_isa_t
*
isa
;
walker_env
.
sp_nodes
=
NEW_ARR_F
(
ir_node
*
,
0
);
walker_env
.
arch_env
=
&
birg
->
main_env
->
arch_env
;
isa
=
walker_env
.
arch_env
->
isa
;
walker_env
.
arch_env
=
birg
->
main_env
->
arch_env
;
irg_walk_graph
(
birg
->
irg
,
collect_stack_nodes_walker
,
NULL
,
&
walker_env
);
...
...
@@ -2301,7 +2298,7 @@ void be_abi_fix_stack_nodes(be_abi_irg_t *env)
ir_node
*
phi
=
phis
[
i
];
be_set_phi_reg_req
(
walker_env
.
arch_env
,
phi
,
&
env
->
sp_req
);
be_set_phi_flags
(
walker_env
.
arch_env
,
phi
,
arch_irn_flags_ignore
|
arch_irn_flags_modify_sp
);
arch_set_irn_register
(
walker_env
.
arch_env
,
phi
,
env
->
isa
->
sp
);
arch_set_irn_register
(
walker_env
.
arch_env
,
phi
,
env
->
arch_env
->
sp
);
}
be_ssa_construction_destroy
(
&
senv
);
...
...
@@ -2310,7 +2307,7 @@ void be_abi_fix_stack_nodes(be_abi_irg_t *env)
static
int
process_stack_bias
(
be_abi_irg_t
*
env
,
ir_node
*
bl
,
int
real_bias
)
{
const
arch_env_t
*
arch_env
=
&
env
->
birg
->
main_env
->
arch_env
;
const
arch_env_t
*
arch_env
=
env
->
birg
->
main_env
->
arch_env
;
int
omit_fp