c++: Update minimal libc headers
Updates the minimal libc headers for differences between the C and C++ languages. This includes ... 1. Conditionally defining "bool", "true" and "false" as they are already keywords in C++. 2. Making the definition of NULL language dependent. 3. Using the _Restrict macro instead of the restrict keyword as restrict exists in C, but not in C++. 4. Changing the definition of size_t so that it is compatible with what the compiler expects when building the new operator stubs (as it varies by architecture). Change-Id: I37ff058a60b90a05f96e9dd6f61d454d143041ce Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
This commit is contained in:
parent
497d0e53c4
commit
df3c6b13ab
10 changed files with 79 additions and 29 deletions
|
@ -19,5 +19,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(NULL)
|
#if !defined(NULL)
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define NULL 0
|
||||||
|
#else
|
||||||
#define NULL (void *)0
|
#define NULL (void *)0
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
34
lib/libc/minimal/include/bits/restrict.h
Normal file
34
lib/libc/minimal/include/bits/restrict.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file _Restrict definition
|
||||||
|
*
|
||||||
|
* The macro "_Restrict" is intended to be private to the minimal libc library.
|
||||||
|
* It evaluates to the "restrict" keyword when a C99 compiler is used, and
|
||||||
|
* to "__restrict__" when a C++ compiler is used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_Restrict_defined)
|
||||||
|
#define _Restrict_defined
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define _Restrict __restrict__
|
||||||
|
#else
|
||||||
|
#define _Restrict restrict
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -21,6 +21,14 @@
|
||||||
#if !defined(__size_t_defined)
|
#if !defined(__size_t_defined)
|
||||||
#define __size_t_defined
|
#define __size_t_defined
|
||||||
|
|
||||||
|
#ifdef __i386
|
||||||
|
typedef unsigned long int size_t;
|
||||||
|
#elif defined(__ARM_ARCH)
|
||||||
typedef unsigned int size_t;
|
typedef unsigned int size_t;
|
||||||
|
#elif defined(__arc__)
|
||||||
|
typedef unsigned int size_t;
|
||||||
|
#else
|
||||||
|
#error "The minimal libc library does not recognize the architecture!\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,9 +19,11 @@
|
||||||
#ifndef __INC_stdbool_h__
|
#ifndef __INC_stdbool_h__
|
||||||
#define __INC_stdbool_h__
|
#define __INC_stdbool_h__
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
#define bool _Bool
|
#define bool _Bool
|
||||||
#define true 1
|
#define true 1
|
||||||
#define false 0
|
#define false 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __bool_true_false_are_defined 1
|
#define __bool_true_false_are_defined 1
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <stdarg.h> /* Needed to get definition of va_list */
|
#include <stdarg.h> /* Needed to get definition of va_list */
|
||||||
#include <bits/null.h>
|
#include <bits/null.h>
|
||||||
#include <bits/size_t.h>
|
#include <bits/size_t.h>
|
||||||
|
#include <bits/restrict.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -45,22 +46,22 @@ typedef int FILE;
|
||||||
* declared below.
|
* declared below.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int printf(const char *restrict fmt, ...);
|
int printf(const char *_Restrict fmt, ...);
|
||||||
int snprintf(char *restrict s, size_t len, const char *restrict fmt, ...);
|
int snprintf(char *_Restrict s, size_t len, const char *_Restrict fmt, ...);
|
||||||
int sprintf(char *restrict s, const char *restrict fmt, ...);
|
int sprintf(char *_Restrict s, const char *_Restrict fmt, ...);
|
||||||
int fprintf(FILE *restrict stream, const char *restrict format, ...);
|
int fprintf(FILE *_Restrict stream, const char *_Restrict format, ...);
|
||||||
|
|
||||||
|
|
||||||
int vprintf(const char *restrict fmt, va_list list);
|
int vprintf(const char *_Restrict fmt, va_list list);
|
||||||
int vsnprintf(char *restrict s, size_t len, const char *restrict fmt, va_list list);
|
int vsnprintf(char *_Restrict s, size_t len, const char *_Restrict fmt, va_list list);
|
||||||
int vsprintf(char *restrict s, const char *restrict fmt, va_list list);
|
int vsprintf(char *_Restrict s, const char *_Restrict fmt, va_list list);
|
||||||
int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap);
|
int vfprintf(FILE *_Restrict stream, const char *_Restrict format, va_list ap);
|
||||||
|
|
||||||
int puts(const char *s);
|
int puts(const char *s);
|
||||||
|
|
||||||
int fputc(int c, FILE *stream);
|
int fputc(int c, FILE *stream);
|
||||||
int fputs(const char *restrict s, FILE *restrict stream);
|
int fputs(const char *_Restrict s, FILE *_Restrict stream);
|
||||||
size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
|
size_t fwrite(const void *_Restrict ptr, size_t size, size_t nitems, FILE *_Restrict stream);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,22 +21,23 @@
|
||||||
|
|
||||||
#include <bits/null.h>
|
#include <bits/null.h>
|
||||||
#include <bits/size_t.h>
|
#include <bits/size_t.h>
|
||||||
|
#include <bits/restrict.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern char *strcpy(char *restrict d, const char *restrict s);
|
extern char *strcpy(char *_Restrict d, const char *_Restrict s);
|
||||||
extern char *strncpy(char *restrict d, const char *restrict s, size_t n);
|
extern char *strncpy(char *_Restrict d, const char *_Restrict s, size_t n);
|
||||||
extern char *strchr(const char *s, int c);
|
extern char *strchr(const char *s, int c);
|
||||||
extern size_t strlen(const char *s);
|
extern size_t strlen(const char *s);
|
||||||
extern int strcmp(const char *s1, const char *s2);
|
extern int strcmp(const char *s1, const char *s2);
|
||||||
extern int strncmp(const char *s1, const char *s2, size_t n);
|
extern int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
extern char *strcat(char *restrict dest, const char *restrict src);
|
extern char *strcat(char *_Restrict dest, const char *_Restrict src);
|
||||||
|
|
||||||
extern int memcmp(const void *m1, const void *m2, size_t n);
|
extern int memcmp(const void *m1, const void *m2, size_t n);
|
||||||
extern void *memmove(void *d, const void *s, size_t n);
|
extern void *memmove(void *d, const void *s, size_t n);
|
||||||
extern void *memcpy(void *restrict d, const void *restrict s, size_t n);
|
extern void *memcpy(void *_Restrict d, const void *_Restrict s, size_t n);
|
||||||
extern void *memset(void *buf, int c, size_t n);
|
extern void *memset(void *buf, int c, size_t n);
|
||||||
extern void *memchr(const void *s, unsigned char c, size_t n);
|
extern void *memchr(const void *s, unsigned char c, size_t n);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
extern int _prf(int (*func)(), void *dest,
|
extern int _prf(int (*func)(), void *dest,
|
||||||
const char *format, va_list vargs);
|
const char *format, va_list vargs);
|
||||||
|
|
||||||
int fprintf(FILE * restrict F, const char *restrict format, ...)
|
int fprintf(FILE *_Restrict F, const char *_Restrict format, ...)
|
||||||
{
|
{
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
int r;
|
int r;
|
||||||
|
@ -36,7 +36,7 @@ int fprintf(FILE * restrict F, const char *restrict format, ...)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vfprintf(FILE * restrict F, const char *restrict format, va_list vargs)
|
int vfprintf(FILE *_Restrict F, const char *_Restrict format, va_list vargs)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ int vfprintf(FILE * restrict F, const char *restrict format, va_list vargs)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int printf(const char *restrict format, ...)
|
int printf(const char *_Restrict format, ...)
|
||||||
{
|
{
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
int r;
|
int r;
|
||||||
|
@ -57,7 +57,7 @@ int printf(const char *restrict format, ...)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vprintf(const char *restrict format, va_list vargs)
|
int vprintf(const char *_Restrict format, va_list vargs)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ static int sprintf_out(int c, struct emitter *p)
|
||||||
return 0; /* indicate keep going so we get the total count */
|
return 0; /* indicate keep going so we get the total count */
|
||||||
}
|
}
|
||||||
|
|
||||||
int snprintf(char *restrict s, size_t len, const char *restrict format, ...)
|
int snprintf(char *_Restrict s, size_t len, const char *_Restrict format, ...)
|
||||||
{
|
{
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ int snprintf(char *restrict s, size_t len, const char *restrict format, ...)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sprintf(char *restrict s, const char *restrict format, ...)
|
int sprintf(char *_Restrict s, const char *_Restrict format, ...)
|
||||||
{
|
{
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ int sprintf(char *restrict s, const char *restrict format, ...)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vsnprintf(char *restrict s, size_t len, const char *restrict format, va_list vargs)
|
int vsnprintf(char *_Restrict s, size_t len, const char *_Restrict format, va_list vargs)
|
||||||
{
|
{
|
||||||
struct emitter p;
|
struct emitter p;
|
||||||
int r;
|
int r;
|
||||||
|
@ -105,7 +105,7 @@ int vsnprintf(char *restrict s, size_t len, const char *restrict format, va_list
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vsprintf(char *restrict s, const char *restrict format, va_list vargs)
|
int vsprintf(char *_Restrict s, const char *_Restrict format, va_list vargs)
|
||||||
{
|
{
|
||||||
struct emitter p;
|
struct emitter p;
|
||||||
int r;
|
int r;
|
||||||
|
|
|
@ -37,7 +37,7 @@ int fputc(int c, FILE *stream)
|
||||||
return (stdout == stream) ? _stdout_hook(c) : EOF;
|
return (stdout == stream) ? _stdout_hook(c) : EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fputs(const char *restrict string, FILE *restrict stream)
|
int fputs(const char *_Restrict string, FILE *_Restrict stream)
|
||||||
{
|
{
|
||||||
if (stream != stdout) {
|
if (stream != stdout) {
|
||||||
return EOF;
|
return EOF;
|
||||||
|
@ -53,8 +53,8 @@ int fputs(const char *restrict string, FILE *restrict stream)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
|
size_t fwrite(const void *_Restrict ptr, size_t size, size_t nitems,
|
||||||
FILE *restrict stream)
|
FILE *_Restrict stream)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
* @return pointer to destination buffer <d>
|
* @return pointer to destination buffer <d>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *strcpy(char *restrict d, const char *restrict s)
|
char *strcpy(char *_Restrict d, const char *_Restrict s)
|
||||||
{
|
{
|
||||||
char *dest = d;
|
char *dest = d;
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ char *strcpy(char *restrict d, const char *restrict s)
|
||||||
* @return pointer to destination buffer <d>
|
* @return pointer to destination buffer <d>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *strncpy(char *restrict d, const char *restrict s, size_t n)
|
char *strncpy(char *_Restrict d, const char *_Restrict s, size_t n)
|
||||||
{
|
{
|
||||||
char *dest = d;
|
char *dest = d;
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ int strncmp(const char *s1, const char *s2, size_t n)
|
||||||
return (n == 0) ? 0 : (*s1 - *s2);
|
return (n == 0) ? 0 : (*s1 - *s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *strcat(char *restrict dest, const char *restrict src)
|
char *strcat(char *_Restrict dest, const char *_Restrict src)
|
||||||
{
|
{
|
||||||
strcpy(dest + strlen(dest), src);
|
strcpy(dest + strlen(dest), src);
|
||||||
return dest;
|
return dest;
|
||||||
|
@ -208,7 +208,7 @@ void *memmove(void *d, const void *s, size_t n)
|
||||||
* @return pointer to start of destination buffer
|
* @return pointer to start of destination buffer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void *memcpy(void *restrict d, const void *restrict s, size_t n)
|
void *memcpy(void *_Restrict d, const void *_Restrict s, size_t n)
|
||||||
{
|
{
|
||||||
/* attempt word-sized copying only if buffers have identical alignment */
|
/* attempt word-sized copying only if buffers have identical alignment */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue