Indentations break the feed.
[SquirrelJME.git] / assets / developer-notes / stephanie-gawroriski / 2016 / 09 / 02.mkd
blob749098051fa0e057f715e49a20a4c78fc02579b1
1 # 2016/09/02
3 ## 07:52
5 Thinking about it, I only need to setup registers via the allocator for
6 input arguments and such when they are primed. I also need to consider the
7 stack. I do wonder though if I need a sub-variant of the OS to choose the
8 calling convention. Such as instead of generic I have eabi or o32. These would
9 just be generic targets for the most part. When it comes to a specific
10 system such as the CI40 or GCW it can use the appropriate ABI as such. So
11 instead of say `linux.generic`, for MIPS there will be `linux.eabi` for
12 selecting the EABI calling convention.
14 ## 10:15
16 Thinking about it, adding support for new systems is currently complex
17 because there needs to be all these classes and packages declared across
18 a large range of areas. Adding base PowerPC projects adds another 6 projects.
19 Essentially with my given goal of literally being write once and run anywhere,
20 there will quite literally be perhaps 1000 projects. This would be an
21 unmaintainable mess. Many systems share the same thing, but just have a few
22 differences such as the ABI that is used and how the target is built. There
23 are also emulator considerations also. Right now the emulator for one is
24 split across many packages for each CPU and such.
26 ## 10:23
28 What I propose then is merging all of the architectures and variants of a
29 given OS and just put it into a single package. So that `builder-linux` handles
30 every Linux system and all of its variants. Also the `TargetBuilder` as it
31 stands is a bit ugly and will not work as much either. That has to be adjusted
32 a bit for it to work. But merging the emulator into a single set would be a
33 good choice because it would all be compacted into a single place. Although
34 not as modular, it can essentially be a multi-system emulator so to speak. The
35 purpose of the emulator is to just test targets for the most part.
37 ## 10:38
39 I also am a bit distracted, I should be implementing the emulators first before
40 I target a given system, so I can work out how it works and such. The emulators
41 do not need to be very complex. However, since emulation is part of the core of
42 target system building, I should refactor the target build system. I am
43 thinking of a just essentially an enter build. Say the user requests a given
44 triplet, it will go through all services and try building one that works. I
45 can have a special exception indicating that the given target is not supported
46 for the given builder. I thought about removing the OS variants, but that would
47 be needed in cases where the operating system calls differ for the same target
48 (such as MIPS o32 and n32 for example).
50 ## 11:24
52 So as it stands right now, `TargetBuilder` is essentially a factory and its
53 methods are called as if they were static. This needs to change because it is
54 very ugly and complicates things.
56 ## 11:27
58 One thing I can do is move the "can it JIT?" to the build instance instead
59 of having it in `TargetBuilder`, because it may be possible for the same OS
60 which has a variant which does not support a JIT (perhaps a ROM based Linux
61 system that will never run JARs).
63 ## 11:34
65 `BuildConfig` should get `PackageList` so the build instance can pluck any
66 packages that are needed.
68 ## 12:34
70 However, I would have to do some adjusting for that, eventually.
72 ## 13:18
74 My new main looks much nicer.
76 ## 14:22
78 I do like how this code is turning out.
80 ## 14:36
82 Had an idea for the registers. Right now they are associated with and they
83 return stuff such as floating point. I was thinking of having some kind of
84 register association kind of setup. One that is set by the API completely
85 instead of one set by the registers. Then this way I can have cases where I
86 have 32-bit integer registers and 64-bit floating point ones, and vice
87 versa.
89 ## 14:38
91 I do wonder though if I could actually remove `JITOutputFactory` now and just
92 use the output classes directly.
94 ## 14:44
96 It is a bad idea and there is no reason for `MIPSABI` to cache the ABI anymore.
98 ## 14:47
100 So specifying the registers sizes in the ABI should work much better. There
101 can also be a means of specifying which registers actually exist for a given
102 ABI also. So for example on PowerPC with a G4, there will be AltiVec registers
103 and those can be added, while on older CPUs such as the G3 they cannot be
104 valid. The same thing happens with MIPS because newer revisions have removed
105 the `LO` and `HI` registers (used for division). So in short, having the types
106 associated with `GenericRegister` would be a bad idea. I plan instead to just
107 have it where it can be a `GenericABI.getRegisterIntType()` kind of thing.
109 ## 16:05
111 So currently, the soft, hard, and anything in between stuff is rather bad.
112 There are CPUs such as MIPS ones where there can be no FPU, or the FPU can be
113 32-bit on a 64-bit system or 64-bit on a 32-bit system. The floats do not have
114 to even match at all. So I believe I will change this to:
116  * soft
117  * hard32
118  * hard64
120 Software will be purely in software, while hard32 will do `float` in hardware
121 and `double` in software. The last `hard64` can do both kinds of floats no
122 problem.
124 ## 17:18
126 So I did much refactoring today, although still not yet done.
128 ## 17:28
130 So now I just have to move over the code that exists in `NewBuilder` and
131 refactor that into the new `BuildInstance` code.
133 ## 18:11
135 I am going to want to hide all of the internal builder stuff which should not
136 be exposed at all.
138 ## 18:12
140 So the next thing to do would be to setup the `JITOutputConfig` from the
141 input. That can be handled by a method for the most part. Soon I would have
142 worked on SquirrelJME for 10 hours, despite having barely any sleep at all
143 last night. However the refactor is going well, hopefully tomorrow I can finish
144 the refactor if I do not finish it today. Otherwise I should work on the
145 emulator also, although I may work on the JIT.
147 ## 18:30
149 So as I said before, I can use the registration system to not need service
150 loading on `JITOutputFactory`, although the factory is still needed.
152 ## 18:32
154 Also removing the "supports config" would be good too, this would prevent
155 double checks and such.
157 ## 18:38
159 So compilation wise, I am at the same point. However since I currently TODO in
160 code I cannot get to the linker stage yet. However since I want to get rid of
161 the old crusty code, I will bring in the linker part.
163 ## 18:40
165 However, I can always wait for that, I do have version control and I can see
166 all of my old code. So I will set a note. Revision
167 `24503a462c85ef804c8fe8d008ee538ccc21bb02` will contain the old information
168 needed for linking and such.
170 ## 18:53
172 And the refactor is complete for the most part except for the linking part,
173 but I can do that when I get the JIT code done. I should however next get the
174 emulator working and running the simple hello binaries I have.
176 ## 19:31
178 Ok, so for the emulator, I can have a similar registration system that I have
179 for the configuration. Basically I can have common stuff across architectures
180 and such. Take for example mount points on Linux, this can be handled by a
181 POSIX mount point class. I can then use this for other POSIX-like OSes too. So
182 instead of rewriting it over and over for each OS when it is the same, it
183 will cut down on code duplication. Then I can get rid of the OS and
184 architecture specific configurations and just have a single one. For protection
185 I can make it immutable also. So basically, since many details on a target
186 system are unknown and vary widely across systems, this would be the most
187 sane choice because then there would be unimplemented stuff or things that
188 throw exceptions saying it is not supported. So for sanity, this would work
189 out well. I would then suppose that I need a basic CPU setup that can run
190 instructions, and then have a initializer and a undefined behavior trapper. So
191 when a system call happens in the CPU code, a special handler handles it. This
192 way there only has to be a single CPU emulator for each system. So similar to
193 what I planned before but easier to work with. Then it should be much easier
194 to add emulation of other systems to see how they sort of work out before I
195 support linking and code generation for them. One thing I can do though is have
196 a bunch of source code that implements a large number of operations, basically
197 a test binary. I can run this on the host system and also in the emulator. I
198 would most likely stick to just CPU instructions however. Although one issue
199 would be the fact that some CPUs vary. Regardless, writing the emulator will
200 help give me a feel out how to generate code.
202 ## 19:54
204 Then for the register allocator, the first thing would be to prime the
205 arguments. However, now that I have `GenericABI` I can essentially just for
206 the most part assign every local and setup the initial stack as if the method
207 were entered. So I essentially refactored two sets of code. The good thing is
208 that right now is that I do not believe the base JIT needs refactoring at all.
209 The generic JIT just needed new register handling. But now that register
210 handling should be much easier to work with and should scale better.
212 ## 22:02
214 So I believe first I will target Linux MIPS and PowerPC. Then once I have that
215 setup, I shall implement the bulk of the library. Implementing the library will
216 be a bit tedious, but if I stick to what I use then I can get away with not
217 implementing parts of it. Most of the basic CLDC library is the collections
218 though. After that would be MEEP which is a bit more complex. One thing I
219 will have to consider is the LUI code. I will be needing my own terminal
220 emulation code along with perhaps PTYs. I suppose for starters I can support
221 the vt family since that is pretty much a defacto standard.
223 ## 20:09
225 So to recap, the current tasks would be:
227  * Priming the arguments in the JIT.
228  * Writing the emulator.
230 These should not be difficult at all since their algorithms are quite simple.
231 Hopefully in two to three weeks I can have a sort of demo, even if it just
232 prints text to the console. And since I currently lack sleep, I shall be
233 sleeping very soon now.