aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliushuyu <liushuyu011@gmail.com>2022-04-21 18:21:10 -0600
committerliushuyu <liushuyu011@gmail.com>2022-06-28 17:22:56 -0600
commit04cc46cfe8cad9736ccf2d5c884af50e57b67ce6 (patch)
tree5af977f854130cdbb443e4819841d3aa634fed1d
parent65a06a817585faf7fb44fbc1c71173a00f9a407f (diff)
downloadgcc-04cc46cfe8cad9736ccf2d5c884af50e57b67ce6.zip
gcc-04cc46cfe8cad9736ccf2d5c884af50e57b67ce6.tar.gz
gcc-04cc46cfe8cad9736ccf2d5c884af50e57b67ce6.tar.bz2
backend: handle deprecated attribute
Signed-off-by: Zixing Liu <liushuyu011@gmail.com>
-rw-r--r--gcc/rust/ast/rust-ast-full-test.cc9
-rw-r--r--gcc/rust/ast/rust-ast.h2
-rw-r--r--gcc/rust/ast/rust-macro.h8
-rw-r--r--gcc/rust/backend/rust-compile-base.cc68
-rw-r--r--gcc/rust/backend/rust-compile-base.h3
-rw-r--r--gcc/rust/util/rust-attributes.cc1
6 files changed, 89 insertions, 2 deletions
diff --git a/gcc/rust/ast/rust-ast-full-test.cc b/gcc/rust/ast/rust-ast-full-test.cc
index 0d4d36b..8179113 100644
--- a/gcc/rust/ast/rust-ast-full-test.cc
+++ b/gcc/rust/ast/rust-ast-full-test.cc
@@ -20,10 +20,12 @@ along with GCC; see the file COPYING3. If not see
// FIXME: This does not work on Windows
#include <string>
#include <unistd.h>
+#include <memory>
#include "rust-ast-full.h"
#include "rust-diagnostics.h"
#include "rust-ast-visitor.h"
+#include "rust-macro.h"
#include "rust-session-manager.h"
#include "rust-lex.h"
#include "rust-parse.h"
@@ -3862,7 +3864,12 @@ MetaItemInner::~MetaItemInner () = default;
std::unique_ptr<MetaNameValueStr>
MetaItemInner::to_meta_name_value_str () const
{
- // TODO parse foo = bar
+ if (is_key_value_pair ())
+ {
+ auto converted_item = static_cast<const MetaNameValueStr *> (this);
+ return converted_item->to_meta_name_value_str ();
+ }
+ // TODO actually parse foo = bar
return nullptr;
}
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index 76324dc..51fe3c4 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -645,6 +645,8 @@ public:
virtual Attribute to_attribute () const { return Attribute::create_empty (); }
virtual bool check_cfg_predicate (const Session &session) const = 0;
+
+ virtual bool is_key_value_pair () const { return false; }
};
// Container used to store MetaItems as AttrInput (bridge-ish kinda thing)
diff --git a/gcc/rust/ast/rust-macro.h b/gcc/rust/ast/rust-macro.h
index 1bf8912..ce515db 100644
--- a/gcc/rust/ast/rust-macro.h
+++ b/gcc/rust/ast/rust-macro.h
@@ -21,6 +21,7 @@
#include "rust-ast.h"
#include "rust-location.h"
+#include <string>
namespace Rust {
namespace AST {
@@ -816,6 +817,13 @@ public:
Attribute to_attribute () const override;
+ inline std::pair<Identifier, std::string> get_name_value_pair () const
+ {
+ return std::pair<Identifier, std::string> (ident, str);
+ }
+
+ bool is_key_value_pair () const override { return true; }
+
protected:
// Use covariance to implement clone function as returning this type
MetaNameValueStr *clone_meta_item_inner_impl () const override
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 8fa3fa1..335a6d4 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -22,7 +22,8 @@
#include "rust-compile-fnparam.h"
#include "rust-compile-var-decl.h"
-#include "rust-expr.h" // for AST::AttrInputLiteral
+#include "rust-expr.h" // for AST::AttrInputLiteral
+#include "rust-macro.h" // for AST::MetaNameValueStr
#include "fold-const.h"
#include "stringpool.h"
@@ -66,6 +67,9 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point,
bool is_link_section
= attr.get_path ().as_string ().compare ("link_section") == 0;
bool no_mangle = attr.get_path ().as_string ().compare ("no_mangle") == 0;
+ bool is_deprecated
+ = attr.get_path ().as_string ().compare ("deprecated") == 0;
+
if (is_inline)
{
handle_inline_attribute_on_fndecl (fndecl, attr);
@@ -82,6 +86,10 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point,
{
handle_link_section_attribute_on_fndecl (fndecl, attr);
}
+ else if (is_deprecated)
+ {
+ handle_deprecated_attribute_on_fndecl (fndecl, attr);
+ }
else if (no_mangle)
{
handle_no_mangle_attribute_on_fndecl (fndecl, attr);
@@ -148,6 +156,64 @@ HIRCompileBase::handle_no_mangle_attribute_on_fndecl (
}
void
+HIRCompileBase::handle_deprecated_attribute_on_fndecl (
+ tree fndecl, const AST::Attribute &attr)
+{
+ tree value = NULL_TREE;
+ TREE_DEPRECATED (fndecl) = 1;
+
+ // simple #[deprecated]
+ if (!attr.has_attr_input ())
+ return;
+
+ const AST::AttrInput &input = attr.get_attr_input ();
+ auto input_type = input.get_attr_input_type ();
+
+ if (input_type == AST::AttrInput::AttrInputType::LITERAL)
+ {
+ // handle #[deprecated = "message"]
+ auto &literal
+ = static_cast<AST::AttrInputLiteral &> (attr.get_attr_input ());
+ const auto &msg_str = literal.get_literal ().as_string ();
+ value = build_string (msg_str.size (), msg_str.c_str ());
+ }
+ else if (input_type == AST::AttrInput::AttrInputType::TOKEN_TREE)
+ {
+ // handle #[deprecated(since = "...", note = "...")]
+ const auto &option = static_cast<const AST::DelimTokenTree &> (input);
+ AST::AttrInputMetaItemContainer *meta_item = option.parse_to_meta_item ();
+ for (const auto &item : meta_item->get_items ())
+ {
+ auto converted_item = item->to_meta_name_value_str ();
+ if (!converted_item)
+ continue;
+ auto key_value = converted_item->get_name_value_pair ();
+ if (key_value.first.compare ("since") == 0)
+ {
+ // valid, but this is handled by Cargo and some third-party audit
+ // tools
+ continue;
+ }
+ else if (key_value.first.compare ("note") == 0)
+ {
+ const auto &msg_str = key_value.second;
+ if (value)
+ rust_error_at (attr.get_locus (), "multiple %<note%> items");
+ value = build_string (msg_str.size (), msg_str.c_str ());
+ }
+ else
+ {
+ rust_error_at (attr.get_locus (), "unknown meta item %qs",
+ key_value.first.c_str ());
+ }
+ }
+ }
+
+ DECL_ATTRIBUTES (fndecl) = tree_cons (get_identifier ("deprecated"), value,
+ DECL_ATTRIBUTES (fndecl));
+}
+
+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 52e0568..f993d06 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -92,6 +92,9 @@ protected:
static void
handle_link_section_attribute_on_fndecl (tree fndecl,
const AST::Attribute &attr);
+ static void
+ handle_deprecated_attribute_on_fndecl (tree fndecl,
+ const AST::Attribute &attr);
static void handle_no_mangle_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 c36d462..870ca21 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -27,6 +27,7 @@ static const BuiltinAttrDefinition __definitions[] = {
{"cold", CODE_GENERATION},
{"cfg", EXPANSION},
{"cfg_attr", EXPANSION},
+ {"deprecated", STATIC_ANALYSIS},
{"allow", STATIC_ANALYSIS},
{"doc", HIR_LOWERING},
{"must_use", STATIC_ANALYSIS},