[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