On Mon, 24 Feb 2020 15:03:21 +0300 (MSK) Alexander Monakov <amona...@ispras.ru> wrote:
> On Mon, 24 Feb 2020, Andreas Schwab wrote: > > > On Feb 24 2020, Petr Tesarik wrote: > > > > > On Mon, 24 Feb 2020 12:29:40 +0100 > > > Andreas Schwab <sch...@suse.de> wrote: > > > > > >> On Feb 24 2020, Petr Tesarik wrote: > > >> > > >> > This works great ... until there's some inline asm() statement, for > > >> > which gcc cannot keep track of the length attribute, so it is probably > > >> > taken as zero. > > >> > > >> GCC computes it by counting the number of asm insns. You can use > > >> ADJUST_INSN_LENGTH to adjust this as needed. > > > > > > Hmm, that's interesting, but does it work for inline asm() statements? > > > > Yes, for a suitable definition of work. > > > > > The argument is essentially a free-form string (with some > > > substitution), and the compiler cannot know how many bytes they occupy. > > > > That's why ADJUST_INSN_LENGTH can adjust it. > > I think Petr might be unaware of the fact that GCC counts the **number of > instructions in an inline asm statement** by counting separators in the > asm string. This may overcount when a separator appears in a string literal > for example, but triggering under-counting is trickier. > > Petr, please see https://gcc.gnu.org/onlinedocs/gcc/Size-of-an-asm.html > for some more discussion. Indeed. Thanks for the pointer. First, it explains why my AVR test case was invalid (I used ".rept 64 ; nop ; .endr" to save me some work). Second, it made me aware of "the longest instruction supported by that processor". IIUC, this should be the default value for (define_attr "length") in a machine description file unless a better value can be calculated from a known instruction. And it also explains why it is still necessary to provide some value even if you define a "length" attribute for all known instructions. Cheers, Petr T
pgpUMX2z5RFPW.pgp
Description: Digitálnà podpis OpenPGP