mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 07:54:36 -05:00
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:
committed by
Thomas Weißschuh
parent
801f020b5f
commit
bf5e8a78be
@@ -35,6 +35,7 @@ all_files := \
|
||||
fcntl.h \
|
||||
getopt.h \
|
||||
limits.h \
|
||||
math.h \
|
||||
nolibc.h \
|
||||
poll.h \
|
||||
signal.h \
|
||||
|
||||
31
tools/include/nolibc/math.h
Normal file
31
tools/include/nolibc/math.h
Normal 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 */
|
||||
@@ -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
|
||||
|
||||
@@ -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")))
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user