target/register: use an array of uint8_t for register's value
authorAntonio Borneo <borneo.antonio@gmail.com>
Sun, 15 Nov 2020 21:10:58 +0000 (22:10 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 5 Dec 2020 23:18:37 +0000 (23:18 +0000)
The use of 'void *' makes the pointer arithmetic incompatible with
standard C, even if this is allowed by GCC extensions.
The use of 'void *' can also hide incorrect pointer assignments.

Switch to 'uint8_t *' and add GCC warning flag to track any use of
pointer arithmetic extension.

Change-Id: Ic4d15a232834cd6b374330f70e2473a359b1607f
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5937
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
configure.ac
src/target/arc.c
src/target/arm7_9_common.c
src/target/etm.c
src/target/register.h
src/target/riscv/riscv.c
src/target/riscv/riscv.h

index 9cb20ad89eae9b0c3d5826772452c903a14a315c..c8978b94dd484fd99c1847b35c8767e72e591ec5 100644 (file)
@@ -833,6 +833,7 @@ AS_IF([test "x${gcc_wextra}" = "xyes"], [
   GCC_WARNINGS="${GCC_WARNINGS} -Wbad-function-cast"
   GCC_WARNINGS="${GCC_WARNINGS} -Wcast-align"
   GCC_WARNINGS="${GCC_WARNINGS} -Wredundant-decls"
+  GCC_WARNINGS="${GCC_WARNINGS} -Wpointer-arith"
 ])
 AS_IF([test "x${gcc_werror}" = "xyes"], [
   GCC_WARNINGS="${GCC_WARNINGS} -Werror"
index cec6441a563ec332194726d135242a9ab9265092..ffe974532df970cbe301d0b63c4b9f2f96135ff4 100644 (file)
@@ -305,7 +305,7 @@ static int arc_init_reg(struct target *target, struct reg *reg,
        /* Initialize struct reg */
        reg->name = reg_desc->name;
        reg->size = 32; /* All register in ARC are 32-bit */
-       reg->value = &reg_desc->reg_value;
+       reg->value = reg_desc->reg_value;
        reg->type = &arc_reg_type;
        reg->arch_info = reg_desc;
        reg->caller_save = true; /* @todo should be configurable. */
index d992aa78bc62713ec33b9de5f31397e6f4b3a8b8..797f61c9373b400991bc464e9c749321507eab28 100644 (file)
@@ -1393,7 +1393,7 @@ static int arm7_9_full_context(struct target *target)
        struct arm *arm = &arm7_9->arm;
        struct {
                uint32_t value;
-               void *reg_p;
+               uint8_t *reg_p;
        } read_cache[6 * (16 + 1)];
        int read_cache_idx = 0;
 
index 93dbd29488fb5b38169ba35a5e26dd1f128723b0..faa941fed494e7688e559d2fc38151f85f03f6d3 100644 (file)
@@ -279,7 +279,7 @@ static void etm_reg_add(unsigned bcd_vers, struct arm_jtag *jtag_info,
 
                reg->name = r->name;
                reg->size = r->size;
-               reg->value = &ereg->value;
+               reg->value = ereg->value;
                reg->arch_info = ereg;
                reg->type = &etm_scan6_type;
                reg++;
index 1bae81183e77279a5f79b41b336123a0d422db45..5f1c25fb40e9348427eb9847a07a2e7f5f0910ac 100644 (file)
@@ -127,7 +127,7 @@ struct reg {
        bool caller_save;
        /* Pointer to place where the value is stored, in the format understood by
         * the binarybuffer.h functions. */
-       void *value;
+       uint8_t *value;
        /* The stored value needs to be written to the target. */
        bool dirty;
        /* When true, value is valid. */
index 53af07ec31ad97fd5264f55fc1a62014abc578b6..0d1cee1bfa27c244e22c7218d522ca163d643b3c 100644 (file)
@@ -4128,7 +4128,7 @@ int riscv_init_registers(struct target *target)
                reg_name += strlen(reg_name) + 1;
                assert(reg_name < info->reg_names + target->reg_cache->num_regs *
                                max_reg_name_len);
-               r->value = &info->reg_cache_values[number];
+               r->value = info->reg_cache_values[number];
        }
 
        return ERROR_OK;
index 7e74cf730496c190a672ab2f9e05060f70418be3..d943134e23e46b72f461a46ae8743ba0ec8352aa 100644 (file)
@@ -68,8 +68,8 @@ typedef struct {
 
        /* OpenOCD's register cache points into here. This is not per-hart because
         * we just invalidate the entire cache when we change which hart is
-        * selected. */
-       uint64_t reg_cache_values[RISCV_MAX_REGISTERS];
+        * selected. Use an array of 8 uint8_t per register. */
+       uint8_t reg_cache_values[RISCV_MAX_REGISTERS][8];
 
        /* Single buffer that contains all register names, instead of calling
         * malloc for each register. Needs to be freed when reg_list is freed. */