aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2018-04-09PowerPC inline PLT call supportAlan Modra10-46/+424
In addition to the existing relocs we need two more to mark all instructions in the call sequence, PLTCALL on the call itself (plus the toc restore insn for ppc64), and PLTSEQ on others. All relocations in a particular sequence have the same symbol. Example ppc64 ELFv2 assembly: .reloc .,R_PPC64_PLTSEQ,puts std 2,24(1) addis 12,2,puts@plt@ha # .reloc .,R_PPC64_PLT16_HA,puts ld 12,puts@plt@l(12) # .reloc .,R_PPC64_PLT16_LO_DS,puts .reloc .,R_PPC64_PLTSEQ,puts mtctr 12 .reloc .,R_PPC64_PLTCALL,puts bctrl ld 2,24(1) Example ppc32 -fPIC assembly: addis 12,30,puts+32768@plt@ha # .reloc .,R_PPC_PLT16_HA,puts+0x8000 lwz 12,12,puts+32768@plt@l # .reloc .,R_PPC_PLT16_LO,puts+0x8000 .reloc .,R_PPC_PLTSEQ,puts+32768 mtctr 12 .reloc .,R_PPC_PLTCALL,puts+32768 bctrl Marking sequences like this allows the linker to convert them to nops and a direct call if the target symbol turns out to be local. When the call is __tls_get_addr, each relocation shown above is paired with an R_PPC*_TLSLD or R_PPC*_TLSGD reloc to additionally mark the sequence for possible TLS optimization. The TLSLD or TLSGD relocs are emitted first. include/ * elf/ppc.h (R_PPC_PLTSEQ, R_PPC_PLTCALL): Define. * elf/ppc64.h (R_PPC64_PLTSEQ, R_PPC64_PLTCALL): Define. bfd/ * elf32-ppc.c (ppc_elf_howto_raw): Add PLTSEQ and PLTCALL howtos. (is_plt_seq_reloc): New function. (ppc_elf_check_relocs): Handle PLTSEQ and PLTCALL relocs. (ppc_elf_tls_optimize): Handle inline plt call sequence. (ppc_elf_relax_section): Handle PLTCALL reloc. (ppc_elf_relocate_section): Nop out inline plt call sequence when resolving locally. * elf64-ppc.c (ppc64_elf_howto_raw): Add R_PPC64_PLTSEQ and R_PPC64_PLTCALL entries. Comment R_PPC64_TOCSAVE. (has_tls_get_addr_call): Correct comment. (is_branch_reloc): Add PLTCALL. (is_plt_seq_reloc): New function. (ppc64_elf_check_relocs): Handle PLT16_LO_DS reloc. Set has_tls_reloc for R_PPC64_TLSGD and R_PPC64_TLSLD. Create plt entry for R_PPC64_PLTCALL. (ppc64_elf_tls_optimize): Handle inline plt call sequence. (ppc_type_of_stub): Handle PLTCALL reloc. (toc_adjusting_stub_needed): Likewise. (ppc64_elf_relocate_section): Set "can_plt_call" for PLTCALL reloc insn. Nop out inline plt call sequence when resolving locally. Handle __tls_get_addr inline plt call optimization. elfcpp/ * powerpc.h (R_POWERPC_PLTSEQ, R_POWERPC_PLTCALL): Define. gold/ * powerpc.cc (Target_powerpc::Track_tls::maybe_skip_tls_get_addr_call): Handle inline plt sequence relocs. (Stub_table::Plt_stub_key::Plt_stub_key): Likewise. (Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Likewise. (Target_powerpc::Relocate::relocate): Likewise.
2018-04-09Support PLT16 relocs against local symbolsAlan Modra12-229/+699
Necessary if gcc is to use PLT16 relocs to implement -mlongcall, and there isn't a good technical reason why local symbols should be excluded from PLT16 support. Non-ifunc local symbol PLT entries go in a separate section to other PLT entries. In a fixed position executable they won't need to be relocated, and in a PIE or shared library I chose to not implement lazy relocation. bfd/ * elf64-ppc.c (LOCAL_PLT_ENTRY_SIZE): Define. (struct ppc_stub_hash_entry): Add symtype field. (PLT_KEEP): Define. (struct ppc_link_hash_table): Add pltlocal and relpltlocal. (create_linkage_sections): Create pltlocal and relpltlocal. (ppc64_elf_check_relocs): Allow PLT relocs on local symbols. Set PLT_KEEP. (ppc64_elf_adjust_dynamic_symbol): Keep PLT entries for inline calls. (allocate_dynrelocs): Allocate pltlocal and relpltlocal. (ppc64_elf_size_dynamic_sections): Size pltlocal and relpltlocal. Keep PLT entries for inline calls against locals. (ppc_build_one_stub): Use pltlocal as appropriate. (ppc_size_one_stub): Likewise. (ppc64_elf_size_stubs): Set symtype. (build_global_entry_stubs_and_plt): Init pltlocal and write relpltlocal for globals. (write_plt_relocs_for_local_syms): Likewise for local syms. (ppc64_elf_relocate_section): Support PLT for local syms. * elf32-ppc.c (PLT_KEEP): Define. (struct ppc_elf_link_hash_table): Add pltlocal and relpltlocal. (ppc_elf_create_glink): Create pltlocal and relpltlocal. (ppc_elf_check_relocs): Allow PLT relocs on local symbols. Set PLT_KEEP. Adjust update_local_sym_info call. (ppc_elf_adjust_dynamic_symbol): Keep PLT entries for inline calls. (allocate_dynrelocs): Allocate pltlocal and relpltlocal. (ppc_elf_size_dynamic_sections): Size pltlocal and relpltlocal. (ppc_elf_relocate_section): Support PLT16 relocs for local syms. (write_global_sym_plt): Init pltlocal and write relpltlocal. (ppc_finish_symbols): Likewise for locals. ld/ * emulparams/elf32ppc.sh (OTHER_RELRO_SECTIONS_2): Add .branch_lt. (OTHER_GOT_RELOC_SECTIONS): Add .rela.branch_lt. * testsuite/ld-powerpc/elfv2so.d: Update for symbol/stub reordering. * testsuite/ld-powerpc/relbrlt.d: Likewise. * testsuite/ld-powerpc/relbrlt.s: Likewise. * testsuite/ld-powerpc/tlsso.r: Likewise. * testsuite/ld-powerpc/tlstocso.r: Likewise. gold/ * powerpc.cc (Target_powerpc::lplt_): New variable. (Target_powerpc::lplt_section): Associated accessor. (Target_powerpc::plt_off): Handle local non-ifunc symbols. (Target_powerpc::make_lplt_section): New function. (Target_powerpc::make_local_plt_entry): New function. (Powerpc_relobj::do_relocate_sections): Write out lplt. (Output_data_plt_powerpc::first_plt_entry_offset): Zero for lplt. (Output_data_plt_powerpc::add_local_entry): New function. (Output_data_plt_powerpc::do_write): Ignore lplt. (Target_powerpc::make_iplt_section): Make lplt first. (Target_powerpc::make_brlt_section): Make .branch_lt relro. (Target_powerpc::Scan::local): Handle PLT16 relocs.
2018-04-09Rearrange PLT reloc output on powerpcAlan Modra6-244/+493
The current scheme where we output PLT relocs for global symbols in finish_dynamic_symbol, and PLT relocs for local symbols when outputting stubs does not work if PLT entries are to be used for inline PLT sequences against non-dynamic globals or local symbols. bfd/ * elf64-ppc.c (ppc_build_one_stub): Move output of PLT relocs for local symbols to.. (write_plt_relocs_for_local_syms): ..here. New function. (ppc64_elf_finish_dynamic_symbol): Move output of PLT relocs for global symbols to.. (build_global_entry_stubs_and_plt): ..here. Rename from build_global_entry_stubs. (ppc64_elf_build_stubs): Always call build_global_entry_stubs_and_plt. Call write_plt_relocs_for_local_syms. * elf32-ppc.c (get_sym_h): New function. (ppc_elf_relax_section): Use get_sym_h. (ppc_elf_relocate_section): Move output of PLT relocs and glink stubs for local symbols to.. (ppc_finish_symbols): ..here. New function. (ppc_elf_finish_dynamic_symbol): Move output of PLT relocs for global syms to.. (write_global_sym_plt): ..here. New function. * elf32-ppc.h (ppc_elf_modify_segment_map): Delete attribute. (ppc_finish_symbols): Declare. ld/ * ppc32elf.em (ppc_finish): Call ppc_finish_symbols.
2018-04-09PowerPC PLT16 relocationsAlan Modra5-75/+262
The PowerPC64 ELFv2 ABI and the PowerPC SysV ABI support a number of relocations that can be used to create and access a PLT entry. However, the relocs are not well defined. The PLT16 family of relocs talk about "the section offset or address of the procedure linkage table entry". It's plain that we do need a relative address when PIC as otherwise we'd have dynamic text relocations, but "section offset" doesn't specify which section. The most obvious one, ".plt", isn't that useful because there is no readily available way of addressing the start of the ".plt" section. Much more useful would be "the GOT/TOC-pointer relative offset of the procedure linkage table entry", and I suppose you could argue that is a "section offset" of sorts. For PowerPC64 it is better to use the same TOC-pointer relative addressing even when non-PIC, since ".plt" may be located outside the range of a 32-bit address. However, for ppc32 we do want an absolute address when non-PIC as a GOT pointer may not be set up. Also, for ppc32 PIC we have a similar situation to R_PPC_PLTREL24 in that the GOT pointer is set to a location in the .got2 section and we need to specify the .got2 offset in the PLT16 reloc addend. This patch supports PLT16 relocations using these semantics. This is not an ABI change for ppc32 since the relocations were not previously supported by GNU ld, but is for ppc64 where some of the PLT16 relocs were supported. I'm not particularly concerned since the old ppc64 PLT16 reloc semantics made them almost completely useless. bfd/ * elf32-ppc.c (ppc_elf_check_relocs): Handle PLT16 relocs. (ppc_elf_relocate_section): Likewise. * elf64-ppc.c (ppc64_elf_check_relocs): Handle PLT16_LO_DS. (ppc64_elf_relocate_section): Likewise. Correct PLT16 resolution to plt entry relative to toc pointer. gold/ * powerpc.cc (Target_powerpc::plt_off): New functions. (is_plt16_reloc): New function. (Stub_table::plt_off): Use Target_powerpc::plt_off. (Stub_table::plt_call_size): Use plt_off. (Stub_table::do_write): Likewise. (Target_powerpc::Scan::get_reference_flags): Return RELATIVE_REF for PLT16 relocations. (Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Return true for PLT16 relocations. (Target_powerpc::Scan::global): Make a PLT entry for PLT16 relocations. (Target_powerpc::Relocate::relocate): Support PLT16 relocations. (Powerpc_scan_relocatable_reloc::global_strategy): Return RELOC_SPECIAL for ppc32 plt16 relocs.
2018-04-09PowerPC indirect calls to __tls_get_addrAlan Modra3-81/+169
It is possible to construct indirect calls to __tls_get_addr in assembly that confuse TLS optimization. (PowerPC gcc doesn't support such calls, ignoring -mlongcall for __tls_get_addr.) This patch fixes the problem by requiring a TLSLD or TLSGD marker reloc before any insn in an indirect call to __tls_get_addr will be optimized. They also need additional marker relocs defined in a later patch, so don't expect the optimization to work just yet. The point here is to prevent mis-optimization of indirect calls without any marker relocs. The presense of a marker reloc is tracked by a new bit in the tls_mask field of ppc_link_hash_entry and the corresponding lgot_masks unsigned char array for local symbols. Since the field is only 8 bits, we've run out of space. However, tracking TLS use for variables, and tracking IFUNC for functions are independent, and bits can be reused. TLS_TLS is always set for TLS usage, so can be used to select the meaning of the other bits. This patch does that even for elf32-ppc.c which hasn't yet run out of space in the field. * elf64-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL, TLS_TPRELGD, TLS_EXPLICIT): Renumber. Test TLS_TLS throughout file when other TLS flags are tested in a mask. (TLS_MARK, NON_GOT): Define. (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well. (update_local_sym_info): Don't create got entry when NON_GOT. (ppc64_elf_check_relocs): Pass NON_GOT with PLT_IFUNC. Set TLS_MARK. (get_tls_mask): Do toc lookup if tls_mask is just TLS_MARK. (ppc64_elf_relocate_section): Likewise. (ppc64_elf_tls_optimize): Don't attempt to optimize indirect __tls_get_addr calls lacking a marker reloc. * elf32-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL, TLS_TPRELGD): Renumber. Update comment. (TLS_MARK, NON_GOT): Define. (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well. (update_local_sym_info): Don't create got entry when NON_GOT. (ppc_elf_check_relocs): Pass NON_GOT with PLT_IFUNC. Set TLS_MARK. (ppc_elf_tls_optimize): Don't attempt to optimize indirect __tls_get_addr calls lacking a marker reloc.
2018-04-09Automatic date update in version.inGDB Administrator1-1/+1
2018-04-08Automatic date update in version.inGDB Administrator1-1/+1
2018-04-07Fix gdb.mi/mi-stack.exp when gcc generates a stack protectorSimon Marchi3-5/+11
I see some failures in the gdb.mi/mi-stack.exp test. The test runs to the callee4 function: int callee4 (void) { int A=1; int B=2; int C; int D[3] = {0, 1, 2}; C = A + B; return 0; } and expects to be stopped at the A=1 line. However, when gcc generates some stack protection code, it will stop at the { instead, as shown by this disassembly (after I did "break callee4" and "run"): (gdb) disassemble /s Dump of assembler code for function callee4: /home/simark/src/binutils-gdb/gdb/testsuite/gdb.mi/mi-stack.c: 26 { 0x00005555555546ca <+0>: push %rbp 0x00005555555546cb <+1>: mov %rsp,%rbp 0x00005555555546ce <+4>: sub $0x20,%rsp => 0x00005555555546d2 <+8>: mov %fs:0x28,%rax 0x00005555555546db <+17>: mov %rax,-0x8(%rbp) 0x00005555555546df <+21>: xor %eax,%eax 27 int A=1; /* callee4 begin */ 0x00005555555546e1 <+23>: movl $0x1,-0x20(%rbp) 28 int B=2; 0x00005555555546e8 <+30>: movl $0x2,-0x1c(%rbp) The rest of the test relies on execution stopping on the A=1, so many things fail after that. This patch uses mi_continue_to_line instead, to stop at the A=1 line precisely. gdb/testsuite/ChangeLog: * gdb.mi/mi-stack.exp (test_stack_frame_listing): Use mi_continue_to_line. * gdb.mi/mi-stack.c (callee4): Add comment.
2018-04-07Fix indentation in gdb.mi/mi-stack.expSimon Marchi2-55/+58
This patch fixes the indentation in gdb.mi/mi-stack.exp, which is a bit inconsistent. gdb/testsuite/ChangeLog: * gdb.mi/mi-stack.exp: Fix indentation.
2018-04-07Replace make_cleanup_restore_current_traceframe with RAII classSimon Marchi4-39/+33
I put the constructor in tracepoint.c because it needs to read traceframe_number, and I prefer to do that than to expose traceframe_number. gdb/ChangeLog: * tracepoint.c (struct current_traceframe_cleanup): Remove. (do_restore_current_traceframe_cleanup): Remove. (restore_current_traceframe_cleanup_dtor): Remove. (make_cleanup_restore_current_traceframe): Remove. (scoped_restore_current_traceframe::scoped_restore_current_traceframe): New. * tracepoint.h (struct scoped_restore_current_traceframe): New. * infrun.c (fetch_inferior_event): Use scoped_restore_current_traceframe.
2018-04-07Make dwarf2_per_objfile::all_type_units an std::vectorSimon Marchi4-92/+84
Make all_type_units an std::vector, remove n_type_units/n_allocated_type_units and some manual memory management. gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) <n_type_units>: Remove. <n_allocated_type_units>: Remove. <all_type_units>: Change to std::vector. * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust to std::vector change. (dwarf2_per_objfile::get_cutu): Likewise. (dwarf2_per_objfile::get_tu): Likewise. (create_signatured_type_table_from_index): Likewise. (create_signatured_type_table_from_debug_names): Likewise. (dw2_symtab_iter_next): Likewise. (dw2_print_stats): Likewise. (dw2_expand_all_symtabs): Likewise. (dw2_expand_marked_cus): Likewise. (dw2_debug_names_iterator::next): Likewise. (dwarf2_initialize_objfile): Likewise. (add_signatured_type_cu_to_table): Likewise. (create_all_type_units): Likewise. (add_type_unit): Likewise. (struct tu_abbrev_offset): Add constructor. (build_type_psymtabs_1): Adjust to std::vector change. (print_tu_stats): Likewise. * dwarf-index-write.c (check_dwarf64_offsets): Likewise. (write_debug_names): Likewise.
2018-04-07Make dwarf2_per_objfile::all_comp_units an std::vectorSimon Marchi4-148/+113
Make all_comp_units an std::vector, remove n_comp_units and some manual memory management. gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) <all_comp_units>: Likewise. Make an std::vector. <n_comp_units>: Remove. * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust to std::vector change. (dwarf2_per_objfile::get_cutu): Likewise. (dwarf2_per_objfile::get_cu): Likewise. (create_cus_from_index): Likewise. (create_addrmap_from_index): Likewise. (create_addrmap_from_aranges): Likewise. (dwarf2_read_index): Likewise. (dw2_find_last_source_symtab): Likewise. (dw2_map_symtabs_matching_filename): Likewise. (dw2_symtab_iter_next): Likewise. (dw2_print_stats): Likewise. (dw2_expand_all_symtabs): Likewise. (dw2_expand_symtabs_with_fullname): Likewise. (dw2_expand_marked_cus): Likewise. (dw2_map_symbol_filenames): Likewise. (create_cus_from_debug_names): Likewise. (dwarf2_read_debug_names): Likewise. (dw2_debug_names_iterator::next): Likewise. (dwarf2_initialize_objfile): Likewise. (set_partial_user): Likewise. (dwarf2_build_psymtabs_hard): Likewise. (read_comp_units_from_section): Remove arguments, adjust to std::vector change. (create_all_comp_units): Adjust to std::vector and read_comp_units_from_section changes. (dwarf2_find_containing_comp_unit): Adjust to std::vector change. * dwarf-index-write.c (check_dwarf64_offsets): Likewise. (psyms_seen_size): Likewise. (write_gdbindex): Likewise. (write_debug_names): Likewise.
2018-04-07Remove some usages of get_dwarf2_per_objfileSimon Marchi2-35/+36
This patch removes some usages of get_dwarf2_per_objfile, where we can get hold of the dwarf2_per_objfile object in a simpler way. For example, it's simpler (and slightly less work) to pass dwarf2_per_objfile and get the objfile from it than to pass the objfile and call get_dwarf2_per_objfile. Ideally, get_dwarf2_per_objfile should only be used in the entry points of the dwarf2 code, where we receive an objfile. gdb/ChangeLog: * dwarf2read.c (create_cus_from_index_list): Replace objfile arg with dwarf2_per_objfile. (create_cus_from_index): Likewise. (create_signatured_type_table_from_index): Likewise. (dwarf2_read_index): Likewise. (dwarf2_initialize_objfile): Likewise. (dwarf2_fetch_die_loc_sect_off): Get dwarf2_per_objfile from per_cu rather than get_dwarf2_per_objfile.
2018-04-07Replace dw2_get_cu/dw2_get_cutu with methods of dwarf2_per_objfileSimon Marchi3-47/+90
Those two functions look like good candidates to become methods of dwarf2_per_objfile. I did that, and added get_tu as well. When replacing usages of dw2_get_cutu, I changed some instances to get_cutu and others to get_cu, when appropriate (when we know we want a CU and not a TU). gdb/ChangeLog: * dwarf2read.h (struct signatured_type): Forward declare. (struct dwarf2_per_objfile) <get_cutu, get_cu, get_tu>: New methods. * dwarf2read.c (dwarf2_per_objfile::get_cutu): Rename from... (dw2_get_cutu): ...this. (dwarf2_per_objfile::get_cu): Rename from... (dw2_get_cu): ...this. (dwarf2_per_objfile::get_tu): New. (create_addrmap_from_index): Adjust. (create_addrmap_from_aranges): Adjust. (dw2_find_last_source_symtab): Adjust. (dw2_map_symtabs_matching_filename): Adjust. (dw2_symtab_iter_next): Adjust. (dw2_print_stats): Adjust. (dw2_expand_all_symtabs): Adjust. (dw2_expand_symtabs_with_fullname): Adjust. (dw2_expand_marked_cus): Adjust. (dw_expand_symtabs_matching_file_matcher): Adjust. (dw2_map_symbol_filenames): Adjust. (dw2_debug_names_iterator::next): Adjust. (dwarf2_initialize_objfile): Adjust. (set_partial_user): Adjust. (dwarf2_build_psymtabs_hard): Adjust.
2018-04-07Remove some unused variables in dwarf2read.cSimon Marchi2-23/+9
Most of them are obvious. The ones in dwarf2_record_block_ranges are less obvious, because it is a bit suspicious to have that many variables unused. But after inspection, it seems like it dates from commit 5f46c5a54825 ("Code cleanup: Split dwarf2_ranges_read to a callback"), where dwarf2_record_block_ranges was made to use dwarf2_ranges_process, which contains the same functionality. gdb/ChangeLog: * dwarf2read.c (create_signatured_type_table_from_debug_names): Remove unused variables. (dw2_map_symtabs_matching_filename): Likewise. (dwarf2_record_block_ranges): Likewise. (dwarf2_read_addr_index): Likewise. (follow_die_offset): Likewise.
2018-04-07Defer breakpoint reset when cloning progspace for fork childSimon Marchi2-1/+7
Using this simple test: static void break_here () { } int main (int argc, char *argv[]) { fork (); break_here(); return 0; } compiled as a PIE: $ gcc test.c -g3 -O0 -o test -pie and running this: $ ./gdb -nx -q --data-directory=data-directory ./test -ex "b break_here" -ex "set detach-on-fork off" -ex r gives: Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x64a Note that GDB might get stopped by SIGTTOU because of this issue: https://sourceware.org/bugzilla/show_bug.cgi?id=23020 In that case, just use "fg" to continue. This issue happens only with position-independent executables. Adding the main objfile for the new inferior (the fork child) causes GDB to try to reset the breakpoints. However, that new objfile has not been relocated yet. So the breakpoint on "break_here" resolves to an unrelocated address, from which we are trying to read/write to set a breakpoint. Passing SYMFILE_DEFER_BP_RESET avoids that problem. The executable is relocated just after, in the follow_fork_inferior function. The buildbot seems happy with this patch. I don't think it's necessary to add a new test. Just changing this made many tests go from FAIL to PASS on my machine, where gcc produces PIE executables by default. If anything, I think we would need to add a board file that produces position-independent executables, so that we can run all the tests with PIE, even on machines where that is not the default. gdb/ChangeLog: * progspace.c (clone_program_space): Pass SYMFILE_DEFER_BP_RESET to symbol_file_add_main.
2018-04-07Implement write_async_safe for mi_console_file (PR 22299)Simon Marchi6-28/+82
Enabling "set debug lin-lwp 1" with the MI interpreter doesn't work. When the sigchld_handler function wants to print a debug output ("sigchld\n"), it uses ui_file_write_async_safe. This ends up in the default implementation of ui_file::write_async_safe, which aborts GDB. This patch implements the write_async_safe method for mi_console_file. The "normal" MI output is line buffered, which means the output accumulates in m_buffer until a \n is written, at which point it's flushed in m_raw. The implementation of write_async_safe provided by this patch bypasses this buffer and writes directly to m_raw. There are two reasons for this: (1) Appending to m_buffer (therefore to an std::string) is probably not async-safe, as it may allocate memory. (2) We may have a partial output already in m_buffer, so that would lead to some nested MI output, not so great. There is probably still a chance to have bad MI output, if sigchld_handler is invoked in the middle of mi_console_file's flush, and the line being flushed is only partially sent to m_raw. The solution would probably be to block signals during flushing. Since this is only used for debug output, I don't know if it's worth the effort to do that. To implement write_async_safe, I needed to use the fputstrn_unfiltered, which does the necessary escaping (e.g. replace \n with \\n). I started by adding printchar's callback parameters to fputstrn_unfiltered, to be able to pass async-safe versions of them. It's not easy to provide an async-safe version of do_fprintf, but it turns out that we can easily replace printchar's callbacks with a single do_fputc quite easily. The async-safe version of do_fputc simply calls the underlying ui_file's write_async_safe method. gdb/ChangeLog: PR mi/22299 * mi/mi-console.c (do_fputc_async_safe): New. (mi_console_file::write_async_safe): New. (mi_console_file::flush): Adjust calls to fputstrn_unfiltered. * mi/mi-console.h (class mi_console_file) <write_async_safe>: New. * ui-file.c (ui_file::putstrn): Adjust call to fputstrn_unfiltered. * utils.c (printchar): Replace do_fputs and do_fprintf parameters by do_fputc. (fputstr_filtered): Adjust call to printchar. (fputstr_unfiltered): Likewise. (fputstrn_filtered): Likewise. (fputstrn_unfiltered): Add do_fputc parameter, pass to printchar. * utils.h (do_fputc_ftype): New typedef. (fputstrn_unfiltered): Add do_fputc parameter.
2018-04-07Remove stale file i386-avx.datSimon Marchi2-54/+4
I noticed that regformats/i386/i386-avx.dat did not get re-generated when doing "make" in the features directory. I think it's a leftover from commit f5a29eb0a663 ("Clean up x86 non-linux GDBserver target descriptions") I build-tested gdbserver with amd64 and i386. gdb/ChangeLog: * regformats/i386/i386-avx.dat: Remove.
2018-04-07Fix generation of x86-64 gdbarch with osabi none (PR 22979)Simon Marchi5-8/+88
When a 64-bits (x86-64) gdbarch is created, it is first born as a 32-bits gdbarch in i386_gdbarch_init. The call gdbarch_init_osabi will call the handler register for the selected (arch, osabi) pair, such as amd64_linux_init_abi. The various amd64 handlers call amd64_init_abi, which turns the gdbarch into a 64-bits one. When selecting the i386:x86-64 architecture with no osabi, no such handler is ever called, so the gdbarch stays (wrongfully) a 32-bits one. My first idea was to manually call amd64_init_abi & al in i386_gdbarch_init when the osabi is GDB_OSABI_NONE. However, this doesn't work in a build of GDB where i386 is included as a target but not amd64. My next option (implemented in this patch), is to allow registering handlers for GDB_OSABI_NONE. I added two such handlers in amd64-tdep.c, so now it works the same as for the "normal" osabis. It required re-ordering things in gdbarch_init_osabi to allow running handlers for GDB_OSABI_NONE. Without this patch applied (but with the previous one*) : (gdb) set osabi none (gdb) set architecture i386:x86-64 The target architecture is assumed to be i386:x86-64 (gdb) p sizeof(void*) $1 = 4 and now: (gdb) set osabi none (gdb) set architecture i386:x86-64 The target architecture is assumed to be i386:x86-64 (gdb) p sizeof(void*) $1 = 8 * Before the previous patch, which fixed "set osabi none", this bug was hidden because we didn't actually try to generate a gdbarch for no osabi, it would always fall back on Linux. Generating the gdbarch for amd64/linux did work. gdb/ChangeLog: PR gdb/22979 * amd64-tdep.c (amd64_none_init_abi): New function. (amd64_x32_none_init_abi): New function. (_initialize_amd64_tdep): Register handlers for x86-64 and x64_32 with GDB_OSABI_NONE. * osabi.c (gdbarch_init_osabi): Allow running handlers for the GDB_OSABI_NONE osabi. gdb/testsuite/ChangeLog: PR gdb/22979 * gdb.arch/amd64-osabi.exp: New file.
2018-04-07Make "set osabi none" really work (PR 22980)Simon Marchi6-11/+50
I was looking for a way to reproduce easily PR 22979 by doing this: (gdb) set architecture i386:x86-64 (gdb) set osabi none However, I noticed that even though I did "set osabi none", the gdbarch gdb created was for Linux: (gdb) set debug arch 1 (gdb) set architecture i386:x86-64 ... (gdb) set osabi none gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 gdbarch_find_by_info: info.byte_order 1 (little) gdbarch_find_by_info: info.osabi 4 (GNU/Linux) <--- Wrong? gdbarch_find_by_info: info.abfd 0x0 gdbarch_find_by_info: info.tdep_info 0x0 gdbarch_find_by_info: Previous architecture 0x1e6fd30 (i386:x86-64) selected gdbarch_update_p: Architecture 0x1e6fd30 (i386:x86-64) unchanged This is because the value GDB_OSABI_UNKNOWN has an unclear role, sometimes meaning "no osabi" and sometimes "please selected automatically". Doing "set osabi none" sets the requested osabi to GDB_OSABI_UNKNOWN, in which case gdbarch_info_fill overrides it with a value from the target description, or the built-in default osabi. This means that it's impossible to force GDB not to use an osabi with "set osabi". Since my GDB's built-in default osabi is Linux, it always falls back to GDB_OSABI_LINUX. To fix it, I introduced GDB_OSABI_NONE, which really means "I don't want any osabi". GDB_OSABI_UNKNOWN can then be used only for "not set yet, please auto-detect". GDB_OSABI_UNINITIALIZED now seems unnecessary since it overlaps with GDB_OSABI_UNKNOWN, so I think it can be removed and gdbarch_info::osabi can be initialized to GDB_OSABI_UNKNOWN. gdb/ChangeLog: PR gdb/22980 * defs.h (enum gdb_osabi): Remove GDB_OSABI_UNINITIALIZED, add GDB_OSABI_NONE. * arch-utils.c (gdbarch_info_init): Don't set info->osabi. * osabi.c (gdb_osabi_names): Add "unknown" entry. gdb/testsuite/ChangeLog: PR gdb/22980 * gdb.base/osabi.exp: New file.
2018-04-07Make target_read_alloc & al return vectorsSimon Marchi18-225/+224
This patch started by changing target_read_alloc_1 to return a byte_vector, to avoid manual memory management (in target_read_alloc_1 and in the callers). To communicate failures to the callers, it actually returns a gdb::optional<gdb::byte_vector>. Adjusting target_read_stralloc was a bit more tricky, since it wants to return a buffer of char, and not gdb_byte. Since you can't just cast a gdb::byte_vector into a gdb::def_vector<char>, I made target_read_alloc_1 templated, so both versions (that return vectors of gdb_byte and char) are generated. Since target_read_stralloc now returns a gdb::char_vector instead of a gdb::unique_xmalloc_ptr<char>, a few callers need to be adjusted. gdb/ChangeLog: * common/byte-vector.h (char_vector): New type. * target.h (target_read_alloc): Return gdb::optional<byte_vector>. (target_read_stralloc): Return gdb::optional<char_vector>. (target_get_osdata): Return gdb::optional<char_vector>. * target.c (target_read_alloc_1): Templatize. Replacement manual memory management with vector. (target_read_alloc): Change return type, adjust. (target_read_stralloc): Change return type, adjust. (target_get_osdata): Change return type, adjust. * auxv.c (struct auxv_info) <length>: Remove. <data>: Change type to gdb::optional<byte_vector>. (auxv_inferior_data_cleanup): Free auxv_info with delete. (get_auxv_inferior_data): Allocate auxv_info with new, adjust. (target_auxv_search): Adjust. (fprint_target_auxv): Adjust. * avr-tdep.c (avr_io_reg_read_command): Adjust. * linux-tdep.c (linux_spu_make_corefile_notes): Adjust. (linux_make_corefile_notes): Adjust. * osdata.c (get_osdata): Adjust. * remote.c (remote_get_threads_with_qxfer): Adjust. (remote_memory_map): Adjust. (remote_traceframe_info): Adjust. (btrace_read_config): Adjust. (remote_read_btrace): Adjust. (remote_pid_to_exec_file): Adjust. * solib-aix.c (solib_aix_get_library_list): Adjust. * solib-dsbt.c (decode_loadmap): Don't free buf. (dsbt_get_initial_loadmaps): Adjust. * solib-svr4.c (svr4_current_sos_via_xfer_libraries): Adjust. * solib-target.c (solib_target_current_sos): Adjust. * tracepoint.c (sdata_make_value): Adjust. * xml-support.c (xinclude_start_include): Adjust. (xml_fetch_content_from_file): Adjust. * xml-support.h (xml_fetch_another): Change return type. (xml_fetch_content_from_file): Change return type. * xml-syscall.c (xml_init_syscalls_info): Adjust. * xml-tdesc.c (file_read_description_xml): Adjust. (fetch_available_features_from_target): Change return type. (target_fetch_description_xml): Adjust. (target_read_description_xml): Adjust.
2018-04-06Further improve warnings for relocations referring to discarded sections.Cary Coutant7-116/+249
Relocations referring to discarded sections are now treated as errors instead of warnings. Also with this patch, we will now print the section group signature and the object file with the prevailing definition of that group along with the name of the symbol that the relocation is referring to. This additional information should be much more useful to anyone trying to track down the source of such errors. To do so, we now map each discarded section to the Kept_section info in the Layout class, and defer the logic that maps a discarded section to its counterpart in the kept group. This gives us the information we need to identify the signature symbol given the discarded section, and the name of the object file that provided the prevailing (i.e., first) definition of that group. gold/ * object.cc (Sized_relobj_file::include_section_group): Store reference to Kept_section info for discarded comdat sections regardless of size. Move size checking to map_to_kept_section. (Sized_relobj_file::include_linkonce_section): Likewise. (Sized_relobj_file::map_to_kept_section): Add section name parameter. Insert size checking logic from above functions. (Sized_relobj_file::find_kept_section_object): New method. (Sized_relobj_file::get_symbol_name): New method. * object.h (Sized_relobj_file::map_to_kept_section): Add section_name parameter. Adjust all callers. (Sized_relobj_file::find_kept_section_object): New method. (Sized_relobj_file::get_symbol_name): New method. (Sized_relobj_file::Kept_comdat_section): Replace object and shndx fields with sh_size, kept_section, symndx, and is_comdat fields. (Sized_relobj_file::set_kept_comdat_section): Replace kept_object and kept_shndx parameters with is_comdat, symndx, sh_size, and kept_section. (Sized_relobj_file::get_kept_comdat_section): Likewise. * target-reloc.h (enum Comdat_behavior): Change CB_WARNING to CB_ERROR. Adjust all references. (issue_undefined_symbol_error): New function template. (relocate_section): Pass section name to map_to_kept_section. Move discarded section code to new function above. * aarch64.cc (Target_aarch64::scan_reloc_section_for_stubs): Move declaration for gsym out one level. Call issue_discarded_error. * arm.cc (Target_arm::scan_reloc_section_for_stubs): Likewise. * powerpc.cc (Relocate_comdat_behavior): Change CB_WARNING to CB_ERROR.
2018-04-07Automatic date update in version.inGDB Administrator1-1/+1
2018-04-06Change value::contents to be a unique_xmalloc_ptrTom Tromey2-12/+20
This changes value::contents to be a unique_xmalloc_ptr, removing a small bit of manual memory management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (~value): Update. (struct value) <contents>: Now unique_xmalloc_ptr. (value_contents_bits_eq, allocate_value_contents) (value_contents_raw, value_contents_all_raw) (value_contents_for_printing, value_contents_for_printing_const) (set_value_enclosing_type): Update.
2018-04-06Remove range_s VECTom Tromey2-107/+119
This changes the "optimized_out" and "unavailable" VECs in struct value to be std::vectors, and then fixes up all the uses. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (range_s): Remove typedef, VEC. (struct range): Add operator<. (range_lessthan): Remove. (ranges_contain): Change type. (~value): Update. (struct value) <unavailable, optimized_out>: Now std::vector. (value_entirely_available) (value_entirely_covered_by_range_vector) (value_entirely_unavailable, value_entirely_optimized_out): Update. (insert_into_bit_range_vector): Change argument type. (find_first_range_overlap): Likewise. (struct ranges_and_idx, value_contents_bits_eq) (require_not_optimized_out, require_available): Update. (ranges_copy_adjusted): Change argument types. (value_optimized_out, value_copy, value_fetch_lazy): Update.
2018-04-06Change value::parent to a value_ref_ptrTom Tromey2-15/+12
This changes value::parent to a value_ref_ptr. This removes a bit of manual reference count management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (~value): Update. (struct value) <parent>: Now a value_ref_ptr. (value_parent, set_value_parent, value_address, value_copy): Update.
2018-04-06Use new and delete for valuesTom Tromey2-48/+56
This adds a constructor and destructor to struct value, and then changes value.c to use "new" and "delete". While doing this I noticed a memory leak -- value_decref was not freeing value::optimized_out. This patch fixes this leak. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (struct value): Add constructor, destructor, and member initializers. (allocate_value_lazy, value_decref): Update.
2018-04-06Remove value::next and value::releasedTom Tromey2-68/+36
This patch converts all_values to simply hold a list of references to values. Now, there's no need to have a value record whether or not it is released -- there is only a single reference-counting mechanism for values. So, this also removes value::next, value::released, and value_next. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (struct value) <released, next>: Remove. (all_values): Now a std::vector. (allocate_value_lazy): Update. (value_next): Remove. (value_mark, value_free_to_mark, release_value) (value_release_to_mark): Update.
2018-04-06Remove free_value_chainTom Tromey6-73/+69
This patch changes value_release_to_mark and fetch_subexp_value to return a std::vector of value references, rather than relying on the "next" field that is contained in a struct value. This makes it simpler to reason about the returned values, and also allows for the removal of free_value_chain. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.h (fetch_subexp_value, value_release_to_mark): Update. (free_value_chain): Remove. * value.c (free_value_chain): Remove. (value_release_to_mark): Return a std::vector. * ppc-linux-nat.c (num_memory_accesses): Change "chain" to a std::vector. (check_condition): Update. * eval.c (fetch_subexp_value): Change "val_chain" to a std::vector. * breakpoint.c (update_watchpoint): Update. (can_use_hardware_watchpoint): Change "vals" to a std::vector.
2018-04-06Remove free_all_valuesTom Tromey3-22/+5
free_all_values is unused, so this removes it. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.h (free_all_values): Remove. * value.c (free_all_values): Remove.
2018-04-06Change value history to use value_ref_ptrTom Tromey2-54/+20
This simplifies the value history implementation by replacing the current data structure with a std::vector, and by making the value history simply hold a reference to each value. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (VALUE_HISTORY_CHUNK, struct value_history_chunk) (value_history_chain, value_history_count): Remove. (value_history): New global. (record_latest_value, access_value_history, show_values) (preserve_values): Update.
2018-04-06Change varobj to use value_ref_ptrTom Tromey5-36/+54
This changes varobj to use value_ref_ptr, allowing the removal of some manual reference count management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * varobj.h (struct varobj) <value>: Now a value_ref_ptr. * varobj.c (varobj_set_display_format, varobj_set_value) (install_default_visualizer, construct_visualizer) (install_new_value, ~varobj, varobj_get_value_type) (my_value_of_variable, varobj_editable_p): Update. * c-varobj.c (c_describe_child, c_value_of_variable) (cplus_number_of_children, cplus_describe_child): Update. * ada-varobj.c (ada_number_of_children, ada_name_of_child) (ada_path_expr_of_child, ada_value_of_child, ada_type_of_child) (ada_value_of_variable, ada_value_is_changeable_p): Update.
2018-04-06Change last_examine_value to value_ref_ptrTom Tromey2-13/+14
This patch removes some manual reference count manipulation by changing last_examine_value to be a value_ref_ptr and then updating the users. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * printcmd.c (last_examine_address): Change type to value_ref_ptr. (do_examine, x_command): Update.
2018-04-06Change breakpoints to use value_ref_ptrTom Tromey4-52/+46
Now that value_ref_ptr exists, it is possible to simplify breakpoint and bpstat memory management by using a value_ref_ptr rather than manually handling the reference counts. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (release_value): Update. * breakpoint.h (struct watchpoint) <val>: Now a value_ref_ptr. (struct bpstats) <val>: Now a value_ref_ptr. * breakpoint.c (update_watchpoint, breakpoint_init_inferior) (~bpstats, bpstats, bpstat_clear_actions, watchpoint_check) (~watchpoint, print_it_watchpoint, watch_command_1) (invalidate_bp_value_on_memory_change): Update.
2018-04-06Introduce a gdb_ref_ptr specialization for struct valueTom Tromey19-114/+136
struct value is internally reference counted and so, while it also has some ownership rules unique to it, it makes sense to use a gdb_ref_ptr when managing it automatically. This patch removes the existing unique_ptr specialization in favor of a reference-counted pointer. It also introduces two other clarifications: 1. Rename value_free to value_decref, which I think is more in line with what the function actually does; and 2. Change release_value to return a gdb_ref_ptr. This change allows us to remove the confusing release_value_or_incref function, primarily by making it much simpler to reason about the result of release_value. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * varobj.c (varobj_clear_saved_item) (update_dynamic_varobj_children, install_new_value, ~varobj): Update. * value.h (value_incref): Move declaration earlier. (value_decref): Rename from value_free. (struct value_ref_policy): New. (value_ref_ptr): New typedef. (struct value_deleter): Remove. (gdb_value_up): Remove typedef. (release_value): Change return type. (release_value_or_incref): Remove. * value.c (set_value_parent): Update. (value_incref): Change return type. (value_decref): Rename from value_free. (value_free_to_mark, free_all_values, free_value_chain): Update. (release_value): Return value_ref_ptr. (release_value_or_incref): Remove. (record_latest_value, set_internalvar, clear_internalvar): Update. * stack.c (info_frame_command): Don't call value_free. * python/py-value.c (valpy_dealloc, valpy_new) (value_to_value_object): Update. * printcmd.c (do_examine): Update. * opencl-lang.c (lval_func_free_closure): Update. * mi/mi-main.c (register_changed_p): Don't call value_free. * mep-tdep.c (mep_frame_prev_register): Don't call value_free. * m88k-tdep.c (m88k_frame_prev_register): Don't call value_free. * m68hc11-tdep.c (m68hc11_frame_prev_register): Don't call value_free. * guile/scm-value.c (vlscm_free_value_smob) (vlscm_scm_from_value): Update. * frame.c (frame_register_unwind, frame_unwind_register_signed) (frame_unwind_register_unsigned, get_frame_register_bytes) (put_frame_register_bytes): Don't call value_free. * findvar.c (address_from_register): Don't call value_free. * dwarf2read.c (dwarf2_compute_name): Don't call value_free. * dwarf2loc.c (entry_data_value_free_closure) (value_of_dwarf_reg_entry, free_pieced_value_closure) (dwarf2_evaluate_loc_desc_full): Update. * breakpoint.c (update_watchpoint, breakpoint_init_inferior) (~bpstats, bpstats, bpstat_clear_actions, watchpoint_check) (~watchpoint, watch_command_1) (invalidate_bp_value_on_memory_change): Update. * alpha-tdep.c (alpha_register_to_value): Don't call value_free.
2018-04-06Add -Wno-error=deprecated-register to gdb build flagsSimon Marchi3-2/+10
As shown in PR 23022, building with clang-6 and Python 2 trips on the fact that the Python 2 headers use the "register" keyword: /usr/include/python2.7/unicodeobject.h:534:5: error: 'register' storage class specifier is deprecated and incompatible with C++17 [-Werror,-Wdeprecated-register] register PyObject *obj, /* Object */ ^~~~~~~~~ This patch adds -Wno-error=deprecated-register to our flags, so that we can still see this class of warnings, but they don't cause a build failure. gdb/ChangeLog: PR gdb/23022 * warning.m4: Add -Wno-error=deprecated-register. * configure: Re-generate.
2018-04-06Display all DWARF 5 language namesTom Tromey2-0/+15
I happened to notice that objdump was not printing "Rust" when showing the DW_AT_language for a CU: <10> DW_AT_language : 28 (Unknown: 1c) This patch adds all the new language constants from DWARF 5 to binutils/dwarf.c. 2018-04-06 Tom Tromey <tom@tromey.com> * dwarf.c (read_and_display_attr_value): Add missing DW_LANG constants from DWARF 5.
2018-04-06x86-64: Don't mask out R_X86_64_converted_reloc_bitH.J. Lu2-3/+5
R_X86_64_converted_reloc_bit is set in elf_x86_64_convert_load_reloc which is called from elf_x86_64_check_relocs. Since it is used only internally by linker, there is no need to mask it out in elf_x86_64_info_to_howto. * elf64-x86-64.c (elf_x86_64_info_to_howto): Don't mask out R_X86_64_converted_reloc_bit.
2018-04-06Automatic date update in version.inGDB Administrator1-1/+1
2018-04-05Use dlsym to check if libdl is needed for pluginH.J. Lu10-60/+85
config/plugins.m4 has if test "$plugins" = "yes"; then AC_SEARCH_LIBS([dlopen], [dl]) fi Plugin uses dlsym, but libasan.so only intercepts dlopen, not dlsym: [hjl@gnu-tools-1 binutils-text]$ nm -D /lib64/libasan.so.4| grep " dl" 0000000000038580 W dlclose U dl_iterate_phdr 000000000004dc50 W dlopen U dlsym U dlvsym [hjl@gnu-tools-1 binutils-text]$ Testing dlopen for libdl leads to false negative when -fsanitize=address is used. It results in link failure: ../bfd/.libs/libbfd.a(plugin.o): undefined reference to symbol 'dlsym@@GLIBC_2.16' dlsym should be used to check if libdl is needed for plugin. bfd/ PR gas/22318 * configure: Regenerated. binutils/ PR gas/22318 * configure: Regenerated. gas/ PR gas/22318 * configure: Regenerated. gprof/ PR gas/22318 * configure: Regenerated. ld/ PR gas/22318 * configure: Regenerated.
2018-04-05config: Sync with GCCH.J. Lu3-3/+28
Sync with GCC 2018-04-05 H.J. Lu <hongjiu.lu@intel.com> PR gas/22318 * plugins.m4 (AC_PLUGINS): Use dlsym to check if libdl is needed. 2018-02-14 Igor Tsimbalist <igor.v.tsimbalist@intel.com> PR target/84148 * cet.m4: Check if target support multi-byte NOPS (SSE).
2018-04-05Improve warnings for relocations referring to discarded sections.Cary Coutant2-4/+25
gold/ * target-reloc.h (relocate_section): Add local symbol index or global symbol name to warning about relocation that refers to discarded section.
2018-04-05MIPS/binutils/testsuite: Fix `.dc.l' typo in `strip-13mips64.s'Maciej W. Rozycki2-1/+6
Fix a typo: `.dc.w' -> `.dc.l' in `strip-13mips64.s', correcting a bug from commit 2f8ceb38991e ("binutils/testsuite: Support REL and MIPS64 reloc formats with `strip-13'"). For relocation format correctness only as there is no observable change in test results due to the lack of connection between the second relocation entry affected and the examined error message produced. binutils/ * testsuite/binutils-all/strip-13mips64.s: Use `.dc.l' rather than `.dc.w' in second relocation.
2018-04-05Revert previous patch and apply revised patch.Cary Coutant2-33/+19
Revert: 2018-04-05 James Cowgill <james.cowgill@mips.com> PR gold/22770 * mips.cc (Mips_got_info::record_got_page_entry): Fetch existing page entries for the object's GOT. Apply: PR gold/22770 * mips.cc (Mips_got_info::record_got_page_entry): Don't insert Got_page_entry for object's GOT. (Mips_got_info::add_got_page_entries): Add all pages from from's GOT. Rename to add_got_page_count. (Got_page_entry): Remove num_pages.
2018-04-05MIPS: Fix GOT page counter in multi-got linksJames Cowgill2-10/+15
The record_got_page_entry function records and updates the maximum number of GOT page entries which may be required by an object. In the case where an existing GOT page entry was expanded, only the entry belonging to output GOT would have its page count updated. This leaves the entry belonging to the object GOT with the num_pages count of 1 it was originally initialized with. Later on when GOTs are being merged in a multi-got link, this causes the value of entry->num_pages in add_got_page_entries to always be 1 and underestimates the number of pages required for the new entry. This in turn leads to an assertion failure in get_got_page_offset where we run out of pages. Fix by obtaining the object's GOT entry unconditionally and not just the first time it gets created. Now that entry2 is always valid, remove the useless NULL checks. gold/ PR gold/22770 * mips.cc (Mips_got_info::record_got_page_entry): Fetch existing page entries for the object's GOT.
2018-04-05Stop the IA64 linker from removing unwind tables when garbage collecting.Nick Clifton2-2/+9
PR 23030 * emulparams/elf64_ia64.sh (OTHER_READONLY_SECTIONS): Make sure that the .IA_64.unwind_info and .IA_64.unwind sections are not subject to garbage collection.
2018-04-05Remove unnecessary include from linespec.hTom Tromey2-1/+4
linespec.h was inculding vec.h, but doesn't expose any VECs. So, this include can be removed. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.h: Remove include of "vec.h".
2018-04-05Remove typep and VEC(typep) from linespec.cTom Tromey2-25/+16
This removes VEC(typep) from linespec.c in favor of std::vector. It also removes the "typep" typedef. This change allowed the removal of some cleanups. I believe the previous cleanup code in find_superclass_methods could result in a memory leak, so this patch is an improvement in that way as well. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.c (typep): Remove typedef. (find_methods, find_superclass_methods): Take a std::vector. (find_method): Use std::vector.
2018-04-05More use of std::vector in linespec.cTom Tromey6-78/+47
This changes some spots in linespec.c to take a std::vector. This patch spilled out to objc-lang.c a bit as well. This change allows for the removal of some cleanups. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * utils.c (compare_strings): Remove. * utils.h (compare_strings): Remove. * objc-lang.h (find_imps): Update. * objc-lang.c (find_methods): Take a std::vector. (uniquify_strings, find_imps): Likewise. * linespec.c (find_methods): Take a std::vector. (decode_objc): Use std::vector. (add_all_symbol_names_from_pspace, find_superclass_methods): Take a std::vector. (find_method, find_function_symbols): Use std::vector.
2018-04-05Change streq to return boolTom Tromey6-12/+37
I wanted to use streq with std::unique in another (upcoming) patch in this seres, so I changed it to return bool. To my surprise, this lead to regressions. The cause turned out to be that streq was used as an htab callback -- by casting it to the correct function type. This sort of cast is invalid, so this patch adds a variant which is directly suitable for use by htab. (Note that I did not add an overload, as I could not get that to work with template deduction in the other patch.) ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * completer.c (completion_tracker::completion_tracker): Remove cast. (completion_tracker::discard_completions): Likewise. * breakpoint.c (ambiguous_names_p): Remove cast. * ada-lang.c (_initialize_ada_language): Remove cast. * utils.h (streq): Update. (streq_hash): Add new declaration. * utils.c (streq): Return bool. (streq_hash): New function.