Skip to content

Commit 9acb5d0

Browse files
committed
Merge branch 'main' into generalize-fusion
2 parents f7e164b + 2737d01 commit 9acb5d0

File tree

17,079 files changed

+1108464
-550860
lines changed

Some content is hidden

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

17,079 files changed

+1108464
-550860
lines changed

.ci/compute_projects.py

Lines changed: 143 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
PROJECT_DEPENDENCIES = {
2020
"llvm": set(),
2121
"clang": {"llvm"},
22+
"CIR": {"clang", "mlir"},
2223
"bolt": {"clang", "lld", "llvm"},
2324
"clang-tools-extra": {"clang", "llvm"},
2425
"compiler-rt": {"clang", "lld"},
@@ -49,12 +50,23 @@
4950
},
5051
"lld": {"bolt", "cross-project-tests"},
5152
# TODO(issues/132795): LLDB should be enabled on clang changes.
52-
"clang": {"clang-tools-extra", "compiler-rt", "cross-project-tests"},
53-
"clang-tools-extra": {"libc"},
53+
"clang": {"clang-tools-extra", "cross-project-tests"},
5454
"mlir": {"flang"},
5555
# Test everything if ci scripts are changed.
56-
# FIXME: Figure out what is missing and add here.
57-
".ci": {"llvm", "clang", "lld", "lldb"},
56+
".ci": {
57+
"llvm",
58+
"clang",
59+
"CIR",
60+
"lld",
61+
"lldb",
62+
"bolt",
63+
"clang-tools-extra",
64+
"mlir",
65+
"polly",
66+
"flang",
67+
"libclc",
68+
"openmp",
69+
},
5870
}
5971

6072
# This mapping describes runtimes that should be enabled for a specific project,
@@ -64,7 +76,17 @@
6476

6577
# This mapping describes runtimes that should be tested when the key project is
6678
# touched.
67-
DEPENDENT_RUNTIMES_TO_TEST = {"clang": {"libcxx", "libcxxabi", "libunwind"}}
79+
DEPENDENT_RUNTIMES_TO_TEST = {
80+
"clang": {"compiler-rt"},
81+
"clang-tools-extra": {"libc"},
82+
"libc": {"libc"},
83+
".ci": {"compiler-rt", "libc"},
84+
}
85+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG = {
86+
"llvm": {"libcxx", "libcxxabi", "libunwind"},
87+
"clang": {"libcxx", "libcxxabi", "libunwind"},
88+
".ci": {"libcxx", "libcxxabi", "libunwind"},
89+
}
6890

6991
EXCLUDE_LINUX = {
7092
"cross-project-tests", # TODO(issues/132796): Tests are failing.
@@ -93,9 +115,6 @@
93115
"cross-project-tests",
94116
"flang",
95117
"libc",
96-
"libcxx",
97-
"libcxxabi",
98-
"libunwind",
99118
"lldb",
100119
"openmp",
101120
"polly",
@@ -111,6 +130,7 @@
111130
"lldb": "check-lldb",
112131
"llvm": "check-llvm",
113132
"clang": "check-clang",
133+
"CIR": "check-clang-cir",
114134
"bolt": "check-bolt",
115135
"lld": "check-lld",
116136
"flang": "check-flang",
@@ -122,21 +142,52 @@
122142
"polly": "check-polly",
123143
}
124144

125-
RUNTIMES = {"libcxx", "libcxxabi", "libunwind"}
145+
RUNTIMES = {"libcxx", "libcxxabi", "libunwind", "compiler-rt", "libc"}
146+
147+
# Meta projects are projects that need explicit handling but do not reside
148+
# in their own top level folder. To add a meta project, the start of the path
149+
# for the metaproject should be mapped to the name of the project below.
150+
# Multiple paths can map to the same metaproject.
151+
META_PROJECTS = {
152+
("clang", "lib", "CIR"): "CIR",
153+
("clang", "test", "CIR"): "CIR",
154+
("clang", "include", "clang", "CIR"): "CIR",
155+
("*", "docs"): "docs",
156+
("llvm", "utils", "gn"): "gn",
157+
(".github", "workflows", "premerge.yaml"): ".ci",
158+
("third-party",): ".ci",
159+
}
160+
161+
# Projects that should not run any tests. These need to be metaprojects.
162+
SKIP_PROJECTS = ["docs", "gn"]
126163

127164

128-
def _add_dependencies(projects: Set[str]) -> Set[str]:
165+
def _add_dependencies(projects: Set[str], runtimes: Set[str]) -> Set[str]:
129166
projects_with_dependents = set(projects)
130167
current_projects_count = 0
131168
while current_projects_count != len(projects_with_dependents):
132169
current_projects_count = len(projects_with_dependents)
133170
for project in list(projects_with_dependents):
134-
if project not in PROJECT_DEPENDENCIES:
135-
continue
136-
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
171+
if project in PROJECT_DEPENDENCIES:
172+
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
173+
for runtime in runtimes:
174+
if runtime in PROJECT_DEPENDENCIES:
175+
projects_with_dependents.update(PROJECT_DEPENDENCIES[runtime])
137176
return projects_with_dependents
138177

139178

179+
def _exclude_projects(current_projects: Set[str], platform: str) -> Set[str]:
180+
if platform == "Linux":
181+
to_exclude = EXCLUDE_LINUX
182+
elif platform == "Windows":
183+
to_exclude = EXCLUDE_WINDOWS
184+
elif platform == "Darwin":
185+
to_exclude = EXCLUDE_MAC
186+
else:
187+
raise ValueError(f"Unexpected platform: {platform}")
188+
return current_projects.difference(to_exclude)
189+
190+
140191
def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
141192
projects_to_test = set()
142193
for modified_project in modified_projects:
@@ -154,81 +205,108 @@ def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set
154205
):
155206
continue
156207
projects_to_test.add(dependent_project)
157-
if platform == "Linux":
158-
for to_exclude in EXCLUDE_LINUX:
159-
if to_exclude in projects_to_test:
160-
projects_to_test.remove(to_exclude)
161-
elif platform == "Windows":
162-
for to_exclude in EXCLUDE_WINDOWS:
163-
if to_exclude in projects_to_test:
164-
projects_to_test.remove(to_exclude)
165-
elif platform == "Darwin":
166-
for to_exclude in EXCLUDE_MAC:
167-
if to_exclude in projects_to_test:
168-
projects_to_test.remove(to_exclude)
169-
else:
170-
raise ValueError("Unexpected platform.")
208+
projects_to_test = _exclude_projects(projects_to_test, platform)
171209
return projects_to_test
172210

173211

174-
def _compute_projects_to_build(projects_to_test: Set[str]) -> Set[str]:
175-
return _add_dependencies(projects_to_test)
212+
def _compute_projects_to_build(
213+
projects_to_test: Set[str], runtimes: Set[str]
214+
) -> Set[str]:
215+
return _add_dependencies(projects_to_test, runtimes)
176216

177217

178218
def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
179219
check_targets = set()
180220
for project_to_test in projects_to_test:
181-
if project_to_test not in PROJECT_CHECK_TARGETS:
182-
continue
183-
check_targets.add(PROJECT_CHECK_TARGETS[project_to_test])
221+
if project_to_test in PROJECT_CHECK_TARGETS:
222+
check_targets.add(PROJECT_CHECK_TARGETS[project_to_test])
184223
return check_targets
185224

186225

187-
def _compute_runtimes_to_test(projects_to_test: Set[str]) -> Set[str]:
226+
def _compute_runtimes_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
188227
runtimes_to_test = set()
189-
for project_to_test in projects_to_test:
190-
if project_to_test in DEPENDENT_RUNTIMES_TO_TEST:
191-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
192-
if project_to_test in DEPENDENT_RUNTIMES_TO_BUILD:
193-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_BUILD[project_to_test])
194-
return runtimes_to_test
228+
for modified_project in modified_projects:
229+
if modified_project in DEPENDENT_RUNTIMES_TO_TEST:
230+
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[modified_project])
231+
return _exclude_projects(runtimes_to_test, platform)
195232

196233

197-
def _compute_runtime_check_targets(projects_to_test: Set[str]) -> Set[str]:
198-
check_targets = set()
199-
for project_to_test in projects_to_test:
200-
if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
234+
def _compute_runtimes_to_test_needs_reconfig(
235+
modified_projects: Set[str], platform: str
236+
) -> Set[str]:
237+
runtimes_to_test = set()
238+
for modified_project in modified_projects:
239+
if modified_project in DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG:
240+
runtimes_to_test.update(
241+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG[modified_project]
242+
)
243+
return _exclude_projects(runtimes_to_test, platform)
244+
245+
246+
def _compute_runtimes_to_build(
247+
runtimes_to_test: Set[str], modified_projects: Set[str], platform: str
248+
) -> Set[str]:
249+
runtimes_to_build = set(runtimes_to_test)
250+
for modified_project in modified_projects:
251+
if modified_project in DEPENDENT_RUNTIMES_TO_BUILD:
252+
runtimes_to_build.update(DEPENDENT_RUNTIMES_TO_BUILD[modified_project])
253+
return _exclude_projects(runtimes_to_build, platform)
254+
255+
256+
def _path_matches(matcher: tuple[str], file_path: tuple[str]) -> bool:
257+
if len(file_path) < len(matcher):
258+
return False
259+
for match_part, file_part in zip(matcher, file_path):
260+
if match_part == "*" or file_part == "*":
201261
continue
202-
for runtime_to_test in DEPENDENT_RUNTIMES_TO_TEST[project_to_test]:
203-
check_targets.add(PROJECT_CHECK_TARGETS[runtime_to_test])
204-
return check_targets
262+
if match_part != file_part:
263+
return False
264+
return True
265+
266+
267+
def _get_modified_projects_for_file(modified_file: str) -> Set[str]:
268+
modified_projects = set()
269+
path_parts = pathlib.Path(modified_file).parts
270+
for meta_project_files in META_PROJECTS.keys():
271+
if _path_matches(meta_project_files, path_parts):
272+
meta_project = META_PROJECTS[meta_project_files]
273+
if meta_project in SKIP_PROJECTS:
274+
return set()
275+
modified_projects.add(meta_project)
276+
modified_projects.add(pathlib.Path(modified_file).parts[0])
277+
return modified_projects
205278

206279

207280
def _get_modified_projects(modified_files: list[str]) -> Set[str]:
208281
modified_projects = set()
209282
for modified_file in modified_files:
210-
path_parts = pathlib.Path(modified_file).parts
211-
# Exclude files in the docs directory. They do not impact an test
212-
# targets and there is a separate workflow used for ensuring the
213-
# documentation builds.
214-
if len(path_parts) > 2 and path_parts[1] == "docs":
215-
continue
216-
# Exclude files for the gn build. We do not test it within premerge
217-
# and changes occur often enough that they otherwise take up
218-
# capacity.
219-
if len(path_parts) > 3 and path_parts[:3] == ("llvm", "utils", "gn"):
220-
continue
221-
modified_projects.add(pathlib.Path(modified_file).parts[0])
283+
modified_projects.update(_get_modified_projects_for_file(modified_file))
222284
return modified_projects
223285

224286

225287
def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
226288
modified_projects = _get_modified_projects(modified_files)
227289
projects_to_test = _compute_projects_to_test(modified_projects, platform)
228-
projects_to_build = _compute_projects_to_build(projects_to_test)
290+
runtimes_to_test = _compute_runtimes_to_test(modified_projects, platform)
291+
runtimes_to_test_needs_reconfig = _compute_runtimes_to_test_needs_reconfig(
292+
modified_projects, platform
293+
)
294+
runtimes_to_build = _compute_runtimes_to_build(
295+
runtimes_to_test | runtimes_to_test_needs_reconfig, modified_projects, platform
296+
)
297+
projects_to_build = _compute_projects_to_build(projects_to_test, runtimes_to_build)
229298
projects_check_targets = _compute_project_check_targets(projects_to_test)
230-
runtimes_to_build = _compute_runtimes_to_test(projects_to_test)
231-
runtimes_check_targets = _compute_runtime_check_targets(projects_to_test)
299+
runtimes_check_targets = _compute_project_check_targets(runtimes_to_test)
300+
runtimes_check_targets_needs_reconfig = _compute_project_check_targets(
301+
runtimes_to_test_needs_reconfig
302+
)
303+
304+
# CIR is used as a pseudo-project in this script. It is built as part of the
305+
# clang build, but it requires an explicit option to enable. We set that
306+
# option here, and remove it from the projects_to_build list.
307+
enable_cir = "ON" if "CIR" in projects_to_build else "OFF"
308+
projects_to_build.discard("CIR")
309+
232310
# We use a semicolon to separate the projects/runtimes as they get passed
233311
# to the CMake invocation and thus we need to use the CMake list separator
234312
# (;). We use spaces to separate the check targets as they end up getting
@@ -238,6 +316,10 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
238316
"project_check_targets": " ".join(sorted(projects_check_targets)),
239317
"runtimes_to_build": ";".join(sorted(runtimes_to_build)),
240318
"runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
319+
"runtimes_check_targets_needs_reconfig": " ".join(
320+
sorted(runtimes_check_targets_needs_reconfig)
321+
),
322+
"enable_cir": enable_cir,
241323
}
242324

243325

0 commit comments

Comments
 (0)