Граф коммитов

591 коммит

Автор SHA1 Сообщение Дата
Ayke van Laethem
b4be9e033a
runtime: add syscall/js stubs for microcontrollers 2018-11-05 13:11:15 +01:00
Ayke van Laethem
3d0ccb81c6
main: fix -initinterp flag
It got accidentally replaced by -interp just before finalizing the
previous commit.
2018-11-05 13:11:15 +01:00
Ayke van Laethem
bb3d05169d
interp: add new compile-time package initialization interpreter
This interpreter currently complements the Go SSA level interpreter. It
may stay complementary or may be the only interpreter in the future.

This interpreter is experimental and not yet finished (there are known
bugs!) so it is disabled by default. It can be enabled by passing the
-initinterp flag.

The goal is to be able to run all initializations at compile time except
for the ones having side effects. This mostly works except perhaps for a
few edge cases.

In the future, this interpeter may be used to actually run regular Go
code, perhaps in a shell.
2018-11-04 18:40:51 +01:00
Ayke van Laethem
f900d3f9d5
travis: remove Go master testing
There is a problem with this version, but fixing it requires some
changes to ir/interpreter.go which will be replaced soon anyway.

Remove master from the tests. It probably wasn't such a great idea
anyway during the development cycle of Go.
2018-11-04 18:29:17 +01:00
Ayke van Laethem
e930a1ead5
compiler: allow multiple basic blocks in package initializers
I don't know why they sometimes have them, but apparently some packages
do. Don't panic in that case, the interpreter will stop anyway on the
first branch.
2018-11-03 20:22:00 +01:00
Ayke van Laethem
a531caa2e9
compiler: implement deferring of interface calls 2018-11-03 20:21:43 +01:00
Ayke van Laethem
8f8942d763
compiler: make all functions unnamed_addr
In Go, function pointers are not comparable. This means that the address
itself is not significant and functions can therefore be merged.

Add the unnamed_addr attribute to all functions to learn LLVM about this
fact. At the moment the mergefunc pass hasn't been enabled, but it
should be in the future to reduce code size.
2018-11-03 18:47:49 +01:00
Ayke van Laethem
3823870d07
main: print IR even when verification failed 2018-11-03 18:26:46 +01:00
Ayke van Laethem
60eefe1568
compiler: do not abort on verification failure 2018-11-03 18:24:57 +01:00
Ayke van Laethem
22914165cc
reflect: add more stubs for encoding/binary
Package encoding/binary uses reflect and is needed by image/png, but
image/png doesn't actually need the reflect-using parts of
encoding/binary. So stub them out for now to get it to compile.

Thanks to Stephen Solka who wrote the patch.
2018-11-03 16:06:44 +01:00
Ayke van Laethem
e66d457c42
compiler: fix float <-> int conversions 2018-11-03 12:20:55 +01:00
Ayke van Laethem
8da1a5bc17
compiler: add comment to interface call signatures 2018-11-03 12:04:33 +01:00
Ayke van Laethem
2e22d53e5d
compiler: work around i64 limitation in JavaScript
JavaScript does not support i64 directly, so make sure we pass a pointer
instead which can be read from JavaScript.

This is a temporary workaround which should be removed once JavaScript
supports some form of i64 (probably in the form of BigInt).
2018-11-03 12:03:49 +01:00
Ayke van Laethem
d7844ce124
compiler, runtime: move defer notes to the runtime file
This seems like the more appropriate place to describe the
implementation of defer.
2018-11-01 11:42:04 +01:00
Ayke van Laethem
c7cf6f0e82
docs: move calling convention documentation here 2018-11-01 11:41:24 +01:00
Ayke van Laethem
85d5fe7643
docs: add description of internal datatypes 2018-10-31 20:47:12 +01:00
Ayke van Laethem
06b8afab2e
docs: add command line subcommands + flags documentation 2018-10-31 19:55:48 +01:00
Ayke van Laethem
7ea9a32058
docs: give a small example how JS<->wasm bridging is done 2018-10-31 19:55:46 +01:00
Ayke van Laethem
1b283c11c1
ir: do not throw an error on unknown conversions 2018-10-31 10:19:25 +01:00
Ayke van Laethem
4e4f91bea7
main: cleanup printing of IR
Panics don't usually happen nowadays, instead the compiler package
returns errors while compiling. If it still panics, this is usually from
within LLVM from where deferred functions are not run.
2018-10-31 10:10:49 +01:00
Ayke van Laethem
8a211d36aa
compiler: only produce one bitcast from an alloca
This makes passes simpler, by being able to look at the (only) bitcast
from an alloca to know the expected type.
2018-10-30 20:10:29 +01:00
Ayke van Laethem
b09b07a52d
wasm: allow all undefined symbols
Undefined symbols will be shown by the embedder, for example when
running generated wasm files in a browser.

In the future, this should probably become a fixed list again. But for
experimenting it's easier now to just ignore undefined symbols and
expect the JS to provide them.
2018-10-30 15:59:29 +01:00
Ayke van Laethem
a459570d94
wasm: execute an 'unreachable' trap inst on panic
This already happened when directly calling panic() but not with some
runtime panics like accessing a slice out of bounds.
2018-10-30 15:59:29 +01:00
Ayke van Laethem
0314a487ff
compiler: check slice cap instead of len during slicing
When doing a slice operation on a slice, use the capacity value instead
of the length. Of course, for strings and arrays, the slice operation
checks the length because there is no capacity. But according to the
spec, this check should be based on cap for slice instead of len:

> For slices, the upper index bound is the slice capacity cap(a) rather
> than the length.

https://golang.org/ref/spec#Slice_expressions

Fixes: https://github.com/aykevl/tinygo/issues/65
2018-10-30 15:58:50 +01:00
Ayke van Laethem
317b12b8c0
compiler: remove println statement
I forgot to remove this debug print after I wrote the code...
2018-10-29 18:18:23 +01:00
Ayke van Laethem
2a5c331516
compiler: assume external functions don't let pointers escape
Assume any external function won't let pointers live longer than the
call itself. This is true in the vast majority of cases (apparently
everywhere currently) but might not always be true.

TODO: add a //go:noescape (or maybe //go:escape) to handle this, instead
of this assumption.
2018-10-29 14:04:55 +01:00
Ayke van Laethem
772c6486ab
runtime: correctly copy a zero-length buffer backwards
Fixes:
https://github.com/aykevl/tinygo/issues/64
2018-10-29 14:02:47 +01:00
Ayke van Laethem
d90d7be8a8
runtime: implement syscall.runtime_envs
It is stubbed out currently, but may be useful in the future.

Note that this function is implemented for a future change to the init
system, it is not yet useful.
2018-10-28 19:25:55 +01:00
Marc-Antoine Ruel
a3d87456cd tinygo: add 'tinygo' build tag
This enables project to conditionally skip code that can't compile on tinygo.
2018-10-27 16:44:10 -04:00
Ayke van Laethem
436901dc49
compiler: implement operations on nil hashmaps
* comparing a map against nil
  * getting the length of a nil map
2018-10-27 00:57:37 +02:00
Ayke van Laethem
c84fc6a670
main: gofmt 2018-10-26 23:31:27 +02:00
Ayke van Laethem
e751e4afe9
compiler: avoid accidentally emitting debug info 2018-10-26 23:30:46 +02:00
Justin Clift
bce697bcc1
docs: rename readme extension to .md
.md is the generally accepted extension meaning Markdown, at least
on GitHub.
2018-10-25 20:45:51 +02:00
Christian Muehlhaeuser
db636da207
README: typo fix
"becauses" => "because"
2018-10-25 20:43:46 +02:00
Marc-Antoine Ruel
63b0b4b90c
compiler: fix compiler.go import order
go/parser is part of the standard library.

No functional change.
2018-10-25 20:41:45 +02:00
Justin Clift
586d3b33b1
README: add Getting Help section
Includes information about the new #TinyGo Slack channel.

Fixes #54.
2018-10-25 20:40:00 +02:00
Marc-Antoine Ruel
7f30ef7e4d
testdata: add more test cases in testdata
Specifically test for one or multiple init functions.
2018-10-25 20:37:35 +02:00
Ayke van Laethem
97d4558d81
main: update help text with new subcommands 2018-10-25 20:36:11 +02:00
Ayke van Laethem
980dceb192
main: refactor build option passing
The list of options passed to build/run/gdb/etc commands was getting
unwieldly and hard to add extra options to. Put all common build options
in a single build config struct so that these options are more
centralized.
2018-10-24 23:53:44 +02:00
Ayke van Laethem
fcd44c02cd
compiler: fix const complex numbers
This led to an assertion failure with a debug build of LLVM, but
apparently worked with a release build of LLVM.
2018-10-24 23:24:11 +02:00
Ayke van Laethem
cb0a148cd7
compiler: fix map optimization
Not all uses of a map are call instructions. Don't assume they are.
TODO: investigate these uses and see whether they might be eliminated?
2018-10-24 12:37:47 +02:00
Ayke van Laethem
0b8beb77c1
reflect: add stub reflect package
This is necessary to compile fmt. However, it cannot link yet.
2018-10-23 15:39:53 +02:00
Ayke van Laethem
6c6a43310a
compiler: fix invalid incoming block in complex typeassert flow
A single *ssa.BasicBlock may be split in multiple LLVM basic blocks due
to typeassert instructions. This means the incoming block and outgoing
block are different. PHI nodes need to get the result from the outgoing
block, which was fixed before, but incoming branches need to branch to
the incoming block, not the outgoing block.

Branching to the outgoing block led to a LLVM verification error when
compiling the fmt package.

Originally found in (*fmt.pp).handleMethods.
2018-10-23 15:00:37 +02:00
Ayke van Laethem
96f74ec153
compiler: support 64-bit numbers in bounds check 2018-10-23 14:07:27 +02:00
Ayke van Laethem
17e8c850f6
compiler: fix invalid use of extractvalue on vector types 2018-10-23 14:05:55 +02:00
Ayke van Laethem
893c115f31
travis: remove WebAssembly test
It fails (hangs) roughly half of the time and I don't know why. Perhaps
a problem in the linker?

Remove it now for green checkmarks.
2018-10-23 13:29:24 +02:00
Ayke van Laethem
e2f6aedd9d
compiler: implement comparing structs directly 2018-10-23 13:27:18 +02:00
Ayke van Laethem
cbd7d401fe
testdata: go fmt 2018-10-23 13:24:18 +02:00
Ayke van Laethem
82be43f4e6
compiler: implement deferring of immediately-applied closures
This is a common operation:

    freevar := ...
    defer func() {
        println("I am deferred:", freevar)
    }()

The function is thus an immediately applied closure. Only this form is
currently supported, support for regular (fat) function pointers should
be trivial to add but is not currently implemented as it wasn't
necessary to get fmt to compile.
2018-10-22 14:06:51 +02:00
Ayke van Laethem
9b9b66a09d
compiler: add complex manipulation
* builtins: real, imag, complex
* printing of complex numbers

No support for complex arithmetic yet.
2018-10-22 13:49:03 +02:00