This patch introduces aarch64_instr_sequence which is a structure similar to IT
blocks on Arm in order to track instructions that introduce a constraint or
dependency on instruction 1..N positions away from the instruction that opened
the block.
The struct is also wired through to the locations that require it.
gas/
* config/tc-aarch64.c (now_instr_sequence):
(*insn_sequence, now_instr_sequence): New.
(output_operand_error_record, do_encode): Add insn_sequence.
(md_assemble): Update insn_sequence.
(try_to_encode_as_unscaled_ldst, fix_mov_imm_insn, fix_insn):
Pass insn_sequence.
* config/tc-aarch64.h (struct aarch64_segment_info_type):
Add insn_sequence.
include/
* opcode/aarch64.h (struct aarch64_instr_sequence): New.
(aarch64_opcode_encode): Use it.
opcodes/
* aarch64-asm.c (aarch64_opcode_encode): Add insn_sequence.
* aarch64-dis.c (insn_sequence): New.
This patch series is to allow certain instructions such as the SVE MOVPRFX
instruction to apply a constraint/dependency on the instruction at PC+4.
This patch starts this off by marking which instructions impose the constraint
and which instructions must adhere to the constraint. This is done in a
generic way by extending the verifiers.
* The constraint F_SCAN indicates that an instruction opens a sequence and imposes
a constraint on an instructions following it. The length of the sequence depends
on the instruction itself and it handled in the verifier code.
* The C_SCAN_MOVPRFX flag is used to indicate which constrain the instruction is
checked against. An instruction with both F_SCAN and C_SCAN_MOVPRFX starts a
block for the C_SCAN_MOVPRFX instruction, and one with only C_SCAN_MOVPRFX must
adhere to a previous block constraint is applicable.
The SVE instructions in this list have been marked according to the SVE
specification[1].
[1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
include/
* opcode/aarch64.h (struct aarch64_opcode): Add constraints,
extend flags field size.
(F_SCAN, C_SCAN_MOVPRFX, C_MAX_ELEM): New.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN, _CRC_INSN,
_LSE_INSN, _LOR_INSN, RDMA_INSN, FF16_INSN, SF16_INSN, V8_2_INSN,
_SVE_INSN, V8_3_INSN, CNUM_INSN, RCPC_INSN, SHA2_INSN, AES_INSN,
V8_4_INSN, SHA3_INSN, SM4_INSN, FP16_V8_2_INSN, DOT_INSN): Initialize
constraints.
(_SVE_INSNC): New.
(struct aarch64_opcode): (fjcvtzs, ldpsw, ldpsw, esb, psb): Initialize
constraints.
(movprfx): Change _SVE_INSN into _SVE_INSNC, add C_SCAN_MOVPRFX and
F_SCAN flags.
(msb, mul, neg, not, orr, rbit, revb, revh, revw, sabd, scvtf,
sdiv, sdivr, sdot, smax, smin, smulh, splice, sqadd, sqdecd, sqdech,
sqdecp, sqdecw, sqincd, sqinch, sqincp, sqincw, sqsub, sub, subr, sxtb,
sxth, sxtw, uabd, ucvtf, udiv, udivr, udot, umax, umin, umulh, uqadd,
uqdecd, uqdech, uqdecp, uqdecw, uqincd, uqinch, uqincp, uqincw, uqsub,
uxtb, uxth, uxtw, bic, eon, orn, mov, fmov): Change _SVE_INSN into _SVE_INSNC and add
C_SCAN_MOVPRFX and C_MAX_ELEM constraints.
I tried a build on macOS today and it failed due to a mismatch between
the printf format and the type in aarch64-linux-tdep.c. This patch
fixes the problem by using pulongest and %s rather than %ld.
gdb/ChangeLog
2018-10-02 Tom Tromey <tom@tromey.com>
* aarch64-linux-tdep.c (aarch64_linux_sigframe_init): Use pulongest.
The RISC-V memory model has been ratified, and it includes an additional
fence: "fence.tso". This pseudo instruction extends one of the
previously reserved full fence patterns to be less restrictive, and
therefor will execute correctly on all existing microarchitectures.
Thus there is no reason to allow this instruction to be disabled (or
unconverted to a full fence), so it's just unconditionally allowed.
I've added a test case for GAS to check that "fence.tso" correctly
assembles on rv32i-based targets. I checked to see that "fence.tso"
appears in "gas.log", but that's the only testing I've done.
gas/ChangeLog
2018-10-02 Palmer Dabbelt <palmer@sifive.com>
* testsuite/gas/riscv/fence-tso.d: New file.
* testsuite/gas/riscv/fence-tso.s: Likewise.
include/ChangeLog
2018-10-02 Palmer Dabbelt <palmer@sifive.com>
* opcode/riscv-opc.h (MATCH_FENCE_TSO): New define.
(MASK_FENCE_TSO): Likewise.
opcodes/ChangeLog
2018-10-02 Palmer Dabbelt <palmer@sifive.com>
* riscv-opc.c (riscv_opcodes) <fence.tso>: New opcode.
Extend the "target remote" and "target extended-remote" commands
such that if the filename provided is a Unix local domain (AF_UNIX)
socket, then it'll be treated as such, instead of trying to open
it as if it were a character device.
gdb/ChangeLog:
* NEWS: Mention changed commands.
* ser-uds.c: New file.
* configure.ac (SER_HARDWIRE): Add ser-uds.o.
* configure: Regenerate.
* Makefile.in: Add new file.
* serial.c (serial_open): Check if filename is a socket
and lookup the appropriate interface accordingly.
gdb/doc/ChangeLog:
* gdb.texinfo (Remote Connection Commands): Describe
the changes to target remote and target extended-remote
relating to Unix domain sockets.
As reported by Jan here:
https://sourceware.org/ml/gdb-patches/2018-09/msg00831.html
the check that sets the number of available registers is backwards.
gdb/testsuite/ChangeLog:
* gdb.arch/i386-avx512.exp: Fix setting of nr_regs based on
is_amd64_regs_target.
Add Aarch64 test to check register values of a previous frame
can be shown correctly across a signal.
gdb/testsuite/ChangeLog:
* gdb.arch/aarch64-sighandler-regs.c: New test.
* gdb.arch/aarch64-sighandler-regs.exp: New file.
* lib/gdb.exp (skip_aarch64_sve_tests): New proc.
Both the VFP and SVE registers may be contained within the reserved space of
the sigcontext and can be found by seraching for MAGIC values. Detect these
and add the registers (including pseudos) to the trad frame cache.
gdb/
* aarch64-linux-tdep.c (AARCH64_SIGCONTEXT_RESERVED_OFFSET): Add
define.
(AARCH64_EXTRA_MAGIC): Likewise.
(AARCH64_FPSIMD_MAGIC): Likewise.
(AARCH64_SVE_MAGIC): Likewise.
(AARCH64_EXTRA_DATAP_OFFSET): Likewise.
(AARCH64_FPSIMD_FPSR_OFFSET): Likewise.
(AARCH64_FPSIMD_FPCR_OFFSET): Likewise.
(AARCH64_FPSIMD_V0_OFFSET): Likewise.
(AARCH64_FPSIMD_VREG_SIZE): Likewise.
(AARCH64_SVE_CONTEXT_VL_OFFSET): Likewise.
(AARCH64_SVE_CONTEXT_REGS_OFFSET): Likewise.
(AARCH64_SVE_CONTEXT_P_REGS_OFFSET): Likewise.
(AARCH64_SVE_CONTEXT_FFR_OFFSET): Likewise.
(AARCH64_SVE_CONTEXT_SIZE): Likewise.
(read_aarch64_ctx): Add function.
(aarch64_linux_sigframe_init): Detect FP registers.
Inserted offset in final section in the GOT entry of type DTSOFF soon to be
relocated by the dynamic loader.
bfd/
2018-09-06 Cupertino Miranda <cmiranda@synopsys.com>
* arc-got.h (relocate_fix_got_relocs_for_got_info): Changed. Take TLS
section alignment in consideration for this relocation.
* elf32-arc.c (FINAL_SECTSTART): Added this formula macro.
(ARC_TLS_DTPOFF) Updated reloc to use new created macro instead.
A change upstream reveiled this issue, triggering an assert when linking glibc.
bfd/
2018-03-01 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (elf_arc_check_relocs): Changed.
Problem identified in the context of glibc with latest upstream binutils.
Dynamic symbol space was being reserved but, no actual information for the
symbol was being set. Data for the symbol was kept initialized with -1.
No easy test case was possible to be created.
bfd/
2018-03-01 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (elf_arc_check_relocs): Changed.
Change location where GOT information is collected for ARC target, avoiding
posible use conflicts of the previous .got field in the symbols hash_entry.
bfd/
2018-03-01 Cupertino Miranda <cmiranda@synopsys.com>
* arc-got.h (get_got_entry_list_for_symbol): Changed.
* ef32-arc.c (struct elf_arc_link_hash_entry): Moved and changed.
(elf_arc_link_hash_newfunc): Changed.
(arc_elf_link_hash_table_create): Removed old initializations.
(elf_arc_relocate_section, elf_arc_finish_dynamic_symbol): Changed.
This commit removes a workaround for a bug in glibc 2.1.3, which
was released 2000-02-24 and superseded 2000-11-09.
gdb/ChangeLog:
* gdb_proc_service.h (gdb_prfpregset_t): Remove typedef.
* proc-service.c (ps_lgetfpregs, ps_lsetfpregs): Use
prfpregset_t instead of gdb_prfpregset_t.
* configure.ac (PRFPREGSET_T_BROKEN): Remove check.
* configure, config.in: Rebuild.
This commit moves now-identical code from gdb/gdb_proc_service.h
and gdb/gdbserver/gdb_proc_service.h into the new shared file
gdb/common/gdb_proc_service.h.
gdb/ChangeLog:
* common/gdb_proc_service.h: New file, factored out from...
* gdb_proc_service.h: Moved common code to the above file.
* Makefile.in (HFILES_NO_SRCDIR): Add the above new file.
gdb/gdbserver/ChangeLog:
* gdb_proc_service.h: Moved common code to
common/gdb_proc_service.h.
This commit updates GDB's gdb_proc_service.h to use elf_{g,fp}regset_t
instead of gdb_{g,fp}regset_t if pr{g,fp}regset_t are undefined.
The types have been equivalent on GNU/Linux since at least 2005.
gdb/ChangeLog:
* gdb_proc_service.h: Use elf_gregset_t if prgregset_t is
undefined. Use elf_fpregset_t if prfpregset_t is undefined.
This commit adds a workaround from gdbserver's gdb_proc_service.h
to GDB's. It doesn't seem to have been needed on any glibc as far
back as 2001, but it's possibly required for other C libraries so
I've retained it.
gdb/ChangeLog:
* configure.ac: Check if sys/procfs.h defines elf_fpregset_t.
(AC_CHECK_HEADERS): Check for linux/elf.h.
* configure, config.in: Rebuild.
* gdb_proc_service.h: Include linux/elf.h if sys/procfs.h
doesn't define elf_fpregset_t.
This commit updates comments and whitespace in GDB's and gdbserver's
gdb_proc_service.h.
gdb/ChangeLog:
* gdb_proc_service.h: Whitespace change.
gdb/gdbserver/ChangeLog:
* gdb_proc_service.h: Synchronize comments and whitespace with
GDB's version of this file.
I noticed some spots that were checking HAVE_UNISTD_H. There is no
need to do this, as <unistd.h> is unconditionally included in many
places in gdb. This sort of cleanup was done once before, in 2013:
2013-07-01 Pedro Alves <palves@redhat.com>
* defs.h: Don't check HAVE_UNISTD_H before including <unistd.h>.
(STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO): Delete.
* tracepoint.c: Don't check HAVE_UNISTD_H before including
<unistd.h>.
HAVE_UNISTD_H seems to come from gnulib, so there are still mentions
of it in the source.
gdb/ChangeLog
2018-10-01 Tom Tromey <tom@tromey.com>
* unittests/scoped_mmap-selftests.c: Don't check HAVE_UNISTD_H.
* unittests/scoped_fd-selftests.c: Don't check HAVE_UNISTD_H.
* common/scoped_fd.h: Don't check HAVE_UNISTD_H.
I realized that while I'd updated the README, I didn't update
gdb.texinfo to document the options to configure.
This patch copies the text from README into gdb.texinfo, adding
Texinfo markup.
gdb/ChangeLog
2018-10-01 Tom Tromey <tom@tromey.com>
* README: Minor change.
gdb/doc/ChangeLog
2018-10-01 Tom Tromey <tom@tromey.com>
* gdb.texinfo (Configure Options): Document configure options.
Commit
c221b2f Testsuite: Add gdb_can_simple_compile
changed the source file name extension of the test program from .s to .c
resulting in compile fails. This, in turn, causes is_amd64_regs_target
checks to fail. In gdb.btrace/tailcall.exp and others, this causes the
wrong source file to be picked and the test to fail on 64-bit targets.
Change the test source from an assembly program to a C program using
inline assembly.
testsuite/
* lib/gdb.exp (is_amd64_regs_target): Change assembly to C inline
assembly.
Building GDB with --host=x86_64-apple-darwin15 using G++ 5.3.0 runs
into a number of -Werror=unused-variable warnings/errors:
../../src/gdb/i386-darwin-nat.c: In function 'void i386_darwin_dr_set(int, CORE_ADDR)':
../../src/gdb/i386-darwin-nat.c:283:7: error: unused variable 'current_pid' [-Werror=unused-variable]
int current_pid;
^
[etc, etc.]
This commit fixes all such warnings.
gdb/ChangeLog:
2018-09-30 Pedro Alves <palves@redhat.com>
* darwin-nat-info.c (darwin_debug_regions_recurse)
(info_mach_exceptions_command): Remove unused local variables.
* darwin-nat.c (darwin_decode_notify_message)
(darwin_nat_target::resume, darwin_nat_target::mourn_inferior)
(darwin_stop_inferior, darwin_setup_exceptions)
(darwin_nat_target::kill, darwin_attach_pid, darwin_ptrace_him)
(darwin_nat_target::attach, darwin_nat_target::detach)
(darwin_read_write_inferior, darwin_read_dyld_info): Remove unused
local variables.
* i386-darwin-nat.c (i386_darwin_dr_set): Remove unused local
variables.
I accidentally left some stray text in gdb/README.
This removes it. I'm checking this in as obvious.
gdb/ChangeLog
2018-09-29 Tom Tromey <tom@tromey.com>
* README: Remove some leftover text.
gdb's README and configure instructions in the manual are quite out of
date. They mention options that haven't existed for many years, among
other things.
This patch attempts to modernize the instructions somewhat. It is not
exhaustive, just an improvement -- more could be done. Perhaps even a
couple of the nodes should simply be removed and replaced by
references to the Autoconf manual.
The README file seems to have been generated from the Texinfo at some
point in the past. I did not continue this, but instead edited it
separately.
gdb/ChangeLog
2018-09-29 Tom Tromey <tom@tromey.com>
* PROBLEMS: Rewrite.
* README: Update.
gdb/doc/ChangeLog
2018-09-29 Tom Tromey <tom@tromey.com>
* gdb.texinfo (Requirements): Mention C++, GNU make.
(Requirements): Sort the table. Add more libraries.
(Running Configure): Remove obsolete text.
(Separate Objdir): Likewise.
(Configure Options): Likewise.
RISC-V supports instructions of varying lengths. Standard existing
instructions in the base ISA are 4 bytes in length, but the 'C'
extension adds support for compressed, 2 byte instructions. RISC-V
supports two different breakpoint instructions: EBREAK is a 4 byte
instruction in the base ISA, and C.EBREAK is a 2 byte instruction only
available on processors implementing the 'C' extension. Using EBREAK
to set breakpoints on compressed instructions causes problems as the
second half of EBREAK will overwrite the first 2 bytes of the
following instruction breaking other threads in the process if their
PC is the following instruction. Thus, breakpoints on compressed
instructions need to use C.EBREAK instead of EBREAK.
Previously, the riscv architecture checked the MISA register to
determine if the 'C' extension was available. If so, it used C.EBREAK
for all breakpoints. However, the MISA register is not necessarily
available to supervisor mode operating systems. While native targets
could provide a fake MISA register value, this patch instead examines
the existing instruction at a breakpoint target to determine which
breakpoint instruction to use. If the existing instruction is a
compressed instruction, C.EBREAK is used, otherwise EBREAK is used.
gdb/ChangeLog:
* disasm-selftests.c (print_one_insn_test): Add bfd_arch_riscv to
case with explicit breakpoint kind.
* riscv-tdep.c (show_use_compressed_breakpoints): Remove
'additional_info' and related logic.
(riscv_debug_breakpoints): New variable.
(riscv_breakpoint_kind_from_pc): Use the length of the existing
instruction to determine the breakpoint kind.
(_initialize_riscv_tdep): Add 'set/show debug riscv breakpoints'
flag. Update description of 'set/show riscv
use-compressed-breakpoints' flag.
This code was introduced back in 1998, and C99 appeared next year,
defining the `xor` as an 'alternative keyword' if iso646.h is
included. Moreover, C++98 defines it on the language level. As a
result, the code is not buildable with C++ compiler or if iso646.h is
included beforehand.
According to comment, `sim_cpu_core` is mostly a clone of `sim_core`,
so I renamed it to `byte_xor` as it's called in `sim_core`.
sim/common/ChangeLog:
* sim-core.h (sim_cpu_core): Rename cpu_core.xor to
cpu_core.byte_xor.
* sim-core.c (sim_core_set_xor): Likewise.
(sim_core_xor_read_buffer): Likewise.
(sim_core_xor_write_buffer): Likewise.
The 'frame' command, and thanks to code reuse the 'info frame' and
'select-frame' commands, currently have an overloaded mechanism for
selecting a frame.
These commands take one or two parameters, if it's one parameter then
we first try to use the parameter as an integer to select a frame by
level (or depth in the stack). If that fails then we treat the
parameter as an address and try to select a stack frame by
stack-address. If we still have not selected a stack frame, or we
initially had two parameters, then GDB allows the user to view a stack
frame that is not part of the current backtrace. Internally, a new
frame is created with the given stack and pc addresses, and this is
shown to the user.
The result of this is that a typo by the user, entering the wrong stack
frame level for example, can result in a brand new frame being viewed
rather than an error.
The purpose of this commit is to remove this overloading, while still
offering the same functionality through some new sub-commands. By
making the default behaviour of 'frame' (and friends) be to select a
stack frame by level index, it is hoped that enough
backwards-compatibility is maintained that users will not be overly
inconvenienced.
The 'frame', 'select-frame', and 'info frame' commands now all take a
frame specification string as an argument, this string can be any of the
following:
(1) An integer. This is treated as a frame level. If a frame for
that level does not exist then the user gets an error.
(2) A string like 'level <LEVEL>', where <LEVEL> is a frame level
as in option (1) above.
(3) A string like 'address <STACK-ADDRESS>', where <STACK-ADDRESS>
is a stack-frame address. If there is no frame for this address
then the user gets an error.
(4) A string like 'function <NAME>', where <NAME> is a function name,
the inner most frame for function <NAME> is selected. If there is no
frame for function <NAME> then the user gets an error.
(5) A string like 'view <STACK-ADDRESS>', this views a new frame
with stack address <STACK-ADDRESS>.
(6) A string like 'view <STACK-ADDRESS> <PC-ADDRESS>', this views
a new frame with stack address <STACK-ADDRESS> and the pc <PC-ADDRESS>.
This change assumes that the most common use of the commands like
'frame' is to select a frame by frame level, it is for this reason
that this is the behaviour that is kept for backwards compatibility.
Any of the alternative behaviours, which are assumed to be less used,
now require a change in user behaviour.
The MI command '-stack-select-frame' has not been changed. This
ensures that we maintain backwards compatibility for existing
frontends.
gdb/ChangeLog:
(NEWS): Mention changes to frame related commands.
* cli/cli-decode.c (add_cmd_suppress_notification): New function.
(add_prefix_cmd_suppress_notification): New function.
(add_com_suppress_notification): Call
add_cmd_suppress_notification.
* command.h (add_cmd_suppress_notification): Declare.
(add_prefix_cmd_suppress_notification): Declare.
* mi/mi-cmd-stack.c: Add 'safe-ctype.h' include.
(parse_frame_specification): Moved from stack.c, with
simplification to handle a single argument.
(mi_cmd_stack_select_frame): Use parse_frame_specification, the
switch to the selected frame. Add a header comment.
* stack.c: Remove 'safe-ctype.h' include.
(find_frame_for_function): Add declaration.
(find_frame_for_address): New function.
(parse_frame_specification): Moved into mi/mi-cmd-stack.c.
(frame_selection_by_function_completer): New function.
(info_frame_command): Rename to...
(info_frame_command_core): ...this, and update parameter types.
(select_frame_command): Rename to...
(select_frame_command_core): ...this, and update parameter types.
(frame_command): Rename to...
(frame_command_core): ...this, and update parameter types.
(class frame_command_helper): New class to wrap implementations of
frame related sub-commands.
(frame_apply_cmd_list): New static global.
(frame_cmd_list): Make static.
(select_frame_cmd_list): New global for sub-commands.
(info_frame_cmd_list): New global for sub-commands.
(_initialize_stack): Register sub-commands for 'frame',
'select-frame', and 'info frame'. Update 'frame apply' commands
to use frame_apply_cmd_list. Move function local static
frame_apply_list to file static frame_apply_cmd_list for
consistency.
* stack.h (select_frame_command): Delete declarationn.
(select_frame_for_mi): Declare new function.
gdb/doc/ChangeLog:
* gdb.texinfo (Frames): Rewrite the description of 'frame number'
to highlight that the number is also the frame's level.
(Selection): Rewrite documentation for 'frame' and 'select-frame'
commands.
(Frame Info): Rewrite documentation for 'info frame' command.
gdb/testsuite/ChangeLog:
* gdb.base/frame-selection.exp: New file.
* gdb.base/frame-selection.c: New file.
It is possible for the created thread to reach the breakpoint before
the main thread has set errno to 23.
Prevent this using a pthread barrier.
* gdb.threads/check-libthread-db.c (thread_routine): Use a
pthread barrier.
(main): Likewise.
2018-09-26 Sandra Loosemore <sandra@codesourcery.com>
gas/
* testsuite/gas/all/gas.exp: Skip "Output file must be distinct
from input" test on Windows host.
This commit improves the prologue scanning stack unwinder, to better
support AUIPC, LUI, and more variants of ADD and ADDI.
This allows unwinding over frames containing large local variables,
where the frame size does not fit into a single instruction immediate,
and is first loaded into a temporary register, before being added to
the stack pointer.
A new test is added that tests this behaviour. As there's nothing
truely RiscV specific about this test I've added it into gdb.base, but
as this depends on target specific code to perform the unwind it is
possible that some targets might fail this new test.
gdb/ChangeLog:
* riscv-tdep.c (riscv_insn::decode): Decode c.lui.
(riscv_scan_prologue): Split handling of AUIPC, LUI, ADD, ADDI,
and NOP.
gdb/testsuite/ChangeLog:
* gdb.base/large-frame-1.c: New file.
* gdb.base/large-frame-2.c: New file.
* gdb.base/large-frame.exp: New file.
* gdb.base/large-frame.h: New file.
It is unused, removing it fixes this error when building with clang:
/home/emaisin/src/binutils-gdb/bfd/elf32-nds32.c:3172:1: error: unused function 'elf32_nds32_allocate_dynrelocs' [-Werror,-Wunused-function]
elf32_nds32_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc,
^
1 error generated.
gcc only reports the error if you remove "inline". I don't know if this
is actually a mistake and it should actually be used though.
gdb/ChangeLog:
* elf32-nds32.c (elf32_nds32_allocate_dynrelocs): Remove.
This removes a variable definition in valops.c that has been
surrounded by "#if 0" since gdb moved to sourceware.
gdb/ChangeLog
2018-09-26 Tom Tromey <tom@tromey.com>
* valops.c (auto_abandon): Remove dead code.