Ignore:
Timestamp:
Jul 14, 2015, 9:48:15 AM (4 years ago)
Author:
nmedfort
Message:

UCD Generator now creates an install property .h file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/generate_predefined_ucd_functions.cpp

    r4667 r4668  
    4949
    5050static cl::opt<std::string>
    51 OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
     51ObjectFilename("o", cl::desc("Output Object filename"), cl::value_desc("filename"));
     52
     53static cl::opt<std::string>
     54PropertyFilename("p", cl::desc("Install Property filename"), cl::value_desc("filename"));
    5255
    5356#ifdef ENABLE_MULTIPLEXING
     
    5962 * @brief compileUnicodeSet
    6063 ** ------------------------------------------------------------------------------------------------------------- */
    61 void compileUnicodeSet(std::string name, const UnicodeSet & set, PabloCompiler & pc, Module * module) {
     64void compileUnicodeSet(std::string name, const UnicodeSet & set, PabloCompiler & pc, Module * module, raw_ostream & out) {
    6265    PabloFunction function = PabloFunction::Create(std::move(name));
    6366    Encoding encoding(Encoding::Type::UTF_8, 8);
     
    6568    UCDCompiler ucdCompiler(ccCompiler);
    6669    PabloBuilder builder(function.getEntryBlock());
    67 
    68     std::cerr << "Compiling " << name << std::endl;
    69 
    7070    // Build the unicode set function
    7171    ucdCompiler.generateWithDefaultIfHierarchy(set, builder);
     
    7979    #endif
    8080    // Now compile the function ...
    81     pc.compile(function, module);
     81    auto func = pc.compile(function, module);
     82    out << "    p.InstallExternalFunction(\"" + name + "\", &" + name + ", " + std::to_string(func.second) + ");\n";
    8283    releaseSlabAllocatorMemory();
    8384}
     
    8788 ** ------------------------------------------------------------------------------------------------------------- */
    8889Module * generateUCDModule() {
     90
     91    #ifdef USE_LLVM_3_5
     92    std::string error;
     93    raw_fd_ostream out(PropertyFilename.c_str(), error, sys::fs::F_None);
     94    if (!error.empty()) {
     95        throw std::runtime_error(error);
     96    }
     97    #else
     98    std::error_code error;
     99    raw_fd_ostream out(PropertyFilename, error, sys::fs::F_None);
     100    if (error) {
     101        throw std::runtime_error(error.message());
     102    }
     103    #endif
     104
     105    out << "#ifndef PROPERTYINSTALL\n";
     106    out << "#define PROPERTYINSTALL\n\n";
     107    out << "#include <pablo/pablo_compiler.h>\n\n";
     108    out << "void install_properties(pablo::PabloCompiler & p) {\n";
     109
    89110    PabloCompiler pc;
    90111    Module * module = new Module("ucd", getGlobalContext());
    91112    for (PropertyObject * obj : property_object_table) {
    92 
    93113        if (EnumeratedPropertyObject * enumObj = dyn_cast<EnumeratedPropertyObject>(obj)) {
    94114            for (const std::string value : *enumObj) {
    95115                const UnicodeSet & set = enumObj->GetCodepointSet(canonicalize_value_name(value));
    96116                std::string name = "__get_" + property_enum_name[enumObj->getPropertyCode()] + "_" + value;
    97                 compileUnicodeSet(name, set, pc, module);
     117                compileUnicodeSet(name, set, pc, module, out);
    98118            }
    99119        }
     
    102122                const UnicodeSet & set = extObj->GetCodepointSet(canonicalize_value_name(value));
    103123                std::string name = "__get_" + property_enum_name[extObj->getPropertyCode()] + "_" + value;
    104                 compileUnicodeSet(name, set, pc, module);
     124                compileUnicodeSet(name, set, pc, module, out);
    105125            }
    106126        }
     
    108128            const UnicodeSet & set = binObj->GetCodepointSet(Binary_ns::Y);
    109129            std::string name = "__get_" + property_enum_name[binObj->getPropertyCode()] + "_Y";
    110             compileUnicodeSet(name, set, pc, module);
     130            compileUnicodeSet(name, set, pc, module, out);
    111131        }
    112 
    113     }
     132    }
     133
     134    out << "}\n\n#endif\n"; out.close();
    114135
    115136    // Print an error message if our module is malformed in any way.
     
    131152    InitializeAllAsmParsers();
    132153
    133 
    134154    TheTriple.setTriple(sys::getDefaultTargetTriple());
    135155
     
    152172    if (Target == nullptr) {
    153173        throw std::runtime_error("Could not allocate target machine!");
    154     }
    155 
    156     if (OutputFilename.empty()) {
    157         OutputFilename = "ucd.o";
    158174    }
    159175
     
    166182    #else
    167183    std::error_code error;
    168     std::unique_ptr<tool_output_file> Out = make_unique<tool_output_file>(OutputFilename, error, sys::fs::F_None);
     184    std::unique_ptr<tool_output_file> Out = make_unique<tool_output_file>(ObjectFilename, error, sys::fs::F_None);
    169185    if (error) {
    170186        throw std::runtime_error(error.message());
     
    210226int main(int argc, char *argv[]) {
    211227    cl::ParseCommandLineOptions(argc, argv, "UCD Compiler\n");
     228    if (PropertyFilename.empty()) {
     229        PropertyFilename = "PropertyInstall.h";
     230    }
     231    if (ObjectFilename.empty()) {
     232        ObjectFilename = "ucd.o";
     233    }
    212234    Module * module = generateUCDModule();
    213235    compileUCDModule(module);
Note: See TracChangeset for help on using the changeset viewer.