Messages in this thread Patch in this message | | | From | Nick Desaulniers <> | Date | Fri, 8 Jul 2022 16:04:10 -0700 | Subject | Re: [PATCH v5] coresight: etm4x: avoid build failure with unrolled loops |
| |
On Tue, Jun 28, 2022 at 2:40 AM David Laight <David.Laight@aculab.com> wrote: > > ... > > > Regardless of which compiler or compiler options determine whether a > > > loop can or can't be unrolled, which determines whether > > > __builtin_constant_p evaluates to true when passed an expression using a > > > loop induction variable, it is NEVER safe to allow the preprocessor to > > > construct inline asm like: > > > asm volatile (".inst (0x160 + (i * 4))" : "=r"(__val)); > > > ^ expected constant expression > > Can't you use (IIRC) an "=i" constraint with the C expression > so that the compiler evaluates the expression and passes the > correct constant value to the assembler?
Yes, though I think it may be even simpler for me to just use __is_constexpr from include/linux/const.h here than try to rewrite the existing macro soup to avoid calls to read_sysreg_s. Will send a follow up.
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h index 33869c1d20c3..a7bfea31f7d8 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.h +++ b/drivers/hwtracing/coresight/coresight-etm4x.h @@ -7,6 +7,7 @@ #define _CORESIGHT_CORESIGHT_ETM_H
#include <asm/local.h> +#include <linux/const.h> #include <linux/spinlock.h> #include <linux/types.h> #include "coresight-priv.h" @@ -515,7 +516,7 @@ ({ \ u64 __val; \
\ - if (__builtin_constant_p((offset))) \ + if (__is_constexpr((offset))) \ __val = read_etm4x_sysreg_const_offset((offset)); \ else \ __val = etm4x_sysreg_read((offset), true, (_64bit)); \ -- Thanks, ~Nick Desaulniers
| |