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
6 changed files with 36 additions and 0 deletions
|
@ -1574,6 +1574,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||
cfi::typeid_for_fnabi(self.tcx, fn_abi, options)
|
||||
};
|
||||
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.
|
||||
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.switch_to_block(bb_fail);
|
||||
if let Some(dbg_loc) = dbg_loc {
|
||||
self.set_dbg_loc(dbg_loc);
|
||||
}
|
||||
self.abort();
|
||||
self.unreachable();
|
||||
|
||||
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) {
|
||||
gdb::insert_reference_to_gdb_debug_scripts_section_global(self)
|
||||
}
|
||||
|
|
|
@ -1063,6 +1063,7 @@ unsafe extern "C" {
|
|||
|
||||
// Metadata
|
||||
pub fn LLVMSetCurrentDebugLocation2<'a>(Builder: &Builder<'a>, Loc: *const Metadata);
|
||||
pub fn LLVMGetCurrentDebugLocation2<'a>(Builder: &Builder<'a>) -> Option<&'a Metadata>;
|
||||
|
||||
// Terminators
|
||||
pub fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue