Attach line information to named items

Attach line information to named items. This allows to provide better
location information for messages involving named items. The location of
item itself can't always be used, since the item itself might be empty.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2022-12-31 19:22:56 -08:00
parent 4036c77416
commit 102d85c4e5
3 changed files with 30 additions and 23 deletions

View File

@ -20,13 +20,14 @@
*/ */
# include "StringHeap.h" # include "StringHeap.h"
# include "libmisc/LineInfo.h"
/* /*
* There are lots of places where names are attached to objects. This * There are lots of places where names are attached to objects. This
* simple template expresses the lot. * simple template expresses the lot.
*/ */
template <class T> struct named { template <class T> struct named : public LineInfo {
perm_string name; perm_string name;
T parm; T parm;
}; };

24
parse.y
View File

@ -199,7 +199,10 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2)
return tmp; return tmp;
} }
static std::list<named_pexpr_t>* make_named_numbers(perm_string name, long first, long last, PExpr*val =0) static std::list<named_pexpr_t>* make_named_numbers(const struct vlltype &loc,
perm_string name,
long first, long last,
PExpr *val = nullptr)
{ {
std::list<named_pexpr_t>*lst = new std::list<named_pexpr_t>; std::list<named_pexpr_t>*lst = new std::list<named_pexpr_t>;
named_pexpr_t tmp; named_pexpr_t tmp;
@ -210,6 +213,7 @@ static std::list<named_pexpr_t>* make_named_numbers(perm_string name, long first
buf << name.str() << idx << ends; buf << name.str() << idx << ends;
tmp.name = lex_strings.make(buf.str()); tmp.name = lex_strings.make(buf.str());
tmp.parm = val; tmp.parm = val;
FILE_NAME(&tmp, loc);
val = 0; val = 0;
lst->push_back(tmp); lst->push_back(tmp);
} }
@ -220,6 +224,7 @@ static std::list<named_pexpr_t>* make_named_numbers(perm_string name, long first
buf << name.str() << idx << ends; buf << name.str() << idx << ends;
tmp.name = lex_strings.make(buf.str()); tmp.name = lex_strings.make(buf.str());
tmp.parm = val; tmp.parm = val;
FILE_NAME(&tmp, loc);
val = 0; val = 0;
lst->push_back(tmp); lst->push_back(tmp);
} }
@ -227,12 +232,15 @@ static std::list<named_pexpr_t>* make_named_numbers(perm_string name, long first
return lst; return lst;
} }
static std::list<named_pexpr_t>* make_named_number(perm_string name, PExpr*val =0) static std::list<named_pexpr_t>* make_named_number(const struct vlltype &loc,
perm_string name,
PExpr *val = nullptr)
{ {
std::list<named_pexpr_t>*lst = new std::list<named_pexpr_t>; std::list<named_pexpr_t>*lst = new std::list<named_pexpr_t>;
named_pexpr_t tmp; named_pexpr_t tmp;
tmp.name = name; tmp.name = name;
tmp.parm = val; tmp.parm = val;
FILE_NAME(&tmp, loc);
lst->push_back(tmp); lst->push_back(tmp);
return lst; return lst;
} }
@ -2700,6 +2708,7 @@ attribute_list
attribute attribute
: IDENTIFIER initializer_opt : IDENTIFIER initializer_opt
{ named_pexpr_t*tmp = new named_pexpr_t; { named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($1); tmp->name = lex_strings.make($1);
tmp->parm = $2; tmp->parm = $2;
delete[]$1; delete[]$1;
@ -2894,18 +2903,18 @@ enum_name
: IDENTIFIER initializer_opt : IDENTIFIER initializer_opt
{ perm_string name = lex_strings.make($1); { perm_string name = lex_strings.make($1);
delete[]$1; delete[]$1;
$$ = make_named_number(name, $2); $$ = make_named_number(@$, name, $2);
} }
| IDENTIFIER '[' pos_neg_number ']' initializer_opt | IDENTIFIER '[' pos_neg_number ']' initializer_opt
{ perm_string name = lex_strings.make($1); { perm_string name = lex_strings.make($1);
long count = check_enum_seq_value(@1, $3, false); long count = check_enum_seq_value(@1, $3, false);
$$ = make_named_numbers(name, 0, count-1, $5); $$ = make_named_numbers(@$, name, 0, count-1, $5);
delete[]$1; delete[]$1;
delete $3; delete $3;
} }
| IDENTIFIER '[' pos_neg_number ':' pos_neg_number ']' initializer_opt | IDENTIFIER '[' pos_neg_number ':' pos_neg_number ']' initializer_opt
{ perm_string name = lex_strings.make($1); { perm_string name = lex_strings.make($1);
$$ = make_named_numbers(name, check_enum_seq_value(@1, $3, true), $$ = make_named_numbers(@$, name, check_enum_seq_value(@1, $3, true),
check_enum_seq_value(@1, $5, true), $7); check_enum_seq_value(@1, $5, true), $7);
delete[]$1; delete[]$1;
delete $3; delete $3;
@ -5543,6 +5552,7 @@ parameter_value_opt
named_expression named_expression
: '.' IDENTIFIER '(' expression ')' : '.' IDENTIFIER '(' expression ')'
{ named_pexpr_t*tmp = new named_pexpr_t; { named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($2); tmp->name = lex_strings.make($2);
tmp->parm = $4; tmp->parm = $4;
delete[]$2; delete[]$2;
@ -5553,6 +5563,7 @@ named_expression_opt
: named_expression : named_expression
| '.' IDENTIFIER '(' ')' | '.' IDENTIFIER '(' ')'
{ named_pexpr_t*tmp = new named_pexpr_t; { named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($2); tmp->name = lex_strings.make($2);
tmp->parm = 0; tmp->parm = 0;
delete[]$2; delete[]$2;
@ -5643,6 +5654,7 @@ port_name
| attribute_list_opt '.' IDENTIFIER '(' error ')' | attribute_list_opt '.' IDENTIFIER '(' error ')'
{ yyerror(@3, "error: Invalid port connection expression."); { yyerror(@3, "error: Invalid port connection expression.");
named_pexpr_t*tmp = new named_pexpr_t; named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($3); tmp->name = lex_strings.make($3);
tmp->parm = 0; tmp->parm = 0;
delete[]$3; delete[]$3;
@ -5652,6 +5664,7 @@ port_name
| attribute_list_opt '.' IDENTIFIER | attribute_list_opt '.' IDENTIFIER
{ pform_requires_sv(@3, "Implicit named port connections"); { pform_requires_sv(@3, "Implicit named port connections");
named_pexpr_t*tmp = new named_pexpr_t; named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($3); tmp->name = lex_strings.make($3);
tmp->parm = new PEIdent(lex_strings.make($3), true); tmp->parm = new PEIdent(lex_strings.make($3), true);
FILE_NAME(tmp->parm, @3); FILE_NAME(tmp->parm, @3);
@ -5661,6 +5674,7 @@ port_name
} }
| K_DOTSTAR | K_DOTSTAR
{ named_pexpr_t*tmp = new named_pexpr_t; { named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make("*"); tmp->name = lex_strings.make("*");
tmp->parm = 0; tmp->parm = 0;
$$ = tmp; $$ = tmp;

View File

@ -2280,11 +2280,8 @@ static void pform_make_modgate(perm_string type,
unsigned cnt = overrides->by_name->size(); unsigned cnt = overrides->by_name->size();
named_pexpr_t *byname = new named_pexpr_t[cnt]; named_pexpr_t *byname = new named_pexpr_t[cnt];
list<named_pexpr_t>::iterator by_name_cur = overrides->by_name->begin(); std::copy(overrides->by_name->begin(), overrides->by_name->end(),
for (unsigned idx = 0 ; idx < cnt ; idx += 1, ++ by_name_cur) { byname);
byname[idx].name = by_name_cur->name;
byname[idx].parm = by_name_cur->parm;
}
cur->set_parameters(byname, cnt); cur->set_parameters(byname, cnt);
@ -2312,12 +2309,10 @@ static void pform_make_modgate(perm_string type,
{ {
unsigned npins = bind->size(); unsigned npins = bind->size();
named_pexpr_t *pins = new named_pexpr_t[npins]; named_pexpr_t *pins = new named_pexpr_t[npins];
list<named_pexpr_t>::iterator bind_cur = bind->begin(); for (const auto &bind_cur : *bind)
for (unsigned idx = 0 ; idx < npins ; idx += 1, ++bind_cur) { pform_declare_implicit_nets(bind_cur.parm);
pins[idx].name = bind_cur->name;
pins[idx].parm = bind_cur->parm; std::copy(bind->begin(), bind->end(), pins);
pform_declare_implicit_nets(bind_cur->parm);
}
PGModule*cur = new PGModule(type, name, pins, npins); PGModule*cur = new PGModule(type, name, pins, npins);
cur->set_line(li); cur->set_line(li);
@ -2327,11 +2322,8 @@ static void pform_make_modgate(perm_string type,
unsigned cnt = overrides->by_name->size(); unsigned cnt = overrides->by_name->size();
named_pexpr_t *byname = new named_pexpr_t[cnt]; named_pexpr_t *byname = new named_pexpr_t[cnt];
list<named_pexpr_t>::iterator by_name_cur = overrides->by_name->begin(); std::copy(overrides->by_name->begin(), overrides->by_name->end(),
for (unsigned idx = 0 ; idx < cnt ; idx += 1, ++by_name_cur) { byname);
byname[idx].name = by_name_cur->name;
byname[idx].parm = by_name_cur->parm;
}
cur->set_parameters(byname, cnt); cur->set_parameters(byname, cnt);