On Sat, Jan 13, 2018 at 7:56 AM, Jan Hubicka <hubi...@ucw.cz> wrote: >> >> +/* Output a funtion with a call and return thunk for indirect branch. >> >> + If BND_P is true, the BND prefix is needed. If REGNO != -1, the >> >> + function address is in REGNO. Otherwise, the function address is >> >> + on the top of stack. */ >> >> + >> >> +static void >> >> +output_indirect_thunk_function (bool need_bnd_p, int regno) >> >> +{ >> >> + char name[32]; >> >> + tree decl; >> >> + >> >> + /* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */ >> >> + indirect_thunk_name (name, regno, need_bnd_p); >> >> + decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, >> >> + get_identifier (name), >> >> + build_function_type_list (void_type_node, NULL_TREE)); >> >> + DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL, >> >> + NULL_TREE, void_type_node); >> >> + TREE_PUBLIC (decl) = 1; >> >> + TREE_STATIC (decl) = 1; >> >> + DECL_IGNORED_P (decl) = 1; >> > >> > DECL_ARTIFICIAL as well? >> >> This is done exactly the same way as PIC thunk. I don't think we >> should change it here. >> > >> > Why do you need to output asm visibility directives by hand when you create >> > symbol for the function anyway? >> >> This is done exactly the same way as PIC thunk. I don't think we >> should change it here. > > I see, it is pretty ancient code. Perhaps you can at least commonize > the uglness so we don't duplicate the ifdefs for MACHO?
I don't think we should such surgery at such late stage. I prefer to keep it for later cleanup. >> >> > I would expect that you can just use similar code as >> > cgraph_node::expand_thunk >> > when calls output_mi_thunk and get this done in a way that is independent >> > of >> > target assembler. >> >> I took a look. I don't see an easy to do it. I'd like to keep it exactly >> the >> same as PIC thunk. And we change both thunks together later if needed. > > OK, lets keep it done same was as PIC thunk. > Next stage1 we could clean up both. >> > I suppose it may make sense to split the insn and at least explicitly >> > represent >> > the fact that we (sometimes) push the target to stack. >> >> Did you mean "split the function"? I will break it into >> ix86_output_indirect_branch_via_reg and >> ix86_output_indirect_branch_via_push. > > I mean define_split to insert push instruction into the instruction > stream rather then printing it as part of the indirect jump insn. We don't want anything added between these instructions. Split it may lead to trouble. >> >> > Why the memory variant exists at first place? >> >> When the function address is in memory, we can push it onto stack >> to save a register. Also it is needed to cover "call foo" to "call >> [foo@GOT]" >> conversion. >> > >> > I think you also want to update type to "many" when we do more than just >> > indirect branch. >> >> Did you mean "multi"? I will change to "multi". > > Yes. > >> >> > We do not care much about this, but it feels wrong to have attributes off >> > reality. >> >> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi >> >> index f3e4a63ab46..ddb6035be96 100644 >> >> --- a/gcc/doc/extend.texi >> >> +++ b/gcc/doc/extend.texi >> >> @@ -5754,6 +5754,16 @@ Specify which floating-point unit to use. You >> >> must specify the >> >> @code{target("fpmath=sse+387")} because the comma would separate >> >> different options. >> >> >> >> +@item indirect_branch("@var{choice}") >> >> +@cindex @code{indirect_branch} function attribute, x86 >> >> +On x86 targets, the @code{indirect_branch} attribute causes the compiler >> >> +to convert indirect call and jump with @var{choice}. @samp{keep} >> >> +keeps indirect call and jump unmodified. @samp{thunk} converts indirect >> >> +call and jump to call and return thunk. @samp{thunk-inline} converts >> >> +indirect call and jump to inlined call and return thunk. >> >> +@samp{thunk-extern} converts indirect call and jump to external call >> >> +and return thunk provided in a separate object file. >> > >> > Please expand the documentation in a way that random user who is not aware >> > of the >> > issue will understand that those are security features that come at a cost. >> > >> >> +@opindex -mindirect-branch >> >> +Convert indirect call and jump with @var{choice}. The default is >> >> +@samp{keep}, which keeps indirect call and jump unmodified. >> >> +@samp{thunk} converts indirect call and jump to call and return thunk. >> >> +@samp{thunk-inline} converts indirect call and jump to inlined call >> >> +and return thunk. @samp{thunk-extern} converts indirect call and jump >> >> +to external call and return thunk provided in a separate object file. >> >> +You can control this behavior for a specific function by using the >> >> +function attribute @code{indirect_branch}. @xref{Function Attributes}. >> > >> > Similarly here. >> >> I will update documentation with user guide info after Intel white >> paper is published. > > OK, > thanks! > Honza >> >> > Rest of the patch seems OK. We may want incrementally represent more of the >> > indirect jump/call seqeuence in RTL, but at this point probably keeping >> > things >> > simple and localized is not a bad idea. This can be done incrementally. >> > >> > Please make updated patch and I would like to give others chance to >> > comment today. >> > >> > Honza >> >> >> >> -- >> H.J. -- H.J.