This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Avoid stack references in inline assembly
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: Vincent Rivière <vincent dot riviere at freesbee dot fr>
- Cc: gcc at gcc dot gnu dot org
- Date: Mon, 17 Jun 2019 17:11:15 -0500
- Subject: Re: Avoid stack references in inline assembly
- References: <5d80339e-ad14-5a81-35ed-a3f83712231a@freesbee.fr>
Hi!
On Mon, Jun 17, 2019 at 10:28:37PM +0200, Vincent Rivière wrote:
> My goal is to create optimal C bindings for Atari ST system calls, using
> m68k-elf-gcc (tested with version 7.1.0). Basically, system calls are
> similar to function calls: parameters are stacked in the reverse order,
> last one being a function number. But there are 2 differences from standard
> C calling convention:
> - actual jump to subroutine is replaced by trap #1
> - clobbered registers include d2/a2 in addition to standard d0-d1/a0-a1
>
> Here is the problem. If I use "g" as parameter constraint, everything looks
> fine, but GCC may replace the parameter token with a reference to a stack
> location (specially when compiling with -fomit-frame-pointer). If another
> parameter has already been pushed on the stack, the reference to the second
> one is not properly adjusted, so the pushed address is wrong.
You could make a builtin for this, so that you can say something like
retval = __builtin_syscall_m68k_st (syscall_nr, arg0, arg1);
(which can be varargs, take any number of args you support). We could
have a generic builtin for this, hrm... Like
retval = __builtin_syscall (STYLE, syscall_nr, arg0, arg1);
with some target hook that checks if the STYLE is something it supports,
and then if the number and type of remaining args are okay.
I've never seen a target that could define their syscalls perfectly with
just existing facilities, inline asm is such a blunt intrument in some
ways.
Segher