OmniSciDB  a5dc49c757
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
IRCodegenUtils.h
Go to the documentation of this file.
1 /*
2  * Copyright 2022 HEAVY.AI, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <llvm/IR/Constants.h>
20 #include <llvm/IR/LLVMContext.h>
21 #include <llvm/IR/Module.h>
22 #include <llvm/IR/Type.h>
23 #include <llvm/Support/raw_os_ostream.h>
24 
25 #include "Logger/Logger.h"
26 
27 #if LLVM_VERSION_MAJOR >= 10
28 #define LLVM_ALIGN(alignment) llvm::Align(alignment)
29 #define LLVM_MAYBE_ALIGN(alignment) llvm::MaybeAlign(alignment)
30 #else
31 #define LLVM_ALIGN(alignment) alignment
32 #define LLVM_MAYBE_ALIGN(alignment) alignment
33 #endif
34 
35 inline llvm::ArrayType* get_int_array_type(int const width,
36  int count,
37  llvm::LLVMContext& context) {
38  switch (width) {
39  case 64:
40  return llvm::ArrayType::get(llvm::Type::getInt64Ty(context), count);
41  case 32:
42  return llvm::ArrayType::get(llvm::Type::getInt32Ty(context), count);
43  break;
44  case 16:
45  return llvm::ArrayType::get(llvm::Type::getInt16Ty(context), count);
46  break;
47  case 8:
48  return llvm::ArrayType::get(llvm::Type::getInt8Ty(context), count);
49  break;
50  case 1:
51  return llvm::ArrayType::get(llvm::Type::getInt1Ty(context), count);
52  break;
53  default:
54  LOG(FATAL) << "Unsupported integer width: " << width;
55  }
56  return nullptr;
57 }
58 
59 inline llvm::VectorType* get_int_vector_type(int const width,
60  int count,
61  llvm::LLVMContext& context) {
62  switch (width) {
63  case 64:
64  return llvm::VectorType::get(llvm::Type::getInt64Ty(context), count, false);
65  case 32:
66  return llvm::VectorType::get(llvm::Type::getInt32Ty(context), count, false);
67  break;
68  case 16:
69  return llvm::VectorType::get(llvm::Type::getInt16Ty(context), count, false);
70  break;
71  case 8:
72  return llvm::VectorType::get(llvm::Type::getInt8Ty(context), count, false);
73  break;
74  case 1:
75  return llvm::VectorType::get(llvm::Type::getInt1Ty(context), count, false);
76  break;
77  default:
78  LOG(FATAL) << "Unsupported integer width: " << width;
79  }
80  return nullptr;
81 }
82 
83 inline llvm::Type* get_int_type(const int width, llvm::LLVMContext& context) {
84  switch (width) {
85  case 64:
86  return llvm::Type::getInt64Ty(context);
87  case 32:
88  return llvm::Type::getInt32Ty(context);
89  break;
90  case 16:
91  return llvm::Type::getInt16Ty(context);
92  break;
93  case 8:
94  return llvm::Type::getInt8Ty(context);
95  break;
96  case 1:
97  return llvm::Type::getInt1Ty(context);
98  break;
99  default:
100  LOG(FATAL) << "Unsupported integer width: " << width;
101  }
102  UNREACHABLE();
103  return nullptr;
104 }
105 
106 inline llvm::Type* get_fp_type(const int width, llvm::LLVMContext& context) {
107  switch (width) {
108  case 64:
109  return llvm::Type::getDoubleTy(context);
110  case 32:
111  return llvm::Type::getFloatTy(context);
112  default:
113  LOG(FATAL) << "Unsupported floating point width: " << width;
114  }
115  UNREACHABLE();
116  return nullptr;
117 }
118 
119 inline llvm::Type* get_fp_ptr_type(const int width, llvm::LLVMContext& context) {
120  switch (width) {
121  case 64:
122  return llvm::Type::getDoublePtrTy(context);
123  case 32:
124  return llvm::Type::getFloatPtrTy(context);
125  }
126  UNREACHABLE();
127  return nullptr;
128 }
129 
130 inline llvm::Type* get_int_ptr_type(const int width, llvm::LLVMContext& context) {
131  switch (width) {
132  case 64:
133  return llvm::Type::getInt64PtrTy(context);
134  case 32:
135  return llvm::Type::getInt32PtrTy(context);
136  case 16:
137  return llvm::Type::getInt16PtrTy(context);
138  case 8:
139  return llvm::Type::getInt8PtrTy(context);
140  case 1:
141  return llvm::Type::getInt1PtrTy(context);
142  }
143  UNREACHABLE();
144  return nullptr;
145 }
146 
147 template <class T>
148 inline llvm::ConstantInt* ll_int(const T v, llvm::LLVMContext& context) {
149  return static_cast<llvm::ConstantInt*>(
150  llvm::ConstantInt::get(get_int_type(sizeof(v) * 8, context), v));
151 }
152 
153 inline llvm::ConstantInt* ll_bool(const bool v, llvm::LLVMContext& context) {
154  return static_cast<llvm::ConstantInt*>(
155  llvm::ConstantInt::get(get_int_type(1, context), v));
156 }
157 
158 template <class T>
159 std::string serialize_llvm_object(const T* llvm_obj) {
160  std::string str;
161  llvm::raw_string_ostream os(str);
162  os << *llvm_obj;
163  os.flush();
164  return str;
165 }
166 
167 void verify_function_ir(const llvm::Function* func);
llvm::Type * get_fp_ptr_type(const int width, llvm::LLVMContext &context)
#define LOG(tag)
Definition: Logger.h:285
llvm::ConstantInt * ll_int(const T v, llvm::LLVMContext &context)
#define UNREACHABLE()
Definition: Logger.h:338
llvm::Type * get_fp_type(const int width, llvm::LLVMContext &context)
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
void verify_function_ir(const llvm::Function *func)
llvm::VectorType * get_int_vector_type(int const width, int count, llvm::LLVMContext &context)
std::string serialize_llvm_object(const T *llvm_obj)
llvm::ConstantInt * ll_bool(const bool v, llvm::LLVMContext &context)
llvm::ArrayType * get_int_array_type(int const width, int count, llvm::LLVMContext &context)
llvm::Type * get_int_ptr_type(const int width, llvm::LLVMContext &context)