Implement enough libb to make 'Hello, world!' work.
This commit is contained in:
parent
fbd6e8f63d
commit
9f34262f95
19
lang/b/lib/b.h
Normal file
19
lang/b/lib/b.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef B_H
|
||||||
|
#define B_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if EM_PSIZE == 2
|
||||||
|
#define SHIFT 1
|
||||||
|
#elif EM_PSIZE == 4
|
||||||
|
#define SHIFT 2
|
||||||
|
#elif EM_PSIZE == 8
|
||||||
|
#define SHIFT 3
|
||||||
|
#else
|
||||||
|
#error Unsupported EM_PSIZE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern FILE* output_unit;
|
||||||
|
|
||||||
|
#endif
|
27
lang/b/lib/build.lua
Normal file
27
lang/b/lib/build.lua
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
include("plat/build.lua")
|
||||||
|
|
||||||
|
for _, plat in ipairs(vars.plats) do
|
||||||
|
acklibrary {
|
||||||
|
name = "lib_"..plat,
|
||||||
|
srcs = {
|
||||||
|
"./*.c",
|
||||||
|
"./*.e",
|
||||||
|
},
|
||||||
|
hdrs = {}, -- must be empty
|
||||||
|
deps = {
|
||||||
|
"./*.h",
|
||||||
|
"h+emheaders",
|
||||||
|
"lang/cem/libcc.ansi/headers+headers",
|
||||||
|
"plat/"..plat.."/include+headers",
|
||||||
|
},
|
||||||
|
vars = { plat = plat }
|
||||||
|
}
|
||||||
|
|
||||||
|
installable {
|
||||||
|
name = "pkg_"..plat,
|
||||||
|
map = {
|
||||||
|
["$(PLATIND)/"..plat.."/libb.a"] = "+lib_"..plat,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
59
lang/b/lib/main.c
Normal file
59
lang/b/lib/main.c
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#include "b.h"
|
||||||
|
|
||||||
|
extern uintptr_t* bsymb_patch_table[];
|
||||||
|
extern intptr_t i_main(intptr_t argc, const char* argv[]);
|
||||||
|
|
||||||
|
FILE* output_unit;
|
||||||
|
|
||||||
|
static intptr_t i_char(intptr_t s, intptr_t n)
|
||||||
|
{
|
||||||
|
const char* p = (const char*)(s<<SHIFT);
|
||||||
|
return p[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void i_lchar(intptr_t s, intptr_t n, intptr_t c)
|
||||||
|
{
|
||||||
|
char* p = (char*)(s<<SHIFT);
|
||||||
|
p[n] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static intptr_t i_getchar(void)
|
||||||
|
{
|
||||||
|
return fgetc(output_unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void i_putchar(intptr_t c)
|
||||||
|
{
|
||||||
|
fputc(c, output_unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t b_char = (uintptr_t)i_char;
|
||||||
|
uintptr_t b_lchar = (uintptr_t)i_lchar;
|
||||||
|
uintptr_t b_getchar = (uintptr_t)i_getchar;
|
||||||
|
uintptr_t b_putchar = (uintptr_t)i_putchar;
|
||||||
|
|
||||||
|
static uintptr_t* lib_patch_table[] =
|
||||||
|
{
|
||||||
|
&b_char,
|
||||||
|
&b_lchar,
|
||||||
|
&b_getchar,
|
||||||
|
&b_putchar,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
static void patch_addresses(uintptr_t** p)
|
||||||
|
{
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
uintptr_t* q = *p++;
|
||||||
|
*q >>= SHIFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char* argv[])
|
||||||
|
{
|
||||||
|
patch_addresses(bsymb_patch_table);
|
||||||
|
patch_addresses(lib_patch_table);
|
||||||
|
output_unit = stdout;
|
||||||
|
return i_main(argc, NULL);
|
||||||
|
}
|
|
@ -104,6 +104,7 @@ definerule("build_plat_libs",
|
||||||
"lang/cem/libcc.ansi+pkg_"..e.plat,
|
"lang/cem/libcc.ansi+pkg_"..e.plat,
|
||||||
"lang/m2/libm2+pkg_"..e.plat,
|
"lang/m2/libm2+pkg_"..e.plat,
|
||||||
"lang/pc/libpc+pkg_"..e.plat,
|
"lang/pc/libpc+pkg_"..e.plat,
|
||||||
|
"lang/b/lib+pkg_"..e.plat,
|
||||||
["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat,
|
["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat,
|
||||||
["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat,
|
["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue