Message ID | 20250307185645.970034-16-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | accel/tcg: Compile more files once | expand |
On 3/7/25 10:56, Richard Henderson wrote: > Split out GETPC and GETPC_ADJ to a target-independent header. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/exec/exec-all.h | 19 +------------------ > include/exec/helper-getpc.h | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+), 18 deletions(-) > create mode 100644 include/exec/helper-getpc.h > > diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h > index a758b7a843..22a99ca502 100644 > --- a/include/exec/exec-all.h > +++ b/include/exec/exec-all.h > @@ -26,6 +26,7 @@ > #endif > #include "exec/mmu-access-type.h" > #include "exec/translation-block.h" > +#include "exec/helper-getpc.h" > > #if defined(CONFIG_TCG) > > @@ -177,24 +178,6 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); > void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t last); > void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); > > -/* GETPC is the true target of the return instruction that we'll execute. */ > -#if defined(CONFIG_TCG_INTERPRETER) > -extern __thread uintptr_t tci_tb_ptr; > -# define GETPC() tci_tb_ptr > -#else > -# define GETPC() \ > - ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) > -#endif > - > -/* The true return address will often point to a host insn that is part of > - the next translated guest insn. Adjust the address backward to point to > - the middle of the call insn. Subtracting one would do the job except for > - several compressed mode architectures (arm, mips) which set the low bit > - to indicate the compressed mode; subtracting two works around that. It > - is also the case that there are no host isas that contain a call insn > - smaller than 4 bytes, so we don't worry about special-casing this. */ > -#define GETPC_ADJ 2 > - > #if !defined(CONFIG_USER_ONLY) > > /** > diff --git a/include/exec/helper-getpc.h b/include/exec/helper-getpc.h > new file mode 100644 > index 0000000000..1c8bd72c11 > --- /dev/null > +++ b/include/exec/helper-getpc.h > @@ -0,0 +1,31 @@ > +/* > + * Get host pc for helper unwinding. > + * > + * Copyright (c) 2003 Fabrice Bellard > + * SPDX-License-Identifier: LGPL-2.1-or-later > + */ > + > +#ifndef HELPER_GETPC_H > +#define HELPER_GETPC_H > + > +/* GETPC is the true target of the return instruction that we'll execute. */ > +#if defined(CONFIG_TCG_INTERPRETER) > +extern __thread uintptr_t tci_tb_ptr; > +# define GETPC() tci_tb_ptr > +#else > +# define GETPC() \ > + ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) > +#endif > + > +/* > + * The true return address will often point to a host insn that is part of > + * the next translated guest insn. Adjust the address backward to point to > + * the middle of the call insn. Subtracting one would do the job except for > + * several compressed mode architectures (arm, mips) which set the low bit > + * to indicate the compressed mode; subtracting two works around that. It > + * is also the case that there are no host isas that contain a call insn > + * smaller than 4 bytes, so we don't worry about special-casing this. > + */ > +#define GETPC_ADJ 2 > + > +#endif /* HELPER_GETPC_H */ Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
On 7/3/25 19:56, Richard Henderson wrote: > Split out GETPC and GETPC_ADJ to a target-independent header. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/exec/exec-all.h | 19 +------------------ > include/exec/helper-getpc.h | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+), 18 deletions(-) > create mode 100644 include/exec/helper-getpc.h Preferably include/accel/tcg/getpc.h or similar, otherwise: Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
On 7/3/25 23:00, Philippe Mathieu-Daudé wrote: > On 7/3/25 19:56, Richard Henderson wrote: >> Split out GETPC and GETPC_ADJ to a target-independent header. >> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> include/exec/exec-all.h | 19 +------------------ >> include/exec/helper-getpc.h | 31 +++++++++++++++++++++++++++++++ >> 2 files changed, 32 insertions(+), 18 deletions(-) >> create mode 100644 include/exec/helper-getpc.h > > Preferably include/accel/tcg/getpc.h or similar Also these should be guarded for CONFIG_TCG IMHO, similar to include/exec/cpu_ldst.h: #ifndef CONFIG_TCG #error Can only include this header with TCG #endif If cleanups are required, I can deal with them later. > otherwise: > > Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> >
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index a758b7a843..22a99ca502 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -26,6 +26,7 @@ #endif #include "exec/mmu-access-type.h" #include "exec/translation-block.h" +#include "exec/helper-getpc.h" #if defined(CONFIG_TCG) @@ -177,24 +178,6 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t last); void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); -/* GETPC is the true target of the return instruction that we'll execute. */ -#if defined(CONFIG_TCG_INTERPRETER) -extern __thread uintptr_t tci_tb_ptr; -# define GETPC() tci_tb_ptr -#else -# define GETPC() \ - ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) -#endif - -/* The true return address will often point to a host insn that is part of - the next translated guest insn. Adjust the address backward to point to - the middle of the call insn. Subtracting one would do the job except for - several compressed mode architectures (arm, mips) which set the low bit - to indicate the compressed mode; subtracting two works around that. It - is also the case that there are no host isas that contain a call insn - smaller than 4 bytes, so we don't worry about special-casing this. */ -#define GETPC_ADJ 2 - #if !defined(CONFIG_USER_ONLY) /** diff --git a/include/exec/helper-getpc.h b/include/exec/helper-getpc.h new file mode 100644 index 0000000000..1c8bd72c11 --- /dev/null +++ b/include/exec/helper-getpc.h @@ -0,0 +1,31 @@ +/* + * Get host pc for helper unwinding. + * + * Copyright (c) 2003 Fabrice Bellard + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef HELPER_GETPC_H +#define HELPER_GETPC_H + +/* GETPC is the true target of the return instruction that we'll execute. */ +#if defined(CONFIG_TCG_INTERPRETER) +extern __thread uintptr_t tci_tb_ptr; +# define GETPC() tci_tb_ptr +#else +# define GETPC() \ + ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) +#endif + +/* + * The true return address will often point to a host insn that is part of + * the next translated guest insn. Adjust the address backward to point to + * the middle of the call insn. Subtracting one would do the job except for + * several compressed mode architectures (arm, mips) which set the low bit + * to indicate the compressed mode; subtracting two works around that. It + * is also the case that there are no host isas that contain a call insn + * smaller than 4 bytes, so we don't worry about special-casing this. + */ +#define GETPC_ADJ 2 + +#endif /* HELPER_GETPC_H */
Split out GETPC and GETPC_ADJ to a target-independent header. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/exec/exec-all.h | 19 +------------------ include/exec/helper-getpc.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 include/exec/helper-getpc.h