stdlib: printf-like logging
This commit is contained in:
parent
4cdc19b590
commit
5f4b19bdca
|
|
@ -6,6 +6,7 @@ extern "C" {
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
extern unsigned char __heap_base;
|
||||
|
||||
#define IMPORT(name) __attribute__((import_module("env"), import_name(#name)))
|
||||
|
|
@ -13,8 +14,6 @@ extern unsigned char __heap_base;
|
|||
|
||||
#define NULL ((void*)0)
|
||||
|
||||
typedef uint32_t size_t;
|
||||
|
||||
EXPORT(malloc) void* malloc(size_t);
|
||||
EXPORT(free) void free(void*);
|
||||
EXPORT(realloc) void* realloc(void*, size_t);
|
||||
|
|
@ -23,7 +22,7 @@ void* memset(void* s, uint8_t c, uint32_t n);
|
|||
void* memcpy(void* dest, const void* src, uint32_t n);
|
||||
int memcmp(const void* s1, const void* s2, uint32_t n);
|
||||
|
||||
IMPORT(log) void print_int(int64_t);
|
||||
IMPORT(log) void printf(const char* format, ...);
|
||||
|
||||
EXPORT(__srand) void srand(uint64_t seed);
|
||||
uint64_t rand(void);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ const filePlugin: BunPlugin = {
|
|||
name: "File loader",
|
||||
async setup(build) {
|
||||
build.onLoad({ filter: /\.glsl$/ }, async (args) => {
|
||||
console.log(args);
|
||||
const text = await Bun.file(args.path).text();
|
||||
return {
|
||||
contents: `
|
||||
|
|
|
|||
|
|
@ -17,12 +17,43 @@ const wasmPlugin = ({ production, portable }: WasmLoaderConfig = {}): BunPlugin
|
|||
const memory = new WebAssembly.Memory({
|
||||
initial: 32,
|
||||
});
|
||||
let data = new DataView(memory.buffer);
|
||||
let data = new DataView(memory.buffer);
|
||||
const decoder = new TextDecoder();
|
||||
const getString = (ptr) => {
|
||||
const view = new Uint8Array(memory.buffer, ptr);
|
||||
const start = ptr;
|
||||
const end = ptr + view.indexOf(0);
|
||||
|
||||
return decoder.decode(memory.buffer.slice(start, end));
|
||||
};
|
||||
const { instance } = await WebAssembly.instantiateStreaming(fetch(url), {
|
||||
env: {
|
||||
memory,
|
||||
log(...args) {
|
||||
console.log('[wasm]', ...args);
|
||||
log(format, argsPtr) {
|
||||
format = getString(format);
|
||||
let buf = '';
|
||||
let isFormat = false;
|
||||
let w = 4;
|
||||
const align = (a) => argsPtr += (argsPtr % a);
|
||||
for (const c of format) {
|
||||
if (!isFormat && c !== '%') {
|
||||
buf += c;
|
||||
} else if (c === '%') {
|
||||
isFormat = true;
|
||||
} else switch(c) {
|
||||
case '%': buf += '%'; isFormat = false; break;
|
||||
case 's': align(4); buf += getString(data.getInt32(argsPtr, true)); argsPtr += 4; isFormat = false; break;
|
||||
case 'd': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true); argsPtr += w; isFormat = false; break;
|
||||
case 'x': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true).toString(16); argsPtr += w; isFormat = false; break;
|
||||
case 'o': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true).toString(8); argsPtr += w; isFormat = false; break;
|
||||
case 'u': align(w); buf += data[w === 4 ? 'getUint32': 'getBigUint64'](argsPtr, true); argsPtr += w; isFormat = false; break;
|
||||
case 'f': align(8); buf += data.getFloat64(argsPtr, true); argsPtr += 8; isFormat = false; break;
|
||||
case 'c': align(4); buf += String.fromCharCode(data.getInt32(argsPtr, true)); argsPtr += 4; isFormat = false; break;
|
||||
case 'l': w = 8; break;
|
||||
}
|
||||
}
|
||||
|
||||
console.log('[wasm] ' + buf);
|
||||
},
|
||||
grow(blocks) {
|
||||
if (blocks > 0) {
|
||||
|
|
@ -49,7 +80,7 @@ const wasmPlugin = ({ production, portable }: WasmLoaderConfig = {}): BunPlugin
|
|||
} else {
|
||||
const buildAssets = path.resolve(import.meta.dir, 'assets');
|
||||
const stdlib = `${buildAssets}/stdlib.c`;
|
||||
const opt = production ? '-O3': '-O0';
|
||||
const opt = production ? '-O3' : '-O0';
|
||||
const result = await $`clang --target=wasm32 ${opt} -flto -fno-builtin --no-standard-libraries -I ${buildAssets} -Wall -Wextra -Wpedantic -Werror -Wl,--lto-O3 -Wl,--no-entry -Wl,--import-memory -o ${wasmPath} ${args.path} ${stdlib}`;
|
||||
|
||||
if (result.exitCode !== 0) {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,5 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
struct awoo {
|
||||
int a;
|
||||
|
||||
awoo operator+(const awoo& other) const { return awoo{a + other.a}; }
|
||||
|
||||
operator int() const { return a * 2; }
|
||||
};
|
||||
|
||||
EXPORT(cpptest) uint32_t cpptest() {
|
||||
awoo a{42};
|
||||
awoo b{69};
|
||||
|
||||
return a + b;
|
||||
EXPORT(cpptest) void cpptest() {
|
||||
printf("Awoo d=%d d2=%d", 69llu, 42ll);
|
||||
}
|
||||
|
|
@ -1,13 +1,7 @@
|
|||
import { render } from "preact";
|
||||
import awoo from "./awoo.cpp";
|
||||
import shader from './assets/shader.glsl';
|
||||
|
||||
export default function main() {
|
||||
console.log(shader);
|
||||
render(
|
||||
<button onClick={() => console.log(awoo.cpptest())}>
|
||||
Attack
|
||||
</button>,
|
||||
document.body
|
||||
);
|
||||
awoo.cpptest();
|
||||
// awoo.data.getBig
|
||||
console.log(awoo.memory);
|
||||
}
|
||||
|
|
@ -103,8 +103,7 @@ void patterns_init(uint32_t* pixel_data, uint16_t image_width, uint16_t image_he
|
|||
}
|
||||
}
|
||||
|
||||
print_int(num_patterns);
|
||||
print_int(max_patterns);
|
||||
log("num=%u, max=%u", num_patterns, max_patterns);
|
||||
}
|
||||
|
||||
void superposition_init(void) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue