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