rustc_codegen_llvm: fix ownership of DIBuilder.
This commit is contained in:
parent
54c98ab0dd
commit
69ed6b928c
3 changed files with 45 additions and 34 deletions
|
@ -69,7 +69,7 @@ const DW_TAG_arg_variable: c_uint = 0x101;
|
||||||
pub struct CrateDebugContext<'a, 'tcx> {
|
pub struct CrateDebugContext<'a, 'tcx> {
|
||||||
llcontext: &'a llvm::Context,
|
llcontext: &'a llvm::Context,
|
||||||
llmod: &'a llvm::Module,
|
llmod: &'a llvm::Module,
|
||||||
builder: &'a DIBuilder,
|
builder: &'a mut DIBuilder<'a>,
|
||||||
created_files: RefCell<FxHashMap<(Symbol, Symbol), &'a DIFile>>,
|
created_files: RefCell<FxHashMap<(Symbol, Symbol), &'a DIFile>>,
|
||||||
created_enum_disr_types: RefCell<FxHashMap<(DefId, layout::Primitive), &'a DIType>>,
|
created_enum_disr_types: RefCell<FxHashMap<(DefId, layout::Primitive), &'a DIType>>,
|
||||||
|
|
||||||
|
@ -81,6 +81,14 @@ pub struct CrateDebugContext<'a, 'tcx> {
|
||||||
composite_types_completed: RefCell<FxHashSet<&'a DIType>>,
|
composite_types_completed: RefCell<FxHashSet<&'a DIType>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for CrateDebugContext<'a, 'tcx> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
llvm::LLVMRustDIBuilderDispose(&mut *(self.builder as *mut _));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> CrateDebugContext<'a, 'tcx> {
|
impl<'a, 'tcx> CrateDebugContext<'a, 'tcx> {
|
||||||
pub fn new(llmod: &'a llvm::Module) -> Self {
|
pub fn new(llmod: &'a llvm::Module) -> Self {
|
||||||
debug!("CrateDebugContext::new");
|
debug!("CrateDebugContext::new");
|
||||||
|
@ -166,7 +174,6 @@ pub fn finalize(cx: &CodegenCx) {
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMRustDIBuilderFinalize(DIB(cx));
|
llvm::LLVMRustDIBuilderFinalize(DIB(cx));
|
||||||
llvm::LLVMRustDIBuilderDispose(DIB(cx));
|
|
||||||
// Debuginfo generation in LLVM by default uses a higher
|
// Debuginfo generation in LLVM by default uses a higher
|
||||||
// version of dwarf than macOS currently understands. We can
|
// version of dwarf than macOS currently understands. We can
|
||||||
// instruct LLVM to emit an older version of dwarf, however,
|
// instruct LLVM to emit an older version of dwarf, however,
|
||||||
|
|
|
@ -36,7 +36,10 @@ pub fn is_node_local_to_unit(cx: &CodegenCx, def_id: DefId) -> bool
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub fn create_DIArray(builder: &'ll DIBuilder, arr: &[Option<&'ll DIDescriptor>]) -> &'ll DIArray {
|
pub fn create_DIArray(
|
||||||
|
builder: &DIBuilder<'ll>,
|
||||||
|
arr: &[Option<&'ll DIDescriptor>],
|
||||||
|
) -> &'ll DIArray {
|
||||||
return unsafe {
|
return unsafe {
|
||||||
llvm::LLVMRustDIBuilderGetOrCreateArray(builder, arr.as_ptr(), arr.len() as u32)
|
llvm::LLVMRustDIBuilderGetOrCreateArray(builder, arr.as_ptr(), arr.len() as u32)
|
||||||
};
|
};
|
||||||
|
@ -54,7 +57,7 @@ pub fn debug_context(cx: &'a CodegenCx<'ll, 'tcx>) -> &'a CrateDebugContext<'ll,
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub fn DIB(cx: &CodegenCx<'ll, '_>) -> &'ll DIBuilder {
|
pub fn DIB(cx: &'a CodegenCx<'ll, '_>) -> &'a DIBuilder<'ll> {
|
||||||
cx.dbg_cx.as_ref().unwrap().builder
|
cx.dbg_cx.as_ref().unwrap().builder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -426,9 +426,10 @@ pub type InlineAsmDiagHandler = unsafe extern "C" fn(&SMDiagnostic, *const c_voi
|
||||||
|
|
||||||
|
|
||||||
pub mod debuginfo {
|
pub mod debuginfo {
|
||||||
use super::Metadata;
|
use super::{InvariantOpaque, Metadata};
|
||||||
|
|
||||||
extern { pub type DIBuilder; }
|
#[repr(C)]
|
||||||
|
pub struct DIBuilder<'a>(InvariantOpaque<'a>);
|
||||||
|
|
||||||
pub type DIDescriptor = Metadata;
|
pub type DIDescriptor = Metadata;
|
||||||
pub type DIScope = DIDescriptor;
|
pub type DIScope = DIDescriptor;
|
||||||
|
@ -1211,13 +1212,13 @@ extern "C" {
|
||||||
|
|
||||||
pub fn LLVMRustMetadataAsValue(C: &'a Context, MD: &'a Metadata) -> &'a Value;
|
pub fn LLVMRustMetadataAsValue(C: &'a Context, MD: &'a Metadata) -> &'a Value;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreate(M: &Module) -> &DIBuilder;
|
pub fn LLVMRustDIBuilderCreate(M: &'a Module) -> &'a mut DIBuilder<'a>;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderDispose(Builder: &DIBuilder);
|
pub fn LLVMRustDIBuilderDispose(Builder: &'a mut DIBuilder<'a>);
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderFinalize(Builder: &DIBuilder);
|
pub fn LLVMRustDIBuilderFinalize(Builder: &DIBuilder);
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateCompileUnit(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateCompileUnit(Builder: &DIBuilder<'a>,
|
||||||
Lang: c_uint,
|
Lang: c_uint,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
Producer: *const c_char,
|
Producer: *const c_char,
|
||||||
|
@ -1227,17 +1228,17 @@ extern "C" {
|
||||||
SplitName: *const c_char)
|
SplitName: *const c_char)
|
||||||
-> &'a DIDescriptor;
|
-> &'a DIDescriptor;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateFile(Builder: &DIBuilder,
|
pub fn LLVMRustDIBuilderCreateFile(Builder: &DIBuilder<'a>,
|
||||||
Filename: *const c_char,
|
Filename: *const c_char,
|
||||||
Directory: *const c_char)
|
Directory: *const c_char)
|
||||||
-> &DIFile;
|
-> &'a DIFile;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateSubroutineType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateSubroutineType(Builder: &DIBuilder<'a>,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
ParameterTypes: &'a DIArray)
|
ParameterTypes: &'a DIArray)
|
||||||
-> &'a DICompositeType;
|
-> &'a DICompositeType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateFunction(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateFunction(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIDescriptor,
|
Scope: &'a DIDescriptor,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
LinkageName: *const c_char,
|
LinkageName: *const c_char,
|
||||||
|
@ -1254,21 +1255,21 @@ extern "C" {
|
||||||
Decl: Option<&'a DIDescriptor>)
|
Decl: Option<&'a DIDescriptor>)
|
||||||
-> &'a DISubprogram;
|
-> &'a DISubprogram;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateBasicType(Builder: &DIBuilder,
|
pub fn LLVMRustDIBuilderCreateBasicType(Builder: &DIBuilder<'a>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
SizeInBits: u64,
|
SizeInBits: u64,
|
||||||
AlignInBits: u32,
|
AlignInBits: u32,
|
||||||
Encoding: c_uint)
|
Encoding: c_uint)
|
||||||
-> &DIBasicType;
|
-> &'a DIBasicType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreatePointerType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreatePointerType(Builder: &DIBuilder<'a>,
|
||||||
PointeeTy: &'a DIType,
|
PointeeTy: &'a DIType,
|
||||||
SizeInBits: u64,
|
SizeInBits: u64,
|
||||||
AlignInBits: u32,
|
AlignInBits: u32,
|
||||||
Name: *const c_char)
|
Name: *const c_char)
|
||||||
-> &'a DIDerivedType;
|
-> &'a DIDerivedType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateStructType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateStructType(Builder: &DIBuilder<'a>,
|
||||||
Scope: Option<&'a DIDescriptor>,
|
Scope: Option<&'a DIDescriptor>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
|
@ -1283,7 +1284,7 @@ extern "C" {
|
||||||
UniqueId: *const c_char)
|
UniqueId: *const c_char)
|
||||||
-> &'a DICompositeType;
|
-> &'a DICompositeType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateMemberType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateMemberType(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIDescriptor,
|
Scope: &'a DIDescriptor,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
|
@ -1295,19 +1296,19 @@ extern "C" {
|
||||||
Ty: &'a DIType)
|
Ty: &'a DIType)
|
||||||
-> &'a DIDerivedType;
|
-> &'a DIDerivedType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateLexicalBlock(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateLexicalBlock(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIScope,
|
Scope: &'a DIScope,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
Line: c_uint,
|
Line: c_uint,
|
||||||
Col: c_uint)
|
Col: c_uint)
|
||||||
-> &'a DILexicalBlock;
|
-> &'a DILexicalBlock;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateLexicalBlockFile(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateLexicalBlockFile(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIScope,
|
Scope: &'a DIScope,
|
||||||
File: &'a DIFile)
|
File: &'a DIFile)
|
||||||
-> &'a DILexicalBlock;
|
-> &'a DILexicalBlock;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateStaticVariable(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateStaticVariable(Builder: &DIBuilder<'a>,
|
||||||
Context: Option<&'a DIScope>,
|
Context: Option<&'a DIScope>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
LinkageName: *const c_char,
|
LinkageName: *const c_char,
|
||||||
|
@ -1320,7 +1321,7 @@ extern "C" {
|
||||||
AlignInBits: u32)
|
AlignInBits: u32)
|
||||||
-> &'a DIGlobalVariable;
|
-> &'a DIGlobalVariable;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateVariable(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateVariable(Builder: &DIBuilder<'a>,
|
||||||
Tag: c_uint,
|
Tag: c_uint,
|
||||||
Scope: &'a DIDescriptor,
|
Scope: &'a DIDescriptor,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
|
@ -1333,24 +1334,24 @@ extern "C" {
|
||||||
AlignInBits: u32)
|
AlignInBits: u32)
|
||||||
-> &'a DIVariable;
|
-> &'a DIVariable;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateArrayType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateArrayType(Builder: &DIBuilder<'a>,
|
||||||
Size: u64,
|
Size: u64,
|
||||||
AlignInBits: u32,
|
AlignInBits: u32,
|
||||||
Ty: &'a DIType,
|
Ty: &'a DIType,
|
||||||
Subscripts: &'a DIArray)
|
Subscripts: &'a DIArray)
|
||||||
-> &'a DIType;
|
-> &'a DIType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderGetOrCreateSubrange(Builder: &DIBuilder,
|
pub fn LLVMRustDIBuilderGetOrCreateSubrange(Builder: &DIBuilder<'a>,
|
||||||
Lo: i64,
|
Lo: i64,
|
||||||
Count: i64)
|
Count: i64)
|
||||||
-> &DISubrange;
|
-> &'a DISubrange;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderGetOrCreateArray(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderGetOrCreateArray(Builder: &DIBuilder<'a>,
|
||||||
Ptr: *const Option<&'a DIDescriptor>,
|
Ptr: *const Option<&'a DIDescriptor>,
|
||||||
Count: c_uint)
|
Count: c_uint)
|
||||||
-> &'a DIArray;
|
-> &'a DIArray;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderInsertDeclareAtEnd(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderInsertDeclareAtEnd(Builder: &DIBuilder<'a>,
|
||||||
Val: &'a Value,
|
Val: &'a Value,
|
||||||
VarInfo: &'a DIVariable,
|
VarInfo: &'a DIVariable,
|
||||||
AddrOps: *const i64,
|
AddrOps: *const i64,
|
||||||
|
@ -1359,12 +1360,12 @@ extern "C" {
|
||||||
InsertAtEnd: &'a BasicBlock)
|
InsertAtEnd: &'a BasicBlock)
|
||||||
-> &'a Value;
|
-> &'a Value;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateEnumerator(Builder: &DIBuilder,
|
pub fn LLVMRustDIBuilderCreateEnumerator(Builder: &DIBuilder<'a>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
Val: u64)
|
Val: u64)
|
||||||
-> &DIEnumerator;
|
-> &'a DIEnumerator;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateEnumerationType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateEnumerationType(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIScope,
|
Scope: &'a DIScope,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
|
@ -1375,7 +1376,7 @@ extern "C" {
|
||||||
ClassType: &'a DIType)
|
ClassType: &'a DIType)
|
||||||
-> &'a DIType;
|
-> &'a DIType;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateUnionType(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateUnionType(Builder: &DIBuilder<'a>,
|
||||||
Scope: &'a DIScope,
|
Scope: &'a DIScope,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
|
@ -1390,7 +1391,7 @@ extern "C" {
|
||||||
|
|
||||||
pub fn LLVMSetUnnamedAddr(GlobalVar: &Value, UnnamedAddr: Bool);
|
pub fn LLVMSetUnnamedAddr(GlobalVar: &Value, UnnamedAddr: Bool);
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateTemplateTypeParameter(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateTemplateTypeParameter(Builder: &DIBuilder<'a>,
|
||||||
Scope: Option<&'a DIScope>,
|
Scope: Option<&'a DIScope>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
Ty: &'a DIType,
|
Ty: &'a DIType,
|
||||||
|
@ -1400,14 +1401,14 @@ extern "C" {
|
||||||
-> &'a DITemplateTypeParameter;
|
-> &'a DITemplateTypeParameter;
|
||||||
|
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreateNameSpace(Builder: &'a DIBuilder,
|
pub fn LLVMRustDIBuilderCreateNameSpace(Builder: &DIBuilder<'a>,
|
||||||
Scope: Option<&'a DIScope>,
|
Scope: Option<&'a DIScope>,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
File: &'a DIFile,
|
File: &'a DIFile,
|
||||||
LineNo: c_uint)
|
LineNo: c_uint)
|
||||||
-> &'a DINameSpace;
|
-> &'a DINameSpace;
|
||||||
|
|
||||||
pub fn LLVMRustDICompositeTypeSetTypeArray(Builder: &'a DIBuilder,
|
pub fn LLVMRustDICompositeTypeSetTypeArray(Builder: &DIBuilder<'a>,
|
||||||
CompositeType: &'a DIType,
|
CompositeType: &'a DIType,
|
||||||
TypeArray: &'a DIArray);
|
TypeArray: &'a DIArray);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue