tools/nolibc: add abs() and friends

This is used in various selftests and will be handy when integrating
those with nolibc.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250428-nolibc-misc-v2-6-3c043eeab06c@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
Thomas Weißschuh
2025-04-28 14:40:07 +02:00
committed by Thomas Weißschuh
parent 801f020b5f
commit bf5e8a78be
5 changed files with 53 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ all_files := \
fcntl.h \
getopt.h \
limits.h \
math.h \
nolibc.h \
poll.h \
signal.h \

View File

@@ -0,0 +1,31 @@
/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
/*
* math definitions for NOLIBC
* Copyright (C) 2025 Thomas Weißschuh <thomas.weissschuh@linutronix.de>
*/
/* make sure to include all global symbols */
#include "nolibc.h"
#ifndef _NOLIBC_SYS_MATH_H
#define _NOLIBC_SYS_MATH_H
static __inline__
double fabs(double x)
{
return x >= 0 ? x : -x;
}
static __inline__
float fabsf(float x)
{
return x >= 0 ? x : -x;
}
static __inline__
long double fabsl(long double x)
{
return x >= 0 ? x : -x;
}
#endif /* _NOLIBC_SYS_MATH_H */

View File

@@ -116,6 +116,7 @@
#include "fcntl.h"
#include "getopt.h"
#include "poll.h"
#include "math.h"
/* Used by programs to avoid std includes */
#define NOLIBC

View File

@@ -32,6 +32,24 @@ static __attribute__((unused)) char itoa_buffer[21];
* As much as possible, please keep functions alphabetically sorted.
*/
static __inline__
int abs(int j)
{
return j >= 0 ? j : -j;
}
static __inline__
long labs(long j)
{
return j >= 0 ? j : -j;
}
static __inline__
long long llabs(long long j)
{
return j >= 0 ? j : -j;
}
/* must be exported, as it's used by libgcc for various divide functions */
void abort(void);
__attribute__((weak,unused,noreturn,section(".text.nolibc_abort")))

View File

@@ -1318,6 +1318,8 @@ int run_stdlib(int min, int max)
CASE_TEST(tolower_noop); EXPECT_EQ(1, tolower('a'), 'a'); break;
CASE_TEST(toupper); EXPECT_EQ(1, toupper('a'), 'A'); break;
CASE_TEST(toupper_noop); EXPECT_EQ(1, toupper('A'), 'A'); break;
CASE_TEST(abs); EXPECT_EQ(1, abs(-10), 10); break;
CASE_TEST(abs_noop); EXPECT_EQ(1, abs(10), 10); break;
case __LINE__:
return ret; /* must be last */