Support #[patchable_function_entries]
See [RFC](https://github.com/maurer/rust-rfcs/blob/patchable-function-entry/text/0000-patchable-function-entry.md) (yet to be numbered) TODO before submission: * Needs an RFC * Improve error reporting for malformed attributes
This commit is contained in:
parent
ac7595fdb1
commit
9b0ae75ecc
9 changed files with 83 additions and 4 deletions
|
@ -5,7 +5,9 @@ use rustc_hir as hir;
|
|||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::{lang_items, weak_lang_items::WEAK_LANG_ITEMS, LangItem};
|
||||
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
|
||||
use rustc_middle::middle::codegen_fn_attrs::{
|
||||
CodegenFnAttrFlags, CodegenFnAttrs, PatchableFunctionEntry,
|
||||
};
|
||||
use rustc_middle::mir::mono::Linkage;
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::ty::{self as ty, TyCtxt};
|
||||
|
@ -463,6 +465,28 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
|
|||
None
|
||||
};
|
||||
}
|
||||
sym::patchable_function_entry => {
|
||||
codegen_fn_attrs.patchable_function_entry = attr.meta_item_list().and_then(|l| {
|
||||
let mut prefix = 0;
|
||||
let mut entry = 0;
|
||||
for item in l {
|
||||
if let Some((sym, lit)) = item.name_value_literal() {
|
||||
let val = match lit.kind {
|
||||
// FIXME emit error if too many nops requested
|
||||
rustc_ast::LitKind::Int(i, _) => i as u8,
|
||||
_ => continue,
|
||||
};
|
||||
match sym {
|
||||
sym::prefix => prefix = val,
|
||||
sym::entry => entry = val,
|
||||
// FIXME possibly emit error here?
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(PatchableFunctionEntry::from_prefix_and_entry(prefix, entry))
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue