blob: 3163e3fea64157544c0da73e541019743195ecb2 [file]
"""Tests for cc_binary with split functions."""
load("@rules_testing//lib:analysis_test.bzl", "test_suite")
load("@rules_testing//lib:truth.bzl", "matching")
load("@rules_testing//lib:util.bzl", "util")
load("//cc:cc_binary.bzl", "cc_binary")
load("//tests/cc/testutil:cc_analysis_test.bzl", "cc_analysis_test")
REQUIRED_TOOLCHAIN_FEATURES = [
"fsafdo",
"thin_lto",
"supports_start_end_lib",
"enable_fdo_split_functions",
"fdo_optimize",
"fdo_split_functions",
"split_functions",
]
FSPLIT_MACHINE_FUNCTIONS_FLAG = "-fsplit-machine-functions"
def _test_implicit_split_functions(name, **kwargs):
util.helper_target(
cc_binary,
name = name + "/bin",
srcs = ["bin.cc"],
)
cc_analysis_test(
name = name,
impl = _test_implicit_split_functions_impl,
targets = {
"fdo": name + "/bin",
"fsafdo": name + "/bin",
},
attrs = {
"fdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.zip",
},
},
"fsafdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.afdo",
},
},
},
config_settings = {
"//command_line_option:compilation_mode": "opt",
},
with_features = REQUIRED_TOOLCHAIN_FEATURES,
test_features = [
"fdo_split_functions",
"thin_lto",
],
**kwargs
)
def _test_implicit_split_functions_impl(env, targets):
assert_fdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fdo_lto_action.argv().contains(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fdo_lto_action.argv().contains("-DBUILD_MFS_ENABLED=1")
assert_fsafdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fsafdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fsafdo_lto_action.argv().contains(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fsafdo_lto_action.argv().contains("-DBUILD_MFS_ENABLED=1")
def _test_no_implicit_split_functions(name, **kwargs):
util.helper_target(
cc_binary,
name = name + "/bin",
srcs = ["bin.cc"],
)
cc_analysis_test(
name = name,
impl = _test_no_implicit_split_functions_impl,
targets = {
"fdo": name + "/bin",
"fsafdo": name + "/bin",
},
attrs = {
"fdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.zip",
},
},
"fsafdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.afdo",
},
},
},
config_settings = {
"//command_line_option:compilation_mode": "opt",
},
with_features = REQUIRED_TOOLCHAIN_FEATURES,
test_features = [
"-fdo_split_functions",
"thin_lto",
],
**kwargs
)
def _test_no_implicit_split_functions_impl(env, targets):
assert_fdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fsafdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fsafdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fsafdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
def _test_implicit_split_functions_disabled(name, **kwargs):
util.helper_target(
cc_binary,
name = name + "/bin",
srcs = ["bin.cc"],
)
cc_analysis_test(
name = name,
impl = _test_implicit_split_functions_disabled_impl,
targets = {
"fdo": name + "/bin",
"fsafdo": name + "/bin",
},
attrs = {
"fdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.zip",
},
},
"fsafdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.afdo",
},
},
},
config_settings = {
"//command_line_option:compilation_mode": "opt",
},
with_features = REQUIRED_TOOLCHAIN_FEATURES,
test_features = [
"-split_functions",
"fdo_split_functions",
"thin_lto",
],
**kwargs
)
def _test_implicit_split_functions_disabled_impl(env, targets):
assert_fdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fsafdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fsafdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fsafdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
def _test_propeller_optimize_disables_implicit_split_functions(name, **kwargs):
util.helper_target(
cc_binary,
name = name + "/bin",
srcs = ["bin.cc"],
)
cc_analysis_test(
name = name,
impl = _test_propeller_optimize_disables_implicit_split_functions_impl,
targets = {
"fdo": name + "/bin",
"fsafdo": name + "/bin",
},
attrs = {
"fdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.zip",
},
},
"fsafdo": {
"@config_settings": {
"//command_line_option:fdo_optimize": "/profile.afdo",
},
},
},
config_settings = {
"//command_line_option:compilation_mode": "opt",
"//command_line_option:propeller_optimize_absolute_cc_profile": "/tmp/cc.txt",
},
with_features = REQUIRED_TOOLCHAIN_FEATURES,
test_features = [
"fdo_split_functions",
"thin_lto",
],
**kwargs
)
def _test_propeller_optimize_disables_implicit_split_functions_impl(env, targets):
assert_fdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fdo_lto_action.argv().contains_predicate(
matching.str_matches("-fbasic-block-sections=list=*cc.txt"),
)
# Depending on the Bazel version, it may be enabled via the "type" flag or the "enabled" flag.
assert_fdo_lto_action.argv().contains_predicate(
matching.custom(
"'-DBUILD_PROPELLER_ENABLED=1' or '-DBUILD_PROPELLER_TYPE=\"full\"'",
lambda arg: arg in ["-DBUILD_PROPELLER_ENABLED=1", "-DBUILD_PROPELLER_TYPE=\"full\""],
),
)
assert_fdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fdo_lto_action.not_contains_arg("-DBUILD_PROPELLER_TYPE=\"split\"")
assert_fsafdo_lto_action = env.expect.that_target(targets.fdo).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fsafdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fsafdo_lto_action.argv().contains_predicate(
matching.str_matches("-fbasic-block-sections=list=*cc.txt"),
)
assert_fsafdo_lto_action.argv().contains_predicate(
matching.custom(
"'-DBUILD_PROPELLER_ENABLED=1' or '-DBUILD_PROPELLER_TYPE=\"full\"'",
lambda arg: arg in ["-DBUILD_PROPELLER_ENABLED=1", "-DBUILD_PROPELLER_TYPE=\"full\""],
),
)
assert_fsafdo_lto_action.not_contains_arg(FSPLIT_MACHINE_FUNCTIONS_FLAG)
assert_fsafdo_lto_action.not_contains_arg("-DBUILD_PROPELLER_TYPE=\"split\"")
def _test_propeller_optimize_with_explicit_split_functions(name, **kwargs):
util.helper_target(
cc_binary,
name = name + "/bin",
srcs = ["bin.cc"],
)
cc_analysis_test(
name = name,
impl = _test_propeller_optimize_with_explicit_split_functions_impl,
target = name + "/bin",
config_settings = {
"//command_line_option:compilation_mode": "opt",
"//command_line_option:fdo_optimize": "/profile.zip",
"//command_line_option:propeller_optimize_absolute_cc_profile": "/tmp/cc.txt",
},
with_features = REQUIRED_TOOLCHAIN_FEATURES,
test_features = [
"split_functions",
"fdo_split_functions",
"thin_lto",
],
**kwargs
)
def _test_propeller_optimize_with_explicit_split_functions_impl(env, target):
assert_fdo_lto_action = env.expect.that_target(target).action_generating(
"{package}/{test_name}/bin.lto/{bindir}/{package}/_objs/{name}/bin.o",
)
assert_fdo_lto_action.mnemonic().equals("CcLtoBackendCompile")
assert_fdo_lto_action.argv().contains_predicate(
matching.str_matches("-fbasic-block-sections=list=*cc.txt"),
)
assert_fdo_lto_action.argv().contains_predicate(
matching.custom(
"'-DBUILD_PROPELLER_ENABLED=1' or '-DBUILD_PROPELLER_TYPE=\"full\"'",
lambda arg: arg in ["-DBUILD_PROPELLER_ENABLED=1", "-DBUILD_PROPELLER_TYPE=\"full\""],
),
)
assert_fdo_lto_action.argv().contains_at_least([
"-DBUILD_MFS_ENABLED=1",
FSPLIT_MACHINE_FUNCTIONS_FLAG,
])
def cc_binary_split_functions_tests(name):
test_suite(
name = name,
tests = [
_test_implicit_split_functions,
_test_no_implicit_split_functions,
_test_implicit_split_functions_disabled,
_test_propeller_optimize_disables_implicit_split_functions,
_test_propeller_optimize_with_explicit_split_functions,
],
)