• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- bazel-starlark -*-
2# Copyright 2023 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""workaround for exceptional clang actions. e.g. exit=137 (OOM?),
6 or DeadlineExceeded.
7"""
8
9load("@builtin//runtime.star", "runtime")
10load("@builtin//struct.star", "module")
11
12def __step_config(ctx, step_config):
13    exceptions = [
14        {
15            # TODO: crbug.com/380755128 - Make each compile unit smaller.
16            "name": "fuzzer_large_compile",
17            "action_outs": [
18                # keep-sorted start
19                "./obj/chrome/test/fuzzing/htmlfuzzer_proto_gen/htmlfuzzer_sub.pb.o",
20                "./obj/chrome/test/fuzzing/jsfuzzer/jsfuzzer.o",
21                "./obj/chrome/test/fuzzing/jsfuzzer_proto_gen/jsfuzzer.pb.o",
22                "./obj/chrome/test/fuzzing/jsfuzzer_proto_gen/jsfuzzer_sub.pb.o",
23                "./obj/chrome/test/fuzzing/renderer_fuzzing/renderer_in_process_mojolpm_fuzzer/renderer_in_process_mojolpm_fuzzer.o",
24                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidl_fuzzer_grammar/webidl_fuzzer_grammar.o",
25                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidl_fuzzer_grammar_proto_gen/webidl_fuzzer_grammar.pb.o",
26                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidl_in_process_fuzzer/webidl_in_process_fuzzer.o",
27                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer/webidlfuzzer.o",
28                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer/webidlfuzzer_sub0.o",
29                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer/webidlfuzzer_sub9.o",
30                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer.pb.o",
31                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub0.pb.o",
32                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub1.pb.o",
33                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub10.pb.o",
34                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub11.pb.o",
35                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub2.pb.o",
36                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub3.pb.o",
37                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub4.pb.o",
38                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub5.pb.o",
39                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub6.pb.o",
40                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub7.pb.o",
41                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub8.pb.o",
42                "./obj/chrome/test/fuzzing/webidl_fuzzing/webidlfuzzer_proto_gen/webidlfuzzer_sub9.pb.o",
43                # keep-sorted end
44            ],
45            "timeout": "15m",
46            # need 9G for debug build
47            "use_large": True,
48        },
49    ]
50    new_rules = []
51    for rule in step_config["rules"]:
52        if not rule["name"].endswith("/cxx"):
53            new_rules.append(rule)
54            continue
55        if "action_outs" in rule:
56            fail("unexpeced \"action_outs\" in cxx rule %s" % rule["name"])
57        for ex in exceptions:
58            r = {}
59            r.update(rule)
60            r["name"] += "/exception/" + ex["name"]
61            outs = ex["action_outs"]
62            if runtime.os == "windows":
63                outs = [obj.removesuffix(".o") + ".obj" for obj in outs if obj.startswith("./obj/")]
64            r["action_outs"] = outs
65            if "timeout" in ex:
66                r["timeout"] = ex["timeout"]
67            if "use_large" in ex and ex["use_large"]:
68                # use `_large` variant of platform if it doesn't use default platform,
69                # i.e. mac/win case.
70                if "platform_ref" in r:
71                    r["platform_ref"] = r["platform_ref"] + "_large"
72                else:
73                    r["platform_ref"] = "large"
74            if r.get("handler") == "rewrite_rewrapper":
75                r["handler"] = "rewrite_rewrapper_large"
76            new_rules.append(r)
77        new_rules.append(rule)
78    step_config["rules"] = new_rules
79    return step_config
80
81clang_exception = module(
82    "clang_exception",
83    step_config = __step_config,
84)
85