mirror of
https://github.com/rui314/mold.git
synced 2024-10-05 00:57:08 +03:00
Revert "[ELF] Compile an Aho-Corasick tree into a DFA"
This reverts commit 31ca2cc2ae
because looks like it's slower than before.
This commit is contained in:
parent
31ca2cc2ae
commit
8eae808223
@ -1131,22 +1131,14 @@ private:
|
||||
u32 value = -1;
|
||||
TrieNode *suffix_link = nullptr;
|
||||
std::unique_ptr<TrieNode> children[256];
|
||||
u32 dfa_idx = -1;
|
||||
};
|
||||
|
||||
struct DfaState {
|
||||
u32 value = -1;
|
||||
u32 children[256] = {};
|
||||
};
|
||||
|
||||
void compile();
|
||||
void fix_suffix_links(TrieNode &node);
|
||||
void fix_value();
|
||||
void encode(TrieNode &node);
|
||||
|
||||
std::vector<std::string> strings;
|
||||
std::unique_ptr<TrieNode> root;
|
||||
std::vector<DfaState> dfa_states;
|
||||
std::vector<std::pair<GlobPattern, u32>> globs;
|
||||
std::vector<u16> versions;
|
||||
std::once_flag once_flag;
|
||||
|
@ -29,11 +29,21 @@ std::optional<u16> VersionMatcher::find(std::string_view str) {
|
||||
std::call_once(once_flag, [&]() { compile(); });
|
||||
|
||||
// Match against simple glob patterns
|
||||
DfaState *dfa = &dfa_states[0];
|
||||
TrieNode *node = root.get();
|
||||
|
||||
auto walk = [&](u8 c) {
|
||||
dfa = &dfa_states[dfa->children[c]];
|
||||
idx = std::min(idx, dfa->value);
|
||||
for (;;) {
|
||||
if (node->children[c]) {
|
||||
node = node->children[c].get();
|
||||
idx = std::min(idx, node->value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node->suffix_link)
|
||||
return;
|
||||
node = node->suffix_link;
|
||||
idx = std::min(idx, node->value);
|
||||
}
|
||||
};
|
||||
|
||||
walk('\0');
|
||||
@ -107,7 +117,6 @@ bool VersionMatcher::add(std::string_view pat, u16 ver) {
|
||||
void VersionMatcher::compile() {
|
||||
fix_suffix_links(*root);
|
||||
fix_value();
|
||||
encode(*root);
|
||||
compiled = true;
|
||||
}
|
||||
|
||||
@ -154,22 +163,4 @@ void VersionMatcher::fix_value() {
|
||||
} while (!queue.empty());
|
||||
}
|
||||
|
||||
void VersionMatcher::encode(TrieNode &node) {
|
||||
if (node.dfa_idx != -1)
|
||||
return;
|
||||
|
||||
node.dfa_idx = dfa_states.size();
|
||||
dfa_states.push_back({node.value});
|
||||
|
||||
for (i64 i = 0; i < 256; i++) {
|
||||
for (TrieNode *t = &node; t; t = t->suffix_link) {
|
||||
if (std::unique_ptr<TrieNode> &next = t->children[i]) {
|
||||
encode(*next);
|
||||
dfa_states[node.dfa_idx].children[i] = next->dfa_idx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace mold::elf
|
||||
|
Loading…
Reference in New Issue
Block a user