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

Attachment: pgpUMX2z5RFPW.pgp
Description: Digitální podpis OpenPGP

Reply via email to