about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2019-03-20 17:22:16 +0100
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2019-03-20 17:22:16 +0100
commit4d0a1e418c8ba90adc9703b1adf735d6d134c2b4 (patch)
tree36c823bdfbb20758cadba8bca918de9cb5c666a6
parent52374a6462e225cdc4a0487b6c843ce72ab8551f (diff)
downloadrust-4d0a1e418c8ba90adc9703b1adf735d6d134c2b4.tar.gz
rust-4d0a1e418c8ba90adc9703b1adf735d6d134c2b4.zip
Add eval_always to query macro and move a query over
-rw-r--r--src/librustc/dep_graph/dep_node.rs1
-rw-r--r--src/librustc/query/mod.rs5
-rw-r--r--src/librustc/ty/query/config.rs6
-rw-r--r--src/librustc/ty/query/mod.rs5
-rw-r--r--src/librustc/ty/query/plumbing.rs1
-rw-r--r--src/librustc_macros/src/query.rs20
6 files changed, 25 insertions, 13 deletions
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs
index cdbd01620fb..4babadb67bc 100644
--- a/src/librustc/dep_graph/dep_node.rs
+++ b/src/librustc/dep_graph/dep_node.rs
@@ -564,7 +564,6 @@ rustc_dep_node_append!([define_dep_nodes!][ <'tcx>
     [] HasGlobalAllocator(CrateNum),
     [] HasPanicHandler(CrateNum),
     [input] ExternCrate(DefId),
-    [eval_always] LintLevels,
     [] Specializes { impl1: DefId, impl2: DefId },
     [input] InScopeTraits(DefIndex),
     [input] ModuleExports(DefId),
diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs
index b8c91f91934..8d64818f49b 100644
--- a/src/librustc/query/mod.rs
+++ b/src/librustc/query/mod.rs
@@ -55,6 +55,11 @@ rustc_queries! {
         query native_libraries(_: CrateNum) -> Lrc<Vec<NativeLibrary>> {
             desc { "looking up the native libraries of a linked crate" }
         }
+
+        query lint_levels(_: CrateNum) -> Lrc<lint::LintLevelMap> {
+            eval_always
+            desc { "computing the lint levels for items in this crate" }
+        }
     }
 
     Codegen {
diff --git a/src/librustc/ty/query/config.rs b/src/librustc/ty/query/config.rs
index 47ef09820b0..5cb5a0030f4 100644
--- a/src/librustc/ty/query/config.rs
+++ b/src/librustc/ty/query/config.rs
@@ -605,12 +605,6 @@ impl<'tcx> QueryDescription<'tcx> for queries::analysis<'tcx> {
     }
 }
 
-impl<'tcx> QueryDescription<'tcx> for queries::lint_levels<'tcx> {
-    fn describe(_tcx: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> {
-        "computing the lint levels for items in this crate".into()
-    }
-}
-
 impl<'tcx> QueryDescription<'tcx> for queries::specializes<'tcx> {
     fn describe(_tcx: TyCtxt<'_, '_, '_>, _: (DefId, DefId)) -> Cow<'static, str> {
         "computing whether impls specialize one another".into()
diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs
index 5eafb87592e..dbc81a4235d 100644
--- a/src/librustc/ty/query/mod.rs
+++ b/src/librustc/ty/query/mod.rs
@@ -415,7 +415,6 @@ rustc_query_append! { [define_queries!][ <'tcx>
 
     Other {
         [] fn module_exports: ModuleExports(DefId) -> Option<Lrc<Vec<Export>>>,
-        [] fn lint_levels: lint_levels_node(CrateNum) -> Lrc<lint::LintLevelMap>,
     },
 
     TypeChecking {
@@ -767,10 +766,6 @@ fn layout_dep_node<'tcx>(param_env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> DepConst
     DepConstructor::Layout { param_env }
 }
 
-fn lint_levels_node<'tcx>(_: CrateNum) -> DepConstructor<'tcx> {
-    DepConstructor::LintLevels
-}
-
 fn specializes_node<'tcx>((a, b): (DefId, DefId)) -> DepConstructor<'tcx> {
     DepConstructor::Specializes { impl1: a, impl2: b }
 }
diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs
index c364d15027d..adac19d3410 100644
--- a/src/librustc/ty/query/plumbing.rs
+++ b/src/librustc/ty/query/plumbing.rs
@@ -1332,7 +1332,6 @@ pub fn force_from_dep_node<'tcx>(
         DepKind::HasGlobalAllocator => { force!(has_global_allocator, krate!()); }
         DepKind::HasPanicHandler => { force!(has_panic_handler, krate!()); }
         DepKind::ExternCrate => { force!(extern_crate, def_id!()); }
-        DepKind::LintLevels => { force!(lint_levels, LOCAL_CRATE); }
         DepKind::InScopeTraits => { force!(in_scope_traits_map, def_id!().index); }
         DepKind::ModuleExports => { force!(module_exports, def_id!()); }
         DepKind::IsSanitizerRuntime => { force!(is_sanitizer_runtime, krate!()); }
diff --git a/src/librustc_macros/src/query.rs b/src/librustc_macros/src/query.rs
index fa5ab4737d8..0800579231f 100644
--- a/src/librustc_macros/src/query.rs
+++ b/src/librustc_macros/src/query.rs
@@ -51,6 +51,9 @@ enum QueryModifier {
 
     /// Generate a dep node based on the dependencies of the query
     Anon,
+
+    // Always evaluate the query, ignoring its depdendencies
+    EvalAlways,
 }
 
 impl Parse for QueryModifier {
@@ -104,6 +107,8 @@ impl Parse for QueryModifier {
             Ok(QueryModifier::NoForce)
         } else if modifier == "anon" {
             Ok(QueryModifier::Anon)
+        } else if modifier == "eval_always" {
+            Ok(QueryModifier::EvalAlways)
         } else {
             Err(Error::new(modifier.span(), "unknown query modifier"))
         }
@@ -210,6 +215,9 @@ struct QueryModifiers {
 
     /// Generate a dep node based on the dependencies of the query
     anon: bool,
+    
+    // Always evaluate the query, ignoring its depdendencies
+    eval_always: bool,
 }
 
 /// Process query modifiers into a struct, erroring on duplicates
@@ -221,6 +229,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
     let mut no_hash = false;
     let mut no_force = false;
     let mut anon = false;
+    let mut eval_always = false;
     for modifier in query.modifiers.0.drain(..) {
         match modifier {
             QueryModifier::LoadCached(tcx, id, block) => {
@@ -265,6 +274,12 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
                 }
                 anon = true;
             }
+            QueryModifier::EvalAlways => {
+                if eval_always {
+                    panic!("duplicate modifier `eval_always` for query `{}`", query.name);
+                }
+                eval_always = true;
+            }
         }
     }
     QueryModifiers {
@@ -275,6 +290,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
         no_hash,
         no_force,
         anon,
+        eval_always,
     }
 }
 
@@ -403,6 +419,10 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
             if modifiers.anon {
                 attributes.push(quote! { anon });
             };
+            // Pass on the eval_always modifier
+            if modifiers.eval_always {
+                attributes.push(quote! { eval_always });
+            };
 
             let mut attribute_stream = quote! {};
             for e in attributes.into_iter().intersperse(quote! {,}) {