Skip to content

Commit

Permalink
Merge remote-tracking branch 'up/main' into replace-scapy-with-apache…
Browse files Browse the repository at this point in the history
…-code-in-p4tc-tests
  • Loading branch information
jafingerhut committed Mar 6, 2025
2 parents 2e17ebe + 126f849 commit 58f36d3
Show file tree
Hide file tree
Showing 75 changed files with 479 additions and 94 deletions.
18 changes: 18 additions & 0 deletions frontends/p4/functionsInlining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,24 @@ const IR::Statement *FunctionsInliner::inlineBefore(const IR::Node *calleeNode,
body.push_back(copyout);
}

// copy return value, if any. Return value could be a PathExpression, so if the same
// function is inlined several times we can have wrong path references, e.g.
// for code: a = f(b) + f(c) we'll end with something like this without this:
// { <body1>;
// retval = <something1>;
// { <body2>
// retval = <something2>
// a = retval + retval;
// }
// }
if (retExpr) {
cstring newName = nameGen->newName("inlinedRetval");
body.push_back(new IR::Declaration_Variable(newName, funclone->type->returnType));
auto right = new IR::PathExpression(newName);
body.push_back(new IR::AssignmentStatement(right, retExpr));
retExpr = right;
}

if (auto assign = statement->to<IR::BaseAssignmentStatement>()) {
// copy the return value
CHECK_NULL(retExpr);
Expand Down
32 changes: 32 additions & 0 deletions testdata/p4_16_samples/inline-function3.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
bit foo(in bit a) {
return a + 1;
}

control p(inout bit bt, in bit bt2, in bit bt3) {
action a(inout bit y0, bit y1, bit y2) {
bit y3 = y1 > 0 ? 1w1 : 0;
if (y3 == 1) {
y0 = 0;
} else if (y0 != 1) {
y0 = y2 | y1;
}
}

action b() {
a(bt, foo(bt2), foo(bt3));
}

table t {
actions = { b; }
default_action = b;
}

apply {
t.apply();
}
}

control simple<T>(inout T arg, in T brg, in T crg);
package m<T>(simple<T> pipe);

m(p()) main;
4 changes: 3 additions & 1 deletion testdata/p4_16_samples_outputs/forloop2-frontend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ control c(inout headers_t hdrs) {
@name("c.n") bit<64> n_0;
@name("c.v") bit<64> v_0;
@name("c.popcnti") bit<64> popcnti_0;
@name("c.inlinedRetval") bit<64> inlinedRetval_0;
apply {
val = hdrs.t1.v;
hasReturned = false;
Expand All @@ -37,7 +38,8 @@ control c(inout headers_t hdrs) {
} else {
retval = n_0;
}
hdrs.t1.v = retval;
inlinedRetval_0 = retval;
hdrs.t1.v = inlinedRetval_0;
}
}

Expand Down
4 changes: 3 additions & 1 deletion testdata/p4_16_samples_outputs/function-frontend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ control c(out bit<16> b) {
@name("c.left_0") bit<16> left;
@name("c.right_0") bit<16> right;
@name("c.retval") bit<16> retval;
@name("c.inlinedRetval") bit<16> inlinedRetval_0;
apply {
left = 16w10;
right = 16w12;
Expand All @@ -10,7 +11,8 @@ control c(out bit<16> b) {
} else {
retval = right;
}
b = retval;
inlinedRetval_0 = retval;
b = inlinedRetval_0;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_0") bit<8> tmp_0;
@name("ingress.tmp_1") bit<48> tmp_1;
@name("ingress.retval") bit<8> retval;
@name("ingress.inlinedRetval") bit<8> inlinedRetval_0;
apply {
if (h.eth_hdr.src_addr < 48w10) {
tmp = h.eth_hdr.dst_addr;
retval = 8w2;
tmp_0 = retval;
inlinedRetval_0 = retval;
tmp_0 = inlinedRetval_0;
tmp_1 = tmp << tmp_0;
h.eth_hdr.eth_type = (bit<16>)tmp_1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ 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") ethernet_t retval;
@name("ingress.inlinedRetval") ethernet_t inlinedRetval_0;
apply {
retval.setValid();
retval = (ethernet_t){dst_addr = 48w1,src_addr = 48w1,eth_type = 16w1};
h.eth_hdr = retval;
inlinedRetval_0 = retval;
h.eth_hdr = inlinedRetval_0;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp") bit<8> tmp;
@name("ingress.c") bit<32> c_0;
@name("ingress.retval") bit<8> retval;
@name("ingress.inlinedRetval") bit<8> inlinedRetval_0;
@name("ingress.action_thing") action action_thing() {
retval = 8w1;
tmp = retval;
inlinedRetval_0 = retval;
tmp = inlinedRetval_0;
c_0 = (bit<32>)tmp;
sm.enq_timestamp = c_0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ 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.tmp") bit<8> tmp;
@name("ingress.retval") bit<8> retval;
@name("ingress.inlinedRetval") bit<8> inlinedRetval_0;
apply {
retval = 8w255;
tmp = retval;
inlinedRetval_0 = retval;
tmp = inlinedRetval_0;
h.eth_hdr.eth_type = (bit<16>)tmp;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ 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.val_0") bit<16> val;
@name("ingress.retval") ethernet_t retval;
@name("ingress.inlinedRetval") ethernet_t inlinedRetval_1;
@name("ingress.retval_0") ethernet_t retval_0;
@name("ingress.inlinedRetval_0") ethernet_t inlinedRetval_2;
apply {
val = h.eth_hdr1.eth_type;
if (val == 16w1) {
Expand All @@ -40,10 +42,12 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
retval.setValid();
retval = (ethernet_t){dst_addr = 48w3,src_addr = 48w3,eth_type = 16w3};
}
h.eth_hdr1 = retval;
inlinedRetval_1 = retval;
h.eth_hdr1 = inlinedRetval_1;
retval_0.setValid();
retval_0 = (ethernet_t){dst_addr = 48w1,src_addr = 48w1,eth_type = 16w1};
h.eth_hdr2 = retval_0;
inlinedRetval_2 = retval_0;
h.eth_hdr2 = inlinedRetval_2;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@ 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;
@name("ingress.inlinedRetval") bit<16> inlinedRetval_0;
apply {
retval = 16w2;
h.eth_hdr.eth_type = retval;
inlinedRetval_0 = retval;
h.eth_hdr.eth_type = inlinedRetval_0;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.bound_val_0") bit<3> bound_val;
@name("ingress.retval") bit<3> retval;
@name("ingress.tmp") bit<3> tmp_1;
@name("ingress.inlinedRetval") bit<3> inlinedRetval_0;
apply {
val = h.i.a;
bound_val = 3w1;
Expand All @@ -52,7 +53,8 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
tmp_1 = val;
}
retval = tmp_1;
tmp = retval;
inlinedRetval_0 = retval;
tmp = inlinedRetval_0;
tmp_0 = tmp;
h.h[tmp_0].a = 32w1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,21 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_0") bit<1> tmp_0;
@name("ingress.val_0") bit<1> val;
@name("ingress.retval") bit<1> retval;
@name("ingress.inlinedRetval") bit<1> inlinedRetval_1;
@name("ingress.id_0") bit<1> id_1;
@name("ingress.retval_0") bit<8> retval_0;
@name("ingress.inlinedRetval_0") bit<8> inlinedRetval_2;
apply {
val = h.i.id;
retval = val;
tmp = retval;
inlinedRetval_1 = retval;
tmp = inlinedRetval_1;
tmp_0 = tmp;
id_1 = 1w0;
retval_0 = 8w1;
h.i.id = id_1;
h.h[tmp_0].a = retval_0;
inlinedRetval_2 = retval_0;
h.h[tmp_0].a = inlinedRetval_2;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,22 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_3") bit<1> tmp_3;
@name("ingress.val_0") bit<1> val;
@name("ingress.retval") bit<1> retval;
@name("ingress.inlinedRetval") bit<1> inlinedRetval_1;
@name("ingress.val_1") bit<8> val_2;
@name("ingress.retval_0") bit<1> retval_0;
@name("ingress.inlinedRetval_0") bit<1> inlinedRetval_2;
apply {
val = h.i.idx;
retval = val;
tmp = retval;
inlinedRetval_1 = retval;
tmp = inlinedRetval_1;
tmp_0 = tmp;
tmp_1 = h.h[tmp_0].a;
val_2 = tmp_1;
retval_0 = 1w0;
tmp_1 = val_2;
tmp_2 = retval_0;
inlinedRetval_2 = retval_0;
tmp_2 = inlinedRetval_2;
h.h[tmp_0].a = tmp_1;
tmp_3 = tmp_2;
h.h[tmp_3].a = 8w1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
[--Wwarn=uninitialized_use] warning: dummy_0.a may be uninitialized
[--Wwarn=uninitialized_use] warning: dummy_0.b may be uninitialized
[--Wwarn=uninitialized_use] warning: dummy_0.c may be uninitialized
[--Wwarn=uninitialized_use] warning: dummy_0.a may be uninitialized
[--Wwarn=uninitialized_use] warning: dummy_0.b may be uninitialized
[--Wwarn=uninitialized_use] warning: dummy_0.c may be uninitialized
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.retval") bit<32> retval;
@name("ingress.tmp1") H[2] tmp1_0;
@name("ingress.tmp2") H[2] tmp2_0;
@name("ingress.inlinedRetval") bit<32> inlinedRetval_0;
@noWarn("unused") @name(".NoAction") action NoAction_1() {
}
@name("ingress.simple_action") action simple_action() {
Expand All @@ -35,7 +36,8 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
tmp1_0[0] = tmp2_0[1];
}
retval = tmp1_0[0].a;
h.h.a = retval;
inlinedRetval_0 = retval;
h.h.a = inlinedRetval_0;
}
@name("ingress.simple_table") table simple_table_0 {
key = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,14 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_0") bit<16> tmp_0;
@name("ingress.dummy_1") H dummy;
@name("ingress.retval") bit<16> retval;
@name("ingress.inlinedRetval") bit<16> inlinedRetval_0;
@name("ingress.dummy") action dummy_2() {
if (b_0) {
dummy = h.h;
retval = 16w1;
h.h = dummy;
tmp_0 = retval;
inlinedRetval_0 = retval;
tmp_0 = inlinedRetval_0;
tmp = tmp_0;
} else {
tmp = 16w1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ 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<8> retval;
@name("ingress.inlinedRetval") bit<8> inlinedRetval_0;
apply {
retval = 8w1;
h.h.a = retval;
inlinedRetval_0 = retval;
h.h.a = inlinedRetval_0;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_1") bit<16> tmp_1;
@name("ingress.input_value_0") bit<16> input_value;
@name("ingress.retval") bit<16> retval;
@name("ingress.inlinedRetval") bit<16> inlinedRetval_0;
@noWarn("unused") @name(".NoAction") action NoAction_1() {
}
@name("ingress.exit_action") action exit_action() {
Expand All @@ -53,7 +54,8 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
tmp_1 = tmp_0;
input_value = tmp_1;
retval = input_value;
h.eth_hdr.eth_type = retval;
inlinedRetval_0 = retval;
h.eth_hdr.eth_type = inlinedRetval_0;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.y") bit<64> y_0;
@name("ingress.tmp") bit<16> tmp;
@name("ingress.retval") bit<16> retval;
@name("ingress.inlinedRetval") bit<16> inlinedRetval_0;
@name("ingress.iuJze") action iuJze() {
retval = 16w4;
tmp = retval;
inlinedRetval_0 = retval;
tmp = inlinedRetval_0;
y_0 = (bit<64>)tmp;
h.h.c = y_0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp") bit<16> tmp;
@name("ingress.retval") bit<16> retval;
@name("ingress.tmp_ret") H tmp_ret_0;
@name("ingress.inlinedRetval") bit<16> inlinedRetval_0;
apply {
tmp_ret_0.setValid();
tmp_ret_0 = (H){a = 8w0,b = 64w0,c = 16w0};
retval = tmp_ret_0.c;
tmp = retval;
inlinedRetval_0 = retval;
tmp = inlinedRetval_0;
m.t = (bit<32>)tmp;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ control ingress(inout Headers h, inout Meta m, inout standard_metadata_t sm) {
@name("ingress.tmp_2") bit<8> tmp_2;
@name("ingress.val_0") bit<8> val;
@name("ingress.retval") bit<8> retval;
@name("ingress.inlinedRetval") bit<8> inlinedRetval_0;
apply {
tmp = 8w1;
retval = val;
h.b.b = val;
tmp_0 = retval;
inlinedRetval_0 = retval;
tmp_0 = inlinedRetval_0;
tmp_1 = tmp != tmp_0;
if (tmp_1) {
tmp_2 = 8w1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ 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.val_1") bit<8> val_2;
@name("ingress.retval") bit<8> retval_1;
@name("ingress.inlinedRetval_0") bit<8> inlinedRetval_2;
apply {
retval_1 = 8w1;
m.tmp = val_2;
h.h.a = retval_1;
inlinedRetval_2 = retval_1;
h.h.a = inlinedRetval_2;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ bit<8> do_thing(out bit<8> val) {
[--Wwarn=uninitialized_use] warning: val_0 may be uninitialized
[--Wwarn=uninitialized_use] warning: val_1 may be uninitialized
[--Wwarn=uninitialized_use] warning: val_1 may be uninitialized
[--Wwarn=uninitialized_use] warning: val_1 may be uninitialized
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ gauntlet_side_effect_order_5-bmv2.p4(16)
bit<48> do_thing(inout bit<48> val_0, out bit<48> val_1) {
^^^^^^^^
[--Wwarn=uninitialized_use] warning: val_2 may be uninitialized
[--Wwarn=uninitialized_use] warning: retval may be uninitialized
[--Wwarn=uninitialized_use] warning: val_2 may be uninitialized
[--Wwarn=uninitialized_use] warning: val_2 may be uninitialized
Loading

0 comments on commit 58f36d3

Please sign in to comment.