libc/minimal: Fix definition of ssize_t

Each GCC target backend is at liberty to define its own SIZE_TYPE. GCC
uses this for various purposes, not lease it drives the machinery that
spits out format specifier diagnostics when format specifiers are
applied to objects with inappropriate type.  GCC exposes the current
definition of SIZE_TYPE via the preprocessor symbol __SIZE_TYPE__.
The GCC build processes also generates various standard library header
files that directyle expose stanard types in a form consistent with
the current configuration of GCC.  Conventionally standard library
build processes (for glibc and newlib) pick up the header files
generated by the GCC build.

In the minimal libc we have no such build process, we don't pick up
the header files that the GCC build process generated.  Instead we
define our own alternative header files and align them with GCC
manually.

The current definition of ssize_t in minimal libc is out of step with
GCC which means that any use of the %z[du] format modifier will issue
a diagnostic.

We replace the open coded architecture detection in minimal libc and
use GCCs __SIZE_TYPE__ directly.

Change-Id: I63b5e17bee4f4ab83d49e492e58efd3bafe76807
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>

tests: fs: Fix printf warning when using newlib

Current code uses %ld format specifier to print data of
type ssize_t. This causes type warnings when built with
newlib. The correct format specifier to be used for
ssize_t is %zd.

Change-Id: I02a3c628e3d6e8a36a09cd694220406d8faf1730
Signed-off-by: Ramesh Thomas <ramesh.thomas@intel.com>
This commit is contained in:
Marcus Shawcroft 2017-01-31 09:06:18 +00:00 committed by Ramesh Thomas
commit 458e2ed133
2 changed files with 7 additions and 16 deletions

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2016 Intel Corporation
* Copyright (c) 2017 ARM Ltd
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -10,19 +11,9 @@
#if !defined(__ssize_t_defined)
#define __ssize_t_defined
#ifdef __i386
typedef long int ssize_t;
#elif defined(__ARM_ARCH)
typedef int ssize_t;
#elif defined(__arc__)
typedef int ssize_t;
#elif defined(__NIOS2__)
typedef int ssize_t;
#elif defined(__riscv__)
typedef int ssize_t;
#else
#error "The minimal libc library does not recognize the architecture!\n"
#endif
#define unsigned signed
typedef __SIZE_TYPE__ ssize_t;
#undef unsigned
#endif

View file

@ -79,13 +79,13 @@ static int write_test(fs_file_t *fp, off_t ofs, const char *str)
brw = fs_write(fp, (char *)str, strlen(str));
if (brw < 0) {
printk("Failed writing to file [%ld]\n", brw);
printk("Failed writing to file [%zd]\n", brw);
fs_close(fp);
return brw;
}
if (brw < strlen(str)) {
printk("Unable to complete write. Volume full.\n");
printk("Number of bytes written: [%ld]\n", brw);
printk("Number of bytes written: [%zd]\n", brw);
fs_close(fp);
return -1;
}
@ -110,7 +110,7 @@ static int read_test(fs_file_t *fp, off_t ofs, size_t sz, char *read_buff)
brw = fs_read(fp, read_buff, sz);
if (brw < 0) {
printk("Failed reading file [%ld]\n", brw);
printk("Failed reading file [%zd]\n", brw);
fs_close(fp);
return brw;
}