]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_codegen_llvm/context.rs
Auto merge of #67429 - mati865:mingw-ultimate-fix, r=alexcrichton
[rust.git] / src / librustc_codegen_llvm / context.rs
index ad8aac3ea7f169c9878edfc2db23d53c992cfa05..6b31f14410d2f23630aa2b72a8afbb124c2e0e78 100644 (file)
@@ -12,7 +12,7 @@
 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,
@@ -147,18 +147,6 @@ fn strip_x86_address_spaces(data_layout: String) -> String {
     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,
@@ -172,11 +160,9 @@ pub unsafe fn create_module(
     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);
         }
     }
 
@@ -241,6 +227,16 @@ pub unsafe fn create_module(
         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
 }