Files
carbon-lang/bazel/cc_toolchains/cc_toolchain_debugging.bzl
T
Chandler CarruthandGeoff Romer 3603ec7d54 Start refactoring toolchain config into separate files (#6587)
This moves the simplest parts of the toolchain config into separate
files. These parts are either unparameterized or trivially parameterized
and so easily extracted from the main file.

I tried to minimize the interesting edits here, but wasn't _completely_
successful I'm afraid. I'll try to describe them.

First, all of the interesting content of the new files is copied and
re-indented, no interesting edits were done.

The main file sees some more significant edits in order to realize this
refactoring:

- Extract the feature array building to a helper method.
- Collapse some extraneous features as there was no where to extract
them.
- Restructure how the array itself is built to support building it using
array fragments from the various files.

The only interesting semantic change I'm aware of here is that this
somewhat changes the order of command line flags in compiles and links.
The previous order was "fine", but not especially logical. I've tried to
more logically have features that should "override" or are "more
specific" come later here. However, that results in a slightly different
ordering. None of the current features had any flags that overlap, so
this should have no behavior change other than the changed flag order.

This is only the first step, however. There remain complex features in
the main configuration that I want to move out. However, to make those
moves simple requires some significant changes to how these remaining
features work and so I wanted to break them out. I've tried to leave
TODOs that can help as breadcrumbs on the parts of this refactoring that
aren't yet complete.

The comments also are mostly what we already had. I'm happy to try and
add some, but not sure how much I can cover as there is a _lot_ of code
here that I'm just moving around. Please let me know if there are
particularly places that would benefit from comments.

---------

Co-authored-by: Geoff Romer <gromer@google.com>
2026-01-14 06:19:26 +00:00

140 lines
4.4 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:cc_toolchain_config_lib.bzl",
"feature",
"feature_set",
"flag_group",
"flag_set",
)
load(
":cc_toolchain_actions.bzl",
"all_link_actions",
"codegen_compile_actions",
)
# 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 = codegen_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 = codegen_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 = codegen_compile_actions + all_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 = codegen_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 = codegen_compile_actions,
flag_groups = [flag_group(flags = [
"-ggdb",
"-ggnu-pubnames",
])],
),
flag_set(
actions = all_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 = codegen_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,
]