Porting to a custom ISA

2023-08-15 Thread MegaIng via Gcc

Hello everyone,

I am currently in the process of porting gcc to an ISA I designed with a 
few others (spec [1]). Using the old ggx/moxie tutorial as a guideline 
and looking at the source of other backends, as well as the quite decent 
gccint document, I managed to get basic programs running (binutils, 
especially gas, was also not too hard to get running). I am now 
partially writing here because the gccint documents tells me to do this 
(I am unsure if our project will ever be mature enough to be added to 
gcc, but I don't think it hurts to strive for that), and partially 
because I do need a bit of help with some stuff that I can't find 
documentation for.


One of the big challenges I am facing is that for our backend we 
sometimes support 16bit as the max size a CPU supports, including for 
pointers, and sometimes 32bit or 64bit. Am I seeing it correctly that 
POINTER_SIZE has to be a compile time constant and can therefore not 
easily be changed by the backend during compilation based on command 
line arguments?


Also, on another backend I saw comments relating to libgcc (or newlib?) 
not working that well on systems where int is 16bit. Is that still true, 
and what is the best workaround?


And a bit more concrete with something I am having a hard time 
debugging. I am getting errors `invalid_void`, seemingly triggered by an 
absent of `gen_return` when compiling with anything higher than -O0. How 
do I correctly provide an implementation for that? Or disable it's 
usage? Our epilogue is non-trivial, and it doesn't look like the other 
backends use something like `(define_insn "return" ...)`.


Many thanks in advance,

MegaIng


[1]: https://github.com/ETC-A/etca-spec



Re: Porting to a custom ISA

2023-08-15 Thread MegaIng via Gcc



On Aug 15, 2023, at 7:37 AM, Paul Koning wrote:




On Aug 15, 2023, at 7:37 AM, MegaIng via Gcc  wrote:

...
Also, on another backend I saw comments relating to libgcc (or newlib?) not 
working that well on systems where int is 16bit. Is that still true, and what 
is the best workaround?

I haven't seen that comment and it doesn't make sense to me.  Libgcc certainly 
is fine for 16 bit targets -- after all, GCC supports pdp11 which is such a 
target.  And while newlib doesn't have pdp11 support I have done some fragments 
of pdp11 support for it, to give me a way to run the execution part of the GCC 
test suite.  One of these days I should do a better job.  As far as I know it's 
entirely doable.
The comment is in msp430.h and rl78.h, line 160. And it appears quite 
common to artifically set `UNITS_PER_WORD` to 4 instead of the correct 2 
or 1 when compiling libgcc accross other backends as well, including 
avr, gcn. Is this out-of-date and no longer required for libgcc?

pdp11, in GCC, can have either 16 or 32 bit int, it's a compiler option.  
Pointers are 16 bits, of course.  And it does support larger types (even 64 
bits), expanding into multiple instructions or libgcc calls.  A lot of that is 
handled by common code; the pdp11.md machine description handles a few of them 
to optimize those cases beyond what the common code would produce.  If you're 
doing a 16 bit target you might look at pdp11 for ideas.  One limitation is 
that right now it does only C, mainly because the object format is a.out rather 
than ELF.  That could be fixed.

Thank you, I will take a closer look at pdp11.


paul


Re: Porting to a custom ISA

2023-08-15 Thread MegaIng via Gcc



On 2023-08-15 15:30, Paul Koning wrote:



On Aug 15, 2023, at 8:56 AM, MegaIng  wrote:


Am 2023-08-15 um 14:48 schrieb Paul Koning:

On Aug 15, 2023, at 8:06 AM, Richard Biener via Gcc  wrote:

On Tue, Aug 15, 2023 at 1:38 PM MegaIng via Gcc  wrote:

...
And a bit more concrete with something I am having a hard time
debugging. I am getting errors `invalid_void`, seemingly triggered by an
absent of `gen_return` when compiling with anything higher than -O0. How
do I correctly provide an implementation for that? Or disable it's
usage? Our epilogue is non-trivial, and it doesn't look like the other
backends use something like `(define_insn "return" ...)`.

Somebody else has to answer this.

Again using pdp11 as an example -- it doesn't define any of the *return patterns either.  
Instead it has a define_expand "epilogue" which calls a function to generate 
all the necessary elements, the last of which is a machine-specific pattern that will 
produce the final return instruction.

This is using the RTL flavor of prologue/epilogue.  At one point in the past 
that target directly emitted the assembly code for those, which isn't the 
recommended approach.  I tried the RTL flavor and found it to be a better 
answer, and it certainly works for all the optimization levels.

Yeah, I am also using define_expand with prologue and epilogue, but for some 
reason gcc still calls gen_return from cfgrtl.cc line 1705 (might be 
out-of-sync with master) inside force_nonfallthru_and_redirect, and I don't 
really understand how to avoid that call. Do I need to define some extra target 
hooks or undefine some that I have?

I can't think of anything, but I wrote that code a while ago.

Does your epilog RTL end with an jump type RTL that will produce the actual function 
return instruction?  See pdp11.cc line 446 -- that's the final instruction of the epilog. 
 I made it an "emit_jump_insn" because that seemed the right thing to do, but 
it may be it's necessary for that to be a jump type RTL.


Yes, I also tried switching to `emit_jump_insn(ret_rtx)` instead, which 
a few backends use, but this doesn't make a difference. It seems to be 
that the error is unrelated to the epilogue. It fails during the "branch 
reordiering" pass, using code the docs attributed to a different pass 
from what I can tell.


during RTL pass: bbro
../test2.c: In function ‘display’:
../test2.c:18:1: internal compiler error: in invalid_void, at 
./insn-target-def.h:189

   18 | }
  | ^
0x77bf12 invalid_void
    ./insn-target-def.h:189
0x9d4a64 force_nonfallthru_and_redirect(edge_def*, basic_block_def*, 
rtx_def*)

    ../../gcc/cfgrtl.cc:1705
0x9d618c fixup_reorder_chain
    ../../gcc/cfgrtl.cc:4080
0x9d618c cfg_layout_finalize()
    ../../gcc/cfgrtl.cc:4575
0x14d8d50 execute
    ../../gcc/bb-reorder.cc:2682

I will try if I can find any difference in the settings between our 
setup and what pdp11 does.


MegaIng