aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaiki Tamura <tamaron1203@gmail.com>2023-08-18 13:00:47 +0900
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 19:04:30 +0100
commit52ad16ef37df3cb71a26dea759a3caefab17ae36 (patch)
tree514a075f7b89c3418d401dcb6728b8b94b528c59
parent5c339c29f9aa61a2bb0488ca2b3456b2e5c53480 (diff)
downloadgcc-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.cc2
-rw-r--r--gcc/rust/lex/rust-input-source.h3
-rw-r--r--gcc/rust/lex/rust-lex.cc2
-rw-r--r--gcc/rust/util/rust-attributes.cc19
-rw-r--r--gcc/rust/util/rust-codepoint.h4
-rw-r--r--gcc/rust/util/rust-punycode.cc2
-rw-r--r--gcc/rust/util/rust-unicode.cc10
-rw-r--r--gcc/rust/util/rust-unicode.h3
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