diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2020-04-23 00:46:45 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2020-04-26 11:18:47 +0300 |
| commit | fb91e5ed2fe72c6ce38abe0ec2ca47cbeac78d8d (patch) | |
| tree | c1079e34d3118a1cf9ee561296a1814253327fe1 /src/librustc_session | |
| parent | 019ab732ce63a117cbb446db1488916c5c0bd2a7 (diff) | |
rustc_target: Stop using "string typing" for relocation models
Introduce `enum RelocModel` instead.
Diffstat (limited to 'src/librustc_session')
| -rw-r--r-- | src/librustc_session/config.rs | 7 | ||||
| -rw-r--r-- | src/librustc_session/options.rs | 20 | ||||
| -rw-r--r-- | src/librustc_session/session.rs | 6 |
3 files changed, 21 insertions, 12 deletions
diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs index f6d7e091e00..1ab02f84c11 100644 --- a/src/librustc_session/config.rs +++ b/src/librustc_session/config.rs @@ -1311,10 +1311,6 @@ fn collect_print_requests( prints.push(PrintRequest::TargetFeatures); cg.target_feature = String::new(); } - if cg.relocation_model.as_ref().map_or(false, |s| s == "help") { - prints.push(PrintRequest::RelocationModels); - cg.relocation_model = None; - } if cg.code_model.as_ref().map_or(false, |s| s == "help") { prints.push(PrintRequest::CodeModels); cg.code_model = None; @@ -2005,7 +2001,7 @@ crate mod dep_tracking { use crate::utils::NativeLibraryKind; use rustc_feature::UnstableFeatures; use rustc_span::edition::Edition; - use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel, TargetTriple}; + use rustc_target::spec::{MergeFunctions, PanicStrategy, RelocModel, RelroLevel, TargetTriple}; use std::collections::hash_map::DefaultHasher; use std::collections::BTreeMap; use std::hash::Hash; @@ -2053,6 +2049,7 @@ crate mod dep_tracking { impl_dep_tracking_hash_via_hash!(Option<(String, u64)>); impl_dep_tracking_hash_via_hash!(Option<Vec<String>>); impl_dep_tracking_hash_via_hash!(Option<MergeFunctions>); + impl_dep_tracking_hash_via_hash!(Option<RelocModel>); impl_dep_tracking_hash_via_hash!(Option<PanicStrategy>); impl_dep_tracking_hash_via_hash!(Option<RelroLevel>); impl_dep_tracking_hash_via_hash!(Option<lint::Level>); diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs index 54b2f2fe470..804e929bc81 100644 --- a/src/librustc_session/options.rs +++ b/src/librustc_session/options.rs @@ -6,7 +6,7 @@ use crate::search_paths::SearchPath; use crate::utils::NativeLibraryKind; use rustc_target::spec::TargetTriple; -use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelroLevel}; +use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelocModel, RelroLevel}; use rustc_feature::UnstableFeatures; use rustc_span::edition::Edition; @@ -265,14 +265,13 @@ macro_rules! options { pub const parse_merge_functions: &str = "one of: `disabled`, `trampolines`, or `aliases`"; pub const parse_symbol_mangling_version: &str = "either `legacy` or `v0` (RFC 2603)"; pub const parse_src_file_hash: &str = "either `md5` or `sha1`"; + pub const parse_relocation_model: &str = + "one of supported relocation models (`rustc --print relocation-models`)"; } #[allow(dead_code)] mod $mod_set { - use super::{$struct_name, Passes, Sanitizer, LtoCli, LinkerPluginLto, SwitchWithOptPath, - SymbolManglingVersion, CFGuard, SourceFileHashAlgorithm}; - use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelroLevel}; - use std::path::PathBuf; + use super::*; use std::str::FromStr; // Sometimes different options need to build a common structure. @@ -598,6 +597,15 @@ macro_rules! options { true } + fn parse_relocation_model(slot: &mut Option<RelocModel>, v: Option<&str>) -> bool { + match v.and_then(|s| RelocModel::from_str(s).ok()) { + Some(relocation_model) => *slot = Some(relocation_model), + None if v == Some("default") => *slot = None, + _ => return false, + } + true + } + fn parse_symbol_mangling_version( slot: &mut SymbolManglingVersion, v: Option<&str>, @@ -697,7 +705,7 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, "compile the program with profiling instrumentation"), profile_use: Option<PathBuf> = (None, parse_opt_pathbuf, [TRACKED], "use the given `.profdata` file for profile-guided optimization"), - relocation_model: Option<String> = (None, parse_opt_string, [TRACKED], + relocation_model: Option<RelocModel> = (None, parse_relocation_model, [TRACKED], "choose the relocation model to use (`rustc --print relocation-models` for details)"), remark: Passes = (Passes::Some(Vec::new()), parse_passes, [UNTRACKED], "print remarks for these optimization passes (space separated, or \"all\")"), diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs index f0bbe1d0a18..226d9392095 100644 --- a/src/librustc_session/session.rs +++ b/src/librustc_session/session.rs @@ -22,7 +22,7 @@ use rustc_errors::{Applicability, DiagnosticBuilder, DiagnosticId, ErrorReported use rustc_span::edition::Edition; use rustc_span::source_map::{self, FileLoader, MultiSpan, RealFileLoader, SourceMap, Span}; use rustc_span::SourceFileHashAlgorithm; -use rustc_target::spec::{PanicStrategy, RelroLevel, Target, TargetTriple}; +use rustc_target::spec::{PanicStrategy, RelocModel, RelroLevel, Target, TargetTriple}; use std::cell::{self, RefCell}; use std::env; @@ -584,6 +584,10 @@ impl Session { } } + pub fn relocation_model(&self) -> RelocModel { + self.opts.cg.relocation_model.unwrap_or(self.target.target.options.relocation_model) + } + pub fn must_not_eliminate_frame_pointers(&self) -> bool { // "mcount" function relies on stack pointer. // See <https://sourceware.org/binutils/docs/gprof/Implementation.html>. |
