Initial commit
Teh goal: Get OSFS working in the browser! Teh progress: It compiles! .....but we don't have malloc(), and we get some undefined synbol errors: wasm-ld-18: error: /tmp/wrapper-0965f8.o: undefined symbol: malloc(unsigned long) wasm-ld-18: error: /tmp/wrapper-0965f8.o: undefined symbol: free(void*) wasm-ld-18: error: /tmp/wrapper-0965f8.o: undefined symbol: malloc(unsigned long) ....these are indicative of a type error I think
This commit is contained in:
commit
d192cfac7a
11 changed files with 447 additions and 0 deletions
235
.gitignore
vendored
Normal file
235
.gitignore
vendored
Normal file
|
@ -0,0 +1,235 @@
|
|||
|
||||
src/wasm/bin
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/git,node,c,c++
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=git,node,c,c++
|
||||
|
||||
### C ###
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
### C++ ###
|
||||
# Prerequisites
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
|
||||
# Precompiled Headers
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
|
||||
# Executables
|
||||
|
||||
### Git ###
|
||||
# Created by git for backups. To disable backups in Git:
|
||||
# $ git config --global mergetool.keepBackup false
|
||||
*.orig
|
||||
|
||||
# Created by git when using merge tools for conflicts
|
||||
*.BACKUP.*
|
||||
*.BASE.*
|
||||
*.LOCAL.*
|
||||
*.REMOTE.*
|
||||
*_BACKUP_*.txt
|
||||
*_BASE_*.txt
|
||||
*_LOCAL_*.txt
|
||||
*_REMOTE_*.txt
|
||||
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
### Node Patch ###
|
||||
# Serverless Webpack directories
|
||||
.webpack/
|
||||
|
||||
# Optional stylelint cache
|
||||
|
||||
# SvelteKit build / generate output
|
||||
.svelte-kit
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/git,node,c,c++
|
9
.gitmodules
vendored
Normal file
9
.gitmodules
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
[submodule "src/wasm/walloc"]
|
||||
path = src/wasm/walloc
|
||||
url = https://github.com/wingo/walloc.git
|
||||
[submodule "src/wasm/OSFS"]
|
||||
path = src/wasm/OSFS
|
||||
url = https://github.com/charlesbaynham/OSFS.git
|
||||
[submodule "src/lantern-build-engine"]
|
||||
path = src/lantern-build-engine
|
||||
url = https://gitlab.com/sbrl/lantern-build-engine.git
|
0
README.md
Normal file
0
README.md
Normal file
0
src/index.mjs
Normal file
0
src/index.mjs
Normal file
1
src/lantern-build-engine
Submodule
1
src/lantern-build-engine
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 094e175740cc6ebc10dd788a60af60e19407d641
|
1
src/wasm/OSFS
Submodule
1
src/wasm/OSFS
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit e2031f1d304e2d9c0de4a4d921ea339078db51b8
|
42
src/wasm/compile-wasm.sh
Executable file
42
src/wasm/compile-wasm.sh
Executable file
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Make sure the current directory is the location of this script to simplify matters
|
||||
cd "$(dirname "$(readlink -f "$0")")" || { echo "Error: Failed to cd to script directory" >&2; exit 1; };
|
||||
|
||||
# shellcheck source=../lantern-build-engine/lantern.sh
|
||||
source "${PWD}/../lantern-build-engine/lantern.sh";
|
||||
|
||||
|
||||
task_begin "Setup";
|
||||
subtask_begin "Define directories";
|
||||
dirpath_output="${PWD}/bin";
|
||||
dirpath_include="${PWD}/include";
|
||||
dirpath_walloc="${PWD}/walloc";
|
||||
dirpath_osfs="${PWD}/OSFS/src";
|
||||
subtask_end 0;
|
||||
|
||||
if [[ ! -d "${dirpath_output}" ]]; then
|
||||
subtask_begin "Create output directory";
|
||||
mkdir "${dirpath_output}";
|
||||
subtask_end "${?}";
|
||||
fi
|
||||
|
||||
check_command clang true;
|
||||
|
||||
|
||||
task_begin "Compile";
|
||||
|
||||
echo -e ">>> Working directory is ${HC}${PWD}${RS}" >&2;
|
||||
|
||||
execute clang -v -v -v --target=wasm32 -nostdlib -Wl,--export-all -Wl,--no-entry \
|
||||
-I"${dirpath_include}" \
|
||||
-I "${dirpath_walloc}" \
|
||||
-I "${dirpath_osfs}" \
|
||||
-o "${dirpath_output}/osfs.wasm" \
|
||||
"${dirpath_walloc}/walloc.c" \
|
||||
"${dirpath_osfs}/OSFS.cpp" \
|
||||
"${dirpath_include}/wrapper.cpp" \
|
||||
;
|
||||
|
||||
|
||||
task_end "${?}";
|
28
src/wasm/include/Arduino.h
Normal file
28
src/wasm/include/Arduino.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
#pragma once
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
// #include <string.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
/*
|
||||
To use:
|
||||
|
||||
sudo apt install clang llvm lld
|
||||
|
||||
```bash
|
||||
git clone repo;
|
||||
// TODO APPLY PATCH HERE
|
||||
cd OSFS/src
|
||||
clang --target=wasm32 -nostdlib -Wl,--export-all -Wl,--no-entry -o osfs.wasm OSFS.cpp
|
||||
```
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// strncmp, memset, strncpy ref https://github.com/bezlant/s21_strings
|
||||
|
||||
int strncmp(const char *str1, const char *str2, size_t n);
|
||||
|
||||
void *memset(void *str, int c, size_t n);
|
||||
char *strncpy(char *dest, const char *src, size_t n);
|
2
src/wasm/include/walloc.h
Normal file
2
src/wasm/include/walloc.h
Normal file
|
@ -0,0 +1,2 @@
|
|||
void* malloc(size_t size);
|
||||
void free(void *ptr);
|
128
src/wasm/include/wrapper.cpp
Normal file
128
src/wasm/include/wrapper.cpp
Normal file
|
@ -0,0 +1,128 @@
|
|||
#include "Arduino.h"
|
||||
#include "OSFS.h"
|
||||
#include <walloc.h>
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// Compatibility defs
|
||||
|
||||
// strncmp, memset, strncpy ref https://github.com/bezlant/s21_strings
|
||||
int strncmp(const char *str1, const char *str2, size_t n) {
|
||||
int res = 0;
|
||||
|
||||
if (str1 && str2 && n > 0) {
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
if (str1[i] == '\0' || str1[i] != str2[i]) {
|
||||
res = str1[i] - str2[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
void *memset(void *str, int c, size_t n) {
|
||||
char *s = (char *)str;
|
||||
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
s[i] = c;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
char *strncpy(char *dest, const char *src, size_t n) {
|
||||
memset(dest, '\0', n);
|
||||
|
||||
for (size_t i = 0; i < n && src[i]; i++) {
|
||||
dest[i] = src[i];
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// OSFS wrappers & defs
|
||||
|
||||
const OSFS::result noerr = OSFS::result::NO_ERROR;
|
||||
const OSFS::result notfound = OSFS::result::FILE_NOT_FOUND;
|
||||
OSFS::result result;
|
||||
|
||||
uint16_t OSFS::startOfEEPROM = 1;
|
||||
uint16_t OSFS::endOfEEPROM = 64; // change w/set_eeprom_size
|
||||
|
||||
|
||||
byte* memory = (byte*)malloc((size_t)(64*1024)); // virtual EEPROM, default 64KiB
|
||||
|
||||
void __create_memory(uint32_t size) {
|
||||
free((void*)memory);
|
||||
void* memory_raw = malloc((size_t)(size * 1024));
|
||||
memory = (byte*)memory_raw;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// Error handling
|
||||
|
||||
#define ERROR_OUT_OF_BOUNDS 1
|
||||
|
||||
int last_error = 0;
|
||||
|
||||
int get_last_error() {
|
||||
return last_error;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// OSFS wrapper API
|
||||
|
||||
/**
|
||||
* Helper function to set the size of the EEPROM unit to operate on.
|
||||
*
|
||||
* @param {uint16_t} size The size of the EEPROM unit, in KiB
|
||||
* @return void
|
||||
*/
|
||||
void set_eeprom_size(uint16_t new_size) {
|
||||
OSFS::endOfEEPROM = new_size;
|
||||
__create_memory(new_size);
|
||||
}
|
||||
|
||||
uint16_t get_eeprom_size() {
|
||||
return OSFS::endOfEEPROM;
|
||||
}
|
||||
uint32_t get_eeprom_size_bytes() {
|
||||
return OSFS::endOfEEPROM * 1024;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OSFS::readNBytes(uint16_t address, unsigned int num, byte* output) {
|
||||
// eeprom.read(address, output, num);
|
||||
last_error = 0;
|
||||
|
||||
if(address < OSFS::startOfEEPROM || address + num > OSFS::endOfEEPROM * 1024) {
|
||||
last_error = ERROR_OUT_OF_BOUNDS;
|
||||
return;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < num; i++) {
|
||||
output[i] = memory[address + i];
|
||||
}
|
||||
|
||||
}
|
||||
void OSFS::writeNBytes(uint16_t address, unsigned int num, const byte* input) {
|
||||
// eeprom.write(address, input, num);
|
||||
last_error = 0;
|
||||
|
||||
if (address < OSFS::startOfEEPROM || address + num > OSFS::endOfEEPROM * 1024) {
|
||||
last_error = ERROR_OUT_OF_BOUNDS;
|
||||
return;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < num; i++) {
|
||||
memory[address + i] = input[i];
|
||||
}
|
||||
}
|
1
src/wasm/walloc
Submodule
1
src/wasm/walloc
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit a93409f5ebd49c875514c5fee30d3b151f7b0882
|
Loading…
Reference in a new issue