Skip to content

incr.comp.: Turn translation-related attributes into a query. #47320

Closed
@michaelwoerister

Description

@michaelwoerister

There are a few attributes, like #[inline], #[cold], and #[target_feature], that would profit from being turned into a query:

  • directly accessing the ast::Attribute will lead to a dependency edge to HIR which is brittle because of spans,
  • at least #[inline] is searched for a few times, so caching might be good.

The attributes in question are listed in trans::attributes::from_fn_attrs():

pub fn from_fn_attrs(ccx: &CrateContext, attrs: &[ast::Attribute], llfn: ValueRef) {
use syntax::attr::*;
inline(llfn, find_inline_attr(Some(ccx.sess().diagnostic()), attrs));
set_frame_pointer_elimination(ccx, llfn);
set_probestack(ccx, llfn);
let mut target_features = vec![];
for attr in attrs {
if attr.check_name("target_feature") {
if let Some(val) = attr.value_str() {
for feat in val.as_str().split(",").map(|f| f.trim()) {
if !feat.is_empty() && !feat.contains('\0') {
target_features.push(feat.to_string());
}
}
}
} else if attr.check_name("cold") {
Attribute::Cold.apply_llfn(Function, llfn);
} else if attr.check_name("naked") {
naked(llfn, true);
} else if attr.check_name("allocator") {
Attribute::NoAlias.apply_llfn(
llvm::AttributePlace::ReturnValue, llfn);
} else if attr.check_name("unwind") {
unwind(llfn, true);
} else if attr.check_name("rustc_allocator_nounwind") {
unwind(llfn, false);
}
}
if !target_features.is_empty() {
let val = CString::new(target_features.join(",")).unwrap();
llvm::AddFunctionAttrStringValue(
llfn, llvm::AttributePlace::Function,
cstr("target-features\0"), &val);
}
}

A query could return a TransFnAttrs value that looks like:

struct TransFnAttrs {
    inline: InlineAttr, // from syntax::attr
    flags: TransFnAttrFlags,
    target_features: Symbol,
}

bitflags! {
    pub struct TransFnAttrFlags: u8 {
        const COLD                      = 0b0000_0001;
        const ALLOCATOR                 = 0b0000_0010;
        const UNWIND                    = 0b0000_0100;
        const RUSTC_ALLOCATOR_NOUNWIND  = 0b0000_1000;
        const NAKED                     = 0b0001_0000;
    }
}

The syntax::attr::{find_inline_attr, requests_inline} should be replaced by this new query then.

The ultimate goal of this refactoring is to reduce the number of false positives during incr. comp. cache invalidation by providing a "firewall" between HIR and the compile_codegen_unit query.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-incr-compArea: Incremental compilationC-enhancementCategory: An issue proposing an enhancement or a PR with one.I-compiletimeIssue: Problems and improvements with respect to compile times.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions