@@ -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 :
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