179 if (str.size() <= allowedLength)
return str;
180 auto itr = newNameMap.find(str);
181 if (itr != newNameMap.end())
return itr->second;
183 cstring newStr = str.substr(0, allowedLength - std::to_string(count).size());
184 newStr += std::to_string(count);
186 newNameMap.insert(std::pair<cstring, cstring>(str, newStr));
187 origNameMap.insert(std::pair<cstring, cstring>(newStr, str));
191 cstring dropSuffixIfNoAction(IR::ID name) {
192 if (name.originalName ==
"NoAction")
return name.originalName;
198 : newNameMap(newNameMap) {}
201 const IR::Node *preorder(IR::Member *m)
override {
202 if (m->toString().startsWith(
"m.") || m->toString().startsWith(
"t."))
203 m->member = shortenString(m->member);
205 m->member = shortenString(m->member, 30);
209 const IR::Node *preorder(IR::DpdkStructType *s)
override {
210 if (s->getAnnotations()->getSingle(
"__packet_data__")) {
211 s->name = shortenString(s->name);
212 IR::IndexedVector<IR::StructField> changedFields;
213 for (
auto field : s->fields) {
214 IR::StructField *f =
new IR::StructField(field->name, field->type);
215 f->name = shortenString(f->name, 30);
216 changedFields.push_back(f);
218 return new IR::DpdkStructType(s->srcInfo, s->name, s->annotations, changedFields);
220 s->name = shortenString(s->name);
221 IR::IndexedVector<IR::StructField> changedFields;
222 for (
auto field : s->fields) {
223 IR::StructField *f =
new IR::StructField(field->name, field->type);
224 f->name = shortenString(f->name);
225 changedFields.push_back(f);
227 return new IR::DpdkStructType(s->srcInfo, s->name, s->annotations, changedFields);
232 const IR::Node *preorder(IR::DpdkHeaderType *h)
override {
233 h->name = shortenString(h->name);
234 IR::IndexedVector<IR::StructField> changedFields;
235 for (
auto field : h->fields) {
236 IR::StructField *f =
new IR::StructField(field->name, field->type);
237 f->name = shortenString(f->name, 30);
238 changedFields.push_back(f);
240 return new IR::DpdkHeaderType(h->srcInfo, h->name, h->annotations, changedFields);
243 const IR::Node *preorder(IR::DpdkExternDeclaration *e)
override {
244 e->name = shortenString(e->name);
248 const IR::Node *preorder(IR::Declaration *g)
override {
249 g->name = shortenString(g->name);
253 void shortenParamTypeName(IR::ParameterList &pl) {
254 IR::IndexedVector<IR::Parameter> new_pl;
255 for (
auto p : pl.parameters) {
256 auto newType0 = p->type->to<IR::Type_Name>();
257 auto path0 = newType0->path->clone();
258 path0->name = shortenString(path0->name);
259 new_pl.push_back(
new IR::Parameter(p->srcInfo, p->name, p->annotations, p->direction,
260 new IR::Type_Name(newType0->srcInfo, path0),
263 pl = IR::ParameterList{new_pl};
266 const IR::Node *preorder(IR::DpdkAction *a)
override {
267 a->name = shortenString(dropSuffixIfNoAction(a->name));
268 shortenParamTypeName(a->para);
272 const IR::Node *preorder(IR::ActionList *al)
override {
273 IR::IndexedVector<IR::ActionListElement> new_al;
274 for (
auto ale : al->actionList) {
275 auto methodCallExpr = ale->expression->to<IR::MethodCallExpression>();
276 auto pathExpr = methodCallExpr->method->to<IR::PathExpression>();
277 auto path0 = pathExpr->path->clone();
278 path0->name = shortenString(dropSuffixIfNoAction(path0->name));
279 new_al.push_back(
new IR::ActionListElement(
280 ale->srcInfo, ale->annotations,
281 new IR::MethodCallExpression(
282 methodCallExpr->srcInfo, methodCallExpr->type,
283 new IR::PathExpression(pathExpr->srcInfo, pathExpr->type, path0),
284 methodCallExpr->typeArguments, methodCallExpr->arguments)));
286 return new IR::ActionList(al->srcInfo, new_al);
289 const IR::Node *preorder(IR::DpdkTable *t)
override {
290 t->name = shortenString(t->name);
291 auto methodCallExpr = t->default_action->to<IR::MethodCallExpression>();
292 auto pathExpr = methodCallExpr->method->to<IR::PathExpression>();
293 auto path0 = pathExpr->path->clone();
294 path0->name = shortenString(dropSuffixIfNoAction(path0->name));
295 t->default_action =
new IR::MethodCallExpression(
296 methodCallExpr->srcInfo, methodCallExpr->type,
297 new IR::PathExpression(pathExpr->srcInfo, pathExpr->type, path0),
298 methodCallExpr->typeArguments, methodCallExpr->arguments);
302 const IR::Node *preorder(IR::DpdkLearner *l)
override {
303 l->name = shortenString(l->name);
307 const IR::Node *preorder(IR::DpdkSelector *s)
override {
308 s->name = shortenString(s->name);
312 const IR::Node *preorder(IR::DpdkLearnStatement *ls)
override {
313 ls->action = shortenString(dropSuffixIfNoAction(ls->action));
317 const IR::Node *preorder(IR::DpdkApplyStatement *as)
override {
318 as->table = shortenString(as->table);
322 const IR::Node *preorder(IR::DpdkJmpStatement *j)
override {
323 j->label = shortenString(j->label);
327 const IR::Node *preorder(IR::DpdkLabelStatement *ls)
override {
328 ls->label = shortenString(ls->label);
332 const IR::Node *preorder(IR::DpdkJmpActionStatement *jas)
override {
333 jas->action = shortenString(dropSuffixIfNoAction(jas->action));
347 std::unordered_map<
cstring ,
int> usesInfo;
348 std::unordered_map<cstring, int> defInfo;
349 std::unordered_map<
cstring ,
const IR::Expression * > replacementMap;
350 std::unordered_map<cstring, bool> dontEliminate;
353 dontEliminate[
"m.pna_main_output_metadata_output_port"] =
true;
354 dontEliminate[
"m.psa_ingress_output_metadata_drop"] =
true;
355 dontEliminate[
"m.psa_ingress_output_metadata_egress_port"] =
true;
358 bool preorder(
const IR::DpdkJmpCondStatement *b)
override {
359 usesInfo[b->src1->toString()]++;
360 usesInfo[b->src2->toString()]++;
364 bool preorder(
const IR::DpdkLearnStatement *b)
override {
365 usesInfo[b->timeout->toString()]++;
366 dontEliminate[b->timeout->toString()] =
true;
368 usesInfo[b->argument->toString()]++;
371 dontEliminate[b->argument->toString()] =
true;
376 bool preorder(
const IR::DpdkUnaryStatement *u)
override {
377 usesInfo[u->src->toString()]++;
378 defInfo[u->dst->toString()]++;
380 dontEliminate[u->dst->toString()] =
true;
384 bool preorder(
const IR::DpdkBinaryStatement *b)
override {
385 usesInfo[b->src1->toString()]++;
386 usesInfo[b->src2->toString()]++;
387 defInfo[b->dst->toString()]++;
390 dontEliminate[b->dst->toString()] =
true;
391 dontEliminate[b->src1->toString()] =
true;
395 bool preorder(
const IR::DpdkMovStatement *mv)
override {
396 defInfo[mv->dst->toString()]++;
397 usesInfo[mv->src->toString()]++;
398 replacementMap[mv->dst->toString()] = mv->src;
402 bool preorder(
const IR::DpdkCastStatement *c)
override {
403 usesInfo[c->src->toString()]++;
404 defInfo[c->dst->toString()]++;
405 replacementMap[c->dst->toString()] = c->src;
409 bool preorder(
const IR::DpdkMirrorStatement *m)
override {
410 usesInfo[m->slotId->toString()]++;
411 usesInfo[m->sessionId->toString()]++;
413 dontEliminate[m->slotId->toString()] =
true;
414 dontEliminate[m->sessionId->toString()] =
true;
418 bool preorder(
const IR::DpdkEmitStatement *e)
override {
419 auto type = typeMap->getType(e->header)->to<IR::Type_Header>();
421 for (
auto f : type->fields) {
422 cstring name = e->header->toString() +
"." + f->name.toString();
428 bool preorder(
const IR::DpdkExtractStatement *e)
override {
429 auto type = typeMap->getType(e->header)->to<IR::Type_Header>();
431 for (
auto f : type->fields) {
432 cstring name = e->header->toString() +
"." + f->name.toString();
436 usesInfo[e->length->toString()]++;
438 dontEliminate[e->length->toString()] =
true;
443 bool preorder(
const IR::DpdkLookaheadStatement *l)
override {
444 auto type = typeMap->getType(l->header)->to<IR::Type_Header>();
446 for (
auto f : type->fields) {
447 cstring name = l->header->toString() +
"." + f->name.toString();
453 bool preorder(
const IR::DpdkRxStatement *r)
override {
454 usesInfo[r->port->toString()]++;
456 dontEliminate[r->port->toString()] =
true;
460 bool preorder(
const IR::DpdkTxStatement *t)
override {
461 usesInfo[t->port->toString()]++;
463 dontEliminate[t->port->toString()] =
true;
467 bool preorder(
const IR::DpdkRecircidStatement *t)
override {
468 usesInfo[t->pass->toString()]++;
470 dontEliminate[t->pass->toString()] =
true;
474 bool preorder(
const IR::DpdkRearmStatement *r)
override {
476 usesInfo[r->timeout->toString()]++;
478 dontEliminate[r->timeout->toString()] =
true;
483 bool preorder(
const IR::DpdkChecksumAddStatement *c)
override {
484 usesInfo[c->field->toString()]++;
486 if (
auto m = c->field->to<IR::Member>())
487 if (m->expr->is<IR::Type_Header>()) dontEliminate[c->field->toString()] =
true;
491 bool preorder(
const IR::DpdkChecksumSubStatement *c)
override {
492 usesInfo[c->field->toString()]++;
494 if (
auto m = c->field->to<IR::Member>())
495 if (m->expr->is<IR::Type_Header>()) dontEliminate[c->field->toString()] =
true;
499 bool preorder(
const IR::DpdkGetHashStatement *c)
override {
500 usesInfo[c->dst->toString()]++;
502 dontEliminate[c->dst->toString()] =
true;
506 bool preorder(
const IR::DpdkVerifyStatement *v)
override {
507 usesInfo[v->condition->toString()]++;
508 usesInfo[v->error->toString()]++;
510 dontEliminate[v->condition->toString()] =
true;
511 dontEliminate[v->error->toString()] =
true;
515 bool preorder(
const IR::DpdkMeterDeclStatement *c)
override {
516 usesInfo[c->size->toString()]++;
520 bool preorder(
const IR::DpdkMeterExecuteStatement *e)
override {
521 usesInfo[e->index->toString()]++;
522 if (e->length) usesInfo[e->length->toString()]++;
523 usesInfo[e->color_in->toString()]++;
524 usesInfo[e->color_out->toString()]++;
528 bool preorder(
const IR::DpdkCounterCountStatement *c)
override {
529 usesInfo[c->index->toString()]++;
530 if (c->incr) usesInfo[c->incr->toString()]++;
534 bool preorder(
const IR::DpdkRegisterDeclStatement *r)
override {
535 usesInfo[r->size->toString()]++;
539 bool preorder(
const IR::DpdkRegisterReadStatement *r)
override {
540 usesInfo[r->index->toString()]++;
541 defInfo[r->dst->toString()]++;
545 bool preorder(
const IR::DpdkRegisterWriteStatement *r)
override {
546 usesInfo[r->index->toString()]++;
550 bool preorder(
const IR::DpdkTable *t)
override {
551 auto keys = t->match_keys;
553 for (
auto ke : keys->keyElements) {
554 dontEliminate[ke->expression->toString()] =
true;
559 bool haveSingleUseDef(
cstring str) {
return defInfo[str] == 1 && usesInfo[str] == 1; }