Tweaked LFSR_DATA_SLICE/TRUNCATE/FRUNCATE to return lvalues
This is to be consistent with other LFSR_DATA_* constructors. The code
is also a bit more readable when all LFSR_DATA_* constructors are
capitalized.
Not really sure why, but this saved a bit of stack? Probably just
compiler noise:
code stack ctx
before: 38144 2616 752
after: 38148 (+0.0%) 2608 (-0.3%) 752 (+0.0%)
I also explored adding in-place slice/truncate/fruncate functions as
well, but the impact on stack usage was REALLY BAD:
code stack ctx
by-value: 38148 2608 752
in-place: 38144 (-0.0%) 2688 (+3.1%) 752 (+0.0%)
I think maybe because the in-place functions end up with too many
pointers for the compiler to make safe assumptions about compound-
literal lifetimes?
This commit is contained in:
@@ -1696,7 +1696,7 @@ static inline lfs_size_t lfsr_data_size(lfsr_data_t data) {
|
|||||||
return data.size & ~LFSR_DATA_ONDISK;
|
return data.size & ~LFSR_DATA_ONDISK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lfsr_data_t lfsr_data_slice(lfsr_data_t data,
|
static lfsr_data_t lfsr_data_fromslice(lfsr_data_t data,
|
||||||
lfs_ssize_t off, lfs_ssize_t size) {
|
lfs_ssize_t off, lfs_ssize_t size) {
|
||||||
// limit our off/size to data range, note the use of unsigned casts
|
// limit our off/size to data range, note the use of unsigned casts
|
||||||
// here to treat -1 as unbounded
|
// here to treat -1 as unbounded
|
||||||
@@ -1721,18 +1721,29 @@ static lfsr_data_t lfsr_data_slice(lfsr_data_t data,
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lfsr_data_t lfsr_data_truncate(lfsr_data_t data, lfs_size_t size) {
|
#define LFSR_DATA_SLICE(_data, _off, _size) \
|
||||||
return lfsr_data_slice(data, -1, size);
|
((struct {lfsr_data_t d;}){lfsr_data_fromslice(_data, _off, _size)}.d)
|
||||||
|
|
||||||
|
static inline lfsr_data_t lfsr_data_fromtruncate(lfsr_data_t data,
|
||||||
|
lfs_size_t size) {
|
||||||
|
return LFSR_DATA_SLICE(data, -1, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static lfsr_data_t lfsr_data_fruncate(lfsr_data_t data, lfs_size_t size) {
|
#define LFSR_DATA_TRUNCATE(_data, _size) \
|
||||||
return lfsr_data_slice(data,
|
((struct {lfsr_data_t d;}){lfsr_data_fromtruncate(_data, _size)}.d)
|
||||||
|
|
||||||
|
static inline lfsr_data_t lfsr_data_fromfruncate(lfsr_data_t data,
|
||||||
|
lfs_size_t size) {
|
||||||
|
return LFSR_DATA_SLICE(data,
|
||||||
lfsr_data_size(data) - lfs_min(
|
lfsr_data_size(data) - lfs_min(
|
||||||
size,
|
size,
|
||||||
lfsr_data_size(data)),
|
lfsr_data_size(data)),
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LFSR_DATA_FRUNCATE(_data, _size) \
|
||||||
|
((struct {lfsr_data_t d;}){lfsr_data_fromfruncate(_data, _size)}.d)
|
||||||
|
|
||||||
|
|
||||||
// data <-> bd interactions
|
// data <-> bd interactions
|
||||||
|
|
||||||
@@ -1784,7 +1795,7 @@ static lfs_ssize_t lfsr_data_read(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
lfs_memcpy(buffer, data->u.buffer, d);
|
lfs_memcpy(buffer, data->u.buffer, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = lfsr_data_slice(*data, d, -1);
|
*data = LFSR_DATA_SLICE(*data, d, -1);
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1828,7 +1839,7 @@ static int lfsr_data_readleb128(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
return LFS_ERR_CORRUPT;
|
return LFS_ERR_CORRUPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = lfsr_data_slice(*data, d, -1);
|
*data = LFSR_DATA_SLICE(*data, d, -1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11254,7 +11265,7 @@ static lfs_ssize_t lfsr_file_readnext(lfs_t *lfs, const lfsr_file_t *file,
|
|||||||
size,
|
size,
|
||||||
lfsr_data_size(bptr.data)
|
lfsr_data_size(bptr.data)
|
||||||
- (pos_ - (bid-(weight-1))));
|
- (pos_ - (bid-(weight-1))));
|
||||||
lfsr_data_t slice = lfsr_data_slice(bptr.data,
|
lfsr_data_t slice = LFSR_DATA_SLICE(bptr.data,
|
||||||
pos_ - (bid-(weight-1)),
|
pos_ - (bid-(weight-1)),
|
||||||
d);
|
d);
|
||||||
d = lfsr_data_read(lfs, &slice,
|
d = lfsr_data_read(lfs, &slice,
|
||||||
@@ -11507,10 +11518,10 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// note, an entry can be both a left and right sibling
|
// note, an entry can be both a left and right sibling
|
||||||
lfsr_data_t left_slice_ = lfsr_data_slice(bptr_.data,
|
lfsr_data_t left_slice_ = LFSR_DATA_SLICE(bptr_.data,
|
||||||
-1,
|
-1,
|
||||||
pos - (bid-(weight_-1)));
|
pos - (bid-(weight_-1)));
|
||||||
lfsr_data_t right_slice_ = lfsr_data_slice(bptr_.data,
|
lfsr_data_t right_slice_ = LFSR_DATA_SLICE(bptr_.data,
|
||||||
pos+weight - (bid-(weight_-1)),
|
pos+weight - (bid-(weight_-1)),
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
@@ -11519,7 +11530,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
while (tag_ == LFSR_TAG_BLOCK
|
while (tag_ == LFSR_TAG_BLOCK
|
||||||
&& lfsr_data_size(left_slice_) > lfs->cfg->fragment_size
|
&& lfsr_data_size(left_slice_) > lfs->cfg->fragment_size
|
||||||
&& lfsr_data_size(left_slice_) < lfs->cfg->crystal_thresh) {
|
&& lfsr_data_size(left_slice_) < lfs->cfg->crystal_thresh) {
|
||||||
bptr_.data = lfsr_data_slice(bptr_.data,
|
bptr_.data = LFSR_DATA_SLICE(bptr_.data,
|
||||||
lfs->cfg->fragment_size,
|
lfs->cfg->fragment_size,
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
@@ -11527,7 +11538,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
LFSR_RAT_CAT(
|
LFSR_RAT_CAT(
|
||||||
LFSR_TAG_GROW | LFSR_TAG_SUB | LFSR_TAG_DATA,
|
LFSR_TAG_GROW | LFSR_TAG_SUB | LFSR_TAG_DATA,
|
||||||
-(weight_ - lfs->cfg->fragment_size),
|
-(weight_ - lfs->cfg->fragment_size),
|
||||||
lfsr_data_truncate(left_slice_,
|
LFSR_DATA_TRUNCATE(left_slice_,
|
||||||
lfs->cfg->fragment_size)),
|
lfs->cfg->fragment_size)),
|
||||||
LFSR_RAT(
|
LFSR_RAT(
|
||||||
LFSR_TAG_BLOCK,
|
LFSR_TAG_BLOCK,
|
||||||
@@ -11538,7 +11549,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
weight_ -= lfs->cfg->fragment_size;
|
weight_ -= lfs->cfg->fragment_size;
|
||||||
left_slice_ = lfsr_data_slice(bptr_.data,
|
left_slice_ = LFSR_DATA_SLICE(bptr_.data,
|
||||||
-1,
|
-1,
|
||||||
pos - (bid-(weight_-1)));
|
pos - (bid-(weight_-1)));
|
||||||
}
|
}
|
||||||
@@ -11548,7 +11559,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
while (tag_ == LFSR_TAG_BLOCK
|
while (tag_ == LFSR_TAG_BLOCK
|
||||||
&& lfsr_data_size(right_slice_) > lfs->cfg->fragment_size
|
&& lfsr_data_size(right_slice_) > lfs->cfg->fragment_size
|
||||||
&& lfsr_data_size(right_slice_) < lfs->cfg->crystal_thresh) {
|
&& lfsr_data_size(right_slice_) < lfs->cfg->crystal_thresh) {
|
||||||
bptr_.data = lfsr_data_slice(bptr_.data,
|
bptr_.data = LFSR_DATA_SLICE(bptr_.data,
|
||||||
-1,
|
-1,
|
||||||
lfsr_data_size(bptr_.data) - lfs->cfg->fragment_size);
|
lfsr_data_size(bptr_.data) - lfs->cfg->fragment_size);
|
||||||
|
|
||||||
@@ -11560,7 +11571,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
LFSR_RAT_CAT(
|
LFSR_RAT_CAT(
|
||||||
LFSR_TAG_DATA,
|
LFSR_TAG_DATA,
|
||||||
+(weight_ - lfsr_data_size(bptr_.data)),
|
+(weight_ - lfsr_data_size(bptr_.data)),
|
||||||
lfsr_data_fruncate(right_slice_,
|
LFSR_DATA_FRUNCATE(right_slice_,
|
||||||
lfs->cfg->fragment_size))));
|
lfs->cfg->fragment_size))));
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
@@ -11568,7 +11579,7 @@ static int lfsr_file_carve(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
|
|
||||||
bid -= (weight_-lfsr_data_size(bptr_.data));
|
bid -= (weight_-lfsr_data_size(bptr_.data));
|
||||||
weight_ -= (weight_-lfsr_data_size(bptr_.data));
|
weight_ -= (weight_-lfsr_data_size(bptr_.data));
|
||||||
right_slice_ = lfsr_data_slice(bptr_.data,
|
right_slice_ = LFSR_DATA_SLICE(bptr_.data,
|
||||||
pos+weight - (bid-(weight_-1)),
|
pos+weight - (bid-(weight_-1)),
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
@@ -12001,7 +12012,7 @@ static int lfsr_file_flush_(lfs_t *lfs, lfsr_file_t *file,
|
|||||||
- (pos_ - (bid_-(weight_-1))));
|
- (pos_ - (bid_-(weight_-1))));
|
||||||
err = lfsr_bd_progdata(lfs, bptr.data.u.disk.block,
|
err = lfsr_bd_progdata(lfs, bptr.data.u.disk.block,
|
||||||
lfsr_bptr_cksize(&bptr),
|
lfsr_bptr_cksize(&bptr),
|
||||||
lfsr_data_slice(bptr_.data,
|
LFSR_DATA_SLICE(bptr_.data,
|
||||||
pos_ - (bid_-(weight_-1)),
|
pos_ - (bid_-(weight_-1)),
|
||||||
d_),
|
d_),
|
||||||
LFS_IFDEF_CKDATACKSUMS(
|
LFS_IFDEF_CKDATACKSUMS(
|
||||||
@@ -12153,7 +12164,7 @@ fragment:;
|
|||||||
if (bid-(weight-1) + lfsr_data_size(bptr.data) >= fragment_start
|
if (bid-(weight-1) + lfsr_data_size(bptr.data) >= fragment_start
|
||||||
&& fragment_end - (bid-(weight-1))
|
&& fragment_end - (bid-(weight-1))
|
||||||
<= lfs->cfg->fragment_size) {
|
<= lfs->cfg->fragment_size) {
|
||||||
datas[data_count++] = lfsr_data_truncate(bptr.data,
|
datas[data_count++] = LFSR_DATA_TRUNCATE(bptr.data,
|
||||||
fragment_start - (bid-(weight-1)));
|
fragment_start - (bid-(weight-1)));
|
||||||
|
|
||||||
fragment_start = bid-(weight-1);
|
fragment_start = bid-(weight-1);
|
||||||
@@ -12202,7 +12213,7 @@ fragment:;
|
|||||||
&& bid-(weight-1) + lfsr_data_size(bptr.data)
|
&& bid-(weight-1) + lfsr_data_size(bptr.data)
|
||||||
- fragment_start
|
- fragment_start
|
||||||
<= lfs->cfg->fragment_size) {
|
<= lfs->cfg->fragment_size) {
|
||||||
datas[data_count++] = lfsr_data_fruncate(bptr.data,
|
datas[data_count++] = LFSR_DATA_FRUNCATE(bptr.data,
|
||||||
bid-(weight-1) + lfsr_data_size(bptr.data)
|
bid-(weight-1) + lfsr_data_size(bptr.data)
|
||||||
- fragment_end);
|
- fragment_end);
|
||||||
|
|
||||||
@@ -13469,7 +13480,7 @@ static int lfsr_data_readrcompat(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
*rcompat |= LFSR_RCOMPAT_OVERFLOW;
|
*rcompat |= LFSR_RCOMPAT_OVERFLOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = lfsr_data_slice(*data, d, -1);
|
*data = LFSR_DATA_SLICE(*data, d, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user