Revert "Preserve the .debug_gdb_scripts section"
This reverts commit 868bdde25b.
This commit is contained in:
parent
270c1a4d24
commit
e02cc40ec9
8 changed files with 61 additions and 73 deletions
|
|
@ -254,8 +254,7 @@ impl<'gcc, 'tcx> DebugInfoCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
|
|||
// TODO(antoyo): implement.
|
||||
}
|
||||
|
||||
fn debuginfo_finalize(&mut self) {
|
||||
// TODO: emit section `.debug_gdb_scripts`.
|
||||
fn debuginfo_finalize(&self) {
|
||||
self.context.set_debug_info(true)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,16 +109,11 @@ pub(crate) fn compile_codegen_unit(
|
|||
}
|
||||
|
||||
// Finalize code coverage by injecting the coverage map. Note, the coverage map will
|
||||
// also be added to the `llvm.compiler.used` variable, created below.
|
||||
// also be added to the `llvm.compiler.used` variable, created next.
|
||||
if cx.sess().instrument_coverage() {
|
||||
cx.coverageinfo_finalize();
|
||||
}
|
||||
|
||||
// Finalize debuginfo. This adds to `llvm.used`, created below.
|
||||
if cx.sess().opts.debuginfo != DebugInfo::None {
|
||||
cx.debuginfo_finalize();
|
||||
}
|
||||
|
||||
// Create the llvm.used and llvm.compiler.used variables.
|
||||
if !cx.used_statics.is_empty() {
|
||||
cx.create_used_variable_impl(c"llvm.used", &cx.used_statics);
|
||||
|
|
@ -135,6 +130,11 @@ pub(crate) fn compile_codegen_unit(
|
|||
llvm::LLVMDeleteGlobal(old_g);
|
||||
}
|
||||
}
|
||||
|
||||
// Finalize debuginfo
|
||||
if cx.sess().opts.debuginfo != DebugInfo::None {
|
||||
cx.debuginfo_finalize();
|
||||
}
|
||||
}
|
||||
|
||||
ModuleCodegen::new_regular(cgu_name.to_string(), llvm_module)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// .debug_gdb_scripts binary section.
|
||||
|
||||
use std::ffi::CString;
|
||||
|
||||
use rustc_codegen_ssa::base::collect_debugger_visualizers_transitive;
|
||||
use rustc_codegen_ssa::traits::*;
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
|
|
@ -33,12 +31,7 @@ pub(crate) fn insert_reference_to_gdb_debug_scripts_section_global(bx: &mut Buil
|
|||
pub(crate) fn get_or_insert_gdb_debug_scripts_section_global<'ll>(
|
||||
cx: &CodegenCx<'ll, '_>,
|
||||
) -> &'ll Value {
|
||||
let c_section_var_name = CString::new(format!(
|
||||
"__rustc_debug_gdb_scripts_section_{}_{:08x}",
|
||||
cx.tcx.crate_name(LOCAL_CRATE),
|
||||
cx.tcx.stable_crate_id(LOCAL_CRATE),
|
||||
))
|
||||
.unwrap();
|
||||
let c_section_var_name = c"__rustc_debug_gdb_scripts_section__";
|
||||
let section_var_name = c_section_var_name.to_str().unwrap();
|
||||
|
||||
let section_var = unsafe { llvm::LLVMGetNamedGlobal(cx.llmod, c_section_var_name.as_ptr()) };
|
||||
|
|
@ -91,10 +84,17 @@ pub(crate) fn get_or_insert_gdb_debug_scripts_section_global<'ll>(
|
|||
}
|
||||
|
||||
pub(crate) fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool {
|
||||
// We collect pretty printers transitively for all crates, so we make sure
|
||||
// that the section is only emitted for leaf crates.
|
||||
// To ensure the section `__rustc_debug_gdb_scripts_section__` will not create
|
||||
// ODR violations at link time, this section will not be emitted for rlibs since
|
||||
// each rlib could produce a different set of visualizers that would be embedded
|
||||
// in the `.debug_gdb_scripts` section. For that reason, we make sure that the
|
||||
// section is only emitted for leaf crates.
|
||||
let embed_visualizers = cx.tcx.crate_types().iter().any(|&crate_type| match crate_type {
|
||||
CrateType::Executable | CrateType::Cdylib | CrateType::Staticlib | CrateType::Sdylib => {
|
||||
CrateType::Executable
|
||||
| CrateType::Dylib
|
||||
| CrateType::Cdylib
|
||||
| CrateType::Staticlib
|
||||
| CrateType::Sdylib => {
|
||||
// These are crate types for which we will embed pretty printers since they
|
||||
// are treated as leaf crates.
|
||||
true
|
||||
|
|
@ -105,11 +105,9 @@ pub(crate) fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool {
|
|||
// want to slow down the common case.
|
||||
false
|
||||
}
|
||||
CrateType::Rlib | CrateType::Dylib => {
|
||||
// Don't embed pretty printers for these crate types; the compiler
|
||||
// can see the `#[debug_visualizer]` attributes when using the
|
||||
// library, and emitting `.debug_gdb_scripts` regardless would
|
||||
// break `#![omit_gdb_pretty_printer_section]`.
|
||||
CrateType::Rlib => {
|
||||
// As per the above description, embedding pretty printers for rlibs could
|
||||
// lead to ODR violations so we skip this crate type as well.
|
||||
false
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ use tracing::debug;
|
|||
|
||||
use self::metadata::{UNKNOWN_COLUMN_NUMBER, UNKNOWN_LINE_NUMBER, file_metadata, type_di_node};
|
||||
use self::namespace::mangled_name_of_instance;
|
||||
use self::utils::{DIB, create_DIArray, debug_context, is_node_local_to_unit};
|
||||
use self::utils::{DIB, create_DIArray, is_node_local_to_unit};
|
||||
use crate::builder::Builder;
|
||||
use crate::common::{AsCCharPtr, CodegenCx};
|
||||
use crate::llvm;
|
||||
|
|
@ -131,28 +131,20 @@ impl<'ll, 'tcx> CodegenUnitDebugContext<'ll, 'tcx> {
|
|||
}
|
||||
|
||||
/// Creates any deferred debug metadata nodes
|
||||
pub(crate) fn finalize(cx: &mut CodegenCx<'_, '_>) {
|
||||
if cx.dbg_cx.is_none() {
|
||||
return;
|
||||
pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
|
||||
if let Some(dbg_cx) = &cx.dbg_cx {
|
||||
debug!("finalize");
|
||||
|
||||
if gdb::needs_gdb_debug_scripts_section(cx) {
|
||||
// Add a .debug_gdb_scripts section to this compile-unit. This will
|
||||
// cause GDB to try and load the gdb_load_rust_pretty_printers.py file,
|
||||
// which activates the Rust pretty printers for binary this section is
|
||||
// contained in.
|
||||
gdb::get_or_insert_gdb_debug_scripts_section_global(cx);
|
||||
}
|
||||
|
||||
dbg_cx.finalize(cx.sess());
|
||||
}
|
||||
|
||||
debug!("finalize");
|
||||
|
||||
if gdb::needs_gdb_debug_scripts_section(cx) {
|
||||
// Add a .debug_gdb_scripts section to this compile-unit. This will
|
||||
// cause GDB to try and load the gdb_load_rust_pretty_printers.py file,
|
||||
// which activates the Rust pretty printers for binary this section is
|
||||
// contained in.
|
||||
let section_var = gdb::get_or_insert_gdb_debug_scripts_section_global(cx);
|
||||
|
||||
// Make sure that the linker doesn't optimize the global away. Adding
|
||||
// it to `llvm.used` has the advantage that it works even in no_std
|
||||
// binaries, where we don't have a main shim and thus don't emit a
|
||||
// volatile load to preserve the global.
|
||||
cx.add_used_global(section_var);
|
||||
}
|
||||
|
||||
debug_context(cx).finalize(cx.sess());
|
||||
}
|
||||
|
||||
impl<'ll> Builder<'_, 'll, '_> {
|
||||
|
|
@ -622,7 +614,7 @@ impl<'ll, 'tcx> DebugInfoCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
metadata::extend_scope_to_file(self, scope_metadata, file)
|
||||
}
|
||||
|
||||
fn debuginfo_finalize(&mut self) {
|
||||
fn debuginfo_finalize(&self) {
|
||||
finalize(self)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -609,7 +609,15 @@ pub fn collect_debugger_visualizers_transitive(
|
|||
) -> BTreeSet<DebuggerVisualizerFile> {
|
||||
tcx.debugger_visualizers(LOCAL_CRATE)
|
||||
.iter()
|
||||
.chain(tcx.crates(()).iter().flat_map(|&cnum| tcx.debugger_visualizers(cnum)))
|
||||
.chain(
|
||||
tcx.crates(())
|
||||
.iter()
|
||||
.filter(|&cnum| {
|
||||
let used_crate_source = tcx.used_crate_source(*cnum);
|
||||
used_crate_source.rlib.is_some() || used_crate_source.rmeta.is_some()
|
||||
})
|
||||
.flat_map(|&cnum| tcx.debugger_visualizers(cnum)),
|
||||
)
|
||||
.filter(|visualizer| visualizer.visualizer_type == visualizer_type)
|
||||
.cloned()
|
||||
.collect::<BTreeSet<_>>()
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ pub trait DebugInfoCodegenMethods<'tcx>: BackendTypes {
|
|||
scope_metadata: Self::DIScope,
|
||||
file: &SourceFile,
|
||||
) -> Self::DIScope;
|
||||
fn debuginfo_finalize(&mut self);
|
||||
fn debuginfo_finalize(&self);
|
||||
|
||||
// FIXME(eddyb) find a common convention for all of the debuginfo-related
|
||||
// names (choose between `dbg`, `debug`, `debuginfo`, `debug_info` etc.).
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@
|
|||
#![feature(lang_items)]
|
||||
#![no_std]
|
||||
|
||||
// CHECK: @llvm.used = {{.+}} @__rustc_debug_gdb_scripts_section
|
||||
|
||||
#[panic_handler]
|
||||
fn panic_handler(_: &core::panic::PanicInfo) -> ! {
|
||||
loop {}
|
||||
|
|
@ -24,7 +22,7 @@ extern "C" fn rust_eh_personality() {
|
|||
// Needs rustc to generate `main` as that's where the magic load is inserted.
|
||||
// IOW, we cannot write this test with `#![no_main]`.
|
||||
// CHECK-LABEL: @main
|
||||
// CHECK: load volatile i8, {{.+}} @__rustc_debug_gdb_scripts_section
|
||||
// CHECK: load volatile i8, {{.+}} @__rustc_debug_gdb_scripts_section__
|
||||
|
||||
#[lang = "start"]
|
||||
fn lang_start<T: 'static>(
|
||||
|
|
|
|||
|
|
@ -35,7 +35,13 @@ fn symbols_check_archive(path: &str) {
|
|||
continue; // All compiler-builtins symbols must remain unmangled
|
||||
}
|
||||
|
||||
if symbol_ok_everywhere(name) {
|
||||
if name.contains("rust_eh_personality") {
|
||||
continue; // Unfortunately LLVM doesn't allow us to mangle this symbol
|
||||
}
|
||||
|
||||
if name.contains(".llvm.") {
|
||||
// Starting in LLVM 21 we get various implementation-detail functions which
|
||||
// contain .llvm. that are not a problem.
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -65,7 +71,13 @@ fn symbols_check(path: &str) {
|
|||
continue;
|
||||
}
|
||||
|
||||
if symbol_ok_everywhere(name) {
|
||||
if name.contains("rust_eh_personality") {
|
||||
continue; // Unfortunately LLVM doesn't allow us to mangle this symbol
|
||||
}
|
||||
|
||||
if name.contains(".llvm.") {
|
||||
// Starting in LLVM 21 we get various implementation-detail functions which
|
||||
// contain .llvm. that are not a problem.
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -76,22 +88,3 @@ fn symbols_check(path: &str) {
|
|||
fn strip_underscore_if_apple(symbol: &str) -> &str {
|
||||
if cfg!(target_vendor = "apple") { symbol.strip_prefix("_").unwrap() } else { symbol }
|
||||
}
|
||||
|
||||
fn symbol_ok_everywhere(name: &str) -> bool {
|
||||
if name.contains("rust_eh_personality") {
|
||||
return true; // Unfortunately LLVM doesn't allow us to mangle this symbol
|
||||
}
|
||||
|
||||
if name.contains(".llvm.") {
|
||||
// Starting in LLVM 21 we get various implementation-detail functions which
|
||||
// contain .llvm. that are not a problem.
|
||||
return true;
|
||||
}
|
||||
|
||||
if name.starts_with("__rustc_debug_gdb_scripts_section") {
|
||||
// These symbols are fine; they're made unique by the crate ID.
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue