Use constants for DWARF opcodes, instead of FFI calls
This commit is contained in:
parent
e267106104
commit
1b62645418
4 changed files with 18 additions and 24 deletions
|
@ -27,3 +27,11 @@ declare_constant!(DW_ATE_float: c_uint);
|
||||||
declare_constant!(DW_ATE_signed: c_uint);
|
declare_constant!(DW_ATE_signed: c_uint);
|
||||||
declare_constant!(DW_ATE_unsigned: c_uint);
|
declare_constant!(DW_ATE_unsigned: c_uint);
|
||||||
declare_constant!(DW_ATE_UTF: c_uint);
|
declare_constant!(DW_ATE_UTF: c_uint);
|
||||||
|
|
||||||
|
// DWARF expression operators.
|
||||||
|
declare_constant!(DW_OP_deref: u64);
|
||||||
|
declare_constant!(DW_OP_plus_uconst: u64);
|
||||||
|
/// Defined by LLVM in `llvm/include/llvm/BinaryFormat/Dwarf.h`.
|
||||||
|
/// Double-checked by a static assertion in `RustWrapper.cpp`.
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
pub(crate) const DW_OP_LLVM_fragment: u64 = 0x1000;
|
||||||
|
|
|
@ -153,29 +153,26 @@ impl<'ll> DebugInfoBuilderMethods for Builder<'_, 'll, '_> {
|
||||||
indirect_offsets: &[Size],
|
indirect_offsets: &[Size],
|
||||||
fragment: Option<Range<Size>>,
|
fragment: Option<Range<Size>>,
|
||||||
) {
|
) {
|
||||||
|
use dwarf_const::{DW_OP_LLVM_fragment, DW_OP_deref, DW_OP_plus_uconst};
|
||||||
|
|
||||||
// Convert the direct and indirect offsets and fragment byte range to address ops.
|
// Convert the direct and indirect offsets and fragment byte range to address ops.
|
||||||
// FIXME(eddyb) use `const`s instead of getting the values via FFI,
|
|
||||||
// the values should match the ones in the DWARF standard anyway.
|
|
||||||
let op_deref = || unsafe { llvm::LLVMRustDIBuilderCreateOpDeref() };
|
|
||||||
let op_plus_uconst = || unsafe { llvm::LLVMRustDIBuilderCreateOpPlusUconst() };
|
|
||||||
let op_llvm_fragment = || unsafe { llvm::LLVMRustDIBuilderCreateOpLLVMFragment() };
|
|
||||||
let mut addr_ops = SmallVec::<[u64; 8]>::new();
|
let mut addr_ops = SmallVec::<[u64; 8]>::new();
|
||||||
|
|
||||||
if direct_offset.bytes() > 0 {
|
if direct_offset.bytes() > 0 {
|
||||||
addr_ops.push(op_plus_uconst());
|
addr_ops.push(DW_OP_plus_uconst);
|
||||||
addr_ops.push(direct_offset.bytes() as u64);
|
addr_ops.push(direct_offset.bytes() as u64);
|
||||||
}
|
}
|
||||||
for &offset in indirect_offsets {
|
for &offset in indirect_offsets {
|
||||||
addr_ops.push(op_deref());
|
addr_ops.push(DW_OP_deref);
|
||||||
if offset.bytes() > 0 {
|
if offset.bytes() > 0 {
|
||||||
addr_ops.push(op_plus_uconst());
|
addr_ops.push(DW_OP_plus_uconst);
|
||||||
addr_ops.push(offset.bytes() as u64);
|
addr_ops.push(offset.bytes() as u64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(fragment) = fragment {
|
if let Some(fragment) = fragment {
|
||||||
// `DW_OP_LLVM_fragment` takes as arguments the fragment's
|
// `DW_OP_LLVM_fragment` takes as arguments the fragment's
|
||||||
// offset and size, both of them in bits.
|
// offset and size, both of them in bits.
|
||||||
addr_ops.push(op_llvm_fragment());
|
addr_ops.push(DW_OP_LLVM_fragment);
|
||||||
addr_ops.push(fragment.start.bits() as u64);
|
addr_ops.push(fragment.start.bits() as u64);
|
||||||
addr_ops.push((fragment.end - fragment.start).bits() as u64);
|
addr_ops.push((fragment.end - fragment.start).bits() as u64);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2177,9 +2177,6 @@ unsafe extern "C" {
|
||||||
Location: &'a DILocation,
|
Location: &'a DILocation,
|
||||||
BD: c_uint,
|
BD: c_uint,
|
||||||
) -> Option<&'a DILocation>;
|
) -> Option<&'a DILocation>;
|
||||||
pub fn LLVMRustDIBuilderCreateOpDeref() -> u64;
|
|
||||||
pub fn LLVMRustDIBuilderCreateOpPlusUconst() -> u64;
|
|
||||||
pub fn LLVMRustDIBuilderCreateOpLLVMFragment() -> u64;
|
|
||||||
|
|
||||||
pub fn LLVMRustWriteTypeToString(Type: &Type, s: &RustString);
|
pub fn LLVMRustWriteTypeToString(Type: &Type, s: &RustString);
|
||||||
pub fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);
|
pub fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);
|
||||||
|
|
|
@ -54,6 +54,10 @@ using namespace llvm;
|
||||||
using namespace llvm::sys;
|
using namespace llvm::sys;
|
||||||
using namespace llvm::object;
|
using namespace llvm::object;
|
||||||
|
|
||||||
|
// This opcode is an LLVM detail that could hypothetically change (?), so
|
||||||
|
// verify that the hard-coded value in `dwarf_const.rs` still agrees with LLVM.
|
||||||
|
static_assert(dwarf::DW_OP_LLVM_fragment == 0x1000);
|
||||||
|
|
||||||
// LLVMAtomicOrdering is already an enum - don't create another
|
// LLVMAtomicOrdering is already an enum - don't create another
|
||||||
// one.
|
// one.
|
||||||
static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {
|
static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {
|
||||||
|
@ -1397,18 +1401,6 @@ LLVMRustDILocationCloneWithBaseDiscriminator(LLVMMetadataRef Location,
|
||||||
return wrap(NewLoc.has_value() ? NewLoc.value() : nullptr);
|
return wrap(NewLoc.has_value() ? NewLoc.value() : nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" uint64_t LLVMRustDIBuilderCreateOpDeref() {
|
|
||||||
return dwarf::DW_OP_deref;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" uint64_t LLVMRustDIBuilderCreateOpPlusUconst() {
|
|
||||||
return dwarf::DW_OP_plus_uconst;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" uint64_t LLVMRustDIBuilderCreateOpLLVMFragment() {
|
|
||||||
return dwarf::DW_OP_LLVM_fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void LLVMRustWriteTypeToString(LLVMTypeRef Ty, RustStringRef Str) {
|
extern "C" void LLVMRustWriteTypeToString(LLVMTypeRef Ty, RustStringRef Str) {
|
||||||
auto OS = RawRustStringOstream(Str);
|
auto OS = RawRustStringOstream(Str);
|
||||||
unwrap<llvm::Type>(Ty)->print(OS);
|
unwrap<llvm::Type>(Ty)->print(OS);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue