efriedma added inline comments.
================ Comment at: include/clang/Basic/DiagnosticASTKinds.td:214 + def err_asm_invalid_operand_number_for_goto_labels : Error < + "invalid operand number which isn't point to a goto label in asm string">; } ---------------- Grammar. Also, "invalid operand number" isn't really a good explanation. Maybe something like "operand with 'l' modifier must refer to a label". ================ Comment at: lib/Sema/SemaStmtAsm.cpp:470 + if (NS->isGCCAsmGoto() && + Exprs[ConstraintIdx]->getStmtClass() == Stmt::AddrLabelExprClass) + break; ---------------- jyu2 wrote: > efriedma wrote: > > jyu2 wrote: > > > efriedma wrote: > > > > 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)); > > > > ``` > > > Hi Eli, > > > > > > Thanks for your review. > > > > > > For case: > > > asm goto ("jne %h0"::::x); > > > > > > Without define label x, both clang and my current implementation give > > > error of "use of undeclared label" > > > > > > if x is defined: gcc give error > > > asm_goto>!gcc > > > gcc n.c > > > n.c: Assembler messages: > > > n.c:4: Error: operand type mismatch for `jne' > > > > > > My current implementation don't emit error. I think this is need to be > > > done in LLVM. Am I right here? > > > > > > For the case: > > > asm ("jne %l0"::"r"(0)); > > > > > > gcc don't allow any modifier 'l' with asm stmt but it allows with asm > > > goto. Is that something you are look for? Thanks. > > > > > > So I add code in AST/Stmt.cpp to emit error. > > > ..... > > > return diag::err_asm_invalid_escape; > > > } else if (!this->isGCCAsmGoto() && EscapedChar == 'l' && > > > isDigit(*CurPtr)) { > > > DiagOffs = CurPtr-StrStart; > > > return diag::err_asm_invalid_operand_number; > > > } > > > > > For the first one, I was trying with Aarch64 gcc; I guess x86 doesn't emit > > the same error? `void f() { x: asm goto ("jne %i0"::::x);}` should be the > > same for both. > > > > > gcc don't allow any modifier 'l' with asm stmt but it allows with asm > > > goto. Is that something you are look for? Thanks. > > > > We should reject any use of the "l" modifier that does not point to a label > > in the label list. So we should also reject `void f(){x:asm goto ("jne > > %l0"::"r"(&&x)::x);}`. > Hi Eli, > > Thank you so much to point this out. I add code for emit error for use of > the "l" modifier that does not point to a label in the label list. > > Please also add the `void f() { x: asm goto ("jne %i0"::::x);}` testcase. 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