Here are some help to port GNU Prolog.

1) I suppose you are in ROOT_DIR/src:

   . ./SETVARS        (or source CSHSETVARS if you are under csh)
   ./configure --with-c-flags=debug

--with-c-flags=debug is a "good" option to allow you to use the C
debugger, you can always use this until a final point is reached.


This allows you to execute the locally compiled version (see file DEVELOPMENT for
more info).

2) Modify the following files to create an entry M_<processor>_<os>

configure.in              (+CFLAGS and others)
EnginePl/gp_config.h.in   (M_<processor>_<os>)
EnginePl/machine.h        (+regs)
eventually look at EnginePl/arch_dep.h

3) you must be able to compile the following:

   cd EnginePl ; make engine.o engine1.o


4) Create the translation file (in the Ma2Asm/ directory). GNU Prolog compiles a
Prolog source to a low-level machine independent language called mini-assembly. You
have to write a translator for the target machine (mini-asm to assembly). You can use
an existing translation file as example and/or look at the assembly produced by
gcc. For that you can do:

   cd Ma2Asm/FromC
   make

This will create a file asm_inst.s from asm_inst.c. The study of both files can help
you to write the translater (in Ma2Asm/).

You can check your translation using the chkma program (in Ma2Asm/):

   make chkma
   ./chkma

You should obtain something like:

reg_bank=&X(0):0x8052a00   B:0x8053ac0   E:0x8054ac0  &Y(0):0x8054ab0
stack:0x8053ac0
test 1: c_code initializer...
test 1  OK
test 2: long local/global ...
test 2  OK
test 3: pl_jump/pl_ret...
test 3  OK
test 4: pl_call/pl_ret/pl_fail...
test 4  OK
test 5: prep_cp/here_cp...
test 5  OK
test 6: jump/c_ret...
test 6  OK
test 7: call_c(void)...
test 7  OK
test 8: move X(i) to Y(j)...
test 8  OK
test 9: move Y(i) to X(j)...
test 9  OK
test 10: call_c(int)...
test 10  OK
test 11: call_c(double)...
test 11  OK
test 12: call_c(string)...
test 12  OK
test 13: call_c(mem,&label,mem(...),&mem(...))...
test 13  OK
test 14: call_c(X())...
test 14  OK
test 15: call_c(Y())...
test 15  OK
test 16: call_c(FL())...
test 16  OK
test 17: call_c(FD())...
test 17  OK
test 18: call_c(lot_of_args)...
test 18  OK
test 19: call_c()+jump_ret...
test 19  OK
test 20: call_c()+fail_ret...
test 20  OK
test 21: call_c()+move_ret mem...
test 21  OK
test 22: call_c()+move_ret X()...
test 22  OK
test 23: call_c()+move_ret Y()...
test 23  OK
test 24: call_c()+move_ret FL()...
test 24  OK
test 25: call_c()+move_ret FD()...
test 25  OK
test 26: call_c()+switch_ret...
test 26  OK
MA checks succeeded

(you can use make clean-chkma to erase chkma objects/execs)

All tests must be OK else you have an error in the corresponding tested point.

At this point you should discover which part is not OK. 

5) Check that ObjChain works:

ObjChain is a way to find at run-time which Prolog modules are linked (to then
initialize them). Normally this should be OK but you can test it.

   cd EnginePl
   make test_oc
   ./test_oc

This will find 5 modules and display something like:

starting...
object <object #5> found  &name:0x804c200
object <object #4> found  &name:0x804c1e0
object <object #3> found  &name:0x804c1c0
object <object #2> found  &name:0x804c1a0
object <object #1> found  &name:0x804c180
finished - OK !

The important point to check is if 5 modules are found and preferably in reverse
order. If not you have to debug the file EnginePl/obj_chain.c. Since 1.3.0 we use gcc
__atribute__((constructor)).

(you can use make clean-test_oc to erase test objects/execs)


6) When this is OK (i.e. a Prolog program can be compiled and executed) you will have
to check if the stack overflow detection is ok. See file EnginePl/machine.c (function
SIGSEGV_Handler). The important point here is to obtain the address which caused the
SIGSEGV (the rest of the function detects which stack is involved from that
address).  look at the files EnginePl/*_SIGSEGV.C



other things to do when porting:
	ma2asm (use chkma)
	(call_c needs at least 7 args)
	test with all combinations of mapped registers

machine.c: SIGSEGV_Handler

engine1.c:
	what to do #ifndef MAP_REG_BANK

things to test:
	linedit
	floats (e.g. write(1.23),...)
	statistics
	os stuffs
	random
	ctrl/c (prg TEST_CTRLC.c)

7) Once all compile fine and pl2wam and gprolog executables are created you can check
the bootstrapping by:

   cd Pl2Wam
   make check
   Bootstrap Prolog Compiler OK

the same for Built-ins;

   cd ../BipsPl
   make check
   Bootstrap Prolog Bips OK


LocalWords:  asm_inst.s asm_inst.c chkma label,mem initialize clean-test_oc
LocalWords:  linedit
