mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
bytecode_ptr: add make_zeroed_bytecode_ptr
Rather than always zeroing memory.
This commit is contained in:
parent
5653fa55a1
commit
63fe84c3f1
@ -162,7 +162,7 @@ bytecode_ptr<FDR> FDRCompiler::setupFDR() {
|
|||||||
headerSize, tabSize, confirmTmp.size(), floodControlTmp.size(),
|
headerSize, tabSize, confirmTmp.size(), floodControlTmp.size(),
|
||||||
size);
|
size);
|
||||||
|
|
||||||
auto fdr = make_bytecode_ptr<FDR>(size, 64);
|
auto fdr = make_zeroed_bytecode_ptr<FDR>(size, 64);
|
||||||
assert(fdr); // otherwise would have thrown std::bad_alloc
|
assert(fdr); // otherwise would have thrown std::bad_alloc
|
||||||
|
|
||||||
fdr->size = size;
|
fdr->size = size;
|
||||||
|
@ -284,7 +284,7 @@ bytecode_ptr<FDRConfirm> getFDRConfirm(const vector<hwlmLiteral> &lits,
|
|||||||
sizeof(LitInfo) * lits.size() + totalLitSize;
|
sizeof(LitInfo) * lits.size() + totalLitSize;
|
||||||
size = ROUNDUP_N(size, alignof(FDRConfirm));
|
size = ROUNDUP_N(size, alignof(FDRConfirm));
|
||||||
|
|
||||||
auto fdrc = make_bytecode_ptr<FDRConfirm>(size);
|
auto fdrc = make_zeroed_bytecode_ptr<FDRConfirm>(size);
|
||||||
assert(fdrc); // otherwise would have thrown std::bad_alloc
|
assert(fdrc); // otherwise would have thrown std::bad_alloc
|
||||||
|
|
||||||
fdrc->andmsk = andmsk;
|
fdrc->andmsk = andmsk;
|
||||||
@ -373,7 +373,7 @@ setupFullConfs(const vector<hwlmLiteral> &lits,
|
|||||||
u32 totalConfSwitchSize = nBuckets * sizeof(u32);
|
u32 totalConfSwitchSize = nBuckets * sizeof(u32);
|
||||||
u32 totalSize = ROUNDUP_16(totalConfSwitchSize + totalConfirmSize);
|
u32 totalSize = ROUNDUP_16(totalConfSwitchSize + totalConfirmSize);
|
||||||
|
|
||||||
auto buf = make_bytecode_ptr<u8>(totalSize, 16);
|
auto buf = make_zeroed_bytecode_ptr<u8>(totalSize, 16);
|
||||||
assert(buf); // otherwise would have thrown std::bad_alloc
|
assert(buf); // otherwise would have thrown std::bad_alloc
|
||||||
|
|
||||||
u32 *confBase = (u32 *)buf.get();
|
u32 *confBase = (u32 *)buf.get();
|
||||||
|
@ -207,7 +207,7 @@ bytecode_ptr<u8> setupFDRFloodControl(const vector<hwlmLiteral> &lits,
|
|||||||
size_t floodStructSize = sizeof(FDRFlood) * nDistinctFloods;
|
size_t floodStructSize = sizeof(FDRFlood) * nDistinctFloods;
|
||||||
size_t totalSize = ROUNDUP_16(floodHeaderSize + floodStructSize);
|
size_t totalSize = ROUNDUP_16(floodHeaderSize + floodStructSize);
|
||||||
|
|
||||||
auto buf = make_bytecode_ptr<u8>(totalSize, 16);
|
auto buf = make_zeroed_bytecode_ptr<u8>(totalSize, 16);
|
||||||
assert(buf); // otherwise would have thrown std::bad_alloc
|
assert(buf); // otherwise would have thrown std::bad_alloc
|
||||||
|
|
||||||
u32 *floodHeader = (u32 *)buf.get();
|
u32 *floodHeader = (u32 *)buf.get();
|
||||||
|
@ -324,7 +324,7 @@ bytecode_ptr<FDR> TeddyCompiler::build() {
|
|||||||
floodControlTmp.size(),
|
floodControlTmp.size(),
|
||||||
16 * maskWidth);
|
16 * maskWidth);
|
||||||
|
|
||||||
auto fdr = make_bytecode_ptr<FDR>(size, 64);
|
auto fdr = make_zeroed_bytecode_ptr<FDR>(size, 64);
|
||||||
assert(fdr); // otherwise would have thrown std::bad_alloc
|
assert(fdr); // otherwise would have thrown std::bad_alloc
|
||||||
Teddy *teddy = (Teddy *)fdr.get(); // ugly
|
Teddy *teddy = (Teddy *)fdr.get(); // ugly
|
||||||
u8 *teddy_base = (u8 *)teddy;
|
u8 *teddy_base = (u8 *)teddy;
|
||||||
|
@ -165,7 +165,8 @@ bytecode_ptr<HWLM> hwlmBuild(const vector<hwlmLiteral> &lits, bool make_small,
|
|||||||
throw ResourceLimitError();
|
throw ResourceLimitError();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto h = make_bytecode_ptr<HWLM>(ROUNDUP_CL(sizeof(HWLM)) + engSize, 64);
|
const size_t hwlm_len = ROUNDUP_CL(sizeof(HWLM)) + engSize;
|
||||||
|
auto h = make_zeroed_bytecode_ptr<HWLM>(hwlm_len, 64);
|
||||||
|
|
||||||
h->type = engType;
|
h->type = engType;
|
||||||
memcpy(HWLM_DATA(h.get()), eng.get(), engSize);
|
memcpy(HWLM_DATA(h.get()), eng.get(), engSize);
|
||||||
|
@ -74,7 +74,7 @@ bytecode_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit) {
|
|||||||
|
|
||||||
const auto &s = lit.s;
|
const auto &s = lit.s;
|
||||||
size_t noodle_len = sizeof(noodTable) + s.length();
|
size_t noodle_len = sizeof(noodTable) + s.length();
|
||||||
auto n = make_bytecode_ptr<noodTable>(noodle_len);
|
auto n = make_zeroed_bytecode_ptr<noodTable>(noodle_len);
|
||||||
assert(n);
|
assert(n);
|
||||||
|
|
||||||
size_t key_offset = findNoodFragOffset(lit);
|
size_t key_offset = findNoodFragOffset(lit);
|
||||||
|
@ -579,7 +579,7 @@ buildCastle(const CastleProto &proto,
|
|||||||
total_size = ROUNDUP_N(total_size, alignof(mmbit_sparse_iter));
|
total_size = ROUNDUP_N(total_size, alignof(mmbit_sparse_iter));
|
||||||
total_size += byte_length(stale_iter); // stale sparse iter
|
total_size += byte_length(stale_iter); // stale sparse iter
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
nfa->type = verify_u8(CASTLE_NFA);
|
nfa->type = verify_u8(CASTLE_NFA);
|
||||||
nfa->length = verify_u32(total_size);
|
nfa->length = verify_u32(total_size);
|
||||||
nfa->nPositions = verify_u32(subs.size());
|
nfa->nPositions = verify_u32(subs.size());
|
||||||
|
@ -1116,7 +1116,7 @@ bytecode_ptr<NFA> goughCompile(raw_som_dfa &raw, u8 somPrecision,
|
|||||||
gi.stream_som_loc_width = somPrecision;
|
gi.stream_som_loc_width = somPrecision;
|
||||||
|
|
||||||
u32 gough_size = ROUNDUP_N(curr_offset, 16);
|
u32 gough_size = ROUNDUP_N(curr_offset, 16);
|
||||||
auto gough_dfa = make_bytecode_ptr<NFA>(gough_size);
|
auto gough_dfa = make_zeroed_bytecode_ptr<NFA>(gough_size);
|
||||||
|
|
||||||
memcpy(gough_dfa.get(), basic_dfa.get(), basic_dfa->length);
|
memcpy(gough_dfa.get(), basic_dfa.get(), basic_dfa->length);
|
||||||
memcpy((char *)gough_dfa.get() + haig_offset, &gi, sizeof(gi));
|
memcpy((char *)gough_dfa.get() + haig_offset, &gi, sizeof(gi));
|
||||||
|
@ -1797,7 +1797,7 @@ struct Factory {
|
|||||||
|
|
||||||
u32 tableOffset, tugMaskOffset;
|
u32 tableOffset, tugMaskOffset;
|
||||||
size_t len = repeatAllocSize(br, &tableOffset, &tugMaskOffset);
|
size_t len = repeatAllocSize(br, &tableOffset, &tugMaskOffset);
|
||||||
auto info = make_bytecode_ptr<NFARepeatInfo>(len);
|
auto info = make_zeroed_bytecode_ptr<NFARepeatInfo>(len);
|
||||||
char *info_ptr = (char *)info.get();
|
char *info_ptr = (char *)info.get();
|
||||||
|
|
||||||
// Collect state space info.
|
// Collect state space info.
|
||||||
@ -2297,7 +2297,7 @@ struct Factory {
|
|||||||
|
|
||||||
size_t nfaSize = sizeof(NFA) + offset;
|
size_t nfaSize = sizeof(NFA) + offset;
|
||||||
DEBUG_PRINTF("nfa size %zu\n", nfaSize);
|
DEBUG_PRINTF("nfa size %zu\n", nfaSize);
|
||||||
auto nfa = make_bytecode_ptr<NFA>(nfaSize);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(nfaSize);
|
||||||
assert(nfa); // otherwise we would have thrown std::bad_alloc
|
assert(nfa); // otherwise we would have thrown std::bad_alloc
|
||||||
|
|
||||||
implNFA_t *limex = (implNFA_t *)getMutableImplNfa(nfa.get());
|
implNFA_t *limex = (implNFA_t *)getMutableImplNfa(nfa.get());
|
||||||
|
@ -496,7 +496,7 @@ bytecode_ptr<NFA> mcclellanCompile16(dfa_info &info, const CompileContext &cc,
|
|||||||
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
||||||
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
char *nfa_base = (char *)nfa.get();
|
char *nfa_base = (char *)nfa.get();
|
||||||
|
|
||||||
populateBasicInfo(sizeof(u16), info, total_size, aux_offset, accel_offset,
|
populateBasicInfo(sizeof(u16), info, total_size, aux_offset, accel_offset,
|
||||||
@ -715,7 +715,7 @@ bytecode_ptr<NFA> mcclellanCompile8(dfa_info &info, const CompileContext &cc,
|
|||||||
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
||||||
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
||||||
|
|
||||||
auto nfa = bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
char *nfa_base = (char *)nfa.get();
|
char *nfa_base = (char *)nfa.get();
|
||||||
|
|
||||||
mcclellan *m = (mcclellan *)getMutableImplNfa(nfa.get());
|
mcclellan *m = (mcclellan *)getMutableImplNfa(nfa.get());
|
||||||
|
@ -872,7 +872,7 @@ bytecode_ptr<NFA> mcshengCompile16(dfa_info &info, dstate_id_t sheng_end,
|
|||||||
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
||||||
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
mcsheng *m = (mcsheng *)getMutableImplNfa(nfa.get());
|
mcsheng *m = (mcsheng *)getMutableImplNfa(nfa.get());
|
||||||
|
|
||||||
populateBasicInfo(sizeof(u16), info, total_size, aux_offset, accel_offset,
|
populateBasicInfo(sizeof(u16), info, total_size, aux_offset, accel_offset,
|
||||||
@ -998,7 +998,7 @@ bytecode_ptr<NFA> mcshengCompile8(dfa_info &info, dstate_id_t sheng_end,
|
|||||||
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
accel_offset -= sizeof(NFA); /* adj accel offset to be relative to m */
|
||||||
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
assert(ISALIGNED_N(accel_offset, alignof(union AccelAux)));
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
mcsheng *m = (mcsheng *)getMutableImplNfa(nfa.get());
|
mcsheng *m = (mcsheng *)getMutableImplNfa(nfa.get());
|
||||||
|
|
||||||
allocateImplId8(info, sheng_end, accel_escape_info, &m->accel_limit_8,
|
allocateImplId8(info, sheng_end, accel_escape_info, &m->accel_limit_8,
|
||||||
|
@ -343,7 +343,7 @@ bytecode_ptr<NFA> mpvCompile(const vector<raw_puff> &puffs_in,
|
|||||||
|
|
||||||
DEBUG_PRINTF("%u puffs, len = %u\n", puffette_count, len);
|
DEBUG_PRINTF("%u puffs, len = %u\n", puffette_count, len);
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(len);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(len);
|
||||||
|
|
||||||
mpv_puffette *pa_base = (mpv_puffette *)
|
mpv_puffette *pa_base = (mpv_puffette *)
|
||||||
((char *)nfa.get() + sizeof(NFA) + sizeof(mpv)
|
((char *)nfa.get() + sizeof(NFA) + sizeof(mpv)
|
||||||
|
@ -507,7 +507,7 @@ bytecode_ptr<NFA> shengCompile(raw_dfa &raw, const CompileContext &cc,
|
|||||||
DEBUG_PRINTF("NFA: %u, aux: %u, reports: %u, accel: %u, total: %u\n",
|
DEBUG_PRINTF("NFA: %u, aux: %u, reports: %u, accel: %u, total: %u\n",
|
||||||
nfa_size, total_aux, total_reports, total_accel, total_size);
|
nfa_size, total_aux, total_reports, total_accel, total_size);
|
||||||
|
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
|
|
||||||
populateBasicInfo(nfa.get(), info, accelInfo, nfa_size, reports_offset,
|
populateBasicInfo(nfa.get(), info, accelInfo, nfa_size, reports_offset,
|
||||||
accel_offset, total_size, total_size - sizeof(NFA));
|
accel_offset, total_size, total_size - sizeof(NFA));
|
||||||
|
@ -134,7 +134,7 @@ buildTamarama(const TamaInfo &tamaInfo, const u32 queue,
|
|||||||
// use subSize as a sentinel value for no active subengines,
|
// use subSize as a sentinel value for no active subengines,
|
||||||
// so add one to subSize here
|
// so add one to subSize here
|
||||||
u32 activeIdxSize = calcPackedBytes(subSize + 1);
|
u32 activeIdxSize = calcPackedBytes(subSize + 1);
|
||||||
auto nfa = make_bytecode_ptr<NFA>(total_size);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(total_size);
|
||||||
nfa->type = verify_u8(TAMARAMA_NFA);
|
nfa->type = verify_u8(TAMARAMA_NFA);
|
||||||
nfa->length = verify_u32(total_size);
|
nfa->length = verify_u32(total_size);
|
||||||
nfa->queueIndex = queue;
|
nfa->queueIndex = queue;
|
||||||
|
@ -137,7 +137,7 @@ bytecode_ptr<NFA> makeLbrNfa(NFAEngineType nfa_type, enum RepeatType rtype,
|
|||||||
}
|
}
|
||||||
size_t len = sizeof(NFA) + sizeof(LbrStruct) + sizeof(RepeatInfo) +
|
size_t len = sizeof(NFA) + sizeof(LbrStruct) + sizeof(RepeatInfo) +
|
||||||
tableLen + sizeof(u64a);
|
tableLen + sizeof(u64a);
|
||||||
auto nfa = make_bytecode_ptr<NFA>(len);
|
auto nfa = make_zeroed_bytecode_ptr<NFA>(len);
|
||||||
nfa->type = verify_u8(nfa_type);
|
nfa->type = verify_u8(nfa_type);
|
||||||
nfa->length = verify_u32(len);
|
nfa->length = verify_u32(len);
|
||||||
return nfa;
|
return nfa;
|
||||||
|
@ -891,7 +891,8 @@ buildAnchoredMatcher(RoseBuildImpl &build, const vector<LitFragment> &fragments,
|
|||||||
throw ResourceLimitError();
|
throw ResourceLimitError();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto atable = make_bytecode_ptr<anchored_matcher_info>(total_size, 64);
|
auto atable =
|
||||||
|
make_zeroed_bytecode_ptr<anchored_matcher_info>(total_size, 64);
|
||||||
char *curr = (char *)atable.get();
|
char *curr = (char *)atable.get();
|
||||||
|
|
||||||
u32 state_offset = 0;
|
u32 state_offset = 0;
|
||||||
|
@ -5612,7 +5612,7 @@ bytecode_ptr<RoseEngine> addSmallWriteEngine(const RoseBuildImpl &build,
|
|||||||
const size_t smwrOffset = ROUNDUP_CL(mainSize);
|
const size_t smwrOffset = ROUNDUP_CL(mainSize);
|
||||||
const size_t newSize = smwrOffset + smallWriteSize;
|
const size_t newSize = smwrOffset + smallWriteSize;
|
||||||
|
|
||||||
auto rose2 = make_bytecode_ptr<RoseEngine>(newSize, 64);
|
auto rose2 = make_zeroed_bytecode_ptr<RoseEngine>(newSize, 64);
|
||||||
char *ptr = (char *)rose2.get();
|
char *ptr = (char *)rose2.get();
|
||||||
memcpy(ptr, rose.get(), mainSize);
|
memcpy(ptr, rose.get(), mainSize);
|
||||||
memcpy(ptr + smwrOffset, smwr_engine.get(), smallWriteSize);
|
memcpy(ptr + smwrOffset, smwr_engine.get(), smallWriteSize);
|
||||||
@ -5958,7 +5958,7 @@ bytecode_ptr<RoseEngine> RoseBuildImpl::buildFinalEngine(u32 minWidth) {
|
|||||||
proto.size = currOffset;
|
proto.size = currOffset;
|
||||||
|
|
||||||
// Time to allocate the real RoseEngine structure, at cacheline alignment.
|
// Time to allocate the real RoseEngine structure, at cacheline alignment.
|
||||||
auto engine = make_bytecode_ptr<RoseEngine>(currOffset, 64);
|
auto engine = make_zeroed_bytecode_ptr<RoseEngine>(currOffset, 64);
|
||||||
assert(engine); // will have thrown bad_alloc otherwise.
|
assert(engine); // will have thrown bad_alloc otherwise.
|
||||||
|
|
||||||
// Copy in our prototype engine data.
|
// Copy in our prototype engine data.
|
||||||
|
@ -504,7 +504,7 @@ bytecode_ptr<SmallWriteEngine> SmallWriteBuildImpl::build(u32 roseQuality) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u32 size = sizeof(SmallWriteEngine) + nfa->length;
|
u32 size = sizeof(SmallWriteEngine) + nfa->length;
|
||||||
auto smwr = make_bytecode_ptr<SmallWriteEngine>(size);
|
auto smwr = make_zeroed_bytecode_ptr<SmallWriteEngine>(size);
|
||||||
|
|
||||||
smwr->size = size;
|
smwr->size = size;
|
||||||
smwr->start_offset = start_offset;
|
smwr->start_offset = start_offset;
|
||||||
|
@ -63,7 +63,6 @@ public:
|
|||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
throw std::bad_alloc();
|
throw std::bad_alloc();
|
||||||
}
|
}
|
||||||
std::memset(ptr.get(), 0, bytes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bytecode_ptr(std::nullptr_t) {}
|
bytecode_ptr(std::nullptr_t) {}
|
||||||
@ -122,12 +121,27 @@ private:
|
|||||||
size_t alignment = 0; //!< Alignment of memory region in bytes.
|
size_t alignment = 0; //!< Alignment of memory region in bytes.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Constructs a bytecode_ptr<T> with the given size and alignment.
|
||||||
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline bytecode_ptr<T> make_bytecode_ptr(size_t size,
|
inline bytecode_ptr<T> make_bytecode_ptr(size_t size,
|
||||||
size_t align = alignof(T)) {
|
size_t align = alignof(T)) {
|
||||||
return bytecode_ptr<T>(size, align);
|
return bytecode_ptr<T>(size, align);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Constructs a bytecode_ptr<T> with the given size and alignment and
|
||||||
|
* fills the memory region with zeroes.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
inline bytecode_ptr<T> make_zeroed_bytecode_ptr(size_t size,
|
||||||
|
size_t align = alignof(T)) {
|
||||||
|
auto ptr = make_bytecode_ptr<T>(size, align);
|
||||||
|
std::memset(ptr.get(), 0, size);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ue2
|
} // namespace ue2
|
||||||
|
|
||||||
#endif // UTIL_BYTECODE_PTR_H
|
#endif // UTIL_BYTECODE_PTR_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user