diff options
author | Raiki Tamura <tamaron1203@gmail.com> | 2023-08-18 13:00:47 +0900 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:04:30 +0100 |
commit | 52ad16ef37df3cb71a26dea759a3caefab17ae36 (patch) | |
tree | 514a075f7b89c3418d401dcb6728b8b94b528c59 | |
parent | 5c339c29f9aa61a2bb0488ca2b3456b2e5c53480 (diff) | |
download | gcc-52ad16ef37df3cb71a26dea759a3caefab17ae36.zip gcc-52ad16ef37df3cb71a26dea759a3caefab17ae36.tar.gz gcc-52ad16ef37df3cb71a26dea759a3caefab17ae36.tar.bz2 |
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>
-rw-r--r-- | gcc/rust/backend/rust-mangle.cc | 2 | ||||
-rw-r--r-- | gcc/rust/lex/rust-input-source.h | 3 | ||||
-rw-r--r-- | gcc/rust/lex/rust-lex.cc | 2 | ||||
-rw-r--r-- | gcc/rust/util/rust-attributes.cc | 19 | ||||
-rw-r--r-- | gcc/rust/util/rust-codepoint.h | 4 | ||||
-rw-r--r-- | gcc/rust/util/rust-punycode.cc | 2 | ||||
-rw-r--r-- | gcc/rust/util/rust-unicode.cc | 10 | ||||
-rw-r--r-- | 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 248d69b..6ca7e91 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 32261a0..03bf43b 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 cd966dd..3883f23 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 33097a8..5a91e9d 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 755c837..a75e99e 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 8da724c..a9c8cbf 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 95653cb..999ecb0 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 becf6fb..2538436 100644 --- a/gcc/rust/util/rust-unicode.h +++ b/gcc/rust/util/rust-unicode.h @@ -63,6 +63,9 @@ bool is_alphabetic (uint32_t codepoint); bool +is_ascii_only (const std::string &str); + +bool is_numeric (uint32_t codepoint); } // namespace Rust |