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

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

Support for write function in CBuilder, use IRBuilder CreateMemMove? for llvm.memmove.p0i8.p0i8.i64

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