dart-sdk/runtime/tools/run_clang_tidy.dart
Ryan Macnak a48d05c8f9 [vm] Add build-time option to use absl mutexes in place of pthread mutexes.
TEST=ci, cbuild
Bug: b/220994782
Change-Id: Id1a15d0d9fcef192847b25a2549730eb1014a99e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/236760
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2022-03-10 23:48:05 +00:00

160 lines
5 KiB
Dart

// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:pool/pool.dart';
const String clangTidy = './buildtools/linux-x64/clang/bin/clang-tidy';
List<String> compilerFlagsForFile(String filepath) {
final flags = <String>[
'-Iruntime',
'-Ithird_party',
'-Iruntime/include',
'-Ithird_party/tcmalloc/gperftools/src',
'-Ithird_party/boringssl/src/include',
'-Ithird_party/zlib',
'-DTARGET_ARCH_X64',
'-DDEBUG',
'-DDART_TARGET_OS_LINUX',
'-DTESTING',
'-std=c++17',
'-x',
'c++',
];
return flags;
}
Future<ProcessResult> runClangTidyOn(String filepath) async {
// The `runtime/.clang-tidy` file has the enabled checks in it.
final args = <String>['-quiet', filepath, '--']
..addAll(compilerFlagsForFile(filepath));
return await Process.run(clangTidy, args);
}
final pool = new Pool(max(1, Platform.numberOfProcessors ~/ 2));
// Exclude running the linter on those files.
final Set<String> excludedFiles = Set<String>.from([
// These files are not valid cc files but rather cc templates
'runtime/bin/abi_version_in.cc',
'runtime/bin/builtin_in.cc',
'runtime/bin/snapshot_in.cc',
'runtime/lib/libgen_in.cc',
'runtime/vm/version_in.cc',
// These files cannot be analyzed by itself (must be included indirectly).
'runtime/bin/android.h',
'runtime/bin/eventhandler_android.h',
'runtime/bin/eventhandler_fuchsia.h',
'runtime/bin/eventhandler_linux.h',
'runtime/bin/eventhandler_macos.h',
'runtime/bin/eventhandler_win.h',
'runtime/bin/namespace_android.h',
'runtime/bin/namespace_fuchsia.h',
'runtime/bin/namespace_linux.h',
'runtime/bin/namespace_macos.h',
'runtime/bin/namespace_win.h',
'runtime/bin/socket_base_android.h',
'runtime/bin/socket_base_fuchsia.h',
'runtime/bin/socket_base_linux.h',
'runtime/bin/socket_base_macos.h',
'runtime/bin/socket_base_win.h',
'runtime/bin/thread_absl.h',
'runtime/bin/thread_android.h',
'runtime/bin/thread_fuchsia.h',
'runtime/bin/thread_linux.h',
'runtime/bin/thread_macos.h',
'runtime/bin/thread_win.h',
'runtime/platform/atomic_android.h',
'runtime/platform/atomic_fuchsia.h',
'runtime/platform/atomic_linux.h',
'runtime/platform/atomic_macos.h',
'runtime/platform/atomic_win.h',
'runtime/platform/utils_android.h',
'runtime/platform/utils_fuchsia.h',
'runtime/platform/utils_linux.h',
'runtime/platform/utils_macos.h',
'runtime/platform/utils_win.h',
'runtime/vm/compiler/assembler/assembler_arm.h',
'runtime/vm/compiler/assembler/assembler_arm64.h',
'runtime/vm/compiler/assembler/assembler_ia32.h',
'runtime/vm/compiler/assembler/assembler_riscv.h',
'runtime/vm/compiler/assembler/assembler_x64.h',
'runtime/vm/compiler/runtime_offsets_extracted.h',
'runtime/vm/constants_arm.h',
'runtime/vm/constants_arm64.h',
'runtime/vm/constants_ia32.h',
'runtime/vm/constants_riscv.h',
'runtime/vm/constants_x64.h',
'runtime/vm/cpu_arm.h',
'runtime/vm/cpu_arm64.h',
'runtime/vm/cpu_ia32.h',
'runtime/vm/cpu_riscv.h',
'runtime/vm/cpu_x64.h',
'runtime/vm/instructions_arm.h',
'runtime/vm/instructions_arm64.h',
'runtime/vm/instructions_ia32.h',
'runtime/vm/instructions_riscv.h',
'runtime/vm/instructions_x64.h',
'runtime/vm/os_thread_absl.h',
'runtime/vm/os_thread_android.h',
'runtime/vm/os_thread_fuchsia.h',
'runtime/vm/os_thread_linux.h',
'runtime/vm/os_thread_macos.h',
'runtime/vm/os_thread_win.h',
'runtime/vm/regexp_assembler_bytecode_inl.h',
'runtime/vm/simulator_arm64.h',
'runtime/vm/simulator_arm.h',
'runtime/vm/simulator_riscv.h',
'runtime/vm/stack_frame_arm.h',
'runtime/vm/stack_frame_arm64.h',
'runtime/vm/stack_frame_ia32.h',
'runtime/vm/stack_frame_riscv.h',
'runtime/vm/stack_frame_x64.h',
// Only available in special builds
'runtime/bin/io_service_no_ssl.h',
'runtime/bin/utils_win.h',
'runtime/vm/compiler/backend/locations_helpers_arm.h',
]);
main(List<String> files) async {
bool isFirstFailure = true;
files = files.where((filepath) => !excludedFiles.contains(filepath)).toList();
// Analyze the [files] in parallel.
await Future.wait(files.map((String filepath) async {
final processResult =
await pool.withResource(() => runClangTidyOn(filepath));
final int exitCode = processResult.exitCode;
final String stdout = processResult.stdout.trim();
final String stderr = processResult.stderr.trim();
if (exitCode != 0 || stdout.isNotEmpty) {
if (!isFirstFailure) {
print('');
print('--------------------------------------------------------------');
print('');
}
isFirstFailure = false;
}
if (exitCode != 0) {
print('exit-code: $exitCode');
print('stdout:');
print('${stdout}');
print('stderr:');
print('${stderr}');
} else if (stdout.isNotEmpty) {
// The actual lints go to stdout.
print(stdout);
}
}));
}