]> git.lizzy.rs Git - rust.git/commitdiff
[WIP] debuginfo for locals
authorbjorn3 <bjorn3@users.noreply.github.com>
Sat, 9 Nov 2019 15:42:21 +0000 (16:42 +0100)
committerbjorn3 <bjorn3@users.noreply.github.com>
Mon, 16 Dec 2019 11:04:34 +0000 (12:04 +0100)
src/base.rs
src/debuginfo.rs
src/value_and_place.rs

index 705629888aa7f4cc9a7a26ae908492ff7ce35954..91c2587331315e6e1abe4a4d14a4a6e2d3585478 100644 (file)
@@ -21,6 +21,7 @@ pub fn trans_fn<'clif, 'tcx, B: Backend + 'static>(
 
     // Make FunctionBuilder
     let mut func = Function::with_name_signature(ExternalName::user(0, 0), sig);
+    func.collect_debug_info();
     let mut func_ctx = FunctionBuilderContext::new();
     let mut bcx = FunctionBuilder::new(&mut func, &mut func_ctx);
 
index e6d133c64510cb4bd7245ad3b0fb1953daa01995..0998236e5822905f06df5c279baa73591aadadb4 100644 (file)
@@ -305,6 +305,48 @@ pub fn define(
         let entry = self.debug_context.dwarf.unit.get_mut(self.entry_id);
         entry.set(gimli::DW_AT_high_pc, AttributeValue::Udata(end as u64));
 
+        {
+            let value_labels_ranges = context.build_value_labels_ranges(isa).unwrap();
+
+            for (value_label, value_loc_ranges) in value_labels_ranges.iter() {
+                let live_ranges = RangeList(
+                    Some(Range::BaseAddress {
+                        address: Address::Symbol {
+                            symbol: self.symbol,
+                            addend: 0,
+                        },
+                    })
+                    .into_iter()
+                    .chain(
+                        value_loc_ranges
+                            .iter()
+                            .map(|val_loc_range| Range::OffsetPair {
+                                begin: u64::from(val_loc_range.start),
+                                end: u64::from(val_loc_range.end),
+                            }),
+                    )
+                    .collect(),
+                );
+                let live_ranges_id = self.debug_context.dwarf.unit.ranges.add(live_ranges);
+
+                let var_id = self
+                    .debug_context
+                    .dwarf
+                    .unit
+                    .add(self.entry_id, gimli::DW_TAG_variable);
+                let var_entry = self.debug_context.dwarf.unit.get_mut(var_id);
+
+                var_entry.set(
+                    gimli::DW_AT_ranges,
+                    AttributeValue::RangeListRef(live_ranges_id),
+                );
+                var_entry.set(
+                    gimli::DW_AT_name,
+                    AttributeValue::String(format!("{:?}", value_label).into_bytes()),
+                );
+            }
+        }
+
         self.debug_context
             .unit_range_list
             .0
index 142795a91eb5013a2f2d902ed8c71e80e7f22166..8016a802dab30b791426dad36e42e0253fe9fc8b 100644 (file)
@@ -299,7 +299,11 @@ pub fn for_addr_with_extra(addr: Value, extra: Value, layout: TyLayout<'tcx>) ->
     pub fn to_cvalue(self, fx: &mut FunctionCx<'_, 'tcx, impl Backend>) -> CValue<'tcx> {
         let layout = self.layout();
         match self.inner {
-            CPlaceInner::Var(var) => CValue::by_val(fx.bcx.use_var(mir_var(var)), layout),
+            CPlaceInner::Var(var) => {
+                let val = fx.bcx.use_var(mir_var(var));
+                fx.bcx.set_val_label(val, cranelift::codegen::ir::ValueLabel::from_u32(var.as_u32()));
+                CValue::by_val(val, layout)
+            }
             CPlaceInner::Addr(addr, extra) => {
                 assert!(extra.is_none(), "unsized values are not yet supported");
                 CValue::by_ref(addr, layout)