Skip to content

Commit 3347d3b

Browse files
authored
Merge branch 'main' into ci-fix-dead-docker-prune
2 parents d4ce893 + 065cfd9 commit 3347d3b

257 files changed

Lines changed: 5166 additions & 4538 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.clang-tidy

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,32 @@
11
# Copyright (C) 2023-2024 Advanced Micro Devices, Inc.
22
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
33

4+
# bugprone-unchecked-optional-access was disabled through clang-tidy 17
5+
# (llvm/llvm-project#55530: hung 180s+ on AIEAssignBufferDescriptorIDs.cpp);
6+
# re-enabled since it completes in ~7s under the 20.1.0 pin.
7+
# misc-include-cleaner is excluded, matching LLVM's own .clang-tidy: too
8+
# unreliable on forward-declaration-heavy, template-heavy code.
9+
# clang-analyzer-* is scoped to four suites (Chromium's precedent) rather
10+
# than the full wildcard, which is noisy inside MLIR/LLVM header boilerplate.
11+
# Four sub-checks within those suites are further disabled: they still fire
12+
# on MLIR/LLVM's own internals (StorageUniquerSupport.h, APInt.h, etc., via
13+
# templates instantiated from our code) rather than anything we own, and
14+
# unlike ordinary checks, the static analyzer's diagnostics aren't scoped by
15+
# --header-filter/-line-filter (confirmed: neither suppresses them) nor by
16+
# NOLINT in our own files (the diagnostic's location is inside the vendored
17+
# header, a different file than any NOLINT we could place).
18+
# - StackAddressEscape false-positives on MLIR's StorageUniquerSupport.h
19+
# lambda-returning helpers.
20+
# - CallAndMessage false-positives in mlir::Value's null-check idiom.
21+
# - BitwiseShift false-positives in llvm::SmallBitVector's bit-packing.
22+
# - cplusplus.NewDelete false-positives in llvm::APInt's inline-vs-heap
23+
# storage switch.
24+
# readability-identifier-naming is disabled repo-wide for now: expanding
25+
# enforcement to all 102 production files (see git history) surfaced 614
26+
# pre-existing naming violations that aren't safely batch-fixable (clang-tidy
27+
# -fix corrupted shared headers via overlapping cross-TU edits twice), and
28+
# per-site manual review/rename is a separate, much larger effort tracked
29+
# on its own. Re-enable once that renaming pass lands.
430
Checks: >
531
-*,
632
clang-diagnostic-*,
@@ -11,22 +37,30 @@ Checks: >
1137
-misc-non-private-member-variables-in-classes,
1238
-misc-no-recursion,
1339
-misc-use-anonymous-namespace,
14-
readability-identifier-naming,
15-
-misc-const-correctness,
40+
-misc-include-cleaner,
41+
-readability-identifier-naming,
1642
bugprone-argument-comment,
1743
bugprone-assert-side-effect,
44+
bugprone-bitwise-pointer-cast,
1845
bugprone-branch-clone,
1946
bugprone-copy-constructor-init,
2047
bugprone-dangling-handle,
2148
bugprone-dynamic-static-initializers,
49+
bugprone-incorrect-enable-shared-from-this,
2250
bugprone-macro-parentheses,
2351
bugprone-macro-repeated-side-effects,
2452
bugprone-misplaced-widening-cast,
2553
bugprone-move-forwarding-reference,
2654
bugprone-multiple-statement-macro,
55+
bugprone-optional-value-conversion,
56+
bugprone-pointer-arithmetic-on-polymorphic-object,
57+
bugprone-return-const-ref-from-parameter,
2758
bugprone-suspicious-semicolon,
59+
bugprone-suspicious-stringview-data-usage,
2860
bugprone-swapped-arguments,
2961
bugprone-terminating-continue,
62+
bugprone-unchecked-optional-access,
63+
bugprone-unused-local-non-trivial-variable,
3064
bugprone-unused-raii,
3165
bugprone-unused-return-value,
3266
misc-redundant-expression,
@@ -60,7 +94,15 @@ Checks: >
6094
readability-redundant-smartptr-get,
6195
readability-simplify-boolean-expr,
6296
readability-simplify-subscript-expr,
63-
readability-use-anyofallof
97+
readability-use-anyofallof,
98+
clang-analyzer-core.*,
99+
-clang-analyzer-core.StackAddressEscape,
100+
-clang-analyzer-core.CallAndMessage,
101+
-clang-analyzer-core.BitwiseShift,
102+
clang-analyzer-cplusplus.*,
103+
-clang-analyzer-cplusplus.NewDelete,
104+
clang-analyzer-unix.*,
105+
clang-analyzer-deadcode.*
64106
65107
CheckOptions:
66108
# LLVM
@@ -72,14 +114,8 @@ CheckOptions:
72114
value: camelBack
73115
- key: readability-identifier-naming.FunctionIgnoredRegexp
74116
value: "LLVMFuzzerTestOneInput"
75-
- key: readability-identifier-naming.MemberCase
76-
value: CamelCase
77-
- key: readability-identifier-naming.ParameterCase
78-
value: CamelCase
79117
- key: readability-identifier-naming.UnionCase
80118
value: CamelCase
81-
- key: readability-identifier-naming.VariableCase
82-
value: CamelCase
83119
- key: readability-identifier-naming.IgnoreMainLikeFunctions
84120
value: 1
85121
- key: readability-redundant-member-init.IgnoreBaseInCopyConstructors

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@
1111
- [ ] Docs / docstrings updated if the change is user-facing
1212
- [ ] Code is formatted (`clang-format` for C++, `black` for Python — see [CONTRIBUTING](../CONTRIBUTING.md))
1313
- [ ] `ruff check` and `pyright` pass locally for any touched Python file in their covered paths (see [CONTRIBUTING](../CONTRIBUTING.md#linting-python))
14+
- [ ] `clang-tidy` passes locally for any touched file on the enabled list (see [CONTRIBUTING](../CONTRIBUTING.md#static-analysis-for-c-clang-tidy))

.github/workflows/lintAndFormat.yml

Lines changed: 173 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ jobs:
3939
fetch-depth: 2
4040
submodules: "true"
4141

42-
- name: Install clang-tidy
42+
- name: Install C/C++ toolchain
4343
run: |
4444
sudo apt-get update
45-
sudo apt-get install -y clang-tidy ninja-build clang libelf-dev
45+
sudo apt-get install -y ninja-build clang libelf-dev
4646
4747
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
4848
with:
@@ -57,6 +57,9 @@ jobs:
5757
--requirements python/requirements.txt \
5858
--install-non-eudsl
5959
python -m pip install --require-hashes -r python/requirements_dev.lock
60+
# clang-tidy comes from this lockfile (see python/requirements_dev.txt),
61+
# pinned to match clang-format's pin below -- not a system apt package,
62+
# so its version doesn't silently drift across CI runs.
6063
6164
- name: Get MLIR
6265
id: mlir-wheels
@@ -95,16 +98,40 @@ jobs:
9598
-DLLVM_EXTERNAL_LIT=$(which lit) \
9699
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
97100
98-
# aie-headers only aggregates the dialect/op/type tablegen targets;
99-
# it does not pull in the Conversion pass enum header or the vendored
100-
# xaiengine/*.h headers copied from third_party/aie-rt. Without these,
101-
# clang-tidy fails to compile any touched file that includes
102-
# aie/Conversion/Passes.h (e.g. lib/Conversion/**) or xaiengine/*.h
103-
# (e.g. lib/Targets/AIERT.cpp) with a file-not-found error instead of
104-
# a real lint finding.
101+
# Pass/op tablegen targets not covered by aie-headers/mlir-headers --
102+
# needed so clang-tidy (below) can parse pass source files
103+
# that include generated headers. Extend this
104+
# list as the clang-tidy file set (see the "clang-tidy" step below)
105+
# grows into dialects/passes with their own IncGen targets.
106+
# MLIRAIEPassIncGen -> AIEPasses.h.inc
107+
# MLIRAIEXPassIncGen -> AIEXPasses.h.inc
108+
# MLIRAIEVecPassIncGen -> AIEVec Transforms/Passes.h.inc
109+
# MLIRAIEVecAnalysisPassIncGen -> AIEVec Analysis/Passes.h.inc
110+
# MLIRAIEVecTransformOpsIncGen -> AIEVecTransformOps.h.inc
111+
# MLIRAIEConversionPassIncGen -> Conversion Passes.h.inc,
112+
# PassesEnums.h.inc
113+
# MLIRXLLVMOpsIncGen -> XLLVMOps.h.inc
114+
# MLIRXLLVMConversionsIncGen -> XLLVMConversions.inc
115+
# MLIRAIEVecAttributesIncGen -> AIEVecEnums.h.inc,
116+
# AIEVecAttributes.h.inc
117+
# MLIRAIENormalizeAddressSpacesIncGen -> AIENormalizeAddressSpaces.inc
118+
# xaienginecdo_static-headers -> vendored xaiengine/*.h used by
119+
# the CDO backend (AIETargets,
120+
# AIEToConfiguration)
121+
# aiecc_version -> aiecc/AIECCVersion.h
105122
ninja aie-headers mlir-headers \
123+
MLIRAIEPassIncGen \
124+
MLIRAIEXPassIncGen \
125+
MLIRAIEVecPassIncGen \
126+
MLIRAIEVecAnalysisPassIncGen \
127+
MLIRAIEVecTransformOpsIncGen \
106128
MLIRAIEConversionPassIncGen \
107-
xaienginecdo_static-headers
129+
MLIRXLLVMOpsIncGen \
130+
MLIRXLLVMConversionsIncGen \
131+
MLIRAIEVecAttributesIncGen \
132+
MLIRAIENormalizeAddressSpacesIncGen \
133+
xaienginecdo_static-headers \
134+
aiecc_version
108135
109136
# Assemble the Python package sources (hand-written + tablegen'd op/enum
110137
# wrappers) into build/python/aie. This needs only tablegen, not a full
@@ -141,21 +168,145 @@ jobs:
141168
- name: Lint Python (ruff)
142169
run: ruff check
143170

144-
- name: Analyze
145-
id: clang-tidy-fixes
171+
- name: Lint C/C++ (clang-tidy)
146172
run: |
173+
# Currently-enabled file(s) -- keep this in sync with the `files:`
174+
# regex on the `clang-tidy` pre-commit hook (.pre-commit-config.yaml),
175+
# same convention ruff-check's hook uses to stay in sync with
176+
# ruff.toml's `include`. Grows one file at a time.
177+
#
178+
# Unlike pyright/ruff (which always check their whole configured
179+
# set), this only checks enabled files that this PR actually
180+
# touched -- as the enabled list grows, most PRs don't touch C++
181+
# passes at all, and re-linting the full set on every push would be
182+
# wasted time. A PR that doesn't touch any enabled file passes
183+
# trivially; one that does gets that file fully re-checked (not
184+
# just the changed lines).
185+
CLANG_TIDY_FILES=(
186+
lib/CAPI/Dialects.cpp
187+
lib/CAPI/Registration.cpp
188+
lib/CAPI/TargetModel.cpp
189+
lib/CAPI/Translation.cpp
190+
lib/Conversion/AIEToConfiguration/AIEToConfiguration.cpp
191+
lib/Conversion/AIEVecToLLVM/AIEVecToLLVM.cpp
192+
lib/Conversion/AIEXToEmitC/AIEXToEmitC.cpp
193+
lib/Dialect/AIE/IR/AIEDialect.cpp
194+
lib/Dialect/AIE/IR/AIETargetModel.cpp
195+
lib/Dialect/AIE/IR/AIETraceOps.cpp
196+
lib/Dialect/AIE/Transforms/AIEAssignBufferDescriptorIDs.cpp
197+
lib/Dialect/AIE/Transforms/AIEAssignBuffers.cpp
198+
lib/Dialect/AIE/Transforms/AIEAssignCoreLinkFiles.cpp
199+
lib/Dialect/AIE/Transforms/AIEAssignLockIDs.cpp
200+
lib/Dialect/AIE/Transforms/AIECanonicalizeDevice.cpp
201+
lib/Dialect/AIE/Transforms/AIECoreToStandard.cpp
202+
lib/Dialect/AIE/Transforms/AIECreatePathFindFlows.cpp
203+
lib/Dialect/AIE/Transforms/AIEFindFlows.cpp
204+
lib/Dialect/AIE/Transforms/AIEGenerateColumnControlOverlay.cpp
205+
lib/Dialect/AIE/Transforms/AIEHoistVectorTransferPointers.cpp
206+
lib/Dialect/AIE/Transforms/AIEInsertTraceFlows.cpp
207+
lib/Dialect/AIE/Transforms/AIELocalizeLocks.cpp
208+
lib/Dialect/AIE/Transforms/AIELowerCascadeFlows.cpp
209+
lib/Dialect/AIE/Transforms/AIENormalizeAddressSpaces.cpp
210+
lib/Dialect/AIE/Transforms/AIEObjectFifoLiveness.cpp
211+
lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp
212+
lib/Dialect/AIE/Transforms/AIEPathFinder.cpp
213+
lib/Dialect/AIE/Transforms/AIEPlacer.cpp
214+
lib/Dialect/AIE/Transforms/AIEPlaceTiles.cpp
215+
lib/Dialect/AIE/Transforms/AIESAPlacer.cpp
216+
lib/Dialect/AIE/Transforms/AIETraceToConfig.cpp
217+
lib/Dialect/AIE/Transforms/AIEVectorToPointerLoops.cpp
218+
lib/Dialect/AIE/Transforms/AIEVectorTransferLowering.cpp
219+
lib/Dialect/AIE/Util/AIERegisterDatabase.cpp
220+
lib/Dialect/AIEVec/IR/AIE1/AIEVecAIE1Ops.cpp
221+
lib/Dialect/AIEVec/IR/AIEVecOps.cpp
222+
lib/Dialect/AIEVec/IR/AIEVecTypes.cpp
223+
lib/Dialect/AIEVec/TransformOps/AIEVecTransformOps.cpp
224+
lib/Dialect/AIEVec/TransformOps/DialectExtension.cpp
225+
lib/Dialect/AIEVec/Transforms/AIEVecOptimizations.cpp
226+
lib/Dialect/AIEVec/Transforms/ConvertVectorToAIEVec.cpp
227+
lib/Dialect/AIEVec/Transforms/CopyRemoval.cpp
228+
lib/Dialect/AIEVec/Transforms/DynamicSizeNoImplicitBroadcast.cpp
229+
lib/Dialect/AIEVec/Transforms/FoldMulAddChainToConvOp.cpp
230+
lib/Dialect/AIEVec/Transforms/SplitVectorLoadUpsChains.cpp
231+
lib/Dialect/AIEVec/Transforms/VectorToAIEVecConversions.cpp
232+
lib/Dialect/AIEVec/Transforms/VectorToVectorConversions.cpp
233+
lib/Dialect/AIEVec/Utils/Utils.cpp
234+
lib/Dialect/AIEX/IR/AIEXDialect.cpp
235+
lib/Dialect/AIEX/IR/DmaDecomposition.cpp
236+
lib/Dialect/AIEX/Transforms/AIEAssignRuntimeSequenceBDIDs.cpp
237+
lib/Dialect/AIEX/Transforms/AIECreateBroadcastPacket.cpp
238+
lib/Dialect/AIEX/Transforms/AIECreateCores.cpp
239+
lib/Dialect/AIEX/Transforms/AIECreateLocks.cpp
240+
lib/Dialect/AIEX/Transforms/AIECtrlPacketToDma.cpp
241+
lib/Dialect/AIEX/Transforms/AIEDecomposeLargeDmaBd.cpp
242+
lib/Dialect/AIEX/Transforms/AIEDMATasksToNPU.cpp
243+
lib/Dialect/AIEX/Transforms/AIEDmaToNpu.cpp
244+
lib/Dialect/AIEX/Transforms/AIEExpandLoadPdi.cpp
245+
lib/Dialect/AIEX/Transforms/AIEInlineTraceConfig.cpp
246+
lib/Dialect/AIEX/Transforms/AIELowerCoreReset.cpp
247+
lib/Dialect/AIEX/Transforms/AIELowerDmaChannelReset.cpp
248+
lib/Dialect/AIEX/Transforms/AIELowerDynamicBDPool.cpp
249+
lib/Dialect/AIEX/Transforms/AIELowerMemcpy.cpp
250+
lib/Dialect/AIEX/Transforms/AIELowerMulticast.cpp
251+
lib/Dialect/AIEX/Transforms/AIELowerScratchpadParameters.cpp
252+
lib/Dialect/AIEX/Transforms/AIELowerSetLock.cpp
253+
lib/Dialect/AIEX/Transforms/AIEMaterializeBDChains.cpp
254+
lib/Dialect/AIEX/Transforms/AIEMaterializeRuntimeSequences.cpp
255+
lib/Dialect/AIEX/Transforms/AIENpuToCert.cpp
256+
lib/Dialect/AIEX/Transforms/AIESCFToControlFlow.cpp
257+
lib/Dialect/AIEX/Transforms/AIESubstituteShimDMAAllocations.cpp
258+
lib/Dialect/AIEX/Transforms/AIETransformBfpTypes.cpp
259+
lib/Dialect/AIEX/Transforms/AIETxnToControlPacket.cpp
260+
lib/Dialect/AIEX/Transforms/AIEUnrollRuntimeSequenceLoops.cpp
261+
lib/Dialect/AIEX/Transforms/AIEVerifyRuntimeRearm.cpp
262+
lib/Dialect/AIEX/Transforms/AIEXToStandard.cpp
263+
lib/Dialect/AIEX/Utils/AIETokenAnalysis.cpp
264+
lib/Dialect/AIEX/Utils/AIEUtils.cpp
265+
lib/Dialect/AIEX/Utils/BdLowering.cpp
266+
lib/Dialect/XLLVM/XLLVMOps.cpp
267+
lib/Target/LLVMIR/Dialect/XLLVM/XLLVMToLLVMIRTranslation.cpp
268+
lib/Targets/AIEFlowsToJSON.cpp
269+
lib/Targets/AIELLVMLink.cpp
270+
lib/Targets/AIERT.cpp
271+
lib/Targets/AIETargetBCF.cpp
272+
lib/Targets/AIETargetCDODirect.cpp
273+
lib/Targets/AIETargetCppTxn.cpp
274+
lib/Targets/AIETargetLdScript.cpp
275+
lib/Targets/AIETargetNPU.cpp
276+
lib/Targets/AIETargets.cpp
277+
lib/Targets/AIETargetShared.cpp
278+
lib/Targets/AIETargetSimulationFiles.cpp
279+
lib/Targets/AIETargetUcCert.cpp
280+
lib/Targets/AIETargetXAIEV2.cpp
281+
tools/aiecc/aiecc.cpp
282+
tools/aie-lsp-server/aie-lsp-server.cpp
283+
tools/aie-opt/aie-opt.cpp
284+
tools/aie-reset/aie-reset.cpp
285+
tools/aie-translate/aie-translate.cpp
286+
tools/aie-visualize/aie-visualize.cpp
287+
tools/bootgen/bootgen_c_api.cpp
288+
)
289+
147290
git fetch origin main
148-
git diff -U0 origin/main | clang-tidy-diff -p1 -path build -export-fixes fixes.yml
149-
if [ -f fixes.yml ]; then
150-
echo "FIXES=true" | tee $GITHUB_OUTPUT
291+
mapfile -t changed < <(git diff --name-only origin/main HEAD)
292+
293+
to_check=()
294+
for f in "${CLANG_TIDY_FILES[@]}"; do
295+
for c in "${changed[@]}"; do
296+
if [ "$f" = "$c" ]; then
297+
to_check+=("$f")
298+
break
299+
fi
300+
done
301+
done
302+
303+
if [ "${#to_check[@]}" -eq 0 ]; then
304+
echo "No enabled clang-tidy file changed in this PR -- skipping."
305+
exit 0
151306
fi
152307
153-
- name: Upload clang-tidy fixes
154-
if: ${{ steps.clang-tidy-fixes.outputs.FIXES }}
155-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
156-
with:
157-
path: fixes.yml
158-
name: clang-tidy-fixes.yml
308+
echo "Running clang-tidy on: ${to_check[*]}"
309+
MLIR_AIE_BUILD_DIR="$PWD/build" utils/run_clang_tidy.sh "${to_check[@]}"
159310
160311
161312
formatting:
@@ -178,7 +329,7 @@ jobs:
178329
- name: Install clang-format
179330
uses: aminya/setup-cpp@8170d66c458f4a045220b7b0966c10940bb2a15d # v1.8.1
180331
with:
181-
clangformat: 17.0.1
332+
clangformat: 20.1.0
182333

183334
- name: Setup Python env
184335
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6

0 commit comments

Comments
 (0)