[clang] 749abf0 - [clang-format] annotate inline assembly parens (#201703)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 25 13:11:44 PDT 2026
Author: Gedare Bloom
Date: 2026-06-25T22:11:39+02:00
New Revision: 749abf04eadaa38549e0168f1f6def513c86bee1
URL: https://github.com/llvm/llvm-project/commit/749abf04eadaa38549e0168f1f6def513c86bee1
DIFF: https://github.com/llvm/llvm-project/commit/749abf04eadaa38549e0168f1f6def513c86bee1.diff
LOG: [clang-format] annotate inline assembly parens (#201703)
Annotate the opening and closing parens of inline assembly. This will
make other improvements related to inline assembly easier.
Added:
Modified:
clang/lib/Format/FormatToken.h
clang/lib/Format/TokenAnnotator.cpp
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index 556bb0f3dd0af..ed9ce435ea765 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -99,6 +99,7 @@ namespace format {
TYPE(InheritanceComma) \
TYPE(InlineASMBrace) \
TYPE(InlineASMColon) \
+ TYPE(InlineASMParen) \
TYPE(InlineASMSymbolicNameLSquare) \
TYPE(JavaAnnotation) \
TYPE(JsAndAndEqual) \
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 634143d843c3b..997203aeb1526 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -2542,6 +2542,8 @@ class AnnotatingParser {
} else if (Current.is(tok::r_paren)) {
if (rParenEndsCast(Current))
Current.setType(TT_CastRParen);
+ if (Current.MatchingParen && Current.MatchingParen->is(TT_InlineASMParen))
+ Current.setType(TT_InlineASMParen);
if (Current.MatchingParen && Current.Next &&
!Current.Next->isBinaryOperator() &&
Current.Next->isNoneOf(
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 534b356175f82..0a211f5325e6f 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1507,23 +1507,54 @@ void UnwrappedLineParser::parseStructuralElement(
return;
}
switch (FormatTok->Tok.getKind()) {
- case tok::kw_asm:
+ case tok::kw_asm: {
+ // Track whether to skip formatting inline asm by finalizing the tokens
+ // in the block. Formatting is skipped inside of braces by default.
+ // A style option could be added to also skip formatting inside parens.
+ bool DoNotFormat = false;
+ tok::TokenKind OpenType;
+ tok::TokenKind CloseType;
nextToken();
+ while (FormatTok &&
+ FormatTok->isOneOf(tok::kw_volatile, tok::kw_inline, tok::kw_goto)) {
+ nextToken();
+ }
+ if (!FormatTok)
+ break;
if (FormatTok->is(tok::l_brace)) {
FormatTok->setFinalizedType(TT_InlineASMBrace);
+ OpenType = tok::l_brace;
+ CloseType = tok::r_brace;
+ DoNotFormat = true;
+ } else if (FormatTok->is(tok::l_paren)) {
+ OpenType = tok::l_paren;
+ CloseType = tok::r_paren;
+ FormatTok->setFinalizedType(TT_InlineASMParen);
+ } else {
+ break;
+ }
+ if (DoNotFormat) {
+ FormatToken *OpenTok = FormatTok;
+ int NestLevel = 0;
nextToken();
while (FormatTok && !eof()) {
- if (FormatTok->is(tok::r_brace)) {
- FormatTok->setFinalizedType(TT_InlineASMBrace);
- nextToken();
- addUnwrappedLine();
- break;
+ if (FormatTok->is(OpenType)) {
+ ++NestLevel;
+ } else if (FormatTok->is(CloseType)) {
+ --NestLevel;
+ if (NestLevel < 1) {
+ FormatTok->setFinalizedType(OpenTok->getType());
+ nextToken();
+ addUnwrappedLine();
+ break;
+ }
}
FormatTok->Finalized = true;
nextToken();
}
}
break;
+ }
case tok::kw_namespace:
parseNamespace();
return;
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index b6300e2ca78ba..8250af8af6942 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -1930,9 +1930,11 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
":);");
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_InlineASMParen);
Tokens = annotate("asm volatile (\n"
"\"a_label:\"\n"
@@ -1941,9 +1943,11 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
":);");
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[7], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_InlineASMParen);
Tokens = annotate("__asm__(\n"
"\"a_label:\"\n"
@@ -1952,9 +1956,11 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
": y);");
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_InlineASMParen);
Tokens = annotate("__asm volatile (\n"
"\"a_label:\"\n"
@@ -1964,9 +1970,11 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
":);");
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[8], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_InlineASMParen);
Tokens = annotate("asm(\n"
"\"insn\"\n"
@@ -1975,9 +1983,11 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
": \"memory\");");
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[13], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[14], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[16], tok::r_paren, TT_InlineASMParen);
Tokens = annotate("__asm__ volatile (\n"
"\"ldr r1, [r0, %%[sym]]\"\n"
@@ -1986,9 +1996,21 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
");");
ASSERT_EQ(Tokens.size(), 21u) << Tokens;
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_InlineASMParen);
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
EXPECT_TOKEN(Tokens[6], tok::l_square, TT_InlineASMSymbolicNameLSquare);
+ EXPECT_TOKEN(Tokens[18], tok::r_paren, TT_InlineASMParen);
+
+ Tokens = annotate("__asm__ volatile inline goto (\"nop\" : : : : l );");
+ ASSERT_EQ(Tokens.size(), 14u) << Tokens;
+ EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
+ EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_InlineASMParen);
+ EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[7], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[8], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[9], tok::colon, TT_InlineASMColon);
+ EXPECT_TOKEN(Tokens[11], tok::r_paren, TT_InlineASMParen);
}
TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
More information about the cfe-commits
mailing list