mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Rollup merge of #132702 - 1c3t3a:issue-132615, r=rcvalle
CFI: Append debug location to CFI blocks Currently we're not appending debug locations to the inserted CFI blocks. This shows up in #132615 and #100783. This change fixes that by passing down the debug location to the CFI type-test generation and appending it to the blocks. Credits also belong to `@jakos-sec` who worked with me on this.
This commit is contained in:
commit
bd79fe7a94
@ -52,6 +52,10 @@ impl<'a, 'gcc, 'tcx> DebugInfoBuilderMethods for Builder<'a, 'gcc, 'tcx> {
|
|||||||
fn clear_dbg_loc(&mut self) {
|
fn clear_dbg_loc(&mut self) {
|
||||||
self.location = None;
|
self.location = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_dbg_loc(&self) -> Option<Self::DILocation> {
|
||||||
|
self.location
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate the `debug_context` in an MIR Body.
|
/// Generate the `debug_context` in an MIR Body.
|
||||||
|
@ -1574,6 +1574,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||||||
cfi::typeid_for_fnabi(self.tcx, fn_abi, options)
|
cfi::typeid_for_fnabi(self.tcx, fn_abi, options)
|
||||||
};
|
};
|
||||||
let typeid_metadata = self.cx.typeid_metadata(typeid).unwrap();
|
let typeid_metadata = self.cx.typeid_metadata(typeid).unwrap();
|
||||||
|
let dbg_loc = self.get_dbg_loc();
|
||||||
|
|
||||||
// Test whether the function pointer is associated with the type identifier.
|
// Test whether the function pointer is associated with the type identifier.
|
||||||
let cond = self.type_test(llfn, typeid_metadata);
|
let cond = self.type_test(llfn, typeid_metadata);
|
||||||
@ -1582,10 +1583,16 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||||||
self.cond_br(cond, bb_pass, bb_fail);
|
self.cond_br(cond, bb_pass, bb_fail);
|
||||||
|
|
||||||
self.switch_to_block(bb_fail);
|
self.switch_to_block(bb_fail);
|
||||||
|
if let Some(dbg_loc) = dbg_loc {
|
||||||
|
self.set_dbg_loc(dbg_loc);
|
||||||
|
}
|
||||||
self.abort();
|
self.abort();
|
||||||
self.unreachable();
|
self.unreachable();
|
||||||
|
|
||||||
self.switch_to_block(bb_pass);
|
self.switch_to_block(bb_pass);
|
||||||
|
if let Some(dbg_loc) = dbg_loc {
|
||||||
|
self.set_dbg_loc(dbg_loc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,6 +206,10 @@ impl<'ll> DebugInfoBuilderMethods for Builder<'_, 'll, '_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_dbg_loc(&self) -> Option<&'ll DILocation> {
|
||||||
|
unsafe { llvm::LLVMGetCurrentDebugLocation2(self.llbuilder) }
|
||||||
|
}
|
||||||
|
|
||||||
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self) {
|
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self) {
|
||||||
gdb::insert_reference_to_gdb_debug_scripts_section_global(self)
|
gdb::insert_reference_to_gdb_debug_scripts_section_global(self)
|
||||||
}
|
}
|
||||||
|
@ -1063,6 +1063,7 @@ unsafe extern "C" {
|
|||||||
|
|
||||||
// Metadata
|
// Metadata
|
||||||
pub fn LLVMSetCurrentDebugLocation2<'a>(Builder: &Builder<'a>, Loc: *const Metadata);
|
pub fn LLVMSetCurrentDebugLocation2<'a>(Builder: &Builder<'a>, Loc: *const Metadata);
|
||||||
|
pub fn LLVMGetCurrentDebugLocation2<'a>(Builder: &Builder<'a>) -> Option<&'a Metadata>;
|
||||||
|
|
||||||
// Terminators
|
// Terminators
|
||||||
pub fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
|
pub fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
|
||||||
|
@ -81,6 +81,7 @@ pub trait DebugInfoBuilderMethods: BackendTypes {
|
|||||||
);
|
);
|
||||||
fn set_dbg_loc(&mut self, dbg_loc: Self::DILocation);
|
fn set_dbg_loc(&mut self, dbg_loc: Self::DILocation);
|
||||||
fn clear_dbg_loc(&mut self);
|
fn clear_dbg_loc(&mut self);
|
||||||
|
fn get_dbg_loc(&self) -> Option<Self::DILocation>;
|
||||||
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self);
|
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self);
|
||||||
fn set_var_name(&mut self, value: Self::Value, name: &str);
|
fn set_var_name(&mut self, value: Self::Value, name: &str);
|
||||||
}
|
}
|
||||||
|
19
tests/codegen/sanitizer/cfi/dbg-location-on-cfi-blocks.rs
Normal file
19
tests/codegen/sanitizer/cfi/dbg-location-on-cfi-blocks.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Verifies that the parent block's debug information are assigned to the inserted cfi block.
|
||||||
|
//
|
||||||
|
//@ needs-sanitizer-cfi
|
||||||
|
//@ compile-flags: -Clto -Cno-prepopulate-passes -Copt-level=0 -Zsanitizer=cfi -Ctarget-feature=-crt-static -Cdebuginfo=1
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
pub fn foo(f: fn(i32) -> i32, arg: i32) -> i32 {
|
||||||
|
// CHECK-LABEL: define{{.*}}foo{{.*}}!dbg !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
|
||||||
|
// CHECK: start:
|
||||||
|
// CHECK: [[TT:%.+]] = call i1 @llvm.type.test(ptr {{%f|%0}}, metadata !"{{[[:print:]]+}}"), !dbg !{{[0-9]+}}
|
||||||
|
// CHECK-NEXT: br i1 [[TT]], label %type_test.pass, label %type_test.fail, !dbg !{{[0-9]+}}
|
||||||
|
// CHECK: type_test.pass: ; preds = %start
|
||||||
|
// CHECK-NEXT: {{%.+}} = call i32 %f(i32{{.*}} %arg), !dbg !{{[0-9]+}}
|
||||||
|
// CHECK: type_test.fail: ; preds = %start
|
||||||
|
// CHECK-NEXT: call void @llvm.trap(), !dbg !{{[0-9]+}}
|
||||||
|
// CHECK-NEXT: unreachable, !dbg !{{[0-9]+}}
|
||||||
|
f(arg)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user