mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
Implement target_emit_ops
This patch implements compiling agent expressions to native code for AArch64. This allows us to compile conditions set on fast tracepoints. The compiled function has the following prologue: High *------------------------------------------------------* | LR | | FP | <- FP | x1 (ULONGEST *value) | | x0 (unsigned char *regs) | Low *------------------------------------------------------* We save the function's argument on the stack as well as the return address and the frame pointer. We then set the current frame pointer to point to the previous one. The generated code for the expression will freely update the stack pointer so we use the frame pointer to refer to `*value' and `*regs'. `*value' needs to be accessed in the epilogue of the function, in order to set it to whatever is on top of the stack. `*regs' needs to be passed down to the `gdb_agent_get_raw_reg' function with the `reg' operation. gdb/gdbserver/ChangeLog: * linux-aarch64-low-.c: Include ax.h and tracepoint.h. (enum aarch64_opcodes) <RET>, <SUBS>, <AND>, <ORR>, <ORN>, <EOR>, <LSLV>, <LSRV>, <ASRV>, <SBFM>, <UBFM>, <CSINC>, <MUL>, <NOP>: New. (enum aarch64_condition_codes): New enum. (w0): New static global. (fp): Likewise. (lr): Likewise. (struct aarch64_memory_operand) <type>: New MEMORY_OPERAND_POSTINDEX type. (postindex_memory_operand): New helper function. (emit_ret): New function. (emit_load_store_pair): New function, factored out of emit_stp with support for MEMORY_OPERAND_POSTINDEX. (emit_stp): Rewrite using emit_load_store_pair. (emit_ldp): New function. (emit_load_store): Likewise. (emit_ldr): Mention post-index instruction in comment. (emit_ldrh): New function. (emit_ldrb): New function. (emit_ldrsw): Mention post-index instruction in comment. (emit_str): Likewise. (emit_subs): New function. (emit_cmp): Likewise. (emit_and): Likewise. (emit_orr): Likewise. (emit_orn): Likewise. (emit_eor): Likewise. (emit_mvn): Likewise. (emit_lslv): Likewise. (emit_lsrv): Likewise. (emit_asrv): Likewise. (emit_mul): Likewise. (emit_sbfm): Likewise. (emit_sbfx): Likewise. (emit_ubfm): Likewise. (emit_ubfx): Likewise. (emit_csinc): Likewise. (emit_cset): Likewise. (emit_nop): Likewise. (emit_ops_insns): New helper function. (emit_pop): Likewise. (emit_push): Likewise. (aarch64_emit_prologue): New function. (aarch64_emit_epilogue): Likewise. (aarch64_emit_add): Likewise. (aarch64_emit_sub): Likewise. (aarch64_emit_mul): Likewise. (aarch64_emit_lsh): Likewise. (aarch64_emit_rsh_signed): Likewise. (aarch64_emit_rsh_unsigned): Likewise. (aarch64_emit_ext): Likewise. (aarch64_emit_log_not): Likewise. (aarch64_emit_bit_and): Likewise. (aarch64_emit_bit_or): Likewise. (aarch64_emit_bit_xor): Likewise. (aarch64_emit_bit_not): Likewise. (aarch64_emit_equal): Likewise. (aarch64_emit_less_signed): Likewise. (aarch64_emit_less_unsigned): Likewise. (aarch64_emit_ref): Likewise. (aarch64_emit_if_goto): Likewise. (aarch64_emit_goto): Likewise. (aarch64_write_goto_address): Likewise. (aarch64_emit_const): Likewise. (aarch64_emit_call): Likewise. (aarch64_emit_reg): Likewise. (aarch64_emit_pop): Likewise. (aarch64_emit_stack_flush): Likewise. (aarch64_emit_zero_ext): Likewise. (aarch64_emit_swap): Likewise. (aarch64_emit_stack_adjust): Likewise. (aarch64_emit_int_call_1): Likewise. (aarch64_emit_void_call_2): Likewise. (aarch64_emit_eq_goto): Likewise. (aarch64_emit_ne_goto): Likewise. (aarch64_emit_lt_goto): Likewise. (aarch64_emit_le_goto): Likewise. (aarch64_emit_gt_goto): Likewise. (aarch64_emit_ge_got): Likewise. (aarch64_emit_ops_impl): New static global variable. (aarch64_emit_ops): New target function, return &aarch64_emit_ops_impl. (struct linux_target_ops): Install it.
This commit is contained in:
parent
bb903df05b
commit
afbe19f83a
@ -1,3 +1,90 @@
|
|||||||
|
2015-09-21 Pierre Langlois <pierre.langlois@arm.com>
|
||||||
|
|
||||||
|
* linux-aarch64-low-.c: Include ax.h and tracepoint.h.
|
||||||
|
(enum aarch64_opcodes) <RET>, <SUBS>, <AND>, <ORR>, <ORN>,
|
||||||
|
<EOR>, <LSLV>, <LSRV>, <ASRV>, <SBFM>, <UBFM>, <CSINC>, <MUL>,
|
||||||
|
<NOP>: New.
|
||||||
|
(enum aarch64_condition_codes): New enum.
|
||||||
|
(w0): New static global.
|
||||||
|
(fp): Likewise.
|
||||||
|
(lr): Likewise.
|
||||||
|
(struct aarch64_memory_operand) <type>: New
|
||||||
|
MEMORY_OPERAND_POSTINDEX type.
|
||||||
|
(postindex_memory_operand): New helper function.
|
||||||
|
(emit_ret): New function.
|
||||||
|
(emit_load_store_pair): New function, factored out of emit_stp
|
||||||
|
with support for MEMORY_OPERAND_POSTINDEX.
|
||||||
|
(emit_stp): Rewrite using emit_load_store_pair.
|
||||||
|
(emit_ldp): New function.
|
||||||
|
(emit_load_store): Likewise.
|
||||||
|
(emit_ldr): Mention post-index instruction in comment.
|
||||||
|
(emit_ldrh): New function.
|
||||||
|
(emit_ldrb): New function.
|
||||||
|
(emit_ldrsw): Mention post-index instruction in comment.
|
||||||
|
(emit_str): Likewise.
|
||||||
|
(emit_subs): New function.
|
||||||
|
(emit_cmp): Likewise.
|
||||||
|
(emit_and): Likewise.
|
||||||
|
(emit_orr): Likewise.
|
||||||
|
(emit_orn): Likewise.
|
||||||
|
(emit_eor): Likewise.
|
||||||
|
(emit_mvn): Likewise.
|
||||||
|
(emit_lslv): Likewise.
|
||||||
|
(emit_lsrv): Likewise.
|
||||||
|
(emit_asrv): Likewise.
|
||||||
|
(emit_mul): Likewise.
|
||||||
|
(emit_sbfm): Likewise.
|
||||||
|
(emit_sbfx): Likewise.
|
||||||
|
(emit_ubfm): Likewise.
|
||||||
|
(emit_ubfx): Likewise.
|
||||||
|
(emit_csinc): Likewise.
|
||||||
|
(emit_cset): Likewise.
|
||||||
|
(emit_nop): Likewise.
|
||||||
|
(emit_ops_insns): New helper function.
|
||||||
|
(emit_pop): Likewise.
|
||||||
|
(emit_push): Likewise.
|
||||||
|
(aarch64_emit_prologue): New function.
|
||||||
|
(aarch64_emit_epilogue): Likewise.
|
||||||
|
(aarch64_emit_add): Likewise.
|
||||||
|
(aarch64_emit_sub): Likewise.
|
||||||
|
(aarch64_emit_mul): Likewise.
|
||||||
|
(aarch64_emit_lsh): Likewise.
|
||||||
|
(aarch64_emit_rsh_signed): Likewise.
|
||||||
|
(aarch64_emit_rsh_unsigned): Likewise.
|
||||||
|
(aarch64_emit_ext): Likewise.
|
||||||
|
(aarch64_emit_log_not): Likewise.
|
||||||
|
(aarch64_emit_bit_and): Likewise.
|
||||||
|
(aarch64_emit_bit_or): Likewise.
|
||||||
|
(aarch64_emit_bit_xor): Likewise.
|
||||||
|
(aarch64_emit_bit_not): Likewise.
|
||||||
|
(aarch64_emit_equal): Likewise.
|
||||||
|
(aarch64_emit_less_signed): Likewise.
|
||||||
|
(aarch64_emit_less_unsigned): Likewise.
|
||||||
|
(aarch64_emit_ref): Likewise.
|
||||||
|
(aarch64_emit_if_goto): Likewise.
|
||||||
|
(aarch64_emit_goto): Likewise.
|
||||||
|
(aarch64_write_goto_address): Likewise.
|
||||||
|
(aarch64_emit_const): Likewise.
|
||||||
|
(aarch64_emit_call): Likewise.
|
||||||
|
(aarch64_emit_reg): Likewise.
|
||||||
|
(aarch64_emit_pop): Likewise.
|
||||||
|
(aarch64_emit_stack_flush): Likewise.
|
||||||
|
(aarch64_emit_zero_ext): Likewise.
|
||||||
|
(aarch64_emit_swap): Likewise.
|
||||||
|
(aarch64_emit_stack_adjust): Likewise.
|
||||||
|
(aarch64_emit_int_call_1): Likewise.
|
||||||
|
(aarch64_emit_void_call_2): Likewise.
|
||||||
|
(aarch64_emit_eq_goto): Likewise.
|
||||||
|
(aarch64_emit_ne_goto): Likewise.
|
||||||
|
(aarch64_emit_lt_goto): Likewise.
|
||||||
|
(aarch64_emit_le_goto): Likewise.
|
||||||
|
(aarch64_emit_gt_goto): Likewise.
|
||||||
|
(aarch64_emit_ge_got): Likewise.
|
||||||
|
(aarch64_emit_ops_impl): New static global variable.
|
||||||
|
(aarch64_emit_ops): New target function, return
|
||||||
|
&aarch64_emit_ops_impl.
|
||||||
|
(struct linux_target_ops): Install it.
|
||||||
|
|
||||||
2015-09-21 Pierre Langlois <pierre.langlois@arm.com>
|
2015-09-21 Pierre Langlois <pierre.langlois@arm.com>
|
||||||
|
|
||||||
* Makefile.in (linux-aarch64-ipa.o, aarch64-ipa.o): New rules.
|
* Makefile.in (linux-aarch64-ipa.o, aarch64-ipa.o): New rules.
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user