Using LLVM libc

There is partial libc support for Valida, starting with release 0.3.0-alpha of the Valida compiler toolchain. This libc is a version of LLVM libc.

There is an example in the 0.3.0-alpha release bundle, examples/cat-alpha.c, which makes use of this libc. This example echoes all of the alphabetic characters in its input. It makes use of the libc function isalpha. The following commands, run from the root directory of the extracted release bundle, should compile and run this example:

CPATH="$(pwd)/libc" ./clang -nostdinc -c -target delendum ./examples/cat-alpha.c
./ld.lld --script=./valida.ld ./DelendumEntryPoint.o ./libc/libc.a ./cat-alpha.o -o cat-alpha
./valida run cat-alpha log

Other C programs using libc may be compilable following this pattern, as well.

The following header files are available, and contain the following declarations and macro definitions:

  • ctype.h

    • int isalnum(int)

    • int isalpha(int)

    • int isblank(int)

    • int iscntrl(int)

    • int isdigit(int)

    • int isgraph(int)

    • int islower(int)

    • int isprint(int)

    • int ispunct(int)

    • int isspace(int)

    • int isupper(int)

    • int isxdigit(int)

    • int tolower(int)

    • int toupper(int)

  • errno.h

    • ERFKILL

    • EOWNERDEAD

    • EHWPOISON

    • ECANCELED

    • ENOTSUP

    • ENOTRECOVERABLE

  • fenv.h

    • FE_DIVBYZERO

    • FE_INEXACT

    • FE_INVALID

    • FE_OVERFLOW

    • FE_UNDERFLOW

    • FE_ALL_EXCEPT

    • FE_DOWNWARD

    • FE_TONEAREST

    • FE_TOWARDZERO

    • FE_UPWARD

    • FE_DFL_ENV

  • inttypes.h

    • intmax_t imaxabs(intmax_t)

    • imaxdiv_t imaxdiv(intmax_t, intmax_t)

    • intmax_t strtoimax(const char *, char **, int)

    • uintmax_t strtoumax(const *, char **, int)

  • math.h

    • double fabs(double)

    • float fabsf(float)

    • long double fabsl(long double)

    • double fdim(double, double)

    • float fdimf(float, float)

    • long double fdiml(long double, long double)

    • double fmax(double, double)

    • float fmaxf(float, float)

    • long double fmaxl(long double, long double)

    • double fmin(double, double)

    • float fminf(float, float)

    • long double fminl(long double, long double)

  • stdio.h

    • int putchar(int)

    • int getchar(void)

  • stdlib.h

    • int abs(int)

    • int atoi(const char *)

    • long atol(const char *)

    • void *bsearch(const void *, const void *, size_t, size_t, __bsearchcompare_t)

    • div_t div(int, int)

    • long labs(long)

    • ldiv_t ldiv(long, long)

    • long long llabs(long long)

    • lldiv_t lldiv(long long, long long)

    • void qsort(void *, size_t, size_t, __qsortcompare_t)

    • long strtol(const char *, char **, int)

    • unsigned long strtoul(const char *, char **, int)

    • unsigned long long strtoull(const char *, char **, int)

    • void *malloc(size_t)

    • void *malloc_wrapped(size_t)

    • void *callc(size_t, size_t)

    • void *aligned_alloc(size_t, size_t)

    • void *realloc(void*, size_t)

    • void free(void *)

    • int rand(void)

    • int putchar(int)

    • int getchar()

  • string.h

    • void *memchr(const void *, int, size_t)

    • int memcmp(const void *, const void *, size_t)

    • void *memcpy(void *, const void *, size_t)

    • void *memmove(void *, const void *, size_t)

    • void *memset(void *, int, size_t)

    • void *strcat(char *, const char *)

    • char *strchr(const char *, int)

    • int strcmp(const char *, const char *)

    • char *strcpy(char *, const char *)

    • size_t strcspn(const char *, const char *)

    • size_t strlen(const char *)

    • char *strncat(char *, const char *, size_t)

    • int strncmp(const char *, const char *, size_t)

    • char *strncpy(char *, const char *, size_t)

    • char *strpbrk(const char *, const char *)

    • char *strrchr(const char *, int)

    • size_t strspn(const char *, const char *)

    • char *strstr(const char *, const char *)

    • char *strtok(char *, const char *)

  • strings.h

Last updated