From de822855f9bc98926ee91216d83c73ca71e787e8 Mon Sep 17 00:00:00 2001 From: Mihai Budiu Date: Tue, 18 Jun 2024 19:35:31 -0700 Subject: [PATCH 1/3] Add a constant folding pass after inlining (#4727) * Add a constant folding pass after inlining Signed-off-by: Mihai Budiu * Updated reference outputs Signed-off-by: Mihai Budiu --------- Signed-off-by: Mihai Budiu --- frontends/p4/frontend.cpp | 1 + testdata/p4_16_samples/issue4548.p4 | 20 +++++++++++++++++++ .../gauntlet_hdr_in_value-bmv2-frontend.p4 | 2 +- .../issue1638-frontend.p4 | 2 +- .../p4_16_samples_outputs/issue1638-midend.p4 | 10 +++++----- .../issue1937-2-bmv2-frontend.p4 | 2 +- .../issue1937-3-bmv2-frontend.p4 | 2 +- .../issue1937-frontend.p4 | 2 +- .../issue2303-frontend.p4 | 2 +- .../issue2648-frontend.p4 | 2 +- .../issue4500-frontend.p4 | 4 +--- .../p4_16_samples_outputs/issue4548-first.p4 | 19 ++++++++++++++++++ .../issue4548-frontend.p4 | 10 ++++++++++ .../p4_16_samples_outputs/issue4548-midend.p4 | 10 ++++++++++ testdata/p4_16_samples_outputs/issue4548.p4 | 19 ++++++++++++++++++ .../p4_16_samples_outputs/issue4548.p4-stderr | 0 .../named-arg1-frontend.p4 | 2 +- 17 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 testdata/p4_16_samples/issue4548.p4 create mode 100644 testdata/p4_16_samples_outputs/issue4548-first.p4 create mode 100644 testdata/p4_16_samples_outputs/issue4548-frontend.p4 create mode 100644 testdata/p4_16_samples_outputs/issue4548-midend.p4 create mode 100644 testdata/p4_16_samples_outputs/issue4548.p4 create mode 100644 testdata/p4_16_samples_outputs/issue4548.p4-stderr diff --git a/frontends/p4/frontend.cpp b/frontends/p4/frontend.cpp index 69e1e508e3e..70325ea3f0f 100644 --- a/frontends/p4/frontend.cpp +++ b/frontends/p4/frontend.cpp @@ -252,6 +252,7 @@ const IR::P4Program *FrontEnd::run(const CompilerOptions &options, const IR::P4P new SetHeaders(&refMap, &typeMap), // Check for constants only after inlining new CheckConstants(&refMap, &typeMap), + new ConstantFolding(&refMap, &typeMap, constantFoldingPolicy), new SimplifyControlFlow(&refMap, &typeMap), // more ifs may have been added to parsers new RemoveParserControlFlow(&refMap, &typeMap), diff --git a/testdata/p4_16_samples/issue4548.p4 b/testdata/p4_16_samples/issue4548.p4 new file mode 100644 index 00000000000..34229a7c765 --- /dev/null +++ b/testdata/p4_16_samples/issue4548.p4 @@ -0,0 +1,20 @@ +#include + +bit<16> fun1(bit<8> args1) { + return (bit<16>)args1; +} +bit<8> fun2(bit<4> args2) { + fun1(8w10); + return 8w0; +} + +control ingress() { + apply { + fun2(4w3); + fun2(4w3); + } +} + +control Ingress(); +package top( Ingress ig); +top( ingress()) main; diff --git a/testdata/p4_16_samples_outputs/gauntlet_hdr_in_value-bmv2-frontend.p4 b/testdata/p4_16_samples_outputs/gauntlet_hdr_in_value-bmv2-frontend.p4 index 9f1d61223e4..c6aef92944a 100644 --- a/testdata/p4_16_samples_outputs/gauntlet_hdr_in_value-bmv2-frontend.p4 +++ b/testdata/p4_16_samples_outputs/gauntlet_hdr_in_value-bmv2-frontend.p4 @@ -25,7 +25,7 @@ parser p(packet_in pkt, out Headers hdr, inout Meta m, inout standard_metadata_t control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) { @name("ingress.retval") bit<16> retval; apply { - retval = ((Headers){eth_hdr = (ethernet_t){dst_addr = 48w1,src_addr = 48w1,eth_type = 16w1}}).eth_hdr.eth_type + 16w1; + retval = 16w2; h.eth_hdr.eth_type = retval; } } diff --git a/testdata/p4_16_samples_outputs/issue1638-frontend.p4 b/testdata/p4_16_samples_outputs/issue1638-frontend.p4 index b53e6238df9..10f89571382 100644 --- a/testdata/p4_16_samples_outputs/issue1638-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue1638-frontend.p4 @@ -24,7 +24,7 @@ control MyC(inout hdr_t hdr, inout meta_t meta, in intrinsic_metadata_t intr_md) } @name("MyC.c2.a") table c2_a { key = { - ((meta_t){f0 = 8w0,f1 = 8w0,f2 = 8w0}).f0: exact @name("meta.f0"); + 8w0: exact @name("meta.f0"); } actions = { NoAction_1(); diff --git a/testdata/p4_16_samples_outputs/issue1638-midend.p4 b/testdata/p4_16_samples_outputs/issue1638-midend.p4 index 85208c2d2e2..92098d6b4c4 100644 --- a/testdata/p4_16_samples_outputs/issue1638-midend.p4 +++ b/testdata/p4_16_samples_outputs/issue1638-midend.p4 @@ -32,17 +32,17 @@ control MyC(inout hdr_t hdr, inout meta_t meta, in intrinsic_metadata_t intr_md) } default_action = NoAction_1(); } - @hidden action issue1638l23() { + @hidden action issue1638l20() { key_0 = 8w0; } - @hidden table tbl_issue1638l23 { + @hidden table tbl_issue1638l20 { actions = { - issue1638l23(); + issue1638l20(); } - const default_action = issue1638l23(); + const default_action = issue1638l20(); } apply { - tbl_issue1638l23.apply(); + tbl_issue1638l20.apply(); c2_a.apply(); } } diff --git a/testdata/p4_16_samples_outputs/issue1937-2-bmv2-frontend.p4 b/testdata/p4_16_samples_outputs/issue1937-2-bmv2-frontend.p4 index c3f111e19b0..6eec5ad228a 100644 --- a/testdata/p4_16_samples_outputs/issue1937-2-bmv2-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue1937-2-bmv2-frontend.p4 @@ -28,7 +28,7 @@ parser parserImpl(packet_in packet, out headers_t hdr, inout metadata_t meta, in transition foo_start_0; } state foo_start_0 { - hdr.h1.f2 = 8w5 >> 2; + hdr.h1.f2 = 8w1; transition start_1; } state start_1 { diff --git a/testdata/p4_16_samples_outputs/issue1937-3-bmv2-frontend.p4 b/testdata/p4_16_samples_outputs/issue1937-3-bmv2-frontend.p4 index acde3032cf0..7628ea34d47 100644 --- a/testdata/p4_16_samples_outputs/issue1937-3-bmv2-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue1937-3-bmv2-frontend.p4 @@ -19,7 +19,7 @@ control ingressImpl(inout headers_t hdr, inout metadata_t meta, inout standard_m apply { tmp = hdr.h1.f1; hdr.h1.f1 = tmp >> 2; - hdr.h1.f2 = 8w5 >> 2; + hdr.h1.f2 = 8w1; } } diff --git a/testdata/p4_16_samples_outputs/issue1937-frontend.p4 b/testdata/p4_16_samples_outputs/issue1937-frontend.p4 index 44dcf7a6538..5d2104714b1 100644 --- a/testdata/p4_16_samples_outputs/issue1937-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue1937-frontend.p4 @@ -19,7 +19,7 @@ parser parserImpl(out h1_t hdr) { transition foo_start_0; } state foo_start_0 { - hdr.f2 = 8w5 >> 2; + hdr.f2 = 8w1; transition start_1; } state start_1 { diff --git a/testdata/p4_16_samples_outputs/issue2303-frontend.p4 b/testdata/p4_16_samples_outputs/issue2303-frontend.p4 index b0d3ba5f2eb..5dd582404db 100644 --- a/testdata/p4_16_samples_outputs/issue2303-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue2303-frontend.p4 @@ -33,7 +33,7 @@ parser p(packet_in pkt, out Headers hdr, inout Meta m, inout standard_metadata_t control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) { apply { - h.h.a = ((Meta){f0 = 8w0,f1 = 8w0,f2 = 8w0}).f0; + h.h.a = 8w0; } } diff --git a/testdata/p4_16_samples_outputs/issue2648-frontend.p4 b/testdata/p4_16_samples_outputs/issue2648-frontend.p4 index 9837ef0c25f..1ba9e688ca3 100644 --- a/testdata/p4_16_samples_outputs/issue2648-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue2648-frontend.p4 @@ -26,7 +26,7 @@ control ingress(inout Headers h) { @name("ingress.tmp_0") bit<8> tmp_0; @name("ingress.retval") bit<8> retval; apply { - retval = ((H){a = 8w1}).a; + retval = 8w1; tmp = retval; tmp_0 = tmp; h.h[tmp_0].a = 8w1; diff --git a/testdata/p4_16_samples_outputs/issue4500-frontend.p4 b/testdata/p4_16_samples_outputs/issue4500-frontend.p4 index 1a02e7c1290..e8332bd8f77 100644 --- a/testdata/p4_16_samples_outputs/issue4500-frontend.p4 +++ b/testdata/p4_16_samples_outputs/issue4500-frontend.p4 @@ -7,9 +7,7 @@ extern void baz(); control c() { apply { bar(E.e0); - if (E.e0 == E.e0) { - baz(); - } + baz(); } } diff --git a/testdata/p4_16_samples_outputs/issue4548-first.p4 b/testdata/p4_16_samples_outputs/issue4548-first.p4 new file mode 100644 index 00000000000..d2834d13faa --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue4548-first.p4 @@ -0,0 +1,19 @@ +#include + +bit<16> fun1(bit<8> args1) { + return (bit<16>)args1; +} +bit<8> fun2(bit<4> args2) { + fun1(8w10); + return 8w0; +} +control ingress() { + apply { + fun2(4w3); + fun2(4w3); + } +} + +control Ingress(); +package top(Ingress ig); +top(ingress()) main; diff --git a/testdata/p4_16_samples_outputs/issue4548-frontend.p4 b/testdata/p4_16_samples_outputs/issue4548-frontend.p4 new file mode 100644 index 00000000000..ed2c9513131 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue4548-frontend.p4 @@ -0,0 +1,10 @@ +#include + +control ingress() { + apply { + } +} + +control Ingress(); +package top(Ingress ig); +top(ingress()) main; diff --git a/testdata/p4_16_samples_outputs/issue4548-midend.p4 b/testdata/p4_16_samples_outputs/issue4548-midend.p4 new file mode 100644 index 00000000000..ed2c9513131 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue4548-midend.p4 @@ -0,0 +1,10 @@ +#include + +control ingress() { + apply { + } +} + +control Ingress(); +package top(Ingress ig); +top(ingress()) main; diff --git a/testdata/p4_16_samples_outputs/issue4548.p4 b/testdata/p4_16_samples_outputs/issue4548.p4 new file mode 100644 index 00000000000..d2834d13faa --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue4548.p4 @@ -0,0 +1,19 @@ +#include + +bit<16> fun1(bit<8> args1) { + return (bit<16>)args1; +} +bit<8> fun2(bit<4> args2) { + fun1(8w10); + return 8w0; +} +control ingress() { + apply { + fun2(4w3); + fun2(4w3); + } +} + +control Ingress(); +package top(Ingress ig); +top(ingress()) main; diff --git a/testdata/p4_16_samples_outputs/issue4548.p4-stderr b/testdata/p4_16_samples_outputs/issue4548.p4-stderr new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testdata/p4_16_samples_outputs/named-arg1-frontend.p4 b/testdata/p4_16_samples_outputs/named-arg1-frontend.p4 index 076249913ee..6f105f02516 100644 --- a/testdata/p4_16_samples_outputs/named-arg1-frontend.p4 +++ b/testdata/p4_16_samples_outputs/named-arg1-frontend.p4 @@ -6,7 +6,7 @@ parser par(out bool b) { transition adder_0_start; } state adder_0_start { - x_0 = 32w0 + 32w6; + x_0 = 32w6; transition start_0; } state start_0 { From 07bdd842caeee70b35ec8042607dccaba85475ec Mon Sep 17 00:00:00 2001 From: Kyle Cripps <60898032+kfcripps@users.noreply.github.com> Date: Wed, 19 Jun 2024 06:26:35 -0700 Subject: [PATCH 2/3] [#4006] Remove confusing warning when the same header is extracted multiple times in a parse path (#4725) * Do not consider multiple header extractions as a symbolic exception * Update test outputs * Add back (better) warning message * appease cpplint * try again * warning is not emitted when loops are not unrolled --- frontends/p4/coreLibrary.h | 6 -- lib/error_catalog.cpp | 2 + lib/error_catalog.h | 1 + midend/interpreter.cpp | 11 ++- ...unroll-issue4006_twice_extracted_header.p4 | 74 +++++++++++++++++ ...-issue4006_twice_extracted_header-first.p4 | 74 +++++++++++++++++ ...sue4006_twice_extracted_header-frontend.p4 | 74 +++++++++++++++++ ...issue4006_twice_extracted_header-midend.p4 | 83 +++++++++++++++++++ ...unroll-issue4006_twice_extracted_header.p4 | 74 +++++++++++++++++ ...issue4006_twice_extracted_header.p4-stderr | 0 ...06_twice_extracted_header.p4.entries.txtpb | 3 + ...006_twice_extracted_header.p4.p4info.txtpb | 6 ++ ...-issue4006_twice_extracted_header-first.p4 | 74 +++++++++++++++++ ...sue4006_twice_extracted_header-frontend.p4 | 74 +++++++++++++++++ ...issue4006_twice_extracted_header-midend.p4 | 83 +++++++++++++++++++ ...unroll-issue4006_twice_extracted_header.p4 | 74 +++++++++++++++++ ...issue4006_twice_extracted_header.p4-stderr | 3 + 17 files changed, 706 insertions(+), 10 deletions(-) create mode 100644 testdata/p4_16_samples/parser-unroll-issue4006_twice_extracted_header.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-first.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-frontend.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-midend.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4-stderr create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.entries.txtpb create mode 100644 testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.p4info.txtpb create mode 100644 testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-first.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-frontend.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-midend.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4 create mode 100644 testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4-stderr diff --git a/frontends/p4/coreLibrary.h b/frontends/p4/coreLibrary.h index 43a99bf3102..3fbb9be5c47 100644 --- a/frontends/p4/coreLibrary.h +++ b/frontends/p4/coreLibrary.h @@ -27,7 +27,6 @@ enum class StandardExceptions { PacketTooShort, NoMatch, StackOutOfBounds, - OverwritingHeader, HeaderTooShort, ParserTimeout, }; @@ -47,9 +46,6 @@ inline std::ostream &operator<<(std::ostream &out, P4::StandardExceptions e) { case P4::StandardExceptions::StackOutOfBounds: out << "StackOutOfBounds"; break; - case P4::StandardExceptions::OverwritingHeader: - out << "OverwritingHeader"; - break; case P4::StandardExceptions::HeaderTooShort: out << "HeaderTooShort"; break; @@ -111,7 +107,6 @@ class P4CoreLibrary : public ::Model::Model { packetTooShort(StandardExceptions::PacketTooShort), noMatch(StandardExceptions::NoMatch), stackOutOfBounds(StandardExceptions::StackOutOfBounds), - overwritingHeader(StandardExceptions::OverwritingHeader), headerTooShort(StandardExceptions::HeaderTooShort) {} // NOLINTEND(bugprone-throw-keyword-missing) @@ -133,7 +128,6 @@ class P4CoreLibrary : public ::Model::Model { P4Exception_Model packetTooShort; P4Exception_Model noMatch; P4Exception_Model stackOutOfBounds; - P4Exception_Model overwritingHeader; P4Exception_Model headerTooShort; }; diff --git a/lib/error_catalog.cpp b/lib/error_catalog.cpp index cc8e2f80e61..5e1664f239a 100644 --- a/lib/error_catalog.cpp +++ b/lib/error_catalog.cpp @@ -66,6 +66,7 @@ const int ErrorType::WARN_UNINITIALIZED_USE = 1019; const int ErrorType::WARN_INVALID_HEADER = 1020; const int ErrorType::WARN_DUPLICATE_PRIORITIES = 1021; const int ErrorType::WARN_ENTRIES_OUT_OF_ORDER = 1022; +const int ErrorType::WARN_MULTI_HDR_EXTRACT = 1023; // ------ Info messages ----------- const int ErrorType::INFO_INFERRED = WARN_MAX + 1; @@ -116,6 +117,7 @@ std::map ErrorCatalog::errorCatalog = { {ErrorType::WARN_INVALID_HEADER, "invalid_header"_cs}, {ErrorType::WARN_DUPLICATE_PRIORITIES, "duplicate_priorities"_cs}, {ErrorType::WARN_ENTRIES_OUT_OF_ORDER, "entries_out_of_priority_order"_cs}, + {ErrorType::WARN_MULTI_HDR_EXTRACT, "multi_header_extract"_cs}, // Info messages {ErrorType::INFO_INFERRED, "inferred"_cs}, diff --git a/lib/error_catalog.h b/lib/error_catalog.h index ce8eaa8493e..8c71b94ad31 100644 --- a/lib/error_catalog.h +++ b/lib/error_catalog.h @@ -80,6 +80,7 @@ class ErrorType { static const int WARN_INVALID_HEADER; // access to fields of an invalid header static const int WARN_DUPLICATE_PRIORITIES; // two entries with the same priority static const int WARN_ENTRIES_OUT_OF_ORDER; // entries with priorities out of order + static const int WARN_MULTI_HDR_EXTRACT; // same header may be extracted more than once // Backends should extend this class with additional warnings in the range 1500-2141. static const int WARN_MIN_BACKEND = 1500; // first allowed backend warning code static const int WARN_MAX = 2141; // last allowed warning code diff --git a/midend/interpreter.cpp b/midend/interpreter.cpp index fbc9fe9c612..6b6fd61e611 100644 --- a/midend/interpreter.cpp +++ b/midend/interpreter.cpp @@ -1141,10 +1141,13 @@ void ExpressionEvaluator::postorder(const IR::MethodCallExpression *expression) BUG_CHECK(hdr->is(), "%1%: Not a header?", hdr); auto sh = hdr->to(); if (sh->valid->isKnown() && sh->valid->value) { - auto result = new SymbolicException(expression, - P4::StandardExceptions::OverwritingHeader); - set(expression, result); - return; + ::warning( + ErrorType::WARN_MULTI_HDR_EXTRACT, + "%1%: Performing an extraction more than once on the same header will " + "nearly always cause all but the last extracted header to be deleted " + "from the packet. It may be preferable to replace previous extractions " + "with lookaheads instead.", + expression); } sh->setAllUnknown(); sh->setValid(true); diff --git a/testdata/p4_16_samples/parser-unroll-issue4006_twice_extracted_header.p4 b/testdata/p4_16_samples/parser-unroll-issue4006_twice_extracted_header.p4 new file mode 100644 index 00000000000..f3b0a3622d4 --- /dev/null +++ b/testdata/p4_16_samples/parser-unroll-issue4006_twice_extracted_header.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; + +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { } + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 0x8100: parse_vlan1; + 0x88A8: parse_vlan2; + default: accept; + } + } + + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 0x8100; + transition select(hdr.vlan.etherType) { + 0x8100: parse_vlan1; + default: reject; + } + } + + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { packet.emit(hdr); } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd ) { + apply { } +} + + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { } +} + + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()),PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; + diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-first.p4 b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-first.p4 new file mode 100644 index 00000000000..815c1edd47b --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-first.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-frontend.p4 b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-frontend.p4 new file mode 100644 index 00000000000..815c1edd47b --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-frontend.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-midend.p4 b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-midend.p4 new file mode 100644 index 00000000000..4759d4226e6 --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header-midend.p4 @@ -0,0 +1,83 @@ +#include +#include + +header ethernet_h { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + @hidden action parserunrollissue4006_twice_extracted_header54() { + packet.emit(hdr.ethernet); + packet.emit(hdr.vlan); + } + @hidden table tbl_parserunrollissue4006_twice_extracted_header54 { + actions = { + parserunrollissue4006_twice_extracted_header54(); + } + const default_action = parserunrollissue4006_twice_extracted_header54(); + } + apply { + tbl_parserunrollissue4006_twice_extracted_header54.apply(); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4 b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4 new file mode 100644 index 00000000000..d916149e4b6 --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 0x8100: parse_vlan1; + 0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 0x8100; + transition select(hdr.vlan.etherType) { + 0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4-stderr b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4-stderr new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.entries.txtpb b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.entries.txtpb new file mode 100644 index 00000000000..5cb9652623a --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.entries.txtpb @@ -0,0 +1,3 @@ +# proto-file: p4/v1/p4runtime.proto +# proto-message: p4.v1.WriteRequest + diff --git a/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.p4info.txtpb b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.p4info.txtpb new file mode 100644 index 00000000000..cfbdc3d692a --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll-issue4006_twice_extracted_header.p4.p4info.txtpb @@ -0,0 +1,6 @@ +# proto-file: p4/config/v1/p4info.proto +# proto-message: p4.config.v1.P4Info + +pkg_info { + arch: "psa" +} diff --git a/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-first.p4 b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-first.p4 new file mode 100644 index 00000000000..815c1edd47b --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-first.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-frontend.p4 b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-frontend.p4 new file mode 100644 index 00000000000..815c1edd47b --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-frontend.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-midend.p4 b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-midend.p4 new file mode 100644 index 00000000000..6ddd5b51430 --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header-midend.p4 @@ -0,0 +1,83 @@ +#include +#include + +header ethernet_h { + bit<48> dstAddr; + bit<48> srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 16w0x8100; + transition select(hdr.vlan.etherType) { + 16w0x8100: parse_vlan1; + default: reject; + } + } + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 16w0x8100: parse_vlan1; + 16w0x88a8: parse_vlan2; + default: accept; + } + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + @hidden action parserunrollissue4006_twice_extracted_header54() { + packet.emit(hdr.ethernet); + packet.emit(hdr.vlan); + } + @hidden table tbl_parserunrollissue4006_twice_extracted_header54 { + actions = { + parserunrollissue4006_twice_extracted_header54(); + } + const default_action = parserunrollissue4006_twice_extracted_header54(); + } + apply { + tbl_parserunrollissue4006_twice_extracted_header54.apply(); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4 b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4 new file mode 100644 index 00000000000..d916149e4b6 --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4 @@ -0,0 +1,74 @@ +#include +#include + +typedef bit<48> eth_addr_t; +header ethernet_h { + eth_addr_t dstAddr; + eth_addr_t srcAddr; + bit<16> etherType; +} + +header vlan_h { + bit<16> tpid; + bit<16> etherType; +} + +struct empty_t { +} + +struct headers_t { + ethernet_h ethernet; + vlan_h vlan; +} + +parser in_parser(packet_in pkt, out headers_t hdr, inout empty_t user_meta, in psa_ingress_parser_input_metadata_t istd, in empty_t resubmit_meta, in empty_t recirculate_meta) { + state start { + pkt.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + 0x8100: parse_vlan1; + 0x88a8: parse_vlan2; + default: accept; + } + } + state parse_vlan2 { + pkt.extract(hdr.vlan); + hdr.ethernet.etherType = 0x8100; + transition select(hdr.vlan.etherType) { + 0x8100: parse_vlan1; + default: reject; + } + } + state parse_vlan1 { + pkt.extract(hdr.vlan); + transition accept; + } +} + +control in_cntrl(inout headers_t hdr, inout empty_t user_meta, in psa_ingress_input_metadata_t istd, inout psa_ingress_output_metadata_t ostd) { + apply { + } +} + +control in_deparser(packet_out packet, out empty_t clone_i2e_meta, out empty_t resubmit_meta, out empty_t normal_meta, inout headers_t hdr, in empty_t meta, in psa_ingress_output_metadata_t istd) { + apply { + packet.emit(hdr); + } +} + +parser e_parser(packet_in buffer, out empty_t hdr, inout empty_t user_meta, in psa_egress_parser_input_metadata_t istd, in empty_t normal_meta, in empty_t clone_i2e_meta, in empty_t clone_e2e_meta) { + state start { + transition accept; + } +} + +control e_cntrl(inout empty_t hdr, inout empty_t user_meta, in psa_egress_input_metadata_t istd, inout psa_egress_output_metadata_t ostd) { + apply { + } +} + +control e_deparser(packet_out packet, out empty_t clone_e2e_meta, out empty_t recirculate_meta, inout empty_t hdr, in empty_t meta, in psa_egress_output_metadata_t istd, in psa_egress_deparser_input_metadata_t edstd) { + apply { + } +} + +PSA_Switch(IngressPipeline(in_parser(), in_cntrl(), in_deparser()), PacketReplicationEngine(), EgressPipeline(e_parser(), e_cntrl(), e_deparser()), BufferingQueueingEngine()) main; diff --git a/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4-stderr b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4-stderr new file mode 100644 index 00000000000..d03bb4a1f15 --- /dev/null +++ b/testdata/p4_16_samples_outputs/parser-unroll/parser-unroll-issue4006_twice_extracted_header.p4-stderr @@ -0,0 +1,3 @@ +parser-unroll-issue4006_twice_extracted_header.p4(44): [--Wwarn=multi_header_extract] warning: pkt.extract(hdr.vlan): Performing an extraction more than once on the same header will nearly always cause all but the last extracted header to be deleted from the packet. It may be preferable to replace previous extractions with lookaheads instead. + pkt.extract(hdr.vlan); + ^^^^^^^^^^^^^^^^^^^^^ From ef0657a21e2d39e09ec74c2aaf25577c74501a70 Mon Sep 17 00:00:00 2001 From: Adarsh Rawat Date: Wed, 19 Jun 2024 22:04:00 +0530 Subject: [PATCH 3/3] Fix : Compatibility issues with Doxygen version in runner and configuration (#4732) * Added bmv2 Backend file and Directory names * Revert "Added bmv2 Backend file and Directory names" This reverts commit 10abeb80d90fe68ee6b7ba03f309a9d6d492cdb4. * Fix : Compatibility issues with Doxygen configuration * feat: Add inline installation for Clang and Doxygen * Refactor : Export Doxygen version with action env variable * refactor: Rename command for installing Doxygen --- .github/workflows/deploy-docs.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 560da2cf318..3d0d6c63629 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -8,7 +8,10 @@ on: push: branches: - main - + +env: + DOXYGEN_VERSION: 1.11.0 + jobs: build-and-deploy: runs-on: ubuntu-latest @@ -17,9 +20,23 @@ jobs: - name : Checkout uses: actions/checkout@v4 - - name: Install Doxygen - run: sudo apt-get install doxygen graphviz -y + - name: Install Clang + run: | + sudo apt-get update + sudo apt-get install -y clang + + - name: Install Doxygen shell: bash + run: | + wget https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.linux.bin.tar.gz + tar xzvf doxygen-${DOXYGEN_VERSION}.linux.bin.tar.gz + cd doxygen-${DOXYGEN_VERSION} + sudo make install + cd .. + rm -rf doxygen-${DOXYGEN_VERSION}* + + - name: Install graphviz + run: sudo apt-get install graphviz -y - name: Generate Doxygen Documentation run: |