If true, colons in ASM parameters will be placed after line breaks.
true:
asm volatile("string",
:
: val);
false:
asm volatile("string", : : val);
Differential Revision: https://reviews.llvm.org/D91950
+**BreakBeforeInlineASMColon** (``BreakBeforeInlineASMColonStyle``) :versionbadge:`clang-format 16`
+ The inline ASM colon style to use.
+
+ Possible values:
+
+ * ``BBIAS_Never`` (in configuration: ``Never``)
+ No break before inline ASM colon.
+
+ .. code-block:: c++
+
+ asm volatile("string", : : val);
+
+ * ``BBIAS_OnlyMultiline`` (in configuration: ``OnlyMultiline``)
+ Break before inline ASM colon if the line length is longer than column
+ limit.
+
+ .. code-block:: c++
+
+ asm volatile("string", : : val);
+ asm("cmoveq %1, %2, %[result]"
+ : [result] "=r"(result)
+ : "r"(test), "r"(new), "[result]"(old));
+
+ * ``BBIAS_Always`` (in configuration: ``Always``)
+ Always break before inline ASM colon.
+
+ .. code-block:: c++
+
+ asm volatile("string",
+ :
+ : val);
+
+
+
**BreakBeforeTernaryOperators** (``Boolean``) :versionbadge:`clang-format 3.7`
If ``true``, ternary operators will be placed after line breaks.
/// \version 12
BreakBeforeConceptDeclarationsStyle BreakBeforeConceptDeclarations;
+ /// Different ways to break ASM parameters.
+ enum BreakBeforeInlineASMColonStyle : int8_t {
+ /// No break before inline ASM colon.
+ /// \code
+ /// asm volatile("string", : : val);
+ /// \endcode
+ BBIAS_Never,
+ /// Break before inline ASM colon if the line length is longer than column
+ /// limit.
+ /// \code
+ /// asm volatile("string", : : val);
+ /// asm("cmoveq %1, %2, %[result]"
+ /// : [result] "=r"(result)
+ /// : "r"(test), "r"(new), "[result]"(old));
+ /// \endcode
+ BBIAS_OnlyMultiline,
+ /// Always break before inline ASM colon.
+ /// \code
+ /// asm volatile("string",
+ /// :
+ /// : val);
+ /// \endcode
+ BBIAS_Always,
+ };
+
+ /// The inline ASM colon style to use.
+ /// \version 16
+ BreakBeforeInlineASMColonStyle BreakBeforeInlineASMColon;
+
/// If ``true``, ternary operators will be placed after line breaks.
/// \code
/// true:
BreakBeforeBinaryOperators == R.BreakBeforeBinaryOperators &&
BreakBeforeBraces == R.BreakBeforeBraces &&
BreakBeforeConceptDeclarations == R.BreakBeforeConceptDeclarations &&
+ BreakBeforeInlineASMColon == R.BreakBeforeInlineASMColon &&
BreakBeforeTernaryOperators == R.BreakBeforeTernaryOperators &&
BreakConstructorInitializers == R.BreakConstructorInitializers &&
BreakInheritanceList == R.BreakInheritanceList &&
auto LambdaBodyLength = getLengthToMatchingParen(Current, State.Stack);
return LambdaBodyLength > getColumnLimit(State);
}
- if (Current.MustBreakBefore || Current.is(TT_InlineASMColon))
+ if (Current.MustBreakBefore ||
+ (Current.is(TT_InlineASMColon) &&
+ (Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_Always ||
+ Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_OnlyMultiline))) {
return true;
+ }
if (CurrentState.BreakBeforeClosingBrace &&
Current.closesBlockOrBlockTypeList(Style)) {
return true;
};
template <>
+struct ScalarEnumerationTraits<FormatStyle::BreakBeforeInlineASMColonStyle> {
+ static void enumeration(IO &IO,
+ FormatStyle::BreakBeforeInlineASMColonStyle &Value) {
+ IO.enumCase(Value, "Never", FormatStyle::BBIAS_Never);
+ IO.enumCase(Value, "OnlyMultiline", FormatStyle::BBIAS_OnlyMultiline);
+ IO.enumCase(Value, "Always", FormatStyle::BBIAS_Always);
+ }
+};
+template <>
struct ScalarEnumerationTraits<FormatStyle::BreakConstructorInitializersStyle> {
static void
enumeration(IO &IO, FormatStyle::BreakConstructorInitializersStyle &Value) {
IO.mapOptional("BreakBeforeConceptDeclarations",
Style.BreakBeforeConceptDeclarations);
IO.mapOptional("BreakBeforeBraces", Style.BreakBeforeBraces);
+ IO.mapOptional("BreakBeforeInlineASMColon",
+ Style.BreakBeforeInlineASMColon);
IO.mapOptional("BreakBeforeTernaryOperators",
Style.BreakBeforeTernaryOperators);
IO.mapOptional("BreakConstructorInitializers",
LLVMStyle.BreakArrays = true;
LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
LLVMStyle.BreakBeforeConceptDeclarations = FormatStyle::BBCDS_Always;
+ LLVMStyle.BreakBeforeInlineASMColon = FormatStyle::BBIAS_OnlyMultiline;
LLVMStyle.BreakBeforeTernaryOperators = true;
LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;
LLVMStyle.BraceWrapping = {/*AfterCaseLabel=*/false,
}
}
+ if (Line.startsWith(tok::kw_asm) && Right.is(TT_InlineASMColon) &&
+ Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_Always) {
+ return true;
+ }
+
// If the last token before a '}', ']', or ')' is a comma or a trailing
// comment, the intention is to insert a line break after it in order to make
// shuffling around entries easier. Import statements, especially in
format(Input, Style));
}
+TEST_F(FormatTest, BreakBeforeInlineASMColon) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakBeforeInlineASMColon = FormatStyle::BBIAS_Never;
+ /* Test the behaviour with long lines */
+ Style.ColumnLimit = 40;
+ verifyFormat("asm volatile(\"loooooooooooooooooooong\",\n"
+ " : : val);",
+ Style);
+ verifyFormat("asm volatile(\"loooooooooooooooooooong\",\n"
+ " : val1 : val2);",
+ Style);
+ verifyFormat("asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
+ " \"cpuid\\n\\t\"\n"
+ " \"xchgq\\t%%rbx %%rsi\\n\\t\",\n"
+ " : \"=a\" : \"a\");",
+ Style);
+ Style.ColumnLimit = 80;
+ verifyFormat("asm volatile(\"string\", : : val);", Style);
+ verifyFormat("asm volatile(\"string\", : val1 : val2);", Style);
+
+ Style.BreakBeforeInlineASMColon = FormatStyle::BBIAS_Always;
+ verifyFormat("asm volatile(\"string\",\n"
+ " :\n"
+ " : val);",
+ Style);
+ verifyFormat("asm volatile(\"string\",\n"
+ " : val1\n"
+ " : val2);",
+ Style);
+ /* Test the behaviour with long lines */
+ Style.ColumnLimit = 40;
+ verifyFormat("asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
+ " \"cpuid\\n\\t\"\n"
+ " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
+ " : \"=a\"(*rEAX)\n"
+ " : \"a\"(value));",
+ Style);
+ verifyFormat("asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
+ " \"cpuid\\n\\t\"\n"
+ " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
+ " :\n"
+ " : \"a\"(value));",
+ Style);
+ verifyFormat("asm volatile(\"loooooooooooooooooooong\",\n"
+ " :\n"
+ " : val);",
+ Style);
+ verifyFormat("asm volatile(\"loooooooooooooooooooong\",\n"
+ " : val1\n"
+ " : val2);",
+ Style);
+}
+
TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
FormatStyle Style = getLLVMStyle();
Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;