From 695aa0b8c28a0069d0e999aa039a60951b440ea4 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 21 May 2016 19:35:36 +0300 Subject: Made cstdlib a subproject. --- cross/ownstdlib.txt | 13 ++++++++ manual tests/9 nostdlib/meson.build | 14 +++++++++ manual tests/9 nostdlib/prog.c | 7 +++++ manual tests/9 nostdlib/subprojects/mylibc/libc.c | 35 ++++++++++++++++++++++ .../9 nostdlib/subprojects/mylibc/meson.build | 12 ++++++++ manual tests/9 nostdlib/subprojects/mylibc/stdio.h | 5 ++++ .../9 nostdlib/subprojects/mylibc/stubstart.s | 8 +++++ test cases/ownstdlib/1 libc/libc.c | 35 ---------------------- test cases/ownstdlib/1 libc/meson.build | 18 ----------- test cases/ownstdlib/1 libc/prog.c | 7 ----- test cases/ownstdlib/1 libc/stdio.h | 5 ---- test cases/ownstdlib/1 libc/stubstart.s | 8 ----- 12 files changed, 94 insertions(+), 73 deletions(-) create mode 100644 cross/ownstdlib.txt create mode 100644 manual tests/9 nostdlib/meson.build create mode 100644 manual tests/9 nostdlib/prog.c create mode 100644 manual tests/9 nostdlib/subprojects/mylibc/libc.c create mode 100644 manual tests/9 nostdlib/subprojects/mylibc/meson.build create mode 100644 manual tests/9 nostdlib/subprojects/mylibc/stdio.h create mode 100644 manual tests/9 nostdlib/subprojects/mylibc/stubstart.s delete mode 100644 test cases/ownstdlib/1 libc/libc.c delete mode 100644 test cases/ownstdlib/1 libc/meson.build delete mode 100644 test cases/ownstdlib/1 libc/prog.c delete mode 100644 test cases/ownstdlib/1 libc/stdio.h delete mode 100644 test cases/ownstdlib/1 libc/stubstart.s diff --git a/cross/ownstdlib.txt b/cross/ownstdlib.txt new file mode 100644 index 0000000..46e99f7 --- /dev/null +++ b/cross/ownstdlib.txt @@ -0,0 +1,13 @@ +# This is a setup for compiling a program that runs natively +# but uses a custom std lib. This test will only work on +# x86_64. + +[target_machine] +system = 'linux' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[properties] + +c_stdlib = ['mylibc', 'mylibc_dep'] # Subproject name, dependency name diff --git a/manual tests/9 nostdlib/meson.build b/manual tests/9 nostdlib/meson.build new file mode 100644 index 0000000..ad5b7b9 --- /dev/null +++ b/manual tests/9 nostdlib/meson.build @@ -0,0 +1,14 @@ +project('own libc', 'c') + +# A simple project that uses its own libc. + +libc_proj = subproject('mylibc') +libc_dep = libc_proj.get_variable('mylibc_dep') + +exe = executable('selfcontained', 'prog.c', + c_args : '-nostdlib', + link_args : '-nostdlib', + dependencies : libc_dep, +) + +test('standalone test', exe) diff --git a/manual tests/9 nostdlib/prog.c b/manual tests/9 nostdlib/prog.c new file mode 100644 index 0000000..9414bce --- /dev/null +++ b/manual tests/9 nostdlib/prog.c @@ -0,0 +1,7 @@ + +#include + +int main() { + const char *message = "Hello without stdlib.\n"; + return simple_print(message, simple_strlen(message)); +} diff --git a/manual tests/9 nostdlib/subprojects/mylibc/libc.c b/manual tests/9 nostdlib/subprojects/mylibc/libc.c new file mode 100644 index 0000000..67261cb --- /dev/null +++ b/manual tests/9 nostdlib/subprojects/mylibc/libc.c @@ -0,0 +1,35 @@ +/* Do not use this as the basis of your own libc. + * The code is probably unoptimal or wonky, as I + * had no prior experience with this, but instead + * just fiddled with the code until it worked. + */ + +#include + +#define STDOUT 1 +#define SYS_WRITE 4 + +int simple_print(const char *msg, const long bufsize) { + int count; + long total_written = 0; + while(total_written < bufsize) { + asm( + "int $0x80\n\t" + : "=a"(count) + : "0"(SYS_WRITE), "b"(STDOUT), "c"(msg+total_written), "d"(bufsize-total_written) + :); + if(count == 0) { + return 1; + } + total_written += count; + } + return 0; +} + +int simple_strlen(const char *str) { + int len = 0; + while(str[len] != '\0') { + len++; + } + return len; +} diff --git a/manual tests/9 nostdlib/subprojects/mylibc/meson.build b/manual tests/9 nostdlib/subprojects/mylibc/meson.build new file mode 100644 index 0000000..9d1fed8 --- /dev/null +++ b/manual tests/9 nostdlib/subprojects/mylibc/meson.build @@ -0,0 +1,12 @@ +project('own libc', 'c') + +# A very simple libc implementation + +# Start with manual flags to compile, then add platform support. + +libc = static_library('c', 'libc.c', 'stubstart.s', +) + +mylibc_dep = declare_dependency(link_with : libc, + include_directories : include_directories('.') +) diff --git a/manual tests/9 nostdlib/subprojects/mylibc/stdio.h b/manual tests/9 nostdlib/subprojects/mylibc/stdio.h new file mode 100644 index 0000000..c3f8f56 --- /dev/null +++ b/manual tests/9 nostdlib/subprojects/mylibc/stdio.h @@ -0,0 +1,5 @@ +#pragma once + +int simple_print(const char *msg, const long bufsize); + +int simple_strlen(const char *str); diff --git a/manual tests/9 nostdlib/subprojects/mylibc/stubstart.s b/manual tests/9 nostdlib/subprojects/mylibc/stubstart.s new file mode 100644 index 0000000..0a6d972 --- /dev/null +++ b/manual tests/9 nostdlib/subprojects/mylibc/stubstart.s @@ -0,0 +1,8 @@ +.globl _start + +_start: + + call main + movl %eax, %ebx + movl $1, %eax + int $0x80 diff --git a/test cases/ownstdlib/1 libc/libc.c b/test cases/ownstdlib/1 libc/libc.c deleted file mode 100644 index 67261cb..0000000 --- a/test cases/ownstdlib/1 libc/libc.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Do not use this as the basis of your own libc. - * The code is probably unoptimal or wonky, as I - * had no prior experience with this, but instead - * just fiddled with the code until it worked. - */ - -#include - -#define STDOUT 1 -#define SYS_WRITE 4 - -int simple_print(const char *msg, const long bufsize) { - int count; - long total_written = 0; - while(total_written < bufsize) { - asm( - "int $0x80\n\t" - : "=a"(count) - : "0"(SYS_WRITE), "b"(STDOUT), "c"(msg+total_written), "d"(bufsize-total_written) - :); - if(count == 0) { - return 1; - } - total_written += count; - } - return 0; -} - -int simple_strlen(const char *str) { - int len = 0; - while(str[len] != '\0') { - len++; - } - return len; -} diff --git a/test cases/ownstdlib/1 libc/meson.build b/test cases/ownstdlib/1 libc/meson.build deleted file mode 100644 index 1151926..0000000 --- a/test cases/ownstdlib/1 libc/meson.build +++ /dev/null @@ -1,18 +0,0 @@ -project('own libc', 'c') - -# A simple project that uses its own libc. - -# Start with manual flags to compile, then add platform support. - -libc = static_library('c', 'libc.c', 'stubstart.s', - c_args : '-nostdlib', - link_args : '-nostdlib', -) - -exe = executable('selfcontained', 'prog.c', - c_args : '-nostdlib', - link_args : '-nostdlib', - link_with : libc, -) - -test('standalone test', exe) diff --git a/test cases/ownstdlib/1 libc/prog.c b/test cases/ownstdlib/1 libc/prog.c deleted file mode 100644 index 9414bce..0000000 --- a/test cases/ownstdlib/1 libc/prog.c +++ /dev/null @@ -1,7 +0,0 @@ - -#include - -int main() { - const char *message = "Hello without stdlib.\n"; - return simple_print(message, simple_strlen(message)); -} diff --git a/test cases/ownstdlib/1 libc/stdio.h b/test cases/ownstdlib/1 libc/stdio.h deleted file mode 100644 index c3f8f56..0000000 --- a/test cases/ownstdlib/1 libc/stdio.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -int simple_print(const char *msg, const long bufsize); - -int simple_strlen(const char *str); diff --git a/test cases/ownstdlib/1 libc/stubstart.s b/test cases/ownstdlib/1 libc/stubstart.s deleted file mode 100644 index 0a6d972..0000000 --- a/test cases/ownstdlib/1 libc/stubstart.s +++ /dev/null @@ -1,8 +0,0 @@ -.globl _start - -_start: - - call main - movl %eax, %ebx - movl $1, %eax - int $0x80 -- cgit v1.1