source: icGREP/icgrep-devel/icgrep/re/re_toolchain.cpp

Last change on this file was 5732, checked in by cameron, 9 days ago

More changes in preparation for LLVM 3.9, 4.0

File size: 5.0 KB
Line 
1/*
2 *  Copyright (c) 2017 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include <toolchain/toolchain.h>
8#include <re/re_toolchain.h>
9#include <cc/cc_compiler.h>            // for CC_Compiler
10#include <llvm/Support/CommandLine.h>  // for clEnumVal, clEnumValEnd, Optio...
11#include <re/re_compiler.h>            // for RE_Compiler
12#include <re/re_nullable.h>            // for RE_Nullable
13#include <re/re_star_normal.h>         // for RE_Star_Normal
14#include <re/re_simplifier.h>          // for RE_Simplifier
15#include <re/re_minimizer.h>
16#include <re/re_local.h>
17#include <re/printer_re.h>
18#include <re/re_analysis.h>
19#include <llvm/Support/raw_ostream.h>
20
21using namespace pablo;
22using namespace llvm;
23
24namespace re {
25
26static cl::OptionCategory RegexOptions("Regex Toolchain Options",
27                                              "These options control the regular expression transformation and compilation.");
28const cl::OptionCategory * re_toolchain_flags() {
29    return &RegexOptions;
30}
31
32static cl::bits<RE_PrintFlags> 
33    PrintOptions(cl::values(clEnumVal(ShowREs, "Print parsed or generated regular expressions"),
34                            clEnumVal(ShowAllREs, "Print all regular expression passes"),
35                            clEnumVal(ShowStrippedREs, "Print REs with nullable prefixes/suffixes removed"),
36                            clEnumVal(ShowSimplifiedREs, "Print final simplified REs")
37                            CL_ENUM_VAL_SENTINEL), cl::cat(RegexOptions));
38
39static cl::bits<RE_AlgorithmFlags>
40    AlgorithmOptions(cl::values(clEnumVal(DisableLog2BoundedRepetition, "disable log2 optimizations for bounded repetition of bytes"),
41                              clEnumVal(DisableIfHierarchy, "disable nested if hierarchy for generated Unicode classes (not recommended)"), 
42                              clEnumVal(DisableMatchStar, "disable MatchStar optimization"), 
43                              clEnumVal(DisableUnicodeMatchStar, "disable Unicode MatchStar optimization"),
44                              clEnumVal(DisableUnicodeLineBreak, "disable Unicode line breaks - use LF only")
45                              CL_ENUM_VAL_SENTINEL), cl::cat(RegexOptions));
46
47bool AlgorithmOptionIsSet(RE_AlgorithmFlags flag) {
48    return AlgorithmOptions.isSet(flag);
49}
50
51int IfInsertionGap;
52static cl::opt<int, true> 
53    IfInsertionGapOption("if-insertion-gap",  cl::location(IfInsertionGap), cl::init(3),
54                         cl::desc("minimum number of nonempty elements between inserted if short-circuit tests"), 
55                         cl::cat(RegexOptions));
56
57
58
59RE * regular_expression_passes(RE * re)  {
60
61    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowREs)) {
62        errs() << "Parser:\n" << Printer_RE::PrintRE(re) << '\n';
63    }
64
65    //Optimization passes to simplify the AST.
66    re = RE_Nullable::removeNullablePrefix(re);
67    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowStrippedREs)) {
68        errs() << "RemoveNullablePrefix:\n" << Printer_RE::PrintRE(re) << '\n';
69    }
70    re = RE_Nullable::removeNullableSuffix(re);
71    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowStrippedREs)) {
72        errs() << "RemoveNullableSuffix:\n" << Printer_RE::PrintRE(re) << '\n';
73    }
74    re = RE_Nullable::removeNullableAssertion(re);
75    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowStrippedREs)) {
76        errs() << "RemoveNullableAssertion:\n" << Printer_RE::PrintRE(re) << '\n';
77    }
78    //re = RE_Nullable::removeNullableAfterAssertion(re);
79    //if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowStrippedREs)) {
80    //    errs() << "RemoveNullableAfterAssertion\n" << Printer_RE::PrintRE(re) << '\n';
81    //}
82
83    re = RE_Simplifier::simplify(re);
84
85    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowSimplifiedREs)) {
86        //Print to the terminal the AST that was generated by the simplifier.
87        errs() << "Simplifier:\n" << Printer_RE::PrintRE(re) << '\n';
88    }
89   
90//    re = RE_Minimizer::minimize(re);
91
92//    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowSimplifiedREs)) {
93//        //Print to the terminal the AST that was generated by the simplifier.
94//        errs() << "Minimizer:\n" << Printer_RE::PrintRE(re) << '\n';
95//    }
96
97    re = RE_Star_Normal::star_normal(re);
98
99    if (PrintOptions.isSet(ShowAllREs) || PrintOptions.isSet(ShowSimplifiedREs)) {
100        //Print to the terminal the AST that was transformed to the star normal form.
101        errs() << "Star_Normal_Form:\n" << Printer_RE::PrintRE(re) << '\n';
102    }
103
104    return re;
105}
106   
107PabloAST * re2pablo_compiler(PabloKernel * kernel, RE * re_ast) {
108    Var * const basis = kernel->getInputStreamVar("basis");
109    const bool local = RE_Local::isLocalLanguage(re_ast) && isTypeForLocal(re_ast);
110    cc::CC_Compiler cc_compiler(kernel, basis);
111    RE_Compiler re_compiler(kernel, cc_compiler, local);
112    re_ast = re_compiler.compileUnicodeNames(re_ast);
113    return re_compiler.compile(re_ast);
114}
115
116}
Note: See TracBrowser for help on using the repository browser.