about summary refs log tree commit diff
path: root/evoke.e
blob: 9a12075f88e43ea90677ef550ef761a6be609e27 (plain)
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
~ (cat labels.e elf.e transform.e execution.e \
~  echo 's" pyrzqxgl" allocate-string dup 262144 read-to-buffer'; \
~  cat core.e linux.e output.e amd64.e execution-support.e log-load.e; \
~  echo pyrzqxgl swap 262144 read-to-buffer; \
~  cat core.e linux.e output.e amd64.e execution-support.e log-load.e \
~      dynamic.e input.e interpret.e flow-control.e linux-dynamic.e; \
~  echo 0 sys-exit pyrzqxgl; \
~  cat evoke.e) \
~     | ./quine > evoke && chmod 755 evoke && ./evoke

: read-inputs
  here @ dup
  s" core.e" pack-file-contents
  s" linux.e" pack-file-contents
  s" output.e" pack-file-contents
  s" amd64.e" pack-file-contents
  s" execution-support.e" pack-file-contents
  s" log-load.e" pack-file-contents
  s" pyrzqxgl" packstring
  0 pack8 8 packalign here !
  s" source-to-precompile" variable

  here @ dup
  s" core.e" pack-file-contents
  s" linux.e" pack-file-contents
  s" output.e" pack-file-contents
  s" amd64.e" pack-file-contents
  s" execution-support.e" pack-file-contents
  s" log-load.e" pack-file-contents
  s" dynamic.e" pack-file-contents
  s" input.e" pack-file-contents
  s" interpret.e" pack-file-contents
  s" flow-control.e" pack-file-contents
  s" linux-dynamic.e" pack-file-contents
  s" pyrzqxgl" packstring
  0 pack8 8 packalign here !
  s" source-to-copy-to-log" variable ;
read-inputs


~ (output memory start, current output point
~  -- output memory start, current output point)
~
~ Everything directly called by all-contents has this same interface.
~
: all-contents
  ~ :   This particular program is 'evoke', the compiler. If you already have
  ~ : a binary copy of 'hex', run this file through it and you'll have a
  ~ : working compiler. Pretty sweet, right?
  ~ :
  ~ :   If you're auditing this by hand, first off, thank you for doing that.
  ~ : You may wish to pull up the source code side-by-side with the hex dump;
  ~ : there's a lot of structural stuff in the actual source that aids in
  ~ : readability but isn't easily reproduced in this form, though every
  ~ : effort has been made.
  ~ : blank-line
  0x08000000 L!' origin

  elf-file-header
  elf-program-header

  output-cold-start
  source-to-copy-to-log s" pyrzqxgl" output-warm-start
  source-to-precompile s" pyrzqxgl" label-transform

  ~   If we wanted words in the log to be able to call statically-linked
  ~ words, we could set this to something nonzero. We don't, so we leave it
  ~ alone.
  0 L!' final-word-name

  current-offset L!' total-size
  0 L!' :
  0 L!' ;
  0 L!' ;asm
  ~ : blank-line
  ~ : This is the end of the hex dump. Thanks for reading!
  ;

' all-contents entry-to-execution-token label-loop
1 3unroll sys-write bye