On Mon, Oct 6, 2025 at 11:39 AM Tom Tromey <[email protected]> wrote:
>
> This patch adds a .clang-format file to the gdb repository.
>
> The resulting reformatting is what I'd describe as "ok but not great".
> There are a few variances from our normal style, some discussed in
> comments in the file, and some in the bug.
>
> I've somewhat come around to the idea that some ugliness is
> acceptable, particularly because I regularly see code that's already
> ugly anyway -- either in formatting or along some other dimension.
>
> I don't know of a way to enforce a particular version.  I have only
> tried clang-format 18 with this particular file.  I've documented this
> in the file.
>
> I used "AllowShortFunctionsOnASingleLine: InlineOnly" as previously
> discussed.  I feel that the spirit of the GNU style is that vertical
> space is free, and we should use "None" here.  (This goes against
> something we previously decided on the list, though.)
>
> The file is in the root directory for ease of use.
>
> For the time being you should not bulk reformat files.  I think we
> should have a flag day for this, but at some later point.  See the
> earlier discussion for details.

We had a small discussion about this at the cauldron and I think it
was agreed that we should include the same across at least GCC,
gdb/binutils too.
In a similar way to .editorconfig .
Note I do think it is a good idea to have this even though I am not
going to use clang-format to do my own formating.

Thanks,
Andrew

>
> New in v4:
> * Fix a comment
> * Remove ForEachMacros - no longer correct
> * Remove IncludeCategories - no longer correct
>
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30098
> ---
>  .clang-format | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  .gitignore    |   1 -
>  2 files changed, 174 insertions(+), 1 deletion(-)
>  create mode 100644 .clang-format
>
> diff --git a/.clang-format b/.clang-format
> new file mode 100644
> index 00000000000..efaa21a4b9a
> --- /dev/null
> +++ b/.clang-format
> @@ -0,0 +1,174 @@
> +# -*- yaml -*-
> +
> +# A clang format style for gdb.
> +
> +# ⚠️⚠️⚠️ DO NOT BULK REFORMAT FILES ⚠️⚠️⚠️
> +
> +# This style is still in flux and still considered "alpha".  Use "git
> +# clang-format" or the like to reformat just the parts your patch
> +# touches -- at most.  At some point in the future we will bulk
> +# reformat and at that point we'll send out new instructions.
> +
> +# This has only been tried with clang-format 18.
> +
> +# A few known bugs:
> +
> +# * Labels are not handled GNU-style.
> +#   https://github.com/llvm/llvm-project/issues/24492
> +#   https://github.com/llvm/llvm-project/issues/53717
> +
> +# * Function call bin-packing is weird.
> +#   https://github.com/llvm/llvm-project/issues/31255
> +#   https://github.com/llvm/llvm-project/issues/37051
> +#   In some spots this means an unavoidable line break just after a
> +#   "(".
> +
> +# * gettext calls like "_()" are reformatted to "_ ()"
> +#   I don't think there's an upstream bug for this yet
> +
> +# * '#if defined ()' removes the space before the paren:
> +#   https://github.com/llvm/llvm-project/issues/55292
> +
> +# * Open brace after a lambda should be on new line.
> +#   https://github.com/llvm/llvm-project/issues/133135
> +
> +# * Braced initializers don't put a newline before the "{".
> +#   Historically gdb was inconsistent about this.
> +
> +
> +# Options here are generally in alphabetical order.
> +
> +Language: Cpp
> +# BasedOnStyle: GNU
> +AccessModifierOffset: -2
> +AlignAfterOpenBracket: Align
> +AlignConsecutiveAssignments: false
> +AlignConsecutiveDeclarations: false
> +AlignConsecutiveMacros: false
> +AlignEscapedNewlines: Left
> +AlignOperands: true
> +AlignTrailingComments: true
> +AllowAllArgumentsOnNextLine: false
> +AllowAllParametersOfDeclarationOnNextLine: false
> +AllowShortBlocksOnASingleLine: false
> +AllowShortCaseLabelsOnASingleLine: false
> +AllowShortEnumsOnASingleLine: false
> +AllowShortFunctionsOnASingleLine: None
> +AllowShortIfStatementsOnASingleLine: Never
> +AllowShortLambdasOnASingleLine: All
> +AllowShortLoopsOnASingleLine: false
> +AlwaysBreakAfterReturnType: TopLevelDefinitions
> +AlwaysBreakBeforeMultilineStrings: false
> +AlwaysBreakTemplateDeclarations: Yes
> +#
> +# Run:
> +# git grep 'define ATTRIBUTE_' -- include gdb* | \
> +#   sed -e's/^.*\(ATTRIBUTE_[A-Z0-9_]*\).*$/\1/' | \
> +#   sort -u | \
> +#   sed -e "s/^\(.*\)$/  '\1',/"
> +AttributeMacros: [
> +  'ATTRIBUTE_ALIGNED_ALIGNOF',
> +  'ATTRIBUTE_COLD',
> +  'ATTRIBUTE_FORMAT_PRINTF_STANDARD',
> +  'ATTRIBUTE_FPTR_PRINTF',
> +  'ATTRIBUTE_GCC_STRUCT',
> +  'ATTRIBUTE_HOT',
> +  'ATTRIBUTE_MALLOC',
> +  'ATTRIBUTE_NOCLONE',
> +  'ATTRIBUTE_NONNULL',
> +  'ATTRIBUTE_NONSTRING',
> +  'ATTRIBUTE_NORETURN',
> +  'ATTRIBUTE_NO_SANITIZE_UNDEFINED',
> +  'ATTRIBUTE_NULL_PRINTF',
> +  'ATTRIBUTE_PACKED',
> +  'ATTRIBUTE_PRINTF',
> +  'ATTRIBUTE_PURE',
> +  'ATTRIBUTE_RESULT_SIZE_1',
> +  'ATTRIBUTE_RESULT_SIZE_1_2',
> +  'ATTRIBUTE_RESULT_SIZE_2',
> +  'ATTRIBUTE_RETURNS_NONNULL',
> +  'ATTRIBUTE_SENTINEL',
> +  'ATTRIBUTE_UNUSED',
> +  'ATTRIBUTE_UNUSED_LABEL',
> +  'ATTRIBUTE_UNUSED_RESULT',
> +  'ATTRIBUTE_USED',
> +  'ATTRIBUTE_VISIBILITY',
> +  'ATTRIBUTE_WARN_UNUSED_RESULT',
> +  ]
> +BinPackArguments: true
> +BinPackParameters: true
> +# Because BreakBeforeBraces = GNU, we don't need BraceWrapping.
> +BreakBeforeBinaryOperators: All
> +BreakBeforeBraces: GNU
> +BreakBeforeTernaryOperators: true
> +BreakConstructorInitializers: BeforeColon
> +BreakInheritanceList: BeforeColon
> +BreakStringLiterals: true
> +ColumnLimit: 79
> +CommentPragmas: 'ARI:'
> +CompactNamespaces: false
> +ConstructorInitializerIndentWidth: 2
> +ContinuationIndentWidth: 2
> +Cpp11BracedListStyle: false
> +DerivePointerAlignment: false
> +DisableFormat: false
> +# The docs say not to use this.
> +# ExperimentalAutoDetectBinPacking: false
> +FixNamespaceComments: true
> +IncludeBlocks: Preserve
> +# IncludeIsMainRegex: [ not needed ]
> +IndentCaseLabels: false
> +# See notes at the top of the file -- this is incorrect but that's a
> +# clang-format issue.
> +IndentGotoLabels: true
> +IndentPPDirectives: None
> +IndentWidth: 2
> +IndentWrappedFunctionNames: false
> +KeepEmptyLinesAtTheStartOfBlocks: false
> +LineEnding: LF
> +# MacroBlockBegin: ''
> +# MacroBlockEnd: ''
> +MaxEmptyLinesToKeep: 1
> +NamespaceIndentation: None
> +# NamespaceMacros
> +PackConstructorInitializers: Never
> +PenaltyBreakAssignment: 50
> +PenaltyBreakBeforeFirstCallParameter: 100
> +# clang 20 setting:
> +# PenaltyBreakBeforeMemberAccess: 50
> +# PenaltyBreakComment
> +# PenaltyBreakFirstLessLess
> +PenaltyBreakOpenParenthesis: 100
> +# PenaltyBreakString
> +# PenaltyBreakTemplateDeclaration
> +# PenaltyExcessCharacter
> +# PenaltyReturnTypeOnItsOwnLine
> +PointerAlignment: Right
> +# RawStringFormats: [ I don't think we need this ]
> +# Should be IndentOnly but that requires clang 20.
> +ReflowComments: false
> +# FIXME - enable
> +SortIncludes: Never
> +SortUsingDeclarations: true
> +SpaceAfterCStyleCast: true
> +SpaceAfterLogicalNot: false
> +SpaceAfterTemplateKeyword: false
> +SpaceBeforeAssignmentOperators: true
> +SpaceBeforeCpp11BracedList: true
> +SpaceBeforeCtorInitializerColon: true
> +SpaceBeforeInheritanceColon: true
> +SpaceBeforeParens: Always
> +SpaceBeforeRangeBasedForLoopColon: true
> +SpaceBeforeSquareBrackets: false
> +SpaceInEmptyBlock: false
> +SpacesBeforeTrailingComments: 1
> +SpacesInAngles: false
> +SpacesInContainerLiterals: true
> +SpacesInParens: Never
> +SpacesInSquareBrackets: false
> +Standard: c++17
> +# Oh Python...
> +StatementMacros: [ 'PyObject_HEAD' ]
> +TabWidth: 8
> +TypenameMacros: [ 'ENUM_BITFIELD' ]
> +UseTab: ForContinuationAndIndentation
> diff --git a/.gitignore b/.gitignore
> index 7f1c81e00c4..eb44ff7f255 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -37,7 +37,6 @@ TAGS.sub
>  .local.vimrc
>  .lvimrc
>
> -.clang-format
>  .clang-tidy
>  .clangd
>  .cache
> --
> 2.49.0
>

Reply via email to