diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs index f07601ed383fe..ad8aac3ea7f16 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 {