I've been playing around with writing a C compiler that I call taz. It implements a subset of the C language that only contains the types int, short and char. They can be signed or unsigned. It also supports pointers and one-dimensional arrays. It supports the main C features of if, else, while and for. It currently doesn't support structs or unions, and it doesn't support do, switch, case, goto, enum or typedef.
taz compiles code to P2 assembly, and I use the qasm assembler to produce object files. The object files can be link together using a linker I wrote called qlink. Object files can be copied together to create larger files, or if they use a .a extension they are treated as libraries.
One useful feature of taz is that it can produce position-independent-code, which makes that task of relocating and linking object files easier. It also makes it possible to produce executable files that can be executed anywhere in memory. This is useful for reading executable files from an SD card an running them.
taz isn't intended to be a replacement for gcc. It's just a way to write high level code until gcc and spin are available. Cygwin or linux is require to build and run taz. The scripfile, tzc is a bash script that is used to compile C programs and produce a P2 executable. Look at the readme.txt file in the top directory of the zip file for more information.
EDIT: I should mention that this is still a work in progress. The taz compiler itself is mostly done, but there is still a lot of work to do on the preprocessor and implementing an optimizer. Taz generates highly unoptimized code. At some point I also intend to write a converter that will convert standard C with structs, unions and typedefs into the simpler taz C language.