diff options
| author | Wesley Wiser <wesleywiser@microsoft.com> | 2023-11-29 17:36:45 -0600 |
|---|---|---|
| committer | Wesley Wiser <wesleywiser@microsoft.com> | 2023-11-29 18:12:53 -0600 |
| commit | 3323e4dc04e57cc64ac77dbff2f6bf50ac6832f0 (patch) | |
| tree | 3bcf11e952225605edf37ce26f273fd28b6c9cdc /compiler/rustc_codegen_llvm/src/back | |
| parent | b10cfcd65fd7f7b1ab9beb34798b2108de003452 (diff) | |
| download | rust-3323e4dc04e57cc64ac77dbff2f6bf50ac6832f0.tar.gz rust-3323e4dc04e57cc64ac77dbff2f6bf50ac6832f0.zip | |
Dispose llvm::TargetMachines prior to llvm::Context being disposed
If the TargetMachine is disposed after the Context is disposed, it can lead to use after frees in some cases. I've observed this happening occasionally on code compiled for aarch64-pc-windows-msvc using `-Zstack-protector=strong` but other users have reported AVs from host aarch64-pc-windows-msvc compilers as well.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/back')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/back/lto.rs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_llvm/src/back/lto.rs b/compiler/rustc_codegen_llvm/src/back/lto.rs index 8655aeec13d..db297425b03 100644 --- a/compiler/rustc_codegen_llvm/src/back/lto.rs +++ b/compiler/rustc_codegen_llvm/src/back/lto.rs @@ -25,6 +25,7 @@ use std::ffi::{CStr, CString}; use std::fs::File; use std::io; use std::iter; +use std::mem::ManuallyDrop; use std::path::Path; use std::slice; use std::sync::Arc; @@ -734,7 +735,7 @@ pub unsafe fn optimize_thin_module( let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names); let llmod_raw = parse_module(llcx, module_name, thin_module.data(), &diag_handler)? as *const _; let mut module = ModuleCodegen { - module_llvm: ModuleLlvm { llmod_raw, llcx, tm }, + module_llvm: ModuleLlvm { llmod_raw, llcx, tm: ManuallyDrop::new(tm) }, name: thin_module.name().to_string(), kind: ModuleKind::Regular, }; |
