From 68fff6254286bcee426fd9020c54f8f30b64758e Mon Sep 17 00:00:00 2001 From: Matt Ickstadt Date: Sat, 11 Feb 2017 15:01:25 -0600 Subject: [PATCH 1/2] [LLVM 4.0] Fix CreateCompileUnit --- src/librustc_llvm/ffi.rs | 3 +-- src/librustc_trans/debuginfo/metadata.rs | 17 ++++++++++------- src/rustllvm/RustWrapper.cpp | 14 +++++++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs index 5273910d1d954..8a958cf1ac105 100644 --- a/src/librustc_llvm/ffi.rs +++ b/src/librustc_llvm/ffi.rs @@ -1334,8 +1334,7 @@ extern "C" { pub fn LLVMRustDIBuilderCreateCompileUnit(Builder: DIBuilderRef, Lang: c_uint, - File: *const c_char, - Dir: *const c_char, + File: DIFile, Producer: *const c_char, isOptimized: bool, Flags: *const c_char, diff --git a/src/librustc_trans/debuginfo/metadata.rs b/src/librustc_trans/debuginfo/metadata.rs index 7578cc74dbf34..21279afb4106b 100644 --- a/src/librustc_trans/debuginfo/metadata.rs +++ b/src/librustc_trans/debuginfo/metadata.rs @@ -787,17 +787,20 @@ pub fn compile_unit_metadata(scc: &SharedCrateContext, (option_env!("CFG_VERSION")).expect("CFG_VERSION")); let compile_unit_name = compile_unit_name.as_ptr(); - let work_dir = path2cstr(&work_dir); - let producer = CString::new(producer).unwrap(); + let work_dir = path2cstr(&work_dir).as_ptr(); + let producer = CString::new(producer).unwrap().as_ptr(); let flags = "\0"; let split_name = "\0"; - return unsafe { - llvm::LLVMRustDIBuilderCreateCompileUnit( + + unsafe { + let file_metadata = llvm::LLVMRustDIBuilderCreateFile( + debug_context.builder, compile_unit_name, work_dir); + + return llvm::LLVMRustDIBuilderCreateCompileUnit( debug_context.builder, DW_LANG_RUST, - compile_unit_name, - work_dir.as_ptr(), - producer.as_ptr(), + file_metadata, + producer, sess.opts.optimize != config::OptLevel::No, flags.as_ptr() as *const _, 0, diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 27233a8b075af..4043273591189 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -474,11 +474,19 @@ extern "C" void LLVMRustDIBuilderFinalize(LLVMRustDIBuilderRef Builder) { } extern "C" LLVMRustMetadataRef LLVMRustDIBuilderCreateCompileUnit( - LLVMRustDIBuilderRef Builder, unsigned Lang, const char *File, - const char *Dir, const char *Producer, bool isOptimized, const char *Flags, + LLVMRustDIBuilderRef Builder, unsigned Lang, LLVMRustMetadataRef FileRef, + const char *Producer, bool isOptimized, const char *Flags, unsigned RuntimeVer, const char *SplitName) { - return wrap(Builder->createCompileUnit(Lang, File, Dir, Producer, isOptimized, + auto *File = unwrapDI(FileRef); + +#if LLVM_VERSION_GE(4, 0) + return wrap(Builder->createCompileUnit(Lang, File, Producer, isOptimized, Flags, RuntimeVer, SplitName)); +#else + return wrap(Builder->createCompileUnit(Lang, File->getFilename(), + File->getDirectory(), Producer, isOptimized, + Flags, RuntimeVer, SplitName)); +#endif } extern "C" LLVMRustMetadataRef From aebce5bd2aa9f75b09fc30638736e14761989fce Mon Sep 17 00:00:00 2001 From: Matt Ickstadt Date: Sat, 11 Feb 2017 15:41:03 -0600 Subject: [PATCH 2/2] Fix as_ptr() drop problem --- src/librustc_trans/debuginfo/metadata.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/librustc_trans/debuginfo/metadata.rs b/src/librustc_trans/debuginfo/metadata.rs index 21279afb4106b..c453d9bbd051f 100644 --- a/src/librustc_trans/debuginfo/metadata.rs +++ b/src/librustc_trans/debuginfo/metadata.rs @@ -787,20 +787,20 @@ pub fn compile_unit_metadata(scc: &SharedCrateContext, (option_env!("CFG_VERSION")).expect("CFG_VERSION")); let compile_unit_name = compile_unit_name.as_ptr(); - let work_dir = path2cstr(&work_dir).as_ptr(); - let producer = CString::new(producer).unwrap().as_ptr(); + let work_dir = path2cstr(&work_dir); + let producer = CString::new(producer).unwrap(); let flags = "\0"; let split_name = "\0"; unsafe { let file_metadata = llvm::LLVMRustDIBuilderCreateFile( - debug_context.builder, compile_unit_name, work_dir); + debug_context.builder, compile_unit_name, work_dir.as_ptr()); return llvm::LLVMRustDIBuilderCreateCompileUnit( debug_context.builder, DW_LANG_RUST, file_metadata, - producer, + producer.as_ptr(), sess.opts.optimize != config::OptLevel::No, flags.as_ptr() as *const _, 0,