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

Last change on this file since 5350 was 5350, checked in by nmedfort, 3 years ago

First attempt at inlining all DoBlock? and FinalBlock? functions by using indirect jumps. Disabled for NVPTX until Linda can check whether they're supported by the LLVM NVPTX library.

File size: 5.2 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 <string>
9#include <llvm/IR/IRBuilder.h>
10#include <llvm/IR/Constants.h>
11namespace llvm { class Function; }
12namespace llvm { class IntegerType; }
13namespace llvm { class Module; }
14namespace llvm { class PointerType; }
15namespace llvm { class Type; }
16namespace llvm { class Value; }
17
18class CBuilder : public llvm::IRBuilder<> {
19   
20public:
21   
22    CBuilder(llvm::Module * m, const unsigned GeneralRegisterWidthInBits, const bool SupportsIndirectBr, const unsigned CacheLineAlignmentInBytes = 64);
23   
24    virtual ~CBuilder() {}
25
26    llvm::Module * getModule() const {
27        return mMod;
28    }
29   
30    void setModule(llvm::Module * m)  {
31        mMod = m;
32    }
33   
34    llvm::Value * CreateMalloc(llvm::Type * type, llvm::Value * size);
35
36    llvm::Value * CreateAlignedMalloc(llvm::Type * type, llvm::Value * size, const unsigned alignment);
37   
38    void CreateFree(llvm::Value * const ptr);
39   
40    void CreateAlignedFree(llvm::Value * const ptr, const bool testForNullAddress = false);
41   
42    llvm::Value * CreateRealloc(llvm::Value * ptr, llvm::Value * size);
43
44    llvm::CallInst * CreateMemZero(llvm::Value * ptr, llvm::Value * size, const unsigned alignment = 1) {
45        return CreateMemSet(CreatePointerCast(ptr, getInt8PtrTy()), getInt8(0), size, alignment);
46    }
47
48    llvm::AllocaInst * CreateCacheAlignedAlloca(llvm::Type * Ty, llvm::Value * ArraySize = nullptr) {
49        llvm::AllocaInst * instr = CreateAlloca(Ty, ArraySize);
50        instr->setAlignment(getCacheAlignment());
51        return instr;
52    }
53   
54    // stdio.h functions
55    //
56    //  Create a call to:  FILE * fopen(const char *filename, const char *mode);
57    llvm::Value * CreateFOpenCall(llvm::Value * filename, llvm::Value * mode);
58    //  Create a call to:  size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
59    llvm::Value * CreateFReadCall(llvm::Value * ptr, llvm::Value * size, llvm::Value * nitems, llvm::Value * stream);
60    //  Create a call to:  size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream));
61    llvm::Value * CreateFWriteCall(llvm::Value * ptr, llvm::Value * size, llvm::Value * nitems, llvm::Value * stream);
62    //  Create a call to:  int fclose ( FILE * stream );
63    llvm::Value * CreateFCloseCall(llvm::Value * stream);
64   
65    llvm::Function * GetPrintf();
66
67    //  Create calls to unistd.h functions.
68    //
69    //  Create a call to:  int open(const char *filename, int oflag, ...);
70    llvm::Value * CreateOpenCall(llvm::Value * filename, llvm::Value * oflag, llvm::Value * mode);
71    //  Create a call to:  ssize_t write(int fildes, const void *buf, size_t nbyte);
72    llvm::Value * CreateWriteCall(llvm::Value * fildes, llvm::Value * buf, llvm::Value * nbyte);
73    //  Create a call to:  ssize_t read(int fildes, void *buf, size_t nbyte);
74    llvm::Value * CreateReadCall(llvm::Value * fildes, llvm::Value * buf, llvm::Value * nbyte);
75    //  Create a call to:  int close(int filedes);
76    llvm::Value * CreateCloseCall(llvm::Value * fildes);
77
78    //  Posix thread (pthread.h) functions.
79    //
80    //  Create a call to:  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
81    //                    void *(*start_routine)(void*), void *arg);
82    llvm::Value * CreatePThreadCreateCall(llvm::Value * thread, llvm::Value * attr, llvm::Function * start_routine, llvm::Value * arg);
83   
84    //  Create a call to:  void pthread_exit(void *value_ptr);
85    llvm::Value * CreatePThreadExitCall(llvm::Value * value_ptr);
86   
87    //  Create a call to:  int pthread_join(pthread_t thread, void **value_ptr);
88    llvm::Value * CreatePThreadJoinCall(llvm::Value * thread, llvm::Value * value_ptr);
89   
90    void CallPrintInt(const std::string & name, llvm::Value * const value);
91   
92    inline llvm::IntegerType * getSizeTy() const {
93        return mSizeType;
94    }
95   
96    inline llvm::ConstantInt * getSize(const size_t value) {
97        return llvm::ConstantInt::get(getSizeTy(), value);
98    }
99   
100    llvm::PointerType * getVoidPtrTy() const;
101    llvm::PointerType * getFILEptrTy();
102   
103    inline unsigned getCacheAlignment() const {
104        return mCacheLineAlignment;
105    }
106   
107    virtual llvm::LoadInst* CreateAtomicLoadAcquire(llvm::Value * ptr);
108
109    virtual llvm::StoreInst *  CreateAtomicStoreRelease(llvm::Value * val, llvm::Value * ptr);
110   
111    void CreateAssert(llvm::Value * assertion, llvm::StringRef failureMessage);
112
113    void CreateExit(const int exitCode);
114
115    llvm::BranchInst * CreateLikelyCondBr(llvm::Value * Cond, llvm::BasicBlock * True, llvm::BasicBlock * False, const int probability = 90);
116
117    llvm::BranchInst * CreateUnlikelyCondBr(llvm::Value * Cond, llvm::BasicBlock * True, llvm::BasicBlock * False, const int probability = 90) {
118        return CreateLikelyCondBr(Cond, True, False, 100 - probability);
119    }
120
121    bool supportsIndirectBr() const {
122        return mSupportsIndirectBr;
123    }
124
125protected:
126    llvm::Module *      mMod;
127    unsigned            mCacheLineAlignment;
128    llvm::IntegerType * mSizeType;
129    llvm::StructType *  mFILEtype;
130    const bool          mSupportsIndirectBr;
131};
132
133#endif
Note: See TracBrowser for help on using the repository browser.