rattrs: Reverted implicit lfs3_path_namelen in LFS3_FROM_NAME

I don't think there was anything inherently wrong with this idea, but:

- The code savings (28 bytes) was surprisingly small.

- Expecting lfs3_path_namelen may be a headache for future
  non-null-terminated string support.

- Even if you don't care about non-null-terminated strings, precomputing
  strlen as early as possible is a good idea to minimize repeated strlen
  scans.

Reverting adds a bit of code:

                 code          stack          ctx
  before:       35288           2176          660
  after:        35316 (+0.1%)   2176 (+0.0%)  660 (+0.0%)

                 code          stack          ctx
  gbmap before: 38140           2192          772
  gbmap after:  38168 (+0.1%)   2192 (+0.0%)  772 (+0.0%)
This commit is contained in:
Christopher Haster
2025-11-30 01:19:27 -06:00
parent 03df517dae
commit b28b7c12aa
4 changed files with 316 additions and 226 deletions
+62 -39
View File
@@ -3214,9 +3214,10 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("aaa"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR_NULL)) => 0;
@@ -3275,18 +3276,20 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("aaa"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR_NULL)) => 0;
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("aab"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("1"),
LFS3_RATTR_NULL)) => 0;
@@ -3356,27 +3359,30 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("aaa"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR_NULL)) => 0;
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(1*DID),
LFS3_RATTR_ARG("aab"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("1"),
LFS3_RATTR_NULL)) => 0;
lfs3_btree_commit(&lfs3, &btree, 1, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("1"),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(2*DID),
LFS3_RATTR_ARG("aac"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("2"),
LFS3_RATTR_NULL)) => 0;
@@ -3457,27 +3463,30 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("aaa"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR_NULL)) => 0;
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("1"),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(2*DID),
LFS3_RATTR_ARG("aac"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("2"),
LFS3_RATTR_NULL)) => 0;
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("0"),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(1*DID),
LFS3_RATTR_ARG("aab"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("1"),
LFS3_RATTR_NULL)) => 0;
@@ -3558,27 +3567,29 @@ code = '''
// create a tree with N elements
lfs3_btree_t btree;
lfs3_btree_init(&btree);
char name[4] = {
'a'+((0/26/26) % 26), 'a'+((0/26) % 26), 'a'+(0 % 26), '\0',
char name[3] = {
'a'+((0/26/26) % 26), 'a'+((0/26) % 26), 'a'+(0 % 26)
};
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(0 % 10)}),
LFS3_RATTR_NULL)) => 0;
lfs3_size_t n = 1;
for (lfs3_size_t i = 1; i < N; i++) {
char name[4] = {
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26), '\0',
char name[3] = {
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26)
};
lfs3_btree_commit(&lfs3, &btree, i-1, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+((i-1) % 10)}),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(i*DID),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+((i-0) % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -3635,9 +3646,10 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("___"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("_"),
LFS3_RATTR_NULL)) => 0;
@@ -3658,8 +3670,8 @@ code = '''
for (lfs3_size_t i = 1; i < N; i++) {
// choose a pseudo-random name
lfs3_size_t x = TEST_PRNG(&prng) % (26*26*26);
char name[4] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26), '\0',
char name[3] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26)
};
// find where to split
@@ -3676,9 +3688,10 @@ code = '''
lfs3_btree_commit(&lfs3, &btree, bid, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -3753,29 +3766,31 @@ code = '''
// create a tree with N elements
lfs3_btree_t btree;
lfs3_btree_init(&btree);
char name[4] = {
'a'+((0/26/26) % 26), 'a'+((0/26) % 26), 'a'+(0 % 26), '\0',
char name[3] = {
'a'+((0/26/26) % 26), 'a'+((0/26) % 26), 'a'+(0 % 26)
};
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+W),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(0 % 10)}),
LFS3_RATTR_NULL)) => 0;
lfs3_size_t n = 1;
for (lfs3_size_t i = 1; i < N; i++) {
char name[4] = {
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26), '\0',
char name[3] = {
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26)
};
lfs3_btree_commit(&lfs3, &btree, (i-1)*W+W-1, LFS3_RATTRS(
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+((i-1) % 10)}),
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+W),
LFS3_RATTR_ARG(i*DID),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+((i-0) % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -3833,10 +3848,11 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+W),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("___"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("_"),
LFS3_RATTR_NULL)) => 0;
@@ -3860,8 +3876,8 @@ code = '''
for (lfs3_size_t i = 1; i < N; i++) {
// choose a pseudo-random name
lfs3_size_t x = TEST_PRNG(&prng) % (26*26*26);
char name[4] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26), '\0',
char name[3] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26)
};
// choose pseudo-random weights
lfs3_size_t weight1 = 1 + (TEST_PRNG(&prng) % W);
@@ -3890,10 +3906,11 @@ code = '''
LFS3_RATTR_WEIGHT(+weight1-sim_weights[bid]),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+weight2),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -3995,9 +4012,10 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("___"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("_"),
LFS3_RATTR_NULL)) => 0;
@@ -4022,8 +4040,8 @@ code = '''
lfs3_size_t bid = TEST_PRNG(&prng) % ((sim_size == 0) ? 1 : sim_size);
// choose a pseudo-random name
lfs3_size_t x = TEST_PRNG(&prng) % (26*26*26);
char name[4] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26), '\0',
char name[3] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26)
};
// don't let sim drop below one element
@@ -4069,9 +4087,10 @@ code = '''
assert(cmp != LFS3_CMP_EQ);
if (cmp > LFS3_CMP_EQ) {
lfs3_btree_commit(&lfs3, &btree, split_bid, LFS3_RATTRS(
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -4079,9 +4098,10 @@ code = '''
lfs3_btree_commit(&lfs3, &btree, split_bid, LFS3_RATTRS(
// yes, we need this noop, see above
LFS3_RATTR(1, LFS3_RATTR_NULL, 0),
LFS3_RATTR(3, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR(4, LFS3_TAG_REG, +1, LFS3_FROM_NAME),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -4179,10 +4199,11 @@ code = '''
lfs3_btree_t btree;
lfs3_btree_init(&btree);
lfs3_btree_commit(&lfs3, &btree, 0, LFS3_RATTRS(
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+W),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG("___"),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG("_"),
LFS3_RATTR_NULL)) => 0;
@@ -4210,8 +4231,8 @@ code = '''
lfs3_size_t bid = TEST_PRNG(&prng) % ((sim_size == 0) ? 1 : sim_size);
// choose a pseudo-random name
lfs3_size_t x = TEST_PRNG(&prng) % (26*26*26);
char name[4] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26), '\0',
char name[3] = {
'a'+((x/26/26) % 26), 'a'+((x/26) % 26), 'a'+(x % 26)
};
// choose a pseudo-random weight
lfs3_size_t weight = 1 + (TEST_PRNG(&prng) % W);
@@ -4268,10 +4289,11 @@ code = '''
if (cmp > LFS3_CMP_EQ) {
lfs3_btree_commit(&lfs3, &btree,
split_bid-(split_weight-1), LFS3_RATTRS(
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+weight),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;
@@ -4279,10 +4301,11 @@ code = '''
lfs3_btree_commit(&lfs3, &btree, split_bid, LFS3_RATTRS(
// yes, we need this noop, see above
LFS3_RATTR(1, LFS3_RATTR_NULL, 0),
LFS3_RATTR(4, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR(5, LFS3_TAG_REG, -2, LFS3_FROM_NAME),
LFS3_RATTR_WEIGHT(+weight),
LFS3_RATTR_ARG(0),
LFS3_RATTR_ARG(name),
LFS3_RATTR_ARG(3),
LFS3_RATTR(2, LFS3_TAG_DATA, 0, LFS3_FROM_BUF, 1),
LFS3_RATTR_ARG(&(uint8_t){'0'+(i % 10)}),
LFS3_RATTR_NULL)) => 0;