Fix segfault on unsupported PLI calls (#6458)

This commit is contained in:
Krzysztof Bieganski 2025-09-19 12:59:48 +02:00 committed by GitHub
parent d26fccaa44
commit 0391f113b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 21 additions and 18 deletions

View File

@ -48,6 +48,12 @@
yylval.fl = CRELINE(); \
} while (false)
#define STR \
do { \
const string str(yytext, yyleng); \
yylval.strp = PARSEP->newString(AstNode::encodeName(str)); \
} while (false)
#define ERROR_RSVD_WORD(language) \
do { \
yylval.fl->v3warn(E_UNSUPPORTED, "Unsupported: " << language \
@ -257,11 +263,11 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
"$psprintf" { FL; yylval.fl->v3warn(NONSTD, "Non-standard system function '" << yytext << "';"
" suggest use standard '$sformatf' (IEEE 1800-2023 21.3.3)");
return yD_SFORMATF; }
"$q_add" { FL; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_exam" { FL; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_full" { FL; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_initialize" { FL; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_remove" { FL; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_add" { FL; STR; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_exam" { FL; STR; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_full" { FL; STR; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_initialize" { FL; STR; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$q_remove" { FL; STR; ERROR_RSVD_WORD("IEEE 1364-1995"); return yaD_PLI; }
"$random" { FL; return yD_RANDOM; }
"$readmemb" { FL; return yD_READMEMB; }
"$readmemh" { FL; return yD_READMEMH; }
@ -478,11 +484,11 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
"$changing_gclk" { FL; return yD_CHANGING_GCLK; }
"$countbits" { FL; return yD_COUNTBITS; }
"$countones" { FL; return yD_COUNTONES; }
"$coverage_control" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_get" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_get_max" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_merge" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_save" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_control" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_get" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_get_max" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_merge" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$coverage_save" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$dimensions" { FL; return yD_DIMENSIONS; }
"$error" { FL; return yD_ERROR; }
"$falling_gclk" { FL; return yD_FALLING_GCLK; }
@ -490,16 +496,16 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
"$fell" { FL; return yD_FELL; }
"$fell_gclk" { FL; return yD_FELL_GCLK; }
"$future_gclk" { FL; return yD_FUTURE_GCLK; }
"$get_coverage" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$get_coverage" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$high" { FL; return yD_HIGH; }
"$increment" { FL; return yD_INCREMENT; }
"$inferred_clock" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$inferred_clock" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$inferred_disable" { FL; return yD_INFERRED_DISABLE; }
"$info" { FL; return yD_INFO; }
"$isunbounded" { FL; return yD_ISUNBOUNDED; }
"$isunknown" { FL; return yD_ISUNKNOWN; }
"$left" { FL; return yD_LEFT; }
"$load_coverage_db" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$load_coverage_db" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$low" { FL; return yD_LOW; }
"$onehot" { FL; return yD_ONEHOT; }
"$onehot0" { FL; return yD_ONEHOT0; }
@ -510,7 +516,7 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
"$root" { FL; return yD_ROOT; }
"$rose" { FL; return yD_ROSE; }
"$rose_gclk" { FL; return yD_ROSE_GCLK; }
"$set_coverage_db_name" { FL; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$set_coverage_db_name" { FL; STR; ERROR_RSVD_WORD("IEEE 1800-2005"); return yaD_PLI; }
"$size" { FL; return yD_SIZE; }
"$stable" { FL; return yD_STABLE; }
"$stable_gclk" { FL; return yD_STABLE_GCLK; }
@ -673,10 +679,7 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
/* Default PLI rule */
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,S23,SAX>{
"$"[a-zA-Z0-9_$]+ { const string str (yytext, yyleng);
yylval.strp = PARSEP->newString(AstNode::encodeName(str));
FL; return yaD_PLI;
}
"$"[a-zA-Z0-9_$]+ { FL; STR; return yaD_PLI; }
}
/************************************************************************/