tinygo/compiler
Ayke van Laethem afd49e7cdd compiler: add support for recursive function types
This adds support for a construct like this:

    type foo func(fn foo)

Unfortunately, LLVM cannot create function pointers that look like this.
LLVM only supports named types for structs (not for pointers) and thus
can't add a pointer to a function type of the same type to a parameter
of that function type.

The fix is simple: cast all function pointers to a void function, in
LLVM IR:

    void ()*

Raw function pointers are cast to this type before storing, and cast
back to the regular function type before calling. This means that
function parameters will never refer to its own type because raw
function types are fixed at that one type.

Somehow, this does have an effect on binary size in some cases. The
effect is small and goes both ways. On top of that, there is work
underway in LLVM which would make all pointer types opaque (without a
pointee type). This would make this whole commit useless and therefore
should fix any size increases that might happen.
https://llvm.org/docs/OpaquePointers.html
2021-10-30 15:55:20 +02:00
..
ircheck compiler: move IR checker to separate package 2020-03-21 15:45:25 +01:00
llvmutil compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
testdata compiler: add support for recursive function types 2021-10-30 15:55:20 +02:00
alias.go fix export math functions issue 2021-10-03 16:28:34 +02:00
asserts.go compiler: properly implement div and rem operations 2021-10-28 15:55:02 +02:00
atomic.go compiler: work around an ARM backend bug in LLVM 2021-02-03 14:49:41 +01:00
calls.go all: fix staticcheck warnings 2021-09-27 15:47:12 +02:00
channel.go compiler: avoid zero-sized alloca in channel operations 2021-09-09 11:24:52 +02:00
compiler.go compiler: add support for recursive function types 2021-10-30 15:55:20 +02:00
compiler_test.go main: test other architectures by specifying a different GOARCH 2021-10-04 18:22:55 +02:00
defer.go builder, compiler: compile and cache packages in parallel 2021-03-21 11:51:35 +01:00
errors.go all: fix staticcheck warnings 2021-09-27 15:47:12 +02:00
func.go compiler: add support for recursive function types 2021-10-30 15:55:20 +02:00
gc.go compiler: track the result of string concatenation 2020-04-02 14:04:25 +02:00
goroutine.go compiler: add nounwind attribute 2021-10-25 13:39:54 +02:00
inlineasm.go all: fix staticcheck warnings 2021-09-27 15:47:12 +02:00
interface.go compiler: add nounwind attribute 2021-10-25 13:39:54 +02:00
interrupt.go Support chained interrupt handlers 2021-05-25 20:44:49 +02:00
intrinsics.go compiler: move LLVM math builtin support into the compiler 2021-08-10 20:08:27 +02:00
llvm.go all: fix staticcheck warnings 2021-09-27 15:47:12 +02:00
map.go compiler: refactor map operations to use the builder object 2020-03-25 20:17:46 +01:00
sizes.go reflect: implement Sizeof and Alignof for func values 2021-03-29 01:04:11 +02:00
symbol.go compiler: add nounwind attribute 2021-10-25 13:39:54 +02:00
syscall.go compiler: implement syscall.rawSyscallNoError in inline assembly 2021-06-25 16:14:47 +02:00
volatile.go compiler: do not perform nil checking when indexing slices 2020-03-27 07:38:16 +01:00