Merge #1148
1148: backend: handle cold attribute r=philberty a=liushuyu - handle the `cold` attribute Co-authored-by: liushuyu <liushuyu011@gmail.com>
This commit is contained in:
commit
d541ded485
|
@ -55,6 +55,7 @@ HIRCompileBase::setup_attributes_on_fndecl (
|
|||
bool is_inline = attr.get_path ().as_string ().compare ("inline") == 0;
|
||||
bool is_must_use
|
||||
= attr.get_path ().as_string ().compare ("must_use") == 0;
|
||||
bool is_cold = attr.get_path ().as_string ().compare ("cold") == 0;
|
||||
if (is_inline)
|
||||
{
|
||||
handle_inline_attribute_on_fndecl (fndecl, attr);
|
||||
|
@ -63,9 +64,31 @@ HIRCompileBase::setup_attributes_on_fndecl (
|
|||
{
|
||||
handle_must_use_attribute_on_fndecl (fndecl, attr);
|
||||
}
|
||||
else if (is_cold)
|
||||
{
|
||||
handle_cold_attribute_on_fndecl (fndecl, attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HIRCompileBase::handle_cold_attribute_on_fndecl (tree fndecl,
|
||||
const AST::Attribute &attr)
|
||||
{
|
||||
// simple #[cold]
|
||||
if (!attr.has_attr_input ())
|
||||
{
|
||||
tree cold = get_identifier ("cold");
|
||||
// this will get handled by the GCC backend later
|
||||
DECL_ATTRIBUTES (fndecl)
|
||||
= tree_cons (cold, NULL_TREE, DECL_ATTRIBUTES (fndecl));
|
||||
return;
|
||||
}
|
||||
|
||||
rust_error_at (attr.get_locus (),
|
||||
"attribute %<cold%> does not accept any arguments");
|
||||
}
|
||||
|
||||
void
|
||||
HIRCompileBase::handle_inline_attribute_on_fndecl (tree fndecl,
|
||||
const AST::Attribute &attr)
|
||||
|
|
|
@ -82,6 +82,9 @@ protected:
|
|||
static void handle_inline_attribute_on_fndecl (tree fndecl,
|
||||
const AST::Attribute &attr);
|
||||
|
||||
static void handle_cold_attribute_on_fndecl (tree fndecl,
|
||||
const AST::Attribute &attr);
|
||||
|
||||
static void handle_must_use_attribute_on_fndecl (tree fndecl,
|
||||
const AST::Attribute &attr);
|
||||
|
||||
|
|
|
@ -22,11 +22,16 @@ namespace Rust {
|
|||
namespace Analysis {
|
||||
|
||||
// https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_feature/builtin_attrs.rs.html#248
|
||||
static const BuiltinAttrDefinition __definitions[]
|
||||
= {{"inline", CODE_GENERATION}, {"cfg", EXPANSION},
|
||||
{"cfg_attr", EXPANSION}, {"allow", STATIC_ANALYSIS},
|
||||
{"doc", HIR_LOWERING}, {"lang", HIR_LOWERING},
|
||||
{"must_use", STATIC_ANALYSIS}};
|
||||
static const BuiltinAttrDefinition __definitions[] = {
|
||||
{"inline", CODE_GENERATION},
|
||||
{"cold", CODE_GENERATION},
|
||||
{"cfg", EXPANSION},
|
||||
{"cfg_attr", EXPANSION},
|
||||
{"allow", STATIC_ANALYSIS},
|
||||
{"doc", HIR_LOWERING},
|
||||
{"must_use", STATIC_ANALYSIS},
|
||||
{"lang", HIR_LOWERING},
|
||||
};
|
||||
|
||||
BuiltinAttributeMappings *
|
||||
BuiltinAttributeMappings::get ()
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// { dg-additional-options "-fdump-tree-gimple }
|
||||
#[cold]
|
||||
fn cold_function() -> i32 {
|
||||
42
|
||||
}
|
||||
|
||||
fn main() -> i32 {
|
||||
// { dg-final { scan-tree-dump-times {__attribute__((cdecl, cold))} 1 gimple } }
|
||||
cold_function();
|
||||
|
||||
0
|
||||
}
|
Loading…
Reference in New Issue