aboutsummaryrefslogtreecommitdiffhomepage
path: root/builder/wasmbuiltins.go
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2024-03-04 20:27:05 +0100
committerRon Evans <[email protected]>2024-03-26 12:20:50 +0100
commit7c546525ea979025c17973a6e248a2119024acbb (patch)
tree00a906fae573e4de6e14b75c4bce6b69d3be2c86 /builder/wasmbuiltins.go
parentd628e3e2cb6f767dc5367bc43fb14751a509404a (diff)
downloadtinygo-7c546525ea979025c17973a6e248a2119024acbb.tar.gz
tinygo-7c546525ea979025c17973a6e248a2119024acbb.zip
wasm-unknown: add math and memory builtins that LLVM needs
This new library is needed for wasm targets that aren't WASI and don't need/want a libc, but still need some intrinsics that are generated by LLVM.
Diffstat (limited to 'builder/wasmbuiltins.go')
-rw-r--r--builder/wasmbuiltins.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/builder/wasmbuiltins.go b/builder/wasmbuiltins.go
new file mode 100644
index 000000000..06366bf95
--- /dev/null
+++ b/builder/wasmbuiltins.go
@@ -0,0 +1,79 @@
+package builder
+
+import (
+ "os"
+ "path/filepath"
+
+ "github.com/tinygo-org/tinygo/goenv"
+)
+
+var WasmBuiltins = Library{
+ name: "wasmbuiltins",
+ makeHeaders: func(target, includeDir string) error {
+ os.Mkdir(includeDir+"/bits", 0o777)
+ f, err := os.Create(includeDir + "/bits/alltypes.h")
+ if err != nil {
+ return err
+ }
+ if _, err := f.Write([]byte(wasmAllTypes)); err != nil {
+ return err
+ }
+ return f.Close()
+ },
+ cflags: func(target, headerPath string) []string {
+ libcDir := filepath.Join(goenv.Get("TINYGOROOT"), "lib/wasi-libc")
+ return []string{
+ "-Werror",
+ "-Wall",
+ "-std=gnu11",
+ "-nostdlibinc",
+ "-isystem", libcDir + "/libc-top-half/musl/arch/wasm32",
+ "-isystem", libcDir + "/libc-top-half/musl/arch/generic",
+ "-isystem", libcDir + "/libc-top-half/musl/src/internal",
+ "-isystem", libcDir + "/libc-top-half/musl/src/include",
+ "-isystem", libcDir + "/libc-top-half/musl/include",
+ "-isystem", libcDir + "/libc-bottom-half/headers/public",
+ "-I" + headerPath,
+ }
+ },
+ sourceDir: func() string { return filepath.Join(goenv.Get("TINYGOROOT"), "lib/wasi-libc") },
+ librarySources: func(target string) ([]string, error) {
+ return []string{
+ // memory builtins needed for llvm.memcpy.*, llvm.memmove.*, and
+ // llvm.memset.* LLVM intrinsics.
+ "libc-top-half/musl/src/string/memcpy.c",
+ "libc-top-half/musl/src/string/memmove.c",
+ "libc-top-half/musl/src/string/memset.c",
+
+ // exp, exp2, and log are needed for LLVM math builtin functions
+ // like llvm.exp.*.
+ "libc-top-half/musl/src/math/__math_divzero.c",
+ "libc-top-half/musl/src/math/__math_invalid.c",
+ "libc-top-half/musl/src/math/__math_oflow.c",
+ "libc-top-half/musl/src/math/__math_uflow.c",
+ "libc-top-half/musl/src/math/__math_xflow.c",
+ "libc-top-half/musl/src/math/exp.c",
+ "libc-top-half/musl/src/math/exp_data.c",
+ "libc-top-half/musl/src/math/exp2.c",
+ "libc-top-half/musl/src/math/log.c",
+ "libc-top-half/musl/src/math/log_data.c",
+ }, nil
+ },
+}
+
+// alltypes.h for wasm-libc, using the types as defined inside Clang.
+const wasmAllTypes = `
+typedef __SIZE_TYPE__ size_t;
+typedef __INT8_TYPE__ int8_t;
+typedef __INT16_TYPE__ int16_t;
+typedef __INT32_TYPE__ int32_t;
+typedef __INT64_TYPE__ int64_t;
+typedef __UINT8_TYPE__ uint8_t;
+typedef __UINT16_TYPE__ uint16_t;
+typedef __UINT32_TYPE__ uint32_t;
+typedef __UINT64_TYPE__ uint64_t;
+typedef __UINTPTR_TYPE__ uintptr_t;
+
+// This type is used internally in wasi-libc.
+typedef double double_t;
+`