Commit Graph

207 Commits

Author SHA1 Message Date
Ayke van Laethem 16cdffc367 Try to interpret simple function calls in init() functions
This is useful for example for globals like these:

    import "errors"

    var MyError = errors.New("mymodule: something went wrong!")
2018-08-30 05:53:22 +02:00
Ayke van Laethem 15f62b29cf Add runtime.GOOS 2018-08-30 05:48:16 +02:00
Ayke van Laethem 82d0d70ba2 Add (hardcoded) runtime.GOROOT()
Necessary for the time package.
2018-08-30 05:41:48 +02:00
Ayke van Laethem cfd20c7a12 Add a number for the "error" type by default 2018-08-30 05:40:11 +02:00
Ayke van Laethem a5252d07f0 Support zero-initialized pointers in globals 2018-08-30 05:38:27 +02:00
Ayke van Laethem 5edf94ea10 Fix named structs inside global named structs 2018-08-30 05:36:44 +02:00
Ayke van Laethem 7956ca2f29 Function pointers in global variables 2018-08-30 05:36:09 +02:00
Ayke van Laethem a4fd096393 Add dummy channel support 2018-08-30 05:32:18 +02:00
Ayke van Laethem 6e0c60a7a1 Some extra header docs 2018-08-30 02:36:13 +02:00
Ayke van Laethem 0b372ba5bd Support initialized map values in another global 2018-08-30 02:32:35 +02:00
Ayke van Laethem 42711c11e9 Be able to print maps to some degree
Print the number of elements, or nil if it is a nil map.
2018-08-30 02:26:48 +02:00
Ayke van Laethem d930a9ba16 Implement print() for interface values 2018-08-30 02:20:36 +02:00
Ayke van Laethem 25344bc08f Reorder Program.interpret cases 2018-08-30 02:09:02 +02:00
Ayke van Laethem 75477eb14e Implement global .data-initalized interfaces 2018-08-30 02:08:00 +02:00
Ayke van Laethem d13c124df9 Implement casting from (Unicode) integer to string 2018-08-30 00:36:54 +02:00
Ayke van Laethem fdc56d5940 Implement convert string <- []byte 2018-08-29 23:54:46 +02:00
Ayke van Laethem eed25c78df Clean up ssa.Convert and ssa.ChangeType 2018-08-29 23:36:58 +02:00
Ayke van Laethem 8b95b869ab Implement string concatenation 2018-08-29 22:10:46 +02:00
Ayke van Laethem c912091f8b Add integer key support to hashmap 2018-08-29 21:50:43 +02:00
Ayke van Laethem 8f7db8661b Move string type to runtime in separate file 2018-08-29 20:55:09 +02:00
Ayke van Laethem bf160d096b Move lenType definition to runtime (partially) 2018-08-29 20:48:56 +02:00
Ayke van Laethem abaae5b90d Remove unnecessary compiler workaround
This workaround isn't needed anymore: the feature has been implemented
now.
2018-08-29 20:45:50 +02:00
Ayke van Laethem 7991243554 Remove CGo from machine module
It isn't necessary anymore but apparently the Go importer didn't
complain about an unused import.
2018-08-29 20:44:56 +02:00
Ayke van Laethem d4f5700625 Remove use of CGo in the runtime
CGo depends on syscall, which (in the standard library) depends on sync,
which depends on the runtime. There are also other import cycles. To be
able to use the syscall package from upstream, stop using CGo.
2018-08-29 20:01:33 +02:00
Ayke van Laethem d620f0d188 Implement multiple return values from functions
Use structs in LLVM as it appears LLVM has no support for multiple
return values (I should look into how Rust does it...).
2018-08-29 19:42:22 +02:00
Ayke van Laethem ee10162564 Extra check on interface asserts
Interface asserts haven't been implemented yet. Don't produce incorrect
code in that case.
2018-08-27 00:50:03 +02:00
Ayke van Laethem 0c71ed81a4 Rename runtime.itfmethod -> runtime.interfaceMethod 2018-08-27 00:49:33 +02:00
Ayke van Laethem 64e478ef36 Switch to 16-bit typecodes and method IDs
It took Android some time to even hit the 64K limit for regular method
calls, so switching to 16-bit IDs should be fine for method IDs of
interfaces. At least for the time being. When this limit is ever hit,
I'll think of another way, probably involving some platform-dependent
interface code (e.g. microcontrollers won't need 64K of methods) or
detecting the limit at build time.

https://android-developers.googleblog.com/2014/12/google-play-services-and-dex-method.html

Code size isn't changed, probably because the compiler optimizes away
all method calls.
2018-08-27 00:32:30 +02:00
Ayke van Laethem 539de9db9e Move interface method calls in Go from LLVM IR + documentation
This commit moves the itfmethod call implemented directly in LLVM IR to
a Go implementation in the runtime. Additionally, it fixes variable
names to be more obvious and adds a lot of documentation to explain how
interfaces actually work in TinyGo.

Code size changes for src/examples/hello:
nrf:  -144
unix: -93

I'm guessing this code size reduction is a result of removing the
'noinline' function attribute.
2018-08-26 23:40:11 +02:00
Ayke van Laethem 309de00fd6 Simplify function names by removing $async suffix 2018-08-26 21:45:28 +02:00
Ayke van Laethem 58e31fd470 Simplify a bit of code 2018-08-26 21:38:55 +02:00
Ayke van Laethem de6c20f1bd Implement untyped bool 2018-08-25 03:24:06 +02:00
Ayke van Laethem c9e6a52d05 Implement constant slice
It's used somewhere in the sync package, but I'm not sure where.
2018-08-25 02:58:59 +02:00
Ayke van Laethem 9f2bcfe5e3 Implement global interface variable constant 2018-08-25 02:58:00 +02:00
Ayke van Laethem c25b448758 Rewrite init() interpretation to a real interpreter
Instead of mostly heuristics, actually execute the init() instruction in
an interpreter to calculate initializers for globals. This is far more
flexible and extensible, and gives the option of extending the
interpreter to other code and make it a partial evaluator.
2018-08-25 02:07:01 +02:00
Ayke van Laethem 9b4ac0459b Make strings constant
For some reason this was disabled.
2018-08-24 05:18:41 +02:00
Ayke van Laethem f49ceddd73 Enable elimination of dead globals by marking them private
This eliminates most of the newly created dead globals.
2018-08-24 04:25:16 +02:00
Ayke van Laethem 5f28b07f75 Enable aggressive code size optimizations: -Oz 2018-08-24 03:35:39 +02:00
Ayke van Laethem f9f92de1c3 Add a test for the unicode package
This massively increases .data size, possibly because loads of unused
globals are included. I'll need to investigate what's going on here. For
now, increase the RAM size for nrf chips (the nrf52 has 64kB of RAM).
2018-08-24 03:35:03 +02:00
Ayke van Laethem 36a5af9e6d README: dead code elimination 2018-08-24 03:02:06 +02:00
Ayke van Laethem ab3358e5a3 Add make fmt 2018-08-24 02:59:18 +02:00
Ayke van Laethem fa12da95e2 Some documentation fixes 2018-08-24 02:56:09 +02:00
Ayke van Laethem 0defed9677 Resolve named types 2018-08-24 02:55:06 +02:00
Ayke van Laethem 1229667f7c Support pointers in global variables 2018-08-24 02:54:37 +02:00
Ayke van Laethem 68b1100c89 Support maps bigger than 8 elements in .data 2018-08-24 02:53:23 +02:00
Ayke van Laethem 4ef271d4c6 Fix double addition in init map update 2018-08-24 02:48:59 +02:00
Ayke van Laethem 179cf74b01 Implement package-global maps (of max 8 entries) 2018-08-24 00:56:20 +02:00
Ayke van Laethem 2b78b6d7e8 Fix bug in runtime.memzero
Not the memory itself, but the byte after the memory was zeroed.
2018-08-23 23:45:39 +02:00
Ayke van Laethem e884221fad Implement len() for map types 2018-08-23 23:14:54 +02:00
Ayke van Laethem 005665aee6 Move hashmap creation to runtime 2018-08-23 23:13:38 +02:00