File: HACKING

package info (click to toggle)
mes 0.24.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 6,908 kB
  • sloc: ansic: 24,104; lisp: 11,490; sh: 6,609; asm: 187; makefile: 36
file content (209 lines) | stat: -rw-r--r-- 8,635 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
                                                              -*- org -*-
#+TITLE: Hacking GNU Mes

* SETUP
    guix shell #64 bit + 32bit

    CC=i686-unknown-linux-gnu-gcc ./configure
    CC=arm-unknown-linux-gnueabihf-gcc ./configure

or
    ./configure

The 64bit bootstrap is not supported; MesCC needs work to be able to
compile a functional tinycc.

* BUILD

GNU Guile can be used as a replacement for Mes.  It's faster and has
much better error handling.

   #+BEGIN_SRC bash
   make MES=guile
   make check MES=guile
   #+END_SRC

Configure to compile with Tiny CC

   #+BEGIN_SRC bash
   ./configure CC=tcc --host=i686-unknown-linux-gnu --with-courage
   #+END_SRC

* DEBUG
  MES_DEBUG=<level> mes
** Levels
  1) Informational:
     - MODULEDIR
     - included SCM modules and sources
     - result of program
     - gc stats at exit
  2) opened files
  3) runtime gc stats
  4) detailed info
     - parsed, expanded program
     - list of builtins
     - list of symbol
     - opened input strings
     - gc details
  5) lots of data
     - usage of opened input strings
     - bytes read
  6) globals

* TESTING
** make check recheck=true TESTS="tests/base lib/tests/scaffold/t.c"
** mescc

*** To skip MES tests, in "./check.sh", comment-out check-boot.sh, check-mes.sh.

*** Running individual tests
#+BEGIN_SRC bash
cd gcc-lib
V=2 CC=i686-unknown-linux-gnu-gcc ../pre-inst-env test-c.sh ../lib/tests/scaffold/t.c
#+END_SRC

#+BEGIN_SRC bash
cd mescc-lib
V=2 CC=mescc ../pre-inst-env test-c.sh ../lib/tests/scaffold/t.c
#+END_SRC

* Bugs
** mes: performance, Mes is now 2-10x slower than Guile.
** mes/mescc lack support for fork/exec on the Hurd.
** mes: gcc-x86_64 compiled mes segfaults with small arena, or gc_up_arena.
** mes: gcc-x86 compiled, tests/srfi-13.test number->string INT-MIN fails:
test: number->string INT-MIN: fail
expected: -2147483648
actual: -./,),(-*,(
** tcc: tcc-built lib/libc+tcc.c segfaults with mes, with tcc.
** mes: remove pmatch-car/pmatch-cdr hack.
** mescc: softcode stack frame size, now hardcoded and very large
** mes+mescc: parse tcc.c->tcc.E works, compile tcc.E -> tcc.M1 segfaults.
  time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH ../mes/scripts/mescc -E -o tcc.E -I . -I ../mes/lib -I ../mes/include -D 'CONFIG_TCCDIR="usr/lib/tcc"' -D 'CONFIG_TCC_CRTPREFIX="usr/lib:{B}/lib:."' -D 'CONFIG_TCC_ELFINTERP="/gnu/store/70jxsnpffkl7fdb7qv398n8yi1a3w5nx-glibc-2.26.105-g0890d5379c/lib/ld-linux.so.2"' -D 'CONFIG_TCC_LIBPATHS="/home/janneke/src/tinycc/usr/lib:{B}/lib:."' -D 'CONFIG_TCC_SYSINCLUDEPATHS="../mes/include:usr/include:{B}/include"' -D CONFIG_USE_LIBGCC=1 -D 'TCC_LIBGCC="/home/janneke/src/tinycc/usr/lib/libc+tcc-gcc.mlibc-o"' -D CONFIG_TCC_STATIC=1 -D ONE_SOURCE=yes -D TCC_TARGET_I386=1 -D BOOTSTRAP=1 tcc.c
  time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH MES_ARENA=200000000 ../mes/scripts/mescc -c -o tcc.M1 tcc.E
** mescc: 64 bit compiled mes loses top 4 bytes
*** 64 bit mescc-compiled mes:
  #x100000000 => 0
  (modulo 1 #x100000000) => divide-by-zero
*** 64 bit gcc-compiled mes:
  #x100000000 => 0
  (modulo 1 #x100000000) => 1
** mescc: 7n-struct-struct-array.c:  struct file f = {"first.h"};
** test/match.test ("nyacc-simple"): hygiene problem in match
* OLD: Booting from LISP-1.5 into Mes

Mes started out experimenting with booting from a hex-coded minimal
LISP-1.5 (prototype in mes.c), into an almost-RRS Scheme.

When EOF is read, the LISP-1.5 machine calls loop2 from loop2.mes,
which reads the rest of stdin and takes over control.  The functions
readenv, eval and apply-env in mes.mes introduced define, define-macro
quasiquote and macro expansion.

While this works, it's amazingly slow.  We implemented a full reader
in mes.c, which makes running mes:apply-env mes:eval somewhat
bearable, still over 1000x slower than running mes.c.

Bootstrapping has been removed and mes.c implements enough of RRS to
run a macro-based define-syntax and syntax-rules.

loop.mes and mes.mes are unused and lagging behind.  Probably it's not
worth considering this route without a VM.  GNU Epsilon is taking the
more usual VM-route to provide multiple personas.  While that sounds
neat, Lisp/Scheme, bootstrapping and trusted binaries are probably not
in scope as there is no mention of such things; only ML is mentioned
while Guile is used for bootstrapping.

* Assorted ideas and info
** Using GDB on assembly/a.out
info registers
p/x $eax
p/x $edx
set disassemble-next-line on
gdb-display-disassembly-buffer
b *0x804a79d
** Create memory dump with 32 bit Gcc compiled Mes
make out/i686-unknown-linux-gnu-mes
out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo

x/s *((char **)($rsp+8))

** C parser/compiler
*** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
*** PEG: [[https://piumarta.com/software/peg/][parse C using PEG]]
*** [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
*** [[https://www.t3x.org/subc/index.html][Sub C]]
*** [[https://groups.google.com/forum/#!topic/comp.lang.lisp/VPuX0VsjTTE][C intepreter in LISP/Scheme/Python]]

** C assembler/linker
*** [[https://www.tldp.org/HOWTO/Assembly-HOWTO/linux.html][Assembly HOWTO]]
*** ELF
7f 45 4c 46
*** [[https://www.muppetlabs.com/~breadbox/software/tiny/][Small ELF programs]]
*** [[https://www.cirosantilli.com/elf-hello-world/][Elf hello world]]
** SC - c as s-expressions
sc: https://sph.mn/content/3d3
** RNRS
*** [[https://www.scheme-reports.org/][Scheme Reports]]
*** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf][Scheme - Report on Scheme]]
*** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-452.pdf][RRS - Revised Report on Scheme]]

** tiny schemes
https://forum.osdev.org/viewtopic.php?f=15&t=19937

https://www.stripedgazelle.org/joey/dreamos.html
https://armpit.sourceforge.net/
https://common-lisp.net/project/movitz/movitz.html

<civodul> janneke: https://github.com/namin/inc looks interesting  [15:18]
** Orians Jeremiah
<OriansJ> janneke: also, if you look at
          https://github.com/oriansj/stage0/tree/master/stage2/High_level_prototypes
          [the garbage collected lisp I implemented], if there are any pieces
          I could add to finish off your mes lisp bootstrap just let me know
          because I would be more than happy to do that :D
<janneke> OriansJ: that's what I'm hoping for, that our efforts can be
          complementary and we can work together
*** lfam (~lfam@2601:47:4180:2ffb:7c05:17de:cf5f:23ef) has quit: Ping timeout:
    246 seconds  [00:22]
<janneke> exciting times!  [00:23]
<janneke> OriansJ: i looked a few times and saw 'LISP empty', so thanks for
          the pointer!  [00:24]
<civodul> OriansJ, janneke: from that page, there's also:
          https://web.archive.org/web/20160604035203fw_/https://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html

** C4/C500
https://web.archive.org/web/20160604041431/https://homepage.ntlworld.com/edmund.grimley-evans/cc500/cc500.c
https://github.com/rswier/c4/blob/master/c4.c
** Compilers for free
https://codon.com/compilers-for-free
** Small lisps
*** [[https://www.mirrorservice.org/sites/www.bitsavers.org/bits/TI/Explorer/zeta-c/][ZETA-C]]
** Small C compilers
*** tinycc
*** [[https://github.com/rui314/8cc][8cc]] -- a C11 compiler, but simple
8cc is a compiler for the C programming language. It's intended to
support all C11 language features while keeping the code as small and
simple as possible.
*** pcc
*** early GCC?
https://miyuki.github.io/2017/10/04/gcc-archaeology-1.html
*** [[https://tack.sourceforge.net/][ack]]
<rain1> it may be possible to compile like this:  mes |> ack |> pcc |> tcc |>
        gcc 4.7.4 |> gcc later version... up to modern
*** [[https://web.archive.org/web/20160402225843/https://homepage.ntlworld.com/edmund.grimley-evans/cc500/][cc500]]
** rain1's Bootstrapping Wiki: https://bootstrapping.miraheze.org/wiki/Main_Page
** rain1's hex86
https://notabug.org/rain1/hex86/src/master/tests/hex0b3.hex86
** <pdewacht> janneke, have you ever tried testing mescc with csmith?  [10:55]
** <pdewacht> e.g. as described here
           https://jamey.thesharps.us/2016/07/15/testing-strategies-for-corrode/
           ("Randomized testing with Csmith and C-Reduce")  [10:58]
** linux syscalls: https://fedora.juszkiewicz.com.pl/syscalls.html
* legalese

Copyright © 2016,2017,2018,2019,2021,2022 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>

  Copying and distribution of this file, with or without modification,
  are permitted in any medium without royalty provided the copyright
  notice and this notice are preserved.