Ignore:
Timestamp:
Mar 3, 2018, 1:30:02 PM (16 months ago)
Author:
cameron
Message:

Separate compilation of Unicode property kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_name_gather.cpp

    r5881 r5887  
    2121using namespace llvm;
    2222namespace re {
    23 struct NameGather {
    24 
    25     void gather(RE * re) {
    26         assert ("RE object cannot be null!" && re);
    27         if (isa<Name>(re)) {
    28             RE * defn = cast<Name>(re)->getDefinition();
    29             if (defn == nullptr) {
    30                 mNameSet.emplace(cast<Name>(re));
    31             }
    32         } else if (isa<Seq>(re)) {
    33             for (RE * item : *cast<Seq>(re)) {
    34                 gather(item);
    35             }
    36         } else if (isa<Alt>(re)) {
    37             for (RE * item : *cast<Alt>(re)) {
    38                 gather(item);
    39             }
    40         } else if (isa<Rep>(re)) {
    41             gather(cast<Rep>(re)->getRE());
    42         } else if (isa<Assertion>(re)) {
    43             gather(cast<Assertion>(re)->getAsserted());
    44         } else if (Range * rg = dyn_cast<Range>(re)) {
    45             gather(rg->getLo());
    46             gather(rg->getHi());
    47         } else if (isa<Diff>(re)) {
    48             gather(cast<Diff>(re)->getLH());
    49             gather(cast<Diff>(re)->getRH());
    50         } else if (isa<Intersect>(re)) {
    51             gather(cast<Intersect>(re)->getLH());
    52             gather(cast<Intersect>(re)->getRH());
    53         } else if (isa<Group>(re)) {
    54             gather(cast<Group>(re)->getRE());
     23   
     24   
     25void gatherUnicodeProperties (RE * re, std::set<Name *> & nameSet) {
     26    if (isa<Name>(re)) {
     27        if (cast<Name>(re)->getType() == Name::Type::UnicodeProperty) {
     28            nameSet.emplace(cast<Name>(re));
    5529        }
     30    } else if (isa<Seq>(re)) {
     31        for (RE * item : *cast<Seq>(re)) {
     32            gatherUnicodeProperties(item, nameSet);
     33        }
     34    } else if (isa<Alt>(re)) {
     35        for (RE * item : *cast<Alt>(re)) {
     36            gatherUnicodeProperties(item, nameSet);
     37        }
     38    } else if (isa<Rep>(re)) {
     39        gatherUnicodeProperties(cast<Rep>(re)->getRE(), nameSet);
     40    } else if (isa<Assertion>(re)) {
     41        gatherUnicodeProperties(cast<Assertion>(re)->getAsserted(), nameSet);
     42    } else if (Range * rg = dyn_cast<Range>(re)) {
     43        gatherUnicodeProperties(rg->getLo(), nameSet);
     44        gatherUnicodeProperties(rg->getHi(), nameSet);
     45    } else if (isa<Diff>(re)) {
     46        gatherUnicodeProperties(cast<Diff>(re)->getLH(), nameSet);
     47        gatherUnicodeProperties(cast<Diff>(re)->getRH(), nameSet);
     48    } else if (isa<Intersect>(re)) {
     49        gatherUnicodeProperties(cast<Intersect>(re)->getLH(), nameSet);
     50        gatherUnicodeProperties(cast<Intersect>(re)->getRH(), nameSet);
     51    } else if (isa<Group>(re)) {
     52        gatherUnicodeProperties(cast<Group>(re)->getRE(), nameSet);
    5653    }
    57     NameGather(std::set<Name *> & nameSet)
    58     : mNameSet(nameSet) {
    59 
    60     }
    61 
    62 private:
    63 
    64     std::set<Name *> &               mNameSet;
    65 
    66 };
    67    
    68 std::set<Name *> gatherExternalNames(RE * re) {
    69     std::set<Name *> nameSet;
    70    
    71     NameGather nameGather(nameSet);
    72     nameGather.gather(re);
    73     return nameSet;
    74    
    7554}
    7655
Note: See TracChangeset for help on using the changeset viewer.