diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-04-22 10:34:59 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-22 10:34:59 +0000 |
commit | d541ded4855d0b4273a986b15ff497c45dbc6c78 (patch) | |
tree | 66ef63953ffe52d74cfa1825bcf1606bf8227e51 | |
parent | 75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7 (diff) | |
parent | 16730054de50fa613b86addd9cc4d737cfb7caf8 (diff) | |
download | gcc-d541ded4855d0b4273a986b15ff497c45dbc6c78.zip gcc-d541ded4855d0b4273a986b15ff497c45dbc6c78.tar.gz gcc-d541ded4855d0b4273a986b15ff497c45dbc6c78.tar.bz2 |
Merge #1148
1148: backend: handle cold attribute r=philberty a=liushuyu
- handle the `cold` attribute
Co-authored-by: liushuyu <liushuyu011@gmail.com>
-rw-r--r-- | gcc/rust/backend/rust-compile-base.cc | 23 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-base.h | 3 | ||||
-rw-r--r-- | gcc/rust/util/rust-attributes.cc | 15 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/attr_cold.rs | 12 |
4 files changed, 48 insertions, 5 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index 602fc56..f138cb1 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,7 +64,29 @@ 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 diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index c7f7f40..68a3994 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 b1211fe..106500d 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 0000000..883d2f8 --- /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 +} |