aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliushuyu <liushuyu011@gmail.com>2022-04-21 17:30:52 -0600
committerliushuyu <liushuyu011@gmail.com>2022-04-21 17:30:52 -0600
commit16730054de50fa613b86addd9cc4d737cfb7caf8 (patch)
treed2a171302353b371101bd97f7cff42d7e50072c0
parent243ef0dfe713a9fc8d4d80feb488a58b2639f39f (diff)
downloadgcc-16730054de50fa613b86addd9cc4d737cfb7caf8.zip
gcc-16730054de50fa613b86addd9cc4d737cfb7caf8.tar.gz
gcc-16730054de50fa613b86addd9cc4d737cfb7caf8.tar.bz2
backend: handle cold attribute
-rw-r--r--gcc/rust/backend/rust-compile-base.cc23
-rw-r--r--gcc/rust/backend/rust-compile-base.h3
-rw-r--r--gcc/rust/util/rust-attributes.cc15
-rw-r--r--gcc/testsuite/rust/compile/attr_cold.rs12
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
+}