1 /*
2  * Copyright (c) 2015-2020, Intel Corporation
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *  * Redistributions of source code must retain the above copyright notice,
8  *    this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *  * Neither the name of Intel Corporation nor the names of its contributors
13  *    may be used to endorse or promote products derived from this software
14  *    without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /**
30  * \file
31  * \brief Main NFA build code.
32  */
33 
34 #ifndef LIMEX_COMPILE_H
35 #define LIMEX_COMPILE_H
36 
37 #include "nfagraph/ng_holder.h"
38 #include "nfagraph/ng_squash.h" // for NFAStateSet
39 #include "ue2common.h"
40 #include "util/bytecode_ptr.h"
41 
42 #include <set>
43 #include <map>
44 #include <memory>
45 #include <unordered_map>
46 #include <vector>
47 
48 struct NFA;
49 
50 namespace ue2 {
51 
52 struct BoundedRepeatData;
53 struct CompileContext;
54 
55 /**
56  * \brief Construct a LimEx NFA from an NGHolder.
57  *
58  * \param g Input NFA graph. Must have state IDs assigned.
59  * \param repeats Bounded repeat information, if any.
60  * \param reportSquashMap Single-match mode squash map.
61  * \param squashMap More general squash map.
62  * \param tops Tops and their start vertices,
63  * \param zombies The set of zombifying states.
64  * \param do_accel Calculate acceleration schemes.
65  * \param stateCompression Allow (and calculate masks for) state compression.
66  * \param hint If not INVALID_NFA, this allows a particular LimEx NFA model
67                to be requested.
68  * \param cc Compile context.
69  * \return a built NFA, or nullptr if no NFA could be constructed for this
70  * graph.
71  */
72 bytecode_ptr<NFA> generate(NGHolder &g,
73             const std::unordered_map<NFAVertex, u32> &states,
74             const std::vector<BoundedRepeatData> &repeats,
75             const std::unordered_map<NFAVertex, NFAStateSet> &reportSquashMap,
76             const std::unordered_map<NFAVertex, NFAStateSet> &squashMap,
77             const std::map<u32, std::set<NFAVertex>> &tops,
78             const std::set<NFAVertex> &zombies,
79             bool do_accel,
80             bool stateCompression,
81             bool &fast,
82             u32 hint,
83             const CompileContext &cc);
84 
85 /**
86  * \brief For a given graph, count the number of accelerable states it has.
87  *
88  * Note that this number may be greater than the number that are actually
89  * implementable.
90  */
91 u32 countAccelStates(NGHolder &h,
92             const std::unordered_map<NFAVertex, u32> &states,
93             const std::vector<BoundedRepeatData> &repeats,
94             const std::unordered_map<NFAVertex, NFAStateSet> &reportSquashMap,
95             const std::unordered_map<NFAVertex, NFAStateSet> &squashMap,
96             const std::map<u32, std::set<NFAVertex>> &tops,
97             const std::set<NFAVertex> &zombies,
98             const CompileContext &cc);
99 
100 } // namespace ue2
101 
102 #endif
103