Skip to content

Commit e22eeba

Browse files
committed
rustc_codegen_llvm: use safe references for PassManager.
1 parent 0ab3444 commit e22eeba

File tree

2 files changed

+65
-64
lines changed

2 files changed

+65
-64
lines changed

src/librustc_codegen_llvm/back/write.rs

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use rustc::session::config::{self, OutputFilenames, OutputType, Passes, SomePass
2525
use rustc::session::Session;
2626
use rustc::util::nodemap::FxHashMap;
2727
use time_graph::{self, TimeGraph, Timeline};
28-
use llvm::{self, DiagnosticInfo, PassManagerRef, SMDiagnostic};
28+
use llvm::{self, DiagnosticInfo, PassManager, SMDiagnostic};
2929
use {CodegenResults, ModuleSource, ModuleCodegen, CompiledModule, ModuleKind};
3030
use CrateInfo;
3131
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
@@ -92,9 +92,9 @@ pub fn llvm_err(handler: &errors::Handler, msg: String) -> FatalError {
9292

9393
pub fn write_output_file(
9494
handler: &errors::Handler,
95-
target: &llvm::TargetMachine,
96-
pm: llvm::PassManagerRef,
97-
m: &llvm::Module,
95+
target: &'ll llvm::TargetMachine,
96+
pm: &llvm::PassManager<'ll>,
97+
m: &'ll llvm::Module,
9898
output: &Path,
9999
file_type: llvm::FileType) -> Result<(), FatalError> {
100100
unsafe {
@@ -516,50 +516,52 @@ unsafe fn optimize(cgcx: &CodegenContext,
516516
let fpm = llvm::LLVMCreateFunctionPassManagerForModule(llmod);
517517
let mpm = llvm::LLVMCreatePassManager();
518518

519-
// If we're verifying or linting, add them to the function pass
520-
// manager.
521-
let addpass = |pass_name: &str| {
522-
let pass_name = CString::new(pass_name).unwrap();
523-
let pass = match llvm::LLVMRustFindAndCreatePass(pass_name.as_ptr()) {
524-
Some(pass) => pass,
525-
None => return false,
526-
};
527-
let pass_manager = match llvm::LLVMRustPassKind(pass) {
528-
llvm::PassKind::Function => fpm,
529-
llvm::PassKind::Module => mpm,
530-
llvm::PassKind::Other => {
531-
diag_handler.err("Encountered LLVM pass kind we can't handle");
532-
return true
533-
},
519+
{
520+
// If we're verifying or linting, add them to the function pass
521+
// manager.
522+
let addpass = |pass_name: &str| {
523+
let pass_name = CString::new(pass_name).unwrap();
524+
let pass = match llvm::LLVMRustFindAndCreatePass(pass_name.as_ptr()) {
525+
Some(pass) => pass,
526+
None => return false,
527+
};
528+
let pass_manager = match llvm::LLVMRustPassKind(pass) {
529+
llvm::PassKind::Function => &*fpm,
530+
llvm::PassKind::Module => &*mpm,
531+
llvm::PassKind::Other => {
532+
diag_handler.err("Encountered LLVM pass kind we can't handle");
533+
return true
534+
},
535+
};
536+
llvm::LLVMRustAddPass(pass_manager, pass);
537+
true
534538
};
535-
llvm::LLVMRustAddPass(pass_manager, pass);
536-
true
537-
};
538539

539-
if config.verify_llvm_ir { assert!(addpass("verify")); }
540-
if !config.no_prepopulate_passes {
541-
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
542-
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
543-
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenOptLevel::None);
544-
let prepare_for_thin_lto = cgcx.lto == Lto::Thin || cgcx.lto == Lto::ThinLocal;
545-
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| {
546-
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
547-
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
548-
})
549-
}
540+
if config.verify_llvm_ir { assert!(addpass("verify")); }
541+
if !config.no_prepopulate_passes {
542+
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
543+
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
544+
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenOptLevel::None);
545+
let prepare_for_thin_lto = cgcx.lto == Lto::Thin || cgcx.lto == Lto::ThinLocal;
546+
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| {
547+
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
548+
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
549+
})
550+
}
550551

551-
for pass in &config.passes {
552-
if !addpass(pass) {
553-
diag_handler.warn(&format!("unknown pass `{}`, ignoring",
554-
pass));
552+
for pass in &config.passes {
553+
if !addpass(pass) {
554+
diag_handler.warn(&format!("unknown pass `{}`, ignoring",
555+
pass));
556+
}
555557
}
556-
}
557558

558-
for pass in &cgcx.plugin_passes {
559-
if !addpass(pass) {
560-
diag_handler.err(&format!("a plugin asked for LLVM pass \
561-
`{}` but LLVM does not \
562-
recognize it", pass));
559+
for pass in &cgcx.plugin_passes {
560+
if !addpass(pass) {
561+
diag_handler.err(&format!("a plugin asked for LLVM pass \
562+
`{}` but LLVM does not \
563+
recognize it", pass));
564+
}
563565
}
564566
}
565567

@@ -636,11 +638,11 @@ unsafe fn codegen(cgcx: &CodegenContext,
636638
// pass manager passed to the closure should be ensured to not
637639
// escape the closure itself, and the manager should only be
638640
// used once.
639-
unsafe fn with_codegen<F, R>(tm: &llvm::TargetMachine,
640-
llmod: &llvm::Module,
641+
unsafe fn with_codegen<'ll, F, R>(tm: &'ll llvm::TargetMachine,
642+
llmod: &'ll llvm::Module,
641643
no_builtins: bool,
642644
f: F) -> R
643-
where F: FnOnce(PassManagerRef) -> R,
645+
where F: FnOnce(&'ll mut PassManager<'ll>) -> R,
644646
{
645647
let cpm = llvm::LLVMCreatePassManager();
646648
llvm::LLVMRustAddAnalysisPasses(tm, cpm, llmod);

src/librustc_codegen_llvm/llvm/ffi.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,7 @@ extern { pub type Metadata; }
397397
extern { pub type BasicBlock; }
398398
extern { pub type Builder; }
399399
extern { pub type MemoryBuffer; }
400-
extern { pub type PassManager; }
401-
pub type PassManagerRef = *mut PassManager;
400+
pub struct PassManager<'a>(InvariantOpaque<'a>);
402401
extern { pub type PassManagerBuilder; }
403402
extern { pub type ObjectFile; }
404403
extern { pub type SectionIterator; }
@@ -1105,16 +1104,16 @@ extern "C" {
11051104
pub fn LLVMWriteBitcodeToFile(M: &Module, Path: *const c_char) -> c_int;
11061105

11071106
/// Creates a pass manager.
1108-
pub fn LLVMCreatePassManager() -> PassManagerRef;
1107+
pub fn LLVMCreatePassManager() -> &'a mut PassManager<'a>;
11091108

11101109
/// Creates a function-by-function pass manager
1111-
pub fn LLVMCreateFunctionPassManagerForModule(M: &Module) -> PassManagerRef;
1110+
pub fn LLVMCreateFunctionPassManagerForModule(M: &'a Module) -> &'a mut PassManager<'a>;
11121111

11131112
/// Disposes a pass manager.
1114-
pub fn LLVMDisposePassManager(PM: PassManagerRef);
1113+
pub fn LLVMDisposePassManager(PM: &'a mut PassManager<'a>);
11151114

11161115
/// Runs a pass manager on a module.
1117-
pub fn LLVMRunPassManager(PM: PassManagerRef, M: &Module) -> Bool;
1116+
pub fn LLVMRunPassManager(PM: &PassManager<'a>, M: &'a Module) -> Bool;
11181117

11191118
pub fn LLVMInitializePasses();
11201119

@@ -1125,17 +1124,17 @@ extern "C" {
11251124
pub fn LLVMPassManagerBuilderUseInlinerWithThreshold(PMB: &PassManagerBuilder,
11261125
threshold: c_uint);
11271126
pub fn LLVMPassManagerBuilderPopulateModulePassManager(PMB: &PassManagerBuilder,
1128-
PM: PassManagerRef);
1127+
PM: &PassManager);
11291128

11301129
pub fn LLVMPassManagerBuilderPopulateFunctionPassManager(PMB: &PassManagerBuilder,
1131-
PM: PassManagerRef);
1130+
PM: &PassManager);
11321131
pub fn LLVMPassManagerBuilderPopulateLTOPassManager(PMB: &PassManagerBuilder,
1133-
PM: PassManagerRef,
1132+
PM: &PassManager,
11341133
Internalize: Bool,
11351134
RunInliner: Bool);
11361135
pub fn LLVMRustPassManagerBuilderPopulateThinLTOPassManager(
11371136
PMB: &PassManagerBuilder,
1138-
PM: PassManagerRef) -> bool;
1137+
PM: &PassManager) -> bool;
11391138

11401139
// Stuff that's in rustllvm/ because it's not upstream yet.
11411140

@@ -1416,7 +1415,7 @@ extern "C" {
14161415

14171416
pub fn LLVMRustPassKind(Pass: &Pass) -> PassKind;
14181417
pub fn LLVMRustFindAndCreatePass(Pass: *const c_char) -> Option<&'static mut Pass>;
1419-
pub fn LLVMRustAddPass(PM: PassManagerRef, Pass: &'static mut Pass);
1418+
pub fn LLVMRustAddPass(PM: &PassManager, Pass: &'static mut Pass);
14201419

14211420
pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
14221421

@@ -1437,7 +1436,7 @@ extern "C" {
14371436
Singlethread: bool)
14381437
-> Option<&'static mut TargetMachine>;
14391438
pub fn LLVMRustDisposeTargetMachine(T: &'static mut TargetMachine);
1440-
pub fn LLVMRustAddAnalysisPasses(T: &TargetMachine, PM: PassManagerRef, M: &Module);
1439+
pub fn LLVMRustAddAnalysisPasses(T: &'a TargetMachine, PM: &PassManager<'a>, M: &'a Module);
14411440
pub fn LLVMRustAddBuilderLibraryInfo(PMB: &'a PassManagerBuilder,
14421441
M: &'a Module,
14431442
DisableSimplifyLibCalls: bool);
@@ -1449,18 +1448,18 @@ extern "C" {
14491448
PrepareForThinLTO: bool,
14501449
PGOGenPath: *const c_char,
14511450
PGOUsePath: *const c_char);
1452-
pub fn LLVMRustAddLibraryInfo(PM: PassManagerRef,
1453-
M: &Module,
1451+
pub fn LLVMRustAddLibraryInfo(PM: &PassManager<'a>,
1452+
M: &'a Module,
14541453
DisableSimplifyLibCalls: bool);
1455-
pub fn LLVMRustRunFunctionPassManager(PM: PassManagerRef, M: &Module);
1454+
pub fn LLVMRustRunFunctionPassManager(PM: &PassManager<'a>, M: &'a Module);
14561455
pub fn LLVMRustWriteOutputFile(T: &'a TargetMachine,
1457-
PM: PassManagerRef,
1456+
PM: &PassManager<'a>,
14581457
M: &'a Module,
14591458
Output: *const c_char,
14601459
FileType: FileType)
14611460
-> LLVMRustResult;
1462-
pub fn LLVMRustPrintModule(PM: PassManagerRef,
1463-
M: &Module,
1461+
pub fn LLVMRustPrintModule(PM: &PassManager<'a>,
1462+
M: &'a Module,
14641463
Output: *const c_char,
14651464
Demangle: extern fn(*const c_char,
14661465
size_t,

0 commit comments

Comments
 (0)