about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>2024-03-27 10:57:13 +0000
committerbjorn3 <17426603+bjorn3@users.noreply.github.com>2024-03-27 10:57:13 +0000
commit09ec683ae72086278db2ba8fa0d6168814b51b93 (patch)
treefc74ab6f4ce767b4565884a8c19fd17e7ad50088
parentcfd7325f20806b478fc144baeaeeaccf913ae0aa (diff)
downloadrust-09ec683ae72086278db2ba8fa0d6168814b51b93.tar.gz
rust-09ec683ae72086278db2ba8fa0d6168814b51b93.zip
Emit DW_AT_frame_base debuginfo attribute
-rw-r--r--src/debuginfo/mod.rs21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/debuginfo/mod.rs b/src/debuginfo/mod.rs
index 2d9c2ecdbc2..56307aa3bb9 100644
--- a/src/debuginfo/mod.rs
+++ b/src/debuginfo/mod.rs
@@ -8,10 +8,10 @@ mod unwind;
 use cranelift_codegen::ir::Endianness;
 use cranelift_codegen::isa::TargetIsa;
 use gimli::write::{
-    Address, AttributeValue, DwarfUnit, FileId, LineProgram, LineString, Range, RangeList,
-    UnitEntryId,
+    Address, AttributeValue, DwarfUnit, Expression, FileId, LineProgram, LineString, Range,
+    RangeList, UnitEntryId,
 };
-use gimli::{Encoding, Format, LineEncoding, RunTimeEndian};
+use gimli::{AArch64, Encoding, Format, LineEncoding, Register, RiscV, RunTimeEndian, X86_64};
 use indexmap::IndexSet;
 use rustc_session::Session;
 
@@ -28,6 +28,7 @@ pub(crate) struct DebugContext {
 
     dwarf: DwarfUnit,
     unit_range_list: RangeList,
+    stack_pointer_register: Register,
 
     should_remap_filepaths: bool,
 }
@@ -60,6 +61,15 @@ impl DebugContext {
             Endianness::Big => RunTimeEndian::Big,
         };
 
+        let stack_pointer_register = match isa.triple().architecture {
+            target_lexicon::Architecture::Aarch64(_) => AArch64::SP,
+            target_lexicon::Architecture::Riscv64(_) => RiscV::SP,
+            target_lexicon::Architecture::X86_64 | target_lexicon::Architecture::X86_64h => {
+                X86_64::RSP
+            }
+            _ => Register(u16::MAX),
+        };
+
         let mut dwarf = DwarfUnit::new(encoding);
 
         let should_remap_filepaths = tcx.sess.should_prefer_remapped_for_codegen();
@@ -111,6 +121,7 @@ impl DebugContext {
             endian,
             dwarf,
             unit_range_list: RangeList(Vec::new()),
+            stack_pointer_register,
             should_remap_filepaths,
         }
     }
@@ -135,6 +146,10 @@ impl DebugContext {
         entry.set(gimli::DW_AT_name, AttributeValue::StringRef(name_id));
         entry.set(gimli::DW_AT_linkage_name, AttributeValue::StringRef(name_id));
 
+        let mut frame_base_expr = Expression::new();
+        frame_base_expr.op_reg(self.stack_pointer_register);
+        entry.set(gimli::DW_AT_frame_base, AttributeValue::Exprloc(frame_base_expr));
+
         entry.set(gimli::DW_AT_decl_file, AttributeValue::FileIndex(Some(file_id)));
         entry.set(gimli::DW_AT_decl_line, AttributeValue::Udata(line));
         entry.set(gimli::DW_AT_decl_column, AttributeValue::Udata(column));