From 16730054de50fa613b86addd9cc4d737cfb7caf8 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Thu, 21 Apr 2022 17:30:52 -0600 Subject: [PATCH] backend: handle cold attribute --- gcc/rust/backend/rust-compile-base.cc | 23 +++++++++++++++++++++++ gcc/rust/backend/rust-compile-base.h | 3 +++ gcc/rust/util/rust-attributes.cc | 15 ++++++++++----- gcc/testsuite/rust/compile/attr_cold.rs | 12 ++++++++++++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/rust/compile/attr_cold.rs diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index 602fc56c353..f138cb12478 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -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 % does not accept any arguments"); +} + void HIRCompileBase::handle_inline_attribute_on_fndecl (tree fndecl, const AST::Attribute &attr) diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index c7f7f406ebd..68a3994450b 100644 --- a/gcc/rust/backend/rust-compile-base.h +++ b/gcc/rust/backend/rust-compile-base.h @@ -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); diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index b1211fe792c..106500d87e6 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -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 () diff --git a/gcc/testsuite/rust/compile/attr_cold.rs b/gcc/testsuite/rust/compile/attr_cold.rs new file mode 100644 index 00000000000..883d2f81932 --- /dev/null +++ b/gcc/testsuite/rust/compile/attr_cold.rs @@ -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 +}