On Thu, Aug 28, 2014 at 2:54 PM, Ilya Enkovich <enkovich....@gmail.com> 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. >> >> Maybe you can you use get_hard_reg_initial_val for this? > > Actually there is no input hard reg holding GOT address. Currently I > use initialization with ebx with following ebx initialization in > prolog_epilog pass. But this is a temporary workaround. It is > inefficient because always uses callee save reg to get GOT address. I > suppose we should generate pseudo reg for pic_offset_table_rtx and > also set_got with this register as a destination in expand pass. > After register allocation set_got may be transformed into get_pc_thunk > call with proper hard reg. But some target hook has to be used for > this. Let me expand my idea a bit. IIRC, get_hard_reg_initial_val and friends will automatically emit intialization of a pseudo from pic_offset_table_rtx hard reg. After reload, real initialization of pic_offset_table_rtx hard reg is emitted in pro_and_epilogue pass. I don't know if this works with current implementation of dynamic pic_offset_table_rtx selection, though. Uros.