1/*
2 * Copyright (c) 2015-2018, 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#ifndef GREY_H
30#define GREY_H
31
32#include <vector>
33#include <string>
34
35#include "ue2common.h"
36
37namespace ue2 {
38
39struct Grey {
40 Grey(void);
41
42 bool optimiseComponentTree;
43
44 bool calcComponents;
45 bool performGraphSimplification;
46 bool prefilterReductions;
47 bool removeEdgeRedundancy;
48
49 bool allowGough;
50 bool allowHaigLit;
51 bool allowLitHaig;
52 bool allowLbr;
53 bool allowMcClellan;
54 bool allowSheng;
55 bool allowMcSheng;
56 bool allowPuff;
57 bool allowLiteral;
58 bool allowViolet;
59 bool allowExtendedNFA;
60 bool allowLimExNFA;
61 bool allowAnchoredAcyclic;
62 bool allowSmallLiteralSet;
63 bool allowCastle;
64 bool allowDecoratedLiteral;
65 bool allowApproximateMatching;
66
67 bool allowNoodle;
68 bool fdrAllowTeddy;
69 bool fdrAllowFlood;
70
71 u32 violetAvoidSuffixes; /* 0=never, 1=sometimes, 2=always */
72 bool violetAvoidWeakInfixes;
73 bool violetDoubleCut;
74 bool violetExtractStrongLiterals;
75 bool violetLiteralChains;
76 u32 violetDoubleCutLiteralLen;
77 u32 violetEarlyCleanLiteralLen;
78
79 bool puffImproveHead;
80 bool castleExclusive; // enable castle mutual exclusion analysis
81
82 bool mergeSEP;
83 bool mergeRose;
84 bool mergeSuffixes;
85 bool mergeOutfixes;
86 bool onlyOneOutfix; // if > 1 outfix, fail compile
87
88 bool allowShermanStates;
89 bool allowMcClellan8;
90 bool allowWideStates; // enable wide state for McClellan8
91 bool highlanderPruneDFA;
92 bool minimizeDFA;
93
94 bool accelerateDFA;
95 bool accelerateNFA;
96 bool reverseAccelerate;
97
98 bool squashNFA;
99 bool compressNFAState;
100 bool numberNFAStatesWrong;
101 bool highlanderSquash;
102 bool allowZombies;
103 bool floodAsPuffette;
104
105 u32 nfaForceSize;
106
107 u32 maxHistoryAvailable;
108 u32 minHistoryAvailable;
109 u32 maxAnchoredRegion;
110 u32 minRoseLiteralLength;
111 u32 minRoseNetflowLiteralLength;
112 u32 maxRoseNetflowEdges;
113 u32 maxEditDistance;
114
115 u32 minExtBoundedRepeatSize; /* to be considered for ng_repeat */
116
117 bool goughCopyPropagate;
118 bool goughRegisterAllocate;
119
120 bool shortcutLiterals;
121
122 bool roseGraphReduction;
123 bool roseRoleAliasing;
124 bool roseMasks;
125 bool roseConvertFloodProneSuffixes;
126 bool roseMergeRosesDuringAliasing;
127 bool roseMultiTopRoses;
128 bool roseHamsterMasks;
129 bool roseLookaroundMasks;
130 u32 roseMcClellanPrefix; /* 0 = off, 1 = only if large nfa, 2 = always */
131 u32 roseMcClellanSuffix; /* 0 = off, 1 = only if very large nfa, 2 =
132 * always */
133 u32 roseMcClellanOutfix; /* 0 = off, 1 = sometimes, 2 = almost always */
134 bool roseTransformDelay;
135
136 bool earlyMcClellanPrefix;
137 bool earlyMcClellanInfix;
138 bool earlyMcClellanSuffix;
139
140 bool allowCountingMiracles;
141
142 bool allowSomChain;
143 u32 somMaxRevNfaLength;
144
145 bool hamsterAccelForward;
146 bool hamsterAccelReverse; // currently not implemented
147
148 u32 miracleHistoryBonus; /* cheap hack to make miracles better, TODO
149 * something dignified */
150
151 bool equivalenceEnable;
152
153 // SmallWrite engine
154 bool allowSmallWrite;
155 bool allowSmallWriteSheng;
156 u32 smallWriteLargestBuffer; // largest buffer that can be small write
157 u32 smallWriteLargestBufferBad;// largest buffer that can be small write
158 u32 limitSmallWriteOutfixSize; //!< max total size of outfix DFAs
159 u32 smallWriteMaxPatterns; // only try small writes if fewer patterns
160 u32 smallWriteMaxLiterals; // only try small writes if fewer literals
161 u32 smallWriteMergeBatchSize; // number of DFAs to merge in a batch
162
163 // Tamarama engine
164 bool allowTamarama;
165 u32 tamaChunkSize; //!< max chunk size for exclusivity analysis in Tamarama
166
167 enum DumpFlags {
168 DUMP_NONE = 0,
169 DUMP_BASICS = 1 << 0, // Dump basic textual data
170 DUMP_PARSE = 1 << 1, // Dump component tree to .txt
171 DUMP_INT_GRAPH = 1 << 2, // Dump non-implementation graphs
172 DUMP_IMPL = 1 << 3 // Dump implementation graphs
173 };
174
175 u32 dumpFlags;
176 std::string dumpPath;
177
178 /* Resource limits. These are somewhat arbitrary, but are intended to bound
179 * the input to many of our internal structures. Exceeding one of these
180 * limits will cause an error to be returned to the user.
181 *
182 * NOTE: Raising these limitations make cause smoke to come out of parts of
183 * the runtime. */
184
185 u32 limitPatternCount; //!< max number of patterns
186 u32 limitPatternLength; //!< max number of characters in a regex
187 u32 limitGraphVertices; //!< max number of states in built NFA graph
188 u32 limitGraphEdges; //!< max number of edges in build NFA graph
189 u32 limitReportCount; //!< max number of ReportIDs allocated internally
190
191 // HWLM literal matcher limits.
192 u32 limitLiteralCount; //!< max number of literals in an HWLM table
193 u32 limitLiteralLength; //!< max number of characters in a literal
194 u32 limitLiteralMatcherChars; //!< max characters in an HWLM literal matcher
195 u32 limitLiteralMatcherSize; //!< max size of an HWLM matcher (in bytes)
196
197 // Rose limits.
198 u32 limitRoseRoleCount; //!< max number of Rose roles
199 u32 limitRoseEngineCount; //!< max prefix/infix/suffix/outfix engines
200 u32 limitRoseAnchoredSize; //!< max total size of anchored DFAs (bytes)
201
202 // Engine (DFA/NFA/etc) limits.
203 u32 limitEngineSize; //!< max size of an engine (in bytes)
204 u32 limitDFASize; //!< max size of a DFA (in bytes)
205 u32 limitNFASize; //!< max size of an NFA (in bytes)
206 u32 limitLBRSize; //!< max size of an LBR engine (in bytes)
207
208 // Approximate matching limits.
209 u32 limitApproxMatchingVertices; //!< max number of vertices per graph
210};
211
212#ifndef RELEASE_BUILD
213#include <string>
214void applyGreyOverrides(Grey *g, const std::string &overrides);
215#endif
216
217} // namespace ue2
218
219#endif
220