void* callFunc( void* param ) { struct threadParams* p = (struct threadParams*) param; // Call the `foo' function with no arguments: std::vector<GenericValue> Args(1); Args[0].IntVal = APInt(32, p->value); synchronize.block(); // wait until other threads are at this point GenericValue gv = p->EE->runFunction(p->F, Args); return (void*)(intptr_t)gv.IntVal.getZExtValue(); }
int main() { // Create some module to put our function into it. Module *M = new Module("test"); Function* add1F = createAdd1( M ); Function* fibF = CreateFibFunction( M ); // Now we create the JIT. ExistingModuleProvider* MP = new ExistingModuleProvider(M); ExecutionEngine* EE = ExecutionEngine::create(MP, false); //~ std::cout << "We just constructed this LLVM module:\n\n" << *M; //~ std::cout << "\n\nRunning foo: " << std::flush; // Create one thread for add1 and two threads for fib struct threadParams add1 = { EE, add1F, 1000 }; struct threadParams fib1 = { EE, fibF, 39 }; struct threadParams fib2 = { EE, fibF, 42 }; pthread_t add1Thread; int result = pthread_create( &add1Thread, NULL, callFunc, &add1 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } pthread_t fibThread1; result = pthread_create( &fibThread1, NULL, callFunc, &fib1 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } pthread_t fibThread2; result = pthread_create( &fibThread2, NULL, callFunc, &fib2 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } synchronize.releaseThreads(3); // wait until other threads are at this point void* returnValue; result = pthread_join( add1Thread, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Add1 returned " << intptr_t(returnValue) << std::endl; result = pthread_join( fibThread1, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Fib1 returned " << intptr_t(returnValue) << std::endl; result = pthread_join( fibThread2, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Fib2 returned " << intptr_t(returnValue) << std::endl; return 0; }
int main() { InitializeNativeTarget(); LLVMContext Context; // Create some module to put our function into it. std::unique_ptr<Module> Owner = make_unique<Module>("test", Context); Module *M = Owner.get(); Function* add1F = createAdd1( M ); Function* fibF = CreateFibFunction( M ); // Now we create the JIT. ExecutionEngine* EE = EngineBuilder(std::move(Owner)).create(); //~ std::cout << "We just constructed this LLVM module:\n\n" << *M; //~ std::cout << "\n\nRunning foo: " << std::flush; // Create one thread for add1 and two threads for fib struct threadParams add1 = { EE, add1F, 1000 }; struct threadParams fib1 = { EE, fibF, 39 }; struct threadParams fib2 = { EE, fibF, 42 }; pthread_t add1Thread; int result = pthread_create( &add1Thread, NULL, callFunc, &add1 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } pthread_t fibThread1; result = pthread_create( &fibThread1, NULL, callFunc, &fib1 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } pthread_t fibThread2; result = pthread_create( &fibThread2, NULL, callFunc, &fib2 ); if ( result != 0 ) { std::cerr << "Could not create thread" << std::endl; return 1; } synchronize.releaseThreads(3); // wait until other threads are at this point void* returnValue; result = pthread_join( add1Thread, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Add1 returned " << intptr_t(returnValue) << std::endl; result = pthread_join( fibThread1, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Fib1 returned " << intptr_t(returnValue) << std::endl; result = pthread_join( fibThread2, &returnValue ); if ( result != 0 ) { std::cerr << "Could not join thread" << std::endl; return 1; } std::cout << "Fib2 returned " << intptr_t(returnValue) << std::endl; return 0; }