[gcc r14-7959] gccrs: Add check for no_mangle attribute

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:08:51 GMT 2024


https://gcc.gnu.org/g:52ad16ef37df3cb71a26dea759a3caefab17ae36

commit r14-7959-g52ad16ef37df3cb71a26dea759a3caefab17ae36
Author: Raiki Tamura <tamaron1203@gmail.com>
Date:   Fri Aug 18 13:00:47 2023 +0900

    gccrs: Add check for no_mangle attribute
    
    gcc/rust/ChangeLog:
    
            * lex/rust-input-source.h: Move constants from here...
            * util/rust-codepoint.h (struct Codepoint): ... to here
            * util/rust-attributes.cc (check_no_mangle_function): New function.
            (AttributeChecker::visit): Use it.
            * util/rust-unicode.cc (is_ascii_only): New function.
            * util/rust-unicode.h (is_ascii_only): Likewise.
            * backend/rust-mangle.cc (legacy_mangle_name): Use it.
            * util/rust-punycode.cc (extract_basic_string): Likewise.
            * lex/rust-lex.cc (Lexer::parse_byte_char): Likewise.
    
    Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>

Diff:
---
 gcc/rust/backend/rust-mangle.cc  |  2 +-
 gcc/rust/lex/rust-input-source.h |  3 ---
 gcc/rust/lex/rust-lex.cc         |  2 +-
 gcc/rust/util/rust-attributes.cc | 19 +++++++++++++++++++
 gcc/rust/util/rust-codepoint.h   |  4 ++++
 gcc/rust/util/rust-punycode.cc   |  2 +-
 gcc/rust/util/rust-unicode.cc    | 10 ++++++++++
 gcc/rust/util/rust-unicode.h     |  3 +++
 8 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/gcc/rust/backend/rust-mangle.cc b/gcc/rust/backend/rust-mangle.cc
index 248d69b72a7..6ca7e917f84 100644
--- a/gcc/rust/backend/rust-mangle.cc
+++ b/gcc/rust/backend/rust-mangle.cc
@@ -90,7 +90,7 @@ legacy_mangle_name (const std::string &name)
 	  i++;
 	  m = "..";
 	}
-      else if (c.value < 0x80)
+      else if (c.is_ascii ())
 	// ASCII
 	m.push_back (c.value);
       else
diff --git a/gcc/rust/lex/rust-input-source.h b/gcc/rust/lex/rust-input-source.h
index 32261a05cae..03bf43b5b3b 100644
--- a/gcc/rust/lex/rust-input-source.h
+++ b/gcc/rust/lex/rust-input-source.h
@@ -28,9 +28,6 @@ constexpr uint8_t UTF8_BOM1 = 0xEF;
 constexpr uint8_t UTF8_BOM2 = 0xBB;
 constexpr uint8_t UTF8_BOM3 = 0xBF;
 
-constexpr uint32_t MAX_ASCII_CODEPOINT = 0x7F;
-constexpr uint32_t CODEPOINT_INVALID = 0xFFFE;
-
 // Input source wrapper thing.
 class InputSource
 {
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc
index cd966dd8e5c..3883f2379fc 100644
--- a/gcc/rust/lex/rust-lex.cc
+++ b/gcc/rust/lex/rust-lex.cc
@@ -1734,7 +1734,7 @@ Lexer::parse_byte_char (location_t loc)
       // otherwise, get character from direct input character
       byte_char = current_char;
 
-      if (byte_char.value > 0x7f)
+      if (!byte_char.is_ascii ())
 	{
 	  rust_error_at (get_current_location (),
 			 "non-ASCII character in %<byte char%>");
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 33097a84e1f..5a91e9da90f 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -22,6 +22,7 @@
 #include "rust-ast.h"
 #include "rust-ast-full.h"
 #include "rust-diagnostics.h"
+#include "rust-unicode.h"
 
 namespace Rust {
 namespace Analysis {
@@ -612,6 +613,22 @@ AttributeChecker::visit (AST::UseDeclaration &declaration)
   check_proc_macro_non_function (declaration.get_outer_attrs ());
 }
 
+static void
+check_no_mangle_function (const AST::Attribute &attribute,
+			  const AST::Function &fun)
+{
+  if (attribute.has_attr_input ())
+    {
+      rust_error_at (attribute.get_locus (), ErrorCode::E0754,
+		     "malformed %<no_mangle%> attribute input");
+      rust_inform (attribute.get_locus (),
+		   "must be of the form: %<#[no_mangle]%>");
+    }
+  if (!is_ascii_only (fun.get_function_name ().as_string ()))
+    rust_error_at (fun.get_function_name ().get_locus (),
+		   "the %<#[no_mangle]%> attribute requires ASCII identifier");
+}
+
 void
 AttributeChecker::visit (AST::Function &fun)
 {
@@ -649,6 +666,8 @@ AttributeChecker::visit (AST::Function &fun)
 	{
 	  check_crate_type (name, attribute);
 	}
+      else if (result.name == "no_mangle")
+	check_no_mangle_function (attribute, fun);
     }
   fun.get_definition ()->accept_vis (*this);
 }
diff --git a/gcc/rust/util/rust-codepoint.h b/gcc/rust/util/rust-codepoint.h
index 755c8373383..a75e99e7c0c 100644
--- a/gcc/rust/util/rust-codepoint.h
+++ b/gcc/rust/util/rust-codepoint.h
@@ -23,6 +23,9 @@
 
 namespace Rust {
 
+constexpr uint32_t MAX_ASCII_CODEPOINT = 0x7F;
+constexpr uint32_t CODEPOINT_INVALID = 0xFFFE;
+
 // FIXME: move this to rust-unicode.h?
 struct Codepoint
 {
@@ -36,6 +39,7 @@ struct Codepoint
 
   static Codepoint eof () { return Codepoint (UINT32_MAX); }
   bool is_eof () const { return value == UINT32_MAX; }
+  bool is_ascii () const { return value <= MAX_ASCII_CODEPOINT; }
 
   // Returns a C++ string containing string value of codepoint.
   std::string as_string ();
diff --git a/gcc/rust/util/rust-punycode.cc b/gcc/rust/util/rust-punycode.cc
index 8da724cc65e..a9c8cbfc5fc 100644
--- a/gcc/rust/util/rust-punycode.cc
+++ b/gcc/rust/util/rust-punycode.cc
@@ -42,7 +42,7 @@ extract_basic_string (const std::vector<Codepoint> &src)
   std::string basic_string;
   for (auto c : src)
     {
-      if (c.value <= 0x7F)
+      if (c.is_ascii ())
 	basic_string += c.as_string ();
     }
   return basic_string;
diff --git a/gcc/rust/util/rust-unicode.cc b/gcc/rust/util/rust-unicode.cc
index 95653cb760d..999ecb042ca 100644
--- a/gcc/rust/util/rust-unicode.cc
+++ b/gcc/rust/util/rust-unicode.cc
@@ -16,6 +16,7 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#include "rust-input-source.h"
 #include "rust-system.h"
 #include "optional.h"
 #include "selftest.h"
@@ -328,6 +329,15 @@ is_numeric (uint32_t codepoint)
     return true;
 }
 
+bool
+is_ascii_only (const std::string &str)
+{
+  for (char c : str)
+    if (static_cast<uint32_t> (c) > MAX_ASCII_CODEPOINT)
+      return false;
+  return true;
+}
+
 } // namespace Rust
 
 #if CHECKING_P
diff --git a/gcc/rust/util/rust-unicode.h b/gcc/rust/util/rust-unicode.h
index becf6fb6a0c..2538436797f 100644
--- a/gcc/rust/util/rust-unicode.h
+++ b/gcc/rust/util/rust-unicode.h
@@ -62,6 +62,9 @@ public:
 bool
 is_alphabetic (uint32_t codepoint);
 
+bool
+is_ascii_only (const std::string &str);
+
 bool
 is_numeric (uint32_t codepoint);


More information about the Gcc-cvs mailing list