tag-returning: Adopted tag-returns in rbyd lookupnext/lookup

This is the start of a big refactor to try to move tag out-pointers into
the return position of functions, muxing with error codes via the
sign-bit when necessary.

So instead of:

  lfs3_tag_t tag_;
  lfs3_data_t data_;
  int err = lfs3_rbyd_lookup(&lfs3, &rbyd, rid, tag,
          &tag_, &data_);
  if (err) {
      return err;
  }

We now do:

  lfs3_data_t data_;
  lfs3_stag_t tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd, rid, tag,
          &data_);
  if (tag_ < 0) {
      return tag_;
  }

In theory, removing an out-pointer saves both code and stack, though it
will be interesting to actually see how much of an affect this has after
the dust has settled.

littlefs v2 used this technique heavily for its 32-bit tags, but we
never did a comparison with/without tags in the return position.

This is a big rewrite in the test code, so hopefully this ends up worth
it :)

Lots of regex.

Note this implicitly limits error codes to 16-bits, but supported error
codes are already a bit limited because we're using int everywhere
(instead of int32_t). If we need 32-bit error codes we can always add
another type to represent the mux in the future (lfs3_etag_t?).

---

So far the code savings look promising:

           code          stack          ctx
  before: 36828           2368          656
  after:  36576 (-0.7%)   2376 (+0.3%)  656 (+0.0%)

Stack usage is a big disappointing, but hopefully that is just a
temporary cost due to the internal scaffolding between different API
types while the refactor is ongoing.
This commit is contained in:
Christopher Haster
2025-07-17 06:25:37 -05:00
parent b0ac5bf9e6
commit 1cae72f419
3 changed files with 3477 additions and 2557 deletions
+57 -38
View File
@@ -3100,8 +3100,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0*DID, "aaa", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 0);
assert(weight_ == 1);
@@ -3110,8 +3111,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 1*DID, "aab", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_LT;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 0);
assert(weight_ == 1);
@@ -3165,8 +3167,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, "aaa", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 0);
assert(weight_ == 1);
@@ -3175,8 +3178,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, "aab", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 1);
assert(weight_ == 1);
@@ -3185,8 +3189,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, "aac", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_LT;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 1);
assert(weight_ == 1);
@@ -3246,8 +3251,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0*DID, "aaa", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 0);
assert(weight_ == 1);
@@ -3256,8 +3262,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 1*DID, "aab", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 1);
assert(weight_ == 1);
@@ -3266,8 +3273,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 2*DID, "aac", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 2);
assert(weight_ == 1);
@@ -3276,8 +3284,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 3*DID, "aad", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_LT;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 2);
assert(weight_ == 1);
@@ -3337,8 +3346,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0*DID, "aaa", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 0);
assert(weight_ == 1);
@@ -3347,8 +3357,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 1*DID, "aab", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 1);
assert(weight_ == 1);
@@ -3357,8 +3368,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 2*DID, "aac", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 2);
assert(weight_ == 1);
@@ -3367,8 +3379,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 3*DID, "aad", 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_LT;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == 2);
assert(weight_ == 1);
@@ -3444,8 +3457,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, i*DID, name, 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == i);
assert(weight_ == 1);
@@ -3557,8 +3571,9 @@ code = '''
for (lfs3_size_t i = 0; i < sim_size; i++) {
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, sim_names[i], 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == i);
assert(weight_ == 1);
@@ -3641,8 +3656,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, i*DID, name, 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == i*W+W-1);
assert(weight_ == W);
@@ -3795,8 +3811,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, sim_names[i], 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == weighted_bid+sim_weights[i]-1);
assert(weight_ == sim_weights[i]);
@@ -3979,8 +3996,9 @@ code = '''
for (lfs3_size_t i = 0; i < sim_size; i++) {
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, sim_names[i], 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == i);
assert(weight_ == 1);
@@ -4207,8 +4225,9 @@ code = '''
lfs3_btree_namelookupleaf(&lfs3, &btree, 0, sim_names[i], 3,
&bid_, &rbyd_, &rid_, NULL, &weight_, NULL) => LFS3_CMP_EQ;
lfs3_rbyd_lookup(&lfs3, &rbyd_, rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&tag_, &data_) => 0;
tag_ = lfs3_rbyd_lookup(&lfs3, &rbyd_,
rid_, LFS3_TAG_MASK8 | LFS3_TAG_STRUCT,
&data_);
assert(tag_ == LFS3_TAG_DATA);
assert(bid_ == weighted_bid+sim_weights[i]-1);
assert(weight_ == sim_weights[i]);
+3239 -2332
View File
File diff suppressed because it is too large Load Diff