diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-02-14 14:41:07 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-02-14 14:41:07 -0500 |
commit | 5f661e03972e3412778c0bee8d20522b9bffea76 (patch) | |
tree | 287495c0d6f9659408ec5becf385f73387e5cf42 /gdb | |
parent | 8084e579e114e607cb65482c43566e2c5c844bf6 (diff) | |
download | gdb-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')
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/arch/arm-get-next-pcs.c | 9 | ||||
-rw-r--r-- | gdb/arch/arm.c | 11 | ||||
-rw-r--r-- | gdb/arch/arm.h | 3 | ||||
-rw-r--r-- | gdb/arm-tdep.c | 12 |
5 files changed, 26 insertions, 23 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0999ae2..5ef7611 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2020-02-14 Simon Marchi <simon.marchi@efficios.com> + + * 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. + 2020-02-14 Tom Tromey <tromey@adacore.com> * dwarf2/frame-tailcall.c (dwarf2_tailcall_sniffer_first): 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); diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 4efd758..175c5b9 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -45,6 +45,7 @@ #include "target-descriptions.h" #include "user-regs.h" #include "observable.h" +#include "count-one-bits.h" #include "arch/arm.h" #include "arch/arm-get-next-pcs.h" @@ -5798,7 +5799,8 @@ cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs, { uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM); int store_executed = condition_true (dsc->u.block.cond, status); - CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask); + CORE_ADDR pc_stored_at, transferred_regs + = count_one_bits (dsc->u.block.regmask); CORE_ADDR stm_insn_addr; uint32_t pc_val; long offset; @@ -5850,7 +5852,7 @@ cleanup_block_load_pc (struct gdbarch *gdbarch, uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM); int load_executed = condition_true (dsc->u.block.cond, status); unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM; - unsigned int regs_loaded = bitcount (mask); + unsigned int regs_loaded = count_one_bits (mask); unsigned int num_to_shuffle = regs_loaded, clobbered; /* The method employed here will fail if the register list is fully populated @@ -5982,7 +5984,7 @@ arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn, contiguous chunk r0...rX before doing the transfer, then shuffling registers into the correct places in the cleanup routine. */ unsigned int regmask = insn & 0xffff; - unsigned int num_in_list = bitcount (regmask), new_regmask; + unsigned int num_in_list = count_one_bits (regmask), new_regmask; unsigned int i; for (i = 0; i < num_in_list; i++) @@ -6084,7 +6086,7 @@ thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, else { unsigned int regmask = dsc->u.block.regmask; - unsigned int num_in_list = bitcount (regmask), new_regmask; + unsigned int num_in_list = count_one_bits (regmask), new_regmask; unsigned int i; for (i = 0; i < num_in_list; i++) @@ -7102,7 +7104,7 @@ thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1, } else { - unsigned int num_in_list = bitcount (dsc->u.block.regmask); + unsigned int num_in_list = count_one_bits (dsc->u.block.regmask); unsigned int i; unsigned int new_regmask; |