aboutsummaryrefslogtreecommitdiff
path: root/gdb/arch
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-02-14 14:41:07 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-02-14 14:41:07 -0500
commit5f661e03972e3412778c0bee8d20522b9bffea76 (patch)
tree287495c0d6f9659408ec5becf385f73387e5cf42 /gdb/arch
parent8084e579e114e607cb65482c43566e2c5c844bf6 (diff)
downloadgdb-5f661e03972e3412778c0bee8d20522b9bffea76.zip
gdb-5f661e03972e3412778c0bee8d20522b9bffea76.tar.gz
gdb-5f661e03972e3412778c0bee8d20522b9bffea76.tar.bz2
gnulib: import count-one-bits module and use it
For a fix I intend to submit, I would need a function that counts the number of set bits in a word. There is __builtin_popcount that is supported by gcc and clang, but there is also a gnulib module that wraps that and provides a fallback for other compilers, so I think it would be good to use it. I also noticed that there is a bitcount function in arch/arm.c, so I thought that as a first step I would replace that one with the gnulib count-one-bits module. This is what this patch does. The gnulib module provides multiple functions, with various parameter length (unsigned int, unsigned long int, unsigned long long int), I chose the one that made sense for each call site based on the argument type. gnulib/ChangeLog: * update-gnulib.sh (IMPORTED_GNULIB_MODULES): Import count-one-bits module. * configure: Re-generate. * aclocal.m4: Re-generate. * Makefile.in: Re-generate. * import/count-one-bits.c: New file. * import/count-one-bits.h: New file. * import/Makefile.am: Re-generate. * import/Makefile.in: Re-generate. * import/m4/gnulib-cache.m4: Re-generate. * import/m4/gnulib-comp.m4: Re-generate. * import/m4/count-one-bits.m4: New file. gdb/ChangeLog: * arm-tdep.c: Include count-one-bits.h. (cleanup_block_store_pc): Use count_one_bits. (cleanup_block_load_pc): Use count_one_bits. (arm_copy_block_xfer): Use count_one_bits. (thumb2_copy_block_xfer): Use count_one_bits. (thumb_copy_pop_pc_16bit): Use count_one_bits. * arch/arm-get-next-pcs.c: Include count-one-bits.h. (thumb_get_next_pcs_raw): Use count_one_bits. (arm_get_next_pcs_raw): Use count_one_bits_l. * arch/arm.c (bitcount): Remove. * arch/arm.h (bitcount): Remove.
Diffstat (limited to 'gdb/arch')
-rw-r--r--gdb/arch/arm-get-next-pcs.c9
-rw-r--r--gdb/arch/arm.c11
-rw-r--r--gdb/arch/arm.h3
3 files changed, 5 insertions, 18 deletions
diff --git a/gdb/arch/arm-get-next-pcs.c b/gdb/arch/arm-get-next-pcs.c
index fc54133..0c49a77 100644
--- a/gdb/arch/arm-get-next-pcs.c
+++ b/gdb/arch/arm-get-next-pcs.c
@@ -22,6 +22,7 @@
#include "gdbsupport/common-regcache.h"
#include "arm.h"
#include "arm-get-next-pcs.h"
+#include "count-one-bits.h"
/* See arm-get-next-pcs.h. */
@@ -408,8 +409,8 @@ thumb_get_next_pcs_raw (struct arm_get_next_pcs *self)
/* Fetch the saved PC from the stack. It's stored above
all of the other registers. */
- unsigned long offset = bitcount (bits (inst1, 0, 7))
- * ARM_INT_REGISTER_SIZE;
+ unsigned long offset
+ = count_one_bits (bits (inst1, 0, 7)) * ARM_INT_REGISTER_SIZE;
sp = regcache_raw_get_unsigned (regcache, ARM_SP_REGNUM);
nextpc = self->ops->read_mem_uint (sp + offset, 4, byte_order);
}
@@ -496,7 +497,7 @@ thumb_get_next_pcs_raw (struct arm_get_next_pcs *self)
/* LDMIA or POP */
if (!bit (inst2, 15))
load_pc = 0;
- offset = bitcount (inst2) * 4 - 4;
+ offset = count_one_bits (inst2) * 4 - 4;
}
else if (!bit (inst1, 7) && bit (inst1, 8))
{
@@ -864,7 +865,7 @@ arm_get_next_pcs_raw (struct arm_get_next_pcs *self)
{
/* up */
unsigned long reglist = bits (this_instr, 0, 14);
- offset = bitcount (reglist) * 4;
+ offset = count_one_bits_l (reglist) * 4;
if (bit (this_instr, 24)) /* pre */
offset += 4;
}
diff --git a/gdb/arch/arm.c b/gdb/arch/arm.c
index 60d9f85..faa2b4f 100644
--- a/gdb/arch/arm.c
+++ b/gdb/arch/arm.c
@@ -42,17 +42,6 @@ thumb_insn_size (unsigned short inst1)
/* See arm.h. */
int
-bitcount (unsigned long val)
-{
- int nbits;
- for (nbits = 0; val != 0; nbits++)
- val &= val - 1; /* Delete rightmost 1-bit in val. */
- return nbits;
-}
-
-/* See arm.h. */
-
-int
condition_true (unsigned long cond, unsigned long status_reg)
{
if (cond == INST_AL || cond == INST_NV)
diff --git a/gdb/arch/arm.h b/gdb/arch/arm.h
index 2d9e87e..b0eb2ae 100644
--- a/gdb/arch/arm.h
+++ b/gdb/arch/arm.h
@@ -160,9 +160,6 @@ int thumb_insn_size (unsigned short inst1);
/* Returns true if the condition evaluates to true. */
int condition_true (unsigned long cond, unsigned long status_reg);
-/* Return number of 1-bits in VAL. */
-int bitcount (unsigned long val);
-
/* Return 1 if THIS_INSTR might change control flow, 0 otherwise. */
int arm_instruction_changes_pc (uint32_t this_instr);