use crate::callee::get_fn;
use rustc::bug;
use rustc::mir::mono::CodegenUnit;
-use rustc::session::config::{self, DebugInfo};
+use rustc::session::config::{self, CFGuard, DebugInfo};
use rustc::session::Session;
use rustc::ty::layout::{
FnAbiExt, HasParamEnv, LayoutError, LayoutOf, PointeeInfo, Size, TyLayout, VariantIdx,
data_layout.replace("-p270:32:32-p271:32:32-p272:64:64-", "-")
}
-fn add_x86_address_spaces(mut data_layout: String) -> String {
- let address_spaces = "-p270:32:32-p271:32:32-p272:64:64";
- if !data_layout.contains(address_spaces) && data_layout.starts_with("e-m:") {
- let mut insert_pos = "e-m:?".len();
- if data_layout[insert_pos..].starts_with("-p:32:32") {
- insert_pos += "-p:32:32".len();
- }
- data_layout.insert_str(insert_pos, address_spaces);
- }
- data_layout
-}
-
pub unsafe fn create_module(
tcx: TyCtxt<'_>,
llcx: &'ll llvm::Context,
if llvm_util::get_major_version() < 9 {
target_data_layout = strip_function_ptr_alignment(target_data_layout);
}
- if sess.target.target.arch == "x86" || sess.target.target.arch == "x86_64" {
- if llvm_util::get_major_version() < 10 {
+ if llvm_util::get_major_version() < 10 {
+ if sess.target.target.arch == "x86" || sess.target.target.arch == "x86_64" {
target_data_layout = strip_x86_address_spaces(target_data_layout);
- } else {
- target_data_layout = add_x86_address_spaces(target_data_layout);
}
}
llvm::LLVMRustAddModuleFlag(llmod, avoid_plt, 1);
}
+ // Set module flags to enable Windows Control Flow Guard (/guard:cf) metadata
+ // only (`cfguard=1`) or metadata and checks (`cfguard=2`).
+ match sess.opts.debugging_opts.control_flow_guard {
+ CFGuard::Disabled => {}
+ CFGuard::NoChecks => {
+ llvm::LLVMRustAddModuleFlag(llmod, "cfguard\0".as_ptr() as *const _, 1)
+ }
+ CFGuard::Checks => llvm::LLVMRustAddModuleFlag(llmod, "cfguard\0".as_ptr() as *const _, 2),
+ }
+
llmod
}