dlsym opcode modified so that 0 for library is converted to RTLD_DEFAULT as the two don't match on Darwin. Made errno an opcode, as previous method depended on Linux internals. [1] https://opensource.apple.com/source/xnu/xnu-201/osfmk/libsa/errno.h.auto.html [2] https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html Placed errno in internals and then alias inside posix vocabulary, as it seemed a waste to have another builtin stub for one symbol. Arguably maybe dlsym should be that way too, but leaving for now. Added OS make variable to conditionally set flags. Set stripping / minimization options based on it. Based off of https://github.com/flagxor/ueforth/pull/3 Thanks Ulrich!
54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
// Copyright 2021 Bradley D. Nelson
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include <dlfcn.h>
|
|
#include <errno.h>
|
|
#include <sys/mman.h>
|
|
|
|
#include "common/tier0_opcodes.h"
|
|
#include "common/tier1_opcodes.h"
|
|
#include "common/tier2_opcodes.h"
|
|
#include "common/floats.h"
|
|
#include "common/calls.h"
|
|
|
|
#define HEAP_SIZE (10 * 1024 * 1024)
|
|
#define STACK_CELLS (8 * 1024)
|
|
|
|
// NOTE: errno implemented as opcode to avoid a Linux platform dependency.
|
|
|
|
#define PLATFORM_OPCODE_LIST \
|
|
Y(DLSYM, tos = (cell_t) dlsym(a1 ? a1 : RTLD_DEFAULT, c0); NIP) \
|
|
XV(internals, "errno", ERRNO_INTERNAL, DUP; tos = (cell_t) errno) \
|
|
CALLING_OPCODE_LIST \
|
|
FLOATING_POINT_LIST
|
|
|
|
#define VOCABULARY_LIST V(forth) V(internals)
|
|
|
|
#include "common/bits.h"
|
|
#include "common/core.h"
|
|
#include "posix/faults.h"
|
|
#include "common/calling.h"
|
|
#include "common/interp.h"
|
|
|
|
#include "gen/posix_boot.h"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
void *heap = mmap(
|
|
(void *) 0x8000000, HEAP_SIZE,
|
|
PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
forth_init(argc, argv, heap, HEAP_SIZE, boot, sizeof(boot));
|
|
for (;;) { g_sys->rp = forth_run(g_sys->rp); }
|
|
return 1;
|
|
}
|