efriedma added inline comments.

================
Comment at: lib/Sema/SemaStmtAsm.cpp:470
+    if (NS->isGCCAsmGoto() &&
+        Exprs[ConstraintIdx]->getStmtClass() == Stmt::AddrLabelExprClass)
+      break;
----------------
jyu2 wrote:
> jyu2 wrote:
> > efriedma wrote:
> > > jyu2 wrote:
> > > > efriedma wrote:
> > > > > jyu2 wrote:
> > > > > > efriedma wrote:
> > > > > > > This looks suspicious; an AddrLabelExpr could be an input or 
> > > > > > > output, e.g. `"r"(&&foo)`.
> > > > > > Syntax for asm goto:
> > > > > >  Syntax:
> > > > > >    asm [volatile] goto ( AssemblerTemplate
> > > > > >                        :
> > > > > >                        : InputOperands
> > > > > >                        : Clobbers
> > > > > >                        : GotoLabels)
> > > > > > 
> > > > > >  Only input is allowed.  Output is not allowed
> > > > > > 
> > > > > That doesn't really address my point here... ignore the "or output" 
> > > > > part of the comment.
> > > > Sorry did not realize that.  Thank you so much for catching that.  Need 
> > > > to add other condition "ConstraintIdx > NS->getNumInputs() - 1", change 
> > > > to :
> > > > 
> > > > if (NS->isGCCAsmGoto() && ConstraintIdx > NS->getNumInputs() - 1 &&
> > > >         Exprs[ConstraintIdx]->getStmtClass() == 
> > > > Stmt::AddrLabelExprClass)
> > > >       break;
> > > > 
> > > > Is this ok with you?  Thanks
> > > That's the right idea. But I still see a few issues at that point:
> > > 
> > > 1. The AddrLabelExprClass check is redundant.
> > > 2. "NS->getNumInputs() - 1" can overflow; probably should use 
> > > "ConstraintIdx >= NS->getNumInputs()".
> > > 3. "break" exits the loop completely (so it skips validating all 
> > > constraints written after the label).
> > > 4. The code needs to verify that the user correctly specified the "l" 
> > > constraint modifier.
> > Sorry not done yet.  
> For you comment 4:
> 
> The code needs to verify that the user correctly specified the "l" constraint 
> modifier.  We already emit error like following?
> 
> Do you mean, we need more checking here?  Thanks. 
> 
> n.c:4:35: error: unknown symbolic operand name in inline assembly string
>   asm goto ("frob %%r5, %1; jc %l[error]; mov (%2), %%r5"
>             ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
> n.c:8:15: error: use of undeclared label 'error1'
>             : error1);
> 
> Test is:
> int frob(int x)
> {
>   int y;
>   asm goto ("frob %%r5, %1; jc %l[error]; mov (%2), %%r5"
>             : /* No outputs. */
>             : "r"(x), "r"(&y)
>             : "memory"
>             : error1);
>   return y;
> error:
>   return -1;
> }
> 
> 
I mean, there needs to be a diagnostic for the following:

```
asm goto ("jne %h0"::::x);
```

On a related note, there should also be a diagnostic for the following 
somewhere:

```
asm ("jne %l0"::"r"(0));
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56571/new/

https://reviews.llvm.org/D56571



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to