pub fn provide(providers: &mut Providers) {
providers.target_features_whitelist = |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
- Lrc::new(llvm_util::target_feature_whitelist(tcx.sess)
- .iter()
- .map(|c| c.to_string())
- .collect())
+ if tcx.sess.opts.actually_rustdoc {
+ // rustdoc needs to be able to document functions that use all the features, so
+ // whitelist them all
+ Lrc::new(llvm_util::all_known_features()
+ .map(|c| c.to_string())
+ .collect())
+ } else {
+ Lrc::new(llvm_util::target_feature_whitelist(tcx.sess)
+ .iter()
+ .map(|c| c.to_string())
+ .collect())
+ }
};
}
const MIPS_WHITELIST: &'static [&'static str] = &["fp64", "msa"];
+/// When rustdoc is running, provide a list of all known features so that all their respective
+/// primtives may be documented.
+///
+/// IMPORTANT: If you're adding another whitelist to the above lists, make sure to add it to this
+/// iterator!
+pub fn all_known_features() -> impl Iterator<Item=&'static str> {
+ ARM_WHITELIST.iter().cloned()
+ .chain(AARCH64_WHITELIST.iter().cloned())
+ .chain(X86_WHITELIST.iter().cloned())
+ .chain(HEXAGON_WHITELIST.iter().cloned())
+ .chain(POWERPC_WHITELIST.iter().cloned())
+ .chain(MIPS_WHITELIST.iter().cloned())
+}
+
pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
let arch = if sess.target.target.arch == "x86_64" {
"x86"