Nelson Chu [Mon, 10 May 2021 05:38:23 +0000 (13:38 +0800)]
RISC-V/zfh: Added big endian testcase for .float16 directive.
gas/
* testsuite/gas/riscv/extended/extended.exp: Updated.
* testsuite/gas/riscv/extended/float16.s: Minor fix for sNaNh.
* testsuite/gas/riscv/extended/float16-le.d: Updated and renamed
from float16.d.
* testsuite/gas/riscv/extended/float16-be.d: New testcase.
Nelson Chu [Tue, 21 Apr 2020 06:42:20 +0000 (14:42 +0800)]
RISC-V/zfh: Support .float16 directive for assembler.
This probably need to be sent to mainline rather than here.
gas/
* config/tc-riscv.c (FLT_CHARS): Added h and H.
(riscv_pseudo_table): Added .float16.
* read.c (hex_float): Handle case 'h' and 'H'.
* testsuite/gas/riscv/extended/extended.exp: Updated.
* testsuite/gas/riscv/extended/float16.d: New testcase.
* testsuite/gas/riscv/extended/float16.s: Likewise.
Nelson Chu [Fri, 19 Mar 2021 09:19:11 +0000 (17:19 +0800)]
RISC-V/rvv: Add rvv v0.10 instructions.
2021-03-30 Jim Wilson <jimw@sifive.com>
Kito Cheng <kito.cheng@sifive.com>
Nelson Chu <nelson.chu@sifive.com>
This patch is porting from the following riscv github,
https://github.com/riscv/riscv-binutils-gdb/tree/rvv-1.0.x
And here is the vector draft spec,
https://github.com/riscv/riscv-v-spec
The match_func in opcodes/riscv-opc.c have many purposes. One of them is
checking the instruction constraints. But we got the request before that
the assembler constraint checkings break some hardware exception testcases,
which are written by assmebly code. Therefore, we add new assembler options
and .option directives to let users can disable/enable the rvv constraints.
For now the constraints are disabled by default, but should we default
enable them for safety? Besides, the match_func will return different
error constriant messages, so that we can report the details to users.
This should be more user-friendly.
bfd/
* elfxx-riscv.c (riscv_std_draft_ext_strtab): Added zvamo and zvlsseg.
gas/
* config/tc-riscv.c (enum DRAFT_EXT): Added.
(enum riscv_extended_csr_class): Added CSR_CLASS_V for rvv CSRs.
(enum reg_extended_class): Added vector registers.
(op_draft_hash): Added draft hash table for rvv.
(md_begin): Init op_draft_hash and register hash for rvv.
(extended_ext_version_table): Added default versions of rvv to v0.10.
(riscv_extended_subset_supports): Handle INSN_CLASS_V*.
(riscv_extended_csr_class_check): Handle CSR_CLASS_V.
(validate_riscv_extended_insn): Check if the rvv instructions are valid.
(riscv_find_extended_opcode_hash): Search instruction opcode from
op_draft_hash.
(vector_macro): Call macro_build to expand rvv macros into instructions.
(extended_macro_build): Handle rvv operands for macro_build.
(extended_macro): Handle M_VMSGE and M_VMSGEU.
(my_getVsetvliExpression): Similar to my_getVsetvliExpression, but used
for parsing vsetvli operands.
(riscv_parse_extended_operands): Handle rvv operands. Pass ®no from
riscv_ip, otherwise we will get fail when parsing Vf operand for AMO VS3.
(riscv_ip): Add two new arguments to match_func, check_constraints and
&error. We can disbale the match_func check by setting check_constraints
to zero; The part of match_func will set different error messages to the
&error, and them we can report more details to users.
(riscv_set_options, riscv_opts, s_riscv_option): Add .option
checkconstraints and nocheckconstraints, to enable/disable the
match_func constraints checking. Disable it by default.
(enum options, md_longopts, md_parse_option): Add assembler options
m[no-]check-constraints.
* testsuite/gas/riscv/extended/extended.exp: Updated.
* testsuite/gas/riscv/extended/extended-csr.d: New testcase for rvv CSRs.
* testsuite/gas/riscv/extended/extended-csr.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-fixp.d:
New testcase for rvv constriants.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-fixp.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-fixp.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-floatp.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-floatp.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-floatp.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-int.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-int.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-int.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-narrow.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-narrow.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-narrow.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-widen.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-widen.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-arith-widen.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-load-store.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-load-store.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-load-store.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-mask.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-mask.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-mask.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-permutation.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-permutation.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-permutation.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvamo.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvamo.l: Likewise.
* testsuite/gas/riscv/extended/vector-insns-fail-zvamo.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-vmsgtvx.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-vmsgtvx.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns-zero-imm.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns-zero-imm.s: Likewise.
* testsuite/gas/riscv/extended/vector-insns.d: Likewise.
* testsuite/gas/riscv/extended/vector-insns.s: Likewise.
include/
* opcode/riscv-opc-extended.h: Added rvv encoding macros and CSRs.
* opcode/riscv.h: Added rvv immediate encodings and fields.
(struct riscv_opcode): Updated match_func.
(enum riscv_extended_insn_class): Added INSN_CLASS_V*.
(enum M_VMSGE, M_VMSGEU): Added.
opcodes/
* riscv-dis.c (print_extended_insn_args): Handle rvv operands.
(riscv_disassemble_opcode): Updated match_func.
* riscv-opc.c (match_*): Updated since two new parameters.
(riscv_vecr_names_numeric): Added rvv register names.
(riscv_vecm_names_numeric): Added rvv mask register name.
(riscv_vsew, riscv_vlmul, riscv_vta, riscv_vma): Added for vsetvli.
(MASK_VD, MASK_VS1, MASK_VS2, MASK_VMASK): Added for rvv match_func.
(match_vs1_eq_vs2, match_vs1_eq_vs2_neq_vm, match_vd_eq_vs1_eq_vs2):
Added to check special register usage, cannot be disabled.
(match_widen_vd_neq_vs1_neq_vs2_neq_vm): The rvv constraint check,
can be disabled/enabled by m[no-]check-constraints or .option
[no]checkconstraints.
(match_widen_vd_neq_vs1_neq_vm): Likewise.
(match_widen_vd_neq_vs2_neq_vm): Likewise.
(match_widen_vd_neq_vm): Likewise.
(match_narrow_vd_neq_vs2_neq_vm): Likewise.
(match_vd_neq_vs1_neq_vs2): Likewise.
(match_vd_neq_vs1_neq_vs2_neq_vm): Likewise.
(match_vd_neq_vs2_neq_vm): Likewise.
(match_vd_neq_vm): Likewise.
(match_vls_nf_rv): Likewise.
(match_vmv_nf_rv): Likewise.
(riscv_draft_opcodes): Added rvv v0.10 instructions.
(riscv_extended_opcodes): Updated.
Nelson Chu [Tue, 16 Mar 2021 09:23:23 +0000 (17:23 +0800)]
RISC-V/extended: Add assembler and dis-assembler hooks for extended extensions.
To keep the original functions clean, we try to provide assembler
and dis-assembler hooks as enough as possible for extended extensions.
We probably need to add more once they are not enough in the future.
However, there are several changes that might need to be discussed
as follows,
* Change the type of enums to int directly, to extend them for
extended extensions. Not sure if the change is good enough, but
it should be the easiler way to extend enums.
* The extended operands should be parsed in the extended hooks,
validate_riscv_extended_insn and riscv_parse_extended_operands.
Obviously, we may need to reparse the opernad string in the extended
hooks, when the original functions cannot recognize them. But the
original functions have already pointed the parsed poniter to the
next characters. Therefore, we should use a new pointer, opargStart,
to record the position before parsing, and then pass it to the hooks
when we need to reparse the extended operands.
* Part of the "internal: unknown" errors are reported in the extended
hooks rather than the original functions. For example, we used to
report the "internal: unreachable" in the riscv_multi_subset_supports,
to tell developers that they forgot to handle the new defined INSN_CLASS_.
And the function returns TRUE/FALSE if the instruction is allowed or not
according to the architecture string. The riscv_extended_subset_supports
is the extended hook of riscv_multi_subset_supports, so it also returns
a bfd_boolean to check the same thing. But it is hard to know if the
INSN_CLASS_ is unknown from the same returned bfd_boolean, unless we add
another new flag, or we just move the error report to the hook directly.
I choose the latter for now, but it may cause the code of mainline and
integration branches are inconsistent, which may affect the difficulty
of the regular merge between these two branches.
The same inconsistent problem also happens in riscv_parse_extended_operands.
The hook only parse an operand rather than all, so it just has a switch
without a for loop. We used to set "continue" to skip the loop in the
switch, but the extended hook doesn't need the "continue". Perhaps we
should use a single while/for in the hooks to keep the code consistent,
then the regular merge may be more easiler.
* Rename the variables to the more meaningful names in the riscv_ip,
validate_riscv_insn and print_insn_args.
- oparg: Renamed from args, means the arguments in the opcode table.
- opargStart: Added to record the start of the argument.
- asarg: Renamed from s, means the arguments of assembly string.
- asargStart: Renamed from argsStart.
* Extract the part that parsing the instruction opcode from the
riscv_disassemble_insn, since we will need to call it for many times
to search multiple opcode tables.
bfd/
* elfxx-riscv.c (riscv_std_draft_ext_strtab): Added for draft extensions.
(riscv_valid_prefixed_ext): Check whether the draft extension is defined.
gas/
* config/tc-riscv.c (enum EXTENDED_EXT_NUM): Added to choose the
right extended opcode hashes in the riscv_find_extended_opcode_hash.
(enum riscv_csr_class): Added CSR_CLASS_EXTENDED.
(enum reg_class): Added RCLASS_EXTENDED_NUM.
(enum reg_extended_class): Added to define extended registers.
(struct riscv_csr_extra): Changed enum riscv_csr_class to int,
to increase the expandability of enum.
(riscv_init_csr_hash): Likewise.
(extended_ext_version_table): Record default versions for
extended extensions.
(extended_ext_version_hash): Handle of the extended extensions
with version hash table.
(riscv_search_ext_version_hash): Handle more than one
ext_version_hash hashes.
(riscv_find_opcode_hash): Handle more than one opcode hashes.
(md_begin): Included riscv-opc-extended.h to define extended CSR.
(init_ext_version_hash): Updated.
(riscv_get_default_ext_version): Likewise.
(md_assemble): Likewise.
(s_riscv_insn): Likewsie.
(riscv_after_parse_args): Likewise.
(riscv_find_extended_opcode_hash): Extended hook for riscv_find_opcode_hash.
(riscv_extended_subset_supports): Extended hook for
riscv_multi_subset_supports.
(riscv_extended_csr_class_check): Extended hook for riscv_csr_address,
to check the CSR ISA dependency.
(extended_macro): Extended hook for macro.
(validate_riscv_extended_insn): Extended hook for validate_riscv_insn.
(extended_macro_build): Extended hook for macro_build.
(riscv_parse_extended_operands): Extended hook for riscv_ip.
(riscv_multi_subset_supports): Updated to call extended hook.
(riscv_csr_address): Likewise
(macro): Likewise.
(validate_riscv_insn): Likewise. Also define new variables, xxx
and xxxStart, in case single letters are not enough to represent
all extended operands.
(macro_build): Likewise.
(riscv_ip): Likewise. The asarg means assembly operand string,
and oparg means operand string defined in the opcode table.
* testsuite/gas/riscv/extended/extended.exp: New file to run
extended testcases.
include/
* opcode/riscv-opc-extended.h: New file to define encoding macros
and CSR for extended extensions.
* opcode/riscv.h: Included riscv-opc-extended.h.
(enum riscv_insn_class): Added INSN_CLASS_EXTENDED.
(struct riscv_opcode): Same as struct riscv_csr_extra.
(enum M_EXTENDED): Added to support extended pseudo macros.
opcode/
* riscv-dis.c (print_extended_insn_args): Extended hook for
print_insn_args.
(print_insn_args): Updated to call extended hook, and same as
what validate_riscv_insn does. Also include riscv-opc-extended.h
to show extended CSR correctly.
* riscv-opc.c (riscv_extended_opcodes): Added to store all
supported extended instruction opcodes.
Michael Matz [Mon, 28 Jun 2021 15:57:17 +0000 (17:57 +0200)]
elf/riscv: Fix relaxation with aliases [PR28021]
the fix for PR22756 only changed behaviour for hidden aliases,
but the same situation exists for non-hidden aliases: sym_hashes[]
can contain multiple entries pointing to the same symbol structure
leading to relaxation adjustment to be applied twice.
Fix this by testing for duplicates for everything that looks like it
has a version.
PR ld/28021
bfd/
* elfnn-riscv.c (riscv_relax_delete_bytes): Check for any
versioning.
ld/
* testsuite/ld-riscv-elf/relax-twice.ver: New.
* testsuite/ld-riscv-elf/relax-twice-1.s: New.
* testsuite/ld-riscv-elf/relax-twice-2.s: New.
* testsuite/ld-riscv-elf/ld-riscv-elf.exp
(run_relax_twice_test): New, and call it.
H.J. Lu [Wed, 7 Jul 2021 14:47:00 +0000 (07:47 -0700)]
ld: Check archive only for archive member
Since plugin_maybe_claim calls bfd_close on the original input BFD if it
isn't an archive member, pass NULL to bfd_plugin_close_file_descriptor
to indicate that the BFD isn't an archive member.
bfd/
PR ld/18028
* plugin.c (bfd_plugin_close_file_descriptor): Check archive
only of abfd != NULL.
(try_claim): Pass NULL to bfd_plugin_close_file_descriptor if
it isn't an archive member.
ld/
PR ld/18028
* plugin.c (plugin_input_file): Add comments for abfd and ibfd.
(plugin_object_p): Set input->ibfd to NULL if it isn't an
archive member.
gprof fails to compile on Solaris 10 and 11.3 with --disable-nls:
In file included from /vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/gprof.h:33,
from /vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/basic_blocks.c:24:
/usr/include/libintl.h:45:14: error: expected identifier or '(' before 'const'
45 | extern char *dcgettext(const char *, const char *, const int);
| ^~~~~~~~~
/usr/include/libintl.h:46:14: error: expected identifier or '(' before 'const'
46 | extern char *dgettext(const char *, const char *);
| ^~~~~~~~
/usr/include/libintl.h:47:14: error: expected identifier or '(' before 'const'
47 | extern char *gettext(const char *);
| ^~~~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:165:33:
error: expected identifier or '(' before 'do'
165 | # define textdomain(Domainname) do {} while (0)
| ^~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:165:39:
error: expected identifier or '(' before 'while'
165 | # define textdomain(Domainname) do {} while (0)
| ^~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:166:46:
error: expected identifier or '(' before 'do'
166 | # define bindtextdomain(Domainname, Dirname) do {} while (0)
| ^~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:166:52:
error: expected identifier or '(' before 'while'
166 | # define bindtextdomain(Domainname, Dirname) do {} while (0)
| ^~~~~
/usr/include/libintl.h:55:14: error: expected identifier or '(' before 'unsigned'
55 | extern char *dcngettext(const char *, const char *,
| ^~~~~~~~~~
/usr/include/libintl.h:57:14: error: expected identifier or '(' before 'unsigned'
57 | extern char *dngettext(const char *, const char *,
| ^~~~~~~~~
/usr/include/libintl.h:59:14: error: expected identifier or '(' before 'unsigned'
59 | extern char *ngettext(const char *, const char *, unsigned long int);
| ^~~~~~~~
This is a known issue already partially fixed in binutils/sysdep.h. For
gprof, the same fix needs to be applied in bfd/sysdep.h, as the
following patch does. Tested on i386-pc-solaris2.10 and
i386-pc-solaris2.11.
Check for strnlen declaration to fix Solaris 10 build
binutils currently fails to compile on Solaris 10:
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c: In function 'bfd_get_debug_link_info_1':
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1231:16: error: implicit declaration of function 'strnlen' [-Werror=implicit-function-declaration]
1231 | crc_offset = strnlen (name, size) + 1;
| ^~~~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1231:16: error: incompatible implicit declaration of built-in function 'strnlen' [-Werror]
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c: In function 'bfd_get_alt_debug_link_info':
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1319:20: error: incompatible implicit declaration of built-in function 'strnlen' [-Werror]
1319 | buildid_offset = strnlen (name, size) + 1;
| ^~~~~~~
and in a couple of other places. The platform lacks strnlen, and while
libiberty.h can provide a fallback declaration, the necessary configure
test isn't run.
Fixed with the following patch. Tested on i386-pc-solaris2.10.
H.J. Lu [Mon, 5 Jul 2021 15:54:54 +0000 (08:54 -0700)]
ld: Cache and reuse the IR archive file descriptor
Linker plugin_object_p opens the IR archive for each IR archive member.
For GCC plugin, plugin_object_p closes the archive file descriptor. But
for LLVM plugin, the archive file descriptor remains open. If there are
3000 IR archive members, there are 3000 file descriptors for them. We
can run out of file descriptors petty easily.
1. Add archive_plugin_fd and archive_plugin_fd_open_count to bfd so that
we can cache and reuse the IR archive file descriptor for all IR archive
members in the archive.
2. Add bfd_plugin_close_file_descriptor to properly close the IR archive
file descriptor.
bfd/
PR ld/28040
* archive.c (_bfd_archive_close_and_cleanup): Close the archive
plugin file descriptor if needed.
* bfd.c (bfd): Add archive_plugin_fd and
archive_plugin_fd_open_count.
* opncls.c (_bfd_new_bfd): Initialize to -1.
* plugin.c (bfd_plugin_open_input): Cache and reuse the archive
plugin file descriptor.
(bfd_plugin_close_file_descriptor): New function.
(try_claim): Call bfd_plugin_close_file_descriptor.
* plugin.h (bfd_plugin_close_file_descriptor): New.
* bfd-in2.h: Regenerated.
ld/
PR ld/28040
* plugin.c (plugin_input_file): Add ibfd.
(release_plugin_file_descriptor): New function.
(release_input_file): Call release_plugin_file_descriptor to
close input->fd.
(plugin_object_p): Call release_plugin_file_descriptor to close
input->fd. Also call release_plugin_file_descriptor if not
claimed.
* testsuite/config/default.exp (RANLIB): New.
* testsuite/ld-plugin/lto.exp: Run ranlib test.
Pedro Alves [Fri, 4 Jun 2021 16:12:41 +0000 (17:12 +0100)]
Document TUI improvements in the manual & NEWS
gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <pedro@palves.net>
Hannes Domani <ssbssa@yahoo.de>
* NEWS: Add new "TUI Improvements" section and mention mouse
support and that unrecognized special keys are now passed to
GDB. Mention Python Window.click in the Python improvements
section.
gdb/doc/ChangeLog:
yyyy-mm-dd Pedro Alves <pedro@palves.net>
* gdb.texinfo (TUI): <TUI Mouse Support>: New node/section.
Co-Authored-By: Hannes Domani <ssbssa@yahoo.de>
Change-Id: I0d79a795d8ac561fd28cdc5184bff029ba28bc64
Alan Modra [Fri, 2 Jul 2021 07:57:31 +0000 (17:27 +0930)]
Re: Fix minor NDS32 renaming snafu
Some extern declarations differ in constnes to their definitions too.
Let's make sure this sort of thing doesn't happen again, but putting
the externs in a header where they belong.
gas/
* config/tc-nds32.c (nds32_keyword_gpr): Don't declare.
(md_begin): Constify k.
opcodes/
* nds32-dis.c (nds32_find_reg_keyword): Constify arg and return.
(nds32_parse_audio_ext, nds32_parse_opcode): Constify psys_reg.
(nds32_field_table, nds32_opcode_table, nds32_keyword_table),
(nds32_opcodes, nds32_operand_fields, nds32_keywords),
(nds32_keyword_gpr): Move declarations to..
* nds32-asm.h: ..here, constifying to match definitions.
Mike Frysinger [Thu, 1 Jul 2021 04:28:10 +0000 (00:28 -0400)]
sim: m32r: unify ELF & Linux traps logic
This makes the simulator work the same regardless of the target (bare
metal m32r-elf or Linux m32r-linux-gnu) by unifying the traps code.
It was mostly already the same with the only difference being support
for trap #2 reserved for Linux syscalls. We can move that logic to
runtime by checking the current environment operating mode instead.
Mike Frysinger [Thu, 1 Jul 2021 04:17:38 +0000 (00:17 -0400)]
sim: m32r: replace custom endian helpers with sim-endian
This improves the logic a bit by making the host<->target translations
a bit more clear. The structs still bleed way too much between the two
worlds, but let's fix one thing at a time.
Mike Frysinger [Thu, 1 Jul 2021 00:30:43 +0000 (20:30 -0400)]
sim: m32r: fix virtual environment with Linux targets
We don't want to handle Linux syscalls when in the virtual environment,
just the user environment, so adjust the Linux traps logic to check for
that specifically (instead of just skipping the operating environment).
Also tweak some testcases to explicitly specify the environment they run
under rather than relying on the default matching their needs. This gets
the tests passing for all m32r targets.
Mike Frysinger [Wed, 30 Jun 2021 22:39:17 +0000 (18:39 -0400)]
sim: m32r: namespace Linux syscall table
The use of __NR_ defines in here conflicts a lot with the standard
host syscalls, sometimes leading to build errors (when the numbers
happen to be the same we get duplicate case handlers), and other
times leading to misbehavior (where the m32r syscall # is not what
is actually checked).
Namespace these using the standard that we already use: change the
__NR_ to TARGET_LINUX_SYS_ with a simple `sed`.
Also add a few missing includes so the code at least compiles.
Mike Frysinger [Tue, 29 Jun 2021 01:26:48 +0000 (21:26 -0400)]
cgen: split GUILE setting out
This makes it easier to override to point to an older version of guile.
The current cgen code doesn't work with guile-2, so need to point to an
older guile-1.8.
Mike Frysinger [Sun, 27 Jun 2021 06:14:29 +0000 (02:14 -0400)]
opcodes: cleanup nds32 variables
For the variables that don't need to be exported, mark them static.
For the ones shared between modules, add a "nds32_" prefix to avoid
collisions with these common variable names.
Mike Frysinger [Sun, 27 Jun 2021 05:55:50 +0000 (01:55 -0400)]
opcodes: constify & scope microblaze opcodes
This is exporting the variable "opcodes" as a large writable blob.
This is not a namespace friendly name, so add a "microblaze" prefix,
and then sprinkle const over its definition & use.
Pedro Alves [Fri, 11 Jun 2021 16:56:32 +0000 (17:56 +0100)]
Linux: Access memory even if threads are running
Currently, on GNU/Linux, if you try to access memory and you have a
running thread selected, GDB fails the memory accesses, like:
(gdb) c&
Continuing.
(gdb) p global_var
Cannot access memory at address 0x555555558010
Or:
(gdb) b main
Breakpoint 2 at 0x55555555524d: file access-mem-running.c, line 59.
Warning:
Cannot insert breakpoint 2.
Cannot access memory at address 0x55555555524d
This patch removes this limitation. It teaches the native Linux
target to read/write memory even if the target is running. And it
does this without temporarily stopping threads. We now get:
(gdb) c&
Continuing.
(gdb) p global_var
$1 = 123
(gdb) b main
Breakpoint 2 at 0x555555555259: file access-mem-running.c, line 62.
(The scenarios above work correctly with current GDBserver, because
GDBserver temporarily stops all threads in the process whenever GDB
wants to access memory (see prepare_to_access_memory /
done_accessing_memory). Freezing the whole process makes sense when
we need to be sure that we have a consistent view of memory and don't
race with the inferior changing it at the same time as GDB is
accessing it. But I think that's a too-heavy hammer for the default
behavior. I think that ideally, whether to stop all threads or not
should be policy decided by gdb core, probably best implemented by
exposing something like gdbserver's prepare_to_access_memory /
done_accessing_memory to gdb core.)
Currently, if we're accessing (reading/writing) just a few bytes, then
the Linux native backend does not try accessing memory via
/proc/<pid>/mem and goes straight to ptrace
PTRACE_PEEKTEXT/PTRACE_POKETEXT. However, ptrace always fails when
the ptracee is running. So the first step is to prefer
/proc/<pid>/mem even for small accesses. Without further changes
however, that may cause a performance regression, due to constantly
opening and closing /proc/<pid>/mem for each memory access. So the
next step is to keep the /proc/<pid>/mem file open across memory
accesses. If we have this, then it doesn't make sense anymore to even
have the ptrace fallback, so the patch disables it.
I've made it such that GDB only ever has one /proc/<pid>/mem file open
at any time. As long as a memory access hits the same inferior
process as the previous access, then we reuse the previously open
file. If however, we access memory of a different process, then we
close the previous file and open a new one for the new process.
If we wanted, we could keep one /proc/<pid>/mem file open per
inferior, and never close them (unless the inferior exits or execs).
However, having seen bfd patches recently about hitting too many open
file descriptors, I kept the logic to have only one file open tops.
Also, we need to handle memory accesses for processes for which we
don't have an inferior object, for when we need to detach a
fork-child, and we'd probaly want to handle caching the open file for
that scenario (no inferior for process) too, which would probably end
up meaning caching for last non-inferior process, which is very much
what I'm proposing anyhow. So always having one file open likely ends
up a smaller patch.
The next step is handling the case of GDB reading/writing memory
through a thread that is running and exits. The access should not
result in a user-visible failure if the inferior/process is still
alive.
Once we manage to open a /proc/<lwpid>/mem file, then that file is
usable for memory accesses even if the corresponding lwp exits and is
reaped. I double checked that trying to open the same
/proc/<lwpid>/mem path again fails because the lwp is really gone so
there's no /proc/<lwpid>/ entry on the filesystem anymore, but the
previously open file remains usable. It's only when the whole process
execs that we need to reopen a new file.
When the kernel destroys the whole address space, i.e., when the
process exits or execs, the reads/writes fail with 0 aka EOF, in which
case there's nothing else to do than returning a memory access
failure. Note this means that when we get an exec event, we need to
reopen the file, to access the process's new address space.
If we need to open (or reopen) the /proc/<pid>/mem file, and the LWP
we're opening it for exits before we open it and before we reap the
LWP (i.e., the LWP is zombie), the open fails with EACCES. The patch
handles this by just looking for another thread until it finds one
that we can open a /proc/<pid>/mem successfully for.
If we need to open (or reopen) the /proc/<pid>/mem file, and the LWP
we're opening has exited and we already reaped it, which is the case
if the selected thread is in THREAD_EXIT state, the open fails with
ENOENT. The patch handles this the same way as a zombie race
(EACCES), instead of checking upfront whether we're accessing a
known-exited thread, because that would result in more complicated
code, because we also need to handle accessing lwps that are not
listed in the core thread list, and it's the core thread list that
records the THREAD_EXIT state.
The patch includes two testcases:
#1 - gdb.base/access-mem-running.exp
This is the conceptually simplest - it is single-threaded, and has
GDB read and write memory while the program is running. It also
tests setting a breakpoint while the program is running, and checks
that the breakpoint is hit immediately.
This one is more elaborate, as it continuously spawns short-lived
threads in order to exercise accessing memory just while threads are
exiting. It also spawns two different processes and alternates
accessing memory between the two processes to exercise the reopening
the /proc file frequently. This also ends up exercising GDB reading
from an exited thread frequently. I confirmed by putting abort()
calls in the EACCES/ENOENT paths added by the patch that we do hit
all of them frequently with the testcase. It also exits the
process's main thread (i.e., the main thread becomes zombie), to
make sure accessing memory in such a corner-case scenario works now
and in the future.
The tests fail on GNU/Linux native before the code changes, and pass
after. They pass against current GDBserver, again because GDBserver
supports memory access even if all threads are running, by
transparently pausing the whole process.
gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <pedro@palves.net>
PR mi/15729
PR gdb/13463
* linux-nat.c (linux_nat_target::detach): Close the
/proc/<pid>/mem file if it was open for this process.
(linux_handle_extended_wait) <PTRACE_EVENT_EXEC>: Close the
/proc/<pid>/mem file if it was open for this process.
(linux_nat_target::mourn_inferior): Close the /proc/<pid>/mem file
if it was open for this process.
(linux_nat_target::xfer_partial): Adjust. Do not fall back to
inf_ptrace_target::xfer_partial for memory accesses.
(last_proc_mem_file): New.
(maybe_close_proc_mem_file): New.
(linux_proc_xfer_memory_partial_pid): New, with bits factored out
from linux_proc_xfer_partial.
(linux_proc_xfer_partial): Delete.
(linux_proc_xfer_memory_partial): New.
gdb/testsuite/ChangeLog
yyyy-mm-dd Pedro Alves <pedro@palves.net>
Andrei Homescu [Thu, 1 Jul 2021 11:01:55 +0000 (12:01 +0100)]
readelf: Reset file position to beginning for thin archive members
* readelf.c (process_archive): Reset file position to the
beginning when calling process_object for thin archive members.
* testsuite/binutils-all/readelf.exp: Add test.
* testsuite/binutils-all/readelf.h.thin: New file.
arm: don't treat XScale features as part of the FPU [PR 28031]
Although the XScale and its iwMMX extensions are implemented in the
Arm co-processor space, they are not considered to be part of the FPU
specification. In particular, they cannot be enabled or disabled via
a .fpu directive. It's therefore incorrect to strip these properties
when a new .fpu directive is encountered.
Note that the legacy Maverick co-processor is considered to be a FPU
and it is possible to control this via the .fpu directive.
Mike Frysinger [Wed, 30 Jun 2021 02:06:30 +0000 (22:06 -0400)]
sim: ppc: unify (most) compiler warnings with common code
Copy most of the common build warning logic over from the common
code to help keep code behavior a bit consistent, and turn them
on by default. We disable a few flags for now until we can clean
the code up.
Mike Frysinger [Wed, 30 Jun 2021 17:01:17 +0000 (13:01 -0400)]
sim: cris/frv/iq2000/lm32: merge with common configure script
Now that the scache logic has been migrated into the common code,
there's nothing specific in these configure scripts, so merge them
into the common one.
The frv unique logic can be moved to a dedicated include and merged
in the common configure since the flag has been scoped to the arch.
Mike Frysinger [Tue, 29 Jun 2021 02:39:16 +0000 (22:39 -0400)]
sim: unify scache settings
The cgen scache module is enabled by every cgen port, and with the
same default value of 16k (which matches the common default value).
Let's pull this option out of the individual ports (via CPPFLAGS)
and into the common code (via config.h).
The object itself is compiled only for cgen ports atm, so that part
doesn't change. The scache code is initialized dynamically via the
modules.c logic. That's why the profile code needs an additional
CGEN_ARCH check.
This will allow us to collapse arch configure files more. Merging
the source files will require more future work, but integrating the
cgen & non-cgen worlds itself will take a lot.
Mike Frysinger [Tue, 29 Jun 2021 02:10:28 +0000 (22:10 -0400)]
sim: delete unused model settings
These were never fully migrated from the psim to common code, and since
we've finished moving the logic into the runtime sim state, we won't ever
need these. So punt them.
Mike Frysinger [Tue, 29 Jun 2021 02:07:44 +0000 (22:07 -0400)]
sim: move default model to the runtime sim state
This kills off another compile-time option by moving the setting to
the individual arch runtimes. This will allow dynamic selection by
the arch when doing a single build with multiple arches.
The sim_model_init rework is a little funky. In the past it was
disabled entirely if no default model was set. We maintain the
spirit of the logic by gating the fallback logic on whether the
port has defined any models.
Mike Frysinger [Tue, 29 Jun 2021 01:42:56 +0000 (21:42 -0400)]
sim: namespace sim_machs
We want to do a single build with all arches in one binary which means
we need to namespace sim_machs on a per-arch basis. Move it from a
global variable to the sim description structure so it can be setup at
runtime.
Changing the SIM_MODEL->num from an enum to an int is unfortunate, but
we specifically don't want to maintain a centralized list anymore, and
this was never used directly in common code, just passed to per-arch
callbacks.
Mike Frysinger [Wed, 30 Jun 2021 00:44:55 +0000 (20:44 -0400)]
sim: fix arch Makefile regen when unified
The $(arch) variable is only setup for cgen ports, so calculate this
value dynamically. We also need to generate multiple inputs in order
to properly recreate the subdir Makefile, so list them all.
Mike Frysinger [Wed, 30 Jun 2021 00:33:14 +0000 (20:33 -0400)]
sim: use -Wno-error=maybe-uninitialized
We have some code tripping this warning, but it depends on the gcc
version & optimization levels. We've added some hints to the code
so some versions of gcc work better, but still not all. Let's just
disable the warning like gdb does.
Simon Marchi [Tue, 29 Jun 2021 16:05:14 +0000 (12:05 -0400)]
gdb: introduce FRAME_SCOPED_DEBUG_ENTER_EXIT
Introduce FRAME_SCOPED_DEBUG_ENTER_EXIT and use it to print enter/exit
messages in important frame-related functions. I think this helps
understand which lower-level operations are done as part of which
higher-level operation. And it helps visually skip over a higher-level
operation you are not interested in.
Here's an example, combined with some py-unwind messages:
Simon Marchi [Tue, 29 Jun 2021 16:05:03 +0000 (12:05 -0400)]
gdb: add names to unwinders, add debug messages when looking for unwinder
I wrote this while debugging a problem where the expected unwinder for a
frame wasn't used. It adds messages to show which unwinders are
considered for a frame, why they are not selected (if an exception is
thrown), and finally which unwinder is selected in the end.
To be able to show a meaningful, human-readable name for the unwinders,
add a "name" field to struct frame_unwind, and update all instances to
include a name.
Here's an example of the output:
[frame] frame_unwind_find_by_frame: this_frame=0
[frame] frame_unwind_try_unwinder: trying unwinder "dummy"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "dwarf2 tailcall"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "inline"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "jit"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "python"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "amd64 epilogue"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "i386 epilogue"
[frame] frame_unwind_try_unwinder: no
[frame] frame_unwind_try_unwinder: trying unwinder "dwarf2"
[frame] frame_unwind_try_unwinder: yes
gdb/ChangeLog:
* frame-unwind.h (struct frame_unwind) <name>: New. Update
instances everywhere to include this field.
* frame-unwind.c (frame_unwind_try_unwinder,
frame_unwind_find_by_frame): Add debug messages.
Simon Marchi [Tue, 29 Jun 2021 16:03:50 +0000 (12:03 -0400)]
gdb: introduce frame_debug_printf
Introduce frame_debug_printf, to convert the "frame" debug messages to
the new system. Replace fprint_frame with a frame_info::to_string
method that returns a string, like what was done with
frame_id::to_string. This makes it easier to use with
frame_debug_printf.
gdb/ChangeLog:
* frame.h (frame_debug_printf): New.
* frame.c: Use frame_debug_printf throughout when printing frame
debug messages.
* amd64-windows-tdep.c: Likewise.
* value.c: Likewise.
/* Search function to lookup a (non-exited) thread by 'ptid'. Only
searches in threads of INF. */
extern struct thread_info *find_thread_ptid (inferior *inf, ptid_t ptid);
Retain the former, remove the latter. Tested by rebuilding.
gdb/ChangeLog:
2021-06-29 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdbthread.h (find_thread_ptid): Remove the duplicate declaration.
Mike Frysinger [Mon, 28 Jun 2021 03:21:26 +0000 (23:21 -0400)]
sim: callback: add printf attributes
This helps these funcs get printf format checking coverage.
The sim-io.c hack as a result is a bit unfortunate, but the compiler
throws warnings when printing with empty strings. In this one case,
we actually want that due to the side-effect of the callback halting
execution for us.
Mike Frysinger [Mon, 28 Jun 2021 03:19:06 +0000 (23:19 -0400)]
sim: callback: drop unused printf helpers
These cover functions aren't used anywhere, so drop them. There was
one caller, but it's old DOS code that most likely hasn't been tested
in years, so just delete that too.
Simon Marchi [Mon, 28 Jun 2021 19:28:49 +0000 (15:28 -0400)]
gdb: use gdb_bfd_count_sections in macho_symfile_offsets
When loading a mach-o (macOS) executable and trying to set a breakpoint,
a GDB built with ASan or -D_GLIBCXX_DEBUG will crash with an
out-of-bound vector access. This can be reproduced on Linux using the
repro files in bug 28017 [1]:
Error: attempt to subscript container with out-of-bounds index 13, but
container only holds 13 elements.
Objects involved in the operation:
sequence "this" @ 0x0x61300000a590 {
type = std::__debug::vector<unsigned long, std::allocator<unsigned long> >;
}
The out-of-bound access happens here:
#0 0x00007ffff6405d22 in raise () from /usr/lib/libc.so.6
#1 0x00007ffff63ef862 in abort () from /usr/lib/libc.so.6
#2 0x00007ffff664e21e in __gnu_debug::_Error_formatter::_M_error() const [clone .cold] from /usr/lib/libstdc++.so.6
#3 0x000055555699e5ff in std::__debug::vector<unsigned long, std::allocator<unsigned long> >::operator[] (this=0x61300000a590, __n=13) at /usr/include/c++/11.1.0/debug/vector:445
#4 0x0000555556a58c17 in objfile::section_offset (this=0x61300000a4c0, section=0x55555bbe4ac0 <_bfd_std_section>) at /home/simark/src/binutils-gdb/gdb/objfiles.h:644
#5 0x0000555556a58cac in obj_section::offset (this=0x62100016d2a8) at /home/simark/src/binutils-gdb/gdb/objfiles.h:838
#6 0x0000555556a58cfa in obj_section::addr (this=0x62100016d2a8) at /home/simark/src/binutils-gdb/gdb/objfiles.h:850
#7 0x000055555779f5f7 in sort_cmp (sect1=0x62100016d2a8, sect2=0x62100016d170) at /home/simark/src/binutils-gdb/gdb/objfiles.c:902
#8 0x00005555577aae35 in __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(obj_section const*, obj_section const*)>::operator()<obj_section**, obj_section**> (this=0x7fffffffa9e0, __it1=0x60c000015970, __it2=0x60c000015940) at /usr/include/c++/11.1.0/bits/predefined_ops.h:158
#9 0x00005555577aa2b8 in std::__insertion_sort<obj_section**, __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(obj_section const*, obj_section const*)> > (__first=0x60c000015940, __last=0x60c0000159c0, __comp=...) at /usr/include/c++/11.1.0/bits/stl_algo.h:1826
#10 0x00005555577a8e26 in std::__final_insertion_sort<obj_section**, __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(obj_section const*, obj_section const*)> > (__first=0x60c000015940, __last=0x60c0000159c0, __comp=...) at /usr/include/c++/11.1.0/bits/stl_algo.h:1871
#11 0x00005555577a723c in std::__sort<obj_section**, __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(obj_section const*, obj_section const*)> > (__first=0x60c000015940, __last=0x60c0000159c0, __comp=...) at /usr/include/c++/11.1.0/bits/stl_algo.h:1957
#12 0x00005555577a50f4 in std::sort<obj_section**, bool (*)(obj_section const*, obj_section const*)> (__first=0x60c000015940, __last=0x60c0000159c0, __comp=0x55555779f4e7 <sort_cmp(obj_section const*, obj_section const*)>) at /usr/include/c++/11.1.0/bits/stl_algo.h:4875
#13 0x00005555577a147e in update_section_map (pspace=0x61200001d2c0, pmap=0x6030000d40b0, pmap_size=0x6030000d40b8) at /home/simark/src/binutils-gdb/gdb/objfiles.c:1165
#14 0x00005555577a19a0 in find_pc_section (pc=0x100003fa0) at /home/simark/src/binutils-gdb/gdb/objfiles.c:1212
#15 0x00005555576dd39e in lookup_minimal_symbol_by_pc_section (pc_in=0x100003fa0, section=0x0, prefer=lookup_msym_prefer::TEXT, previous=0x0) at /home/simark/src/binutils-gdb/gdb/minsyms.c:750
#16 0x00005555576de552 in lookup_minimal_symbol_by_pc (pc=0x100003fa0) at /home/simark/src/binutils-gdb/gdb/minsyms.c:986
#17 0x0000555557d44b54 in find_pc_sect_line (pc=0x100003fa0, section=0x62100016d170, notcurrent=0) at /home/simark/src/binutils-gdb/gdb/symtab.c:3163
#18 0x0000555557d489fa in find_function_start_sal_1 (func_addr=0x100003fa0, section=0x62100016d170, funfirstline=true) at /home/simark/src/binutils-gdb/gdb/symtab.c:3650
#19 0x0000555557d49015 in find_function_start_sal (sym=0x621000191670, funfirstline=true) at /home/simark/src/binutils-gdb/gdb/symtab.c:3706
#20 0x0000555557485283 in symbol_to_sal (result=0x7fffffffbb30, funfirstline=1, sym=0x621000191670) at /home/simark/src/binutils-gdb/gdb/linespec.c:4460
#21 0x00005555574728c2 in convert_linespec_to_sals (state=0x7fffffffc390, ls=0x7fffffffc3e0) at /home/simark/src/binutils-gdb/gdb/linespec.c:2335
#22 0x0000555557475a8e in parse_linespec (parser=0x7fffffffc360, arg=0x60200007a550 "main", match_type=symbol_name_match_type::WILD) at /home/simark/src/binutils-gdb/gdb/linespec.c:2716
#23 0x0000555557479027 in event_location_to_sals (parser=0x7fffffffc360, location=0x606000097be0) at /home/simark/src/binutils-gdb/gdb/linespec.c:3173
#24 0x00005555574798f7 in decode_line_full (location=0x606000097be0, flags=1, search_pspace=0x0, default_symtab=0x0, default_line=0, canonical=0x7fffffffcca0, select_mode=0x0, filter=0x0) at /home/simark/src/binutils-gdb/gdb/linespec.c:3253
#25 0x0000555556b4949f in parse_breakpoint_sals (location=0x606000097be0, canonical=0x7fffffffcca0) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:9134
#26 0x0000555556b6ce95 in create_sals_from_location_default (location=0x606000097be0, canonical=0x7fffffffcca0, type_wanted=bp_breakpoint) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:13819
#27 0x0000555556b645a6 in bkpt_create_sals_from_location (location=0x606000097be0, canonical=0x7fffffffcca0, type_wanted=bp_breakpoint) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:12631
#28 0x0000555556b4badf in create_breakpoint (gdbarch=0x621000152d10, location=0x606000097be0, cond_string=0x0, thread=0, extra_string=0x0, force_condition=false, parse_extra=1, tempflag=0, type_wanted=bp_breakpoint, ignore_count=0, pending_break_support=AUTO_BOOLEAN_AUTO, ops=0x55555bd728a0 <bkpt_breakpoint_ops>, from_tty=0, enabled=1, internal=0, flags=0) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:9410
#29 0x0000555556b4d3b1 in break_command_1 (arg=0x7fffffffe291 "", flag=0, from_tty=0) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:9590
#30 0x0000555556b4dc1b in break_command (arg=0x7fffffffe28d "main", from_tty=0) at /home/simark/src/binutils-gdb/gdb/breakpoint.c:9660
#31 0x0000555556d24ca9 in do_const_cfunc (c=0x61100003a240, args=0x7fffffffe28d "main", from_tty=0) at /home/simark/src/binutils-gdb/gdb/cli/cli-decode.c:102
#32 0x0000555556d2fcd3 in cmd_func (cmd=0x61100003a240, args=0x7fffffffe28d "main", from_tty=0) at /home/simark/src/binutils-gdb/gdb/cli/cli-decode.c:2160
#33 0x0000555557e84e93 in execute_command (p=0x7fffffffe290 "n", from_tty=0) at /home/simark/src/binutils-gdb/gdb/top.c:674
#34 0x00005555575a9933 in catch_command_errors (command=0x555557e84043 <execute_command(char const*, int)>, arg=0x7fffffffe28b "b main", from_tty=0, do_bp_actions=true) at /home/simark/src/binutils-gdb/gdb/main.c:523
#35 0x00005555575a9fdb in execute_cmdargs (cmdarg_vec=0x7fffffffd910, file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND, ret=0x7fffffffd5b0) at /home/simark/src/binutils-gdb/gdb/main.c:618
#36 0x00005555575ad48a in captured_main_1 (context=0x7fffffffdd00) at /home/simark/src/binutils-gdb/gdb/main.c:1322
#37 0x00005555575ada9c in captured_main (data=0x7fffffffdd00) at /home/simark/src/binutils-gdb/gdb/main.c:1343
#38 0x00005555575adb31 in gdb_main (args=0x7fffffffdd00) at /home/simark/src/binutils-gdb/gdb/main.c:1368
#39 0x000055555681e179 in main (argc=8, argv=0x7fffffffde78) at /home/simark/src/binutils-gdb/gdb/gdb.c:32
The section being dealt with at that moment is the special *COM*
section:
(top-gdb) p section.name
$1 = 0x55555a1bbe60 "*COM*"
(top-gdb) p section
$2 = (bfd_section *) 0x55555bbe4ac0 <_bfd_std_section>
I'm not too sure what this section is for, but this is one of four
special BFD sections that GDB puts after the regular sections in the
objfile::sections and objfile::section_offsets lists. You can check
gdb_bfd_section_index to see how they are handled.
gdb_bfd_count_sections returns "+ 4" to account for those sections.
The problem is that macho_symfile_offsets uses bfd_count_sections
instead of gdb_bfd_count_sections when allocating the
objfile::section_offsets vector. The vector will therefore contain,
say, 13 elements instead of 17. When trying to access the section
offset of the *COM* section, the first after the regular sections, we
access section_offsets[13], which is out of bounds.
Fix that by using gdb_bfd_count_sections instead of bfd_count_sections.
I'm fairly confident that this is correct, as this is what
default_symfile_offsets does.
With this patch, the command shown above terminates normally:
$ ./gdb -nx --data-directory=data-directory -q repro/test -ex "b main" -batch
Breakpoint 1 at 0x100003fad: file test.c, line 2.
Simon Marchi [Mon, 28 Jun 2021 19:28:26 +0000 (15:28 -0400)]
gdb: convert obj_section macros to methods
Convert these three macros to methods of obj_section. The problem fixed
by the following patch is caused by an out of bound access of the
objfile::section_offsets vector. Since this is deep in macros, we don't
get a clear backtrace and it's difficult to debug. Changing that to
methods means we can step in them and break on them.
Because their implementation requires knowing about struct objfile, move
struct obj_section below struct objfile in objfiles.h.
The obj_section_offset was used in one place as an lvalue to set
offsets, in machoread.c. Replace that with a set_offset method.
Add the objfile::section_offset and objfile::set_section_offset methods
to improve encapsulation (reduce other objects poking into struct
objfile's internals).
gdb/ChangeLog:
* objfiles.h (struct obj_section): Move down.
<offset, set_offset, addr, endaddr>: New.
(obj_section_offset, obj_section_addr, obj_section_endaddr),
replace all users to use obj_section methods.
(struct objfile) <section_offset, set_section_offset>: New.
Simon Marchi [Mon, 28 Jun 2021 19:27:21 +0000 (15:27 -0400)]
gdb: add .flake8 file
Add a .flake8 file, which is used to set default options to the flake8
Python linter. Use it to disable these two kinds of diagnostics, which
we don't care about since formatting is handled by black. This reduces
the amount of noise when running flake8 on Python files.
./python/lib/gdb/function/caller_is.py:30:80: E501 line too long (81 > 79 characters)
./python/lib/gdb/command/frame_filters.py:468:17: W503 line break before binary operator