Use LLVMDIBuilderCreateGlobalVariableExpression
Note that the code in `LLVMRustDIBuilderCreateStaticVariable` that tried to downcast `InitVal` appears to have been dead, because `llvm::ConstantInt` and `llvm::ConstantFP` are not subclasses of `llvm::GlobalVariable`.
This commit is contained in:
parent
1db7d41665
commit
1081d98551
3 changed files with 37 additions and 60 deletions
|
|
@ -1,9 +1,8 @@
|
|||
use libc::c_uint;
|
||||
use rustc_abi::Align;
|
||||
|
||||
use crate::common::AsCCharPtr;
|
||||
use crate::llvm;
|
||||
use crate::llvm::debuginfo::DIBuilder;
|
||||
use crate::llvm::{self, ToLlvmBool};
|
||||
|
||||
/// Extension trait for defining safe wrappers and helper methods on
|
||||
/// `&DIBuilder<'ll>`, without requiring it to be defined in the same crate.
|
||||
|
|
@ -31,23 +30,33 @@ pub(crate) trait DIBuilderExt<'ll> {
|
|||
let this = self.as_di_builder();
|
||||
let align_in_bits = align.map_or(0, |align| align.bits() as u32);
|
||||
|
||||
unsafe {
|
||||
llvm::LLVMRustDIBuilderCreateStaticVariable(
|
||||
// `LLVMDIBuilderCreateGlobalVariableExpression` would assert if we
|
||||
// gave it a null `Expr` pointer, so give it an empty expression
|
||||
// instead, which is what the C++ `createGlobalVariableExpression`
|
||||
// method would do if given a null `DIExpression` pointer.
|
||||
let expr = self.create_expression(&[]);
|
||||
|
||||
let global_var_expr = unsafe {
|
||||
llvm::LLVMDIBuilderCreateGlobalVariableExpression(
|
||||
this,
|
||||
scope,
|
||||
name.as_c_char_ptr(),
|
||||
name.as_ptr(),
|
||||
name.len(),
|
||||
linkage_name.as_c_char_ptr(),
|
||||
linkage_name.as_ptr(),
|
||||
linkage_name.len(),
|
||||
file,
|
||||
line_number,
|
||||
ty,
|
||||
is_local_to_unit,
|
||||
val,
|
||||
is_local_to_unit.to_llvm_bool(),
|
||||
expr,
|
||||
decl,
|
||||
align_in_bits,
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
unsafe { llvm::LLVMGlobalSetMetadata(val, llvm::MD_dbg, global_var_expr) };
|
||||
|
||||
global_var_expr
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@ use libc::{c_char, c_int, c_uchar, c_uint, c_ulonglong, c_void, size_t};
|
|||
|
||||
use super::RustString;
|
||||
use super::debuginfo::{
|
||||
DIArray, DIBuilder, DIDerivedType, DIDescriptor, DIEnumerator, DIFile, DIFlags,
|
||||
DIGlobalVariableExpression, DILocation, DISPFlags, DIScope, DISubprogram,
|
||||
DITemplateTypeParameter, DIType, DebugEmissionKind, DebugNameTableKind,
|
||||
DIArray, DIBuilder, DIDerivedType, DIDescriptor, DIEnumerator, DIFile, DIFlags, DILocation,
|
||||
DISPFlags, DIScope, DISubprogram, DITemplateTypeParameter, DIType, DebugEmissionKind,
|
||||
DebugNameTableKind,
|
||||
};
|
||||
use crate::llvm::MetadataKindId;
|
||||
use crate::{TryFromU32, llvm};
|
||||
|
|
@ -781,7 +781,6 @@ pub(crate) mod debuginfo {
|
|||
pub(crate) type DIDerivedType = DIType;
|
||||
pub(crate) type DICompositeType = DIDerivedType;
|
||||
pub(crate) type DIVariable = DIDescriptor;
|
||||
pub(crate) type DIGlobalVariableExpression = DIDescriptor;
|
||||
pub(crate) type DIArray = DIDescriptor;
|
||||
pub(crate) type DIEnumerator = DIDescriptor;
|
||||
pub(crate) type DITemplateTypeParameter = DIDescriptor;
|
||||
|
|
@ -1875,6 +1874,22 @@ unsafe extern "C" {
|
|||
Length: size_t,
|
||||
) -> &'ll Metadata;
|
||||
|
||||
pub(crate) fn LLVMDIBuilderCreateGlobalVariableExpression<'ll>(
|
||||
Builder: &DIBuilder<'ll>,
|
||||
Scope: Option<&'ll Metadata>,
|
||||
Name: *const c_uchar, // See "PTR_LEN_STR".
|
||||
NameLen: size_t,
|
||||
Linkage: *const c_uchar, // See "PTR_LEN_STR".
|
||||
LinkLen: size_t,
|
||||
File: &'ll Metadata,
|
||||
LineNo: c_uint,
|
||||
Ty: &'ll Metadata,
|
||||
LocalToUnit: llvm::Bool,
|
||||
Expr: &'ll Metadata,
|
||||
Decl: Option<&'ll Metadata>,
|
||||
AlignInBits: u32,
|
||||
) -> &'ll Metadata;
|
||||
|
||||
pub(crate) fn LLVMDIBuilderInsertDeclareRecordAtEnd<'ll>(
|
||||
Builder: &DIBuilder<'ll>,
|
||||
Storage: &'ll Value,
|
||||
|
|
@ -2214,22 +2229,6 @@ unsafe extern "C" {
|
|||
Ty: &'a DIType,
|
||||
) -> &'a DIType;
|
||||
|
||||
pub(crate) fn LLVMRustDIBuilderCreateStaticVariable<'a>(
|
||||
Builder: &DIBuilder<'a>,
|
||||
Context: Option<&'a DIScope>,
|
||||
Name: *const c_char,
|
||||
NameLen: size_t,
|
||||
LinkageName: *const c_char,
|
||||
LinkageNameLen: size_t,
|
||||
File: &'a DIFile,
|
||||
LineNo: c_uint,
|
||||
Ty: &'a DIType,
|
||||
isLocalToUnit: bool,
|
||||
Val: &'a Value,
|
||||
Decl: Option<&'a DIDescriptor>,
|
||||
AlignInBits: u32,
|
||||
) -> &'a DIGlobalVariableExpression;
|
||||
|
||||
pub(crate) fn LLVMRustDIBuilderCreateEnumerator<'a>(
|
||||
Builder: &DIBuilder<'a>,
|
||||
Name: *const c_char,
|
||||
|
|
|
|||
|
|
@ -1044,37 +1044,6 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateVariantMemberType(
|
|||
fromRust(Flags), unwrapDI<DIType>(Ty)));
|
||||
}
|
||||
|
||||
extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateStaticVariable(
|
||||
LLVMDIBuilderRef Builder, LLVMMetadataRef Context, const char *Name,
|
||||
size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
|
||||
LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
|
||||
bool IsLocalToUnit, LLVMValueRef V, LLVMMetadataRef Decl = nullptr,
|
||||
uint32_t AlignInBits = 0) {
|
||||
llvm::GlobalVariable *InitVal = cast<llvm::GlobalVariable>(unwrap(V));
|
||||
|
||||
llvm::DIExpression *InitExpr = nullptr;
|
||||
if (llvm::ConstantInt *IntVal = llvm::dyn_cast<llvm::ConstantInt>(InitVal)) {
|
||||
InitExpr = unwrap(Builder)->createConstantValueExpression(
|
||||
IntVal->getValue().getSExtValue());
|
||||
} else if (llvm::ConstantFP *FPVal =
|
||||
llvm::dyn_cast<llvm::ConstantFP>(InitVal)) {
|
||||
InitExpr = unwrap(Builder)->createConstantValueExpression(
|
||||
FPVal->getValueAPF().bitcastToAPInt().getZExtValue());
|
||||
}
|
||||
|
||||
llvm::DIGlobalVariableExpression *VarExpr =
|
||||
unwrap(Builder)->createGlobalVariableExpression(
|
||||
unwrapDI<DIDescriptor>(Context), StringRef(Name, NameLen),
|
||||
StringRef(LinkageName, LinkageNameLen), unwrapDI<DIFile>(File),
|
||||
LineNo, unwrapDI<DIType>(Ty), IsLocalToUnit,
|
||||
/* isDefined */ true, InitExpr, unwrapDIPtr<MDNode>(Decl),
|
||||
/* templateParams */ nullptr, AlignInBits);
|
||||
|
||||
InitVal->setMetadata("dbg", VarExpr);
|
||||
|
||||
return wrap(VarExpr);
|
||||
}
|
||||
|
||||
extern "C" LLVMMetadataRef
|
||||
LLVMRustDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name,
|
||||
size_t NameLen, const uint64_t Value[2],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue