From 24f8ac7fd81d0fbdbafa12db61337f03f930f981 Mon Sep 17 00:00:00 2001 From: Chris Dodd Date: Tue, 21 Feb 2017 12:21:01 -0800 Subject: [PATCH 1/2] check-ifail target to run just IFAIL_TESTS --- Makefile.am | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile.am b/Makefile.am index ba7fe6e2b53..bb6d1577621 100644 --- a/Makefile.am +++ b/Makefile.am @@ -156,3 +156,6 @@ check-%: recheck-%: @$(MAKE) recheck TESTS="$(filter $*/%, $(TESTS) $(EXTRA_TESTS))" + +check-ifail: + @$(MAKE) check TESTS="$(IFAIL_TESTS)" From ce125a87f79f80f4d01ce1e709f574cf355c7687 Mon Sep 17 00:00:00 2001 From: Chris Dodd Date: Thu, 23 Feb 2017 16:19:20 -0800 Subject: [PATCH 2/2] P4_14->16: Include registers referenced by externs in the control that holds the externs. --- frontends/p4/fromv1.0/converters.cpp | 18 ++++++++++++------ frontends/p4/fromv1.0/programStructure.cpp | 3 +++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontends/p4/fromv1.0/converters.cpp b/frontends/p4/fromv1.0/converters.cpp index 140983e0d8c..2a31f2a1622 100644 --- a/frontends/p4/fromv1.0/converters.cpp +++ b/frontends/p4/fromv1.0/converters.cpp @@ -485,16 +485,22 @@ class ComputeCallGraph : public Inspector { } } void postorder(const IR::GlobalRef *gref) override { - auto parent = findContext(); - BUG_CHECK(parent != nullptr, "%1%: GlobalRef not within action", gref); + const Context *ctxt = nullptr; + cstring caller; + if (auto af = findContext()) { + caller = af->name; + } else if (auto di = findContext()) { + caller = di->name; + } else { + BUG("%1%: GlobalRef not within action or extern", gref); } if (auto ctr = gref->obj->to()) - structure->calledCounters.calls(parent->name, ctr->name.name); + structure->calledCounters.calls(caller, ctr->name.name); else if (auto mtr = gref->obj->to()) - structure->calledMeters.calls(parent->name, mtr->name.name); + structure->calledMeters.calls(caller, mtr->name.name); else if (auto reg = gref->obj->to()) - structure->calledRegisters.calls(parent->name, reg->name.name); + structure->calledRegisters.calls(caller, reg->name.name); else if (auto ext = gref->obj->to()) - structure->calledExterns.calls(parent->name, ext->name.name); + structure->calledExterns.calls(caller, ext->name.name); } }; diff --git a/frontends/p4/fromv1.0/programStructure.cpp b/frontends/p4/fromv1.0/programStructure.cpp index 858007db5f5..5fa587547c0 100644 --- a/frontends/p4/fromv1.0/programStructure.cpp +++ b/frontends/p4/fromv1.0/programStructure.cpp @@ -1604,6 +1604,9 @@ ProgramStructure::convertControl(const IR::V1Control* control, cstring newName) calledRegisters.getCallees(a, registersToDo); calledExterns.getCallees(a, externsToDo); } + for (auto c : externsToDo) { + calledRegisters.getCallees(c, registersToDo); + } for (auto c : metersToDo) { auto mtr = meters.get(c); auto meter = convert(mtr, meters.get(mtr));