From 841a186346f8e37871d978d76f60a4102d4cfc0f Mon Sep 17 00:00:00 2001 From: LoveSy Date: Mon, 10 Jun 2024 18:56:40 +0800 Subject: [PATCH] Fix corrupted .riscv.attributes ISA string (#1276) Fix corrupted .riscv.attributes ISA string extension name can contain digits --- elf/arch-riscv.cc | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/elf/arch-riscv.cc b/elf/arch-riscv.cc index caaf767328..eb7a88d7c9 100644 --- a/elf/arch-riscv.cc +++ b/elf/arch-riscv.cc @@ -1250,7 +1250,7 @@ static bool extn_version_less(const Extn &e1, const Extn &e2) { static std::optional read_extn_string(std::string_view &str) { auto flags = std::regex_constants::optimize | std::regex_constants::ECMAScript; - static std::regex re(R"(^([a-z]+)(\d+)p(\d+))", flags); + static std::regex re(R"(^([a-z]|[a-z][a-z0-9]*[a-z])(\d+)p(\d+))", flags); std::cmatch m; if (std::regex_search(str.data(), str.data() + str.size(), m, re)) { @@ -1261,21 +1261,14 @@ static std::optional read_extn_string(std::string_view &str) { } static std::vector parse_arch_string(std::string_view str) { - if (str.size() < 5) - return {}; - - // Parse the base part - std::string_view base = str.substr(0, 5); - if (base != "rv32i" && base != "rv32e" && base != "rv64i" && base != "rv64e") - return {}; - str = str.substr(4); - std::optional extn = read_extn_string(str); if (!extn) return {}; + auto &base = extn->name; + if (base != "rv32i" && base != "rv32e" && base != "rv64i" && base != "rv64e") + return {}; std::vector vec; - extn->name = base; vec.push_back(*extn); // Parse extensions