[M3devel] M3 on Raspberry Pi cont'd...
Jay K
jay.krell at cornell.edu
Tue Oct 15 01:55:44 CEST 2013
> I found that CVS had mangled RTMachine.i3
Maybe you had edited it?
Maybe also I deleted it? In general we had way more than necessary
target-specific code and files and in general I have significantly reduced it.
CVS doesn't deal well with merge conflicts. It leaves merge markers in, and
isn't quick to remind of the need to merge. Perforce is vastly superior here.
> make: *** No rule to make target `c-family/c-pragma.h', needed by `arm.o'. Stop
This is probably easy.
I removed the gcc C frontends from the gcc backends.
But its "tentacles" could be target-specific, and I didn't try building
every target.
> C backend requires M3_FRONT_FLAGS
I *might* be sitting on a small config file change.
I'm trying to flush my CVS checkouts of any pending changes.
Either way, not a big deal.
The error actually is good, if you know what it is talking about.
While everyone sees just cm3 with very few command line options, interally
there are many options. If you look at the 3.6 era config files, you'll
start to get an idea. Or read through all of our config files -- we do
use two of the three options available here.
There are three orders the frontend (m3front) is wiling to output nested procedures,
presumably:
1 before the functions they are in
2 at the point they are seen in the source
3 after the functions they are in
There are advantages and disadvantages to each choice, and various backends
might require one choice or the other. The frontend is I believe fairly stateful
so it is easy to report things in different orders.
#2 requires the backend to maintain more state, since it can see a function
in the middle of a function. i.e. it has to merely push what it is working in
when it sees begin_procedure, and pop when it sees end_procedure, instead of
just maintaining a "current procedure".
I believe the gcc backend can handle any order.
Though I recall one/some of the orders introduce a psuedo call to the backend "note_procedure_origin"
that the serializer between frontend and gcc errors on, deliberately.
The integrated backend is very simple and relatively stateless, so I think it
can't handle #2. Not that it is so difficult.
The C backend was originally very stateless, so also couldn't deal with #2.
IF nested functions aren't declared ahead of time -- I don't remember -- then
the original C backend required #3.
The C backend is now very stateful and I almost finished making it not care about the order here.
But I didn't finish that quite yet.
It maintains an in-memory array of records corresponding to the M3CG calls.
It loops over them multiple times. With an ability to easily filter certain operations.
I added the ability to loop over a range (i.e. begin_procedure to end_procedure),
which should make this easy, but it doesn't work yet.
The ramification is very minor.
Look for M3_FRONT in the config files.
I thought I already handled it based on the backend mode.
For that matter, the "builder" could or C backend initialization could probably make it so.
Ideally this configuration knob would go away. One order picked that works and all backends
deal with it.
As you mention, computers have gotten a lot faster since DEC SRC was designed/implemented.
This desire to not require backends to hold an entire "program" in memory is largely antiquated.
Mainstream commercial C and C++ compilers regularly do whole program codegen/optimization now and have been
doing so for over 10 years.
(our mklib.exe actually is in the way of using Visual C++'s whole program codegen..it reads .obj files..,
but given our historical code quality being pretty poor anyway, and nobody noticing, I'm not too worried..)
> but after fixing that I get a boot archive! Very exciting. What do I do now?
One of two options:
1) Less usual: If you have a cross C compiler/linker, ignore the archive, cd into the directory
it was built from, edit the Makefile, make
I had built ARM_DARWIN this way, and the Makefile for that target assumes it, just the few
lines at the top that set the C compiler name/flags.
2) Usual: If you don't have a cross C compiler/linker, and you do have a native C compiler/linker,
copy the boot archive (or the directory it is built from) to the target machine, extract it, cd into it, make,
possibly first editing the Makefile (you know, we don't use autoconf/automake, and a lot
of what we do is duplicating them..)
If that succeeds, you will have cm3.
On the new target machine:
Run it
If it says "can't find cm3.cfg", that is success so far.
If it doesn't say that, or crashes, debug it.
mkdir -p /usr/local/cm3/bin
cp cm3 /usr/local/cm3/bin
cd somewhere (again, on the new target machine)
cvs checkout
scripts/python/boot2.py that will build the entire system starting from just the cm3 (and a native C compiler/linker)
Document your experience better than I have and what needs to change.
> This machine is quite slow, maybe it would be nice to have a version of the front end
> that generates C without comments? :) (I'm not saying it should be the default.)
Yeah..there are some globals controlling it.
It is a tough tradeoff performance vs. debuggability...granted, the comments are gibberish
to most people. But I like to have the debuggability...
Going through C is also noticably slower. That is a downside to the ease of development
and portability it brings.
One thing I'd like to do is batch it up so we pass all the C files to the compiler at once.
At least the out of date ones. I know that is much faster with the Microsoft C compiler --
I even changed the boot archive to work that way -- I think for all targets actually.
- Jay
> To: jay.krell at cornell.edu
> CC: m3devel at elegosoft.com
> Subject: M3 on Raspberry Pi cont'd...
> Date: Mon, 14 Oct 2013 16:11:31 -0700
> From: mika at async.caltech.edu
>
>
> A bit of success... I found that CVS had mangled RTMachine.i3 (why??) and that was causing things to go very wrong.
>
> I did manage to upgrade my compiler to the head.
>
> ./boot1.py ARMEL_LINUX still leads to the tree error:
>
> make: *** No rule to make target `c-family/c-pragma.h', needed by `arm.o'. Stop.
>
> ./boot1.py c ARMEL_LINUX results in a new problem:
>
> ../src/runtime/common/RTAllocator.m3", line 14: internal_begin_procedure: in_proc; C backend requires M3_FRONT_FLAGS = ["-unfold_nested_procs"] in config file
>
> but after fixing that I get a boot archive! Very exciting. What do I do now? I'm trying to run everything through cc -O3 -c
>
> This machine is quite slow, maybe it would be nice to have a version of the front end that generates C without comments? :) (I'm not saying it should be the default.)
>
> Mika
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20131014/a410a378/attachment-0002.html>
More information about the M3devel
mailing list