Ignore:
Timestamp:
Dec 29, 2016, 8:35:20 PM (3 years ago)
Author:
cameron
Message:

Add pthread create, join and exit support into CBuilder

Location:
icGREP/icgrep-devel/icgrep/IR_Gen
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/IR_Gen/CBuilder.cpp

    r5239 r5242  
    212212    return inst;
    213213}
     214
     215//
     216// int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
     217//                    void *(*start_routine)(void*), void *arg);
     218//
     219Value * CBuilder::CreatePThreadCreateCall(Value * thread, Value * attr, Function * start_routine, Value * arg) {
     220
     221    Type * pthreadTy = getSizeTy();
     222    FunctionType * funVoidPtrVoidTy = FunctionType::get(getVoidTy(), getVoidPtrTy(), false);
     223   
     224    Function * pthreadCreateFunc = cast<Function>(mMod->getOrInsertFunction("pthread_create",
     225                                                                         getInt32Ty(),
     226                                                                         pthreadTy->getPointerTo(),
     227                                                                         getVoidPtrTy(),
     228                                                                         static_cast<Type *>(funVoidPtrVoidTy)->getPointerTo(),
     229                                                                         getVoidPtrTy(), nullptr));
     230    pthreadCreateFunc->setCallingConv(llvm::CallingConv::C);
     231    return CreateCall(pthreadCreateFunc, {thread, attr, start_routine, arg});
     232}
     233
     234//  #include <pthread.h>
     235//  void pthread_exit(void *value_ptr);
     236
     237Value * CBuilder::CreatePThreadExitCall(Value * value_ptr) {
     238    Function * pthreadExitFunc = cast<Function>(mMod->getOrInsertFunction("pthread_exit",
     239                                                                            getVoidTy(),
     240                                                                            getVoidPtrTy(), nullptr));
     241    pthreadExitFunc->addFnAttr(llvm::Attribute::NoReturn);
     242    pthreadExitFunc->setCallingConv(llvm::CallingConv::C);
     243    return CreateCall(pthreadExitFunc, {value_ptr});
     244    CallInst * exitThread = CreateCall(pthreadExitFunc, {value_ptr});
     245    exitThread->setDoesNotReturn();
     246    return exitThread;
     247}
     248
     249//  int pthread_join(pthread_t thread, void **value_ptr);
     250Value * CBuilder::CreatePThreadJoinCall(Value * thread, Value * value_ptr){
     251    Type * pthreadTy = getSizeTy();
     252    Function * pthreadJoinFunc = cast<Function>(mMod->getOrInsertFunction("pthread_join",
     253                                                                       getInt32Ty(),
     254                                                                       pthreadTy,
     255                                                                       getVoidPtrTy()->getPointerTo(), nullptr));
     256    pthreadJoinFunc->setCallingConv(llvm::CallingConv::C);
     257    return CreateCall(pthreadJoinFunc, {thread, value_ptr});
     258}
  • icGREP/icgrep-devel/icgrep/IR_Gen/CBuilder.h

    r5239 r5242  
    4949    void CreateMemZero(Value * ptr, Value * size, const unsigned alignment = 1);
    5050   
     51   
     52    // Create calls to Posix thread (pthread.h) functions.
     53    //
     54    //  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
     55    //                    void *(*start_routine)(void*), void *arg);
     56    Value * CreatePThreadCreateCall(Value * thread, Value * attr, Function * start_routine, Value * arg);
     57    //  void pthread_exit(void *value_ptr);
     58    Value * CreatePThreadExitCall(Value * value_ptr);
     59    //  int pthread_join(pthread_t thread, void **value_ptr);
     60    Value * CreatePThreadJoinCall(Value * thread, Value * value_ptr);
     61   
     62   
    5163    void CallPrintRegister(const std::string & regName, Value * const value);
    5264    void CallPrintInt(const std::string & name, Value * const value);
Note: See TracChangeset for help on using the changeset viewer.