aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2021-02-02gdb/dwarf: split dwarf2_cu::ranges_base in twoSimon Marchi7-85/+251
Consider the test case added in this patch. It defines a compilation unit with a DW_AT_rnglists_base attribute (used for attributes of form DW_FORM_rnglistx), but also uses DW_AT_ranges of form DW_FORM_sec_offset: 0x00000027: DW_TAG_compile_unit DW_AT_ranges [DW_FORM_sec_offset] (0x0000004c [0x0000000000005000, 0x0000000000006000)) DW_AT_rnglists_base [DW_FORM_sec_offset] (0x00000044) The DW_AT_rnglists_base does not play a role in reading the DW_AT_ranges of form DW_FORM_sec_offset, but it should also not do any harm. This case is currently not handled correctly by GDB. This is not something that a compiler is likely to emit, but in my opinion there's no reason why GDB should fail reading it. The problem is that in partial_die_info::read and a few other places where the same logic is replicated, the cu->ranges_base value, containing the DW_AT_rnglists_base value, is wrongfully added to the DW_AT_ranges value. It is quite messy how to decide whether cu->ranges_base should be added to the attribute's value or not. But to summarize, the only time we want to add it is when the attribute comes from a pre-DWARF 5 split unit file (a .dwo) [1]. In this case, the DW_AT_ranges attribute from the split unit file will have form DW_FORM_sec_offset, pointing somewhere in the linked file's .debug_ranges section. *But* it's not a "true" DW_FORM_sec_offset, in that it's an offset relative to the beginning of that CU's contribution in the section, not relative to the beginning of the section. So in that case, and only that case, do we want to add the ranges base value, which we found from the DW_AT_GNU_ranges_base attribute on the skeleton unit. Almost all instances of the DW_AT_ranges attribute will be found in the split unit (on DW_TAG_subprogram, for example), and therefore need to have the ranges base added. However, the DW_TAG_compile_unit DIE in the skeleton may also have a DW_AT_ranges attribute. For that one, the ranges base must not be added. Once the DIEs have been loaded in GDB, however, the distinction between what's coming from the skeleton and what's coming from the split unit is not clear. It is all merged in one big happy tree. So how do we know if a given attribute comes from the split unit or not? We use the fact that in pre-DWARF 5 split DWARF, DW_AT_ranges is found on the skeleton's DW_TAG_compile_unit (in the linked file) and never in the split unit's DW_TAG_compile_unit. This is why you have this in partial_die_info::read: int need_ranges_base = (tag != DW_TAG_compile_unit && attr.form != DW_FORM_rnglistx); However, with the corner case described above (where we have a DW_AT_rnglists_base attribute and a DW_AT_ranges attribute of form DW_FORM_sec_offset) the condition gets it wrong when it encounters an attribute like DW_TAG_subprogram with a DW_AT_ranges attribute of DW_FORM_sec_offset form: it thinks that it is necessary to add the base, when it reality it is not. The problem boils down to failing to differentiate these cases: - a DW_AT_ranges attribute of form DW_FORM_sec_offset in a pre-DWARF 5 split unit (in which case we need to add the base) - a DW_AT_ranges attribute of form DW_FORM_sec_offset in a DWARF 5 non-split unit (in which case we must not add the base) What makes it unnecessarily complex is that the cu->ranges_base field is overloaded, used to hold the pre-DWARF 5, non-standard DW_AT_GNU_ranges_base and the DWARF 5 DW_AT_rnglists_base. In reality, these two are called "bases" but are not the same thing. The result is that we need twisted conditions to try to determine whether or not we should add the base to the attribute's value. To fix it, split the field in two distinct fields. I renamed everything related to the "old" ranges base to "gnu_ranges_base", to make it clear that it's about the non-standard, pre-DWARF 5 thing. And everything related to the DWARF 5 thing gets renamed "rnglists". I think it becomes much easier to reason this way. The issue described above gets fixed by the fact that the DW_AT_rnglists_base value does not end up in cu->gnu_ranges_base, so cu->gnu_ranges_base stays 0. The condition to determine whether gnu_ranges_base should be added can therefore be simplified back to: tag != DW_TAG_compile_unit ... as it was before rnglistx support was added. Extend the gdb.dwarf2/rnglists-sec-offset.exp to cover this case. I also extended the test case for loclists similarly, just to see if there would be some similar problem. There wasn't, but I think it's not a bad idea to test that case for loclists as well, so I left it in the patch. [1] https://gcc.gnu.org/wiki/DebugFission gdb/ChangeLog: * dwarf2/die.h (struct die_info) <ranges_base>: Split in... <gnu_ranges_base>: ... this... <rnglists_base>: ... and this. * dwarf2/read.c (struct dwarf2_cu) <ranges_base>: Split in... <gnu_ranges_base>: ... this... <rnglists_base>: ... and this. (read_cutu_die_from_dwo): Adjust (dwarf2_get_pc_bounds): Adjust (dwarf2_record_block_ranges): Adjust. (read_full_die_1): Adjust (partial_die_info::read): Adjust. (read_rnglist_index): Adjust. gdb/testsuite/ChangeLog: * gdb.dwarf2/rnglists-sec-offset.exp: Add test for DW_AT_ranges of DW_FORM_sec_offset form plus DW_AT_rnglists_base attribute. * gdb.dwarf2/loclists-sec-offset.exp: Add test for DW_AT_location of DW_FORM_sec_offset plus DW_AT_loclists_base attribute Change-Id: Icd109038634b75d0e6e9d7d1dcb62fb9eb951d83
2021-02-02gdb/testsuite: add .debug_loclists testsSimon Marchi6-0/+551
Add tests for the various issues fixed in the previous patches. Add a new "loclists" procedure to the DWARF assembler, to allow generating .debug_loclists sections. gdb/testsuite/ChangeLog: PR gdb/26813 * lib/dwarf.exp (_handle_DW_FORM): Handle DW_FORM_loclistx. (loclists): New proc. * gdb.dwarf2/loclists-multiple-cus.c: New. * gdb.dwarf2/loclists-multiple-cus.exp: New. * gdb.dwarf2/loclists-sec-offset.c: New. * gdb.dwarf2/loclists-sec-offset.exp: New. Change-Id: I209bcb2a9482762ae943e518998d1f7761f76928
2021-02-02gdb/testsuite: DWARF assembler: add context parameters to _locationSimon Marchi2-13/+32
The _location proc is used to assemble a location description. It needs to know some contextual information: - size of an address - size of an offset (into another DWARF section) - DWARF version It currently get all this directly from global variables holding the compilation unit information. This is fine because as of now, all location descriptions are generated in the context of creating a compilation unit. However, a subsequent patch will generate location descriptions while generating a .debug_loclists section. _location should therefore no longer rely on the current compilation unit's properties. Change it to accept these values as parameters instead of accessing the values for the CU. No functional changes intended. gdb/testsuite/ChangeLog: * lib/dwarf.exp (_location): Add parameters. (_handle_DW_FORM): Adjust. Change-Id: Ib94981979c83ffbebac838081d645ad71c221637
2021-02-02gdb/testsuite: add .debug_rnglists testsSimon Marchi4-3/+375
Add tests for the various issues fixed in the previous patches. Add a new "rnglists" procedure to the DWARF assembler, to allow generating .debug_rnglists sections. A trivial change is required to support the DWARF 5 CU header layout. gdb/testsuite/ChangeLog: PR gdb/26813 * lib/dwarf.exp (_handle_DW_FORM): Handle DW_FORM_rnglistx. (cu): Generate header for DWARF 5. (rnglists): New proc. * gdb.dwarf2/rnglists-multiple-cus.exp: New. * gdb.dwarf2/rnglists-sec-offset.exp: New. Change-Id: I5b297e59c370c60cf671dec19796a6c3b9a9f632
2021-02-02gdb/dwarf: read correct rnglist/loclist header in read_{rng,loc}list_indexSimon Marchi2-6/+47
When loading the binary from PR 26813 in GDB, we get: DW_FORM_rnglistx index pointing outside of .debug_rnglists offset array [in module /home/simark/build/binutils-gdb/gdb/MagicPurse] ... and the symbols fail to load. In read_rnglist_index and read_loclist_index, we read the header (documented in sections 7.28 and 7.29 of DWARF 5) of the CU's contribution to the .debug_rnglists / .debug_loclists sections to validate that the index we want to read makes sense. However, we always read the header at the beginning of the section, rather than the header for the contribution from which we want to read the index. To illustrate, here's what the binary from PR 26813 contains. There are two compile units: 0x0000000c: DW_TAG_compile_unit 1 DW_AT_ranges [DW_FORM_rnglistx]: 0x0 DW_AT_rnglists_base [DW_FORM_sec_offset]: 0xC 0x00003ec9: DW_TAG_compile_unit 2 DW_AT_ranges [DW_FORM_rnglistx]: 0xB DW_AT_rnglists_base [DW_FORM_sec_offset]: 0x85 The layout of the .debug_rnglists is the following: [0x00, 0x0B]: header for CU 1's contribution [0x0C, 0x0F]: list of offsets for CU 1 (1 element) [0x10, 0x78]: range lists data for CU 1 [0x79, 0x84]: header for CU 2's contribution [0x85, 0xB4]: list of offsets for CU 2 (12 elements) [0xB5, 0xBD7]: range lists data for CU 2 The DW_AT_rnglists_base attrbute points to the beginning of the list of offsets for that CU, relative to the start of the .debug_rnglists section. That's right after the header for that contribution. When we try to read the DW_AT_ranges attribute for CU 2, read_rnglist_index reads the header for CU 1 instead of the one for CU 2. Since there's only one element in CU 1's offset list, it believes (wrongfully) that the index 0xB is out of range. Fix it by reading the header just before where DW_AT_rnglists_base points to. With this patch, I am able to load GDB built with clang-11 and -gdwarf-5 in itself, with and without -readnow. gdb/ChangeLog: PR gdb/26813 * dwarf2/read.c (read_loclists_rnglists_header): Add header_offset parameter and use it. (read_loclist_index): Read header of the current contribution, not the one at the beginning of the section. (read_rnglist_index): Likewise. Change-Id: Ie53ff8251af8c1556f0a83a31aa8572044b79e3d
2021-02-02gdb/dwarf: few fixes for handling DW_FORM_{rng,loc}listxSimon Marchi4-4/+31
We hit an assertion when loading the binary from PR 26813. When fixing it, execution goes a up bit further but then hits another assert, and another, and another. With these fours fixes, I am able to load the binary and get to the prompt. An error is shown (index pointing outside of the section), because the DW_FORM_rnglistx attribute is not read correctly, but that one is taken care of by the next patch. The four fixes are: - attribute::form_requires_reprocessing needs to handle forms DW_FORM_rnglistx and DW_FORM_loclistx, because set_unsigned_reprocess is called for them in read_attribute_value. - read_attribute_reprocess must call set_unsigned for them, not set_address. The parameter of set_address is a CORE_ADDR, meaning it's for program addresses. Post-reprocess, DW_FORM_rnglistx and DW_FORM_loclistx are offsets into their respective sections (.debug_rnglists and .debug_loclists). set_unsigned is the current attribute value setter that fits the best. But perhaps we should have a setter that takes a sect_offset? - read_attribute_process must call as_unsigned_reprocess instead of as_unsigned to get the pre-reprocess value, otherwise we hit the assert inside as_unsigned that makes sure the attribute doesn't need reprocessing. - attribute::set_unsigned needs to clear the requires_reprocessing flag, otherwise it stays set when reprocessing DW_FORM_rnglistx and DW_FORM_loclistx attributes. There's another assert that we hit once the next patch is applied, but since it's in the same vein as the changes in this patch, I included it in this patch: - attribute::form_is_unsigned must handle form DW_FORM_loclistx, otherwise we hit the assert when trying to call set_unsigned for an attribute of this form. DW_FORM_rnglistx is already handled. gdb/ChangeLog: PR gdb/26813 * dwarf2/attribute.h (struct attribute) <set_unsigned>: Clear requires_reprocessing flag. * dwarf2/attribute.c (attribute::form_is_unsigned): Handle DW_FORM_loclistx. (attribute::form_requires_reprocessing): Handle DW_FORM_rnglistx and DW_FORM_loclistx. * dwarf2/read.c (read_attribute_reprocess): Use set_unsigned instead of set_address for DW_FORM_loclistx and DW_FORM_rnglistx. Change-Id: I06c156fa3913ca98e4e39085f4ef171645b4bc1e
2021-02-02gdb/dwarf: remove unnecessary check in read_{rng,loc}list_indexSimon Marchi2-11/+6
In read_rnglist_index and read_loclist_index, we check that both the start and end of the offset that we read from the offset table are within the section. I think it's unecessary to do both: if the end of the offset is within the section, then surely the start of the offset is within it. Remove the check for the start of the offset in both functions. gdb/ChangeLog: * dwarf2/read.c (read_loclist_index): Remove bound check for start of offset. (read_rnglist_index): Likewise. Change-Id: I7b57ddf4f8a8a28971738f0e3f3af62108f9e19a
2021-02-02gdb/dwarf: add missing bound check to read_loclist_indexSimon Marchi2-4/+18
read_rnglist_index has a bound check to make sure that we don't go past the end of the section while reading the offset, but read_loclist_index doesn't. Add it to read_loclist_index. gdb/ChangeLog: * dwarf2/read.c (read_loclist_index): Add bound check for the end of the offset. Change-Id: Ic4b55c88860fdc3e007740949c78ec84cdb4da60
2021-02-02gdb/dwarf: fix bound check in read_rnglist_indexSimon Marchi2-1/+7
I think this check in read_rnglist_index is wrong: /* Validate that reading won't go beyond the end of the section. */ if (start_offset + cu->header.offset_size > rnglist_base + section->size) error (_("Reading DW_FORM_rnglistx index beyond end of" ".debug_rnglists section [in module %s]"), objfile_name (objfile)); The addition `rnglist_base + section->size` doesn't make sense. rnglist_base is an offset into `section`, so it doesn't make sense to add it to `section`'s size. `start_offset` also is an offset into `section`, so we should just compare it to just `section->size`. gdb/ChangeLog: * dwarf2/read.c (read_rnglist_index): Fix bound check. Change-Id: If0ff7c73f4f80f79aac447518f4e8f131f2db8f2
2021-02-02gdb/dwarf: change read_loclist_index complaints into errorsSimon Marchi2-8/+16
Unlike read_rnglists_index, read_loclist_index uses complaints when it detects an inconsistency (a DW_FORM_loclistx value without a .debug_loclists section or an offset outside of the section). I really think they should be errors, since there's no point in continuing if this situation happens, we will likely segfault or read garbage. gdb/ChangeLog: * dwarf2/read.c (read_loclist_index): Change complaints into errors. Change-Id: Ic3a1cf6e682d47cb6e739dd76fd7ca5be2637e10
2021-02-02readelf: Add 'R' and 'D' to "Key to Flags:"H.J. Lu3-0/+21
Add "R (retain)" and "D (mbind)" to "Key to Flags:". PR binutils/27281 * readelf.c (process_section_headers): Add 'R' and 'D' to "Key to Flags:". * testsuite/binutils-all/retain1a.d: Updated.
2021-02-02PR27311, ld.bfd (symbol from plugin): undefined referenceAlan Modra9-13/+60
A default versioned symbol definition in a shared library is overridden by an unversioned definition in a regular object file, and thus should not be reason to make an as-needed library needed. bfd/ PR 27311 * elflink.c (_bfd_elf_add_default_symbol): Add override parameter. Use when handling default versioned symbol. Rename existing override variable to nondef_override and use for non-default versioned symbol. (elf_link_add_object_symbols): Adjust call to suit. Don't pull in as-needed libraries when override is set. ld/ * testsuite/ld-plugin/pr27311.d, * testsuite/ld-plugin/pr27311.ver, * testsuite/ld-plugin/pr27311a.c, * testsuite/ld-plugin/pr27311b.c, * testsuite/ld-plugin/pr27311c.c: New testcase. * testsuite/ld-plugin/lto.exp: Run it. Correct PR14918 and PR12982 entries.
2021-02-02[gdb/symtab] Fix assert in write_one_signatured_typeTom de Vries4-0/+34
When running test-case gdb.dwarf2/fission-reread.exp with target board cc-with-gdb-index, we run into an abort during the generation of the gdb-index by cc-with-tweaks.sh: ... build/gdb/testsuite/cache/gdb.sh: line 1: 27275 Aborted (core dumped) ... This can be reproduced on the command line like this: ... $ gdb -batch ./outputs/gdb.dwarf2/fission-reread/fission-reread \ -ex 'save gdb-index ./outputs/gdb.dwarf2/fission-reread' warning: Could not find DWO TU fission-reread.dwo(0x9022f1ceac7e8b19) \ referenced by TU at offset 0x0 [in module fission-reread] warning: Could not find DWO CU fission-reread.dwo(0x807060504030201) \ referenced by CU at offset 0x561 [in module fission-reread] Aborted (core dumped) ... The abort is a segfault due to a using a nullptr psymtab in write_one_signatured_type. The problem is that we're trying to write index entries for the type unit with signature: ... (gdb) p /x entry->signature $2 = 0x9022f1ceac7e8b19 ... which is a skeleton type unit: ... Contents of the .debug_types section: Compilation Unit @ offset 0x0: Length: 0x4a (32-bit) Version: 4 Abbrev Offset: 0x165 Pointer Size: 4 Signature: 0x9022f1ceac7e8b19 Type Offset: 0x0 <0><17>: Abbrev Number: 2 (DW_TAG_type_unit) <18> DW_AT_comp_dir : /tmp/src/gdb/testsuite <2f> DW_AT_GNU_dwo_name: fission-reread.dwo <42> DW_AT_GNU_pubnames: 0x0 <46> DW_AT_GNU_pubtypes: 0x0 <4a> DW_AT_GNU_addr_base: 0x0 ... referring to a .dwo file, but as the warnings show, the .dwo file is not found. Fix this by skipping the type unit in write_one_signatured_type if psymtab == nullptr. Tested on x86_64-linux. gdb/ChangeLog: 2021-02-02 Tom de Vries <tdevries@suse.de> PR symtab/24620 * dwarf2/index-write.c (write_one_signatured_type): Skip if psymtab == nullptr. gdb/testsuite/ChangeLog: 2021-02-02 Tom de Vries <tdevries@suse.de> PR symtab/24620 * gdb.dwarf2/fission-reread.exp: Add test-case.
2021-02-02Automatic date update in version.inGDB Administrator1-1/+1
2021-02-01Add Genode target supportEmery Hemingway6-8/+22
* configure.tgt: Add *-*-genode* as a target for AArch64 and x86.
2021-02-01[gdb/testsuite] Fix gdb.dwarf2/fission-reread.exp with .gdb_indexTom de Vries11-52/+64
When running test-case gdb.dwarf2/fission-reread.exp with target board cc-with-gdb-index, we run into: ... gdb compile failed, warning: Could not find DWO TU \ fission-reread.dwo(0x9022f1ceac7e8b19) referenced by TU at offset 0x0 \ [in module outputs/gdb.dwarf2/fission-reread/fission-reread] ... The problem is that the .dwo file is not found. There's code added in the .exp file to make sure the .dwo can be found: ... # Make sure we can find the .dwo file, regardless of whether we're # running in parallel mode. gdb_test_no_output "set debug-file-directory [file dirname $binfile]" \ "set debug-file-directory" ... This works normally, but not for the gdb invocation done by cc-with-tweaks.sh for target board cc-with-gdb-index. Fix this by finding the full path to the .dwo file and passing it to the compilation. Tested on x86_64-linux with native and target boards cc-with-gdb-index, cc-with-debug-names and readnow. gdb/testsuite/ChangeLog: 2021-02-01 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/fission-base.S: Pass -DDWO=$dwo. * gdb.dwarf2/fission-loclists-pie.S: Same. * gdb.dwarf2/fission-loclists.S: Same. * gdb.dwarf2/fission-multi-cu.S: Same. * gdb.dwarf2/fission-reread.S: Same. * gdb.dwarf2/fission-base.exp: Use DWO. * gdb.dwarf2/fission-loclists-pie.exp: Same. * gdb.dwarf2/fission-loclists.exp: Same. * gdb.dwarf2/fission-multi-cu.exp: Same. * gdb.dwarf2/fission-reread.exp: Same.
2021-02-01Wrong operand for SADDR (rl78)Egor Vishnyakov2-1/+7
PR 27254 * elf32-rl78.c (rl78_elf_relocate_section): Fix calculation of offset for the R_RL78_RH_SADDR relocation.
2021-02-01Small updates to the 'how to make a release' document following from the ↵Nick Clifton2-22/+23
2.35.2 release
2021-02-02ld --defsymAlan Modra4-24/+11
This makes --defsym support the same expressions as assignment in a script. For example, --defsym 'HIDDEN(foo=0)', will define a hidden visibility foo. * ldgram.y (defsym_expr): Use assignment rule. * ldlex.h (ldlex_defsym): Delete. * ldlex.l (DEFSYMEXP, ldlex_defsym): Delete.
2021-02-02ld script expression parsingAlan Modra4-2/+30
Parsing symbol or file/section names in ld linker scripts is a little complicated. Inside SECTIONS, a name might be the start of an expression or an output section. Is ".foo=x-y" a fancy section name or is it the expression ".foo = x - y"? It isn't possible for a single lookahead parser to decide, so the answer in this case is that it's a section name. This is the reason why everyone writes linker script assignment expressions with lots of white-space. However, there are many places where the parser knows for sure that an expression is expected. Those could be written without whitespace given the first change to ldlex.l below. Unfortunately, that runs into a lookahead problem. Optional expressions at the end of an output section statement require the parser to look ahead one token in expression context. For this example from standard scripts .interp : { *(.interp) } .note.gnu.build-id : { *(.note.gnu.build-id) } at the end of the .interp closing brace, the parser is looking for a possible memspec, phdr, fill or even an optional comma. The next token is a NAME, but in expression context that NAME now doesn't include '-' as a valid char. So the lookahead NAME is ".note.gnu.build" with an unexpected "-id" syntax error before the colon. The rest of the patch involving ldlex_backup arranges to discard that NAME token so that it will be rescanned in the proper script context. * ldgram.y (section): Call ldlex_backup. Remove empty action. * ldlex.h (ldlex_backup): Declare. * ldlex.l (<EXPRESSION>NAME): Don't use NOCFILENAMECHAR set of chars, use SYMBOLNAMECHAR. (ldlex_backup): New function.
2021-02-01gdb: unify parts of the Linux and FreeBSD core dumping codeAndrew Burgess5-262/+199
While reviewing the Linux and FreeBSD core dumping code within GDB for another patch series, I noticed that the code that collects the registers for each thread and writes these into ELF note format is basically identical between Linux and FreeBSD. This commit merges this code and moves it into the gcore.c file, which seemed like the right place for generic writing a core file code. The function find_signalled_thread is moved from linux-tdep.c despite not being shared. A later commit will make use of this function. There are a couple of minor changes to the FreeBSD target after this commit, but I believe that these are changes for the better: (1) For FreeBSD we always used to record the thread-id in the core file by using ptid_t.lwp (). In contrast the Linux code did this: /* For remote targets the LWP may not be available, so use the TID. */ long lwp = ptid.lwp (); if (lwp == 0) lwp = ptid.tid (); Both target now do this: /* The LWP is often not available for bare metal target, in which case use the tid instead. */ if (ptid.lwp_p ()) lwp = ptid.lwp (); else lwp = ptid.tid (); Which is equivalent for Linux, but is a change for FreeBSD. I think that all this means is that in some cases where GDB might have previously recorded a thread-id of 0 for each thread, we might now get something more useful. (2) When collecting the registers for Linux we collected into a zero initialised buffer. By contrast on FreeBSD the buffer is left uninitialised. In the new code the buffer is always zero initialised. I suspect once the registers are copied into the buffer there's probably no gaps left so this makes no difference, but if it does then using zeros rather than random bits of GDB's memory is probably a good thing. Otherwise, there should be no other user visible changes after this commit. Tested this on x86-64/GNU-Linux and x86-64/FreeBSD-12.2 with no regressions. gdb/ChangeLog: * Makefile.in (HFILES_NO_SRCDIR): Add corefile.h. * gcore.c (struct gcore_collect_regset_section_cb_data): Moved here from linux-tdep.c and given a new name. Minor cleanups. (gcore_collect_regset_section_cb): Likewise. (gcore_collect_thread_registers): Likewise. (gcore_build_thread_register_notes): Likewise. (gcore_find_signalled_thread): Likewise. * gcore.h (gcore_build_thread_register_notes): Declare. (gcore_find_signalled_thread): Declare. * fbsd-tdep.c: Add 'gcore.h' include. (struct fbsd_collect_regset_section_cb_data): Delete. (fbsd_collect_regset_section_cb): Delete. (fbsd_collect_thread_registers): Delete. (struct fbsd_corefile_thread_data): Delete. (fbsd_corefile_thread): Delete. (fbsd_make_corefile_notes): Call gcore_build_thread_register_notes instead of the now deleted FreeBSD code. * linux-tdep.c: Add 'gcore.h' include. (struct linux_collect_regset_section_cb_data): Delete. (linux_collect_regset_section_cb): Delete. (linux_collect_thread_registers): Delete. (linux_corefile_thread): Call gcore_build_thread_register_notes. (find_signalled_thread): Delete. (linux_make_corefile_notes): Call gcore_find_signalled_thread.
2021-02-01ldgram.y low_level_library_NAME_listAlan Modra2-2/+7
Beginning a new rule hidden inside another rule is horrible. * ldgram.y: Whitespace fixes.
2021-02-01Re: ld: Add a test for PR ld/27259Alan Modra2-1/+5
* testsuite/ld-elf/pr27259.d: Correct sh_link match.
2021-02-01PR27283 gas for alpha fails to build with gcc 11Alan Modra2-1/+6
PR 27283 * config/tc-alpha.c (insert_operand): Delete dead code.
2021-02-01Automatic date update in version.inGDB Administrator1-1/+1
2021-01-31sim: cgen-trace: tweak printf callMike Frysinger2-1/+5
GCC warns that we pass a non-string literal as the format string, so add an explicit "%s" to make it happy.
2021-01-31sim: bpf: fix mainloop extract callMike Frysinger2-1/+5
The extract function takes the argbuf, not the scache.
2021-01-31sim: bpf/or1k: fix CGEN_TRACE_EXTRACT nameMike Frysinger5-127/+138
We renamed these years ago, but it looks like the cgen core missed the TRACE_EXTRACT function, so these new ports still used the incompatible common name. Fix those ports to use the right func.
2021-01-31sim: cgen-accfp: Fix pointer sign warningsStafford Horne2-3/+9
When compiling we get the following warnings: common/cgen-accfp.c: In function 'fixsfsi': common/cgen-accfp.c:370:18: warning: pointer targets in passing argument 1 of 'sim_fpu_to32i' differ in signedness [-Wpointer-sign] sim_fpu_to32i (&res, &op1, sim_fpu_round_near); ^ common/cgen-accfp.c: In function 'fixdfsi': common/cgen-accfp.c:381:18: warning: pointer targets in passing argument 1 of 'sim_fpu_to32i' differ in signedness [-Wpointer-sign] sim_fpu_to32i (&res, &op1, sim_fpu_round_near); ^
2021-01-31sim: v850: cleanup build warningsMike Frysinger4-107/+124
This port only had one minor warning left in it, so fix it and then enable -Werror behavior by deleting the macro call. We'll use the common default now (which is -Werror).
2021-01-31sim: v850: fix handling of SYS_timesMike Frysinger2-2/+5
My recent rewrite of the nltvals generator fixed a bug where SYS_times was not being exported for v850. But that in turn uncovered this bug where the SYS_times codepath had a compile error.
2021-01-31sim: moxie: cleanup build warningsMike Frysinger4-6/+22
This port only had one minor warning left in it, so fix it and then enable -Werror behavior by deleting the macro call. We'll use the common default now (which is -Werror).
2021-01-30sim: common: change gennltvals helper to PythonMike Frysinger6-240/+243
This tool is only run by developers and not in a release build, so rewrite it in Python to make it more maintainable.
2021-01-31Automatic date update in version.inGDB Administrator1-1/+1
2021-01-30sim: m68hc11: fix printf size warningsMike Frysinger2-1/+5
GCC complains %llu is wrong for signed64, so switch to PRIi64.
2021-01-30sim: m68hc11: localize a few functionsMike Frysinger2-6/+12
These are only used in this file and lack prototypes, so gcc complains about it. Add static everywhere to clean that up.
2021-01-30sim: m68hc11: tweak printf-style funcsMike Frysinger2-2/+6
GCC complains that we past non-string literals to a printf style func, so put a %s in here to keep it quiet.
2021-01-30sim: m68hc11: include stdlib.h for prototypesMike Frysinger3-0/+7
These files use abort() & strtod(), so include stdlib.h for them.
2021-01-30sim: watchpoints: change sizeof_pc to sizeof(sim_cia)Mike Frysinger23-16/+50
Existing ports already have sizeof_pc set to the same size as sim_cia, so simply make that part of the core code. We already assume this in places by way of sim_pc_{get,set}, and this is how it's documented in the sim-base.h API. There is code to allow sims to pick different register word sizes from address sizes, but most ports use the defaults for both (32-bits), and the few that support multiple register sizes never change the address size (so address defaults to register). I can't think of any machine where the register hardware size would be larger than the address word size either. We have ABIs that behave that way (e.g. x32), but the hardware is still equivalent register sized.
2021-01-30sim: profile: fix bucketing with 64-bit targetsMike Frysinger2-2/+6
When the target's PC is 64-bits, this shift expands into a range of 8 * 8 - 1 which doesn't work with 32-bit constants. Force it to be a 64-bit value all the time and let the compiler truncate it.
2021-01-30sim: m68hc11: stop making hardware conditionalMike Frysinger3-32/+22
This port doesn't build if these hardware modules are omitted, and there's no reason we need to make it conditional at build time, so always enable it. The hardware devices only get turned on if the user requests it at runtime via hardware settings.
2021-01-30sim: hw: replace fgets with getlineMike Frysinger2-30/+41
This avoids fixed sized buffers on the stack.
2021-01-30sim: common: sort nltvals.defMike Frysinger3-90/+95
This was largely already done, but I think people didn't quite notice.
2021-01-29sim: readd myself as a maintainerMike Frysinger2-1/+5
2021-01-30Automatic date update in version.inGDB Administrator1-1/+1
2021-01-29[gdb/breakpoint] Fix stepping past non-stmt line-table entriesTom de Vries5-8/+208
Consider the test-case small.c: ... $ cat -n small.c 1 __attribute__ ((noinline, noclone)) 2 int foo (char *c) 3 { 4 asm volatile ("" : : "r" (c) : "memory"); 5 return 1; 6 } 7 8 int main () 9 { 10 char tpl1[20] = "/tmp/test.XXX"; 11 char tpl2[20] = "/tmp/test.XXX"; 12 int fd1 = foo (tpl1); 13 int fd2 = foo (tpl2); 14 if (fd1 == -1) { 15 return 1; 16 } 17 18 return 0; 19 } ... Compiled with gcc-8 and optimization: ... $ gcc-8 -O2 -g small.c ... We step through the calls to foo, but fail to visit line 13: ... 12 int fd1 = foo (tpl1); (gdb) step foo (c=c@entry=0x7fffffffdea0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step foo (c=c@entry=0x7fffffffdec0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step main () at small.c:14 14 if (fd1 == -1) { (gdb) ... This is caused by the following. The calls to foo are implemented by these insns: .... 4003df: 0f 29 04 24 movaps %xmm0,(%rsp) 4003e3: 0f 29 44 24 20 movaps %xmm0,0x20(%rsp) 4003e8: e8 03 01 00 00 callq 4004f0 <foo> 4003ed: 48 8d 7c 24 20 lea 0x20(%rsp),%rdi 4003f2: 89 c2 mov %eax,%edx 4003f4: e8 f7 00 00 00 callq 4004f0 <foo> 4003f9: 31 c0 xor %eax,%eax ... with corresponding line table entries: ... INDEX LINE ADDRESS IS-STMT 8 12 0x00000000004003df Y 9 10 0x00000000004003df 10 11 0x00000000004003e3 11 12 0x00000000004003e8 12 13 0x00000000004003ed 13 12 0x00000000004003f2 14 13 0x00000000004003f4 Y 15 13 0x00000000004003f4 16 14 0x00000000004003f9 Y 17 14 0x00000000004003f9 ... Once we step out of the call to foo at 4003e8, we land at 4003ed, and gdb enters process_event_stop_test to figure out what to do. That entry has is-stmt=n, so it's not the start of a line, so we don't stop there. However, we do update ecs->event_thread->current_line to line 13, because the frame has changed (because we stepped out of the function). Next we land at 4003f2. Again the entry has is-stmt=n, so it's not the start of a line, so we don't stop there. However, because the frame hasn't changed, we don't update update ecs->event_thread->current_line, so it stays 13. Next we land at 4003f4. Now is-stmt=y, so it's the start of a line, and we'd like to stop here. But we don't stop because this test fails: ... if ((ecs->event_thread->suspend.stop_pc == stop_pc_sal.pc) && (ecs->event_thread->current_line != stop_pc_sal.line || ecs->event_thread->current_symtab != stop_pc_sal.symtab)) { ... because ecs->event_thread->current_line == 13 and stop_pc_sal.line == 13. Fix this by resetting ecs->event_thread->current_line to 0 if is-stmt=n and the frame has changed, such that we have: ... 12 int fd1 = foo (tpl1); (gdb) step foo (c=c@entry=0x7fffffffdbc0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step main () at small.c:13 13 int fd2 = foo (tpl2); (gdb) ... Tested on x86_64-linux, with gcc-7 and gcc-8. gdb/ChangeLog: 2021-01-29 Tom de Vries <tdevries@suse.de> PR breakpoints/26063 * infrun.c (process_event_stop_test): Reset ecs->event_thread->current_line to 0 if is-stmt=n and frame has changed. gdb/testsuite/ChangeLog: 2021-01-29 Tom de Vries <tdevries@suse.de> PR breakpoints/26063 * gdb.dwarf2/dw2-step-out-of-function-no-stmt.c: New test. * gdb.dwarf2/dw2-step-out-of-function-no-stmt.exp: New file.
2021-01-29[gdb/testsuite] Fix gdb.opt/solib-intra-step.exp with -m32 and gcc-10Tom de Vries2-24/+6
When running test-case gdb.opt/solib-intra-step.exp with target board unix/-m32 and gcc-10, I run into: ... (gdb) step^M __x86.get_pc_thunk.bx () at ../sysdeps/i386/crti.S:68^M 68 ../sysdeps/i386/crti.S: No such file or directory.^M (gdb) step^M shlib_second (dummy=0) at solib-intra-step-lib.c:23^M 23 abort (); /* second-hit */^M (gdb) FAIL: gdb.opt/solib-intra-step.exp: second-hit ... The problem is that the test-case expects to step past the retry line, which is optional. Fix this by removing the state tracking logic from the gdb_test_multiples. It makes the test more difficult to understand, and doesn't specifically test for faulty gdb behaviour. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-01-29 Tom de Vries <tdevries@suse.de> * gdb.opt/solib-intra-step.exp: Remove state tracking logic.
2021-01-29PR27271, c6x-uclinux-ld segfaults linking ld-uClibc-1.0.37.soAlan Modra4-0/+17
bfd/ PR 27271 * elflink.c (bfd_elf_link_record_dynamic_symbol): Don't segfault on symbols defined in absolute or other special sections. ld/ * testsuite/ld-tic6x/tic6x.exp: Add pr27271 test.
2021-01-29Automatic date update in version.inGDB Administrator1-1/+1
2021-01-28gdb: remove unneeded switch_to_thread from thr_try_catch_cmdAndrew Burgess2-3/+9
I spotted that every time thr_try_catch_cmd is called GDB has already switched to the required thread. The call to switch_to_thread at the head of thr_try_catch_cmd is therefore redundant. This commit replaces the call to switch_to_thread with an assertion that we already have the required thread selected. I also extended the header comment on thr_try_catch_cmd to make it clearer when this function could throw an exception. There should be no user visible changes after this commit. gdb/ChangeLog: * thread.c (thr_try_catch_cmd): Replace swith_to_thread with an assert. Extend the header comment.