mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Rather than defining our own action groups, work to re-use the `rules_cc` ones, as they are (much) more comprehensive. Also, completely eliminate the `codegen` action group as it was not well used. For example, `-march` flags and `-O` flags change the preprocessor macros defined. There isn't a really great "codegen" heuristic, so just pass those flags to all compiles which is simpler anyways. I'm tempted to do the same with preprocessor actions, but maybe it makes sense to have that one stay separate. Assisted-by: Antigravity with Gemini
136 lines
4.5 KiB
Python
136 lines
4.5 KiB
Python
# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
# Exceptions. See /LICENSE for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
"""Definitions of debugging related features used in a `cc_toolchain_config`."""
|
|
|
|
load("@rules_cc//cc:action_names.bzl", "ACTION_NAME_GROUPS")
|
|
load(
|
|
"@rules_cc//cc:cc_toolchain_config_lib.bzl",
|
|
"feature",
|
|
"feature_set",
|
|
"flag_group",
|
|
"flag_set",
|
|
)
|
|
|
|
# Handle different levels and forms of debug info emission with individual
|
|
# features so that they can be ordered and the defaults can override the
|
|
# minimal settings if both are enabled.
|
|
minimal_debug_info_flags = feature(
|
|
name = "minimal_debug_info_flags",
|
|
implies = ["debug_info_compression_flags"],
|
|
flag_sets = [flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
|
|
flag_groups = [flag_group(flags = ["-gmlt"])],
|
|
)],
|
|
)
|
|
debug_info_flags = feature(
|
|
name = "debug_info_flags",
|
|
implies = ["debug_info_compression_flags"],
|
|
flag_sets = [flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
|
|
flag_groups = [
|
|
flag_group(flags = ["-g"]),
|
|
flag_group(
|
|
expand_if_available = "per_object_debug_info_file",
|
|
flags = ["-gsplit-dwarf"],
|
|
),
|
|
],
|
|
)],
|
|
)
|
|
debug_info_compression_flags = feature(
|
|
name = "debug_info_compression_flags",
|
|
flag_sets = [flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions + ACTION_NAME_GROUPS.all_cc_link_actions,
|
|
flag_groups = [flag_group(flags = ["-gz"])],
|
|
)],
|
|
)
|
|
|
|
# Define a set of mutually exclusive debugger flags.
|
|
debugger_flags = feature(name = "debugger_flags")
|
|
lldb_flags = feature(
|
|
# Use a convenient name for users to select if needed.
|
|
name = "lldb_flags",
|
|
# Default enable LLDB-optimized flags whenever debugging.
|
|
enabled = True,
|
|
requires = [feature_set(features = ["debug_info_flags"])],
|
|
provides = ["debugger_flags"],
|
|
flag_sets = [flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
|
|
flag_groups = [flag_group(flags = [
|
|
"-glldb",
|
|
"-gpubnames",
|
|
"-gsimple-template-names",
|
|
])],
|
|
)],
|
|
)
|
|
gdb_flags = feature(
|
|
# Use a convenient name for users to select if needed.
|
|
name = "gdb_flags",
|
|
requires = [feature_set(features = ["debug_info_flags"])],
|
|
provides = ["debugger_flags"],
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
|
|
flag_groups = [flag_group(flags = [
|
|
"-ggdb",
|
|
"-ggnu-pubnames",
|
|
])],
|
|
),
|
|
flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_link_actions,
|
|
flag_groups = [flag_group(flags = ["-Wl,--gdb-index"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
# This feature can be enabled in conjunction with any optimizations to
|
|
# ensure accurate call stacks and backtraces for profilers or errors.
|
|
preserve_call_stacks = feature(
|
|
name = "preserve_call_stacks",
|
|
flag_sets = [flag_set(
|
|
actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
|
|
flag_groups = [flag_group(flags = [
|
|
# Ensure good backtraces by preserving frame pointers and
|
|
# disabling tail call elimination.
|
|
"-fno-omit-frame-pointer",
|
|
"-mno-omit-leaf-frame-pointer",
|
|
"-fno-optimize-sibling-calls",
|
|
])],
|
|
)],
|
|
)
|
|
|
|
# Enable split debug info whenever debug info is requested.
|
|
enable_split_debug_info = feature(
|
|
name = "per_object_debug_info",
|
|
enabled = True,
|
|
# This has to be directly conditioned on requesting debug info at
|
|
# all, otherwise Bazel will look for an extra output file and not
|
|
# find one.
|
|
requires = [feature_set(features = ["debug_info_flags"])],
|
|
)
|
|
|
|
# Enable debug info whenever in the `dbg` build mode. We do this separately from
|
|
# the `debug_info_flags` feature itself as other things may want to enable that
|
|
# feature as well.
|
|
enable_debug_info_in_dbg = feature(
|
|
name = "enable_debug_info_in_dbg",
|
|
enabled = True,
|
|
requires = [feature_set(["dbg"])],
|
|
implies = ["debug_info_flags"],
|
|
)
|
|
|
|
# Note that the order of features is significant in this list and determines the
|
|
# relative order of flags from the features listed.
|
|
debugging_features = [
|
|
minimal_debug_info_flags,
|
|
debug_info_flags,
|
|
debug_info_compression_flags,
|
|
debugger_flags,
|
|
lldb_flags,
|
|
gdb_flags,
|
|
preserve_call_stacks,
|
|
enable_split_debug_info,
|
|
enable_debug_info_in_dbg,
|
|
]
|