Skip to content

Commit 24d44fd

Browse files
committed
Added codegen_units flag for setting Rustc resource sets
1 parent 7a1f037 commit 24d44fd

File tree

6 files changed

+454
-7
lines changed

6 files changed

+454
-7
lines changed

rust/private/rustc.bzl

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ load(
2222
"CPP_LINK_NODEPS_DYNAMIC_LIBRARY_ACTION_NAME",
2323
"CPP_LINK_STATIC_LIBRARY_ACTION_NAME",
2424
)
25-
load("//rust/private:common.bzl", "rust_common")
26-
load("//rust/private:compat.bzl", "abs")
27-
load("//rust/private:lto.bzl", "construct_lto_arguments")
28-
load("//rust/private:providers.bzl", "RustcOutputDiagnosticsInfo", _BuildInfo = "BuildInfo")
29-
load("//rust/private:stamp.bzl", "is_stamping_enabled")
25+
load(":common.bzl", "rust_common")
26+
load(":compat.bzl", "abs")
27+
load(":lto.bzl", "construct_lto_arguments")
28+
load(":providers.bzl", "RustcOutputDiagnosticsInfo", _BuildInfo = "BuildInfo")
29+
load(":rustc_resource_set.bzl", "get_rustc_resource_set", "is_codegen_units_enabled")
30+
load(":stamp.bzl", "is_stamping_enabled")
3031
load(
31-
"//rust/private:utils.bzl",
32+
":utils.bzl",
3233
"expand_dict_value_locations",
3334
"expand_list_element_locations",
3435
"find_cc_toolchain",
@@ -792,6 +793,7 @@ def collect_inputs(
792793
return compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs, ambiguous_libs
793794

794795
def construct_arguments(
796+
*,
795797
ctx,
796798
attr,
797799
file,
@@ -1000,6 +1002,7 @@ def construct_arguments(
10001002

10011003
add_edition_flags(rustc_flags, crate_info)
10021004
_add_lto_flags(ctx, toolchain, rustc_flags, crate_info)
1005+
_add_codegen_units_flags(toolchain, rustc_flags)
10031006

10041007
# Link!
10051008
if ("link" in emit and crate_info.type not in ["rlib", "lib"]) or add_flags_for_binary:
@@ -1124,6 +1127,7 @@ def construct_arguments(
11241127
return args, env
11251128

11261129
def rustc_compile_action(
1130+
*,
11271131
ctx,
11281132
attr,
11291133
toolchain,
@@ -1337,6 +1341,7 @@ def rustc_compile_action(
13371341
len(crate_info.srcs.to_list()),
13381342
),
13391343
toolchain = "@rules_rust//rust:toolchain_type",
1344+
resource_set = get_rustc_resource_set(toolchain),
13401345
)
13411346
if args_metadata:
13421347
ctx.actions.run(
@@ -1372,6 +1377,7 @@ def rustc_compile_action(
13721377
len(crate_info.srcs.to_list()),
13731378
),
13741379
toolchain = "@rules_rust//rust:toolchain_type",
1380+
resource_set = get_rustc_resource_set(toolchain),
13751381
)
13761382
else:
13771383
fail("No process wrapper was defined for {}".format(ctx.label))
@@ -1597,6 +1603,20 @@ def _add_lto_flags(ctx, toolchain, args, crate):
15971603
lto_args = construct_lto_arguments(ctx, toolchain, crate)
15981604
args.add_all(lto_args)
15991605

1606+
def _add_codegen_units_flags(toolchain, args):
1607+
"""Adds flags to an Args object to configure codgen_units for 'rustc'.
1608+
1609+
https://doc.rust-lang.org/rustc/codegen-options/index.html#codegen-units
1610+
1611+
Args:
1612+
toolchain (rust_toolchain): The current target's `rust_toolchain`.
1613+
args (Args): A reference to an Args object
1614+
"""
1615+
if not is_codegen_units_enabled(toolchain):
1616+
return
1617+
1618+
args.add("-Ccodegen-units={}".format(toolchain._codegen_units))
1619+
16001620
def establish_cc_info(ctx, attr, crate_info, toolchain, cc_toolchain, feature_configuration, interface_library):
16011621
"""If the produced crate is suitable yield a CcInfo to allow for interop with cc rules
16021622

rust/private/rustc_resource_set.bzl

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
"""Resource set definitions for Rustc actions"""
2+
3+
def _resource_set_cpu_1(_os_name, _inputs):
4+
return {"cpu": 1}
5+
6+
def _resource_set_cpu_2(_os_name, _inputs):
7+
return {"cpu": 2}
8+
9+
def _resource_set_cpu_3(_os_name, _inputs):
10+
return {"cpu": 3}
11+
12+
def _resource_set_cpu_4(_os_name, _inputs):
13+
return {"cpu": 4}
14+
15+
def _resource_set_cpu_5(_os_name, _inputs):
16+
return {"cpu": 5}
17+
18+
def _resource_set_cpu_6(_os_name, _inputs):
19+
return {"cpu": 6}
20+
21+
def _resource_set_cpu_7(_os_name, _inputs):
22+
return {"cpu": 7}
23+
24+
def _resource_set_cpu_8(_os_name, _inputs):
25+
return {"cpu": 8}
26+
27+
def _resource_set_cpu_9(_os_name, _inputs):
28+
return {"cpu": 9}
29+
30+
def _resource_set_cpu_10(_os_name, _inputs):
31+
return {"cpu": 10}
32+
33+
def _resource_set_cpu_11(_os_name, _inputs):
34+
return {"cpu": 11}
35+
36+
def _resource_set_cpu_12(_os_name, _inputs):
37+
return {"cpu": 12}
38+
39+
def _resource_set_cpu_13(_os_name, _inputs):
40+
return {"cpu": 13}
41+
42+
def _resource_set_cpu_14(_os_name, _inputs):
43+
return {"cpu": 14}
44+
45+
def _resource_set_cpu_15(_os_name, _inputs):
46+
return {"cpu": 15}
47+
48+
def _resource_set_cpu_16(_os_name, _inputs):
49+
return {"cpu": 16}
50+
51+
def _resource_set_cpu_17(_os_name, _inputs):
52+
return {"cpu": 17}
53+
54+
def _resource_set_cpu_18(_os_name, _inputs):
55+
return {"cpu": 18}
56+
57+
def _resource_set_cpu_19(_os_name, _inputs):
58+
return {"cpu": 19}
59+
60+
def _resource_set_cpu_20(_os_name, _inputs):
61+
return {"cpu": 20}
62+
63+
def _resource_set_cpu_21(_os_name, _inputs):
64+
return {"cpu": 21}
65+
66+
def _resource_set_cpu_22(_os_name, _inputs):
67+
return {"cpu": 22}
68+
69+
def _resource_set_cpu_23(_os_name, _inputs):
70+
return {"cpu": 23}
71+
72+
def _resource_set_cpu_24(_os_name, _inputs):
73+
return {"cpu": 24}
74+
75+
def _resource_set_cpu_25(_os_name, _inputs):
76+
return {"cpu": 25}
77+
78+
def _resource_set_cpu_26(_os_name, _inputs):
79+
return {"cpu": 26}
80+
81+
def _resource_set_cpu_27(_os_name, _inputs):
82+
return {"cpu": 27}
83+
84+
def _resource_set_cpu_28(_os_name, _inputs):
85+
return {"cpu": 28}
86+
87+
def _resource_set_cpu_29(_os_name, _inputs):
88+
return {"cpu": 29}
89+
90+
def _resource_set_cpu_30(_os_name, _inputs):
91+
return {"cpu": 30}
92+
93+
def _resource_set_cpu_31(_os_name, _inputs):
94+
return {"cpu": 31}
95+
96+
def _resource_set_cpu_32(_os_name, _inputs):
97+
return {"cpu": 32}
98+
99+
def _resource_set_cpu_33(_os_name, _inputs):
100+
return {"cpu": 33}
101+
102+
def _resource_set_cpu_34(_os_name, _inputs):
103+
return {"cpu": 34}
104+
105+
def _resource_set_cpu_35(_os_name, _inputs):
106+
return {"cpu": 35}
107+
108+
def _resource_set_cpu_36(_os_name, _inputs):
109+
return {"cpu": 36}
110+
111+
def _resource_set_cpu_37(_os_name, _inputs):
112+
return {"cpu": 37}
113+
114+
def _resource_set_cpu_38(_os_name, _inputs):
115+
return {"cpu": 38}
116+
117+
def _resource_set_cpu_39(_os_name, _inputs):
118+
return {"cpu": 39}
119+
120+
def _resource_set_cpu_40(_os_name, _inputs):
121+
return {"cpu": 40}
122+
123+
def _resource_set_cpu_41(_os_name, _inputs):
124+
return {"cpu": 41}
125+
126+
def _resource_set_cpu_42(_os_name, _inputs):
127+
return {"cpu": 42}
128+
129+
def _resource_set_cpu_43(_os_name, _inputs):
130+
return {"cpu": 43}
131+
132+
def _resource_set_cpu_44(_os_name, _inputs):
133+
return {"cpu": 44}
134+
135+
def _resource_set_cpu_45(_os_name, _inputs):
136+
return {"cpu": 45}
137+
138+
def _resource_set_cpu_46(_os_name, _inputs):
139+
return {"cpu": 46}
140+
141+
def _resource_set_cpu_47(_os_name, _inputs):
142+
return {"cpu": 47}
143+
144+
def _resource_set_cpu_48(_os_name, _inputs):
145+
return {"cpu": 48}
146+
147+
def _resource_set_cpu_49(_os_name, _inputs):
148+
return {"cpu": 49}
149+
150+
def _resource_set_cpu_50(_os_name, _inputs):
151+
return {"cpu": 50}
152+
153+
def _resource_set_cpu_51(_os_name, _inputs):
154+
return {"cpu": 51}
155+
156+
def _resource_set_cpu_52(_os_name, _inputs):
157+
return {"cpu": 52}
158+
159+
def _resource_set_cpu_53(_os_name, _inputs):
160+
return {"cpu": 53}
161+
162+
def _resource_set_cpu_54(_os_name, _inputs):
163+
return {"cpu": 54}
164+
165+
def _resource_set_cpu_55(_os_name, _inputs):
166+
return {"cpu": 55}
167+
168+
def _resource_set_cpu_56(_os_name, _inputs):
169+
return {"cpu": 56}
170+
171+
def _resource_set_cpu_57(_os_name, _inputs):
172+
return {"cpu": 57}
173+
174+
def _resource_set_cpu_58(_os_name, _inputs):
175+
return {"cpu": 58}
176+
177+
def _resource_set_cpu_59(_os_name, _inputs):
178+
return {"cpu": 59}
179+
180+
def _resource_set_cpu_60(_os_name, _inputs):
181+
return {"cpu": 60}
182+
183+
def _resource_set_cpu_61(_os_name, _inputs):
184+
return {"cpu": 61}
185+
186+
def _resource_set_cpu_62(_os_name, _inputs):
187+
return {"cpu": 62}
188+
189+
def _resource_set_cpu_63(_os_name, _inputs):
190+
return {"cpu": 63}
191+
192+
def _resource_set_cpu_64(_os_name, _inputs):
193+
return {"cpu": 64}
194+
195+
_RESOURCE_SETS = {
196+
1: _resource_set_cpu_1,
197+
2: _resource_set_cpu_2,
198+
3: _resource_set_cpu_3,
199+
4: _resource_set_cpu_4,
200+
5: _resource_set_cpu_5,
201+
6: _resource_set_cpu_6,
202+
7: _resource_set_cpu_7,
203+
8: _resource_set_cpu_8,
204+
9: _resource_set_cpu_9,
205+
10: _resource_set_cpu_10,
206+
11: _resource_set_cpu_11,
207+
12: _resource_set_cpu_12,
208+
13: _resource_set_cpu_13,
209+
14: _resource_set_cpu_14,
210+
15: _resource_set_cpu_15,
211+
16: _resource_set_cpu_16,
212+
17: _resource_set_cpu_17,
213+
18: _resource_set_cpu_18,
214+
19: _resource_set_cpu_19,
215+
20: _resource_set_cpu_20,
216+
21: _resource_set_cpu_21,
217+
22: _resource_set_cpu_22,
218+
23: _resource_set_cpu_23,
219+
24: _resource_set_cpu_24,
220+
25: _resource_set_cpu_25,
221+
26: _resource_set_cpu_26,
222+
27: _resource_set_cpu_27,
223+
28: _resource_set_cpu_28,
224+
29: _resource_set_cpu_29,
225+
30: _resource_set_cpu_30,
226+
31: _resource_set_cpu_31,
227+
32: _resource_set_cpu_32,
228+
33: _resource_set_cpu_33,
229+
34: _resource_set_cpu_34,
230+
35: _resource_set_cpu_35,
231+
36: _resource_set_cpu_36,
232+
37: _resource_set_cpu_37,
233+
38: _resource_set_cpu_38,
234+
39: _resource_set_cpu_39,
235+
40: _resource_set_cpu_40,
236+
41: _resource_set_cpu_41,
237+
42: _resource_set_cpu_42,
238+
43: _resource_set_cpu_43,
239+
44: _resource_set_cpu_44,
240+
45: _resource_set_cpu_45,
241+
46: _resource_set_cpu_46,
242+
47: _resource_set_cpu_47,
243+
48: _resource_set_cpu_48,
244+
49: _resource_set_cpu_49,
245+
50: _resource_set_cpu_50,
246+
51: _resource_set_cpu_51,
247+
52: _resource_set_cpu_52,
248+
53: _resource_set_cpu_53,
249+
54: _resource_set_cpu_54,
250+
55: _resource_set_cpu_55,
251+
56: _resource_set_cpu_56,
252+
57: _resource_set_cpu_57,
253+
58: _resource_set_cpu_58,
254+
59: _resource_set_cpu_59,
255+
60: _resource_set_cpu_60,
256+
61: _resource_set_cpu_61,
257+
62: _resource_set_cpu_62,
258+
63: _resource_set_cpu_63,
259+
64: _resource_set_cpu_64,
260+
}
261+
262+
def is_codegen_units_enabled(toolchain):
263+
"""Check whether or not codegen-units should be applied by the toolchain.
264+
265+
Args:
266+
toolchain (rust_toolchain): The current `rust_toolchain`.
267+
268+
Returns:
269+
bool: Whether or not codegen-units is enabled
270+
"""
271+
if toolchain._codegen_units <= 0:
272+
return False
273+
274+
if toolchain._experimental_use_cc_common_link:
275+
return False
276+
277+
return True
278+
279+
def get_rustc_resource_set(toolchain):
280+
"""Get the `ctx.actions.run.resource_set` for the `Rustc` action.
281+
282+
Args:
283+
toolchain (rust_toolchain): The current rust_toolchain toolchain.
284+
285+
Returns:
286+
Optional[Callable]: A resource set appropriate for the current configuration.
287+
"""
288+
if not is_codegen_units_enabled(toolchain):
289+
return None
290+
291+
codegen_units = toolchain._codegen_units
292+
293+
if codegen_units > len(_RESOURCE_SETS):
294+
return _RESOURCE_SETS[len(_RESOURCE_SETS)]
295+
296+
return _RESOURCE_SETS[codegen_units]

0 commit comments

Comments
 (0)