Skip to content

Commit 567bd15

Browse files
committed
Merge branch 'validation/textures-not-bind-root-signatures' into validation/descriptor-tables
2 parents b395a47 + 18e4c3d commit 567bd15

File tree

6,725 files changed

+516956
-132826
lines changed

Some content is hidden

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

6,725 files changed

+516956
-132826
lines changed

.ci/all_requirements.txt

Lines changed: 213 additions & 11 deletions
Large diffs are not rendered by default.

.ci/cache_lit_timing_files.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2+
# See https://llvm.org/LICENSE.txt for license information.
3+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
"""Caches .lit_test_times.txt files between premerge invocations.
5+
6+
.lit_test_times.txt files are used by lit to order tests to best take advantage
7+
of parallelism. Having them around and up to date can result in a ~15%
8+
improvement in test times. This script downloading cached test time files and
9+
uploading new versions to the GCS buckets used for caching.
10+
"""
11+
12+
import sys
13+
import os
14+
import logging
15+
import multiprocessing.pool
16+
import pathlib
17+
import platform
18+
import glob
19+
20+
from google.cloud import storage
21+
22+
GCS_PARALLELISM = 100
23+
24+
25+
def _get_blob_prefix():
26+
return f"lit_timing_{platform.system().lower()}"
27+
28+
29+
def _maybe_upload_timing_file(bucket, timing_file_path):
30+
if os.path.exists(timing_file_path):
31+
timing_file_blob = bucket.blob(_get_blob_prefix() + "/" + timing_file_path)
32+
timing_file_blob.upload_from_filename(timing_file_path)
33+
34+
35+
def upload_timing_files(storage_client, bucket_name: str):
36+
bucket = storage_client.bucket(bucket_name)
37+
with multiprocessing.pool.ThreadPool(GCS_PARALLELISM) as thread_pool:
38+
futures = []
39+
for timing_file_path in glob.glob("**/.lit_test_times.txt", recursive=True):
40+
futures.append(
41+
thread_pool.apply_async(
42+
_maybe_upload_timing_file, (bucket, timing_file_path)
43+
)
44+
)
45+
for future in futures:
46+
future.get()
47+
print("Done uploading")
48+
49+
50+
def _maybe_download_timing_file(blob):
51+
file_name = blob.name.removeprefix(_get_blob_prefix() + "/")
52+
pathlib.Path(os.path.dirname(file_name)).mkdir(parents=True, exist_ok=True)
53+
blob.download_to_filename(file_name)
54+
55+
56+
def download_timing_files(storage_client, bucket_name: str):
57+
bucket = storage_client.bucket(bucket_name)
58+
blobs = bucket.list_blobs(prefix=_get_blob_prefix())
59+
with multiprocessing.pool.ThreadPool(GCS_PARALLELISM) as thread_pool:
60+
futures = []
61+
for timing_file_blob in blobs:
62+
futures.append(
63+
thread_pool.apply_async(
64+
_maybe_download_timing_file, (timing_file_blob,)
65+
)
66+
)
67+
for future in futures:
68+
future.get()
69+
print("Done downloading")
70+
71+
72+
if __name__ == "__main__":
73+
if len(sys.argv) != 2:
74+
logging.fatal("Expected usage is cache_lit_timing_files.py <upload/download>")
75+
sys.exit(1)
76+
action = sys.argv[1]
77+
storage_client = storage.Client()
78+
bucket_name = os.environ["CACHE_GCS_BUCKET"]
79+
if action == "download":
80+
download_timing_files(storage_client, bucket_name)
81+
elif action == "upload":
82+
upload_timing_files(storage_client, bucket_name)
83+
else:
84+
logging.fatal("Expected usage is cache_lit_timing_files.py <upload/download>")
85+
sys.exit(1)

.ci/compute_projects.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@
4949
"flang",
5050
},
5151
"lld": {"bolt", "cross-project-tests"},
52-
# TODO(issues/132795): LLDB should be enabled on clang changes.
53-
"clang": {"clang-tools-extra", "cross-project-tests"},
52+
"clang": {"clang-tools-extra", "cross-project-tests", "lldb"},
5453
"mlir": {"flang"},
5554
# Test everything if ci scripts are changed.
5655
".ci": {
@@ -334,6 +333,7 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
334333
current_platform = platform.system()
335334
if len(sys.argv) == 2:
336335
current_platform = sys.argv[1]
337-
env_variables = get_env_variables(sys.stdin.readlines(), current_platform)
336+
changed_files = [line.strip() for line in sys.stdin.readlines()]
337+
env_variables = get_env_variables(changed_files, current_platform)
338338
for env_variable in env_variables:
339339
print(f"{env_variable}='{env_variables[env_variable]}'")

.ci/compute_projects_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ def test_clang(self):
8383
)
8484
self.assertEqual(
8585
env_variables["projects_to_build"],
86-
"clang;clang-tools-extra;lld;llvm",
86+
"clang;clang-tools-extra;lld;lldb;llvm",
8787
)
8888
self.assertEqual(
8989
env_variables["project_check_targets"],
90-
"check-clang check-clang-tools",
90+
"check-clang check-clang-tools check-lldb",
9191
)
9292
self.assertEqual(
9393
env_variables["runtimes_to_build"], "compiler-rt;libcxx;libcxxabi;libunwind"
@@ -158,11 +158,11 @@ def test_cir(self):
158158
)
159159
self.assertEqual(
160160
env_variables["projects_to_build"],
161-
"clang;clang-tools-extra;lld;llvm;mlir",
161+
"clang;clang-tools-extra;lld;lldb;llvm;mlir",
162162
)
163163
self.assertEqual(
164164
env_variables["project_check_targets"],
165-
"check-clang check-clang-cir check-clang-tools",
165+
"check-clang check-clang-cir check-clang-tools check-lldb",
166166
)
167167
self.assertEqual(
168168
env_variables["runtimes_to_build"], "compiler-rt;libcxx;libcxxabi;libunwind"

.ci/generate_test_report_lib.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ def _parse_ninja_log(ninja_log: list[str]) -> list[tuple[str, str]]:
2727
# We hit the end of the log without finding a build failure, go to
2828
# the next log.
2929
return failures
30+
# If we are doing a build with LLVM_ENABLE_RUNTIMES, we can have nested
31+
# ninja invocations. The sub-ninja will print that a subcommand failed,
32+
# and then the outer ninja will list the command that failed. We should
33+
# ignore the outer failure.
34+
if ninja_log[index - 1].startswith("ninja: build stopped:"):
35+
index += 1
36+
continue
3037
# We are trying to parse cases like the following:
3138
#
3239
# [4/5] test/4.stamp

.ci/generate_test_report_lib_test.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,39 @@ def test_ninja_log_multiple_failures(self):
126126
),
127127
)
128128

129+
# Test that we can correctly handle the runtimes build. the LLVM runtimes
130+
# build will involve ninja invoking more ninja processes within the
131+
# runtimes directory. This means that we see two failures for a failure in
132+
# the runtimes build: one from the inner ninja containing the actual action
133+
# that failed, and one for the sub ninja invocation that failed.
134+
def test_ninja_log_runtimes_failure(self):
135+
failures = generate_test_report_lib.find_failure_in_ninja_logs(
136+
[
137+
[
138+
"[1/5] test/1.stamp",
139+
"[2/5] test/2.stamp",
140+
"FAILED: touch test/2.stamp",
141+
"Wow! This system is really broken!",
142+
"ninja: build stopped: subcommand failed.",
143+
"FAILED: running check-runtime failed.",
144+
"<some random command>",
145+
"ninja: build stopped: subcommand failed.",
146+
]
147+
]
148+
)
149+
self.assertEqual(len(failures), 1)
150+
self.assertEqual(
151+
failures[0],
152+
(
153+
"test/2.stamp",
154+
dedent(
155+
"""\
156+
FAILED: touch test/2.stamp
157+
Wow! This system is really broken!"""
158+
),
159+
),
160+
)
161+
129162
def test_title_only(self):
130163
self.assertEqual(
131164
generate_test_report_lib.generate_report("Foo", 0, [], []),

0 commit comments

Comments
 (0)