d966f08fcd
With -Wsign-compare, compilers warn about a mismatching signedness in comparisons in various files in the tests/ directory. For about half of the cases we can simply change the signed variable to be of an unsigned type, because they will never need to store negative values (which is the best fix of the problem). In the remaining cases we can cast the signed variable to an unsigned type, provided we know for sure it is not negative. We see two different scenarios here: - We either just explicitly checked for this variable to be positive (if (rc < 0) FAIL();), or - We rely on a function returning only positive values in the "length" pointer if the function returned successfully: which we just checked. At two occassions we compare with a constant "-1" (even though the variable is unsigned), so we just change this to ~0U to create an unsigned comparison value. Since this is about the tests, let's also add explicit tests for those values really not being negative. This fixes "make tests" (but not "make check" yet), when compiled with -Wsign-compare. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Message-Id: <20210618172030.9684-2-andre.przywara@arm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
103 lines
2.4 KiB
C
103 lines
2.4 KiB
C
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
/*
|
|
* Testcase for dtc expression support
|
|
*
|
|
* Copyright (C) 2008 David Gibson, IBM Corporation.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
|
|
|
|
#include <libfdt.h>
|
|
|
|
#include "tests.h"
|
|
#include "testdata.h"
|
|
|
|
static struct test_expr {
|
|
const char *expr;
|
|
uint32_t result;
|
|
} expr_table[] = {
|
|
#define TE(expr) { #expr, (expr) }
|
|
TE(0xdeadbeef),
|
|
TE(-0x21524111),
|
|
TE(1+1),
|
|
TE(2*3),
|
|
TE(4/2),
|
|
TE(10/3),
|
|
TE(19%4),
|
|
TE(1 << 13),
|
|
TE(0x1000 >> 4),
|
|
TE(3*2+1), TE(3*(2+1)),
|
|
TE(1+2*3), TE((1+2)*3),
|
|
TE(1 < 2), TE(2 < 1), TE(1 < 1),
|
|
TE(1 <= 2), TE(2 <= 1), TE(1 <= 1),
|
|
TE(1 > 2), TE(2 > 1), TE(1 > 1),
|
|
TE(1 >= 2), TE(2 >= 1), TE(1 >= 1),
|
|
TE(1 == 1), TE(1 == 2),
|
|
TE(1 != 1), TE(1 != 2),
|
|
TE(0xabcdabcd & 0xffff0000),
|
|
TE(0xdead4110 ^ 0xf0f0f0f0),
|
|
TE(0xabcd0000 | 0x0000abcd),
|
|
TE(~0x21524110),
|
|
TE(~~0xdeadbeef),
|
|
TE(0 && 0), TE(17 && 0), TE(0 && 17), TE(17 && 17),
|
|
TE(0 || 0), TE(17 || 0), TE(0 || 17), TE(17 || 17),
|
|
TE(!0), TE(!1), TE(!17), TE(!!0), TE(!!17),
|
|
TE(0 ? 17 : 39), TE(1 ? 17 : 39), TE(17 ? 0xdeadbeef : 0xabcd1234),
|
|
TE(11 * 257 * 1321517ULL),
|
|
TE(123456790 - 4/2 + 17%4),
|
|
};
|
|
|
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
void *fdt;
|
|
const fdt32_t *res;
|
|
int reslen;
|
|
unsigned int i;
|
|
|
|
test_init(argc, argv);
|
|
|
|
if ((argc == 3) && (strcmp(argv[1], "-g") == 0)) {
|
|
FILE *f = fopen(argv[2], "w");
|
|
|
|
if (!f)
|
|
FAIL("Couldn't open \"%s\" for output: %s\n",
|
|
argv[2], strerror(errno));
|
|
|
|
fprintf(f, "/dts-v1/;\n");
|
|
fprintf(f, "/ {\n");
|
|
fprintf(f, "\texpressions = <\n");
|
|
for (i = 0; i < ARRAY_SIZE(expr_table); i++)
|
|
fprintf(f, "\t\t(%s)\n", expr_table[i].expr);
|
|
fprintf(f, "\t>;\n");
|
|
fprintf(f, "};\n");
|
|
fclose(f);
|
|
} else {
|
|
fdt = load_blob_arg(argc, argv);
|
|
|
|
res = fdt_getprop(fdt, 0, "expressions", &reslen);
|
|
|
|
if (!res)
|
|
FAIL("Error retrieving expression results: %s\n",
|
|
fdt_strerror(reslen));
|
|
|
|
if (reslen != (ARRAY_SIZE(expr_table) * sizeof(uint32_t)))
|
|
FAIL("Unexpected length of results %d instead of %zd\n",
|
|
reslen, ARRAY_SIZE(expr_table) * sizeof(uint32_t));
|
|
|
|
for (i = 0; i < ARRAY_SIZE(expr_table); i++)
|
|
if (fdt32_to_cpu(res[i]) != expr_table[i].result)
|
|
FAIL("Incorrect result for expression \"%s\","
|
|
" 0x%x instead of 0x%x\n",
|
|
expr_table[i].expr, fdt32_to_cpu(res[i]),
|
|
expr_table[i].result);
|
|
}
|
|
|
|
PASS();
|
|
}
|