[PATCH] D56571: [RFC prototype] Implementation of asm-goto support in clang
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri May 24 12:45:12 PDT 2019
rsmith accepted this revision.
rsmith marked an inline comment as done.
rsmith added a comment.
Looks good with a few largely-mechanical changes.
================
Comment at: include/clang/Basic/DiagnosticParseKinds.td:30
"GNU-style inline assembly is disabled">;
-def err_asm_goto_not_supported_yet : Error<
- "'asm goto' constructs are not supported yet">;
+def err_asm_goto_can_not_have_output : Error<
+ "'asm goto' cannot have output constraints">;
----------------
Nit: `can_not` -> `cannot`
================
Comment at: lib/Parse/ParseStmtAsm.cpp:806
// Parse the asm-string list for clobbers if present.
- if (Tok.isNot(tok::r_paren)) {
+ if (!AteExtraColon && Tok.isNot(tok::r_paren) &&
+ isTokenStringLiteral()) {
----------------
Nit: the `Tok.isNot(tok::r_paren)` check here is redundant, since `isTokenStringLiteral()` covers that check.
================
Comment at: lib/Parse/ParseStmtAsm.cpp:821
}
+ if (!isGotoAsm && Tok.isNot(tok::r_paren)) {
+ Diag(Tok, diag::err_expected) << tok::r_paren;
----------------
I think this should be:
```
if (!isGotoAsm && (Tok.isNot(tok::r_paren) || AteExtraColon)) {
```
otherwise we'll accept a spurious extra colon split from a `::` at the end of a non-`goto` `asm`. Eg, I think in C++:
```
void f() { asm("" : : :: ); }
```
... would be incorrectly accepted, because we'll parse the final `::` as introducing the clobbers list, consume the `::` token, pass this check because the next token is now `)`, and never notice we didn't use the second half of the `::` token.
================
Comment at: lib/Sema/SemaStmtAsm.cpp:659-671
+ if (NS->getIdentifier(i))
+ MyList.emplace_back(std::make_pair(NS->getIdentifier(i)->getName(),
+ Exprs[i]));
+ for (unsigned i = NumOutputs, e = NumOutputs + NumInputs; i != e; ++i)
+ if (NS->getIdentifier(i))
+ MyList.emplace_back(std::make_pair(NS->getIdentifier(i)->getName(),
+ Exprs[i]));
----------------
jyu2 wrote:
> rsmith wrote:
> > This is still exposing / relying on an implementation detail of `GCCAsmStmt`. Please replace `getIdentifier` with `getOuptutIdentifier` / `getInputIdentifier` / `getLabelIdentifier`, adjust the indexing to match, and remove `GCCAsmStmt::getIdentifier`. Or alternatively, iterate over `Names` here rather than walking the parts of the `GCCAsmStmt`.
> Changed. Like this!!!
This is really neat, thanks!
================
Comment at: lib/Sema/SemaStmtAsm.cpp:672
+ // Sort NamedOperandList.
+ stable_sort(NamedOperandList.begin(), NamedOperandList.end(),
+ [](const NamedOperand &LHS, const NamedOperand &RHS) {
----------------
Nit: explicitly spell this as `std::stable_sort` instead of relying on ADL to find it from the `std::` in the type of `NamedOperand`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56571/new/
https://reviews.llvm.org/D56571
More information about the cfe-commits
mailing list