Skip to content

Commit 69ed6b9

Browse files
committed
rustc_codegen_llvm: fix ownership of DIBuilder.
1 parent 54c98ab commit 69ed6b9

File tree

3 files changed

+45
-34
lines changed

3 files changed

+45
-34
lines changed

Diff for: src/librustc_codegen_llvm/debuginfo/mod.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const DW_TAG_arg_variable: c_uint = 0x101;
6969
pub struct CrateDebugContext<'a, 'tcx> {
7070
llcontext: &'a llvm::Context,
7171
llmod: &'a llvm::Module,
72-
builder: &'a DIBuilder,
72+
builder: &'a mut DIBuilder<'a>,
7373
created_files: RefCell<FxHashMap<(Symbol, Symbol), &'a DIFile>>,
7474
created_enum_disr_types: RefCell<FxHashMap<(DefId, layout::Primitive), &'a DIType>>,
7575

@@ -81,6 +81,14 @@ pub struct CrateDebugContext<'a, 'tcx> {
8181
composite_types_completed: RefCell<FxHashSet<&'a DIType>>,
8282
}
8383

84+
impl Drop for CrateDebugContext<'a, 'tcx> {
85+
fn drop(&mut self) {
86+
unsafe {
87+
llvm::LLVMRustDIBuilderDispose(&mut *(self.builder as *mut _));
88+
}
89+
}
90+
}
91+
8492
impl<'a, 'tcx> CrateDebugContext<'a, 'tcx> {
8593
pub fn new(llmod: &'a llvm::Module) -> Self {
8694
debug!("CrateDebugContext::new");
@@ -166,7 +174,6 @@ pub fn finalize(cx: &CodegenCx) {
166174

167175
unsafe {
168176
llvm::LLVMRustDIBuilderFinalize(DIB(cx));
169-
llvm::LLVMRustDIBuilderDispose(DIB(cx));
170177
// Debuginfo generation in LLVM by default uses a higher
171178
// version of dwarf than macOS currently understands. We can
172179
// instruct LLVM to emit an older version of dwarf, however,

Diff for: src/librustc_codegen_llvm/debuginfo/utils.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ pub fn is_node_local_to_unit(cx: &CodegenCx, def_id: DefId) -> bool
3636
}
3737

3838
#[allow(non_snake_case)]
39-
pub fn create_DIArray(builder: &'ll DIBuilder, arr: &[Option<&'ll DIDescriptor>]) -> &'ll DIArray {
39+
pub fn create_DIArray(
40+
builder: &DIBuilder<'ll>,
41+
arr: &[Option<&'ll DIDescriptor>],
42+
) -> &'ll DIArray {
4043
return unsafe {
4144
llvm::LLVMRustDIBuilderGetOrCreateArray(builder, arr.as_ptr(), arr.len() as u32)
4245
};
@@ -54,7 +57,7 @@ pub fn debug_context(cx: &'a CodegenCx<'ll, 'tcx>) -> &'a CrateDebugContext<'ll,
5457

5558
#[inline]
5659
#[allow(non_snake_case)]
57-
pub fn DIB(cx: &CodegenCx<'ll, '_>) -> &'ll DIBuilder {
60+
pub fn DIB(cx: &'a CodegenCx<'ll, '_>) -> &'a DIBuilder<'ll> {
5861
cx.dbg_cx.as_ref().unwrap().builder
5962
}
6063

Diff for: src/librustc_codegen_llvm/llvm/ffi.rs

+31-30
Original file line numberDiff line numberDiff line change
@@ -426,9 +426,10 @@ pub type InlineAsmDiagHandler = unsafe extern "C" fn(&SMDiagnostic, *const c_voi
426426

427427

428428
pub mod debuginfo {
429-
use super::Metadata;
429+
use super::{InvariantOpaque, Metadata};
430430

431-
extern { pub type DIBuilder; }
431+
#[repr(C)]
432+
pub struct DIBuilder<'a>(InvariantOpaque<'a>);
432433

433434
pub type DIDescriptor = Metadata;
434435
pub type DIScope = DIDescriptor;
@@ -1211,13 +1212,13 @@ extern "C" {
12111212

12121213
pub fn LLVMRustMetadataAsValue(C: &'a Context, MD: &'a Metadata) -> &'a Value;
12131214

1214-
pub fn LLVMRustDIBuilderCreate(M: &Module) -> &DIBuilder;
1215+
pub fn LLVMRustDIBuilderCreate(M: &'a Module) -> &'a mut DIBuilder<'a>;
12151216

1216-
pub fn LLVMRustDIBuilderDispose(Builder: &DIBuilder);
1217+
pub fn LLVMRustDIBuilderDispose(Builder: &'a mut DIBuilder<'a>);
12171218

12181219
pub fn LLVMRustDIBuilderFinalize(Builder: &DIBuilder);
12191220

1220-
pub fn LLVMRustDIBuilderCreateCompileUnit(Builder: &'a DIBuilder,
1221+
pub fn LLVMRustDIBuilderCreateCompileUnit(Builder: &DIBuilder<'a>,
12211222
Lang: c_uint,
12221223
File: &'a DIFile,
12231224
Producer: *const c_char,
@@ -1227,17 +1228,17 @@ extern "C" {
12271228
SplitName: *const c_char)
12281229
-> &'a DIDescriptor;
12291230

1230-
pub fn LLVMRustDIBuilderCreateFile(Builder: &DIBuilder,
1231+
pub fn LLVMRustDIBuilderCreateFile(Builder: &DIBuilder<'a>,
12311232
Filename: *const c_char,
12321233
Directory: *const c_char)
1233-
-> &DIFile;
1234+
-> &'a DIFile;
12341235

1235-
pub fn LLVMRustDIBuilderCreateSubroutineType(Builder: &'a DIBuilder,
1236+
pub fn LLVMRustDIBuilderCreateSubroutineType(Builder: &DIBuilder<'a>,
12361237
File: &'a DIFile,
12371238
ParameterTypes: &'a DIArray)
12381239
-> &'a DICompositeType;
12391240

1240-
pub fn LLVMRustDIBuilderCreateFunction(Builder: &'a DIBuilder,
1241+
pub fn LLVMRustDIBuilderCreateFunction(Builder: &DIBuilder<'a>,
12411242
Scope: &'a DIDescriptor,
12421243
Name: *const c_char,
12431244
LinkageName: *const c_char,
@@ -1254,21 +1255,21 @@ extern "C" {
12541255
Decl: Option<&'a DIDescriptor>)
12551256
-> &'a DISubprogram;
12561257

1257-
pub fn LLVMRustDIBuilderCreateBasicType(Builder: &DIBuilder,
1258+
pub fn LLVMRustDIBuilderCreateBasicType(Builder: &DIBuilder<'a>,
12581259
Name: *const c_char,
12591260
SizeInBits: u64,
12601261
AlignInBits: u32,
12611262
Encoding: c_uint)
1262-
-> &DIBasicType;
1263+
-> &'a DIBasicType;
12631264

1264-
pub fn LLVMRustDIBuilderCreatePointerType(Builder: &'a DIBuilder,
1265+
pub fn LLVMRustDIBuilderCreatePointerType(Builder: &DIBuilder<'a>,
12651266
PointeeTy: &'a DIType,
12661267
SizeInBits: u64,
12671268
AlignInBits: u32,
12681269
Name: *const c_char)
12691270
-> &'a DIDerivedType;
12701271

1271-
pub fn LLVMRustDIBuilderCreateStructType(Builder: &'a DIBuilder,
1272+
pub fn LLVMRustDIBuilderCreateStructType(Builder: &DIBuilder<'a>,
12721273
Scope: Option<&'a DIDescriptor>,
12731274
Name: *const c_char,
12741275
File: &'a DIFile,
@@ -1283,7 +1284,7 @@ extern "C" {
12831284
UniqueId: *const c_char)
12841285
-> &'a DICompositeType;
12851286

1286-
pub fn LLVMRustDIBuilderCreateMemberType(Builder: &'a DIBuilder,
1287+
pub fn LLVMRustDIBuilderCreateMemberType(Builder: &DIBuilder<'a>,
12871288
Scope: &'a DIDescriptor,
12881289
Name: *const c_char,
12891290
File: &'a DIFile,
@@ -1295,19 +1296,19 @@ extern "C" {
12951296
Ty: &'a DIType)
12961297
-> &'a DIDerivedType;
12971298

1298-
pub fn LLVMRustDIBuilderCreateLexicalBlock(Builder: &'a DIBuilder,
1299+
pub fn LLVMRustDIBuilderCreateLexicalBlock(Builder: &DIBuilder<'a>,
12991300
Scope: &'a DIScope,
13001301
File: &'a DIFile,
13011302
Line: c_uint,
13021303
Col: c_uint)
13031304
-> &'a DILexicalBlock;
13041305

1305-
pub fn LLVMRustDIBuilderCreateLexicalBlockFile(Builder: &'a DIBuilder,
1306+
pub fn LLVMRustDIBuilderCreateLexicalBlockFile(Builder: &DIBuilder<'a>,
13061307
Scope: &'a DIScope,
13071308
File: &'a DIFile)
13081309
-> &'a DILexicalBlock;
13091310

1310-
pub fn LLVMRustDIBuilderCreateStaticVariable(Builder: &'a DIBuilder,
1311+
pub fn LLVMRustDIBuilderCreateStaticVariable(Builder: &DIBuilder<'a>,
13111312
Context: Option<&'a DIScope>,
13121313
Name: *const c_char,
13131314
LinkageName: *const c_char,
@@ -1320,7 +1321,7 @@ extern "C" {
13201321
AlignInBits: u32)
13211322
-> &'a DIGlobalVariable;
13221323

1323-
pub fn LLVMRustDIBuilderCreateVariable(Builder: &'a DIBuilder,
1324+
pub fn LLVMRustDIBuilderCreateVariable(Builder: &DIBuilder<'a>,
13241325
Tag: c_uint,
13251326
Scope: &'a DIDescriptor,
13261327
Name: *const c_char,
@@ -1333,24 +1334,24 @@ extern "C" {
13331334
AlignInBits: u32)
13341335
-> &'a DIVariable;
13351336

1336-
pub fn LLVMRustDIBuilderCreateArrayType(Builder: &'a DIBuilder,
1337+
pub fn LLVMRustDIBuilderCreateArrayType(Builder: &DIBuilder<'a>,
13371338
Size: u64,
13381339
AlignInBits: u32,
13391340
Ty: &'a DIType,
13401341
Subscripts: &'a DIArray)
13411342
-> &'a DIType;
13421343

1343-
pub fn LLVMRustDIBuilderGetOrCreateSubrange(Builder: &DIBuilder,
1344+
pub fn LLVMRustDIBuilderGetOrCreateSubrange(Builder: &DIBuilder<'a>,
13441345
Lo: i64,
13451346
Count: i64)
1346-
-> &DISubrange;
1347+
-> &'a DISubrange;
13471348

1348-
pub fn LLVMRustDIBuilderGetOrCreateArray(Builder: &'a DIBuilder,
1349+
pub fn LLVMRustDIBuilderGetOrCreateArray(Builder: &DIBuilder<'a>,
13491350
Ptr: *const Option<&'a DIDescriptor>,
13501351
Count: c_uint)
13511352
-> &'a DIArray;
13521353

1353-
pub fn LLVMRustDIBuilderInsertDeclareAtEnd(Builder: &'a DIBuilder,
1354+
pub fn LLVMRustDIBuilderInsertDeclareAtEnd(Builder: &DIBuilder<'a>,
13541355
Val: &'a Value,
13551356
VarInfo: &'a DIVariable,
13561357
AddrOps: *const i64,
@@ -1359,12 +1360,12 @@ extern "C" {
13591360
InsertAtEnd: &'a BasicBlock)
13601361
-> &'a Value;
13611362

1362-
pub fn LLVMRustDIBuilderCreateEnumerator(Builder: &DIBuilder,
1363+
pub fn LLVMRustDIBuilderCreateEnumerator(Builder: &DIBuilder<'a>,
13631364
Name: *const c_char,
13641365
Val: u64)
1365-
-> &DIEnumerator;
1366+
-> &'a DIEnumerator;
13661367

1367-
pub fn LLVMRustDIBuilderCreateEnumerationType(Builder: &'a DIBuilder,
1368+
pub fn LLVMRustDIBuilderCreateEnumerationType(Builder: &DIBuilder<'a>,
13681369
Scope: &'a DIScope,
13691370
Name: *const c_char,
13701371
File: &'a DIFile,
@@ -1375,7 +1376,7 @@ extern "C" {
13751376
ClassType: &'a DIType)
13761377
-> &'a DIType;
13771378

1378-
pub fn LLVMRustDIBuilderCreateUnionType(Builder: &'a DIBuilder,
1379+
pub fn LLVMRustDIBuilderCreateUnionType(Builder: &DIBuilder<'a>,
13791380
Scope: &'a DIScope,
13801381
Name: *const c_char,
13811382
File: &'a DIFile,
@@ -1390,7 +1391,7 @@ extern "C" {
13901391

13911392
pub fn LLVMSetUnnamedAddr(GlobalVar: &Value, UnnamedAddr: Bool);
13921393

1393-
pub fn LLVMRustDIBuilderCreateTemplateTypeParameter(Builder: &'a DIBuilder,
1394+
pub fn LLVMRustDIBuilderCreateTemplateTypeParameter(Builder: &DIBuilder<'a>,
13941395
Scope: Option<&'a DIScope>,
13951396
Name: *const c_char,
13961397
Ty: &'a DIType,
@@ -1400,14 +1401,14 @@ extern "C" {
14001401
-> &'a DITemplateTypeParameter;
14011402

14021403

1403-
pub fn LLVMRustDIBuilderCreateNameSpace(Builder: &'a DIBuilder,
1404+
pub fn LLVMRustDIBuilderCreateNameSpace(Builder: &DIBuilder<'a>,
14041405
Scope: Option<&'a DIScope>,
14051406
Name: *const c_char,
14061407
File: &'a DIFile,
14071408
LineNo: c_uint)
14081409
-> &'a DINameSpace;
14091410

1410-
pub fn LLVMRustDICompositeTypeSetTypeArray(Builder: &'a DIBuilder,
1411+
pub fn LLVMRustDICompositeTypeSetTypeArray(Builder: &DIBuilder<'a>,
14111412
CompositeType: &'a DIType,
14121413
TypeArray: &'a DIArray);
14131414

0 commit comments

Comments
 (0)