[llvm-dev] Altering the return address , for a function with multiple return paths
Joan Lluch via llvm-dev
llvm-dev at lists.llvm.org
Sun Jul 21 05:14:41 PDT 2019
Hy Jay,
This trick can certainly be used by someone coding in assembly language directly, but I do not think this is possible for a compiler to do so. High level language functions are supposed to have a single entry point and a single return address to the instruction just next to the call. Virtually all high level languages and their compilers are designed according to these semantics and processors are optimized for that too. Inside the callee, the compiler may optimise the actual placement of the return code or it may repeat code to avoid branching, the compiler may also perform tail call optimisations that modify the standard return procedure, but the proper epilog code will effectively be executed in all cases with identical return value and execution transfer to the same return address.
In order for a compiler to implement what you suggest, I think that some explicit semantics would have to be incorporated to the high level languages being compiled. Currently, in order to declare a function to return a Float64 or an Int8 depending on external conditions, the user must either use function overloads, or function templates, or closures (on languages supporting them). In all these cases, the user must either explicitly declare a function for every type, or the compiler may generate a separate function for every type use case. So in reality the case where a single function may return multiple types does not happen. My point is that since in high level languages there’s no way to specify multiple return types for the same function, there’s no real use case where the compiler may want to do so. Unless I misunderstood your question.
Joan
> On 21 Jul 2019, at 11:06, Tsur Herman via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Playing around with calling conventions naked functions and epilogue/prologue...
> Is it possible/expressible/feasible to alter the return address the function will return to?
>
> For example, when a function may return an Int8 or a Float64, depending on some external state
> (user, or random variable), instead of checking the returned type in the calling function, is it possible
> to pass 2 potential return addresses one suitable for Int8 and one suitable for Float64 and let the function return to the right place?
>
> if it is possible, what are the implications? do these inhibit the optimization opportunities somehow?
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list