From 16604f9539929b5d19dc81d529c36770fd8eebfd Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 3 Oct 2023 09:57:10 +0300 Subject: [PATCH 01/43] Fix version getting out of sync #175 --- src/hs.h | 7 +------ src/hs_version.h.in | 4 ++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/hs.h b/src/hs.h index cdc1ffbc..5f363a60 100644 --- a/src/hs.h +++ b/src/hs.h @@ -39,12 +39,7 @@ * the individual component headers for documentation. */ -/* The current Hyperscan version information. */ - -#define HS_MAJOR 5 -#define HS_MINOR 4 -#define HS_PATCH 9 - +#include "hs_version.h" #include "hs_compile.h" #include "hs_runtime.h" diff --git a/src/hs_version.h.in b/src/hs_version.h.in index 4412730d..67842219 100644 --- a/src/hs_version.h.in +++ b/src/hs_version.h.in @@ -36,5 +36,9 @@ #define HS_VERSION_32BIT ((@HS_MAJOR_VERSION@ << 24) | (@HS_MINOR_VERSION@ << 16) | (@HS_PATCH_VERSION@ << 8) | 0) +#define HS_MAJOR @HS_MAJOR_VERSION@ +#define HS_MINOR @HS_MINOR_VERSION@ +#define HS_PATCH @HS_PATCH_VERSION@ + #endif /* HS_VERSION_H_C6428FAF8E3713 */ From 0d2f9ccbaa163dda4937239affab792317c3a632 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 3 Oct 2023 20:24:39 +0300 Subject: [PATCH 02/43] Fix 'unqualified call to std::move' errors in clang 15+ --- src/fdr/fdr_compile.cpp | 6 +- src/fdr/fdr_confirm_compile.cpp | 2 +- src/fdr/teddy_compile.cpp | 4 +- src/hwlm/hwlm_build.cpp | 16 +-- src/nfa/accel_dfa_build_strat.cpp | 8 +- src/nfa/goughcompile.cpp | 2 +- src/nfa/limex_compile.cpp | 6 +- src/nfa/mcclellancompile.cpp | 2 +- src/nfa/rdfa_merge.cpp | 18 ++-- src/nfa/shengcompile.cpp | 2 +- src/nfagraph/ng_builder.cpp | 2 +- src/nfagraph/ng_calc_components.cpp | 4 +- src/nfagraph/ng_equivalence.cpp | 4 +- src/nfagraph/ng_limex_accel.cpp | 6 +- src/nfagraph/ng_literal_analysis.cpp | 2 +- src/nfagraph/ng_literal_decorated.cpp | 2 +- src/nfagraph/ng_region.cpp | 4 +- src/nfagraph/ng_som.cpp | 8 +- src/nfagraph/ng_violet.cpp | 8 +- src/parser/ComponentAlternation.cpp | 2 +- src/parser/ComponentCondReference.cpp | 2 +- src/parser/ComponentRepeat.cpp | 4 +- src/parser/ComponentSequence.cpp | 8 +- src/parser/Parser.rl | 70 +++++++------- src/rose/rose_build_add.cpp | 2 +- src/rose/rose_build_anchored.cpp | 20 ++-- src/rose/rose_build_bytecode.cpp | 54 +++++------ src/rose/rose_build_compile.cpp | 2 +- src/rose/rose_build_convert.cpp | 2 +- src/rose/rose_build_lookaround.cpp | 2 +- src/rose/rose_build_matchers.cpp | 10 +- src/rose/rose_build_merge.cpp | 12 +-- src/rose/rose_build_program.cpp | 134 +++++++++++++------------- src/som/slot_manager.cpp | 2 +- src/util/clique.cpp | 2 +- tools/hsbench/engine_hyperscan.cpp | 2 +- tools/hsbench/main.cpp | 12 +-- 37 files changed, 224 insertions(+), 224 deletions(-) diff --git a/src/fdr/fdr_compile.cpp b/src/fdr/fdr_compile.cpp index af0f35de..d15e4537 100644 --- a/src/fdr/fdr_compile.cpp +++ b/src/fdr/fdr_compile.cpp @@ -98,7 +98,7 @@ public: const FDREngineDescription &eng_in, bool make_small_in, const Grey &grey_in) : eng(eng_in), grey(grey_in), tab(eng_in.getTabSizeBytes()), - lits(move(lits_in)), bucketToLits(move(bucketToLits_in)), + lits(std::move(lits_in)), bucketToLits(std::move(bucketToLits_in)), make_small(make_small_in) {} bytecode_ptr build(); @@ -504,7 +504,7 @@ map> assignStringsToBuckets( map> bucketToLits; size_t bucketCnt = buckets.size(); for (size_t i = 0; i < bucketCnt; i++) { - bucketToLits.emplace(bucketCnt - i - 1, move(buckets[i])); + bucketToLits.emplace(bucketCnt - i - 1, std::move(buckets[i])); } return bucketToLits; @@ -867,7 +867,7 @@ unique_ptr fdrBuildProtoInternal(u8 engType, auto bucketToLits = assignStringsToBuckets(lits, *des); addIncludedInfo(lits, des->getNumBuckets(), bucketToLits); auto proto = - std::make_unique(engType, move(des), lits, bucketToLits, + std::make_unique(engType, std::move(des), lits, bucketToLits, make_small); return proto; } diff --git a/src/fdr/fdr_confirm_compile.cpp b/src/fdr/fdr_confirm_compile.cpp index d90029d2..75b237b0 100644 --- a/src/fdr/fdr_confirm_compile.cpp +++ b/src/fdr/fdr_confirm_compile.cpp @@ -309,7 +309,7 @@ setupFullConfs(const vector &lits, DEBUG_PRINTF("b %d sz %zu\n", b, vl.size()); auto fc = getFDRConfirm(vl, make_small); totalConfirmSize += fc.size(); - bc2Conf.emplace(b, move(fc)); + bc2Conf.emplace(b, std::move(fc)); } } diff --git a/src/fdr/teddy_compile.cpp b/src/fdr/teddy_compile.cpp index 9fb7b26b..e7398b6f 100644 --- a/src/fdr/teddy_compile.cpp +++ b/src/fdr/teddy_compile.cpp @@ -88,7 +88,7 @@ public: const TeddyEngineDescription &eng_in, bool make_small_in, const Grey &grey_in) : eng(eng_in), grey(grey_in), lits(lits_in), - bucketToLits(move(bucketToLits_in)), make_small(make_small_in) {} + bucketToLits(std::move(bucketToLits_in)), make_small(make_small_in) {} bytecode_ptr build(); }; @@ -676,7 +676,7 @@ unique_ptr teddyBuildProtoHinted( return nullptr; } - return std::make_unique(engType, move(des), lits, + return std::make_unique(engType, std::move(des), lits, bucketToLits, make_small); } diff --git a/src/hwlm/hwlm_build.cpp b/src/hwlm/hwlm_build.cpp index 615224fe..7837819a 100644 --- a/src/hwlm/hwlm_build.cpp +++ b/src/hwlm/hwlm_build.cpp @@ -57,24 +57,24 @@ using namespace std; namespace ue2 { HWLMProto::HWLMProto(u8 engType_in, vector lits_in) - : engType(engType_in), lits(move(lits_in)) {} + : engType(engType_in), lits(std::move(lits_in)) {} HWLMProto::HWLMProto(u8 engType_in, unique_ptr eng_in, vector lits_in, map> bucketToLits_in, bool make_small_in) - : engType(engType_in), fdrEng(move(eng_in)), lits(move(lits_in)), - bucketToLits(move(bucketToLits_in)), make_small(make_small_in) {} + : engType(engType_in), fdrEng(std::move(eng_in)), lits(std::move(lits_in)), + bucketToLits(std::move(bucketToLits_in)), make_small(make_small_in) {} HWLMProto::HWLMProto(u8 engType_in, unique_ptr eng_in, vector lits_in, map> bucketToLits_in, bool make_small_in) - : engType(engType_in), teddyEng(move(eng_in)), - lits(move(lits_in)), - bucketToLits(move(bucketToLits_in)), make_small(make_small_in) {} + : engType(engType_in), teddyEng(std::move(eng_in)), + lits(std::move(lits_in)), + bucketToLits(std::move(bucketToLits_in)), make_small(make_small_in) {} HWLMProto::~HWLMProto() {} @@ -132,14 +132,14 @@ bytecode_ptr hwlmBuild(const HWLMProto &proto, const CompileContext &cc, if (noodle) { engSize = noodle.size(); } - eng = move(noodle); + eng = std::move(noodle); } else { DEBUG_PRINTF("building a new deal\n"); auto fdr = fdrBuildTable(proto, cc.grey); if (fdr) { engSize = fdr.size(); } - eng = move(fdr); + eng = std::move(fdr); } if (!eng) { diff --git a/src/nfa/accel_dfa_build_strat.cpp b/src/nfa/accel_dfa_build_strat.cpp index 6793a65c..7139d5be 100644 --- a/src/nfa/accel_dfa_build_strat.cpp +++ b/src/nfa/accel_dfa_build_strat.cpp @@ -130,14 +130,14 @@ void extend(const raw_dfa &rdfa, const vector &rev_map, } else { path pp = append(p, CharReach(), p.dest); all[p.dest].emplace_back(pp); - out.emplace_back(move(pp)); + out.emplace_back(std::move(pp)); } } if (!s.reports_eod.empty()) { path pp = append(p, CharReach(), p.dest); all[p.dest].emplace_back(pp); - out.emplace_back(move(pp)); + out.emplace_back(std::move(pp)); } flat_map dest; @@ -157,7 +157,7 @@ void extend(const raw_dfa &rdfa, const vector &rev_map, DEBUG_PRINTF("----good: [%s] -> %u\n", describeClasses(pp.reach).c_str(), pp.dest); all[e.first].emplace_back(pp); - out.emplace_back(move(pp)); + out.emplace_back(std::move(pp)); } } @@ -174,7 +174,7 @@ vector> generate_paths(const raw_dfa &rdfa, extend(rdfa, rev_map, p, all, next_gen); } - paths = move(next_gen); + paths = std::move(next_gen); } dump_paths(paths); diff --git a/src/nfa/goughcompile.cpp b/src/nfa/goughcompile.cpp index 5d5c37df..343a793b 100644 --- a/src/nfa/goughcompile.cpp +++ b/src/nfa/goughcompile.cpp @@ -1299,7 +1299,7 @@ unique_ptr gough_build_strat::gatherReports( *arbReport = MO_INVALID_IDX; assert(!ri->rl.empty()); /* all components should be able to generate reports */ - return move(ri); + return std::move(ri); } u32 raw_gough_report_info_impl::getReportListSize() const { diff --git a/src/nfa/limex_compile.cpp b/src/nfa/limex_compile.cpp index 305aa507..f84cdc32 100644 --- a/src/nfa/limex_compile.cpp +++ b/src/nfa/limex_compile.cpp @@ -1026,7 +1026,7 @@ u32 addReports(const flat_set &r, vector &reports, u32 offset = verify_u32(reports.size()); insert(&reports, reports.end(), my_reports); - reports_cache.emplace(move(my_reports), offset); + reports_cache.emplace(std::move(my_reports), offset); return offset; } @@ -1064,7 +1064,7 @@ void buildAcceptsList(const build_info &args, ReportListCache &reports_cache, a.reports = addReports(h[v].reports, reports, reports_cache); } a.squash = addSquashMask(args, v, squash); - accepts.emplace_back(move(a)); + accepts.emplace_back(std::move(a)); } } @@ -1819,7 +1819,7 @@ struct Factory { *streamState += streamStateLen; *scratchStateSize += sizeof(RepeatControl); - out.emplace_back(move(info)); + out.emplace_back(std::move(info)); } } diff --git a/src/nfa/mcclellancompile.cpp b/src/nfa/mcclellancompile.cpp index d1afcbcc..d165b1fa 100644 --- a/src/nfa/mcclellancompile.cpp +++ b/src/nfa/mcclellancompile.cpp @@ -462,7 +462,7 @@ unique_ptr mcclellan_build_strat::gatherReports( *isSingleReport = 0; } - return move(ri); + return std::move(ri); } u32 raw_report_info_impl::getReportListSize() const { diff --git a/src/nfa/rdfa_merge.cpp b/src/nfa/rdfa_merge.cpp index 8506f90b..588f94e3 100644 --- a/src/nfa/rdfa_merge.cpp +++ b/src/nfa/rdfa_merge.cpp @@ -319,7 +319,7 @@ void mergeDfas(vector> &dfas, size_t max_states, queue> q; for (auto &dfa : dfas) { - q.push(move(dfa)); + q.push(std::move(dfa)); } // All DFAs are now on the queue, so we'll clear the vector and use it for @@ -328,30 +328,30 @@ void mergeDfas(vector> &dfas, size_t max_states, while (q.size() > 1) { // Attempt to merge the two front elements of the queue. - unique_ptr d1 = move(q.front()); + unique_ptr d1 = std::move(q.front()); q.pop(); - unique_ptr d2 = move(q.front()); + unique_ptr d2 = std::move(q.front()); q.pop(); auto rdfa = mergeTwoDfas(d1.get(), d2.get(), max_states, rm, grey); if (rdfa) { - q.push(move(rdfa)); + q.push(std::move(rdfa)); } else { DEBUG_PRINTF("failed to merge\n"); // Put the larger of the two DFAs on the output list, retain the // smaller one on the queue for further merge attempts. if (d2->states.size() > d1->states.size()) { - dfas.emplace_back(move(d2)); - q.push(move(d1)); + dfas.emplace_back(std::move(d2)); + q.push(std::move(d1)); } else { - dfas.emplace_back(move(d1)); - q.push(move(d2)); + dfas.emplace_back(std::move(d1)); + q.push(std::move(d2)); } } } while (!q.empty()) { - dfas.emplace_back(move(q.front())); + dfas.emplace_back(std::move(q.front())); q.pop(); } diff --git a/src/nfa/shengcompile.cpp b/src/nfa/shengcompile.cpp index 240d6c08..aa353783 100644 --- a/src/nfa/shengcompile.cpp +++ b/src/nfa/shengcompile.cpp @@ -270,7 +270,7 @@ unique_ptr sheng_build_strat::gatherReports( *isSingleReport = 0; } - return move(ri); + return std::move(ri); } u32 sheng_build_strat::max_allowed_offset_accel() const { diff --git a/src/nfagraph/ng_builder.cpp b/src/nfagraph/ng_builder.cpp index 72beba3e..e867bbde 100644 --- a/src/nfagraph/ng_builder.cpp +++ b/src/nfagraph/ng_builder.cpp @@ -162,7 +162,7 @@ BuiltExpression NFABuilderImpl::getGraph() { throw CompileError("Pattern too large."); } - return { expr, move(graph) }; + return { expr, std::move(graph) }; } void NFABuilderImpl::setNodeReportID(Position pos, int offsetAdjust) { diff --git a/src/nfagraph/ng_calc_components.cpp b/src/nfagraph/ng_calc_components.cpp index 2d26aae6..c5e93cc0 100644 --- a/src/nfagraph/ng_calc_components.cpp +++ b/src/nfagraph/ng_calc_components.cpp @@ -369,7 +369,7 @@ void splitIntoComponents(unique_ptr g, pruneUseless(*gc); DEBUG_PRINTF("component %zu has %zu vertices\n", comps.size(), num_vertices(*gc)); - comps.emplace_back(move(gc)); + comps.emplace_back(std::move(gc)); } // Another component to handle the direct shell-to-shell edges. @@ -385,7 +385,7 @@ void splitIntoComponents(unique_ptr g, pruneUseless(*gc); DEBUG_PRINTF("shell edge component %zu has %zu vertices\n", comps.size(), num_vertices(*gc)); - comps.emplace_back(move(gc)); + comps.emplace_back(std::move(gc)); *shell_comp = true; } diff --git a/src/nfagraph/ng_equivalence.cpp b/src/nfagraph/ng_equivalence.cpp index c575ad2f..7bfe3c93 100644 --- a/src/nfagraph/ng_equivalence.cpp +++ b/src/nfagraph/ng_equivalence.cpp @@ -349,7 +349,7 @@ vector partitionGraph(vector> &infos, unsigned eq_class = classes.size(); vi->equivalence_class = eq_class; classes.push_back({vi.get()}); - classinfomap.emplace(move(ci), eq_class); + classinfomap.emplace(std::move(ci), eq_class); } else { // vertex is added to an existing class. unsigned eq_class = ii->second; @@ -441,7 +441,7 @@ void equivalence(vector &classes, WorkQueue &work_queue, classes[cur_class].erase(vi); new_class_vertices.insert(vi); } - classes.emplace_back(move(new_class_vertices)); + classes.emplace_back(std::move(new_class_vertices)); if (contains(tmi->first, cur_class)) { reval_queue.push(new_class); diff --git a/src/nfagraph/ng_limex_accel.cpp b/src/nfagraph/ng_limex_accel.cpp index 875d582d..8bac753d 100644 --- a/src/nfagraph/ng_limex_accel.cpp +++ b/src/nfagraph/ng_limex_accel.cpp @@ -254,7 +254,7 @@ void findBestInternal(vector>::const_iterator pb, DEBUG_PRINTF("worse\n"); continue; } - priority_path.emplace_back(move(as)); + priority_path.emplace_back(std::move(as)); } sort(priority_path.begin(), priority_path.end()); @@ -422,7 +422,7 @@ void findDoubleBest(vector >::const_iterator pb, DEBUG_PRINTF("worse\n"); continue; } - priority_path.emplace_back(move(as)); + priority_path.emplace_back(std::move(as)); } sort(priority_path.begin(), priority_path.end()); @@ -569,7 +569,7 @@ AccelScheme findBestAccelScheme(vector> paths, DAccelScheme da = findBestDoubleAccelScheme(paths, terminating); if (da.double_byte.size() <= DOUBLE_SHUFTI_LIMIT) { rv.double_byte = std::move(da.double_byte); - rv.double_cr = move(da.double_cr); + rv.double_cr = std::move(da.double_cr); rv.double_offset = da.double_offset; } } diff --git a/src/nfagraph/ng_literal_analysis.cpp b/src/nfagraph/ng_literal_analysis.cpp index 1dbf23a7..77964b81 100644 --- a/src/nfagraph/ng_literal_analysis.cpp +++ b/src/nfagraph/ng_literal_analysis.cpp @@ -67,7 +67,7 @@ namespace { struct LitGraphVertexProps { LitGraphVertexProps() = default; - explicit LitGraphVertexProps(ue2_literal::elem c_in) : c(move(c_in)) {} + explicit LitGraphVertexProps(ue2_literal::elem c_in) : c(std::move(c_in)) {} ue2_literal::elem c; // string element (char + bool) size_t index = 0; // managed by ue2_graph }; diff --git a/src/nfagraph/ng_literal_decorated.cpp b/src/nfagraph/ng_literal_decorated.cpp index d3a42b59..7fa2416a 100644 --- a/src/nfagraph/ng_literal_decorated.cpp +++ b/src/nfagraph/ng_literal_decorated.cpp @@ -237,7 +237,7 @@ bool handleDecoratedLiterals(RoseBuild &rose, const NGHolder &g, DEBUG_PRINTF("failed validation\n"); return false; } - masks.emplace_back(move(pm)); + masks.emplace_back(std::move(pm)); } for (const auto &pm : masks) { diff --git a/src/nfagraph/ng_region.cpp b/src/nfagraph/ng_region.cpp index aa74a93b..1d5bc164 100644 --- a/src/nfagraph/ng_region.cpp +++ b/src/nfagraph/ng_region.cpp @@ -100,7 +100,7 @@ void checkAndAddExitCandidate(const AcyclicGraph &g, if (!open.empty()) { DEBUG_PRINTF("exit %zu\n", g[v].index); - exits.emplace_back(move(v_exit)); + exits.emplace_back(std::move(v_exit)); } } @@ -210,7 +210,7 @@ void buildInitialCandidate(const AcyclicGraph &g, if (it != ite) { enters.erase(*it); - open_jumps = move(enters); + open_jumps = std::move(enters); DEBUG_PRINTF("oj size = %zu\n", open_jumps.size()); ++it; } else { diff --git a/src/nfagraph/ng_som.cpp b/src/nfagraph/ng_som.cpp index 3077ee9d..359fa17b 100644 --- a/src/nfagraph/ng_som.cpp +++ b/src/nfagraph/ng_som.cpp @@ -1733,7 +1733,7 @@ void clearProperInEdges(NGHolder &g, const NFAVertex sink) { namespace { struct SomRevNfa { SomRevNfa(NFAVertex s, ReportID r, bytecode_ptr n) - : sink(s), report(r), nfa(move(n)) {} + : sink(s), report(r), nfa(std::move(n)) {} NFAVertex sink; ReportID report; bytecode_ptr nfa; @@ -1799,7 +1799,7 @@ bool makeSomRevNfa(vector &som_nfas, const NGHolder &g, return false; } - som_nfas.emplace_back(sink, report, move(nfa)); + som_nfas.emplace_back(sink, report, std::move(nfa)); return true; } @@ -1839,7 +1839,7 @@ bool doSomRevNfa(NG &ng, NGHolder &g, const CompileContext &cc) { assert(som_nfa.nfa); // Transfer ownership of the NFA to the SOM slot manager. - u32 comp_id = ng.ssm.addRevNfa(move(som_nfa.nfa), maxWidth); + u32 comp_id = ng.ssm.addRevNfa(std::move(som_nfa.nfa), maxWidth); // Replace this report on 'g' with a SOM_REV_NFA report pointing at our // new component. @@ -1872,7 +1872,7 @@ u32 doSomRevNfaPrefix(NG &ng, const ExpressionInfo &expr, NGHolder &g, max(cc.grey.maxHistoryAvailable, ng.maxSomRevHistoryAvailable)); } - return ng.ssm.addRevNfa(move(nfa), maxWidth); + return ng.ssm.addRevNfa(std::move(nfa), maxWidth); } static diff --git a/src/nfagraph/ng_violet.cpp b/src/nfagraph/ng_violet.cpp index 3e644460..02461e98 100644 --- a/src/nfagraph/ng_violet.cpp +++ b/src/nfagraph/ng_violet.cpp @@ -394,7 +394,7 @@ void getSimpleRoseLiterals(const NGHolder &g, bool seeking_anchored, lits->reserve(lit_info.size()); for (auto &m : lit_info) { - lits->emplace_back(move(m.second)); + lits->emplace_back(std::move(m.second)); } DEBUG_PRINTF("%zu candidate literal sets\n", lits->size()); } @@ -707,11 +707,11 @@ unique_ptr findBestSplit(const NGHolder &g, auto cmp = LitComparator(g, seeking_anchored, seeking_transient, last_chance); - unique_ptr best = move(lits.back()); + unique_ptr best = std::move(lits.back()); lits.pop_back(); while (!lits.empty()) { if (cmp(best, lits.back())) { - best = move(lits.back()); + best = std::move(lits.back()); } lits.pop_back(); } @@ -1621,7 +1621,7 @@ void removeRedundantLiteralsFromPrefixes(RoseInGraph &g, if (delay && delay != MO_INVALID_IDX) { DEBUG_PRINTF("setting delay %u on lhs %p\n", delay, h.get()); - g[e].graph = move(h); + g[e].graph = std::move(h); g[e].graph_lag = delay; } } diff --git a/src/parser/ComponentAlternation.cpp b/src/parser/ComponentAlternation.cpp index f0e5e45a..e38c9ce7 100644 --- a/src/parser/ComponentAlternation.cpp +++ b/src/parser/ComponentAlternation.cpp @@ -103,7 +103,7 @@ void ComponentAlternation::accept(ConstComponentVisitor &v) const { } void ComponentAlternation::append(unique_ptr component) { - children.emplace_back(move(component)); + children.emplace_back(std::move(component)); } vector ComponentAlternation::first() const { diff --git a/src/parser/ComponentCondReference.cpp b/src/parser/ComponentCondReference.cpp index 2a2ed4e0..b6ff44db 100644 --- a/src/parser/ComponentCondReference.cpp +++ b/src/parser/ComponentCondReference.cpp @@ -50,7 +50,7 @@ ComponentCondReference::ComponentCondReference(const string &name) : kind(CONDITION_NAME), ref_id(0), ref_name(name), hasBothBranches(false) {} ComponentCondReference::ComponentCondReference(unique_ptr c) - : kind(CONDITION_ASSERTION), ref_id(0), assertion(move(c)), + : kind(CONDITION_ASSERTION), ref_id(0), assertion(std::move(c)), hasBothBranches(false) {} ComponentCondReference::~ComponentCondReference() {} diff --git a/src/parser/ComponentRepeat.cpp b/src/parser/ComponentRepeat.cpp index 4bd51e1a..7090459f 100644 --- a/src/parser/ComponentRepeat.cpp +++ b/src/parser/ComponentRepeat.cpp @@ -60,7 +60,7 @@ static constexpr u32 MAX_POSITIONS_EXPANDED = 500000; // arbitrarily huge * extent is effectively zero. */ ComponentRepeat::ComponentRepeat(unique_ptr sub_comp_in, u32 min, u32 max, enum RepeatType t) - : type(t), sub_comp(move(sub_comp_in)), m_min(min), m_max(max), + : type(t), sub_comp(std::move(sub_comp_in)), m_min(min), m_max(max), posFirst(GlushkovBuildState::POS_UNINITIALIZED), posLast(GlushkovBuildState::POS_UNINITIALIZED) { assert(sub_comp); @@ -361,7 +361,7 @@ void ComponentRepeat::postSubNotePositionHook() { unique_ptr makeComponentRepeat(unique_ptr sub_comp, u32 min, u32 max, ComponentRepeat::RepeatType t) { - return std::make_unique(move(sub_comp), min, max, t); + return std::make_unique(std::move(sub_comp), min, max, t); } } // namespace ue2 diff --git a/src/parser/ComponentSequence.cpp b/src/parser/ComponentSequence.cpp index fc82c11f..2b78177b 100644 --- a/src/parser/ComponentSequence.cpp +++ b/src/parser/ComponentSequence.cpp @@ -116,7 +116,7 @@ void ComponentSequence::accept(ConstComponentVisitor &v) const { } void ComponentSequence::addComponent(unique_ptr comp) { - children.emplace_back(move(comp)); + children.emplace_back(std::move(comp)); } bool ComponentSequence::addRepeat(u32 min, u32 max, @@ -131,7 +131,7 @@ bool ComponentSequence::addRepeat(u32 min, u32 max, return false; } - children.back() = makeComponentRepeat(move(children.back()), min, max, + children.back() = makeComponentRepeat(std::move(children.back()), min, max, type); assert(children.back()); return true; @@ -144,14 +144,14 @@ void ComponentSequence::addAlternation() { auto seq = std::make_unique(); seq->children.swap(children); - alternation->append(move(seq)); + alternation->append(std::move(seq)); } void ComponentSequence::finalize() { if (alternation) { addAlternation(); assert(children.empty()); - children.emplace_back(move(alternation)); + children.emplace_back(std::move(alternation)); alternation = nullptr; } } diff --git a/src/parser/Parser.rl b/src/parser/Parser.rl index b2006501..ba01511a 100644 --- a/src/parser/Parser.rl +++ b/src/parser/Parser.rl @@ -163,7 +163,7 @@ ComponentSequence *enterSequence(ComponentSequence *parent, assert(child); ComponentSequence *seq = child.get(); - parent->addComponent(move(child)); + parent->addComponent(std::move(child)); return seq; } @@ -175,7 +175,7 @@ void addLiteral(ComponentSequence *currentSeq, char c, const ParseMode &mode) { assert(cc); cc->add(c); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); } else { currentSeq->addComponent(getLiteralComponentClass(c, mode.caseless)); } @@ -190,7 +190,7 @@ void addEscaped(ComponentSequence *currentSeq, unichar accum, assert(cc); cc->add(accum); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); } else { if (accum > 255) { throw LocatedParseError(err_msg); @@ -330,7 +330,7 @@ unichar readUtf8CodePoint4c(const char *s) { PUSH_SEQUENCE; auto seq = std::make_unique(); seq->setCaptureIndex(groupIndex++); - currentSeq = enterSequence(currentSeq, move(seq)); + currentSeq = enterSequence(currentSeq, std::move(seq)); } # enter a NAMED CAPTURING group ( e.g. (?'blah) ) @@ -347,7 +347,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto seq = std::make_unique(); seq->setCaptureIndex(groupIndex++); seq->setCaptureName(label); - currentSeq = enterSequence(currentSeq, move(seq)); + currentSeq = enterSequence(currentSeq, std::move(seq)); } # enter a NON-CAPTURING group where we're modifying flags @@ -724,7 +724,7 @@ unichar readUtf8CodePoint4c(const char *s) { ([^^] ${ fhold; fcall readUCP; }) '}' ${ if (!inCharClass) { // not inside [..] currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }) @@ -735,7 +735,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_C, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -743,7 +743,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_L, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -751,7 +751,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_M, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -759,7 +759,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_N, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -767,7 +767,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_P, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -775,7 +775,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_S, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -783,7 +783,7 @@ unichar readUtf8CodePoint4c(const char *s) { currentCls->add(CLASS_UCP_Z, negated); if (!inCharClass) { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); } fret; }; @@ -1106,7 +1106,7 @@ unichar readUtf8CodePoint4c(const char *s) { ']' => { currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); + currentSeq->addComponent(std::move(currentCls)); inCharClass = false; fgoto main; }; @@ -1163,7 +1163,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint2c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; utf8_3c when is_utf8 => { @@ -1172,7 +1172,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint3c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; utf8_4c when is_utf8 => { @@ -1181,7 +1181,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint4c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; hi_byte when is_utf8 => { @@ -1618,52 +1618,52 @@ unichar readUtf8CodePoint4c(const char *s) { # Word character '\\w' => { auto cc = generateComponent(CLASS_WORD, false, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Non word character '\\W' => { auto cc = generateComponent(CLASS_WORD, true, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Whitespace character '\\s' => { auto cc = generateComponent(CLASS_SPACE, false, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Non whitespace character '\\S' => { auto cc = generateComponent(CLASS_SPACE, true, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Digit character '\\d' => { auto cc = generateComponent(CLASS_DIGIT, false, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Non digit character '\\D' => { auto cc = generateComponent(CLASS_DIGIT, true, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Horizontal whitespace '\\h' => { auto cc = generateComponent(CLASS_HORZ, false, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Not horizontal whitespace '\\H' => { auto cc = generateComponent(CLASS_HORZ, true, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Vertical whitespace '\\v' => { auto cc = generateComponent(CLASS_VERT, false, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; # Not vertical whitespace '\\V' => { auto cc = generateComponent(CLASS_VERT, true, mode); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; '\\p{' => { @@ -1787,7 +1787,7 @@ unichar readUtf8CodePoint4c(const char *s) { ComponentAssertion *a_seq = a.get(); PUSH_SEQUENCE; currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); + std::make_unique(std::move(a))); PUSH_SEQUENCE; currentSeq = a_seq; }; @@ -1798,7 +1798,7 @@ unichar readUtf8CodePoint4c(const char *s) { ComponentAssertion *a_seq = a.get(); PUSH_SEQUENCE; currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); + std::make_unique(std::move(a))); PUSH_SEQUENCE; currentSeq = a_seq; }; @@ -1809,7 +1809,7 @@ unichar readUtf8CodePoint4c(const char *s) { ComponentAssertion *a_seq = a.get(); PUSH_SEQUENCE; currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); + std::make_unique(std::move(a))); PUSH_SEQUENCE; currentSeq = a_seq; }; @@ -1820,7 +1820,7 @@ unichar readUtf8CodePoint4c(const char *s) { ComponentAssertion *a_seq = a.get(); PUSH_SEQUENCE; currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); + std::make_unique(std::move(a))); PUSH_SEQUENCE; currentSeq = a_seq; }; @@ -1861,7 +1861,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint2c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; utf8_3c when is_utf8 => { @@ -1870,7 +1870,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint3c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; utf8_4c when is_utf8 => { @@ -1879,7 +1879,7 @@ unichar readUtf8CodePoint4c(const char *s) { auto cc = getComponentClass(mode); cc->add(readUtf8CodePoint4c(ts)); cc->finalize(); - currentSeq->addComponent(move(cc)); + currentSeq->addComponent(std::move(cc)); }; hi_byte when is_utf8 => { @@ -2024,7 +2024,7 @@ unique_ptr parse(const char *ptr, ParseMode &globalMode) { // Ensure that all references are valid. checkReferences(*rootSeq, groupIndex, groupNames); - return move(rootSeq); + return std::move(rootSeq); } catch (LocatedParseError &error) { if (ts >= ptr && ts <= pe) { error.locate(ts - ptr); diff --git a/src/rose/rose_build_add.cpp b/src/rose/rose_build_add.cpp index 82f0e2e0..5aed21f5 100644 --- a/src/rose/rose_build_add.cpp +++ b/src/rose/rose_build_add.cpp @@ -1780,7 +1780,7 @@ bool RoseBuildImpl::addOutfix(const NGHolder &h) { } if (rdfa) { - outfixes.emplace_back(OutfixInfo(move(rdfa))); + outfixes.emplace_back(OutfixInfo(std::move(rdfa))); } else { outfixes.emplace_back(OutfixInfo(cloneHolder(h))); } diff --git a/src/rose/rose_build_anchored.cpp b/src/rose/rose_build_anchored.cpp index 862740e4..027aefd0 100644 --- a/src/rose/rose_build_anchored.cpp +++ b/src/rose/rose_build_anchored.cpp @@ -144,9 +144,9 @@ void mergeAnchoredDfas(vector> &dfas, for (auto &rdfa : dfas) { u32 start_size = mcclellanStartReachSize(rdfa.get()); if (start_size <= MAX_SMALL_START_REACH) { - small_starts.emplace_back(move(rdfa)); + small_starts.emplace_back(std::move(rdfa)); } else { - big_starts.emplace_back(move(rdfa)); + big_starts.emplace_back(std::move(rdfa)); } } dfas.clear(); @@ -158,10 +158,10 @@ void mergeAnchoredDfas(vector> &dfas, // Rehome our groups into one vector. for (auto &rdfa : small_starts) { - dfas.emplace_back(move(rdfa)); + dfas.emplace_back(std::move(rdfa)); } for (auto &rdfa : big_starts) { - dfas.emplace_back(move(rdfa)); + dfas.emplace_back(std::move(rdfa)); } // Final test: if we've built two DFAs here that are small enough, we can @@ -685,7 +685,7 @@ int finalise_out(RoseBuildImpl &build, const NGHolder &h, if (check_dupe(*out_dfa, build.anchored_nfas[hash], remap)) { return ANCHORED_REMAP; } - build.anchored_nfas[hash].emplace_back(move(out_dfa)); + build.anchored_nfas[hash].emplace_back(std::move(out_dfa)); return ANCHORED_SUCCESS; } @@ -700,7 +700,7 @@ int addAutomaton(RoseBuildImpl &build, const NGHolder &h, ReportID *remap) { auto out_dfa = std::make_unique(NFA_OUTFIX_RAW); if (determinise(autom, out_dfa->states, MAX_DFA_STATES)) { - return finalise_out(build, h, autom, move(out_dfa), remap); + return finalise_out(build, h, autom, std::move(out_dfa), remap); } DEBUG_PRINTF("determinise failed\n"); @@ -767,7 +767,7 @@ void buildSimpleDfas(const RoseBuildImpl &build, const vector &frag_map, rdfa->start_floating = DEAD_STATE; rdfa->alpha_size = autom.alphasize; rdfa->alpha_remap = autom.alpha; - anchored_dfas->emplace_back(move(rdfa)); + anchored_dfas->emplace_back(std::move(rdfa)); } } @@ -784,7 +784,7 @@ vector> getAnchoredDfas(RoseBuildImpl &build, // DFAs that already exist as raw_dfas. for (auto &anch_dfas : build.anchored_nfas) { for (auto &rdfa : anch_dfas.second) { - dfas.emplace_back(move(rdfa)); + dfas.emplace_back(std::move(rdfa)); } } build.anchored_nfas.clear(); @@ -834,7 +834,7 @@ size_t buildNfas(vector &anchored_dfas, assert(nfa->length); total_size += ROUNDUP_CL(sizeof(anchored_matcher_info) + nfa->length); - nfas->emplace_back(move(nfa)); + nfas->emplace_back(std::move(nfa)); } // We no longer need to keep the raw_dfa structures around. @@ -861,7 +861,7 @@ vector buildAnchoredDfas(RoseBuildImpl &build, dfas.reserve(anch_dfas.size()); for (auto &rdfa : anch_dfas) { assert(rdfa); - dfas.emplace_back(move(*rdfa)); + dfas.emplace_back(std::move(*rdfa)); } return dfas; } diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index fb2d50a5..06f36582 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -701,9 +701,9 @@ buildSuffix(const ReportManager &rm, const SomSlotManager &ssm, auto d = getDfa(*rdfa, false, cc, rm); assert(d); if (cc.grey.roseMcClellanSuffix != 2) { - n = pickImpl(move(d), move(n), fast_nfa); + n = pickImpl(std::move(d), std::move(n), fast_nfa); } else { - n = move(d); + n = std::move(d); } assert(n); @@ -853,7 +853,7 @@ bytecode_ptr makeLeftNfa(const RoseBuildImpl &tbi, left_id &left, if (rdfa) { auto d = getDfa(*rdfa, is_transient, cc, rm); assert(d); - n = pickImpl(move(d), move(n), fast_nfa); + n = pickImpl(std::move(d), std::move(n), fast_nfa); } } @@ -1422,12 +1422,12 @@ void buildExclusiveInfixes(RoseBuildImpl &build, build_context &bc, setLeftNfaProperties(*n, leftfix); ExclusiveSubengine engine; - engine.nfa = move(n); + engine.nfa = std::move(n); engine.vertices = verts; - info.subengines.emplace_back(move(engine)); + info.subengines.emplace_back(std::move(engine)); } info.queue = qif.get_queue(); - exclusive_info.emplace_back(move(info)); + exclusive_info.emplace_back(std::move(info)); } updateExclusiveInfixProperties(build, exclusive_info, bc.leftfix_info, no_retrigger_queues); @@ -1649,7 +1649,7 @@ public: if (rdfa) { auto d = getDfa(*rdfa, false, cc, rm); if (d) { - n = pickImpl(move(d), move(n), fast_nfa); + n = pickImpl(std::move(d), std::move(n), fast_nfa); } } } @@ -1864,15 +1864,15 @@ void buildExclusiveSuffixes(RoseBuildImpl &build, build_context &bc, setSuffixProperties(*n, s, build.rm); ExclusiveSubengine engine; - engine.nfa = move(n); + engine.nfa = std::move(n); engine.vertices = verts; - info.subengines.emplace_back(move(engine)); + info.subengines.emplace_back(std::move(engine)); const auto &reports = all_reports(s); info.reports.insert(reports.begin(), reports.end()); } info.queue = qif.get_queue(); - exclusive_info.emplace_back(move(info)); + exclusive_info.emplace_back(std::move(info)); } updateExclusiveSuffixProperties(build, exclusive_info, no_retrigger_queues); @@ -2416,7 +2416,7 @@ u32 writeProgram(build_context &bc, RoseProgram &&program) { u32 offset = bc.engine_blob.add(prog_bytecode); DEBUG_PRINTF("prog len %zu written at offset %u\n", prog_bytecode.size(), offset); - bc.program_cache.emplace(move(program), offset); + bc.program_cache.emplace(std::move(program), offset); return offset; } @@ -2581,13 +2581,13 @@ void makeBoundaryPrograms(const RoseBuildImpl &build, build_context &bc, DEBUG_PRINTF("report ^$: %zu\n", dboundary.report_at_0_eod_full.size()); auto eod_prog = makeBoundaryProgram(build, boundary.report_at_eod); - out.reportEodOffset = writeProgram(bc, move(eod_prog)); + out.reportEodOffset = writeProgram(bc, std::move(eod_prog)); auto zero_prog = makeBoundaryProgram(build, boundary.report_at_0); - out.reportZeroOffset = writeProgram(bc, move(zero_prog)); + out.reportZeroOffset = writeProgram(bc, std::move(zero_prog)); auto zeod_prog = makeBoundaryProgram(build, dboundary.report_at_0_eod_full); - out.reportZeroEodOffset = writeProgram(bc, move(zeod_prog)); + out.reportZeroEodOffset = writeProgram(bc, std::move(zeod_prog)); } static @@ -2752,10 +2752,10 @@ RoseProgram makeFragmentProgram(const RoseBuildImpl &build, build_context &bc, for (const auto &lit_id : lit_ids) { auto prog = makeLiteralProgram(build, bc, prog_build, lit_id, lit_edge_map, false); - blocks.emplace_back(move(prog)); + blocks.emplace_back(std::move(prog)); } - return assembleProgramBlocks(move(blocks)); + return assembleProgramBlocks(std::move(blocks)); } /** @@ -2865,7 +2865,7 @@ vector groupByFragment(const RoseBuildImpl &build) { auto &fi = m.second; DEBUG_PRINTF("frag %s -> ids: %s\n", dumpString(m.first.s).c_str(), as_string_list(fi.lit_ids).c_str()); - fragments.emplace_back(frag_id, lit.s, fi.groups, move(fi.lit_ids)); + fragments.emplace_back(frag_id, lit.s, fi.groups, std::move(fi.lit_ids)); frag_id++; assert(frag_id == fragments.size()); } @@ -2981,7 +2981,7 @@ void buildFragmentPrograms(const RoseBuildImpl &build, child_offset); addIncludedJumpProgram(lit_prog, child_offset, pfrag.squash); } - pfrag.lit_program_offset = writeProgram(bc, move(lit_prog)); + pfrag.lit_program_offset = writeProgram(bc, std::move(lit_prog)); // We only do delayed rebuild in streaming mode. if (!build.cc.streaming) { @@ -3001,7 +3001,7 @@ void buildFragmentPrograms(const RoseBuildImpl &build, addIncludedJumpProgram(rebuild_prog, child_offset, pfrag.delay_squash); } - pfrag.delay_program_offset = writeProgram(bc, move(rebuild_prog)); + pfrag.delay_program_offset = writeProgram(bc, std::move(rebuild_prog)); } } @@ -3090,7 +3090,7 @@ pair writeDelayPrograms(const RoseBuildImpl &build, auto prog = makeLiteralProgram(build, bc, prog_build, delayed_lit_id, lit_edge_map, false); - u32 offset = writeProgram(bc, move(prog)); + u32 offset = writeProgram(bc, std::move(prog)); u32 delay_id; auto it = cache.find(offset); @@ -3150,7 +3150,7 @@ pair writeAnchoredPrograms(const RoseBuildImpl &build, auto prog = makeLiteralProgram(build, bc, prog_build, lit_id, lit_edge_map, true); - u32 offset = writeProgram(bc, move(prog)); + u32 offset = writeProgram(bc, std::move(prog)); DEBUG_PRINTF("lit_id=%u -> anch prog at %u\n", lit_id, offset); u32 anch_id; @@ -3210,7 +3210,7 @@ pair buildReportPrograms(const RoseBuildImpl &build, for (ReportID id : reports) { auto program = makeReportProgram(build, bc.needs_mpv_catchup, id); - u32 offset = writeProgram(bc, move(program)); + u32 offset = writeProgram(bc, std::move(program)); programs.emplace_back(offset); build.rm.setProgramOffset(id, offset); DEBUG_PRINTF("program for report %u @ %u (%zu instructions)\n", id, @@ -3326,7 +3326,7 @@ void addEodEventProgram(const RoseBuildImpl &build, build_context &bc, bc.roleStateIndices, prog_build, build.eod_event_literal_id, edge_list, false); - program.add_block(move(block)); + program.add_block(std::move(block)); } static @@ -3715,7 +3715,7 @@ bytecode_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { drproto.get(), eproto.get(), sbproto.get()); auto eod_prog = makeEodProgram(*this, bc, prog_build, eodNfaIterOffset); - proto.eodProgramOffset = writeProgram(bc, move(eod_prog)); + proto.eodProgramOffset = writeProgram(bc, std::move(eod_prog)); size_t longLitStreamStateRequired = 0; proto.longLitTableOffset @@ -3734,11 +3734,11 @@ bytecode_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { writeLogicalInfo(rm, bc.engine_blob, proto); auto flushComb_prog = makeFlushCombProgram(proto); - proto.flushCombProgramOffset = writeProgram(bc, move(flushComb_prog)); + proto.flushCombProgramOffset = writeProgram(bc, std::move(flushComb_prog)); auto lastFlushComb_prog = makeLastFlushCombProgram(proto); proto.lastFlushCombProgramOffset = - writeProgram(bc, move(lastFlushComb_prog)); + writeProgram(bc, std::move(lastFlushComb_prog)); // Build anchored matcher. auto atable = buildAnchoredMatcher(*this, fragments, anchored_dfas); @@ -3882,7 +3882,7 @@ bytecode_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { bc.engine_blob.write_bytes(engine.get()); // Add a small write engine if appropriate. - engine = addSmallWriteEngine(*this, bc.resources, move(engine)); + engine = addSmallWriteEngine(*this, bc.resources, std::move(engine)); DEBUG_PRINTF("rose done %p\n", engine.get()); diff --git a/src/rose/rose_build_compile.cpp b/src/rose/rose_build_compile.cpp index 75b76acf..e67c9149 100644 --- a/src/rose/rose_build_compile.cpp +++ b/src/rose/rose_build_compile.cpp @@ -1782,7 +1782,7 @@ bytecode_ptr RoseBuildImpl::buildRose(u32 minWidth) { /* transfer mpv outfix to main queue */ if (mpv_outfix) { - outfixes.emplace_back(move(*mpv_outfix)); + outfixes.emplace_back(std::move(*mpv_outfix)); mpv_outfix = nullptr; } diff --git a/src/rose/rose_build_convert.cpp b/src/rose/rose_build_convert.cpp index 992311da..c89c6ddd 100644 --- a/src/rose/rose_build_convert.cpp +++ b/src/rose/rose_build_convert.cpp @@ -212,7 +212,7 @@ void convertFloodProneSuffix(RoseBuildImpl &tbi, RoseVertex v, u32 lit_id, // Apply the NFA. assert(!g[v].suffix); - g[v].suffix.graph = move(h); + g[v].suffix.graph = std::move(h); g[v].reports.clear(); // Swap v's literal for a shorter one. diff --git a/src/rose/rose_build_lookaround.cpp b/src/rose/rose_build_lookaround.cpp index c2e2bdf8..88e8d474 100644 --- a/src/rose/rose_build_lookaround.cpp +++ b/src/rose/rose_build_lookaround.cpp @@ -464,7 +464,7 @@ void findFloodReach(const RoseBuildImpl &tbi, const RoseVertex v, namespace { struct LookProto { LookProto(s32 offset_in, CharReach reach_in) - : offset(offset_in), reach(move(reach_in)) {} + : offset(offset_in), reach(std::move(reach_in)) {} s32 offset; CharReach reach; }; diff --git a/src/rose/rose_build_matchers.cpp b/src/rose/rose_build_matchers.cpp index ba141d35..96cdfbe5 100644 --- a/src/rose/rose_build_matchers.cpp +++ b/src/rose/rose_build_matchers.cpp @@ -738,7 +738,7 @@ void addFragmentLiteral(const RoseBuildImpl &build, MatcherProto &mp, const auto &groups = f.groups; - mp.lits.emplace_back(move(s_final), nocase, noruns, f.fragment_id, + mp.lits.emplace_back(std::move(s_final), nocase, noruns, f.fragment_id, groups, msk, cmp); } @@ -936,7 +936,7 @@ buildFloatingMatcherProto(const RoseBuildImpl &build, throw CompileError("Unable to generate literal matcher proto."); } - return std::make_unique(move(proto), mp.accel_lits); + return std::make_unique(std::move(proto), mp.accel_lits); } unique_ptr @@ -964,7 +964,7 @@ buildDelayRebuildMatcherProto(const RoseBuildImpl &build, throw CompileError("Unable to generate literal matcher proto."); } - return std::make_unique(move(proto), mp.accel_lits); + return std::make_unique(std::move(proto), mp.accel_lits); } unique_ptr @@ -1021,7 +1021,7 @@ buildSmallBlockMatcherProto(const RoseBuildImpl &build, throw CompileError("Unable to generate literal matcher proto."); } - return std::make_unique(move(proto), mp.accel_lits); + return std::make_unique(std::move(proto), mp.accel_lits); } unique_ptr @@ -1046,7 +1046,7 @@ buildEodAnchoredMatcherProto(const RoseBuildImpl &build, throw CompileError("Unable to generate literal matcher proto."); } - return std::make_unique(move(proto), mp.accel_lits); + return std::make_unique(std::move(proto), mp.accel_lits); } } // namespace ue2 diff --git a/src/rose/rose_build_merge.cpp b/src/rose/rose_build_merge.cpp index bb6b7d2d..cddbb760 100644 --- a/src/rose/rose_build_merge.cpp +++ b/src/rose/rose_build_merge.cpp @@ -1442,7 +1442,7 @@ void mergeLeftfixesVariableLag(RoseBuildImpl &build) { vector> chunks; for (auto &raw_group : engine_groups | map_values) { - chunk(move(raw_group), &chunks, MERGE_GROUP_SIZE_MAX); + chunk(std::move(raw_group), &chunks, MERGE_GROUP_SIZE_MAX); } engine_groups.clear(); @@ -1511,7 +1511,7 @@ namespace { struct DedupeLeftKey { DedupeLeftKey(const RoseBuildImpl &build, flat_set> preds_in, const left_id &left) - : left_hash(hashLeftfix(left)), preds(move(preds_in)), + : left_hash(hashLeftfix(left)), preds(std::move(preds_in)), transient(contains(build.transient, left)) { } @@ -1599,7 +1599,7 @@ void dedupeLeftfixesVariableLag(RoseBuildImpl &build) { continue; } } - engine_groups[DedupeLeftKey(build, move(preds), left)].emplace_back(left); + engine_groups[DedupeLeftKey(build, std::move(preds), left)].emplace_back(left); } /* We don't bother chunking as we expect deduping to be successful if the @@ -2048,7 +2048,7 @@ void mergeCastleLeftfixes(RoseBuildImpl &build) { vector> chunks; for (auto &raw_group : by_reach | map_values) { - chunk(move(raw_group), &chunks, MERGE_CASTLE_GROUP_SIZE_MAX); + chunk(std::move(raw_group), &chunks, MERGE_CASTLE_GROUP_SIZE_MAX); } by_reach.clear(); @@ -2429,7 +2429,7 @@ void pairwiseDfaMerge(vector &dfas, RawDfa *dfa_ptr = rdfa.get(); dfa_mapping[dfa_ptr] = dfa_mapping[*it]; dfa_mapping.erase(*it); - winner.proto = move(rdfa); + winner.proto = std::move(rdfa); mergeOutfixInfo(winner, victim); @@ -2546,7 +2546,7 @@ void mergeOutfixCombo(RoseBuildImpl &tbi, const ReportManager &rm, // Transform this outfix into a DFA and add it to the merge set. dfa_mapping[rdfa.get()] = it - tbi.outfixes.begin(); dfas.emplace_back(rdfa.get()); - outfix.proto = move(rdfa); + outfix.proto = std::move(rdfa); new_dfas++; } } diff --git a/src/rose/rose_build_program.cpp b/src/rose/rose_build_program.cpp index 8e179e36..1e0fe24b 100644 --- a/src/rose/rose_build_program.cpp +++ b/src/rose/rose_build_program.cpp @@ -135,7 +135,7 @@ RoseProgram::iterator RoseProgram::insert(RoseProgram::iterator it, assert(it != end()); assert(prog.back()->code() == ROSE_INSTR_END); - return prog.insert(it, move(ri)); + return prog.insert(it, std::move(ri)); } RoseProgram::iterator RoseProgram::insert(RoseProgram::iterator it, @@ -183,7 +183,7 @@ void RoseProgram::add_before_end(RoseProgram &&block) { return; } - insert(prev(prog.end()), move(block)); + insert(prev(prog.end()), std::move(block)); } void RoseProgram::add_block(RoseProgram &&block) { @@ -209,7 +209,7 @@ void RoseProgram::replace(Iter it, std::unique_ptr ri) { assert(!prog.empty()); const RoseInstruction *old_ptr = it->get(); - *it = move(ri); + *it = std::move(ri); update_targets(prog.begin(), prog.end(), old_ptr, it->get()); } @@ -307,19 +307,19 @@ void addEnginesEodProgram(u32 eodNfaIterOffset, RoseProgram &program) { RoseProgram block; block.add_before_end(std::make_unique(eodNfaIterOffset)); - program.add_block(move(block)); + program.add_block(std::move(block)); } void addSuffixesEodProgram(RoseProgram &program) { RoseProgram block; block.add_before_end(std::make_unique()); - program.add_block(move(block)); + program.add_block(std::move(block)); } void addMatcherEodProgram(RoseProgram &program) { RoseProgram block; block.add_before_end(std::make_unique()); - program.add_block(move(block)); + program.add_block(std::move(block)); } void addFlushCombinationProgram(RoseProgram &program) { @@ -359,7 +359,7 @@ void makeRoleCheckLeftfix(const RoseBuildImpl &build, build.g[v].left.leftfix_report, end_inst); } - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -394,7 +394,7 @@ void makeAnchoredLiteralDelay(const RoseBuildImpl &build, const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(groups, anch_id, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -404,7 +404,7 @@ void makeDedupe(const ReportManager &rm, const Report &report, auto ri = std::make_unique(report.quashSom, rm.getDkey(report), report.offsetAdjust, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -414,7 +414,7 @@ void makeDedupeSom(const ReportManager &rm, const Report &report, auto ri = std::make_unique(report.quashSom, rm.getDkey(report), report.offsetAdjust, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -522,11 +522,11 @@ void addLogicalSetRequired(const Report &report, ReportManager &rm, // set matching status of current lkey auto risl = std::make_unique(report.lkey, report.offsetAdjust); - program.add_before_end(move(risl)); + program.add_before_end(std::move(risl)); // set current lkey's corresponding ckeys active, pending to check for (auto ckey : rm.getRelateCKeys(report.lkey)) { auto risc = std::make_unique(ckey); - program.add_before_end(move(risc)); + program.add_before_end(std::move(risc)); } } @@ -543,14 +543,14 @@ void makeReport(const RoseBuildImpl &build, const ReportID id, if (report.minOffset > 0 || report.maxOffset < MAX_OFFSET) { auto ri = std::make_unique(report.minOffset, report.maxOffset, end_inst); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } // If this report has an exhaustion key, we can check it in the program // rather than waiting until we're in the callback adaptor. if (report.ekey != INVALID_EKEY) { auto ri = std::make_unique(report.ekey, end_inst); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } // External SOM reports that aren't passthrough need their SOM value @@ -559,7 +559,7 @@ void makeReport(const RoseBuildImpl &build, const ReportID id, report.type != EXTERNAL_CALLBACK_SOM_PASS) { auto ri = std::make_unique(); writeSomOperation(report, &ri->som); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } // Min length constraint. @@ -567,7 +567,7 @@ void makeReport(const RoseBuildImpl &build, const ReportID id, assert(build.hasSom); auto ri = std::make_unique( report.offsetAdjust, report.minLength, end_inst); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } if (report.quashSom) { @@ -650,11 +650,11 @@ void makeReport(const RoseBuildImpl &build, const ReportID id, if (has_som) { auto ri = std::make_unique(); writeSomOperation(report, &ri->som); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } else { auto ri = std::make_unique(); writeSomOperation(report, &ri->som); - report_block.add_before_end(move(ri)); + report_block.add_before_end(std::move(ri)); } break; case INTERNAL_ROSE_CHAIN: { @@ -715,7 +715,7 @@ void makeReport(const RoseBuildImpl &build, const ReportID id, throw CompileError("Unable to generate bytecode."); } - program.add_block(move(report_block)); + program.add_block(std::move(report_block)); } static @@ -745,7 +745,7 @@ void makeRoleReports(const RoseBuildImpl &build, for (ReportID id : g[v].reports) { makeReport(build, id, report_som, report_block); } - program.add_before_end(move(report_block)); + program.add_before_end(std::move(report_block)); } static @@ -816,7 +816,7 @@ void makeCheckLiteralInstruction(const rose_literal_id &lit, ri = std::make_unique(lit.s.get_string(), end_inst); } - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return; } @@ -834,7 +834,7 @@ void makeCheckLiteralInstruction(const rose_literal_id &lit, } else { ri = std::make_unique(lit.s.get_string(), end_inst); } - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -850,7 +850,7 @@ void makeRoleCheckNotHandled(ProgramBuild &prog_build, RoseVertex v, const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(handled_key, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -979,7 +979,7 @@ bool makeRoleByte(const vector &look, RoseProgram &program) { const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(andmask_u8, cmpmask_u8, flip, checkbyte_offset, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return true; } return false; @@ -1011,7 +1011,7 @@ bool makeRoleMask(const vector &look, RoseProgram &program) { const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(and_mask, cmp_mask, neg_mask, base_offset, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return true; } return false; @@ -1066,7 +1066,7 @@ bool makeRoleMask32(const vector &look, const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(and_mask, cmp_mask, neg_mask, base_offset, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return true; } @@ -1109,7 +1109,7 @@ bool makeRoleMask64(const vector &look, const auto *end_inst = program.end_instruction(); auto ri = std::make_unique(and_mask, cmp_mask, neg_mask, base_offset, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return true; } @@ -1474,7 +1474,7 @@ bool makeRoleShufti(const vector &look, RoseProgram &program, } } assert(ri); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return true; } @@ -1497,7 +1497,7 @@ void makeLookaroundInstruction(const vector &look, const CharReach &reach = look.begin()->reach; auto ri = std::make_unique(offset, reach, program.end_instruction()); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); return; } @@ -1519,7 +1519,7 @@ void makeLookaroundInstruction(const vector &look, auto ri = std::make_unique(look, program.end_instruction()); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -1774,7 +1774,7 @@ bool makeRoleMultipathShufti(const vector> &multi_look, auto ri = std::make_unique (nib_mask, bucket_select_lo, data_select_mask, hi_bits_mask, lo_bits_mask, neg_mask, base_offset, last_start, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } else if (multi_len == 32) { neg_mask &= 0xffffffff; assert(!(hi_bits_mask & ~0xffffffffULL)); @@ -1784,20 +1784,20 @@ bool makeRoleMultipathShufti(const vector> &multi_look, (hi_mask, lo_mask, bucket_select_lo, data_select_mask, hi_bits_mask, lo_bits_mask, neg_mask, base_offset, last_start, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } else { auto ri = std::make_unique (hi_mask, lo_mask, bucket_select_hi, bucket_select_lo, data_select_mask, hi_bits_mask, lo_bits_mask, neg_mask, base_offset, last_start, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } } else { auto ri = std::make_unique (hi_mask, lo_mask, bucket_select_lo, data_select_mask, hi_bits_mask, lo_bits_mask, neg_mask, base_offset, last_start, end_inst); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } return true; } @@ -1865,10 +1865,10 @@ void makeRoleMultipathLookaround(const vector> &multi_look, ordered_look.emplace_back(multi_entry); } - auto ri = std::make_unique(move(ordered_look), + auto ri = std::make_unique(std::move(ordered_look), last_start, start_mask, program.end_instruction()); - program.add_before_end(move(ri)); + program.add_before_end(std::move(ri)); } static @@ -1893,7 +1893,7 @@ void makeRoleLookaround(const RoseBuildImpl &build, vector look; vector look_more; if (!looks.empty()) { - look = move(looks.front()); + look = std::move(looks.front()); } findLookaroundMasks(build, v, look_more); mergeLookaround(look, look_more); @@ -2001,7 +2001,7 @@ void makeRoleInfixTriggers(const RoseBuildImpl &build, triggers.emplace_back(g[e].rose_cancel_prev_top, lbi.queue, top); } - addInfixTriggerInstructions(move(triggers), program); + addInfixTriggerInstructions(std::move(triggers), program); } @@ -2063,7 +2063,7 @@ void makeRoleEagerEodReports(const RoseBuildImpl &build, RoseProgram block; makeRoleReports(build, leftfix_info, needs_catchup, target(e, build.g), block); - eod_program.add_block(move(block)); + eod_program.add_block(std::move(block)); } } @@ -2077,7 +2077,7 @@ void makeRoleEagerEodReports(const RoseBuildImpl &build, addCheckOnlyEodInstruction(program); } - program.add_before_end(move(eod_program)); + program.add_before_end(std::move(eod_program)); } /** Makes a program for a role/vertex given a specific pred/in_edge. */ @@ -2124,33 +2124,33 @@ RoseProgram makeRoleProgram(const RoseBuildImpl &build, RoseProgram reports_block; makeRoleReports(build, leftfix_info, prog_build.needs_catchup, v, reports_block); - effects_block.add_block(move(reports_block)); + effects_block.add_block(std::move(reports_block)); RoseProgram infix_block; makeRoleInfixTriggers(build, leftfix_info, engine_info_by_queue, v, infix_block); - effects_block.add_block(move(infix_block)); + effects_block.add_block(std::move(infix_block)); // Note: SET_GROUPS instruction must be after infix triggers, as an infix // going dead may switch off groups. RoseProgram groups_block; makeRoleGroups(build.g, prog_build, v, groups_block); - effects_block.add_block(move(groups_block)); + effects_block.add_block(std::move(groups_block)); RoseProgram suffix_block; makeRoleSuffix(build, suffixes, engine_info_by_queue, v, suffix_block); - effects_block.add_block(move(suffix_block)); + effects_block.add_block(std::move(suffix_block)); RoseProgram state_block; makeRoleSetState(roleStateIndices, v, state_block); - effects_block.add_block(move(state_block)); + effects_block.add_block(std::move(state_block)); // Note: EOD eager reports may generate a CHECK_ONLY_EOD instruction (if // the program doesn't have one already). RoseProgram eod_block; makeRoleEagerEodReports(build, leftfix_info, prog_build.needs_catchup, v, eod_block); - effects_block.add_block(move(eod_block)); + effects_block.add_block(std::move(eod_block)); /* a 'ghost role' may do nothing if we know that its groups are already set * - in this case we can avoid producing a program at all. */ @@ -2158,7 +2158,7 @@ RoseProgram makeRoleProgram(const RoseBuildImpl &build, return {}; } - program.add_before_end(move(effects_block)); + program.add_before_end(std::move(effects_block)); return program; } @@ -2204,7 +2204,7 @@ RoseProgram assembleProgramBlocks(vector &&blocks_in) { continue; } - blocks.emplace_back(move(block)); + blocks.emplace_back(std::move(block)); seen.emplace(blocks.back()); } @@ -2219,10 +2219,10 @@ RoseProgram assembleProgramBlocks(vector &&blocks_in) { if (!prog.empty() && reads_work_done_flag(block)) { RoseProgram clear_block; clear_block.add_before_end(std::make_unique()); - prog.add_block(move(clear_block)); + prog.add_block(std::move(clear_block)); } - prog.add_block(move(block)); + prog.add_block(std::move(block)); } return prog; @@ -2265,7 +2265,7 @@ RoseProgram makeLiteralProgram(const RoseBuildImpl &build, engine_info_by_queue, roleStateIndices, prog_build, e); if (!role_prog.empty()) { - pred_blocks[pred_state].add_block(move(role_prog)); + pred_blocks[pred_state].add_block(std::move(role_prog)); } } @@ -2284,7 +2284,7 @@ RoseProgram makeLiteralProgram(const RoseBuildImpl &build, auto role_prog = makeRoleProgram(build, leftfix_info, suffixes, engine_info_by_queue, roleStateIndices, prog_build, e); - role_programs.add_block(move(role_prog)); + role_programs.add_block(std::move(role_prog)); } if (lit_id == build.eod_event_literal_id) { @@ -2299,8 +2299,8 @@ RoseProgram makeLiteralProgram(const RoseBuildImpl &build, // Literal may squash groups. makeGroupSquashInstruction(build, lit_id, unconditional_block); - role_programs.add_block(move(unconditional_block)); - lit_program.add_before_end(move(role_programs)); + role_programs.add_block(std::move(unconditional_block)); + lit_program.add_before_end(std::move(role_programs)); return lit_program; } @@ -2331,10 +2331,10 @@ RoseProgram makeDelayRebuildProgram(const RoseBuildImpl &build, makePushDelayedInstructions(build.literals, prog_build, build.literal_info.at(lit_id).delayed_ids, prog); - blocks.emplace_back(move(prog)); + blocks.emplace_back(std::move(prog)); } - return assembleProgramBlocks(move(blocks)); + return assembleProgramBlocks(std::move(blocks)); } RoseProgram makeEodAnchorProgram(const RoseBuildImpl &build, @@ -2361,7 +2361,7 @@ RoseProgram makeEodAnchorProgram(const RoseBuildImpl &build, for (const auto &id : g[v].reports) { makeReport(build, id, has_som, report_block); } - program.add_before_end(move(report_block)); + program.add_before_end(std::move(report_block)); return program; } @@ -2413,7 +2413,7 @@ void addIncludedJumpProgram(RoseProgram &program, u32 child_offset, RoseProgram block; block.add_before_end(std::make_unique(child_offset, squash)); - program.add_block(move(block)); + program.add_block(std::move(block)); } static @@ -2423,7 +2423,7 @@ void addPredBlockSingle(u32 pred_state, RoseProgram &pred_block, const auto *end_inst = pred_block.end_instruction(); pred_block.insert(begin(pred_block), std::make_unique(pred_state, end_inst)); - program.add_block(move(pred_block)); + program.add_block(std::move(pred_block)); } static @@ -2438,7 +2438,7 @@ void addPredBlocksAny(map &pred_blocks, u32 num_states, const RoseInstruction *end_inst = sparse_program.end_instruction(); auto ri = std::make_unique(num_states, keys, end_inst); - sparse_program.add_before_end(move(ri)); + sparse_program.add_before_end(std::move(ri)); RoseProgram &block = pred_blocks.begin()->second; @@ -2446,8 +2446,8 @@ void addPredBlocksAny(map &pred_blocks, u32 num_states, * blocks are being collapsed together */ stripCheckHandledInstruction(block); - sparse_program.add_before_end(move(block)); - program.add_block(move(sparse_program)); + sparse_program.add_before_end(std::move(block)); + program.add_block(std::move(sparse_program)); } static @@ -2462,14 +2462,14 @@ void addPredBlocksMulti(map &pred_blocks, // BEGIN instruction. auto ri_begin = std::make_unique(num_states, end_inst); RoseInstrSparseIterBegin *begin_inst = ri_begin.get(); - sparse_program.add_before_end(move(ri_begin)); + sparse_program.add_before_end(std::move(ri_begin)); // NEXT instructions, one per pred program. u32 prev_key = pred_blocks.begin()->first; for (auto it = next(begin(pred_blocks)); it != end(pred_blocks); ++it) { auto ri = std::make_unique(prev_key, begin_inst, end_inst); - sparse_program.add_before_end(move(ri)); + sparse_program.add_before_end(std::move(ri)); prev_key = it->first; } @@ -2483,7 +2483,7 @@ void addPredBlocksMulti(map &pred_blocks, assert(dynamic_cast(out_it->get()) || dynamic_cast(out_it->get())); - out_it = sparse_program.insert(++out_it, move(flat_prog)); + out_it = sparse_program.insert(++out_it, std::move(flat_prog)); // Jump table target for this key is the beginning of the block we just // spliced in. @@ -2495,9 +2495,9 @@ void addPredBlocksMulti(map &pred_blocks, } // Write the jump table back into the SPARSE_ITER_BEGIN instruction. - begin_inst->jump_table = move(jump_table); + begin_inst->jump_table = std::move(jump_table); - program.add_block(move(sparse_program)); + program.add_block(std::move(sparse_program)); } void addPredBlocks(map &pred_blocks, u32 num_states, diff --git a/src/som/slot_manager.cpp b/src/som/slot_manager.cpp index 9984d836..33b8d503 100644 --- a/src/som/slot_manager.cpp +++ b/src/som/slot_manager.cpp @@ -242,7 +242,7 @@ u32 SomSlotManager::numSomSlots() const { u32 SomSlotManager::addRevNfa(bytecode_ptr nfa, u32 maxWidth) { u32 rv = verify_u32(rev_nfas.size()); - rev_nfas.emplace_back(move(nfa)); + rev_nfas.emplace_back(std::move(nfa)); // A rev nfa commits us to having enough history around to handle its // max width. diff --git a/src/util/clique.cpp b/src/util/clique.cpp index a8195d0c..19daed3c 100644 --- a/src/util/clique.cpp +++ b/src/util/clique.cpp @@ -74,7 +74,7 @@ vector findCliqueGroup(CliqueGraph &cg) { // Get the vertex to start from vector clique; while (!gStack.empty()) { - vector g = move(gStack.top()); + vector g = std::move(gStack.top()); gStack.pop(); // Choose a vertex from the graph diff --git a/tools/hsbench/engine_hyperscan.cpp b/tools/hsbench/engine_hyperscan.cpp index 7fb98745..0256dc97 100644 --- a/tools/hsbench/engine_hyperscan.cpp +++ b/tools/hsbench/engine_hyperscan.cpp @@ -174,7 +174,7 @@ unique_ptr EngineHyperscan::streamOpen(EngineContext &ectx, return nullptr; } stream->sn = streamId; - return move(stream); + return std::move(stream); } void EngineHyperscan::streamClose(unique_ptr stream, diff --git a/tools/hsbench/main.cpp b/tools/hsbench/main.cpp index 6d091d38..1a19d510 100644 --- a/tools/hsbench/main.cpp +++ b/tools/hsbench/main.cpp @@ -111,7 +111,7 @@ public: thread_barrier &tb_in, thread_func_t function_in, vector corpus_data_in) : num(num_in), results(repeats), engine(db_in), - enginectx(db_in.makeContext()), corpus_data(move(corpus_data_in)), + enginectx(db_in.makeContext()), corpus_data(std::move(corpus_data_in)), tb(tb_in), function(function_in) {} // Start the thread. @@ -219,7 +219,7 @@ void usage(const char *error) { /** Wraps up a name and the set of signature IDs it refers to. */ struct BenchmarkSigs { BenchmarkSigs(string name_in, SignatureSet sigs_in) - : name(move(name_in)), sigs(move(sigs_in)) {} + : name(std::move(name_in)), sigs(std::move(sigs_in)) {} string name; SignatureSet sigs; }; @@ -457,7 +457,7 @@ void processArgs(int argc, char *argv[], vector &sigSets, for (const auto &file : sigFiles) { SignatureSet sigs; loadSignatureList(file, sigs); - sigSets.emplace_back(file, move(sigs)); + sigSets.emplace_back(file, std::move(sigs)); } useLiteralApi = (bool)literalFlag; @@ -590,7 +590,7 @@ void benchStreamingInternal(ThreadContext *ctx, vector &streams, // if this was the last block in the stream, close the stream handle if (b.id == stream.last_block_id) { - e.streamClose(move(stream.eng_handle), r); + e.streamClose(std::move(stream.eng_handle), r); stream.eng_handle = nullptr; } } @@ -963,7 +963,7 @@ void runBenchmark(const Engine &db, printf("Unable to start processing thread %u\n", i); exit(1); } - threads.push_back(move(t)); + threads.push_back(std::move(t)); } // Reap threads. @@ -1011,7 +1011,7 @@ int HS_CDECL main(int argc, char *argv[]) { for (auto i : exprMapTemplate | map_keys) { sigs.push_back(i); } - sigSets.emplace_back(exprPath, move(sigs)); + sigSets.emplace_back(exprPath, std::move(sigs)); } // read in and process our corpus From db7b23a46813ffad126566c4a3ae2231b76f561b Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 3 Oct 2023 21:01:35 +0300 Subject: [PATCH 03/43] move definition of RAGEL_C_FLAGS earlier to catch tools/hscollider --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a54233a..b821472a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -567,6 +567,8 @@ if (CORRECT_PCRE_VERSION AND PCRE_BUILD_SOURCE AND BUILD_STATIC_LIBS) set(BUILD_CHIMERA TRUE) endif() +set(RAGEL_C_FLAGS "-Wno-unused -funsigned-char") + add_subdirectory(unit) if (EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt) add_subdirectory(tools) @@ -593,8 +595,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") endif() -set(RAGEL_C_FLAGS "-Wno-unused -funsigned-char") - set_source_files_properties( ${CMAKE_BINARY_DIR}/src/parser/Parser.cpp PROPERTIES From 9a174745e4b2467944f5bfcccf887268bad37f0e Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 3 Oct 2023 21:01:51 +0300 Subject: [PATCH 04/43] more std::move fixes --- tools/hscollider/GraphTruth.cpp | 4 ++-- tools/hscollider/NfaGeneratedCorpora.cpp | 2 +- tools/hscollider/UltimateTruth.cpp | 2 +- tools/hscollider/main.cpp | 20 ++++++++++---------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/hscollider/GraphTruth.cpp b/tools/hscollider/GraphTruth.cpp index 6069ff5c..bd18d655 100644 --- a/tools/hscollider/GraphTruth.cpp +++ b/tools/hscollider/GraphTruth.cpp @@ -133,7 +133,7 @@ void CNGInfo::compile() { auto pl = std::make_unique(); pl->parseLogicalCombination(id, re.c_str(), ~0U, 0, ~0ULL); pl->logicalKeyRenumber(); - cng = make_unique(move(pl)); + cng = make_unique(std::move(pl)); return; } @@ -192,7 +192,7 @@ void CNGInfo::compile() { } } - cng = make_unique(move(g), move(rm)); + cng = make_unique(std::move(g), std::move(rm)); } catch (CompileError &e) { throw NGCompileFailure(e.reason); } catch (NGUnsupportedFailure &e) { diff --git a/tools/hscollider/NfaGeneratedCorpora.cpp b/tools/hscollider/NfaGeneratedCorpora.cpp index 4de320e1..07213889 100644 --- a/tools/hscollider/NfaGeneratedCorpora.cpp +++ b/tools/hscollider/NfaGeneratedCorpora.cpp @@ -107,7 +107,7 @@ void NfaGeneratedCorpora::generate(unsigned id, vector &data) { a_subid = it.first; vector sub_data; generate(a_subid, sub_data); - m_data.emplace(a_subid, move(sub_data)); + m_data.emplace(a_subid, std::move(sub_data)); } assert(!m_data.empty()); size_t num_corpus = m_data[a_subid].size(); diff --git a/tools/hscollider/UltimateTruth.cpp b/tools/hscollider/UltimateTruth.cpp index c448b780..93d432c3 100644 --- a/tools/hscollider/UltimateTruth.cpp +++ b/tools/hscollider/UltimateTruth.cpp @@ -1079,7 +1079,7 @@ shared_ptr UltimateTruth::compile(const set &ids, } } - return move(db); + return std::move(db); } bool UltimateTruth::allocScratch(shared_ptr db) { diff --git a/tools/hscollider/main.cpp b/tools/hscollider/main.cpp index 7c071903..dcc5c1b6 100644 --- a/tools/hscollider/main.cpp +++ b/tools/hscollider/main.cpp @@ -1188,7 +1188,7 @@ struct CorpusGenUnit { CorpusGenUnit(unique_ptr cngi_in, unique_ptr pcre_in, shared_ptr ue2_in, unsigned expr_id, bool multi_in, bool utf8_in) - : cngi(move(cngi_in)), pcre(move(pcre_in)), ue2(ue2_in), id(expr_id), + : cngi(std::move(cngi_in)), pcre(std::move(pcre_in)), ue2(ue2_in), id(expr_id), multi(multi_in), utf8(utf8_in) {} unique_ptr cngi; @@ -1220,7 +1220,7 @@ public: } addCorporaToQueue(out, testq, c->id, *corpora, summary, - move(c->pcre), move(c->cngi), c->ue2, c->multi, + std::move(c->pcre), std::move(c->cngi), c->ue2, c->multi, c->utf8); count++; @@ -1434,7 +1434,7 @@ unique_ptr makeCorpusGenUnit(unsigned id, TestSummary &summary, // Caller may already have set the UTF-8 property (in multi cases) utf8 |= cpcre ? cpcre->utf8 : cngi->utf8; - return std::make_unique(move(cngi), move(cpcre), ue2, id, + return std::make_unique(std::move(cngi), std::move(cpcre), ue2, id, multi, utf8); } @@ -1489,7 +1489,7 @@ void buildSingle(BoundedQueue &corpq, TestSummary &summary, auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, ue2, multi, utf8); if (u) { - corpq.push(move(u)); + corpq.push(std::move(u)); } } } @@ -1547,7 +1547,7 @@ void buildBanded(BoundedQueue &corpq, TestSummary &summary, auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, ue2, multi, utf8); if (u) { - corpq.push(move(u)); + corpq.push(std::move(u)); } } } @@ -1587,7 +1587,7 @@ void buildMulti(BoundedQueue &corpq, TestSummary &summary, auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, ue2, multi, utf8); if (u) { - corpq.push(move(u)); + corpq.push(std::move(u)); } } } @@ -1607,7 +1607,7 @@ void generateTests(CorporaSource &corpora_src, const ExpressionMap &exprMap, for (size_t i = 0; i < numGeneratorThreads; i++) { auto c = make_unique(i, testq, corpq, corpora_src); c->start(); - generators.push_back(move(c)); + generators.push_back(std::move(c)); } if (g_ue2CompileAll && multicompile_bands) { @@ -1830,11 +1830,11 @@ unique_ptr buildCorpora(const vector &corporaFiles, exit_with_fail(); } } - return move(c); /* move allows unique_ptr conversion */ + return std::move(c); /* move allows unique_ptr conversion */ } else { auto c = std::make_unique( exprMap, corpus_gen_prop, force_utf8, force_prefilter); - return move(c); + return std::move(c); } } @@ -1883,7 +1883,7 @@ bool runTests(CorporaSource &corpora_source, const ExpressionMap &exprMap, for (size_t i = 0; i < numScannerThreads; i++) { auto s = std::make_unique(i, testq, exprMap, plat, grey); s->start(); - scanners.push_back(move(s)); + scanners.push_back(std::move(s)); } generateTests(corpora_source, exprMap, summary, plat, grey, testq); From 93d3e7eb30a3db825de50df3faae35200a050540 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 07:16:12 +0000 Subject: [PATCH 05/43] fix -Wunused warnings on debug --- src/dispatcher.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dispatcher.c b/src/dispatcher.c index 775002f6..a817e744 100644 --- a/src/dispatcher.c +++ b/src/dispatcher.c @@ -117,6 +117,11 @@ RTYPE NAME(__VA_ARGS__) __attribute__((ifunc("resolve_" #NAME))) #endif + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" CREATE_DISPATCH(hs_error_t, hs_scan, const hs_database_t *db, const char *data, unsigned length, unsigned flags, hs_scratch_t *scratch, match_event_handler onEvent, void *userCtx); @@ -185,3 +190,6 @@ CREATE_DISPATCH(hs_error_t, hs_reset_and_expand_stream, hs_stream_t *to_stream, /** INTERNALS **/ CREATE_DISPATCH(u32, Crc32c_ComputeBuf, u32 inCrc32, const void *buf, size_t bufLen); + +#pragma GCC diagnostic pop +#pragma GCC diagnostic pop From 9aa61440ea52450d4889ba7f814a0947f1e3b0ac Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 19:20:45 +0300 Subject: [PATCH 06/43] Reduce unit test runtimes dramatically for debug builds --- CMakeLists.txt | 1 + unit/hyperscan/behaviour.cpp | 8 ++++++-- unit/hyperscan/literals.cpp | 4 ++++ unit/internal/multi_bit.cpp | 4 ++++ unit/internal/multi_bit_compress.cpp | 12 ++++++++++-- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b821472a..4e0c10ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,6 +120,7 @@ endif () #for config if (RELEASE_BUILD) set(HS_OPTIMIZE ON) + add_definitions(-DNDEBUG) endif() include (${CMAKE_MODULE_PATH}/sanitize.cmake) diff --git a/unit/hyperscan/behaviour.cpp b/unit/hyperscan/behaviour.cpp index f15e7171..e8a3078f 100644 --- a/unit/hyperscan/behaviour.cpp +++ b/unit/hyperscan/behaviour.cpp @@ -157,7 +157,11 @@ TEST_P(HyperscanScanGigabytesMatch, StreamingMatch) { // gb is the number of gigabytes to scan between pre-block and post-block // run over 1,2,4,8 gb +#ifdef NDEBUG for (unsigned long long gb = 1; gb <= 8; gb *= 2) { +#else + for (unsigned long long gb = 1; gb <= 2; gb *= 2) { +#endif SCOPED_TRACE(gb); hs_stream_t *stream = nullptr; @@ -261,12 +265,12 @@ TEST_P(HyperscanScanGigabytesMatch, BlockMatch) { 1*1024, #ifdef BIG_BLOCKS 4*1024, 32*1024, 128*1024, 512*1024, +#ifdef NDEBUG // gigabytes 1024*1024, -#ifdef ARCH_X86_64 // big cases for big beefy machines 2048*1024, 3072*1024 -#endif // ARCH_X86_64 +#endif // NDEBUG #endif // BIG_BLOCKS }; diff --git a/unit/hyperscan/literals.cpp b/unit/hyperscan/literals.cpp index 86bd317c..6ff3aa43 100644 --- a/unit/hyperscan/literals.cpp +++ b/unit/hyperscan/literals.cpp @@ -235,7 +235,11 @@ static const unsigned test_modes[] = {HS_MODE_BLOCK, HS_MODE_STREAM, static const unsigned test_flags[] = {0, HS_FLAG_SINGLEMATCH, HS_FLAG_SOM_LEFTMOST}; +#ifdef NDEBUG static const unsigned test_sizes[] = {1, 10, 100, 500, 10000}; +#else +static const unsigned test_sizes[] = {1, 10, 100, 500}; +#endif static const pair test_bounds[] = {{3u, 10u}, {10u, 100u}}; diff --git a/unit/internal/multi_bit.cpp b/unit/internal/multi_bit.cpp index c7632d3a..7bb4a1a8 100644 --- a/unit/internal/multi_bit.cpp +++ b/unit/internal/multi_bit.cpp @@ -1327,16 +1327,19 @@ static const MultiBitTestParam multibitTests[] = { { 1024, 1 }, { 1025, 1 }, { 2099, 1 }, +#ifdef NDEBUG { 10000, 1 }, { 32768, 1 }, { 32769, 1 }, { 200000, 1 }, +#endif // Larger cases, bigger strides. { 1U << 18, 3701 }, { 1U << 19, 3701 }, { 1U << 20, 3701 }, { 1U << 21, 3701 }, +#ifdef NDEBUG { 1U << 22, 3701 }, { 1U << 23, 3701 }, { 1U << 24, 3701 }, @@ -1347,6 +1350,7 @@ static const MultiBitTestParam multibitTests[] = { { 1U << 29, 24413 }, { 1U << 30, 50377 }, { 1U << 31, 104729 }, +#endif }; INSTANTIATE_TEST_CASE_P(MultiBit, MultiBitTest, ValuesIn(multibitTests)); diff --git a/unit/internal/multi_bit_compress.cpp b/unit/internal/multi_bit_compress.cpp index 40078f81..14c3f480 100644 --- a/unit/internal/multi_bit_compress.cpp +++ b/unit/internal/multi_bit_compress.cpp @@ -165,10 +165,12 @@ TEST(MultiBitComp, CompCompsizeSparse) { 257, 4097, (1U << 18) + 1, +#ifdef NDEBUG (1U << 24) + 1, (1U << 30) + 1 +#endif }; - for (u32 i = 0; i < 5; i++) { + for (u32 i = 0; i < sizeof(test_set)/sizeof(u32); i++) { u32 test_size = test_set[i]; mmbit_holder ba(test_size); @@ -225,10 +227,12 @@ TEST(MultiBitComp, CompCompsizeDense) { 257, 4097, (1U << 18) + 1, +#ifdef NDEBUG (1U << 24) + 1, (1U << 30) + 1 +#endif }; - for (u32 i = 0; i < 5; i++) { + for (u32 i = 0; i < sizeof(test_set)/sizeof(u32); i++) { u32 test_size = test_set[i]; mmbit_holder ba(test_size); @@ -760,16 +764,19 @@ static const MultiBitCompTestParam multibitCompTests[] = { { 1025, 1 }, { 2099, 1 }, // 4097 = 64 ^ 2 + 1 { 4097, 1 }, +#ifdef NDEBUG { 10000, 1 }, { 32768, 1 }, { 32769, 1 }, { 200000, 1 }, { 262145, 1 }, // 262145 = 64 * 3 + 1 +#endif // Larger cases, bigger strides. { 1U << 19, 3701 }, { 1U << 20, 3701 }, { 1U << 21, 3701 }, +#ifdef NDEBUG { 1U << 22, 3701 }, { 1U << 23, 3701 }, { 1U << 24, 3701 }, @@ -780,6 +787,7 @@ static const MultiBitCompTestParam multibitCompTests[] = { { 1U << 29, 24413 }, { 1U << 30, 50377 }, { 1U << 31, 104729 }, +#endif }; INSTANTIATE_TEST_CASE_P(MultiBitComp, MultiBitCompTest, From b7d1bc029813e09d10a93ebee0e296cecc5b41f8 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 20:09:45 +0300 Subject: [PATCH 07/43] clang 15 (but not 16) fails on ppc64le with -Wdeprecate-lax-vec-conv-all --- src/util/arch/ppc64el/simd_utils.h | 9 +++++++-- src/util/supervector/arch/ppc64el/impl.cpp | 13 ++++++++++--- unit/internal/simd_utils.cpp | 5 ++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/util/arch/ppc64el/simd_utils.h b/src/util/arch/ppc64el/simd_utils.h index 119d0946..4f0e6cc7 100644 --- a/src/util/arch/ppc64el/simd_utils.h +++ b/src/util/arch/ppc64el/simd_utils.h @@ -43,6 +43,9 @@ #include // for memcpy +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" + typedef __vector unsigned long long int uint64x2_t; typedef __vector signed long long int int64x2_t; typedef __vector unsigned int uint32x4_t; @@ -124,8 +127,8 @@ static really_really_inline m128 rshift_m128(m128 a, unsigned b) { if (b == 0) return a; m128 sl = (m128) vec_splats((uint8_t) b << 3); - m128 result = (m128) vec_sro((uint8x16_t) a, (uint8x16_t) sl); - return result; + uint8x16_t result = vec_sro((uint8x16_t) a, (uint8x16_t) sl); + return (m128) result; } static really_really_inline @@ -420,4 +423,6 @@ m128 set2x64(u64a hi, u64a lo) { return (m128) v; } +#pragma clang diagnostic pop + #endif // ARCH_PPC64EL_SIMD_UTILS_H diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index 494bcbd6..e7baedde 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -158,18 +158,21 @@ really_inline SuperVector<16>::SuperVector(uint32_t const other) u.u32x4[0] = vec_splats(static_cast(other)); } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" template<> template<> really_inline SuperVector<16>::SuperVector(int64_t const other) { - u.s64x2[0] = (int64x2_t) vec_splats(static_cast(other)); + u.s64x2[0] = static_cast(vec_splats(static_cast(other))); } +#pragma clang diagnostic pop template<> template<> really_inline SuperVector<16>::SuperVector(uint64_t const other) { - u.u64x2[0] = (uint64x2_t) vec_splats(static_cast(other)); + u.u64x2[0] = static_cast(vec_splats(static_cast(other))); } // Constants @@ -266,6 +269,9 @@ really_inline SuperVector<16> SuperVector<16>::eq(SuperVector<16> const &b) cons return (*this == b); } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" + template <> really_inline typename SuperVector<16>::comparemask_type SuperVector<16>::comparemask(void) const { @@ -273,9 +279,10 @@ SuperVector<16>::comparemask(void) const { uint8x16_t bitmask = vec_gb(u.u8x16[0]); bitmask = (uint8x16_t) vec_perm(vec_splat_u8(0), bitmask, perm); u32 ALIGN_ATTR(16) movemask; - vec_ste((uint32x4_t) bitmask, 0, &movemask); + vec_ste(static_cast(bitmask), 0, &movemask); return movemask; } +#pragma clang diagnostic pop template <> really_inline typename SuperVector<16>::comparemask_type diff --git a/unit/internal/simd_utils.cpp b/unit/internal/simd_utils.cpp index c5cfec7b..19793442 100644 --- a/unit/internal/simd_utils.cpp +++ b/unit/internal/simd_utils.cpp @@ -673,8 +673,11 @@ TEST(SimdUtilsTest, movq) { int64x2_t a = { 0x123456789abcdefLL, ~0LL }; simd = vreinterpretq_s32_s64(a); #elif defined(ARCH_PPC64EL) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" int64x2_t a = {0x123456789abcdefLL, ~0LL }; - simd = (m128) a; + simd = static_cast(a); +#pragma clang diagnostic pop #endif #endif r = movq(simd); From 354fda48fb476d2483da099f77bf0f2feeed1696 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 20:28:35 +0300 Subject: [PATCH 08/43] add conditional for __clang__ --- src/util/arch/ppc64el/simd_utils.h | 2 ++ src/util/supervector/arch/ppc64el/impl.cpp | 2 ++ unit/internal/simd_utils.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/util/arch/ppc64el/simd_utils.h b/src/util/arch/ppc64el/simd_utils.h index 4f0e6cc7..7b0f62a0 100644 --- a/src/util/arch/ppc64el/simd_utils.h +++ b/src/util/arch/ppc64el/simd_utils.h @@ -43,6 +43,7 @@ #include // for memcpy +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" @@ -424,5 +425,6 @@ m128 set2x64(u64a hi, u64a lo) { } #pragma clang diagnostic pop +#endif // defined(__clang__) && (__clang_major__ == 15) #endif // ARCH_PPC64EL_SIMD_UTILS_H diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index e7baedde..05aaba41 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -158,6 +158,7 @@ really_inline SuperVector<16>::SuperVector(uint32_t const other) u.u32x4[0] = vec_splats(static_cast(other)); } +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" template<> @@ -167,6 +168,7 @@ really_inline SuperVector<16>::SuperVector(int64_t const other) u.s64x2[0] = static_cast(vec_splats(static_cast(other))); } #pragma clang diagnostic pop +#endif // defined(__clang__) && (__clang_major__ == 15) template<> template<> diff --git a/unit/internal/simd_utils.cpp b/unit/internal/simd_utils.cpp index 19793442..510a0ed1 100644 --- a/unit/internal/simd_utils.cpp +++ b/unit/internal/simd_utils.cpp @@ -673,11 +673,13 @@ TEST(SimdUtilsTest, movq) { int64x2_t a = { 0x123456789abcdefLL, ~0LL }; simd = vreinterpretq_s32_s64(a); #elif defined(ARCH_PPC64EL) +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" int64x2_t a = {0x123456789abcdefLL, ~0LL }; simd = static_cast(a); #pragma clang diagnostic pop +#endif // defined(__clang__) && (__clang_major__ == 15) #endif #endif r = movq(simd); From 2e88df1a8920d9d20daf4de89abe7121a7e318cc Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 20:35:58 +0300 Subject: [PATCH 09/43] use the conditional in the right way --- src/util/arch/ppc64el/simd_utils.h | 2 ++ src/util/supervector/arch/ppc64el/impl.cpp | 2 ++ unit/internal/simd_utils.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/util/arch/ppc64el/simd_utils.h b/src/util/arch/ppc64el/simd_utils.h index 7b0f62a0..15446e87 100644 --- a/src/util/arch/ppc64el/simd_utils.h +++ b/src/util/arch/ppc64el/simd_utils.h @@ -46,6 +46,7 @@ #if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" +#endif // defined(__clang__) && (__clang_major__ == 15) typedef __vector unsigned long long int uint64x2_t; typedef __vector signed long long int int64x2_t; @@ -424,6 +425,7 @@ m128 set2x64(u64a hi, u64a lo) { return (m128) v; } +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index 05aaba41..cd776d5a 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -161,12 +161,14 @@ really_inline SuperVector<16>::SuperVector(uint32_t const other) #if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" +#endif // defined(__clang__) && (__clang_major__ == 15) template<> template<> really_inline SuperVector<16>::SuperVector(int64_t const other) { u.s64x2[0] = static_cast(vec_splats(static_cast(other))); } +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) diff --git a/unit/internal/simd_utils.cpp b/unit/internal/simd_utils.cpp index 510a0ed1..dd7bae9e 100644 --- a/unit/internal/simd_utils.cpp +++ b/unit/internal/simd_utils.cpp @@ -676,8 +676,10 @@ TEST(SimdUtilsTest, movq) { #if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" +#endif // defined(__clang__) && (__clang_major__ == 15) int64x2_t a = {0x123456789abcdefLL, ~0LL }; simd = static_cast(a); +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) #endif From da88abfa3970d5cbb53c98a8d38369694da067fb Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 20:54:57 +0300 Subject: [PATCH 10/43] missed one pragma --- src/util/supervector/arch/ppc64el/impl.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index cd776d5a..a1db21ee 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -273,9 +273,10 @@ really_inline SuperVector<16> SuperVector<16>::eq(SuperVector<16> const &b) cons return (*this == b); } +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" - +#endif // defined(__clang__) && (__clang_major__ == 15) template <> really_inline typename SuperVector<16>::comparemask_type SuperVector<16>::comparemask(void) const { @@ -286,7 +287,9 @@ SuperVector<16>::comparemask(void) const { vec_ste(static_cast(bitmask), 0, &movemask); return movemask; } +#if defined(__clang__) && (__clang_major__ == 15) #pragma clang diagnostic pop +#endif // defined(__clang__) && (__clang_major__ == 15) template <> really_inline typename SuperVector<16>::comparemask_type From 72afe16452579e89c37d90b02faec7f73cf76047 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 22:07:34 +0300 Subject: [PATCH 11/43] clang 16 as well --- src/util/supervector/arch/ppc64el/impl.cpp | 8 ++++---- unit/internal/simd_utils.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index a1db21ee..add84418 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -158,7 +158,7 @@ really_inline SuperVector<16>::SuperVector(uint32_t const other) u.u32x4[0] = vec_splats(static_cast(other)); } -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" #endif // defined(__clang__) && (__clang_major__ == 15) @@ -168,7 +168,7 @@ really_inline SuperVector<16>::SuperVector(int64_t const other) { u.s64x2[0] = static_cast(vec_splats(static_cast(other))); } -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) @@ -273,7 +273,7 @@ really_inline SuperVector<16> SuperVector<16>::eq(SuperVector<16> const &b) cons return (*this == b); } -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" #endif // defined(__clang__) && (__clang_major__ == 15) @@ -287,7 +287,7 @@ SuperVector<16>::comparemask(void) const { vec_ste(static_cast(bitmask), 0, &movemask); return movemask; } -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) diff --git a/unit/internal/simd_utils.cpp b/unit/internal/simd_utils.cpp index dd7bae9e..7ebd013a 100644 --- a/unit/internal/simd_utils.cpp +++ b/unit/internal/simd_utils.cpp @@ -673,13 +673,13 @@ TEST(SimdUtilsTest, movq) { int64x2_t a = { 0x123456789abcdefLL, ~0LL }; simd = vreinterpretq_s32_s64(a); #elif defined(ARCH_PPC64EL) -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" #endif // defined(__clang__) && (__clang_major__ == 15) int64x2_t a = {0x123456789abcdefLL, ~0LL }; simd = static_cast(a); -#if defined(__clang__) && (__clang_major__ == 15) +#if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) #endif From 35c071168937f10f31ffada23ee2fb03185b2ca7 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Wed, 4 Oct 2023 23:35:10 +0300 Subject: [PATCH 12/43] use the right type of cast --- src/util/supervector/arch/ppc64el/impl.cpp | 6 +++--- unit/internal/simd_utils.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/util/supervector/arch/ppc64el/impl.cpp b/src/util/supervector/arch/ppc64el/impl.cpp index add84418..de7c73fa 100644 --- a/src/util/supervector/arch/ppc64el/impl.cpp +++ b/src/util/supervector/arch/ppc64el/impl.cpp @@ -166,7 +166,7 @@ template<> template<> really_inline SuperVector<16>::SuperVector(int64_t const other) { - u.s64x2[0] = static_cast(vec_splats(static_cast(other))); + u.s64x2[0] = reinterpret_cast(vec_splats(static_cast(other))); } #if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic pop @@ -176,7 +176,7 @@ template<> template<> really_inline SuperVector<16>::SuperVector(uint64_t const other) { - u.u64x2[0] = static_cast(vec_splats(static_cast(other))); + u.u64x2[0] = reinterpret_cast(vec_splats(static_cast(other))); } // Constants @@ -284,7 +284,7 @@ SuperVector<16>::comparemask(void) const { uint8x16_t bitmask = vec_gb(u.u8x16[0]); bitmask = (uint8x16_t) vec_perm(vec_splat_u8(0), bitmask, perm); u32 ALIGN_ATTR(16) movemask; - vec_ste(static_cast(bitmask), 0, &movemask); + vec_ste(reinterpret_cast(bitmask), 0, &movemask); return movemask; } #if defined(__clang__) && (__clang_major__ >= 15) diff --git a/unit/internal/simd_utils.cpp b/unit/internal/simd_utils.cpp index 7ebd013a..c57cd598 100644 --- a/unit/internal/simd_utils.cpp +++ b/unit/internal/simd_utils.cpp @@ -678,7 +678,7 @@ TEST(SimdUtilsTest, movq) { #pragma clang diagnostic ignored "-Wdeprecate-lax-vec-conv-all" #endif // defined(__clang__) && (__clang_major__ == 15) int64x2_t a = {0x123456789abcdefLL, ~0LL }; - simd = static_cast(a); + simd = reinterpret_cast(a); #if defined(__clang__) && (__clang_major__ >= 15) #pragma clang diagnostic pop #endif // defined(__clang__) && (__clang_major__ == 15) From e369681ce2ff49f9570b73cef8bfff0b5790d0a8 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Thu, 5 Oct 2023 10:40:30 +0300 Subject: [PATCH 13/43] Don't run regression UE_2595 on debug, it times out CI --- unit/hyperscan/behaviour.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unit/hyperscan/behaviour.cpp b/unit/hyperscan/behaviour.cpp index e8a3078f..f431de79 100644 --- a/unit/hyperscan/behaviour.cpp +++ b/unit/hyperscan/behaviour.cpp @@ -1368,6 +1368,7 @@ TEST(regression, UE_2452) { hs_free_database(db); } +#ifdef NDEBUG TEST(regression, UE_2595) { const char regex[] = "(?:(?:acAa|c[EAA]aEb|((?:CC[bdd].cE((?x-msix)BE){32}(?:\\B)){16,19}CdD.E(E|E|B)){3,6}|E(a|d|.)(?:(?xs-isxm)|b|.|C))){17,}"; unsigned flags = HS_FLAG_MULTILINE | HS_FLAG_CASELESS | @@ -1382,6 +1383,7 @@ TEST(regression, UE_2595) { ASSERT_NE(nullptr, db); hs_free_database(db); } +#endif TEST(regression, UE_2762) { const vector patterns = { From 22a24f12ea86e18a71fa22d58c35429c7ecc5dfc Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Thu, 5 Oct 2023 19:12:38 +0300 Subject: [PATCH 14/43] Reduce debug unit tests runtime even more In single.cpp featuremask with AVX512 features is not relevant to non-x86 platforms, and just extends the runtime for no reason. --- unit/hyperscan/bad_patterns.cpp | 6 + unit/hyperscan/bad_patterns_fast.txt | 159 +++++++++++++++++++++++++++ unit/hyperscan/behaviour.cpp | 2 + unit/hyperscan/single.cpp | 2 + 4 files changed, 169 insertions(+) create mode 100644 unit/hyperscan/bad_patterns_fast.txt diff --git a/unit/hyperscan/bad_patterns.cpp b/unit/hyperscan/bad_patterns.cpp index 1756ba09..dba906bb 100644 --- a/unit/hyperscan/bad_patterns.cpp +++ b/unit/hyperscan/bad_patterns.cpp @@ -239,6 +239,8 @@ TEST_P(BadPattern, Block) { const BadPatternParam &p = GetParam(); SCOPED_TRACE(p.expr); + std::cout << p.expr << std::endl; + hs_compile_error_t *compile_err; hs_database_t *db; hs_error_t err = p.compile(HS_MODE_NOSTREAM, &db, &compile_err); @@ -280,7 +282,11 @@ TEST_P(BadPattern, Stream) { static vector getBadPatterns() { +#ifdef NDEBUG string filename = "unit/hyperscan/bad_patterns.txt"; +#else + string filename = "unit/hyperscan/bad_patterns_fast.txt"; +#endif ifstream f; f.open(filename.c_str(), ifstream::in); diff --git a/unit/hyperscan/bad_patterns_fast.txt b/unit/hyperscan/bad_patterns_fast.txt new file mode 100644 index 00000000..39a5c2e2 --- /dev/null +++ b/unit/hyperscan/bad_patterns_fast.txt @@ -0,0 +1,159 @@ +1:/\c空/ #\c must be followed by an ASCII character at index 0. +2:/\c/ #\c must be followed by an ASCII character at index 0. +3:/[\c空]/ #\c must be followed by an ASCII character at index 1. +4:/[\c]/ #Unterminated character class starting at index 0. +5:/\c空/8 #\c must be followed by an ASCII character at index 0. +6:/<([^>+i)>.*?/sP #Unterminated character class starting at index 2. +6:/[foo/ #Unterminated character class starting at index 0. +7:/[\p{X}]/8 #Unknown property at index 4. +8:/[\p{^X}]/8 #Unknown property at index 5. +9:/[\p{L]/8 #Malformed property at index 0. +10:/[\p{^L]/8 #Malformed property at index 0. +11:/[\P{L]/8 #Malformed property at index 0. +12:/[\P{^L]/8 #Malformed property at index 0. +13:/\p/8 #Malformed property at index 0. +14:/\P/8 #Malformed property at index 0. +15:/\p{/8 #Malformed property at index 0. +16:/\P{/8 #Malformed property at index 0. +17:/\p{^/8 #Malformed property at index 0. +18:/\P{^/8 #Malformed property at index 0. +19:/[\p/8 #Malformed property at index 1. +20:/[\P/8 #Malformed property at index 1. +21:/[\p{/8 #Malformed property at index 0. +22:/[\P{/8 #Malformed property at index 0. +23:/[\p{^/8 #Malformed property at index 0. +24:/[\P{^/8 #Malformed property at index 0. +25:/\pl/8 #Unknown property at index 2. +26:/\p{any}/8 #Unknown property at index 3. +27:/\p{greek}/8 #Unknown property at index 3. +28:/\b/8W #\b unsupported in UCP mode at index 0. +29:/(*UCP)\b/8 #\b unsupported in UCP mode at index 6. +30:/\B/8W #\B unsupported in UCP mode at index 0. +31:/\B/W #\B unsupported in UCP mode at index 0. +32:/foo(?{print "Hello world\n";})bar/ #Embedded code is not supported at index 3. +33:/the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i #Embedded code is not supported at index 9. +35:/\X/8 #\X unsupported at index 0. +36:/\B+/ #Invalid repeat at index 2. +37:/\B?/ #Invalid repeat at index 2. +38:/\B*/ #Invalid repeat at index 2. +39:/\B{0,6}/ #Invalid repeat at index 2. +40:/\b+/ #Invalid repeat at index 2. +41:/\b?/ #Invalid repeat at index 2. +42:/\b*/ #Invalid repeat at index 2. +43:/\b{0,6}/ #Invalid repeat at index 2. +44:/[.ch.]/ #Unsupported POSIX collating element at index 0. +45:/[=ch=]/ #Unsupported POSIX collating element at index 0. +46:/[:digit:]/ #POSIX named classes are only supported inside a class at index 0. +47:/[[.ch.]]/ #Unsupported POSIX collating element at index 1. +48:/[[=ch=]]/ #Unsupported POSIX collating element at index 1. +49:/foo(?m)?bar/ #Invalid repeat at index 7. +50:/.(?)+/ #Invalid repeat at index 4. +51:/(abc)\2/P #Invalid back reference to expression 2. +52:/\x{100000000}/ #Value in \x{...} sequence is too large at index 0. +53:/^foo/{min_offset=5} #Expression is anchored and cannot satisfy min_offset=5 as it can only produce matches of length 3 bytes at most. +54:/foobar/{min_length=20} #Expression has min_length=20 but can only produce matches of length 6 bytes at most. +55:/foobar/{max_offset=3} #Expression has max_offset=3 but requires 6 bytes to match. +56:/mkdzo(x|u)(\b)kd/{max_offset=29} #Pattern can never match. +57:/[^\x00-\xff]/ #Pattern can never match. +58:/[^\x00-\xff]foo/ #Pattern can never match. +59:/^\Bfoo/ #Pattern can never match. +60:/^\B\Bfoo/ #Pattern can never match. +61:/can't_match\b\B/ #Pattern can never match. +62:/\b\Bcan't_match/ #Pattern can never match. +63:/^\b$/m #Pattern can never match. +64:/^\b\Z/m #Pattern can never match. +65:/^\b\z/m #Pattern can never match. +66:/\A\b$/m #Pattern can never match. +67:/\A\b\Z/m #Pattern can never match. +68:/\A\b\z/m #Pattern can never match. +69:/^[^\x00-\xff]foo/ #Pattern can never match. +70:/foo[^\x00-\xff]/ #Pattern can never match. +71:/foo[^\x00-\xff]$/ #Pattern can never match. +72:/\Bd\B/i{min_length=2,min_offset=4,max_offset=54} #Expression has min_length=2 but can only produce matches of length 1 bytes at most. +74:/(((.|aaa)aaaaaa.aaa){14,19}a((a|a{5,6}|aa){3,11}|aa.|a){2}){40}\Z/smL #Pattern is too large. +75:/\B/s8{min_length=1} #Expression has min_length=1 but can only produce matches of length 0 bytes at most. +76:/(f|d|(\b)|i|a\Z)/mHV8{min_length=2,min_offset=9,max_offset=14} #Expression has min_length=2 but can only produce matches of length 1 bytes at most. +77:/(f|e|d{19,}|h\Z|^j|\Aa)/smi{min_length=7,min_offset=8,max_offset=18} #Extended parameter constraints can not be satisfied for any match from this expression. +78:/(i{13,}|i\Z)/s{min_length=3,max_offset=5} #Extended parameter constraints can not be satisfied for any match from this expression. +79:/(?Pfoo).*(?Pbar)/ #Two named subpatterns use the name 'dupename' at index 19. +80:/_W{0,3}bazr_W{0,3}(ac[_a-z]{22}a)?e_W{0,3}bazr[_a-z](ac[a-z]{4}c{14}[a-z]{5})?e_W{0,3}bazr[_a-z](e|ac[_a-z]{4}c{16}([_a-z]|[a-p]W|[o-z]WW){3}([_a-z]|WWW))_W{0,3}bazr([_a-z]|[a-p]WW?|[o-z]WWW)a(foobar|c([a-z]W{0,3})bc([a-z]W{0,3})c{14}([_a-z]W{0,3}){6})((fooaa|[_a-z]W{0,3})bazr[_a-z]W{0,5}a(foobar|c([_a-z]|[a-z]W{1,3})bc([_a-z]|[o-z]W{1,5})c{14}([_a-f]|[A-Z0]W|~WW|;WWW){6})){40}(fooaa|_)bazr[_a-z]/sL #Pattern is too large. +81:/[..]/ #Unsupported POSIX collating element at index 0. +82:/[==]/ #Unsupported POSIX collating element at index 0. +83:/[.\].]/ #Unsupported POSIX collating element at index 0. +84:/[=\]=]/ #Unsupported POSIX collating element at index 0. +85:/A(?!)+Z/ #Invalid repeat at index 5. +86:/\X/ #\X unsupported at index 0. +88:/[A-\d]/ #Invalid range in character class at index 3. +89:/[A-[:digit:]]/ #Invalid range in character class at index 3. +90:/B[--[:digit:]--]+/ #Invalid range in character class at index 4. +91:/a\owibble/ #Value in \o{...} sequence is non-octal or missing braces at index 1. +92:/a\o{wibble/ #Value in \o{...} sequence is non-octal or missing braces at index 1. +93:/a\o{777}/ #Value in \o{...} sequence is too large at index 1. +94:/(*UTF16)foo/ #Unsupported control verb (*UTF16) at index 0. +95:/(*BSR_UNICODE)abc/ #Unsupported control verb (*BSR_UNICODE) at index 0. +96:/a+(*SKIP)b/ #Unknown control verb (*SKIP) at index 2. +97:/foo(*/ #Invalid repeat at index 4. +98:/[:\]:]/ #POSIX named classes are only supported inside a class at index 0. +99:/[[:[:]/ #Invalid POSIX named class at index 1. +100:/abc(?(1)def|ghi)/P #Invalid conditional reference to expression 1. +101:/abc(?()def|ghi)/P #Invalid conditional reference to label 'blah'. +102:/(?(DEFINE)foo|bar)/P #DEFINE conditional group with more than one branch at index 17. +103:/(?<1name>group)/ #Group name cannot begin with a digit at index 0. +104:/abc((def)?(?(R)bar))+/P #Pattern recursion not supported at index 10. +105:/abc((def)?(?(R2)bar))+/P #Pattern recursion not supported at index 10. +106:/abc((def)(?(R&label)bar))+/P #Pattern recursion not supported at index 9. +107:/\o{4200000}/8 #Value in \o{...} sequence is too large at index 0. +108:/\o{19}/ #Value in \o{...} sequence is non-octal or missing braces at index 0. +109:/\o{/ #Value in \o{...} sequence is non-octal or missing braces at index 0. +110:/\o{1/ #Value in \o{...} sequence is non-octal or missing braces at index 0. +111:/\x{0x110000}/8 #Value in \x{...} sequence is non-hex or missing } at index 0. +112:/\cÀ/ #\c must be followed by an ASCII character at index 0. +113:/[\cÀ]/ #\c must be followed by an ASCII character at index 1. +114:/[\o{4200000}]/8 #Value in \o{...} sequence is too large at index 1. +115:/[\x{0x110000}]/8 #Value in \x{...} sequence is non-hex or missing } at index 1. +116:/[\o{70]/ #Value in \o{...} sequence is non-octal or missing braces at index 1. +117:/[\x{ff]/ #Value in \x{...} sequence is non-hex or missing } at index 1. +118:/foo/{min_offset=10,max_offset=9} #In hs_expr_ext, min_offset must be less than or equal to max_offset. +120:/foo/{min_length=10,max_offset=9} #In hs_expr_ext, min_length must be less than or equal to max_offset. +122:/ÀÀ/8 #Expression is not valid UTF-8. +123:/hello \6 world/P #Invalid back reference to expression 6. +124:/hello \6 world|dog/P #Invalid back reference to expression 6. +125:/[~-\V]/8 #Invalid range in character class at index 3. +126:/(*UTF8)ÀÀ/ #Expression is not valid UTF-8. +127:/^fo?ob{ro|nax_off\Qt=10omnax+8Wnah/ñññññññññññññññññññññññññññ0}l.{1,60}Car*k|npanomnax+8Wnah/8 #Expression is not valid UTF-8. +128:/(*UTF8)^fo?ob{ro|nax_off\Qt=10omnax+8Wnah/ñññññññññññññññññññññññññññ0}l.{1,60}Car*k|npanomnax+8Wnah/ #Expression is not valid UTF-8. +129:/bignum \1111111111111111111/ #Number is too big at index 7. +130:/foo|&{5555555,}/ #Bounded repeat is too large. +131:/[a[..]]/ #Unsupported POSIX collating element at index 2. +132:/[a[==]]/ #Unsupported POSIX collating element at index 2. +133:/[a[.\].]]/ #Unsupported POSIX collating element at index 2. +134:/[a[=\]=]]/ #Unsupported POSIX collating element at index 2. +135:/[^\D\d]/8W #Pattern can never match. +136:/(*LIMIT_MATCH=1000)foobar/ #Unsupported control verb (*LIMIT_MATCH=1000) at index 0. +137:/(*UTF32)foobar/ #Unsupported control verb (*UTF32) at index 0. +138:/(*UNKNOWNVERB)foobar/ #Unknown control verb (*UNKNOWNVERB) at index 0. +139:/foo(*UTF8)bar/ #(*UTF8) must be at start of expression, encountered at index 5. +140:/(?i)(*UTF8)foobar/ #(*UTF8) must be at start of expression, encountered at index 6. +141:/(*@&/ #Unknown control verb at index 2. +142:/abcd/si{edit_distance=4} #Approximate matching patterns that reduce to vacuous patterns are disallowed. +143:/foobar|hatstand/sL{edit_distance=6} #Approximate matching patterns that reduce to vacuous patterns are disallowed. +144:/abc\b/{edit_distance=1} #Zero-width assertions are disallowed for approximate matching. +145:/abc/8{edit_distance=1} #UTF-8 is disallowed for approximate matching. +146:/(*UTF8)abc/{edit_distance=1} #UTF-8 is disallowed for approximate matching. +147:/\b\BMYBt/s{edit_distance=1} #Pattern can never match. +148:/\QÀ\Eaaaa/8 #Expression is not valid UTF-8. +149:/[\QÀ\Eaaaa]/8 #Expression is not valid UTF-8. +150:/abcd/{edit_distance=1,hamming_distance=1} #In hs_expr_ext, cannot have both edit distance and Hamming distance. +151:/141 | abc/C #Unknown character at index 6. +152:/141 & | 142/C #Not enough operand at index 6. +153:/141 142 & 143/C #Not enough operator at index 13. +154:/141 !142/C #Not enough operator at index 8. +155:/141 & 142 |/C #Not enough operand at index 11. +156:/)141 & 142 /C #Not enough left parentheses at index 0. +157:/(141 & (142|!143) |144/C #Not enough right parentheses at index 22. +158:/141 & (142|!143) )| 144/C #Not enough left parentheses at index 17. +159:/1234567890 & (142|!143 )/C #Expression id too large at index 10. +160:/141 & (142|!143 )|/C #Not enough operand at index 18. +161:/141/C #No logical operation. +162:/119 & 121/C #Unknown sub-expression id. +163:/166 & 167/C #Unknown sub-expression id. diff --git a/unit/hyperscan/behaviour.cpp b/unit/hyperscan/behaviour.cpp index f431de79..5947e61d 100644 --- a/unit/hyperscan/behaviour.cpp +++ b/unit/hyperscan/behaviour.cpp @@ -1337,6 +1337,7 @@ TEST(regression, UE_2425) { hs_free_database(db); } +#ifdef NDEBUG TEST(regression, UE_2485) { const char regex[] = "(?:(.EeEa|((a{2}BD[bc]Bd[eae]|[DCd]|c|ebCa|d)){7,21})(E{5,}A{4,}[Cc].cc{3,6}|eCec|e+CaBEd|[Bb])){10}DB(a|[AAda])..A?DE?E"; unsigned flags = HS_FLAG_DOTALL | HS_FLAG_CASELESS | HS_FLAG_UTF8 | @@ -1352,6 +1353,7 @@ TEST(regression, UE_2485) { ASSERT_NE(nullptr, db); hs_free_database(db); } +#endif TEST(regression, UE_2452) { const char regex[] = "/ab.b[bca]{2,}ca((?:c|(abc(?sxmi-xm)){10,14}|c|b|[abcb])){4,23}acbcbb*ba((?:(a|.{4,}|.|[acba])){3,16}a)+"; diff --git a/unit/hyperscan/single.cpp b/unit/hyperscan/single.cpp index 07269cf0..278d28f7 100644 --- a/unit/hyperscan/single.cpp +++ b/unit/hyperscan/single.cpp @@ -363,9 +363,11 @@ static const unsigned validModes[] = { // Mode bits for switching off various architecture features static const unsigned long long featureMask[] = { ~0ULL, /* native */ +#if defined(ARCH_IA32) || defined(ARCH_X86_64) ~(HS_CPU_FEATURES_AVX2 | HS_CPU_FEATURES_AVX512 | HS_CPU_FEATURES_AVX512VBMI), /* no avx2 */ ~(HS_CPU_FEATURES_AVX512 | HS_CPU_FEATURES_AVX512VBMI), /* no avx512 */ ~HS_CPU_FEATURES_AVX512VBMI, /* no avx512vbmi */ +#endif }; INSTANTIATE_TEST_CASE_P(Single, From 98d7434cfd7c8b9a962247f825f3879093eceeb9 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Fri, 6 Oct 2023 11:44:41 +0300 Subject: [PATCH 15/43] __builtin_constant_p is true in the wrong case on gcc 13.2. Exclude for now --- src/util/supervector/arch/x86/impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/supervector/arch/x86/impl.cpp b/src/util/supervector/arch/x86/impl.cpp index a807c84e..3d232e49 100644 --- a/src/util/supervector/arch/x86/impl.cpp +++ b/src/util/supervector/arch/x86/impl.cpp @@ -1145,7 +1145,7 @@ really_inline SuperVector<32> SuperVector<32>::loadu_maskz(void const *ptr, uint template<> really_inline SuperVector<32> SuperVector<32>::alignr(SuperVector<32> &other, int8_t offset) { -#if defined(HAVE__BUILTIN_CONSTANT_P) +#if defined(HAVE__BUILTIN_CONSTANT_P) && !(defined(__GNUC__) && (__GNUC__ == 13)) if (__builtin_constant_p(offset)) { if (offset == 16) { return *this; From a26661c84955f4b74a5d612f4c299fccfc61939b Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Fri, 6 Oct 2023 12:08:36 +0300 Subject: [PATCH 16/43] remove extra print --- unit/hyperscan/bad_patterns.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/unit/hyperscan/bad_patterns.cpp b/unit/hyperscan/bad_patterns.cpp index dba906bb..42e4772e 100644 --- a/unit/hyperscan/bad_patterns.cpp +++ b/unit/hyperscan/bad_patterns.cpp @@ -239,8 +239,6 @@ TEST_P(BadPattern, Block) { const BadPatternParam &p = GetParam(); SCOPED_TRACE(p.expr); - std::cout << p.expr << std::endl; - hs_compile_error_t *compile_err; hs_database_t *db; hs_error_t err = p.compile(HS_MODE_NOSTREAM, &db, &compile_err); From 55cae8c807a2102ed964acd2e7ba8a63d61fc898 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Fri, 6 Oct 2023 20:46:24 +0800 Subject: [PATCH 17/43] detect arm_sve.h when using clang on fat runtime builds --- CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e0c10ba..788551b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,8 +356,12 @@ if (ARCH_IA32 OR ARCH_X86_64) CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H) elseif (ARCH_ARM32 OR ARCH_AARCH64) CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) - if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM) - set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS}) + if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) + if (CMAKE_COMPILER_IS_CLANG) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve") + else() + set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS}) + endif() CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) if (NOT HAVE_C_ARM_SVE_H) message(FATAL_ERROR "arm_sve.h is required to build for SVE.") From 7a2ccd7773d5e1fa46383fce01311e1e6970bb30 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 06:17:18 +0800 Subject: [PATCH 18/43] fix fat & normal build errors on arm --- CMakeLists.txt | 99 ++++++++++++++++++++++++++++-------------------- cmake/arch.cmake | 6 +-- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 788551b3..5ad8e6e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,6 +137,16 @@ if (BUILD_AVX512VBMI) set(BUILD_AVX512 ON) endif () +if (NOT FAT_RUNTIME) + if (BUILD_SVE2_BITPERM) + set(BUILD_SVE2 ON) + endif () + + if (BUILD_SVE2) + set(BUILD_SVE ON) + endif () +endif () + # TODO: per platform config files? # remove CMake's idea of optimisation @@ -636,7 +646,7 @@ set (hs_exec_common_SRCS ${hs_exec_common_SRCS} src/util/arch/x86/cpuid_flags.c ) -elseif (ARCH_ARM32 OR ARCH_AARCH64 OR ARCH_PPC64EL) +elseif (ARCH_ARM32 OR ARCH_AARCH64) set (hs_exec_common_SRCS ${hs_exec_common_SRCS} src/util/arch/arm/cpuid_flags.c @@ -801,11 +811,10 @@ set (hs_exec_SRCS endif () endif() -if (FAT_RUNTIME OR (NOT FAT_RUNTIME AND NOT BUILD_SVE2)) -set (hs_exec_SRCS - ${hs_exec_SRCS} +set (hs_exec_neon_SRCS + src/nfa/vermicelli_simd.cpp) +set (hs_exec_sve_SRCS src/nfa/vermicelli_simd.cpp) -endif() set (hs_exec_avx2_SRCS src/fdr/teddy_avx2.c @@ -1264,6 +1273,10 @@ if (NOT FAT_RUNTIME) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) endif() + if (NOT BUILD_SVE2) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + endif() + if (BUILD_STATIC_LIBS) add_library(hs_exec OBJECT ${hs_exec_SRCS}) @@ -1416,29 +1429,31 @@ else () if (ARCH_AARCH64) set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") if (BUILD_STATIC_LIBS) - add_library(hs_exec_neon OBJECT ${hs_exec_SRCS}) + set (BUILD_SVE OFF) + set (BUILD_SVE2 OFF) + set (BUILD_SVE2_BITPERM OFF) + add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) list(APPEND RUNTIME_LIBS $) set_target_properties(hs_exec_neon PROPERTIES COMPILE_FLAGS "-march=armv8-a" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" ) - if (BUILD_SVE) - add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_sve PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_SVE) - if (BUILD_SVE2) - add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_sve2 PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_SVE2) + set (BUILD_SVE ON) + add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_sve PROPERTIES + COMPILE_FLAGS "-march=armv8-a+sve -DHAVE_SVE" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + set (BUILD_SVE2 ON) + set (BUILD_SVE2_BITPERM ON) + add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_sve2 PROPERTIES + COMPILE_FLAGS "-march=armv8-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) add_library(hs_exec_common OBJECT ${hs_exec_common_SRCS} @@ -1462,10 +1477,13 @@ else () endif (BUILD_STATIC_LIBS) if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) + set (BUILD_SVE OFF) + set (BUILD_SVE2 OFF) + set (BUILD_SVE2_BITPERM OFF) # build shared libs add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - add_library(hs_exec_shared_neon OBJECT ${hs_exec_SRCS}) + add_library(hs_exec_shared_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) list(APPEND RUNTIME_SHLIBS $) set_target_properties(hs_exec_shared_neon PROPERTIES COMPILE_FLAGS "-march=armv8-a" @@ -1473,24 +1491,23 @@ else () RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" ) - if (BUILD_SVE) - add_library(hs_exec_shared_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_sve PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_SVE) - if (BUILD_SVE2) - add_library(hs_exec_shared_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_sve2 PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_SVE2) + set (BUILD_SVE ON) + add_library(hs_exec_shared_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) + list(APPEND RUNTIME_SHLIBS $) + set_target_properties(hs_exec_shared_sve PROPERTIES + COMPILE_FLAGS "-march=armv8-a+sve -DHAVE_SVE" + POSITION_INDEPENDENT_CODE TRUE + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + set (BUILD_SVE2 ON) + set (BUILD_SVE2_BITPERM ON) + add_library(hs_exec_shared_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) + list(APPEND RUNTIME_SHLIBS $) + set_target_properties(hs_exec_shared_sve2 PROPERTIES + COMPILE_FLAGS "-march=armv8-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" + POSITION_INDEPENDENT_CODE TRUE + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) add_library(hs_exec_common_shared OBJECT ${hs_exec_common_SRCS} src/dispatcher.c diff --git a/cmake/arch.cmake b/cmake/arch.cmake index 2a94e93f..f2c060ea 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -35,7 +35,7 @@ if (ARCH_AARCH64) svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); (void)a; }" HAVE_SVE2_BITPERM) - if (HAVE_SVE2_BITPERM) + if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME) add_definitions(-DHAVE_SVE2_BITPERM) endif () endif() @@ -47,7 +47,7 @@ if (ARCH_AARCH64) (void)a; }" HAVE_SVE2) endif() - if (HAVE_SVE2 OR HAVE_SVE2_BITPERM) + if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) add_definitions(-DHAVE_SVE2) endif () if (BUILD_SVE) @@ -58,7 +58,7 @@ if (ARCH_AARCH64) (void)a; }" HAVE_SVE) endif () - if (HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) + if ((HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) add_definitions(-DHAVE_SVE) endif () set(CMAKE_C_FLAGS "${PREV_FLAGS}") From e8e29573443cf41af2ee6e1090b701e3d2429cc2 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 11:44:57 +0300 Subject: [PATCH 19/43] re-add missing file to x86 builds --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ad8e6e9..d865946c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -799,6 +799,7 @@ if (NOT RELEASE_BUILD OR FAT_RUNTIME) if (ARCH_IA32 OR ARCH_X86_64) set (hs_exec_SRCS ${hs_exec_SRCS} + src/nfa/vermicelli_simd.cpp src/util/supervector/arch/x86/impl.cpp) elseif (ARCH_ARM32 OR ARCH_AARCH64) set (hs_exec_SRCS From 690080612749adbb335e38f4a10eda562724c55b Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 12:06:47 +0300 Subject: [PATCH 20/43] add cpuid_flags to ppc64le as well --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d865946c..bde8b7e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -651,6 +651,10 @@ set (hs_exec_common_SRCS ${hs_exec_common_SRCS} src/util/arch/arm/cpuid_flags.c ) +elseif (ARCH_PPC64EL) +set (hs_exec_common_SRCS + ${hs_exec_common_SRCS} + src/util/arch/ppc64el/cpuid_flags.c) endif () set (hs_exec_SRCS From 1320d01035425debbf6aea7b92c07489b0d55a58 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 12:10:06 +0300 Subject: [PATCH 21/43] add missing file --- src/util/arch/ppc64el/cpuid_flags.c | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/util/arch/ppc64el/cpuid_flags.c diff --git a/src/util/arch/ppc64el/cpuid_flags.c b/src/util/arch/ppc64el/cpuid_flags.c new file mode 100644 index 00000000..a2f3758c --- /dev/null +++ b/src/util/arch/ppc64el/cpuid_flags.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * Copyright (c) 2020-2023, VectorCamp PC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "util/arch/common/cpuid_flags.h" +#include "ue2common.h" +#include "hs_compile.h" // for HS_MODE_ flags +#include "util/arch.h" + +u64a cpuid_flags(void) { + return 0; +} + +u32 cpuid_tune(void) { + return HS_TUNE_FAMILY_GENERIC; +} From 983a3a52bd62eca5da3b3a3797b50af4f4ca3787 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 22:27:26 +0800 Subject: [PATCH 22/43] include extra sources for Arm on non-fat builds --- CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bde8b7e6..ad7ed180 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -820,6 +820,8 @@ set (hs_exec_neon_SRCS src/nfa/vermicelli_simd.cpp) set (hs_exec_sve_SRCS src/nfa/vermicelli_simd.cpp) +set (hs_exec_sve2_SRCS + src/nfa/vermicelli_simd.cpp) set (hs_exec_avx2_SRCS src/fdr/teddy_avx2.c @@ -1278,8 +1280,14 @@ if (NOT FAT_RUNTIME) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) endif() - if (NOT BUILD_SVE2) - set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + if (ARCH_AARCH64) + if (BUILD_SVE2) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) + elseif (BUILD_SVE) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) + else() + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + endif() endif() if (BUILD_STATIC_LIBS) From 9e1c43b9ec72734d84191d36069b52681e81090e Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 7 Oct 2023 18:02:00 +0300 Subject: [PATCH 23/43] add src/nfa/vermicelli_simd.cpp to ppc64le --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad7ed180..ce019b72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -812,6 +812,7 @@ set (hs_exec_SRCS elseif (ARCH_PPC64EL) set (hs_exec_SRCS ${hs_exec_SRCS} + src/nfa/vermicelli_simd.cpp src/util/supervector/arch/ppc64el/impl.cpp) endif () endif() From 0e403103d605db0db14fb506fd2db8a77cb811d5 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sun, 8 Oct 2023 00:00:42 +0800 Subject: [PATCH 24/43] SVE2 needs armv9-a, fix build --- CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce019b72..a1ca5522 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -821,8 +821,6 @@ set (hs_exec_neon_SRCS src/nfa/vermicelli_simd.cpp) set (hs_exec_sve_SRCS src/nfa/vermicelli_simd.cpp) -set (hs_exec_sve2_SRCS - src/nfa/vermicelli_simd.cpp) set (hs_exec_avx2_SRCS src/fdr/teddy_avx2.c @@ -1465,7 +1463,7 @@ else () add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) list(APPEND RUNTIME_LIBS $) set_target_properties(hs_exec_sve2 PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" + COMPILE_FLAGS "-march=armv9-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" ) From 24ae1670d6bf72f2b01b3bd41d984d3dad66e68d Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sun, 8 Oct 2023 23:26:07 +0300 Subject: [PATCH 25/43] WIP: Refactor CMake build system to more modular --- CMakeLists.txt | 624 +++++++------------------------------ README.md | 16 - cmake/arch.cmake | 207 ------------ cmake/cflags-arm.cmake | 130 ++++++++ cmake/cflags-generic.cmake | 164 ++++++++++ cmake/cflags-ppc64le.cmake | 18 ++ cmake/cflags-x86.cmake | 133 ++++++++ cmake/compiler.cmake | 19 ++ cmake/osdetection.cmake | 36 +++ cmake/platform.cmake | 28 +- unit/CMakeLists.txt | 9 +- 11 files changed, 625 insertions(+), 759 deletions(-) delete mode 100644 cmake/arch.cmake create mode 100644 cmake/cflags-arm.cmake create mode 100644 cmake/cflags-generic.cmake create mode 100644 cmake/cflags-ppc64le.cmake create mode 100644 cmake/cflags-x86.cmake create mode 100644 cmake/compiler.cmake create mode 100644 cmake/osdetection.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a1ca5522..d382402f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,11 @@ set (HS_MINOR_VERSION 4) set (HS_PATCH_VERSION 10) set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION}) +string (TIMESTAMP BUILD_DATE "%Y-%m-%d") +message(STATUS "Build date: ${BUILD_DATE}") + +# Dependencies check + set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) @@ -19,10 +24,19 @@ INCLUDE (CheckSymbolExists) include (CMakeDependentOption) include (GNUInstallDirs) include (${CMAKE_MODULE_PATH}/platform.cmake) +include (${CMAKE_MODULE_PATH}/boost.cmake) include (${CMAKE_MODULE_PATH}/ragel.cmake) find_package(PkgConfig QUIET) +find_program(RAGEL ragel) + +if(${RAGEL} STREQUAL "RAGEL-NOTFOUND") + message(FATAL_ERROR "Ragel state machine compiler not found") +endif() + +# Build type check + if (NOT CMAKE_BUILD_TYPE) message(STATUS "Default build type 'Release with debug info'") set(CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING "" FORCE ) @@ -55,231 +69,72 @@ foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${LIBDIR}") endforeach (OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) - -if(CMAKE_GENERATOR STREQUAL Xcode) - set(XCODE TRUE) -endif() - -# older versions of cmake don't know things support isystem -if (XCODE OR CMAKE_CXX_COMPILER_ID MATCHES "Intel") - set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem") -endif () - set(CMAKE_INCLUDE_CURRENT_DIR 1) include_directories(${PROJECT_SOURCE_DIR}/src) include_directories(${PROJECT_BINARY_DIR}) include_directories(SYSTEM include) -include (${CMAKE_MODULE_PATH}/boost.cmake) +# Compiler detection -find_package(Python COMPONENTS Interpreter) -find_program(RAGEL ragel) +include (${CMAKE_MODULE_PATH}/compiler.cmake) -if(NOT Python_Interpreter_FOUND) - message(FATAL_ERROR "No python interpreter found") +# CMake options + +if (BUILD_STATIC_AND_SHARED) + message(FATAL_ERROR "This option is no longer supported, please set at least one of BUILD_STATIC_LIBS and BUILD_SHARED_LIBS") endif() -# allow for reproducible builds - python for portability -if (DEFINED ENV{SOURCE_DATE_EPOCH}) - execute_process( - COMMAND "${PYTHON}" "${CMAKE_MODULE_PATH}/formatdate.py" "$ENV{SOURCE_DATE_EPOCH}" - OUTPUT_VARIABLE BUILD_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE) -else () - string (TIMESTAMP BUILD_DATE "%Y-%m-%d") -endif () -message(STATUS "Build date: ${BUILD_DATE}") +option(BUILD_SHARED_LIBS "Build shared libs" OFF) +option(BUILD_STATIC_LIBS "Build static libs" OFF) - -if(${RAGEL} STREQUAL "RAGEL-NOTFOUND") - message(FATAL_ERROR "Ragel state machine compiler not found") +if (BUILD_SHARED_LIBS) + message(STATUS "Building shared libraries") endif() - -option(DEBUG_OUTPUT "Enable debug output (warning: very verbose)" FALSE) - -if(DEBUG_OUTPUT) - add_definitions(-DDEBUG) - set(RELEASE_BUILD FALSE) -endif(DEBUG_OUTPUT) - -option(BUILD_SHARED_LIBS "Build shared libs instead of static" OFF) -option(BUILD_STATIC_AND_SHARED "Build shared libs as well as static" OFF) - -if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) - message(STATUS "Building shared libraries") -else() - message(STATUS "Building static libraries") +if (BUILD_STATIC_LIBS) + message(STATUS "Building static libraries") endif() if (NOT BUILD_SHARED_LIBS) # build static libs set(BUILD_STATIC_LIBS ON) - mark_as_advanced(BUILD_STATIC_LIBS) endif () +CMAKE_DEPENDENT_OPTION(DUMP_SUPPORT "Dump code support; normally on, except in release builds" ON "NOT RELEASE_BUILD" OFF) +CMAKE_DEPENDENT_OPTION(DISABLE_ASSERTS "Disable assert(); Asserts are enabled in debug builds, disabled in release builds" OFF "NOT RELEASE_BUILD" ON) + +option(DEBUG_OUTPUT "Enable debug output (warning: very verbose)" OFF) +if(DEBUG_OUTPUT) + add_definitions(-DDEBUG) + set(RELEASE_BUILD FALSE) +endif(DEBUG_OUTPUT) + + #for config if (RELEASE_BUILD) set(HS_OPTIMIZE ON) add_definitions(-DNDEBUG) endif() -include (${CMAKE_MODULE_PATH}/sanitize.cmake) - -CMAKE_DEPENDENT_OPTION(DUMP_SUPPORT "Dump code support; normally on, except in release builds" ON "NOT RELEASE_BUILD" OFF) - -CMAKE_DEPENDENT_OPTION(DISABLE_ASSERTS "Disable assert(); Asserts are enabled in debug builds, disabled in release builds" OFF "NOT RELEASE_BUILD" ON) - -option(BUILD_AVX512 "Experimental: support avx512 in the fat runtime" OFF) - -option(BUILD_AVX512VBMI "Experimental: support avx512vbmi in the fat runtime" OFF) - -if (BUILD_AVX512VBMI) - set(BUILD_AVX512 ON) -endif () - -if (NOT FAT_RUNTIME) - if (BUILD_SVE2_BITPERM) - set(BUILD_SVE2 ON) - endif () - - if (BUILD_SVE2) - set(BUILD_SVE ON) - endif () -endif () - -# TODO: per platform config files? - -# remove CMake's idea of optimisation -foreach (CONFIG ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES}) - string(REGEX REPLACE "-O[^ ]*" "" CMAKE_C_FLAGS_${CONFIG} "${CMAKE_C_FLAGS_${CONFIG}}") - string(REGEX REPLACE "-O[^ ]*" "" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}") -endforeach () - -if (CMAKE_C_COMPILER_ID MATCHES "Intel") - set(SKYLAKE_FLAG "-xCORE-AVX512") -else () - set(SKYLAKE_FLAG "-march=skylake-avx512") - set(ICELAKE_FLAG "-march=icelake-server") -endif () - -if(ARCH_PPC64EL) - set(ARCH_FLAG mcpu) -else() - set(ARCH_FLAG march) -endif() - -# Detect best GNUCC_ARCH to tune for -if (CMAKE_COMPILER_IS_GNUCC AND NOT CROSS_COMPILE) - message(STATUS "gcc version ${CMAKE_C_COMPILER_VERSION}") - - # If gcc doesn't recognise the host cpu, then mtune=native becomes - # generic, which isn't very good in some cases. march=native looks at - # cpuid info and then chooses the best microarch it can (and replaces - # the flag), so use that for tune. - - set(TUNE_FLAG "mtune") - set(GNUCC_TUNE "") - message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ") - - # arg1 might exist if using ccache - string (STRIP "${CMAKE_C_COMPILER_ARG1}" CC_ARG1) - set (EXEC_ARGS ${CC_ARG1} -c -Q --help=target -${ARCH_FLAG}=native -${TUNE_FLAG}=native) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS} - OUTPUT_VARIABLE _GCC_OUTPUT) - set(_GCC_OUTPUT_TUNE ${_GCC_OUTPUT}) - string(FIND "${_GCC_OUTPUT}" "${ARCH_FLAG}=" POS) - string(SUBSTRING "${_GCC_OUTPUT}" ${POS} -1 _GCC_OUTPUT) - string(REGEX REPLACE "${ARCH_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_ARCH "${_GCC_OUTPUT}") - - string(FIND "${_GCC_OUTPUT_TUNE}" "${TUNE_FLAG}=" POS_TUNE) - string(SUBSTRING "${_GCC_OUTPUT_TUNE}" ${POS_TUNE} -1 _GCC_OUTPUT_TUNE) - string(REGEX REPLACE "${TUNE_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_TUNE "${_GCC_OUTPUT_TUNE}") - - string(FIND "${GNUCC_ARCH}" "sve" POS_SVE) - string(FIND "${GNUCC_ARCH}" "sve2" POS_SVE2) - string(FIND "${GNUCC_ARCH}" "sve2-bitperm" POS_SVE2_BITPERM) - if(NOT POS_SVE2_BITPERM EQUAL 0) - set(SVE2_BITPERM_FOUND 1) - set(SVE2_FOUND 1) - set(SVE_FOUND 1) - elseif(NOT POS_SVE2 EQUAL 0) - set(SVE2_FOUND 1) - set(SVE_FOUND 1) - elseif (NOT POS_SVE EQUAL 0) - set(SVE_FOUND 1) - set(SVE2_BITPERM_FOUND 1) - endif() - - message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ") - - # test the parsed flag - set (EXEC_ARGS ${CC_ARG1} -E - -${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS} - OUTPUT_QUIET ERROR_QUIET - INPUT_FILE /dev/null - RESULT_VARIABLE GNUCC_TUNE_TEST) - if (NOT GNUCC_TUNE_TEST EQUAL 0) - message(WARNING "Something went wrong determining gcc tune: -mtune=${GNUCC_TUNE} not valid, falling back to -mtune=native") - set(GNUCC_TUNE native) - else() - set(GNUCC_TUNE ${GNUCC_TUNE}) - message(STATUS "gcc will tune for ${GNUCC_ARCH}, ${GNUCC_TUNE}") - endif() -elseif (CMAKE_COMPILER_IS_CLANG AND NOT CROSS_COMPILE) - if (ARCH_IA32 OR ARCH_X86_64) - set(GNUCC_ARCH native) - set(TUNE_FLAG generic) - elseif(ARCH_AARCH64) - set(GNUCC_ARCH armv8) - set(TUNE_FLAG generic) - elseif(ARCH_ARM32) - set(GNUCC_ARCH armv7a) - set(TUNE_FLAG generic) - else() - set(GNUCC_ARCH native) - set(TUNE_FLAG generic) - endif() - message(STATUS "clang will tune for ${GNUCC_ARCH}, ${TUNE_FLAG}") -elseif (CROSS_COMPILE) - set(GNUCC_ARCH generic) - set(TUNE_FLAG generic) -endif() +# Detect OS and if Fat Runtime is available +include (${CMAKE_MODULE_PATH}/osdetection.cmake) if (ARCH_IA32 OR ARCH_X86_64) - if (NOT FAT_RUNTIME) - if (BUILD_AVX512) - set(ARCH_C_FLAGS "${SKYLAKE_FLAG}") - set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}") - elseif (BUILD_AVX2) - set(ARCH_C_FLAGS "-mavx2") - set(ARCH_CXX_FLAGS "-mavx2") - else() - set(ARCH_C_FLAGS "-msse4.2") - set(ARCH_CXX_FLAGS "-msse4.2") - endif() - else() - set(ARCH_C_FLAGS "-msse4.2") - set(ARCH_CXX_FLAGS "-msse4.2") - endif() -endif() + include (${CMAKE_MODULE_PATH}/cflags-x86.cmake) + set(ARCH_FLAG march) +elseif (ARCH_ARM32 OR ARCH_AARCH64) + include (${CMAKE_MODULE_PATH}/cflags-arm.cmake) + set(ARCH_FLAG march) +elseif (ARCH_PPC64EL) + include (${CMAKE_MODULE_PATH}/cflags-ppc64le.cmake) + set(ARCH_FLAG mcpu) +endif () -if (ARCH_AARCH64) - if (NOT FAT_RUNTIME) - if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm") - elseif (BUILD_SVE2 AND NOT SVE2_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve2") - elseif (BUILD_SVE AND NOT SVE_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve") - endif () - else() - set(ARCH_C_FLAGS "") - set(ARCH_CXX_FLAGS "") - endif() -endif(ARCH_AARCH64) +# Detect Native arch flags if requested +include (${CMAKE_MODULE_PATH}/archdetect.cmake) -message(STATUS "ARCH_C_FLAGS : ${ARCH_C_FLAGS}") -message(STATUS "ARCH_CXX_FLAGS : ${ARCH_CXX_FLAGS}") +# Configure Compiler flags (Generic) + +include (${CMAKE_MODULE_PATH}/sanitize.cmake) if (NOT FAT_RUNTIME) if (GNUCC_TUNE) @@ -291,14 +146,14 @@ if (NOT FAT_RUNTIME) endif() endif() -# compiler version checks TODO: test more compilers -if (CMAKE_COMPILER_IS_GNUCXX) - set(GNUCXX_MINVER "9") - message(STATUS "g++ version ${CMAKE_CXX_COMPILER_VERSION}") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS GNUCXX_MINVER) - message(FATAL_ERROR "A minimum of g++ ${GNUCXX_MINVER} is required for C++17 support") - endif() -endif() +# remove CMake's idea of optimisation +foreach (CONFIG ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES}) + string(REGEX REPLACE "-O[^ ]*" "" CMAKE_C_FLAGS_${CONFIG} "${CMAKE_C_FLAGS_${CONFIG}}") + string(REGEX REPLACE "-O[^ ]*" "" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}") +endforeach () + +message(STATUS "ARCH_C_FLAGS : ${ARCH_C_FLAGS}") +message(STATUS "ARCH_CXX_FLAGS : ${ARCH_CXX_FLAGS}") if(RELEASE_BUILD) if (NOT CMAKE_BUILD_TYPE MATCHES MINSIZEREL) @@ -313,260 +168,13 @@ else() set(OPT_CXX_FLAG "-O0") endif(RELEASE_BUILD) -# set compiler flags - more are tested and added later -set(EXTRA_C_FLAGS "${OPT_C_FLAG} -std=c17 -Wall -Wextra -Wshadow -Wcast-qual -fno-strict-aliasing") -set(EXTRA_CXX_FLAGS "${OPT_CXX_FLAG} -std=c++17 -Wall -Wextra -Wshadow -Wswitch -Wreturn-type -Wcast-qual -Wno-deprecated -Wnon-virtual-dtor -fno-strict-aliasing") -if (NOT CMAKE_COMPILER_IS_CLANG) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-new-ttp-matching") -endif() - -if (NOT RELEASE_BUILD) - # -Werror is most useful during development, don't potentially break - # release builds - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Werror") - if (CMAKE_COMPILER_IS_CLANG) - if (CMAKE_C_COMPILER_VERSION VERSION_GREATER "13.0") - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-unused-but-set-variable") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-but-set-variable") - endif() - endif() -endif() - -if (DISABLE_ASSERTS) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -DNDEBUG") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -DNDEBUG") -endif() - -if(CMAKE_COMPILER_IS_GNUCC) - # spurious warnings? - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-array-bounds -Wno-maybe-uninitialized") -endif() - -if(CMAKE_COMPILER_IS_GNUCXX) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-maybe-uninitialized") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fabi-version=0") - endif () - # don't complain about abi - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-abi") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-abi") -endif() - -if (NOT(ARCH_IA32 AND RELEASE_BUILD)) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fno-omit-frame-pointer") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-omit-frame-pointer") -endif() - -CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H) -if (ARCH_IA32 OR ARCH_X86_64) - CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H) - CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H) - CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H) - CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H) -elseif (ARCH_ARM32 OR ARCH_AARCH64) - CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) - if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) - if (CMAKE_COMPILER_IS_CLANG) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve") - else() - set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS}) - endif() - CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) - if (NOT HAVE_C_ARM_SVE_H) - message(FATAL_ERROR "arm_sve.h is required to build for SVE.") - endif() - endif() -elseif (ARCH_PPC64EL) - CHECK_INCLUDE_FILE_CXX(altivec.h HAVE_C_PPC64EL_ALTIVEC_H) -endif() - -CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) -CHECK_FUNCTION_EXISTS(_aligned_malloc HAVE__ALIGNED_MALLOC) - -# these end up in the config file -CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAS_C_HIDDEN) -CHECK_CXX_COMPILER_FLAG(-fvisibility=hidden HAS_CXX_HIDDEN) - -# are we using libc++ -CHECK_CXX_SYMBOL_EXISTS(_LIBCPP_VERSION ciso646 HAVE_LIBCPP) - -if (RELEASE_BUILD) - if (HAS_C_HIDDEN) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fvisibility=hidden") - endif() - if (HAS_CXX_HIDDEN) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fvisibility=hidden") - endif() -endif() - -option(FAT_RUNTIME "Build a library that supports multiple microarchitectures" ON) -if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND FAT_RUNTIME MATCHES "ON") - message("Fat Runtime for ${GNUCC_ARCH}") - # This is a Linux-only feature for now - requires platform support - # elsewhere - message(STATUS "generator is ${CMAKE_GENERATOR}") - if (CMAKE_C_COMPILER_IS_CLANG AND CMAKE_C_COMPILER_VERSION VERSION_LESS "3.9") - message (STATUS "Clang v3.9 or higher required for fat runtime, cannot build fat runtime") - set (FAT_RUNTIME_REQUISITES FALSE) - elseif (NOT (CMAKE_GENERATOR MATCHES "Unix Makefiles" OR - (CMAKE_VERSION VERSION_GREATER "3.0" AND CMAKE_GENERATOR MATCHES "Ninja"))) - message (STATUS "Building the fat runtime requires the Unix Makefiles generator, or Ninja with CMake v3.0 or higher") - set (FAT_RUNTIME_REQUISITES FALSE) - else() - include (${CMAKE_MODULE_PATH}/attrib.cmake) - if (NOT HAS_C_ATTR_IFUNC) - message(STATUS "Compiler does not support ifunc attribute, cannot build fat runtime") - set (FAT_RUNTIME_REQUISITES FALSE) - else () - set (FAT_RUNTIME_REQUISITES TRUE) - endif() - endif() - if (NOT FAT_RUNTIME_REQUISITES OR NOT RELEASE_BUILD) - set (FAT_RUNTIME OFF) - endif() -endif () - -include (${CMAKE_MODULE_PATH}/arch.cmake) - -# testing a builtin takes a little more work -CHECK_C_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CC_BUILTIN_ASSUME_ALIGNED) -CHECK_CXX_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CXX_BUILTIN_ASSUME_ALIGNED) -# Clang does not use __builtin_constant_p() the same way as gcc -if (NOT CMAKE_COMPILER_IS_CLANG) - CHECK_C_SOURCE_COMPILES("int main(void) { __builtin_constant_p(0); }" HAVE__BUILTIN_CONSTANT_P) -endif() - -set(C_FLAGS_TO_CHECK -# Variable length arrays are way bad, most especially at run time -"-Wvla" -# Pointer arith on void pointers is doing it wrong. - "-Wpointer-arith" -# Build our C code with -Wstrict-prototypes -Wmissing-prototypes - "-Wstrict-prototypes" - "-Wmissing-prototypes" -) -foreach (FLAG ${C_FLAGS_TO_CHECK}) - # munge the name so it doesn't break things - string(REPLACE "-" "_" FNAME C_FLAG${FLAG}) - CHECK_C_COMPILER_FLAG("${FLAG}" ${FNAME}) - if (${FNAME}) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${FLAG}") - endif() -endforeach() - -set(CXX_FLAGS_TO_CHECK -"-Wvla" -"-Wpointer-arith" -) -foreach (FLAG ${CXX_FLAGS_TO_CHECK}) - string(REPLACE "-" "_" FNAME CXX_FLAG${FLAG}) - CHECK_CXX_COMPILER_FLAG("${FLAG}" ${FNAME}) - if (${FNAME}) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${FLAG}") - endif() -endforeach() - -# self-assign should be thrown away, but clang whinges -CHECK_C_COMPILER_FLAG("-Wself-assign" CC_SELF_ASSIGN) -if (CC_SELF_ASSIGN) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-self-assign") -endif() -CHECK_CXX_COMPILER_FLAG("-Wself-assign" CXX_SELF_ASSIGN) -if (CXX_SELF_ASSIGN) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-self-assign") -endif() - -# clang gets up in our face for going paren crazy with macros -CHECK_C_COMPILER_FLAG("-Wparentheses-equality" CC_PAREN_EQUALITY) -if (CC_PAREN_EQUALITY) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-parentheses-equality") -endif() - -# clang complains about unused const vars in our Ragel-generated code. -CHECK_CXX_COMPILER_FLAG("-Wunused-const-variable" CXX_UNUSED_CONST_VAR) -if (CXX_UNUSED_CONST_VAR) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-const-variable") -endif() - -# clang-14 complains about unused-but-set variable. -CHECK_CXX_COMPILER_FLAG("-Wunused-but-set-variable" CXX_UNUSED_BUT_SET_VAR) -if (CXX_UNUSED_BUT_SET_VAR) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-but-set-variable") -endif() - -# clang-14 complains about using bitwise operator instead of logical ones. -CHECK_CXX_COMPILER_FLAG("-Wbitwise-instead-of-logical" CXX_BITWISE_INSTEAD_OF_LOGICAL) -if (CXX_BITWISE_INSTEAD_OF_LOGICAL) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-bitwise-instead-of-logical") -endif() - -# gcc 6 complains about type attributes that get ignored, like alignment -CHECK_CXX_COMPILER_FLAG("-Wignored-attributes" CXX_IGNORED_ATTR) -if (CXX_IGNORED_ATTR) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-ignored-attributes") -endif() - -# gcc 9 complains about redundant move for returned variable -CHECK_CXX_COMPILER_FLAG("-Wredundant-move" CXX_REDUNDANT_MOVE) -if (CXX_REDUNDANT_MOVE) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-redundant-move") -endif() - -# note this for later -# g++ doesn't have this flag but clang does -CHECK_CXX_COMPILER_FLAG("-Wweak-vtables" CXX_WEAK_VTABLES) -if (CXX_WEAK_VTABLES) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wweak-vtables") -endif() - -CHECK_CXX_COMPILER_FLAG("-Wmissing-declarations" CXX_MISSING_DECLARATIONS) -if (CXX_MISSING_DECLARATIONS) - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wmissing-declarations") -endif() - -CHECK_CXX_COMPILER_FLAG("-Wunused-local-typedefs" CXX_UNUSED_LOCAL_TYPEDEFS) - -# gcc5 complains about this -CHECK_CXX_COMPILER_FLAG("-Wunused-variable" CXX_WUNUSED_VARIABLE) - -# gcc 10 complains about this -CHECK_C_COMPILER_FLAG("-Wstringop-overflow" CC_STRINGOP_OVERFLOW) -CHECK_CXX_COMPILER_FLAG("-Wstringop-overflow" CXX_STRINGOP_OVERFLOW) -if(CC_STRINGOP_OVERFLOW OR CXX_STRINGOP_OVERFLOW) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-stringop-overflow") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-stringop-overflow") -endif() +include (${CMAKE_MODULE_PATH}/cflags-generic.cmake) include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) -if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(LINUX TRUE) -endif(CMAKE_SYSTEM_NAME MATCHES "Linux") - -if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - set(FREEBSD true) -endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - - -if (FAT_RUNTIME) - if (NOT (ARCH_IA32 OR ARCH_X86_64 OR ARCH_AARCH64)) - message(FATAL_ERROR "Fat runtime is only supported on Intel and Aarch64 architectures") - else() - message(STATUS "Building runtime for multiple microarchitectures") - endif() -else() - if (CROSS_COMPILE) - message(STATUS "Building for target CPU: ${ARCH_C_FLAGS}") - else() - message(STATUS "Building for current host CPU: ${ARCH_C_FLAGS}") - endif() -endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_CXX_FLAGS}") -add_subdirectory(doc/dev-reference) - # PCRE check, we have a fixed requirement for PCRE to use Chimera # and hscollider set(PCRE_REQUIRED_MAJOR_VERSION 8) @@ -584,32 +192,6 @@ endif() set(RAGEL_C_FLAGS "-Wno-unused -funsigned-char") -add_subdirectory(unit) -if (EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt) - add_subdirectory(tools) -endif() -if (EXISTS ${CMAKE_SOURCE_DIR}/chimera/CMakeLists.txt AND BUILD_CHIMERA) - add_subdirectory(chimera) -endif() - -# do substitutions -configure_file(${CMAKE_MODULE_PATH}/config.h.in ${PROJECT_BINARY_DIR}/config.h) -configure_file(src/hs_version.h.in ${PROJECT_BINARY_DIR}/hs_version.h) - - -configure_file(libhs.pc.in libhs.pc @ONLY) # only replace @ quoted vars -install(FILES ${CMAKE_BINARY_DIR}/libhs.pc - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") - -# only set these after all tests are done -if (NOT FAT_RUNTIME) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${HS_C_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS} ${HS_CXX_FLAGS}") -else() -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") -endif() - set_source_files_properties( ${CMAKE_BINARY_DIR}/src/parser/Parser.cpp PROPERTIES @@ -624,7 +206,22 @@ set_source_files_properties( ragelmaker(src/parser/control_verbs.rl) -add_subdirectory(util) +# do substitutions +configure_file(${CMAKE_MODULE_PATH}/config.h.in ${PROJECT_BINARY_DIR}/config.h) +configure_file(src/hs_version.h.in ${PROJECT_BINARY_DIR}/hs_version.h) + +configure_file(libhs.pc.in libhs.pc @ONLY) # only replace @ quoted vars +install(FILES ${CMAKE_BINARY_DIR}/libhs.pc + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + +# only set these after all tests are done +if (NOT FAT_RUNTIME) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${HS_C_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS} ${HS_CXX_FLAGS}") +else() +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") +endif() SET(hs_HEADERS src/hs.h @@ -799,7 +396,6 @@ set (hs_exec_SRCS src/database.h ) -if (NOT RELEASE_BUILD OR FAT_RUNTIME) if (ARCH_IA32 OR ARCH_X86_64) set (hs_exec_SRCS ${hs_exec_SRCS} @@ -814,19 +410,24 @@ set (hs_exec_SRCS ${hs_exec_SRCS} src/nfa/vermicelli_simd.cpp src/util/supervector/arch/ppc64el/impl.cpp) -endif () endif() -set (hs_exec_neon_SRCS - src/nfa/vermicelli_simd.cpp) -set (hs_exec_sve_SRCS - src/nfa/vermicelli_simd.cpp) +if (ARCH_IA32 OR ARCH_X86_64) + set (hs_exec_avx2_SRCS + src/fdr/teddy_avx2.c + src/util/arch/x86/masked_move.c + src/util/arch/x86/masked_move.h + ) +endif() -set (hs_exec_avx2_SRCS - src/fdr/teddy_avx2.c - src/util/arch/x86/masked_move.c - src/util/arch/x86/masked_move.h -) +if (ARCH_ARM32 OR ARCH_AARCH64) + set (hs_exec_neon_SRCS + src/nfa/vermicelli_simd.cpp) + set (hs_exec_sve_SRCS + src/nfa/vermicelli_simd.cpp) + set (hs_exec_sve2_SRCS + src/nfa/vermicelli_simd.cpp) +endif() SET (hs_compile_SRCS ${hs_HEADERS} @@ -1270,16 +871,16 @@ endif() set (LIB_VERSION ${HS_VERSION}) set (LIB_SOVERSION ${HS_MAJOR_VERSION}) +add_link_options(-Wl,--as-needed) if (NOT FAT_RUNTIME) - set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_common_SRCS}) - if (BUILD_AVX2) - set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - endif() - - if (ARCH_AARCH64) + if (ARCH_IA32 OR ARCH_X86_64) + if (BUILD_AVX2) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + endif() + elseif (ARCH_AARCH64) if (BUILD_SVE2) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) elseif (BUILD_SVE) @@ -1303,7 +904,7 @@ if (NOT FAT_RUNTIME) $) endif (BUILD_STATIC_LIBS) - if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) add_library(hs_exec_shared OBJECT ${hs_exec_SRCS}) set_target_properties(hs_exec_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) @@ -1382,7 +983,7 @@ else () ${RUNTIME_LIBS}) endif (BUILD_STATIC_LIBS) - if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) # build shared libs add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) @@ -1488,7 +1089,7 @@ else () ${RUNTIME_LIBS}) endif (BUILD_STATIC_LIBS) - if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) set (BUILD_SVE OFF) set (BUILD_SVE2 OFF) set (BUILD_SVE2_BITPERM OFF) @@ -1535,7 +1136,7 @@ if (NOT BUILD_SHARED_LIBS) install(TARGETS hs_runtime DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() -if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) +if (BUILD_SHARED_LIBS) if (NOT FAT_RUNTIME) add_library(hs_runtime_shared SHARED src/hs_version.c src/hs_valid_platform.c $ @@ -1567,19 +1168,12 @@ if (NOT BUILD_SHARED_LIBS) install(TARGETS hs DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() -if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) +if (BUILD_SHARED_LIBS) set(hs_shared_SRCS src/hs_version.c src/hs_valid_platform.c $) - if (XCODE) - # force this lib to use C++ linkage - add_custom_command(OUTPUT empty.cxx - COMMAND ${CMAKE_COMMAND} -E touch empty.cxx) - set (hs_shared_SRCS ${hs_shared_SRCS} empty.cxx) - endif (XCODE) - if (NOT FAT_RUNTIME) set(hs_shared_SRCS ${hs_shared_SRCS} @@ -1612,6 +1206,16 @@ if (NOT BUILD_STATIC_LIBS) add_library(hs ALIAS hs_shared) endif () +add_subdirectory(util) +add_subdirectory(unit) + +if (EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt) + add_subdirectory(tools) +endif() +if (EXISTS ${CMAKE_SOURCE_DIR}/chimera/CMakeLists.txt AND BUILD_CHIMERA) + add_subdirectory(chimera) +endif() + option(BUILD_EXAMPLES "Build Hyperscan example code (default TRUE)" TRUE) if(BUILD_EXAMPLES) add_subdirectory(examples) @@ -1621,3 +1225,5 @@ option(BUILD_BENCHMARKS "Build benchmarks (default TRUE)" TRUE) if(BUILD_BENCHMARKS) add_subdirectory(benchmarks) endif() + +add_subdirectory(doc/dev-reference) diff --git a/README.md b/README.md index 8bc7aff6..a40e6382 100644 --- a/README.md +++ b/README.md @@ -29,22 +29,6 @@ matching of regular expressions across streams of data. Vectorscan is typically used in a DPI library stack, just like Hyperscan. -# Cross Compiling for AArch64 - -- To cross compile for AArch64, first adjust the variables set in cmake/setenv-arm64-cross.sh. - - `export CROSS=/bin/aarch64-linux-gnu-` - - `export CROSS_SYS=` - - `export BOOST_PATH=` -- Set the environment variables: - - `source cmake/setenv-arm64-cross.sh` -- Configure Vectorscan: - - `mkdir ` - - `cd ` - - `cmake -DCROSS_COMPILE_AARCH64=1 -DCMAKE_TOOLCHAIN_FILE=/cmake/arm64-cross.cmake` -- Build Vectorscan: - - `make -jT` where T is the number of threads used to compile. - - `cmake --build . -- -j T` can also be used instead of make. - # Compiling for SVE The following cmake variables can be set in order to target Arm's Scalable diff --git a/cmake/arch.cmake b/cmake/arch.cmake deleted file mode 100644 index f2c060ea..00000000 --- a/cmake/arch.cmake +++ /dev/null @@ -1,207 +0,0 @@ -# detect architecture features -# -# must be called after determining where compiler intrinsics are defined - -if (HAVE_C_X86INTRIN_H) - set (INTRIN_INC_H "x86intrin.h") -elseif (HAVE_C_INTRIN_H) - set (INTRIN_INC_H "intrin.h") -elseif (HAVE_C_ARM_NEON_H) - set (INTRIN_INC_H "arm_neon.h") -elseif (HAVE_C_PPC64EL_ALTIVEC_H) - set (INTRIN_INC_H "altivec.h") - set (FAT_RUNTIME OFF) -else() - message (FATAL_ERROR "No intrinsics header found") -endif () - -if (ARCH_ARM32 OR ARCH_AARCH64) - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -int main() { - int32x4_t a = vdupq_n_s32(1); - (void)a; -}" HAVE_NEON) -endif () - -if (ARCH_AARCH64) - if (APPLE) - set (FAT_RUNTIME OFF) - endif() - set(PREV_FLAGS "${CMAKE_C_FLAGS}") - if (BUILD_SVE2_BITPERM) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") - CHECK_C_SOURCE_COMPILES("#include - int main() { - svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); - (void)a; - }" HAVE_SVE2_BITPERM) - if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE2_BITPERM) - endif () - endif() - if (BUILD_SVE2) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") - CHECK_C_SOURCE_COMPILES("#include - int main() { - svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3)); - (void)a; - }" HAVE_SVE2) - endif() - if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE2) - endif () - if (BUILD_SVE) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") - CHECK_C_SOURCE_COMPILES("#include - int main() { - svuint8_t a = svdup_u8(1); - (void)a; - }" HAVE_SVE) - endif () - if ((HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE) - endif () - set(CMAKE_C_FLAGS "${PREV_FLAGS}") -endif() - -if (BUILD_AVX512) - CHECK_C_COMPILER_FLAG(${SKYLAKE_FLAG} HAS_ARCH_SKYLAKE) - if (NOT HAS_ARCH_SKYLAKE) - message (FATAL_ERROR "AVX512 not supported by compiler") - endif () -endif () - -if (BUILD_AVX512VBMI) - CHECK_C_COMPILER_FLAG(${ICELAKE_FLAG} HAS_ARCH_ICELAKE) - if (NOT HAS_ARCH_ICELAKE) - message (FATAL_ERROR "AVX512VBMI not supported by compiler") - endif () -endif () - -if (FAT_RUNTIME) - if (ARCH_IA32 OR ARCH_X86_64) - if (NOT DEFINED(BUILD_AVX2)) - set(BUILD_AVX2 TRUE) - endif () - # test the highest level microarch to make sure everything works - if (BUILD_AVX512) - if (BUILD_AVX512VBMI) - set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${ICELAKE_FLAG}") - else () - set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${SKYLAKE_FLAG}") - endif (BUILD_AVX512VBMI) - elseif (BUILD_AVX2) - set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} -march=core-avx2 -mavx2") - elseif () - set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} -march=core-i7 -mssse3") - endif () - elseif(ARCH_AARCH64) - if (NOT DEFINED(BUILD_SVE)) - set(BUILD_SVE TRUE) - endif () - if (NOT DEFINED(BUILD_SVE2)) - set(BUILD_SVE2 TRUE) - endif () - endif() -else (NOT FAT_RUNTIME) - # if not fat runtime, then test given cflags - set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${ARCH_C_FLAGS}") -endif () - -if (ARCH_IA32 OR ARCH_X86_64) - # ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -int main() { - __m128i a = _mm_set1_epi8(1); - (void)_mm_shuffle_epi8(a, a); -}" HAVE_SSE42) - - # now look for AVX2 - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -#if !defined(__AVX2__) -#error no avx2 -#endif - -int main(){ - __m256i z = _mm256_setzero_si256(); - (void)_mm256_xor_si256(z, z); -}" HAVE_AVX2) - - # and now for AVX512 - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -#if !defined(__AVX512BW__) -#error no avx512bw -#endif - -int main(){ - __m512i z = _mm512_setzero_si512(); - (void)_mm512_abs_epi8(z); -}" HAVE_AVX512) - - # and now for AVX512VBMI - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -#if !defined(__AVX512VBMI__) -#error no avx512vbmi -#endif - -int main(){ - __m512i a = _mm512_set1_epi8(0xFF); - __m512i idx = _mm512_set_epi64(3ULL, 2ULL, 1ULL, 0ULL, 7ULL, 6ULL, 5ULL, 4ULL); - (void)_mm512_permutexvar_epi8(idx, a); -}" HAVE_AVX512VBMI) - - -elseif (ARCH_ARM32 OR ARCH_AARCH64) - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -int main() { - int32x4_t a = vdupq_n_s32(1); - (void)a; -}" HAVE_NEON) -elseif (ARCH_PPC64EL) - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> -int main() { - vector int a = vec_splat_s32(1); - (void)a; -}" HAVE_VSX) -else () - message (FATAL_ERROR "Unsupported architecture") -endif () - -if (FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) - message(FATAL_ERROR "SSE4.2 support required to build fat runtime") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) - message(FATAL_ERROR "AVX2 support required to build fat runtime") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) - message(FATAL_ERROR "AVX512 support requested but not supported") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) - message(FATAL_ERROR "AVX512VBMI support requested but not supported") - endif () -else (NOT FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT BUILD_AVX2) - message(STATUS "Building without AVX2 support") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512) - message(STATUS "Building without AVX512 support") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512VBMI) - message(STATUS "Building without AVX512VBMI support") - endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) - message(FATAL_ERROR "A minimum of SSE4.2 compiler support is required") - endif () - if ((ARCH_ARM32 OR ARCH_AARCH64) AND NOT HAVE_NEON) - message(FATAL_ERROR "NEON support required for ARM support") - endif () - if (ARCH_PPPC64EL AND NOT HAVE_VSX) - message(FATAL_ERROR "VSX support required for Power support") - endif () - -endif () - -unset (PREV_FLAGS) -unset (CMAKE_REQUIRED_FLAGS) -unset (INTRIN_INC_H) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake new file mode 100644 index 00000000..61995cf9 --- /dev/null +++ b/cmake/cflags-arm.cmake @@ -0,0 +1,130 @@ +if (NOT FAT_RUNTIME) + if (BUILD_SVE2_BITPERM) + message (STATUS "SVE2_BITPERM implies SVE2, enabling BUILD_SVE2") + set(BUILD_SVE2 ON) + endif () + if (BUILD_SVE2) + message (STATUS "SVE2 implies SVE, enabling BUILD_SVE") + set(BUILD_SVE ON) + endif () +endif () + +if (ARCH_AARCH64) + if (NOT FAT_RUNTIME) + if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND) + set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm") + elseif (BUILD_SVE2 AND NOT SVE2_FOUND) + set(GNUCC_ARCH "${GNUCC_ARCH}+sve2") + elseif (BUILD_SVE AND NOT SVE_FOUND) + set(GNUCC_ARCH "${GNUCC_ARCH}+sve") + endif () + else() + set(ARCH_C_FLAGS "") + set(ARCH_CXX_FLAGS "") + endif() +endif(ARCH_AARCH64) + +CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) +if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) + if (CMAKE_COMPILER_IS_CLANG) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve") + else() + set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS}) + endif() + CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) + if (NOT HAVE_C_ARM_SVE_H) + message(FATAL_ERROR "arm_sve.h is required to build for SVE.") + endif() +endif() + +if (HAVE_C_EC_H) + set (INTRIN_INC_H "altivec.h") +else() + message (FATAL_ERROR "No intrinsics header found for VSX") +endif () + +if (ARCH_ARM32 OR ARCH_AARCH64) + CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +int main() { + int32x4_t a = vdupq_n_s32(1); + (void)a; +}" HAVE_NEON) +endif () + +set(PREV_FLAGS "${CMAKE_C_FLAGS}") +if (BUILD_SVE2_BITPERM) + set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") + CHECK_C_SOURCE_COMPILES("#include + int main() { + svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); + (void)a; + }" HAVE_SVE2_BITPERM) + if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME) + add_definitions(-DHAVE_SVE2_BITPERM) + endif () + endif() + if (BUILD_SVE2) + set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") + CHECK_C_SOURCE_COMPILES("#include + int main() { + svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3)); + (void)a; + }" HAVE_SVE2) + endif() + if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) + add_definitions(-DHAVE_SVE2) + endif () + if (BUILD_SVE) + set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") + CHECK_C_SOURCE_COMPILES("#include + int main() { + svuint8_t a = svdup_u8(1); + (void)a; + }" HAVE_SVE) + endif () + if ((HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) + add_definitions(-DHAVE_SVE) + endif () + set(CMAKE_C_FLAGS "${PREV_FLAGS}") +endif() + +if (FAT_RUNTIME) + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) + message(FATAL_ERROR "SSE4.2 support required to build fat runtime") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) + message(FATAL_ERROR "AVX2 support required to build fat runtime") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) + message(FATAL_ERROR "AVX512 support requested but not supported") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) + message(FATAL_ERROR "AVX512VBMI support requested but not supported") + endif () +else (NOT FAT_RUNTIME) + if (ARCH_AARCH64 AND NOT BUILD_SVE) + message(STATUS "Building without SVE support") + endif () + if (ARCH_AARCH64 AND NOT BUILD_SVE2) + message(STATUS "Building without SVE2 support") + endif () + if ((ARCH_ARM32 OR ARCH_AARCH64) AND NOT HAVE_NEON) + message(FATAL_ERROR "Neon/ASIMD support required for Arm support") + endif () +endif () + + string(FIND "${GNUCC_ARCH}" "sve" POS_SVE) + string(FIND "${GNUCC_ARCH}" "sve2" POS_SVE2) + string(FIND "${GNUCC_ARCH}" "sve2-bitperm" POS_SVE2_BITPERM) + if(NOT POS_SVE2_BITPERM EQUAL 0) + set(SVE2_BITPERM_FOUND 1) + set(SVE2_FOUND 1) + set(SVE_FOUND 1) + elseif(NOT POS_SVE2 EQUAL 0) + set(SVE2_FOUND 1) + set(SVE_FOUND 1) + elseif (NOT POS_SVE EQUAL 0) + set(SVE_FOUND 1) + set(SVE2_BITPERM_FOUND 1) + endif() + diff --git a/cmake/cflags-generic.cmake b/cmake/cflags-generic.cmake new file mode 100644 index 00000000..4eabcdb5 --- /dev/null +++ b/cmake/cflags-generic.cmake @@ -0,0 +1,164 @@ +# set compiler flags - more are tested and added later +set(EXTRA_C_FLAGS "${OPT_C_FLAG} -std=c17 -Wall -Wextra -Wshadow -Wcast-qual -fno-strict-aliasing") +set(EXTRA_CXX_FLAGS "${OPT_CXX_FLAG} -std=c++17 -Wall -Wextra -Wshadow -Wswitch -Wreturn-type -Wcast-qual -Wno-deprecated -Wnon-virtual-dtor -fno-strict-aliasing") +if (NOT CMAKE_COMPILER_IS_CLANG) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-new-ttp-matching") +endif() + +if (NOT RELEASE_BUILD) + # -Werror is most useful during development, don't potentially break + # release builds + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Werror") + if (CMAKE_COMPILER_IS_CLANG) + if (CMAKE_C_COMPILER_VERSION VERSION_GREATER "13.0") + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-unused-but-set-variable") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-but-set-variable") + endif() + endif() +endif() + +if (DISABLE_ASSERTS) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -DNDEBUG") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -DNDEBUG") +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + # spurious warnings? + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-array-bounds -Wno-maybe-uninitialized") +endif() + +if(CMAKE_COMPILER_IS_GNUCXX) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-maybe-uninitialized") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fabi-version=0") + endif () + # don't complain about abi + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-abi") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-abi") +endif() + +if (NOT(ARCH_IA32 AND RELEASE_BUILD)) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fno-omit-frame-pointer") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-omit-frame-pointer") +endif() + +CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H) +CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) +CHECK_FUNCTION_EXISTS(_aligned_malloc HAVE__ALIGNED_MALLOC) + +# these end up in the config file +CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAS_C_HIDDEN) +CHECK_CXX_COMPILER_FLAG(-fvisibility=hidden HAS_CXX_HIDDEN) + +# are we using libc++ +CHECK_CXX_SYMBOL_EXISTS(_LIBCPP_VERSION ciso646 HAVE_LIBCPP) + +if (RELEASE_BUILD) + if (HAS_C_HIDDEN) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fvisibility=hidden") + endif() + if (HAS_CXX_HIDDEN) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fvisibility=hidden") + endif() +endif() + +# testing a builtin takes a little more work +CHECK_C_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CC_BUILTIN_ASSUME_ALIGNED) +CHECK_CXX_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CXX_BUILTIN_ASSUME_ALIGNED) +# Clang does not use __builtin_constant_p() the same way as gcc +if (NOT CMAKE_COMPILER_IS_CLANG) + CHECK_C_SOURCE_COMPILES("int main(void) { __builtin_constant_p(0); }" HAVE__BUILTIN_CONSTANT_P) +endif() + +set(C_FLAGS_TO_CHECK +# Variable length arrays are way bad, most especially at run time +"-Wvla" +# Pointer arith on void pointers is doing it wrong. + "-Wpointer-arith" +# Build our C code with -Wstrict-prototypes -Wmissing-prototypes + "-Wstrict-prototypes" + "-Wmissing-prototypes" +) +foreach (FLAG ${C_FLAGS_TO_CHECK}) + # munge the name so it doesn't break things + string(REPLACE "-" "_" FNAME C_FLAG${FLAG}) + CHECK_C_COMPILER_FLAG("${FLAG}" ${FNAME}) + if (${FNAME}) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${FLAG}") + endif() +endforeach() + +# self-assign should be thrown away, but clang whinges +CHECK_C_COMPILER_FLAG("-Wself-assign" CC_SELF_ASSIGN) +if (CC_SELF_ASSIGN) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-self-assign") +endif() +CHECK_CXX_COMPILER_FLAG("-Wself-assign" CXX_SELF_ASSIGN) +if (CXX_SELF_ASSIGN) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-self-assign") +endif() + +# clang gets up in our face for going paren crazy with macros +CHECK_C_COMPILER_FLAG("-Wparentheses-equality" CC_PAREN_EQUALITY) +if (CC_PAREN_EQUALITY) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-parentheses-equality") +endif() + +# clang complains about unused const vars in our Ragel-generated code. +CHECK_CXX_COMPILER_FLAG("-Wunused-const-variable" CXX_UNUSED_CONST_VAR) +if (CXX_UNUSED_CONST_VAR) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-const-variable") +endif() + +# clang-14 complains about unused-but-set variable. +CHECK_CXX_COMPILER_FLAG("-Wunused-but-set-variable" CXX_UNUSED_BUT_SET_VAR) +if (CXX_UNUSED_BUT_SET_VAR) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-but-set-variable") +endif() + +# clang-14 complains about using bitwise operator instead of logical ones. +CHECK_CXX_COMPILER_FLAG("-Wbitwise-instead-of-logical" CXX_BITWISE_INSTEAD_OF_LOGICAL) +if (CXX_BITWISE_INSTEAD_OF_LOGICAL) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-bitwise-instead-of-logical") +endif() + +# clang-14 complains about using bitwise operator instead of logical ones. +CHECK_CXX_COMPILER_FLAG("-Wbitwise-instead-of-logical" CXX_BITWISE_INSTEAD_OF_LOGICAL) +if (CXX_BITWISE_INSTEAD_OF_LOGICAL) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-bitwise-instead-of-logical") +endif() + +CHECK_CXX_COMPILER_FLAG("-Wignored-attributes" CXX_IGNORED_ATTR) +if (CXX_IGNORED_ATTR) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-ignored-attributes") +endif() + +# gcc 9 complains about redundant move for returned variable +CHECK_CXX_COMPILER_FLAG("-Wredundant-move" CXX_REDUNDANT_MOVE) +if (CXX_REDUNDANT_MOVE) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-redundant-move") +endif() + +# note this for later, g++ doesn't have this flag but clang does +CHECK_CXX_COMPILER_FLAG("-Wweak-vtables" CXX_WEAK_VTABLES) +if (CXX_WEAK_VTABLES) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wweak-vtables") +endif() + +CHECK_CXX_COMPILER_FLAG("-Wmissing-declarations" CXX_MISSING_DECLARATIONS) +if (CXX_MISSING_DECLARATIONS) + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wmissing-declarations") +endif() + +CHECK_CXX_COMPILER_FLAG("-Wunused-local-typedefs" CXX_UNUSED_LOCAL_TYPEDEFS) + +CHECK_CXX_COMPILER_FLAG("-Wunused-variable" CXX_WUNUSED_VARIABLE) + +# gcc 10 complains about this +CHECK_C_COMPILER_FLAG("-Wstringop-overflow" CC_STRINGOP_OVERFLOW) +CHECK_CXX_COMPILER_FLAG("-Wstringop-overflow" CXX_STRINGOP_OVERFLOW) +if(CC_STRINGOP_OVERFLOW OR CXX_STRINGOP_OVERFLOW) + set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-stringop-overflow") + set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-stringop-overflow") +endif() diff --git a/cmake/cflags-ppc64le.cmake b/cmake/cflags-ppc64le.cmake new file mode 100644 index 00000000..2ea9f1ba --- /dev/null +++ b/cmake/cflags-ppc64le.cmake @@ -0,0 +1,18 @@ + +CHECK_INCLUDE_FILE_CXX(altivec.h HAVE_C_PPC64EL_ALTIVEC_H) + +if (HAVE_C_PPC64EL_ALTIVEC_H) + set (INTRIN_INC_H "altivec.h") +else() + message (FATAL_ERROR "No intrinsics header found for VSX") +endif () + +CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +int main() { + vector int a = vec_splat_s32(1); + (void)a; +}" HAVE_VSX) + +if (NOT HAVE_VSX) + message(FATAL_ERROR "VSX support required for Power support") +endif () diff --git a/cmake/cflags-x86.cmake b/cmake/cflags-x86.cmake new file mode 100644 index 00000000..b35ba5b5 --- /dev/null +++ b/cmake/cflags-x86.cmake @@ -0,0 +1,133 @@ +option(BUILD_AVX512 "Enabling support for AVX512" OFF) +option(BUILD_AVX512VBMI "Enabling support for AVX512VBMI" OFF) + +if (NOT FAT_RUNTIME) + if (BUILD_AVX512VBMI) + message (STATUS "AVX512VBMI implies AVX512, enabling BUILD_AVX512") + set(BUILD_AVX512 ON) + endif () + if (BUILD_AVX512) + message (STATUS "AVX512 implies AVX2, enabling BUILD_AVX2") + set(BUILD_AVX2 ON) + endif () +endif() + +set(SKYLAKE_FLAG "-march=skylake-avx512") +set(ICELAKE_FLAG "-march=icelake-server") + +if (ARCH_IA32 OR ARCH_X86_64) + if (NOT FAT_RUNTIME) + if (BUILD_AVX512) + set(ARCH_C_FLAGS "${SKYLAKE_FLAG}") + set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}") + elseif (BUILD_AVX2) + set(ARCH_C_FLAGS "-mavx2") + set(ARCH_CXX_FLAGS "-mavx2") + else() + set(ARCH_C_FLAGS "-msse4.2") + set(ARCH_CXX_FLAGS "-msse4.2") + endif() + else() + set(ARCH_C_FLAGS "-msse4.2") + set(ARCH_CXX_FLAGS "-msse4.2") + endif() +endif() + +CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H) +CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H) +CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H) +CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H) + +if (HAVE_C_X86INTRIN_H) + set (INTRIN_INC_H "x86intrin.h") +elseif (HAVE_C_INTRIN_H) + set (INTRIN_INC_H "intrin.h") +else() + message (FATAL_ERROR "No intrinsics header found for SSE/AVX2/AVX512") +endif () + +if (BUILD_AVX512) + CHECK_C_COMPILER_FLAG(${SKYLAKE_FLAG} HAS_ARCH_SKYLAKE) + if (NOT HAS_ARCH_SKYLAKE) + message (FATAL_ERROR "AVX512 not supported by compiler") + endif () +endif () + +if (BUILD_AVX512VBMI) + CHECK_C_COMPILER_FLAG(${ICELAKE_FLAG} HAS_ARCH_ICELAKE) + if (NOT HAS_ARCH_ICELAKE) + message (FATAL_ERROR "AVX512VBMI not supported by compiler") + endif () +endif () + +if (ARCH_IA32 OR ARCH_X86_64) + # ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic + CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +int main() { + __m128i a = _mm_set1_epi8(1); + (void)_mm_shuffle_epi8(a, a); +}" HAVE_SSE42) + + # now look for AVX2 + CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +#if !defined(__AVX2__) +#error no avx2 +#endif + +int main(){ + __m256i z = _mm256_setzero_si256(); + (void)_mm256_xor_si256(z, z); +}" HAVE_AVX2) + + # and now for AVX512 + CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +#if !defined(__AVX512BW__) +#error no avx512bw +#endif + +int main(){ + __m512i z = _mm512_setzero_si512(); + (void)_mm512_abs_epi8(z); +}" HAVE_AVX512) + + # and now for AVX512VBMI + CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +#if !defined(__AVX512VBMI__) +#error no avx512vbmi +#endif + +int main(){ + __m512i a = _mm512_set1_epi8(0xFF); + __m512i idx = _mm512_set_epi64(3ULL, 2ULL, 1ULL, 0ULL, 7ULL, 6ULL, 5ULL, 4ULL); + (void)_mm512_permutexvar_epi8(idx, a); +}" HAVE_AVX512VBMI) + +if (FAT_RUNTIME) + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) + message(FATAL_ERROR "SSE4.2 support required to build fat runtime") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) + message(FATAL_ERROR "AVX2 support required to build fat runtime") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) + message(FATAL_ERROR "AVX512 support requested but not supported") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) + message(FATAL_ERROR "AVX512VBMI support requested but not supported") + endif () +else (NOT FAT_RUNTIME) + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT BUILD_AVX2) + message(STATUS "Building without AVX2 support") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512) + message(STATUS "Building without AVX512 support") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512VBMI) + message(STATUS "Building without AVX512VBMI support") + endif () + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) + message(FATAL_ERROR "A minimum of SSE4.2 compiler support is required") + endif () +endif () + + diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake new file mode 100644 index 00000000..4b174c72 --- /dev/null +++ b/cmake/compiler.cmake @@ -0,0 +1,19 @@ +# determine compiler +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_COMPILER_IS_CLANG TRUE) + set(CLANGCXX_MINVER "5") + message(STATUS "clang++ version ${CMAKE_CXX_COMPILER_VERSION}") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS CLANGCXX_MINVER) + message(FATAL_ERROR "A minimum of clang++ ${CLANGCXX_MINVER} is required for C++17 support") + endif() +endif() + +# compiler version checks TODO: test more compilers +if (CMAKE_COMPILER_IS_GNUCXX) + set(GNUCXX_MINVER "9") + message(STATUS "g++ version ${CMAKE_CXX_COMPILER_VERSION}") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS GNUCXX_MINVER) + message(FATAL_ERROR "A minimum of g++ ${GNUCXX_MINVER} is required for C++17 support") + endif() +endif() + diff --git a/cmake/osdetection.cmake b/cmake/osdetection.cmake new file mode 100644 index 00000000..f96a42f3 --- /dev/null +++ b/cmake/osdetection.cmake @@ -0,0 +1,36 @@ +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(LINUX TRUE) +endif(CMAKE_SYSTEM_NAME MATCHES "Linux") + +if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + set(FREEBSD true) +endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + +option(FAT_RUNTIME "Build a library that supports multiple microarchitectures" OFF) +message("Checking Fat Runtime Requirements...") +if (FAT_RUNTIME AND NOT LINUX) + message(FATAL_ERROR "Fat runtime is only supported on Linux OS") +endif() + +if (FAT_RUNTIME AND LINUX) + if (NOT (ARCH_IA32 OR ARCH_X86_64 OR ARCH_AARCH64)) + message(FATAL_ERROR "Fat runtime is only supported on Intel and Aarch64 architectures") + else() + message(STATUS "Building Fat runtime for multiple microarchitectures") + message(STATUS "generator is ${CMAKE_GENERATOR}") + if (NOT (CMAKE_GENERATOR MATCHES "Unix Makefiles" OR + (CMAKE_VERSION VERSION_GREATER "3.0" AND CMAKE_GENERATOR MATCHES "Ninja"))) + message (FATAL_ERROR "Building the fat runtime requires the Unix Makefiles generator, or Ninja with CMake v3.0 or higher") + else() + include (${CMAKE_MODULE_PATH}/attrib.cmake) + if (NOT HAS_C_ATTR_IFUNC) + message(FATAL_ERROR "Compiler does not support ifunc attribute, cannot build fat runtime") + endif() + endif() + endif() + if (NOT RELEASE_BUILD) + message(FATAL_ERROR "Fat runtime is only built on Release builds") + endif() +endif () + + diff --git a/cmake/platform.cmake b/cmake/platform.cmake index 5a2b85b2..30f6da92 100644 --- a/cmake/platform.cmake +++ b/cmake/platform.cmake @@ -1,24 +1,12 @@ -# determine compiler -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_COMPILER_IS_CLANG TRUE) -endif() - # determine the target arch - -if (CROSS_COMPILE_AARCH64) - set(ARCH_AARCH64 TRUE) +# really only interested in the preprocessor here +CHECK_C_SOURCE_COMPILES("#if !(defined(__x86_64__) || defined(_M_X64))\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_X86_64) +CHECK_C_SOURCE_COMPILES("#if !(defined(__i386__) || defined(_M_IX86))\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_IA32) +CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_A64)\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_AARCH64) +CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_ARM)\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_ARM32) +CHECK_C_SOURCE_COMPILES("#if !defined(__PPC64__) && !(defined(__LITTLE_ENDIAN__) && defined(__VSX__))\n#error not ppc64el\n#endif\nint main(void) { return 0; }" ARCH_PPC64EL) +if (ARCH_X86_64 OR ARCH_AARCH64 OR ARCH_PPC64EL) set(ARCH_64_BIT TRUE) - message(STATUS "Cross compiling for aarch64") else() - # really only interested in the preprocessor here - CHECK_C_SOURCE_COMPILES("#if !(defined(__x86_64__) || defined(_M_X64))\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_X86_64) - CHECK_C_SOURCE_COMPILES("#if !(defined(__i386__) || defined(_M_IX86))\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_IA32) - CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_A64)\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_AARCH64) - CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_ARM)\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_ARM32) - CHECK_C_SOURCE_COMPILES("#if !defined(__PPC64__) && !(defined(__LITTLE_ENDIAN__) && defined(__VSX__))\n#error not ppc64el\n#endif\nint main(void) { return 0; }" ARCH_PPC64EL) - if (ARCH_X86_64 OR ARCH_AARCH64 OR ARCH_PPC64EL) - set(ARCH_64_BIT TRUE) - else() - set(ARCH_32_BIT TRUE) - endif() + set(ARCH_32_BIT TRUE) endif() diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt index ffc39a5f..cbb12255 100644 --- a/unit/CMakeLists.txt +++ b/unit/CMakeLists.txt @@ -56,14 +56,9 @@ set(unit_hyperscan_SOURCES hyperscan/test_util.h ) add_executable(unit-hyperscan ${unit_hyperscan_SOURCES}) -if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) -target_link_libraries(unit-hyperscan hs_shared expressionutil) -else() target_link_libraries(unit-hyperscan hs expressionutil) -endif() - -if (NOT FAT_RUNTIME ) +if (NOT FAT_RUNTIME AND BUILD_STATIC_LIBS) set(unit_internal_SOURCES ${gtest_SOURCES} internal/bitfield.cpp @@ -133,7 +128,7 @@ endif(NOT RELEASE_BUILD) add_executable(unit-internal ${unit_internal_SOURCES}) set_target_properties(unit-internal PROPERTIES COMPILE_FLAGS "${HS_CXX_FLAGS}") target_link_libraries(unit-internal hs corpusomatic) -endif(NOT FAT_RUNTIME) +endif (NOT FAT_RUNTIME AND BUILD_STATIC_LIBS) if (BUILD_CHIMERA) # enable Chimera unit tests From 3884f597d393a74cbf4e19de83cd6eecab03e846 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sun, 8 Oct 2023 23:54:06 +0300 Subject: [PATCH 26/43] add missing file --- cmake/archdetect.cmake | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 cmake/archdetect.cmake diff --git a/cmake/archdetect.cmake b/cmake/archdetect.cmake new file mode 100644 index 00000000..3ffcb282 --- /dev/null +++ b/cmake/archdetect.cmake @@ -0,0 +1,75 @@ +if (USE_CPU_NATIVE) + # Detect best GNUCC_ARCH to tune for + if (CMAKE_COMPILER_IS_GNUCC) + message(STATUS "gcc version ${CMAKE_C_COMPILER_VERSION}") + + # If gcc doesn't recognise the host cpu, then mtune=native becomes + # generic, which isn't very good in some cases. march=native looks at + # cpuid info and then chooses the best microarch it can (and replaces + # the flag), so use that for tune. + + set(TUNE_FLAG "mtune") + set(GNUCC_TUNE "") + message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ") + + # arg1 might exist if using ccache + string (STRIP "${CMAKE_C_COMPILER_ARG1}" CC_ARG1) + set (EXEC_ARGS ${CC_ARG1} -c -Q --help=target -${ARCH_FLAG}=native -${TUNE_FLAG}=native) + execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS} + OUTPUT_VARIABLE _GCC_OUTPUT) + set(_GCC_OUTPUT_TUNE ${_GCC_OUTPUT}) + string(FIND "${_GCC_OUTPUT}" "${ARCH_FLAG}=" POS) + string(SUBSTRING "${_GCC_OUTPUT}" ${POS} -1 _GCC_OUTPUT) + string(REGEX REPLACE "${ARCH_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_ARCH "${_GCC_OUTPUT}") + + string(FIND "${_GCC_OUTPUT_TUNE}" "${TUNE_FLAG}=" POS_TUNE) + string(SUBSTRING "${_GCC_OUTPUT_TUNE}" ${POS_TUNE} -1 _GCC_OUTPUT_TUNE) + string(REGEX REPLACE "${TUNE_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_TUNE "${_GCC_OUTPUT_TUNE}") + + message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ") + + # test the parsed flag + set (EXEC_ARGS ${CC_ARG1} -E - -${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}) + execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS} + OUTPUT_QUIET ERROR_QUIET + INPUT_FILE /dev/null + RESULT_VARIABLE GNUCC_TUNE_TEST) + + if (NOT GNUCC_TUNE_TEST EQUAL 0) + message(WARNING "Something went wrong determining gcc tune: -mtune=${GNUCC_TUNE} not valid, falling back to -mtune=native") + set(GNUCC_TUNE native) + else() + set(GNUCC_TUNE ${GNUCC_TUNE}) + message(STATUS "gcc will tune for ${GNUCC_ARCH}, ${GNUCC_TUNE}") + endif() + elseif (CMAKE_COMPILER_IS_CLANG) + if (ARCH_IA32 OR ARCH_X86_64) + set(GNUCC_ARCH native) + set(TUNE_FLAG generic) + elseif(ARCH_AARCH64) + set(GNUCC_ARCH armv8) + set(TUNE_FLAG generic) + elseif(ARCH_ARM32) + set(GNUCC_ARCH armv7a) + set(TUNE_FLAG generic) + else() + set(GNUCC_ARCH native) + set(TUNE_FLAG generic) + endif() + message(STATUS "clang will tune for ${GNUCC_ARCH}, ${TUNE_FLAG}") + endif() +else() + if (ARCH_IA32 OR ARCH_X86_64) + set(GNUCC_ARCH generic) + set(TUNE_FLAG generic) + elseif(ARCH_AARCH64) + set(GNUCC_ARCH armv8-a) + set(TUNE_FLAG generic) + elseif(ARCH_ARM32) + set(GNUCC_ARCH armv7a) + set(TUNE_FLAG generic) + else() + set(GNUCC_ARCH generic) + set(TUNE_FLAG generic) + endif() +endif() From 6beeb372bc01a5a882de0a912a4f40ae6d272501 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:22:31 +0300 Subject: [PATCH 27/43] increase cmake_minimum_version, basically the one in Debian 11 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d382402f..f41b8f5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 2.8.12) +cmake_minimum_required (VERSION 3.18.4) project (vectorscan C CXX) From 0d5ce27df42af2229f7f169bad0e7de127cc11da Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:22:52 +0300 Subject: [PATCH 28/43] fix defaults for -march for x86 --- cmake/archdetect.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/archdetect.cmake b/cmake/archdetect.cmake index 3ffcb282..58258fe5 100644 --- a/cmake/archdetect.cmake +++ b/cmake/archdetect.cmake @@ -44,7 +44,7 @@ if (USE_CPU_NATIVE) endif() elseif (CMAKE_COMPILER_IS_CLANG) if (ARCH_IA32 OR ARCH_X86_64) - set(GNUCC_ARCH native) + set(GNUCC_ARCH x86_64_v2) set(TUNE_FLAG generic) elseif(ARCH_AARCH64) set(GNUCC_ARCH armv8) @@ -60,7 +60,7 @@ if (USE_CPU_NATIVE) endif() else() if (ARCH_IA32 OR ARCH_X86_64) - set(GNUCC_ARCH generic) + set(GNUCC_ARCH native) set(TUNE_FLAG generic) elseif(ARCH_AARCH64) set(GNUCC_ARCH armv8-a) From ee8a3c29cc3700b9527b78ebf7ddcfc0112ae071 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:23:08 +0300 Subject: [PATCH 29/43] fix cflags detection for x86 --- cmake/cflags-x86.cmake | 69 ++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/cmake/cflags-x86.cmake b/cmake/cflags-x86.cmake index b35ba5b5..95485ba7 100644 --- a/cmake/cflags-x86.cmake +++ b/cmake/cflags-x86.cmake @@ -1,38 +1,36 @@ option(BUILD_AVX512 "Enabling support for AVX512" OFF) option(BUILD_AVX512VBMI "Enabling support for AVX512VBMI" OFF) +set(SKYLAKE_FLAG "-march=skylake-avx512") +set(ICELAKE_FLAG "-march=icelake-server") + if (NOT FAT_RUNTIME) if (BUILD_AVX512VBMI) message (STATUS "AVX512VBMI implies AVX512, enabling BUILD_AVX512") set(BUILD_AVX512 ON) + set(ARCH_C_FLAGS "${ICELAKE_FLAG}") + set(ARCH_CXX_FLAGS "${ICELAKE_FLAG}") endif () if (BUILD_AVX512) message (STATUS "AVX512 implies AVX2, enabling BUILD_AVX2") set(BUILD_AVX2 ON) + set(ARCH_C_FLAGS "${SKYLAKE_FLAG}") + set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}") endif () -endif() - -set(SKYLAKE_FLAG "-march=skylake-avx512") -set(ICELAKE_FLAG "-march=icelake-server") - -if (ARCH_IA32 OR ARCH_X86_64) - if (NOT FAT_RUNTIME) - if (BUILD_AVX512) - set(ARCH_C_FLAGS "${SKYLAKE_FLAG}") - set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}") - elseif (BUILD_AVX2) - set(ARCH_C_FLAGS "-mavx2") - set(ARCH_CXX_FLAGS "-mavx2") - else() - set(ARCH_C_FLAGS "-msse4.2") - set(ARCH_CXX_FLAGS "-msse4.2") - endif() + if (BUILD_AVX2) + message (STATUS "Enabling BUILD_AVX2") + set(ARCH_C_FLAGS "-mavx2") + set(ARCH_CXX_FLAGS "-mavx2") else() - set(ARCH_C_FLAGS "-msse4.2") - set(ARCH_CXX_FLAGS "-msse4.2") + set(ARCH_C_FLAGS "-msse4.2") + set(ARCH_CXX_FLAGS "-msse4.2") endif() +else() + set(ARCH_C_FLAGS "-msse4.2") + set(ARCH_CXX_FLAGS "-msse4.2") endif() +set(CMAKE_REQUIRED_FLAGS "${ARCH_C_FLAGS}") CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H) CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H) CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H) @@ -60,16 +58,15 @@ if (BUILD_AVX512VBMI) endif () endif () -if (ARCH_IA32 OR ARCH_X86_64) - # ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +# ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic +CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> int main() { __m128i a = _mm_set1_epi8(1); (void)_mm_shuffle_epi8(a, a); }" HAVE_SSE42) - # now look for AVX2 - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +# now look for AVX2 +CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX2__) #error no avx2 #endif @@ -79,8 +76,8 @@ int main(){ (void)_mm256_xor_si256(z, z); }" HAVE_AVX2) - # and now for AVX512 - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +# and now for AVX512 +CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX512BW__) #error no avx512bw #endif @@ -90,8 +87,8 @@ int main(){ (void)_mm512_abs_epi8(z); }" HAVE_AVX512) - # and now for AVX512VBMI - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +# and now for AVX512VBMI +CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX512VBMI__) #error no avx512vbmi #endif @@ -103,29 +100,29 @@ int main(){ }" HAVE_AVX512VBMI) if (FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) + if (NOT HAVE_SSE42) message(FATAL_ERROR "SSE4.2 support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) + if (BUILD_AVX2 AND NOT HAVE_AVX2) message(FATAL_ERROR "AVX2 support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) + if (BUILD_AVX512 AND NOT HAVE_AVX512) message(FATAL_ERROR "AVX512 support requested but not supported") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) + if (BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) message(FATAL_ERROR "AVX512VBMI support requested but not supported") endif () else (NOT FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT BUILD_AVX2) + if (NOT BUILD_AVX2) message(STATUS "Building without AVX2 support") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512) + if (NOT HAVE_AVX512) message(STATUS "Building without AVX512 support") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512VBMI) + if (NOT HAVE_AVX512VBMI) message(STATUS "Building without AVX512VBMI support") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) + if (NOT HAVE_SSE42) message(FATAL_ERROR "A minimum of SSE4.2 compiler support is required") endif () endif () From e85f7cc9c92cd5bb482749938bdd5ddc4ef34681 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:23:29 +0300 Subject: [PATCH 30/43] fix sqlite3 version detection --- cmake/sqlite3.cmake | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/cmake/sqlite3.cmake b/cmake/sqlite3.cmake index 6ea3dea3..92b18ce1 100644 --- a/cmake/sqlite3.cmake +++ b/cmake/sqlite3.cmake @@ -11,28 +11,14 @@ find_package(PkgConfig QUIET) pkg_check_modules(SQLITE3 sqlite3) endif() -if (NOT SQLITE3_FOUND) - message(STATUS "looking for sqlite3 in source tree") - # look in the source tree - if (EXISTS "${PROJECT_SOURCE_DIR}/sqlite3/sqlite3.h" AND - EXISTS "${PROJECT_SOURCE_DIR}/sqlite3/sqlite3.c") - message(STATUS " found sqlite3 in source tree") - set(SQLITE3_FOUND TRUE) - set(SQLITE3_BUILD_SOURCE TRUE) - set(SQLITE3_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/sqlite3") - set(SQLITE3_LDFLAGS sqlite3_static) - else() - message(STATUS " no sqlite3 in source tree") - endif() -endif() - # now do version checks if (SQLITE3_FOUND) list(INSERT CMAKE_REQUIRED_INCLUDES 0 "${SQLITE3_INCLUDE_DIRS}") - CHECK_C_SOURCE_COMPILES("#include \n#if SQLITE_VERSION_NUMBER >= 3008007 && SQLITE_VERSION_NUMBER < 3008010\n#error broken sqlite\n#endif\nint main() {return 0;}" SQLITE_VERSION_OK) - if (NOT SQLITE_VERSION_OK) + if (SQLITE_VERSION LESS "3.8.10") message(FATAL_ERROR "sqlite3 is broken from 3.8.7 to 3.8.10 - please find a working version") endif() +endif() + if (NOT SQLITE3_BUILD_SOURCE) set(_SAVED_FLAGS ${CMAKE_REQUIRED_FLAGS}) list(INSERT CMAKE_REQUIRED_LIBRARIES 0 ${SQLITE3_LDFLAGS}) @@ -46,6 +32,5 @@ else() set_target_properties(sqlite3_static PROPERTIES COMPILE_FLAGS "-Wno-error -Wno-extra -Wno-unused -Wno-cast-qual -DSQLITE_OMIT_LOAD_EXTENSION") endif() endif() -endif() # that's enough about sqlite From 5e4a1edb0c420ad11ccf3fef0589b5fdba5dc204 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:42:39 +0300 Subject: [PATCH 31/43] fix x86 fat binary build --- cmake/cflags-x86.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/cflags-x86.cmake b/cmake/cflags-x86.cmake index 95485ba7..7b9cbf81 100644 --- a/cmake/cflags-x86.cmake +++ b/cmake/cflags-x86.cmake @@ -66,6 +66,7 @@ int main() { }" HAVE_SSE42) # now look for AVX2 +set(CMAKE_REQUIRED_FLAGS "-mavx2") CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX2__) #error no avx2 @@ -77,6 +78,7 @@ int main(){ }" HAVE_AVX2) # and now for AVX512 +set(CMAKE_REQUIRED_FLAGS "${SKYLAKE_FLAG}") CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX512BW__) #error no avx512bw @@ -88,6 +90,7 @@ int main(){ }" HAVE_AVX512) # and now for AVX512VBMI +set(CMAKE_REQUIRED_FLAGS "${ICELAKE_FLAG}") CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> #if !defined(__AVX512VBMI__) #error no avx512vbmi From 981576a5fe161e162916dd097c5a75f2626e326b Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 00:44:12 +0300 Subject: [PATCH 32/43] fix default arch/tune flags for ppc64le --- cmake/archdetect.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/archdetect.cmake b/cmake/archdetect.cmake index 58258fe5..9529d682 100644 --- a/cmake/archdetect.cmake +++ b/cmake/archdetect.cmake @@ -69,7 +69,7 @@ else() set(GNUCC_ARCH armv7a) set(TUNE_FLAG generic) else() - set(GNUCC_ARCH generic) - set(TUNE_FLAG generic) + set(GNUCC_ARCH power9) + set(TUNE_FLAG power9) endif() endif() From 4d539f2c871d11af1de2ff5b62b5d3f0a2051a57 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 10:03:53 +0000 Subject: [PATCH 33/43] fix cmake refactor for arm builds --- CMakeLists.txt | 25 +++------- cmake/cflags-arm.cmake | 106 +++++++++++----------------------------- src/util/arch/arm/arm.h | 12 +++++ 3 files changed, 49 insertions(+), 94 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f41b8f5f..52e9e6a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1042,29 +1042,23 @@ else () if (ARCH_AARCH64) set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") if (BUILD_STATIC_LIBS) - set (BUILD_SVE OFF) - set (BUILD_SVE2 OFF) - set (BUILD_SVE2_BITPERM OFF) - add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) list(APPEND RUNTIME_LIBS $) set_target_properties(hs_exec_neon PROPERTIES - COMPILE_FLAGS "-march=armv8-a" + COMPILE_FLAGS "-march=${ARMV8_ARCH}" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" ) - set (BUILD_SVE ON) add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) list(APPEND RUNTIME_LIBS $) set_target_properties(hs_exec_sve PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve -DHAVE_SVE" + COMPILE_FLAGS "-march=${SVE_ARCH}" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" ) - set (BUILD_SVE2 ON) - set (BUILD_SVE2_BITPERM ON) add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) list(APPEND RUNTIME_LIBS $) set_target_properties(hs_exec_sve2 PROPERTIES - COMPILE_FLAGS "-march=armv9-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" + COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" ) @@ -1096,28 +1090,25 @@ else () # build shared libs add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - add_library(hs_exec_shared_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + add_library(hs_exec_shared_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) list(APPEND RUNTIME_SHLIBS $) set_target_properties(hs_exec_shared_neon PROPERTIES - COMPILE_FLAGS "-march=armv8-a" + COMPILE_FLAGS "-march=${ARMV8_ARCH}" POSITION_INDEPENDENT_CODE TRUE RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" ) - set (BUILD_SVE ON) add_library(hs_exec_shared_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) list(APPEND RUNTIME_SHLIBS $) set_target_properties(hs_exec_shared_sve PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve -DHAVE_SVE" + COMPILE_FLAGS "-march=${SVE_ARCH}" POSITION_INDEPENDENT_CODE TRUE RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" ) - set (BUILD_SVE2 ON) - set (BUILD_SVE2_BITPERM ON) add_library(hs_exec_shared_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) list(APPEND RUNTIME_SHLIBS $) set_target_properties(hs_exec_shared_sve2 PROPERTIES - COMPILE_FLAGS "-march=armv8-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2" + COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}" POSITION_INDEPENDENT_CODE TRUE RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" ) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake index 61995cf9..d622ce64 100644 --- a/cmake/cflags-arm.cmake +++ b/cmake/cflags-arm.cmake @@ -9,122 +9,74 @@ if (NOT FAT_RUNTIME) endif () endif () -if (ARCH_AARCH64) - if (NOT FAT_RUNTIME) - if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm") - elseif (BUILD_SVE2 AND NOT SVE2_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve2") - elseif (BUILD_SVE AND NOT SVE_FOUND) - set(GNUCC_ARCH "${GNUCC_ARCH}+sve") - endif () - else() - set(ARCH_C_FLAGS "") - set(ARCH_CXX_FLAGS "") - endif() -endif(ARCH_AARCH64) +set(SVE2_BITPERM_ARCH "armv9-a+sve2-bitperm") +set(SVE2_ARCH "armv9-a") +set(SVE_ARCH "armv8-a+sve") +set(ARMV8_ARCH "armv8-a") CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) - if (CMAKE_COMPILER_IS_CLANG) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve") - else() - set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS}) - endif() + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}") CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) if (NOT HAVE_C_ARM_SVE_H) message(FATAL_ERROR "arm_sve.h is required to build for SVE.") endif() endif() -if (HAVE_C_EC_H) - set (INTRIN_INC_H "altivec.h") -else() - message (FATAL_ERROR "No intrinsics header found for VSX") -endif () - -if (ARCH_ARM32 OR ARCH_AARCH64) - CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> +CHECK_C_SOURCE_COMPILES("#include int main() { int32x4_t a = vdupq_n_s32(1); (void)a; }" HAVE_NEON) -endif () -set(PREV_FLAGS "${CMAKE_C_FLAGS}") if (BUILD_SVE2_BITPERM) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_BITPERM_ARCH}") CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); (void)a; }" HAVE_SVE2_BITPERM) - if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE2_BITPERM) - endif () - endif() - if (BUILD_SVE2) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") - CHECK_C_SOURCE_COMPILES("#include +endif() +if (BUILD_SVE2) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_ARCH}") + CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3)); (void)a; - }" HAVE_SVE2) - endif() - if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE2) - endif () - if (BUILD_SVE) - set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}") - CHECK_C_SOURCE_COMPILES("#include + }" HAVE_SVE2) +endif() +if (BUILD_SVE) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}") + CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svdup_u8(1); (void)a; - }" HAVE_SVE) - endif () - if ((HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) - add_definitions(-DHAVE_SVE) - endif () - set(CMAKE_C_FLAGS "${PREV_FLAGS}") -endif() + }" HAVE_SVE) +endif () if (FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) - message(FATAL_ERROR "SSE4.2 support required to build fat runtime") + if (NOT HAVE_NEON) + message(FATAL_ERROR "NEON support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) - message(FATAL_ERROR "AVX2 support required to build fat runtime") + if (BUILD_SVE AND NOT HAVE_SVE) + message(FATAL_ERROR "SVE support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) - message(FATAL_ERROR "AVX512 support requested but not supported") + if (BUILD_SVE2 AND NOT HAVE_SVE2) + message(FATAL_ERROR "SVE2 support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) - message(FATAL_ERROR "AVX512VBMI support requested but not supported") + if (BUILD_SVE2_BITPERM AND NOT HAVE_SVE2_BITPERM) + message(FATAL_ERROR "SVE2 support required to build fat runtime") endif () else (NOT FAT_RUNTIME) - if (ARCH_AARCH64 AND NOT BUILD_SVE) + if (NOT BUILD_SVE) message(STATUS "Building without SVE support") endif () - if (ARCH_AARCH64 AND NOT BUILD_SVE2) + if (NOT BUILD_SVE2) message(STATUS "Building without SVE2 support") endif () - if ((ARCH_ARM32 OR ARCH_AARCH64) AND NOT HAVE_NEON) + if (NOT HAVE_NEON) message(FATAL_ERROR "Neon/ASIMD support required for Arm support") endif () endif () - string(FIND "${GNUCC_ARCH}" "sve" POS_SVE) - string(FIND "${GNUCC_ARCH}" "sve2" POS_SVE2) - string(FIND "${GNUCC_ARCH}" "sve2-bitperm" POS_SVE2_BITPERM) - if(NOT POS_SVE2_BITPERM EQUAL 0) - set(SVE2_BITPERM_FOUND 1) - set(SVE2_FOUND 1) - set(SVE_FOUND 1) - elseif(NOT POS_SVE2 EQUAL 0) - set(SVE2_FOUND 1) - set(SVE_FOUND 1) - elseif (NOT POS_SVE EQUAL 0) - set(SVE_FOUND 1) - set(SVE2_BITPERM_FOUND 1) - endif() diff --git a/src/util/arch/arm/arm.h b/src/util/arch/arm/arm.h index 2ec55da2..c38ac697 100644 --- a/src/util/arch/arm/arm.h +++ b/src/util/arch/arm/arm.h @@ -41,5 +41,17 @@ #define VECTORSIZE 16 #endif +#if defined(__ARM_FEATURE_SVE) +#define HAVE_SVE +#endif + +#if defined(__ARM_FEATURE_SVE2) +#define HAVE_SVE2 +#endif + +#if defined(__ARM_FEATURE_SVE2_BITPERM) +#define HAVE_SVE2_BITPERM +#endif + #endif // UTIL_ARCH_ARM_H_ From 9445f49172df5252175912698a9faf225d115494 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 10:16:40 +0000 Subject: [PATCH 34/43] is not known at that stage --- cmake/cflags-arm.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake index d622ce64..4ed91455 100644 --- a/cmake/cflags-arm.cmake +++ b/cmake/cflags-arm.cmake @@ -16,7 +16,7 @@ set(ARMV8_ARCH "armv8-a") CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}") + set(CMAKE_REQUIRED_FLAGS "-march=${SVE_ARCH}") CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) if (NOT HAVE_C_ARM_SVE_H) message(FATAL_ERROR "arm_sve.h is required to build for SVE.") @@ -30,7 +30,7 @@ int main() { }" HAVE_NEON) if (BUILD_SVE2_BITPERM) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_BITPERM_ARCH}") + set(CMAKE_REQUIRED_FLAGS "-march=${SVE2_BITPERM_ARCH}") CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); @@ -38,7 +38,7 @@ if (BUILD_SVE2_BITPERM) }" HAVE_SVE2_BITPERM) endif() if (BUILD_SVE2) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_ARCH}") + set(CMAKE_REQUIRED_FLAGS "-march=${SVE2_ARCH}") CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3)); @@ -46,7 +46,7 @@ if (BUILD_SVE2) }" HAVE_SVE2) endif() if (BUILD_SVE) - set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}") + set(CMAKE_REQUIRED_FLAGS "-march=${SVE_ARCH}") CHECK_C_SOURCE_COMPILES("#include int main() { svuint8_t a = svdup_u8(1); From 1619dbaf358cd684eaed11dd23050c23782e47ed Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 10:26:08 +0000 Subject: [PATCH 35/43] remove unneeded option --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 52e9e6a6..581fa4d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -871,7 +871,6 @@ endif() set (LIB_VERSION ${HS_VERSION}) set (LIB_SOVERSION ${HS_MAJOR_VERSION}) -add_link_options(-Wl,--as-needed) if (NOT FAT_RUNTIME) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_common_SRCS}) From 7909b91ba4f27cd4e741b919e5485b489c325230 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 20:01:26 +0800 Subject: [PATCH 36/43] remove vermicelli_simd.cpp to fix redefinition build failure on SVE2 builds --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 581fa4d1..16a6dab7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -425,8 +425,6 @@ if (ARCH_ARM32 OR ARCH_AARCH64) src/nfa/vermicelli_simd.cpp) set (hs_exec_sve_SRCS src/nfa/vermicelli_simd.cpp) - set (hs_exec_sve2_SRCS - src/nfa/vermicelli_simd.cpp) endif() SET (hs_compile_SRCS @@ -1083,9 +1081,6 @@ else () endif (BUILD_STATIC_LIBS) if (BUILD_SHARED_LIBS) - set (BUILD_SVE OFF) - set (BUILD_SVE2 OFF) - set (BUILD_SVE2_BITPERM OFF) # build shared libs add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) From c4b7a44caccc0b640f57a3a76877a2a0ee77967e Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 20:02:37 +0800 Subject: [PATCH 37/43] SVE2 is armv9-a but gcc 11 does not recognize that --- cmake/cflags-arm.cmake | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake index 4ed91455..3a29209e 100644 --- a/cmake/cflags-arm.cmake +++ b/cmake/cflags-arm.cmake @@ -9,10 +9,19 @@ if (NOT FAT_RUNTIME) endif () endif () -set(SVE2_BITPERM_ARCH "armv9-a+sve2-bitperm") -set(SVE2_ARCH "armv9-a") -set(SVE_ARCH "armv8-a+sve") + +if (CMAKE_COMPILER_IS_GNUCXX) + set(ARMV9BASE_MINVER "12") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ARMV9BASE_MINVER) + set(SVE2_ARCH "armv8-a+sve2") + else() + set(SVE2_ARCH "armv9-a") + endif() +endif() + set(ARMV8_ARCH "armv8-a") +set(SVE_ARCH "${ARMV8_ARCH}+sve") +set(SVE2_BITPERM_ARCH "${SVE2_ARCH}+sve2-bitperm") CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME) From 1fdeedf151b09d5692e42554148cdc07e2369187 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 9 Oct 2023 20:38:19 +0800 Subject: [PATCH 38/43] set default value --- cmake/cflags-arm.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake index 3a29209e..c6943bbf 100644 --- a/cmake/cflags-arm.cmake +++ b/cmake/cflags-arm.cmake @@ -17,6 +17,8 @@ if (CMAKE_COMPILER_IS_GNUCXX) else() set(SVE2_ARCH "armv9-a") endif() +else() + set(SVE2_ARCH "armv9-a") endif() set(ARMV8_ARCH "armv8-a") From 5a4d90067526e4081df0b0a573f77c77ef0ab949 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 10 Oct 2023 00:55:02 +0800 Subject: [PATCH 39/43] fix default arch definition for non fat builds on arm --- cmake/archdetect.cmake | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/cmake/archdetect.cmake b/cmake/archdetect.cmake index 9529d682..015140fe 100644 --- a/cmake/archdetect.cmake +++ b/cmake/archdetect.cmake @@ -47,7 +47,15 @@ if (USE_CPU_NATIVE) set(GNUCC_ARCH x86_64_v2) set(TUNE_FLAG generic) elseif(ARCH_AARCH64) - set(GNUCC_ARCH armv8) + if (BUILD_SVE2_BITPERM) + set(GNUCC_ARCH ${SVE2_BITPERM_ARCH}) + elseif (BUILD_SVE2) + set(GNUCC_ARCH ${SVE2_ARCH}) + elseif (BUILD_SVE) + set(GNUCC_ARCH ${SVE_ARCH}) + else () + set(GNUCC_ARCH ${ARMV8_ARCH}) + endif() set(TUNE_FLAG generic) elseif(ARCH_ARM32) set(GNUCC_ARCH armv7a) @@ -63,8 +71,16 @@ else() set(GNUCC_ARCH native) set(TUNE_FLAG generic) elseif(ARCH_AARCH64) - set(GNUCC_ARCH armv8-a) - set(TUNE_FLAG generic) + if (BUILD_SVE2_BITPERM) + set(GNUCC_ARCH ${SVE2_BITPERM_ARCH}) + elseif (BUILD_SVE2) + set(GNUCC_ARCH ${SVE2_ARCH}) + elseif (BUILD_SVE) + set(GNUCC_ARCH ${SVE_ARCH}) + else () + set(GNUCC_ARCH ${ARMV8_ARCH}) + endif() + set(TUNE_FLAG generic) elseif(ARCH_ARM32) set(GNUCC_ARCH armv7a) set(TUNE_FLAG generic) From a659555781a98db1c7aa8feb3a9d60d473e0000b Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 10 Oct 2023 18:30:12 +0800 Subject: [PATCH 40/43] Ubuntu 20.04 gcc does not define HWCAP2_SVE2 #180 --- src/util/arch/arm/cpuid_inline.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util/arch/arm/cpuid_inline.h b/src/util/arch/arm/cpuid_inline.h index 03faf41c..f8a59af3 100644 --- a/src/util/arch/arm/cpuid_inline.h +++ b/src/util/arch/arm/cpuid_inline.h @@ -32,6 +32,11 @@ #if defined(__linux__) #include +/* This is to help fix https://github.com/envoyproxy/envoy/pull/29881 + */ +#if !defined(HWCAP2_SVE2) +#include +#endif #endif #include "ue2common.h" From 71bbf97b9095957ee2f6bfaaca91d0315054d3fe Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Tue, 31 Oct 2023 10:38:07 +0000 Subject: [PATCH 41/43] make pkgconfig a requirement --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16a6dab7..6c5b0445 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ include (${CMAKE_MODULE_PATH}/platform.cmake) include (${CMAKE_MODULE_PATH}/boost.cmake) include (${CMAKE_MODULE_PATH}/ragel.cmake) -find_package(PkgConfig QUIET) +find_package(PkgConfig REQUIRED) find_program(RAGEL ragel) From 9c139c3a6d2df77ae2eb3973265aec869cc71017 Mon Sep 17 00:00:00 2001 From: Mitchell Wasson Date: Tue, 31 Oct 2023 09:09:48 -0600 Subject: [PATCH 42/43] Correct set_source_files_properties usage The use of `CMAKE_BINARY_DIR` and `CMAKE_CURRENT_BINARY_DIR` when specifying files to set_source_files_properties caused problems when this project is used from another CMake project. More specifically, these variables aren't set to the expected path, and the properties are attempted to be set for non-existant files. This was benign before vectorscan 5.4.8 as the only properties set were warning suppression flags. Starting with 5.4.9, `-funsigned-char` was applied to Ragel outputs using this method. The result is projects depending on Vectorscan through Cmake do not have this compile flag properly applied. --- CMakeLists.txt | 4 ++-- tools/hscollider/CMakeLists.txt | 2 +- util/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16a6dab7..7e52ca73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,14 +193,14 @@ endif() set(RAGEL_C_FLAGS "-Wno-unused -funsigned-char") set_source_files_properties( - ${CMAKE_BINARY_DIR}/src/parser/Parser.cpp + src/parser/Parser.cpp PROPERTIES COMPILE_FLAGS "${RAGEL_C_FLAGS}") ragelmaker(src/parser/Parser.rl) set_source_files_properties( - ${CMAKE_BINARY_DIR}/src/parser/control_verbs.cpp + src/parser/control_verbs.cpp PROPERTIES COMPILE_FLAGS "${RAGEL_C_FLAGS}") diff --git a/tools/hscollider/CMakeLists.txt b/tools/hscollider/CMakeLists.txt index d1ffc49a..f9e71404 100644 --- a/tools/hscollider/CMakeLists.txt +++ b/tools/hscollider/CMakeLists.txt @@ -17,7 +17,7 @@ CHECK_FUNCTION_EXISTS(sigaction HAVE_SIGACTION) CHECK_FUNCTION_EXISTS(setrlimit HAVE_SETRLIMIT) set_source_files_properties( - ${CMAKE_CURRENT_BINARY_DIR}/ColliderCorporaParser.cpp + ColliderCorporaParser.cpp PROPERTIES COMPILE_FLAGS "${RAGEL_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 214da90c..97fd4c7d 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} message("RAGEL_C_FLAGS" ${RAGEL_C_FLAGS}) set_source_files_properties( - ${CMAKE_BINARY_DIR}/util/ExpressionParser.cpp + ExpressionParser.cpp PROPERTIES COMPILE_FLAGS "${RAGEL_C_FLAGS}") From b5f1a822586056246ed52c9a0dc3443c0daa31d1 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Fri, 17 Nov 2023 03:50:30 +0800 Subject: [PATCH 43/43] Move VERM16 enums to the end of the list This was causing a hard-to-track segfault with Fat Runtime on SVE2 hw, because of the macro-based hard-coded way to calculate offsets for each implementation. This needs a rewrite. --- src/nfa/nfa_internal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nfa/nfa_internal.h b/src/nfa/nfa_internal.h index 2d4c40b5..8cc701b6 100644 --- a/src/nfa/nfa_internal.h +++ b/src/nfa/nfa_internal.h @@ -66,10 +66,6 @@ enum NFAEngineType { LBR_NFA_DOT, /**< magic pseudo nfa */ LBR_NFA_VERM, /**< magic pseudo nfa */ LBR_NFA_NVERM, /**< magic pseudo nfa */ -#ifdef HAVE_SVE2 - LBR_NFA_VERM16, /**< magic pseudo nfa */ - LBR_NFA_NVERM16, /**< magic pseudo nfa */ -#endif // HAVE_SVE2 LBR_NFA_SHUF, /**< magic pseudo nfa */ LBR_NFA_TRUF, /**< magic pseudo nfa */ CASTLE_NFA, /**< magic pseudo nfa */ @@ -81,6 +77,10 @@ enum NFAEngineType { SHENG_NFA_64, /**< magic pseudo nfa */ MCSHENG_64_NFA_8, /**< magic pseudo nfa */ MCSHENG_64_NFA_16, /**< magic pseudo nfa */ +#ifdef HAVE_SVE2 + LBR_NFA_VERM16, /**< magic pseudo nfa */ + LBR_NFA_NVERM16, /**< magic pseudo nfa */ +#endif // HAVE_SVE2 /** \brief bogus NFA - not used */ INVALID_NFA };