1 /*
2  * Copyright (c) 2015-2016, 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 /** \file
30  * \brief Runtime context structures (NFAContext128 and friends) for the NFA.
31  */
32 
33 #ifndef LIMEX_CONTEXT_H
34 #define LIMEX_CONTEXT_H
35 
36 #include "ue2common.h"
37 #include "callback.h"
38 #include "util/simd_utils.h" // for m128 etc
39 
40 // Runtime context structures.
41 
42 /* Note: The size of the context structures may vary from platform to platform
43  * (notably, for the Limex64 structure). As a result, information based on the
44  * size and other detail of these structures should not be written into the
45  * bytecode -- really, the details of the structure should not be accessed by
46  * the ue2 compile side at all.
47  */
48 #ifdef __cplusplus
49 #error ue2 runtime only file
50 #endif
51 
52 /* cached_estate/esucc etc...
53  *
54  * If the exception state matches the cached_estate we will apply
55  * the or in the cached_esucc to the successor states rather than processing
56  * the exceptions.
57  *
58  * If the current exception state is a superset of the cached_estate, the
59  * cache is NOT used at all.
60  *
61  * The cache is updated when we see a different cacheable estate.
62  */
63 
64 #define GEN_CONTEXT_STRUCT(nsize, ntype)                                    \
65 struct ALIGN_CL_DIRECTIVE NFAContext##nsize {                               \
66     ntype s; /**< state bitvector (on entry/exit) */                        \
67     ntype local_succ; /**< used by exception handling for large models */   \
68     ntype cached_estate; /* inited to 0 */                                  \
69     ntype cached_esucc;                                                     \
70     char cached_br; /**< cached_estate contains a br state */               \
71     const ReportID *cached_reports;                                         \
72     union RepeatControl *repeat_ctrl;                                       \
73     char *repeat_state;                                                     \
74     NfaCallback callback;                                                   \
75     void *context;                                                          \
76 };
77 
78 GEN_CONTEXT_STRUCT(32,  u32)
79 #ifdef ARCH_64_BIT
80 GEN_CONTEXT_STRUCT(64,  u64a)
81 #else
82 GEN_CONTEXT_STRUCT(64,  m128)
83 #endif
84 GEN_CONTEXT_STRUCT(128, m128)
85 GEN_CONTEXT_STRUCT(256, m256)
86 GEN_CONTEXT_STRUCT(384, m384)
87 GEN_CONTEXT_STRUCT(512, m512)
88 
89 #undef GEN_CONTEXT_STRUCT
90 
91 #endif
92