On 08/28/14 02:37, Ilya Enkovich wrote:
2014-08-28 1:39 GMT+04:00 Jeff Law <l...@redhat.com>:
On 08/26/14 15:42, Ilya Enkovich wrote:

diff --git a/gcc/calls.c b/gcc/calls.c
index 4285ec1..85dae6b 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1122,6 +1122,14 @@ initialize_argument_information (int num_actuals
ATTRIBUTE_UNUSED,
       call_expr_arg_iterator iter;
       tree arg;

+    if (targetm.calls.implicit_pic_arg (fndecl ? fndecl : fntype))
+      {
+       gcc_assert (pic_offset_table_rtx);
+       args[j].tree_value = make_tree (ptr_type_node,
+                                       pic_offset_table_rtx);
+       j--;
+      }
+
       if (struct_value_addr_value)
         {
         args[j].tree_value = struct_value_addr_value;

So why do you need this?  Can't this be handled in the call/call_value
expanders or what about attaching the use to CALL_INSN_FUNCTION_USAGE from
inside ix86_expand_call?  Basically I'm not seeing the need for another
target hook here.  I think that would significantly simply the patch as
well.

GOT base address become an additional implicit arg with EBX relaxed
and I handled it as all other args. I can move EBX initialization into
ix86_expand_call. Would still need some hint from target to init
pic_offset_table_rtx with proper value in the beginning of function
expand.
It doesn't really need to be an argument in the traditional sense and adding it just complicates things with a target implementation detail as far as I can see.

I think you'll find that if you have the call pattern emit a copy from pic_offset_table_rtx into EBX and attach of use of EBX to the call then most of the code you've written to add the implicit argument just disappears.

jeff

Reply via email to