Fix for GitHub issue #239 - segfault when library file has syntax errors.
If there are errors when parsing a file, it is not safe to elaborate any
modules that have been found in that file.
(cherry picked from commit 0cb1ebddf1)
This commit is contained in:
parent
5b5c0f5c69
commit
7f418af98a
|
|
@ -2254,7 +2254,8 @@ void PGModule::elaborate_scope(Design*des, NetScope*sc) const
|
|||
// Not a module or primitive that I know about yet, so try to
|
||||
// load a library module file (which parses some new Verilog
|
||||
// code) and try again.
|
||||
if (load_module(type_)) {
|
||||
int parser_errors = 0;
|
||||
if (load_module(type_, parser_errors)) {
|
||||
|
||||
// Try again to find the module type
|
||||
mod = pform_modules.find(type_);
|
||||
|
|
@ -2269,6 +2270,10 @@ void PGModule::elaborate_scope(Design*des, NetScope*sc) const
|
|||
return;
|
||||
}
|
||||
|
||||
if (parser_errors) {
|
||||
cerr << get_fileline() << ": error: Failed to parse library file." << endl;
|
||||
des->errors += parser_errors + 1;
|
||||
}
|
||||
|
||||
// Not a module or primitive that I know about or can find by
|
||||
// any means, so give up.
|
||||
|
|
|
|||
|
|
@ -54,11 +54,13 @@ extern FILE *depend_file;
|
|||
* Use the type name as a key, and search the module library for a
|
||||
* file name that has that key.
|
||||
*/
|
||||
bool load_module(const char*type)
|
||||
bool load_module(const char*type, int&parser_errors)
|
||||
{
|
||||
char path[4096];
|
||||
char*ltype = strdup(type);
|
||||
|
||||
parser_errors = 0;
|
||||
|
||||
for (char*tmp = ltype ; *tmp ; tmp += 1)
|
||||
*tmp = tolower(*tmp);
|
||||
|
||||
|
|
@ -98,7 +100,7 @@ bool load_module(const char*type)
|
|||
if (verbose_flag)
|
||||
cerr << "...parsing output from preprocessor..." << endl << flush;
|
||||
|
||||
pform_parse(path, file);
|
||||
parser_errors = pform_parse(path, file);
|
||||
pclose(file);
|
||||
free(cmdline);
|
||||
|
||||
|
|
@ -109,14 +111,14 @@ bool load_module(const char*type)
|
|||
|
||||
FILE*file = fopen(path, "r");
|
||||
assert(file);
|
||||
pform_parse(path, file);
|
||||
parser_errors = pform_parse(path, file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
if (verbose_flag)
|
||||
cerr << "... Load module complete." << endl << flush;
|
||||
|
||||
return true;
|
||||
return parser_errors == 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue