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

Last change on this file since 5245 was 5245, checked in by nmedfort, 18 months ago

Work on bracket matching problem

File size: 3.0 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 * const ptr);
46    void CreateAlignedFree(Value * const ptr, const bool ptrMayBeNull = false);
47    Value * CreateRealloc(Value * ptr, Value * size);
48    void CreateMemZero(Value * ptr, Value * size, const unsigned alignment = 1);
49
50    inline llvm::AllocaInst * CreateCacheAlignedAlloca(llvm::Type * Ty, llvm::Value * ArraySize = nullptr) {
51        llvm::AllocaInst * instr = CreateAlloca(Ty, ArraySize);
52        instr->setAlignment(getCacheAlignment());
53        return instr;
54    }
55   
56    // Create calls to unistd.h functions.
57    //
58    // ssize_t write(int fildes, const void *buf, size_t nbyte);
59    Value * CreateWriteCall(Value * fildes, Value * buf, Value * nbyte);
60   
61    // Create calls to Posix thread (pthread.h) functions.
62    //
63    //  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
64    //                    void *(*start_routine)(void*), void *arg);
65    Value * CreatePThreadCreateCall(Value * thread, Value * attr, Function * start_routine, Value * arg);
66    //  void pthread_exit(void *value_ptr);
67    Value * CreatePThreadExitCall(Value * value_ptr);
68    //  int pthread_join(pthread_t thread, void **value_ptr);
69    Value * CreatePThreadJoinCall(Value * thread, Value * value_ptr);
70   
71    void CallPrintInt(const std::string & name, Value * const value);
72   
73    inline llvm::IntegerType * getSizeTy() const {
74        return mSizeType;
75    }
76   
77    inline llvm::ConstantInt * getSize(const size_t value) const {
78        return ConstantInt::get(getSizeTy(), value);
79    }
80   
81    PointerType * getVoidPtrTy() const;
82   
83    inline unsigned getCacheAlignment() const {
84        return mCacheLineAlignment;
85    }
86   
87    virtual llvm::LoadInst* CreateAtomicLoadAcquire(Value * ptr);
88    virtual llvm::StoreInst *  CreateAtomicStoreRelease(Value * val, Value * ptr);
89   
90protected:
91    Module *            mMod;
92    unsigned            mCacheLineAlignment;
93    IntegerType *       mSizeType;
94};
95
96#endif
Note: See TracBrowser for help on using the repository browser.