about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-12-31 15:18:53 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-01-07 21:28:22 +0100
commit31aecccbcd8c043bfe249cfae9e7c6ef6ffd46fd (patch)
treebbe7bb082cbb0928b08073636c9068adbedd58b8 /src
parentc3ab84bb4f26d813c53336014ef08573a9d3018a (diff)
downloadrust-31aecccbcd8c043bfe249cfae9e7c6ef6ffd46fd.tar.gz
rust-31aecccbcd8c043bfe249cfae9e7c6ef6ffd46fd.zip
Auto-upgrade data layouts for X86 address spaces
This is similar to the autoupdate LLVM performs internally.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_codegen_llvm/context.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs
index f07601ed383..ad8aac3ea7f 100644
--- a/src/librustc_codegen_llvm/context.rs
+++ b/src/librustc_codegen_llvm/context.rs
@@ -143,6 +143,22 @@ fn strip_function_ptr_alignment(data_layout: String) -> String {
     data_layout.replace("-Fi8-", "-")
 }
 
+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,
@@ -156,6 +172,13 @@ 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 {
+            target_data_layout = strip_x86_address_spaces(target_data_layout);
+        } else {
+            target_data_layout = add_x86_address_spaces(target_data_layout);
+        }
+    }
 
     // Ensure the data-layout values hardcoded remain the defaults.
     if sess.target.target.options.is_builtin {