source: icGREP/icgrep-devel/icgrep/IR_Gen/CBuilder.h @ 5242

Last change on this file since 5242 was 5242, checked in by cameron, 2 years ago

Add pthread create, join and exit support into CBuilder

File size: 2.7 KB
Line 
1/*
2 *  Copyright (c) 2016 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5#ifndef CBUILDER_H
6#define CBUILDER_H
7
8#include <llvm/IR/Module.h>
9#include <llvm/IR/Constant.h>
10#include <llvm/IR/Type.h>
11#include <llvm/IR/Value.h>
12#include <llvm/IR/IRBuilder.h>
13#include <llvm/Support/Host.h>
14#include <llvm/ADT/Triple.h>
15#include <IR_Gen/types/streamtype.h>
16#include <boost/container/flat_map.hpp>
17
18using namespace llvm;
19
20
21class CBuilder : public IRBuilder<> {
22   
23public:
24   
25    CBuilder(Module * m, unsigned archBitWidth, unsigned CacheAlignment=64)
26    : IRBuilder<>(m->getContext())
27    , mMod(m)
28    , mCacheLineAlignment(CacheAlignment)
29    , mSizeType(getIntNTy(archBitWidth)) {
30    }
31   
32    virtual ~CBuilder() {}
33
34    Module * getModule() const {
35        return mMod;
36    }
37   
38    void setModule(Module * m)  {
39        mMod = m;
40    }
41   
42    Function * GetPrintf();
43    Value * CreateMalloc(Type * type, Value * size);
44    Value * CreateAlignedMalloc(Type *type, Value * size, const unsigned alignment);
45    void CreateFree(Value * ptr);
46    void CreateAlignedFree(Value * ptr);
47    Value * CreateRealloc(Value * ptr, Value * size);
48    Value * CreateAlignedRealloc(Value * ptr, Value * size, const unsigned alignment);
49    void CreateMemZero(Value * ptr, Value * size, const unsigned alignment = 1);
50   
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   
63    void CallPrintRegister(const std::string & regName, Value * const value);
64    void CallPrintInt(const std::string & name, Value * const value);
65   
66    inline llvm::IntegerType * getSizeTy() const {
67        return mSizeType;
68    }
69   
70    inline llvm::ConstantInt * getSize(const size_t value) const {
71        return ConstantInt::get(getSizeTy(), value);
72    }
73   
74    PointerType * getVoidPtrTy() const;
75   
76    inline unsigned getCacheAlignment() const {
77        return mCacheLineAlignment;
78    }
79   
80    virtual llvm::LoadInst* CreateAtomicLoadAcquire(Value * ptr);
81    virtual llvm::StoreInst *  CreateAtomicStoreRelease(Value * val, Value * ptr);
82   
83protected:
84    Module *            mMod;
85    unsigned            mCacheLineAlignment;
86    IntegerType *       mSizeType;
87};
88
89#endif
Note: See TracBrowser for help on using the repository browser.