treewide: Make carray arrays const and NULL-terminated

This allows the compiler to generate significantly better code, because
it does not have to maintain either the loop counter or loop limit. Plus
there are half as many symbols to relocate. This also simplifies passing
carray arrays to helper functions.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Samuel Holland
2024-11-11 14:02:45 -08:00
committed by Anup Patel
parent 23ef9c5f00
commit df1c100001
12 changed files with 26 additions and 38 deletions

View File

@@ -13,8 +13,7 @@
#include <sbi/sbi_error.h> #include <sbi/sbi_error.h>
#include <sbi/sbi_trap.h> #include <sbi/sbi_trap.h>
extern struct sbi_ecall_extension *sbi_ecall_exts[]; extern struct sbi_ecall_extension *const sbi_ecall_exts[];
extern unsigned long sbi_ecall_exts_size;
u16 sbi_ecall_version_major(void) u16 sbi_ecall_version_major(void)
{ {
@@ -148,7 +147,7 @@ int sbi_ecall_init(void)
struct sbi_ecall_extension *ext; struct sbi_ecall_extension *ext;
unsigned long i; unsigned long i;
for (i = 0; i < sbi_ecall_exts_size; i++) { for (i = 0; sbi_ecall_exts[i]; i++) {
ext = sbi_ecall_exts[i]; ext = sbi_ecall_exts[i];
ret = SBI_ENODEV; ret = SBI_ENODEV;

View File

@@ -11,8 +11,7 @@
#define ANSI_COLOR_RED "\x1b[31m" #define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_RESET "\x1b[0m" #define ANSI_COLOR_RESET "\x1b[0m"
extern struct sbiunit_test_suite *sbi_unit_tests[]; extern struct sbiunit_test_suite *const sbi_unit_tests[];
extern unsigned long sbi_unit_tests_size;
static void run_test_suite(struct sbiunit_test_suite *suite) static void run_test_suite(struct sbiunit_test_suite *suite)
{ {
@@ -48,6 +47,6 @@ void run_all_tests(void)
sbi_printf("\n# Running SBIUNIT tests #\n"); sbi_printf("\n# Running SBIUNIT tests #\n");
for (i = 0; i < sbi_unit_tests_size; i++) for (i = 0; sbi_unit_tests[i]; i++)
run_test_suite(sbi_unit_tests[i]); run_test_suite(sbi_unit_tests[i]);
} }

View File

@@ -13,8 +13,7 @@
#include <sbi_utils/gpio/fdt_gpio.h> #include <sbi_utils/gpio/fdt_gpio.h>
/* List of FDT gpio drivers generated at compile time */ /* List of FDT gpio drivers generated at compile time */
extern struct fdt_gpio *fdt_gpio_drivers[]; extern struct fdt_gpio *const fdt_gpio_drivers[];
extern unsigned long fdt_gpio_drivers_size;
static int fdt_gpio_init(const void *fdt, int nodeoff) static int fdt_gpio_init(const void *fdt, int nodeoff)
{ {
@@ -27,7 +26,7 @@ static int fdt_gpio_init(const void *fdt, int nodeoff)
return SBI_EINVAL; return SBI_EINVAL;
/* Try all GPIO drivers one-by-one */ /* Try all GPIO drivers one-by-one */
for (pos = 0; pos < fdt_gpio_drivers_size; pos++) { for (pos = 0; fdt_gpio_drivers[pos]; pos++) {
drv = fdt_gpio_drivers[pos]; drv = fdt_gpio_drivers[pos];
match = fdt_match_node(fdt, nodeoff, drv->match_table); match = fdt_match_node(fdt, nodeoff, drv->match_table);

View File

@@ -17,8 +17,7 @@
#include <sbi_utils/i2c/fdt_i2c.h> #include <sbi_utils/i2c/fdt_i2c.h>
/* List of FDT i2c adapter drivers generated at compile time */ /* List of FDT i2c adapter drivers generated at compile time */
extern struct fdt_i2c_adapter *fdt_i2c_adapter_drivers[]; extern struct fdt_i2c_adapter *const fdt_i2c_adapter_drivers[];
extern unsigned long fdt_i2c_adapter_drivers_size;
static int fdt_i2c_adapter_init(const void *fdt, int nodeoff) static int fdt_i2c_adapter_init(const void *fdt, int nodeoff)
{ {
@@ -27,7 +26,7 @@ static int fdt_i2c_adapter_init(const void *fdt, int nodeoff)
const struct fdt_match *match; const struct fdt_match *match;
/* Try all I2C drivers one-by-one */ /* Try all I2C drivers one-by-one */
for (pos = 0; pos < fdt_i2c_adapter_drivers_size; pos++) { for (pos = 0; fdt_i2c_adapter_drivers[pos]; pos++) {
drv = fdt_i2c_adapter_drivers[pos]; drv = fdt_i2c_adapter_drivers[pos];
match = fdt_match_node(fdt, nodeoff, drv->match_table); match = fdt_match_node(fdt, nodeoff, drv->match_table);
if (match && drv->init) { if (match && drv->init) {

View File

@@ -13,8 +13,7 @@
#include <sbi_utils/ipi/fdt_ipi.h> #include <sbi_utils/ipi/fdt_ipi.h>
/* List of FDT ipi drivers generated at compile time */ /* List of FDT ipi drivers generated at compile time */
extern struct fdt_ipi *fdt_ipi_drivers[]; extern struct fdt_ipi *const fdt_ipi_drivers[];
extern unsigned long fdt_ipi_drivers_size;
int fdt_ipi_init(void) int fdt_ipi_init(void)
{ {
@@ -23,7 +22,7 @@ int fdt_ipi_init(void)
const struct fdt_match *match; const struct fdt_match *match;
const void *fdt = fdt_get_address(); const void *fdt = fdt_get_address();
for (pos = 0; pos < fdt_ipi_drivers_size; pos++) { for (pos = 0; fdt_ipi_drivers[pos]; pos++) {
drv = fdt_ipi_drivers[pos]; drv = fdt_ipi_drivers[pos];
noff = -1; noff = -1;

View File

@@ -13,8 +13,7 @@
#include <sbi_utils/irqchip/fdt_irqchip.h> #include <sbi_utils/irqchip/fdt_irqchip.h>
/* List of FDT irqchip drivers generated at compile time */ /* List of FDT irqchip drivers generated at compile time */
extern struct fdt_irqchip *fdt_irqchip_drivers[]; extern struct fdt_irqchip *const fdt_irqchip_drivers[];
extern unsigned long fdt_irqchip_drivers_size;
int fdt_irqchip_init(void) int fdt_irqchip_init(void)
{ {
@@ -23,7 +22,7 @@ int fdt_irqchip_init(void)
const struct fdt_match *match; const struct fdt_match *match;
const void *fdt = fdt_get_address(); const void *fdt = fdt_get_address();
for (pos = 0; pos < fdt_irqchip_drivers_size; pos++) { for (pos = 0; fdt_irqchip_drivers[pos]; pos++) {
drv = fdt_irqchip_drivers[pos]; drv = fdt_irqchip_drivers[pos];
noff = -1; noff = -1;

View File

@@ -13,8 +13,7 @@
#include <sbi_utils/regmap/fdt_regmap.h> #include <sbi_utils/regmap/fdt_regmap.h>
/* List of FDT regmap drivers generated at compile time */ /* List of FDT regmap drivers generated at compile time */
extern struct fdt_regmap *fdt_regmap_drivers[]; extern struct fdt_regmap *const fdt_regmap_drivers[];
extern unsigned long fdt_regmap_drivers_size;
static int fdt_regmap_init(const void *fdt, int nodeoff) static int fdt_regmap_init(const void *fdt, int nodeoff)
{ {
@@ -23,7 +22,7 @@ static int fdt_regmap_init(const void *fdt, int nodeoff)
const struct fdt_match *match; const struct fdt_match *match;
/* Try all I2C drivers one-by-one */ /* Try all I2C drivers one-by-one */
for (pos = 0; pos < fdt_regmap_drivers_size; pos++) { for (pos = 0; fdt_regmap_drivers[pos]; pos++) {
drv = fdt_regmap_drivers[pos]; drv = fdt_regmap_drivers[pos];
match = fdt_match_node(fdt, nodeoff, drv->match_table); match = fdt_match_node(fdt, nodeoff, drv->match_table);
if (match && drv->init) { if (match && drv->init) {

View File

@@ -14,8 +14,7 @@
#include <sbi_utils/reset/fdt_reset.h> #include <sbi_utils/reset/fdt_reset.h>
/* List of FDT reset drivers generated at compile time */ /* List of FDT reset drivers generated at compile time */
extern struct fdt_reset *fdt_reset_drivers[]; extern struct fdt_reset *const fdt_reset_drivers[];
extern unsigned long fdt_reset_drivers_size;
int fdt_reset_driver_init(const void *fdt, struct fdt_reset *drv) int fdt_reset_driver_init(const void *fdt, struct fdt_reset *drv)
{ {
@@ -46,6 +45,6 @@ void fdt_reset_init(const void *fdt)
{ {
int pos; int pos;
for (pos = 0; pos < fdt_reset_drivers_size; pos++) for (pos = 0; fdt_reset_drivers[pos]; pos++)
fdt_reset_driver_init(fdt, fdt_reset_drivers[pos]); fdt_reset_driver_init(fdt, fdt_reset_drivers[pos]);
} }

View File

@@ -14,8 +14,7 @@
#include <sbi_utils/serial/fdt_serial.h> #include <sbi_utils/serial/fdt_serial.h>
/* List of FDT serial drivers generated at compile time */ /* List of FDT serial drivers generated at compile time */
extern struct fdt_serial *fdt_serial_drivers[]; extern struct fdt_serial *const fdt_serial_drivers[];
extern unsigned long fdt_serial_drivers_size;
int fdt_serial_init(const void *fdt) int fdt_serial_init(const void *fdt)
{ {
@@ -46,7 +45,7 @@ int fdt_serial_init(const void *fdt)
} }
/* First check DT node pointed by stdout-path */ /* First check DT node pointed by stdout-path */
for (pos = 0; pos < fdt_serial_drivers_size && -1 < noff; pos++) { for (pos = 0; fdt_serial_drivers[pos] && -1 < noff; pos++) {
drv = fdt_serial_drivers[pos]; drv = fdt_serial_drivers[pos];
match = fdt_match_node(fdt, noff, drv->match_table); match = fdt_match_node(fdt, noff, drv->match_table);
@@ -64,7 +63,7 @@ int fdt_serial_init(const void *fdt)
} }
/* Lastly check all DT nodes */ /* Lastly check all DT nodes */
for (pos = 0; pos < fdt_serial_drivers_size; pos++) { for (pos = 0; fdt_serial_drivers[pos]; pos++) {
drv = fdt_serial_drivers[pos]; drv = fdt_serial_drivers[pos];
noff = -1; noff = -1;

View File

@@ -13,8 +13,7 @@
#include <sbi_utils/timer/fdt_timer.h> #include <sbi_utils/timer/fdt_timer.h>
/* List of FDT timer drivers generated at compile time */ /* List of FDT timer drivers generated at compile time */
extern struct fdt_timer *fdt_timer_drivers[]; extern struct fdt_timer *const fdt_timer_drivers[];
extern unsigned long fdt_timer_drivers_size;
int fdt_timer_init(void) int fdt_timer_init(void)
{ {
@@ -23,7 +22,7 @@ int fdt_timer_init(void)
const struct fdt_match *match; const struct fdt_match *match;
const void *fdt = fdt_get_address(); const void *fdt = fdt_get_address();
for (pos = 0; pos < fdt_timer_drivers_size; pos++) { for (pos = 0; fdt_timer_drivers[pos]; pos++) {
drv = fdt_timer_drivers[pos]; drv = fdt_timer_drivers[pos];
noff = -1; noff = -1;

View File

@@ -30,8 +30,7 @@
#include <sbi_utils/serial/semihosting.h> #include <sbi_utils/serial/semihosting.h>
/* List of platform override modules generated at compile time */ /* List of platform override modules generated at compile time */
extern const struct platform_override *platform_override_modules[]; extern const struct platform_override *const platform_override_modules[];
extern unsigned long platform_override_modules_size;
static const struct platform_override *generic_plat = NULL; static const struct platform_override *generic_plat = NULL;
static const struct fdt_match *generic_plat_match = NULL; static const struct fdt_match *generic_plat_match = NULL;
@@ -42,7 +41,7 @@ static void fw_platform_lookup_special(const void *fdt, int root_offset)
const struct fdt_match *match; const struct fdt_match *match;
int pos; int pos;
for (pos = 0; pos < platform_override_modules_size; pos++) { for (pos = 0; platform_override_modules[pos]; pos++) {
plat = platform_override_modules[pos]; plat = platform_override_modules[pos];
if (!plat->match_table) if (!plat->match_table)
continue; continue;

View File

@@ -69,10 +69,9 @@ for VAR in ${VAR_LIST}; do
done done
printf "\n" printf "\n"
printf "%s *%s[] = {\n" "${TYPE_NAME}" "${ARRAY_NAME}" printf "%s *const %s[] = {\n" "${TYPE_NAME}" "${ARRAY_NAME}"
for VAR in ${VAR_LIST}; do for VAR in ${VAR_LIST}; do
printf "\t&%s,\n" "${VAR}" printf "\t&%s,\n" "${VAR}"
done done
printf "};\n\n" printf "\tNULL\n"
printf "};\n"
printf "unsigned long %s_size = sizeof(%s) / sizeof(%s *);\n" "${ARRAY_NAME}" "${ARRAY_NAME}" "${TYPE_NAME}"