tinygo/compiler
Ayke van Laethem e161d5a82c compiler: work around an ARM backend bug in LLVM
Because of a bug in the ARM backend of LLVM, the cmpxchg instruction is
lowered using ldrexd/strexd instructions which don't exist on Cortex-M
cores. This leads to an "undefined instruction" exception at runtime.
Therefore, this patch works around this by lowering directly to a call
to the __sync_val_compare_and_swap_8 function, which is what the backend
should be doing.

For details, see: https://reviews.llvm.org/D95891

To test this patch, you can run the code on a Cortex-M3 or higher
microcontroller, for example:

    tinygo flash -target=pca10040 ./testdata/atomic.go

Before this patch, this would trigger an error. With this patch, the
behavior is correct. The error (without this patch) could look like
this:

    fatal error: undefined instruction with sp=0x200007cc pc=nil
2021-02-03 14:49:41 +01: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: test float to int conversions and fix upper-bound calculation 2021-01-19 14:02:32 +01:00
asserts.go compiler: remove ir package 2021-01-24 15:39:15 +01:00
atomic.go compiler: work around an ARM backend bug in LLVM 2021-02-03 14:49:41 +01:00
calls.go compiler: remove ir package 2021-01-24 15:39:15 +01:00
channel.go compiler: support all kinds of deferred builtins 2021-01-24 09:28:09 +01:00
compiler.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
compiler_test.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
defer.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
errors.go compiler: remove ir package 2021-01-24 15:39:15 +01:00
func.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
gc.go compiler: track the result of string concatenation 2020-04-02 14:04:25 +02:00
goroutine.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
inlineasm.go arm64: Add support for system calls (SVC) 2020-10-03 20:07:51 +02:00
interface.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
interrupt.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
intrinsics.go compiler,runtime: translate memzero calls to LLVM memset intrinsics 2020-03-27 21:01:59 +01:00
llvm.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
map.go compiler: refactor map operations to use the builder object 2020-03-25 20:17:46 +01:00
passes.go compiler: remove ir package 2021-01-24 15:39:15 +01:00
sizes.go compiler: unexport some exported symbols 2020-04-13 09:24:57 +02:00
symbol.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
syscall.go compiler: move settings to a separate Config struct 2021-01-29 14:49:58 +01:00
volatile.go compiler: do not perform nil checking when indexing slices 2020-03-27 07:38:16 +01:00