aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/hyperscan/src/grey.h
blob: ed2f845a4b61b13a227166afcbe38638a50f0595 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
 * Copyright (c) 2015-2018, Intel Corporation
 *
 * 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.
 */

#ifndef GREY_H
#define GREY_H

#include <vector>
#include <string>

#include "ue2common.h"

namespace ue2 {

struct Grey {
    Grey(void);

    bool optimiseComponentTree;

    bool calcComponents;
    bool performGraphSimplification;
    bool prefilterReductions;
    bool removeEdgeRedundancy;

    bool allowGough;
    bool allowHaigLit;
    bool allowLitHaig;
    bool allowLbr;
    bool allowMcClellan;
    bool allowSheng;
    bool allowMcSheng;
    bool allowPuff;
    bool allowLiteral;
    bool allowViolet;
    bool allowExtendedNFA;
    bool allowLimExNFA;
    bool allowAnchoredAcyclic;
    bool allowSmallLiteralSet;
    bool allowCastle;
    bool allowDecoratedLiteral;
    bool allowApproximateMatching;

    bool allowNoodle;
    bool fdrAllowTeddy;
    bool fdrAllowFlood;

    u32  violetAvoidSuffixes; /* 0=never, 1=sometimes, 2=always */
    bool violetAvoidWeakInfixes;
    bool violetDoubleCut;
    bool violetExtractStrongLiterals;
    bool violetLiteralChains;
    u32  violetDoubleCutLiteralLen;
    u32  violetEarlyCleanLiteralLen;

    bool puffImproveHead;
    bool castleExclusive; // enable castle mutual exclusion analysis

    bool mergeSEP;
    bool mergeRose;
    bool mergeSuffixes;
    bool mergeOutfixes;
    bool onlyOneOutfix; // if > 1 outfix, fail compile

    bool allowShermanStates;
    bool allowMcClellan8;
    bool allowWideStates; // enable wide state for McClellan8
    bool highlanderPruneDFA;
    bool minimizeDFA;

    bool accelerateDFA;
    bool accelerateNFA;
    bool reverseAccelerate;

    bool squashNFA;
    bool compressNFAState;
    bool numberNFAStatesWrong;
    bool highlanderSquash;
    bool allowZombies;
    bool floodAsPuffette;

    u32 nfaForceSize;

    u32 maxHistoryAvailable;
    u32 minHistoryAvailable;
    u32 maxAnchoredRegion;
    u32 minRoseLiteralLength;
    u32 minRoseNetflowLiteralLength;
    u32 maxRoseNetflowEdges;
    u32 maxEditDistance;

    u32 minExtBoundedRepeatSize; /* to be considered for ng_repeat */

    bool goughCopyPropagate;
    bool goughRegisterAllocate;

    bool shortcutLiterals;

    bool roseGraphReduction;
    bool roseRoleAliasing;
    bool roseMasks;
    bool roseConvertFloodProneSuffixes;
    bool roseMergeRosesDuringAliasing;
    bool roseMultiTopRoses;
    bool roseHamsterMasks;
    bool roseLookaroundMasks;
    u32 roseMcClellanPrefix; /* 0 = off, 1 = only if large nfa, 2 = always */
    u32 roseMcClellanSuffix; /* 0 = off, 1 = only if very large nfa, 2 =
                              * always */
    u32 roseMcClellanOutfix; /* 0 = off, 1 = sometimes, 2 = almost always */
    bool roseTransformDelay;

    bool earlyMcClellanPrefix;
    bool earlyMcClellanInfix;
    bool earlyMcClellanSuffix;

    bool allowCountingMiracles;

    bool allowSomChain;
    u32 somMaxRevNfaLength;

    bool hamsterAccelForward;
    bool hamsterAccelReverse; // currently not implemented

    u32 miracleHistoryBonus; /* cheap hack to make miracles better, TODO
                              * something dignified */

    bool equivalenceEnable;

    // SmallWrite engine
    bool allowSmallWrite;
    bool allowSmallWriteSheng;
    u32 smallWriteLargestBuffer;  // largest buffer that can be small write
    u32 smallWriteLargestBufferBad;// largest buffer that can be small write
    u32 limitSmallWriteOutfixSize; //!< max total size of outfix DFAs
    u32 smallWriteMaxPatterns; // only try small writes if fewer patterns
    u32 smallWriteMaxLiterals; // only try small writes if fewer literals
    u32 smallWriteMergeBatchSize; // number of DFAs to merge in a batch

    // Tamarama engine
    bool allowTamarama;
    u32 tamaChunkSize; //!< max chunk size for exclusivity analysis in Tamarama

    enum DumpFlags {
        DUMP_NONE       = 0,
        DUMP_BASICS     = 1 << 0, // Dump basic textual data
        DUMP_PARSE      = 1 << 1, // Dump component tree to .txt
        DUMP_INT_GRAPH  = 1 << 2, // Dump non-implementation graphs
        DUMP_IMPL       = 1 << 3  // Dump implementation graphs
    };

    u32 dumpFlags;
    std::string dumpPath;

    /* Resource limits. These are somewhat arbitrary, but are intended to bound
     * the input to many of our internal structures. Exceeding one of these
     * limits will cause an error to be returned to the user.
     *
     * NOTE: Raising these limitations make cause smoke to come out of parts of
     * the runtime. */

    u32 limitPatternCount;  //!< max number of patterns
    u32 limitPatternLength; //!< max number of characters in a regex
    u32 limitGraphVertices; //!< max number of states in built NFA graph
    u32 limitGraphEdges;    //!< max number of edges in build NFA graph
    u32 limitReportCount;   //!< max number of ReportIDs allocated internally

    // HWLM literal matcher limits.
    u32 limitLiteralCount;        //!< max number of literals in an HWLM table
    u32 limitLiteralLength;       //!< max number of characters in a literal
    u32 limitLiteralMatcherChars; //!< max characters in an HWLM literal matcher
    u32 limitLiteralMatcherSize;  //!< max size of an HWLM matcher (in bytes)

    // Rose limits.
    u32 limitRoseRoleCount;    //!< max number of Rose roles
    u32 limitRoseEngineCount;  //!< max prefix/infix/suffix/outfix engines
    u32 limitRoseAnchoredSize; //!< max total size of anchored DFAs (bytes)

    // Engine (DFA/NFA/etc) limits.
    u32 limitEngineSize; //!< max size of an engine (in bytes)
    u32 limitDFASize;    //!< max size of a DFA (in bytes)
    u32 limitNFASize;    //!< max size of an NFA (in bytes)
    u32 limitLBRSize;    //!< max size of an LBR engine (in bytes)

    // Approximate matching limits.
    u32 limitApproxMatchingVertices; //!< max number of vertices per graph
};

#ifndef RELEASE_BUILD
#include <string>
void applyGreyOverrides(Grey *g, const std::string &overrides);
#endif

} // namespace ue2

#endif