Changeset 5913
- Timestamp:
- Mar 18, 2018, 11:27:16 AM (11 months ago)
- Location:
- icGREP/icgrep-devel/icgrep
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
icGREP/icgrep-devel/icgrep/grep/grep_engine.cpp
r5908 r5913 70 70 71 71 72 void accumulate_match_wrapper(intptr_t accum_addr, const size_t lineNum, char * line_start, char * line_end) {72 extern "C" void accumulate_match_wrapper(intptr_t accum_addr, const size_t lineNum, char * line_start, char * line_end) { 73 73 reinterpret_cast<MatchAccumulator *>(accum_addr)->accumulate_match(lineNum, line_start, line_end); 74 74 } 75 75 76 void finalize_match_wrapper(intptr_t accum_addr, char * buffer_end) {76 extern "C" void finalize_match_wrapper(intptr_t accum_addr, char * buffer_end) { 77 77 reinterpret_cast<MatchAccumulator *>(accum_addr)->finalize_match(buffer_end); 78 78 } … … 99 99 100 100 idb->SetInsertPoint(BasicBlock::Create(M->getContext(), "entry", mainFunc, 0)); 101 102 101 StreamSetBuffer * ByteStream = pxDriver.addBuffer<SourceBuffer>(idb, idb->getStreamSetTy(1, 8)); 103 102 kernel::Kernel * sourceK = pxDriver.addKernelInstance<kernel::MemorySourceKernel>(idb, idb->getInt8PtrTy()); … … 185 184 } 186 185 186 187 188 187 189 void GrepEngine::initFileResult(std::vector<std::string> & filenames) { 188 190 const unsigned n = filenames.size(); … … 192 194 } 193 195 196 void GrepEngine::initREs(std::vector<re::RE *> & REs) { 197 if (mGrepRecordBreak == GrepRecordBreakKind::Unicode) { 198 mBreakCC = re::makeCC(re::makeCC(0x0A, 0x0D), re::makeCC(re::makeCC(0x85), re::makeCC(0x2028, 0x2029))); 199 } else if (mGrepRecordBreak == GrepRecordBreakKind::Null) { 200 mBreakCC = re::makeByte(0); // Null 201 } else { 202 mBreakCC = re::makeByte(0x0A); // LF 203 } 204 re::RE * anchorRE = mBreakCC; 205 if (mGrepRecordBreak == GrepRecordBreakKind::Unicode) { 206 re::Name * anchorName = re::makeName("UTF8_LB", re::Name::Type::Unicode); 207 anchorName->setDefinition(UCD::UnicodeBreakRE()); 208 anchorRE = anchorName; 209 } 210 211 mREs = REs; 212 for(unsigned i = 0; i < mREs.size(); ++i) { 213 mREs[i] = resolveModesAndExternalSymbols(mREs[i]); 214 mREs[i] = re::exclude_CC(mREs[i], mBreakCC); 215 mREs[i] = resolveAnchors(mREs[i], anchorRE); 216 re::gatherUnicodeProperties(mREs[i], mUnicodeProperties); 217 mREs[i] = regular_expression_passes(mREs[i]); 218 } 219 220 } 221 222 223 194 224 // Code Generation 195 225 // … … 201 231 } 202 232 203 std::pair<StreamSetBuffer *, StreamSetBuffer *> GrepEngine::grepPipeline( std::vector<re::RE *> & REs,StreamSetBuffer * ByteStream) {233 std::pair<StreamSetBuffer *, StreamSetBuffer *> GrepEngine::grepPipeline(StreamSetBuffer * ByteStream) { 204 234 auto & idb = mGrepDriver->getBuilder(); 205 235 const unsigned segmentSize = codegen::SegmentSize; … … 211 241 212 242 // Regular Expression Processing and Analysis Phase 213 const auto nREs = REs.size();243 const auto nREs = mREs.size(); 214 244 bool hasGCB[nREs]; 215 245 bool anyGCB = false; 216 217 std::set<re::Name *> UnicodeProperties;218 219 re::CC * breakCC = nullptr;220 std::string breakName;221 if (mGrepRecordBreak == GrepRecordBreakKind::Unicode) {222 breakCC = re::makeCC(re::makeCC(0x0A, 0x0D), re::makeCC(re::makeCC(0x85), re::makeCC(0x2028, 0x2029)));223 } else if (mGrepRecordBreak == GrepRecordBreakKind::Null) {224 breakCC = re::makeByte(0); // Null225 } else {226 breakCC = re::makeByte(0x0A); // LF227 }228 re::RE * anchorRE = breakCC;229 if (mGrepRecordBreak == GrepRecordBreakKind::Unicode) {230 re::Name * anchorName = re::makeName("UTF8_LB", re::Name::Type::Unicode);231 anchorName->setDefinition(UCD::UnicodeBreakRE());232 anchorRE = anchorName;233 }234 246 235 247 for(unsigned i = 0; i < nREs; ++i) { 236 REs[i] = resolveModesAndExternalSymbols(REs[i]); 237 REs[i] = re::exclude_CC(REs[i], breakCC); 238 REs[i] = resolveAnchors(REs[i], anchorRE); 239 re::gatherUnicodeProperties(REs[i], UnicodeProperties); 240 REs[i] = regular_expression_passes(REs[i]); 241 hasGCB[i] = hasGraphemeClusterBoundary(REs[i]); 248 hasGCB[i] = hasGraphemeClusterBoundary(mREs[i]); 242 249 anyGCB |= hasGCB[i]; 243 250 } 244 245 251 StreamSetBuffer * LineBreakStream = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 246 252 std::vector<StreamSetBuffer *> MatchResultsBufs(nREs); … … 252 258 bool isSimple = (nREs == 1) && (mGrepRecordBreak != GrepRecordBreakKind::Unicode) && (!anyGCB); 253 259 if (isSimple) { 254 REs[0] = toUTF8(REs[0]);255 } 256 if (isSimple && byteTestsWithinLimit( REs[0], ByteCClimit)) {260 mREs[0] = toUTF8(mREs[0]); 261 } 262 if (isSimple && byteTestsWithinLimit(mREs[0], ByteCClimit)) { 257 263 StreamSetBuffer * MatchResults = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 258 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ByteGrepKernel>(idb, REs[0]);264 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ByteGrepKernel>(idb, mREs[0]); 259 265 mGrepDriver->makeKernelCall(icgrepK, {ByteStream}, {MatchResults}); 260 266 MatchResultsBufs[0] = MatchResults; 261 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::DirectCharacterClassKernelBuilder>(idb, "breakCC", std::vector<re::CC *>{ breakCC}, 1);267 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::DirectCharacterClassKernelBuilder>(idb, "breakCC", std::vector<re::CC *>{mBreakCC}, 1); 262 268 mGrepDriver->makeKernelCall(breakK, {ByteStream}, {LineBreakStream}); 263 } else if (isSimple && hasTriCCwithinLimit( REs[0], ByteCClimit, prefixRE, suffixRE)) {269 } else if (isSimple && hasTriCCwithinLimit(mREs[0], ByteCClimit, prefixRE, suffixRE)) { 264 270 StreamSetBuffer * MatchResults = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 265 271 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ByteBitGrepKernel>(idb, prefixRE, suffixRE); 266 272 mGrepDriver->makeKernelCall(icgrepK, {ByteStream}, {MatchResults}); 267 273 MatchResultsBufs[0] = MatchResults; 268 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::DirectCharacterClassKernelBuilder>(idb, "breakCC", std::vector<re::CC *>{ breakCC}, 1);274 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::DirectCharacterClassKernelBuilder>(idb, "breakCC", std::vector<re::CC *>{mBreakCC}, 1); 269 275 mGrepDriver->makeKernelCall(breakK, {ByteStream}, {LineBreakStream}); 270 276 } else { 277 271 278 StreamSetBuffer * BasisBits = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(encodingBits, 1), baseBufferSize); 272 279 kernel::Kernel * s2pk = nullptr; … … 292 299 LineBreakStream = LineFeedStream; 293 300 } else if (mGrepRecordBreak == GrepRecordBreakKind::Null) { 294 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::ParabixCharacterClassKernelBuilder>(idb, "Null", std::vector<re::CC *>{ breakCC}, 8);301 kernel::Kernel * breakK = mGrepDriver->addKernelInstance<kernel::ParabixCharacterClassKernelBuilder>(idb, "Null", std::vector<re::CC *>{mBreakCC}, 8); 295 302 mGrepDriver->makeKernelCall(breakK, {BasisBits}, {LineBreakStream}); 296 303 } else { … … 300 307 std::map<std::string, StreamSetBuffer *> propertyStream; 301 308 if (PropertyKernels) { 302 for (auto p : UnicodeProperties) {309 for (auto p : mUnicodeProperties) { 303 310 auto name = p->getFullName(); 304 311 StreamSetBuffer * s = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); … … 326 333 std::set<re::Name *> UnicodeProperties; 327 334 if (PropertyKernels) { 328 re::gatherUnicodeProperties( REs[i], UnicodeProperties);335 re::gatherUnicodeProperties(mREs[i], UnicodeProperties); 329 336 for (auto p : UnicodeProperties) { 330 337 auto name = p->getFullName(); … … 340 347 } 341 348 if (CC_Multiplexing) { 342 const auto UnicodeSets = re::collectUnicodeSets( REs[i], std::set<re::Name *>({re::makeZeroWidth("\\b{g}")}));349 const auto UnicodeSets = re::collectUnicodeSets(mREs[i], std::set<re::Name *>({re::makeZeroWidth("\\b{g}")})); 343 350 StreamSetBuffer * const MatchResults = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 344 351 if (UnicodeSets.size() <= 1) { 345 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, REs[i], externalStreamNames);352 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, mREs[i], externalStreamNames); 346 353 mGrepDriver->makeKernelCall(icgrepK, icgrepInputSets, {MatchResults}); 347 354 MatchResultsBufs[i] = MatchResults; 348 355 } else { 349 356 mpx = make_unique<MultiplexedAlphabet>("mpx", UnicodeSets); 350 REs[i] = transformCCs(mpx.get(),REs[i]);357 mREs[i] = transformCCs(mpx.get(), mREs[i]); 351 358 std::vector<re::CC *> mpx_basis = mpx->getMultiplexedCCs(); 352 359 auto numOfCharacterClasses = mpx_basis.size(); … … 356 363 // kernel::Kernel * ccK = mGrepDriver->addKernelInstance<kernel::CharClassesKernel>(idb, std::move(mpx_basis), true); 357 364 // mGrepDriver->makeKernelCall(ccK, {ByteStream}, {CharClasses}); 358 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, REs[i], externalStreamNames, std::vector<cc::Alphabet *>{mpx.get()});365 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, mREs[i], externalStreamNames, std::vector<cc::Alphabet *>{mpx.get()}); 359 366 icgrepInputSets.push_back(CharClasses); 360 367 mGrepDriver->makeKernelCall(icgrepK, icgrepInputSets, {MatchResults}); … … 363 370 } else { 364 371 StreamSetBuffer * MatchResults = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 365 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, REs[i], externalStreamNames);372 kernel::Kernel * icgrepK = mGrepDriver->addKernelInstance<kernel::ICGrepKernel>(idb, mREs[i], externalStreamNames); 366 373 mGrepDriver->makeKernelCall(icgrepK, icgrepInputSets, {MatchResults}); 367 374 MatchResultsBufs[i] = MatchResults; … … 369 376 } 370 377 } 378 371 379 StreamSetBuffer * MergedResults = MatchResultsBufs[0]; 372 if ( REs.size() > 1) {380 if (mREs.size() > 1) { 373 381 MergedResults = mGrepDriver->addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), baseBufferSize); 374 kernel::Kernel * streamsMergeK = mGrepDriver->addKernelInstance<kernel::StreamsMerge>(idb, 1, REs.size());382 kernel::Kernel * streamsMergeK = mGrepDriver->addKernelInstance<kernel::StreamsMerge>(idb, 1, mREs.size()); 375 383 mGrepDriver->makeKernelCall(streamsMergeK, MatchResultsBufs, {MergedResults}); 376 384 } 377 385 StreamSetBuffer * Matches = MergedResults; 378 379 386 if (mMoveMatchesToEOL) { 380 387 StreamSetBuffer * OriginalMatches = Matches; … … 383 390 mGrepDriver->makeKernelCall(matchedLinesK, {OriginalMatches, LineBreakStream}, {Matches}); 384 391 } 385 386 392 if (InvertMatchFlag) { 387 393 kernel::Kernel * invertK = mGrepDriver->addKernelInstance<kernel::InvertMatchesKernel>(idb); … … 397 403 mGrepDriver->makeKernelCall(untilK, {AllMatches}, {Matches}); 398 404 } 405 399 406 return std::pair<StreamSetBuffer *, StreamSetBuffer *>(LineBreakStream, Matches); 400 407 } … … 404 411 // 405 412 406 void GrepEngine::grepCodeGen( std::vector<re::RE *> REs) {413 void GrepEngine::grepCodeGen() { 407 414 408 415 assert (mGrepDriver == nullptr); … … 428 435 StreamSetBuffer * LineBreakStream; 429 436 StreamSetBuffer * Matches; 430 std::tie(LineBreakStream, Matches) = grepPipeline( REs,ByteStream);437 std::tie(LineBreakStream, Matches) = grepPipeline(ByteStream); 431 438 432 439 kernel::Kernel * matchCountK = mGrepDriver->addKernelInstance<kernel::PopcountKernel>(idb); … … 498 505 } 499 506 500 void EmitMatchesEngine::grepCodeGen( std::vector<re::RE *> REs) {507 void EmitMatchesEngine::grepCodeGen() { 501 508 assert (mGrepDriver == nullptr); 502 509 mGrepDriver = new ParabixDriver("engine"); … … 523 530 StreamSetBuffer * LineBreakStream; 524 531 StreamSetBuffer * Matches; 525 std::tie(LineBreakStream, Matches) = grepPipeline( REs,ByteStream);532 std::tie(LineBreakStream, Matches) = grepPipeline(ByteStream); 526 533 527 534 kernel::Kernel * scanMatchK = mGrepDriver->addKernelInstance<kernel::ScanMatchKernel>(idb); … … 642 649 } 643 650 // Main thread also does the work; 644 645 651 DoGrepThreadMethod(); 646 652 for(unsigned i = 1; i < numOfThreads; ++i) { -
icGREP/icgrep-devel/icgrep/grep/grep_engine.h
r5894 r5913 31 31 }; 32 32 33 void accumulate_match_wrapper(intptr_t accum_addr, const size_t lineNum, char * line_start, char * line_end);33 extern "C" void accumulate_match_wrapper(intptr_t accum_addr, const size_t lineNum, char * line_start, char * line_end); 34 34 35 void finalize_match_wrapper(intptr_t accum_addr, char * buffer_end);35 extern "C" void finalize_match_wrapper(intptr_t accum_addr, char * buffer_end); 36 36 37 37 void grepBuffer(re::RE * pattern, const char * buffer, size_t bufferLength, MatchAccumulator * accum); … … 46 46 void setRecordBreak(GrepRecordBreakKind b); 47 47 void initFileResult(std::vector<std::string> & filenames); 48 virtual void grepCodeGen(std::vector<re::RE *> REs); 48 void initREs(std::vector<re::RE *> & REs); 49 virtual void grepCodeGen(); 49 50 bool searchAllFiles(); 50 51 void * DoGrepThreadMethod(); 51 52 52 53 protected: 53 std::pair<parabix::StreamSetBuffer *, parabix::StreamSetBuffer *> grepPipeline( std::vector<re::RE *> & REs,parabix::StreamSetBuffer * ByteStream);54 std::pair<parabix::StreamSetBuffer *, parabix::StreamSetBuffer *> grepPipeline(parabix::StreamSetBuffer * ByteStream); 54 55 55 56 virtual uint64_t doGrep(const std::string & fileName, const uint32_t fileIdx); … … 66 67 bool grepMatchFound; 67 68 GrepRecordBreakKind mGrepRecordBreak; 68 69 70 std::vector<re:: RE *> mREs; 71 std::set<re::Name *> mUnicodeProperties; 72 re::CC * mBreakCC; 69 73 std::unique_ptr<cc::MultiplexedAlphabet> mpx; 70 74 std::string mFileSuffix; … … 76 80 public: 77 81 EmitMatchesEngine(); 78 void grepCodeGen( std::vector<re::RE *> REs) override;82 void grepCodeGen() override; 79 83 private: 80 84 uint64_t doGrep(const std::string & fileName, const uint32_t fileIdx) override; -
icGREP/icgrep-devel/icgrep/icgrep.cpp
r5900 r5913 172 172 grep::InitializeCommandLineInterface(argc, argv); 173 173 174 constauto REs = readExpressions();174 auto REs = readExpressions(); 175 175 176 176 std::vector<std::string> allFiles = getFullFileList(inputFiles); … … 204 204 grepEngine->setRecordBreak(grep::GrepRecordBreakKind::LF); 205 205 } 206 207 grepEngine->grepCodeGen(REs); 208 206 grepEngine->initREs(REs); 207 grepEngine->grepCodeGen(); 209 208 grepEngine->initFileResult(allFiles); 210 211 209 bool matchFound = grepEngine->searchAllFiles(); 212 213 210 delete(grepEngine); 214 211 -
icGREP/icgrep-devel/icgrep/toolchain/cpudriver.cpp
r5856 r5913 3 3 #include <IR_Gen/idisa_target.h> 4 4 #include <toolchain/toolchain.h> 5 #include <llvm/Support/DynamicLibrary.h> // for LoadLibraryPermanently 6 #include <llvm/ExecutionEngine/RuntimeDyld.h> 7 #include <llvm/ExecutionEngine/RTDyldMemoryManager.h> 5 8 #include <llvm/ExecutionEngine/ExecutionEngine.h> // for EngineBuilder 6 9 #include <llvm/IR/LegacyPassManager.h> // for PassManager … … 47 50 InitializeNativeTargetAsmPrinter(); 48 51 InitializeNativeTargetAsmParser(); 49 50 PassRegistry * Registry = PassRegistry::getPassRegistry(); 51 initializeCore(*Registry); 52 initializeCodeGen(*Registry); 53 initializeLowerIntrinsicsPass(*Registry); 52 llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); 53 54 preparePassManager(); 54 55 55 56 std::string errMessage; … … 143 144 } 144 145 145 void ParabixDriver::finalizeObject() { 146 147 legacy::PassManager PM; 146 void ParabixDriver::preparePassManager() { 147 PassRegistry * Registry = PassRegistry::getPassRegistry(); 148 initializeCore(*Registry); 149 initializeCodeGen(*Registry); 150 initializeLowerIntrinsicsPass(*Registry); 151 148 152 if (LLVM_UNLIKELY(codegen::ShowUnoptimizedIROption != codegen::OmittedOption)) { 149 153 if (LLVM_LIKELY(mIROutputStream == nullptr)) { … … 155 159 } 156 160 } 157 PM.add(createPrintModulePass(*mIROutputStream));161 mPassManager.add(createPrintModulePass(*mIROutputStream)); 158 162 } 159 163 if (IN_DEBUG_MODE || LLVM_UNLIKELY(codegen::DebugOptionIsSet(codegen::VerifyIR))) { 160 PM.add(createVerifierPass());161 } 162 PM.add(createPromoteMemoryToRegisterPass()); // Promote stack variables to constants or PHI nodes163 PM.add(createCFGSimplificationPass()); // Remove dead basic blocks and unnecessary branch statements / phi nodes164 PM.add(createEarlyCSEPass()); // Simple common subexpression elimination pass165 PM.add(createInstructionCombiningPass()); // Simple peephole optimizations and bit-twiddling.166 PM.add(createReassociatePass()); // Canonicalizes commutative expressions167 PM.add(createGVNPass()); // Global value numbering redundant expression elimination pass168 PM.add(createCFGSimplificationPass()); // Repeat CFG Simplification to "clean up" any newly found redundant phi nodes169 164 mPassManager.add(createVerifierPass()); 165 } 166 mPassManager.add(createPromoteMemoryToRegisterPass()); // Promote stack variables to constants or PHI nodes 167 mPassManager.add(createCFGSimplificationPass()); // Remove dead basic blocks and unnecessary branch statements / phi nodes 168 mPassManager.add(createEarlyCSEPass()); // Simple common subexpression elimination pass 169 mPassManager.add(createInstructionCombiningPass()); // Simple peephole optimizations and bit-twiddling. 170 mPassManager.add(createReassociatePass()); // Canonicalizes commutative expressions 171 mPassManager.add(createGVNPass()); // Global value numbering redundant expression elimination pass 172 mPassManager.add(createCFGSimplificationPass()); // Repeat CFG Simplification to "clean up" any newly found redundant phi nodes 173 170 174 if (LLVM_UNLIKELY(codegen::ShowIROption != codegen::OmittedOption)) { 171 175 if (LLVM_LIKELY(mIROutputStream == nullptr)) { … … 177 181 } 178 182 } 179 PM.add(createPrintModulePass(*mIROutputStream));180 } 181 183 mPassManager.add(createPrintModulePass(*mIROutputStream)); 184 } 185 182 186 #if LLVM_VERSION_INTEGER >= LLVM_VERSION_CODE(3, 7, 0) 183 187 if (LLVM_UNLIKELY(codegen::ShowASMOption != codegen::OmittedOption)) { … … 188 192 mASMOutputStream = new raw_fd_ostream(STDERR_FILENO, false, true); 189 193 } 190 if (LLVM_UNLIKELY(mTarget->addPassesToEmitFile( PM, *mASMOutputStream, TargetMachine::CGFT_AssemblyFile))) {194 if (LLVM_UNLIKELY(mTarget->addPassesToEmitFile(mPassManager, *mASMOutputStream, TargetMachine::CGFT_AssemblyFile))) { 191 195 report_fatal_error("LLVM error: could not add emit assembly pass"); 192 196 } 193 197 } 194 198 #endif 199 } 200 201 202 void ParabixDriver::finalizeObject() { 195 203 196 204 Module * module = nullptr; … … 201 209 module = kernel->getModule(); assert (module); 202 210 module->setTargetTriple(mMainModule->getTargetTriple()); 203 PM.run(*module);211 mPassManager.run(*module); 204 212 } 205 213 module = mMainModule; 206 214 iBuilder->setKernel(nullptr); 207 PM.run(*mMainModule);215 mPassManager.run(*mMainModule); 208 216 for (Kernel * const kernel : mPipeline) { 209 217 if (LLVM_UNLIKELY(kernel->getModule() == nullptr)) { … … 220 228 221 229 bool ParabixDriver::hasExternalFunction(llvm::StringRef functionName) const { 222 return mEngine->getPointerToNamedFunction(functionName, false) != nullptr;230 return RTDyldMemoryManager::getSymbolAddressInProcess(functionName); 223 231 } 224 232 -
icGREP/icgrep-devel/icgrep/toolchain/cpudriver.h
r5735 r5913 2 2 #define CPUDRIVER_H 3 3 #include "driver.h" 4 #include <llvm/IR/LegacyPassManager.h> // for PassManager 4 5 5 6 namespace llvm { class ExecutionEngine; } … … 29 30 30 31 private: 32 void preparePassManager(); 31 33 32 34 llvm::Function * addLinkFunction(llvm::Module * mod, llvm::StringRef name, llvm::FunctionType * type, void * functionPtr) const override; … … 34 36 private: 35 37 llvm::TargetMachine * mTarget; 38 llvm::legacy::PassManager mPassManager; 36 39 llvm::ExecutionEngine * mEngine; 37 40 ParabixObjectCache * mCache;
Note: See TracChangeset
for help on using the changeset viewer.