The LLVM+SDCC toolchain
colecovision.eu
colecovision.eu
this is pretty cool... the gameboy (gbz80) processor is supported. now we can make late 80s gameboy roms on any 2016 llvm supported language
It might have an SNES mode too. Note that even the 65c816 isn't good enough to run most C and your "portable" C code probably isn't portable if int isn't 32 bits anymore!
Rust recently gained support for systems with 16-bit integers and pointers, in order to support AVR. It'd be challenging, and some of the libraries might not work out of the box, but it's worth a shot.
The much harder part would be supporting various memory windowing techniques.
At least they added stack-relative addressing, which is a huge improvement over the 6502.
Rearrange functions in source file? ICE!
Reorder variable definitions? ICE!
It was very cool to end up with a working .gb rom but the process was not a great experience. Hopefully this addresses some of the compiler reliability.
EDIT: play my crappy game https://code.ivysaur.me/shmup/
I have been mulling over the idea of adding backends for the various 8bit and 16bit microprocessors directly to llvm.
It's honestly probably the best way of going about it. The target-independent backend in LLVM really isn't designed for these kinds of architectures. When you have pointers that don't fit in registers, an extremely register-starved architecture (6502), crippled "index registers", no stack-relative addressing, a tiny stack, odd concepts like zero-page, etc. then most of LLVM's codegen infrastructure isn't applicable.
I'm sure it's technically possible to slot some kind of 8-bit codegen into the framework, but the fact that it's been tried many times and hasn't succeeded indicates to me that it's just not worth it. It seems a lot easier to just write a custom code generator that lowers LLVM IR to the target with its own mechanisms, and using the SDCC backend is likely as reasonable a choice as any other.
packet __xdata * __data rx_packet;
a pointer to (16-bit addresses) external data space stored in (8-bit addressed) local data space. Any useful compiler for an 8051 is going to need these SDCC extensionsE.g. Clang front end reads C code and emits LLVM IR. The LLVM backend (llvm-as) then reads the IR and generates target machine code.
IE LLVM does not make C magically portable, because C requires and creates target-specific information (for example sizeof).
To give a simple example, you can't take:
int *foo;
printf("%d\n", sizeof(foo))
Compile it on a 16 bit platform to llvm bitcode
and then run compile/run the llvm bitcode on a 64 bit platform, and get the right answer for that platform, and llvm can't solve this.The long story on this one is that it's basically not possible to even just move this stuff to dynamic evaluation in a frontend because you can depend on target specific things in the preprocessor, IIRC. Otherwise, you could, but it'd generate super-slow code unless you built llvm intrinsics for all these things, and then lowered them once you had target specific info.
I believe TeNDRA and friends could do this at one point, but i might be misremembering (i've deliberately blocked most of my knowledge of ANDF)
Well, unless you go the whole way and interpret the language itself like CINT :)
The IR code itself is "portable", but the C to IR compiler is using target specific information?
(I've just been learning about assemblers and compilers, still trying to wrap my mind around this stuff. Would there be much educational value in writing IR code by hand?)
Right. Consider how you'd compile something as simple as printf("%d", (int)sizeof(int));
However, Clang does not do this and emits a constant integer for sizeof() operations (according to my quick and dirty test).