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
355d06b2
Commit
355d06b2
authored
Aug 17, 2011
by
Christoph Mallon
Browse files
Allow selecting one past the last parameter to get variadic parameters.
parent
8fc8db57
Changes
2
Hide whitespace changes
Inline
Side-by-side
ir/be/beabi.c
View file @
355d06b2
...
...
@@ -1169,6 +1169,7 @@ static ir_type *compute_arg_type(ir_graph *irg, be_abi_call_t *call,
ir_type
*
frame_type
=
get_irg_frame_type
(
irg
);
size_t
n_params
=
get_method_n_params
(
method_type
);
size_t
n_frame_members
=
get_compound_n_members
(
frame_type
);
size_t
n_real_params
=
n_params
;
size_t
f
;
int
ofs
=
0
;
...
...
@@ -1176,7 +1177,12 @@ static ir_type *compute_arg_type(ir_graph *irg, be_abi_call_t *call,
size_t
i
;
ir_entity
**
map
;
*
param_map
=
map
=
OALLOCNZ
(
obst
,
ir_entity
*
,
n_params
);
/* Allow selecting one past the last parameter to get the variadic
* parameters. */
if
(
get_method_variadicity
(
method_type
)
==
variadicity_variadic
)
++
n_real_params
;
*
param_map
=
map
=
OALLOCNZ
(
obst
,
ir_entity
*
,
n_real_params
);
res
=
new_type_struct
(
new_id_from_chars
(
"arg_type"
,
8
));
/* collect existing entities for value_param_types */
...
...
@@ -1188,11 +1194,11 @@ static ir_type *compute_arg_type(ir_graph *irg, be_abi_call_t *call,
if
(
!
is_parameter_entity
(
entity
))
continue
;
num
=
get_entity_parameter_number
(
entity
);
assert
(
num
<
n_params
);
assert
(
num
<
n_
real_
params
);
if
(
map
[
num
]
!=
NULL
)
panic
(
"multiple entities for parameter %u in %+F found"
,
f
,
irg
);
if
(
!
get_call_arg
(
call
,
0
,
num
,
1
)
->
on_stack
)
{
if
(
num
!=
n_params
&&
!
get_call_arg
(
call
,
0
,
num
,
1
)
->
on_stack
)
{
/* don't move this entity */
continue
;
}
...
...
@@ -1224,6 +1230,11 @@ static ir_type *compute_arg_type(ir_graph *irg, be_abi_call_t *call,
}
set_type_size_bytes
(
res
,
ofs
);
set_type_state
(
res
,
layout_fixed
);
if
(
n_params
!=
n_real_params
&&
map
[
n_params
]
!=
NULL
)
{
set_entity_offset
(
map
[
n_params
],
ofs
);
}
return
res
;
}
...
...
ir/lower/lower_dw.c
View file @
355d06b2
...
...
@@ -1606,7 +1606,15 @@ static void fix_parameter_entities(ir_graph *irg)
ir_type
*
orig_mtp
=
get_type_link
(
mtp
);
size_t
orig_n_params
=
get_method_n_params
(
orig_mtp
);
ir_entity
**
parameter_entities
=
ALLOCANZ
(
ir_entity
*
,
orig_n_params
);
size_t
orig_n_real_params
=
orig_n_params
;
ir_entity
**
parameter_entities
;
/* Allow selecting one past the last parameter to get the variadic
* parameters. */
if
(
get_method_variadicity
(
orig_mtp
)
==
variadicity_variadic
)
++
orig_n_real_params
;
parameter_entities
=
ALLOCANZ
(
ir_entity
*
,
orig_n_real_params
);
ir_type
*
frame_type
=
get_irg_frame_type
(
irg
);
size_t
n
=
get_compound_n_members
(
frame_type
);
...
...
@@ -1620,19 +1628,24 @@ static void fix_parameter_entities(ir_graph *irg)
if
(
!
is_parameter_entity
(
entity
))
continue
;
p
=
get_entity_parameter_number
(
entity
);
assert
(
p
<
orig_n_params
);
assert
(
p
<
orig_n_
real_
params
);
assert
(
parameter_entities
[
p
]
==
NULL
);
parameter_entities
[
p
]
=
entity
;
}
/* adjust indices */
n_param
=
0
;
for
(
i
=
0
;
i
<
orig_n_params
;
++
i
,
++
n_param
)
{
for
(
i
=
0
;
i
<
orig_n_
real_
params
;
++
i
,
++
n_param
)
{
ir_entity
*
entity
=
parameter_entities
[
i
];
ir_type
*
tp
=
get_method_param_type
(
orig_mtp
,
i
);
ir_type
*
tp
;
if
(
entity
!=
NULL
)
set_entity_parameter_number
(
entity
,
n_param
);
if
(
i
==
orig_n_params
)
break
;
tp
=
get_method_param_type
(
orig_mtp
,
i
);
if
(
is_Primitive_type
(
tp
))
{
ir_mode
*
mode
=
get_type_mode
(
tp
);
if
(
mode
==
env
->
high_signed
||
mode
==
env
->
high_unsigned
)
{
...
...
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