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 
37 namespace ue2 {
38 
39 struct 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>
214 void applyGreyOverrides(Grey *g, const std::string &overrides);
215 #endif
216 
217 } // namespace ue2
218 
219 #endif
220