@@ -2,8 +2,6 @@ use super::archive::LlvmArchiveBuilder;
22use super :: rpath:: RPathConfig ;
33use super :: rpath;
44use crate :: back:: wasm;
5- use crate :: context:: get_reloc_model;
6- use crate :: llvm;
75use rustc_codegen_ssa:: { METADATA_FILENAME , RLIB_BYTECODE_EXTENSION } ;
86use rustc_codegen_ssa:: back:: archive:: ArchiveBuilder ;
97use rustc_codegen_ssa:: back:: linker:: Linker ;
@@ -40,6 +38,7 @@ pub(crate) fn link_binary<'a>(sess: &'a Session,
4038 codegen_results : & CodegenResults ,
4139 outputs : & OutputFilenames ,
4240 crate_name : & str ) -> Vec < PathBuf > {
41+ let target_cpu = crate :: llvm_util:: target_cpu ( sess) ;
4342 let mut out_filenames = Vec :: new ( ) ;
4443 for & crate_type in sess. crate_types . borrow ( ) . iter ( ) {
4544 // Ignore executable crates if we have -Z no-codegen, as they will error.
@@ -58,7 +57,8 @@ pub(crate) fn link_binary<'a>(sess: &'a Session,
5857 codegen_results,
5958 crate_type,
6059 outputs,
61- crate_name) ;
60+ crate_name,
61+ target_cpu) ;
6262 out_filenames. extend ( out_files) ;
6363 }
6464
@@ -92,7 +92,8 @@ fn link_binary_output<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
9292 codegen_results : & CodegenResults ,
9393 crate_type : config:: CrateType ,
9494 outputs : & OutputFilenames ,
95- crate_name : & str ) -> Vec < PathBuf > {
95+ crate_name : & str ,
96+ target_cpu : & str ) -> Vec < PathBuf > {
9697 for obj in codegen_results. modules . iter ( ) . filter_map ( |m| m. object . as_ref ( ) ) {
9798 check_file_is_writeable ( obj, sess) ;
9899 }
@@ -134,7 +135,7 @@ fn link_binary_output<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
134135 link_staticlib :: < B > ( sess, codegen_results, & out_filename, & tmpdir) ;
135136 }
136137 _ => {
137- link_natively :: < B > ( sess, crate_type, & out_filename, codegen_results, tmpdir. path ( ) ) ;
138+ link_natively :: < B > ( sess, crate_type, & out_filename, codegen_results, tmpdir. path ( ) , target_cpu ) ;
138139 }
139140 }
140141 out_filenames. push ( out_filename) ;
@@ -167,11 +168,6 @@ fn emit_metadata<'a>(
167168 out_filename
168169}
169170
170- enum RlibFlavor {
171- Normal ,
172- StaticlibBase ,
173- }
174-
175171// Create an 'rlib'
176172//
177173// An rlib in its current incarnation is essentially a renamed .a file. The
@@ -354,7 +350,8 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
354350 crate_type : config:: CrateType ,
355351 out_filename : & Path ,
356352 codegen_results : & CodegenResults ,
357- tmpdir : & Path ) {
353+ tmpdir : & Path ,
354+ target_cpu : & str ) {
358355 info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
359356 let ( linker, flavor) = linker_and_flavor ( sess) ;
360357
@@ -407,7 +404,6 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
407404 }
408405
409406 {
410- let target_cpu = crate :: llvm_util:: target_cpu ( sess) ;
411407 let mut linker = codegen_results. linker_info . to_linker ( cmd, & sess, flavor, target_cpu) ;
412408 link_args :: < B > ( & mut * linker, flavor, sess, crate_type, tmpdir,
413409 out_filename, codegen_results) ;
@@ -663,8 +659,7 @@ fn link_args<'a, B: ArchiveBuilder<'a>>(cmd: &mut dyn Linker,
663659 let more_args = & sess. opts . cg . link_arg ;
664660 let mut args = args. iter ( ) . chain ( more_args. iter ( ) ) . chain ( used_link_args. iter ( ) ) ;
665661
666- if get_reloc_model ( sess) == llvm:: RelocMode :: PIC
667- && !sess. crt_static ( ) && !args. any ( |x| * x == "-static" ) {
662+ if is_pic ( sess) && !sess. crt_static ( ) && !args. any ( |x| * x == "-static" ) {
668663 position_independent_executable = true ;
669664 }
670665 }
@@ -1106,3 +1101,12 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>(cmd: &mut dyn Linker,
11061101 parent. unwrap_or ( Path :: new ( "" ) ) ) ;
11071102 }
11081103}
1104+
1105+ fn is_pic ( sess : & Session ) -> bool {
1106+ let reloc_model_arg = match sess. opts . cg . relocation_model {
1107+ Some ( ref s) => & s[ ..] ,
1108+ None => & sess. target . target . options . relocation_model [ ..] ,
1109+ } ;
1110+
1111+ reloc_model_arg == "pic"
1112+ }
0 commit comments