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

Last change on this file since 5435 was 5435, checked in by nmedfort, 2 years ago

Continued refactoring work.

File size: 8.5 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 <IR_Gen/FunctionTypeBuilder.h>
9#include <llvm/IR/IRBuilder.h>
10#include <llvm/IR/Constants.h>
11#include <llvm/ADT/Triple.h>
12
13namespace kernels { class KernelBuilder; }
14namespace llvm { class Function; }
15namespace llvm { class IntegerType; }
16namespace llvm { class Module; }
17namespace llvm { class PointerType; }
18namespace llvm { class Type; }
19namespace llvm { class Value; }
20
21class ParabixDriver;
22
23class CBuilder : public llvm::IRBuilder<> {
24    friend class ParabixDriver;
25public:
26
27    CBuilder(llvm::Module * const module, const unsigned GeneralRegisterWidthInBits);
28   
29    virtual ~CBuilder() {}
30
31    llvm::Module * getModule() const {
32        return mMod;
33    }
34
35    void setModule(llvm::Module * const mod) {
36        mMod = mod;
37    }
38
39    llvm::Value * CreateMalloc(llvm::Value * size);
40
41    llvm::Value * CreateAlignedMalloc(llvm::Value * size, const unsigned alignment);
42   
43    void CreateFree(llvm::Value * const ptr);
44   
45    void CreateAlignedFree(llvm::Value * const ptr, const bool testForNullAddress = false);
46   
47    llvm::Value * CreateRealloc(llvm::Value * ptr, llvm::Value * size);
48
49    llvm::CallInst * CreateMemZero(llvm::Value * ptr, llvm::Value * size, const unsigned alignment = 1) {
50        return CreateMemSet(ptr, getInt8(0), size, alignment);
51    }
52
53    llvm::AllocaInst * CreateCacheAlignedAlloca(llvm::Type * Ty, llvm::Value * ArraySize = nullptr) {
54        llvm::AllocaInst * instr = CreateAlloca(Ty, ArraySize);
55        instr->setAlignment(getCacheAlignment());
56        return instr;
57    }
58
59    // stdio.h functions
60    //
61    //  Create a call to:  FILE * fopen(const char *filename, const char *mode);
62    llvm::Value * CreateFOpenCall(llvm::Value * filename, llvm::Value * mode);
63    //  Create a call to:  size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
64    llvm::Value * CreateFReadCall(llvm::Value * ptr, llvm::Value * size, llvm::Value * nitems, llvm::Value * stream);
65    //  Create a call to:  size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream));
66    llvm::Value * CreateFWriteCall(llvm::Value * ptr, llvm::Value * size, llvm::Value * nitems, llvm::Value * stream);
67    //  Create a call to:  int fclose ( FILE * stream );
68    llvm::Value * CreateFCloseCall(llvm::Value * stream);
69    //  Create a call to:  int remove(const char *path);
70    llvm::Value * CreateRemoveCall(llvm::Value * path);
71   
72    //  Create a call to:  int rename(const char *old, const char *new);
73    llvm::Value * CreateRenameCall(llvm::Value * oldName, llvm::Value * newName);
74   
75    llvm::Function * GetPrintf();
76
77    llvm::Function * GetDprintf();
78
79    //  Create calls to unistd.h functions.
80    //
81    //  Create a call to:  int open(const char *filename, int oflag, ...);
82    llvm::Value * CreateOpenCall(llvm::Value * filename, llvm::Value * oflag, llvm::Value * mode);
83    //  Create a call to:  ssize_t write(int fildes, const void *buf, size_t nbyte);
84    llvm::Value * CreateWriteCall(llvm::Value * fileDescriptor, llvm::Value * buf, llvm::Value * nbyte);
85    //  Create a call to:  ssize_t read(int fildes, void *buf, size_t nbyte);
86    llvm::Value * CreateReadCall(llvm::Value * fileDescriptor, llvm::Value * buf, llvm::Value * nbyte);
87    //  Create a call to:  int close(int filedes);
88    llvm::Value * CreateCloseCall(llvm::Value * fileDescriptor);
89    //  Create a call to:  int unlink(const char *path);
90    llvm::Value * CreateUnlinkCall(llvm::Value * path);
91
92    llvm::Value * CreateFileSize(llvm::Value * fileDescriptor);
93
94    //  Create calls to stdlib.h functions.
95    //
96    //  Create a call to:  int mkstemp (char *template);
97    llvm::Value * CreateMkstempCall(llvm::Value * ftemplate);
98   
99    //  Create a call to:  size_t strlen(const char *str);
100    llvm::Value * CreateStrlenCall(llvm::Value * str);
101   
102    llvm::Value * CreateAnonymousMMap(llvm::Value * size);
103
104    llvm::Value * CreateFileSourceMMap(llvm::Value * fd, llvm::Value * size);
105
106    enum Advice {
107        ADVICE_NORMAL
108        , ADVICE_RANDOM
109        , ADVICE_SEQUENTIAL
110        , ADVICE_WILLNEED
111        , ADVICE_DONTNEED
112    };
113
114    llvm::Value * CreateMAdvise(llvm::Value * addr, llvm::Value * length, Advice advice);
115
116    llvm::Value * CreateMMap(llvm::Value * const addr, llvm::Value * size, llvm::Value * const prot, llvm::Value * const flags, llvm::Value * const fd, llvm::Value * const offset);
117
118    llvm::Value * CheckMMapSuccess(llvm::Value * const addr);
119
120    llvm::Value * CreateMRemap(llvm::Value * addr, llvm::Value * oldSize, llvm::Value * newSize);
121
122    llvm::Value * CreateMUnmap(llvm::Value * addr, llvm::Value * size);
123
124    //  Posix thread (pthread.h) functions.
125    //
126    //  Create a call to:  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
127    //                    void *(*start_routine)(void*), void *arg);
128    llvm::Value * CreatePThreadCreateCall(llvm::Value * thread, llvm::Value * attr, llvm::Function * start_routine, llvm::Value * arg);
129   
130    //  Create a call to:  void pthread_exit(void *value_ptr);
131    llvm::Value * CreatePThreadExitCall(llvm::Value * value_ptr);
132   
133    //  Create a call to:  int pthread_join(pthread_t thread, void **value_ptr);
134    llvm::Value * CreatePThreadJoinCall(llvm::Value * thread, llvm::Value * value_ptr);
135   
136    void CallPrintInt(const std::string & name, llvm::Value * const value);
137   
138    void CallPrintIntToStderr(const std::string & name, llvm::Value * const value);
139   
140    llvm::Value * GetString(llvm::StringRef Str);
141   
142    void CallPrintMsgToStderr(const std::string & message);
143
144    inline llvm::IntegerType * getSizeTy() const {
145        assert (mSizeType);
146        return mSizeType;
147    }
148   
149    inline llvm::ConstantInt * getSize(const size_t value) {
150        return llvm::ConstantInt::get(getSizeTy(), value);
151    }
152   
153    llvm::PointerType * getVoidPtrTy() const;
154
155    llvm::PointerType * getFILEptrTy();
156   
157    inline unsigned getCacheAlignment() const {
158        return mCacheLineAlignment;
159    }
160   
161    virtual llvm::LoadInst* CreateAtomicLoadAcquire(llvm::Value * ptr);
162
163    virtual llvm::StoreInst *  CreateAtomicStoreRelease(llvm::Value * val, llvm::Value * ptr);
164
165    void CreateAssert(llvm::Value * assertion, llvm::StringRef failureMessage);
166
167    void CreateExit(const int exitCode);
168
169    llvm::BranchInst * CreateLikelyCondBr(llvm::Value * Cond, llvm::BasicBlock * True, llvm::BasicBlock * False, const int probability = 90);
170
171    llvm::BranchInst * CreateUnlikelyCondBr(llvm::Value * Cond, llvm::BasicBlock * True, llvm::BasicBlock * False, const int probability = 90) {
172        return CreateLikelyCondBr(Cond, True, False, 100 - probability);
173    }
174
175    virtual bool supportsIndirectBr() const {
176        return true;
177    }
178
179    llvm::Value * CreatePopcount(llvm::Value * bits);
180
181    llvm::Value * CreateCountForwardZeroes(llvm::Value * value);
182
183    llvm::Value * CreateCountReverseZeroes(llvm::Value * value);
184   
185    // Useful bit manipulation operations 
186    llvm::Value * CreateResetLowestBit(llvm::Value * bits);   
187   
188    llvm::Value * CreateIsolateLowestBit(llvm::Value * bits);
189   
190    llvm::Value * CreateMaskToLowestBitInclusive(llvm::Value * bits);
191   
192    llvm::Value * CreateMaskToLowestBitExclusive(llvm::Value * bits);
193   
194    llvm::Value * CreateExtractBitField(llvm::Value * bits, llvm::Value * start, llvm::Value * length);
195   
196    llvm::Value * CreateCeilLog2(llvm::Value * value);
197   
198    llvm::Value * CreateReadCycleCounter();
199
200    template <typename ExternalFunctionType>
201    llvm::Function * LinkFunction(llvm::StringRef name, ExternalFunctionType * functionPtr) const;
202
203protected:
204
205    llvm::Function * LinkFunction(llvm::StringRef name, llvm::FunctionType * type, void * functionPtr) const;
206
207    void setDriver(ParabixDriver * driver) {
208        mDriver = driver;
209    }
210
211protected:
212    llvm::Module *                  mMod;
213    unsigned                        mCacheLineAlignment;
214    llvm::IntegerType *             mSizeType;
215    llvm::StructType *              mFILEtype;
216    ParabixDriver *                 mDriver;
217    llvm::LLVMContext               mContext;
218    const std::string               mTriple;
219};
220
221template <typename ExternalFunctionType>
222llvm::Function *CBuilder::LinkFunction(llvm::StringRef name, ExternalFunctionType * functionPtr) const {
223    llvm::FunctionType * const type = FunctionTypeBuilder<ExternalFunctionType>::get(getContext());
224    assert ("FunctionTypeBuilder did not resolve a function type." && type);
225    return LinkFunction(name, type, reinterpret_cast<void *>(functionPtr));
226}
227
228#endif
Note: See TracBrowser for help on using the repository browser.