From 731948a769745dc092a168c3f793ace0cec92df4 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 18 Jul 2025 20:43:02 +0100 Subject: [PATCH] preproc: Support __attribute__ in enums (#7344) --- tools/preproc/asm_file.cpp | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 66667935a1..60296fa943 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -517,8 +517,53 @@ bool AsmFile::ParseEnum() long fallbackPosition = m_pos; std::string headerFilename = ""; - long currentHeaderLine = SkipWhitespaceAndEol(); - std::string enumName = ReadIdentifier(); + long currentHeaderLine = 0; + std::string enumName; + while (true) + { + currentHeaderLine += SkipWhitespaceAndEol(); + std::string identifier = ReadIdentifier(); + if (identifier == "__attribute__") + { + if (m_pos + 1 >= m_size + || m_buffer[m_pos] != '(' + || m_buffer[m_pos + 1] != '(') + { + m_pos = fallbackPosition - 4; + return false; + } + + m_pos += 2; + int parens = 2; + while (true) + { + char c = m_buffer[m_pos++]; + if (c == '\n') + currentHeaderLine++; + + if (c == '(') + { + parens++; + } + else if (c == ')') + { + parens--; + if (parens == 0) + break; + } + else if (parens < 2 || m_pos == m_size) + { + m_pos = fallbackPosition - 4; + return false; + } + } + } + else + { + enumName = identifier; + break; + } + } currentHeaderLine += SkipWhitespaceAndEol(); std::string enumBase = "0"; long enumCounter = 0;