OmniSciDB  2e3a973ef4
IRCodegenUtils.h File Reference
#include <llvm/IR/Constants.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Type.h>
#include <llvm/Support/raw_os_ostream.h>
#include "Logger/Logger.h"
+ Include dependency graph for IRCodegenUtils.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define LLVM_ALIGN(alignment)   alignment
 
#define LLVM_MAYBE_ALIGN(alignment)   alignment
 

Functions

llvm::ArrayType * get_int_array_type (int const width, int count, llvm::LLVMContext &context)
 
llvm::VectorType * get_int_vector_type (int const width, int count, llvm::LLVMContext &context)
 
llvm::Typeget_int_type (const int width, llvm::LLVMContext &context)
 
llvm::Typeget_fp_type (const int width, llvm::LLVMContext &context)
 
template<class T >
llvm::ConstantInt * ll_int (const T v, llvm::LLVMContext &context)
 
llvm::ConstantInt * ll_bool (const bool v, llvm::LLVMContext &context)
 
llvm::Module * read_template_module (llvm::LLVMContext &context)
 
template<class T >
std::string serialize_llvm_object (const T *llvm_obj)
 
void verify_function_ir (const llvm::Function *func)
 

Macro Definition Documentation

◆ LLVM_ALIGN

#define LLVM_ALIGN (   alignment)    alignment

Definition at line 31 of file IRCodegenUtils.h.

Referenced by query_group_by_template_impl(), and query_template_impl().

◆ LLVM_MAYBE_ALIGN

#define LLVM_MAYBE_ALIGN (   alignment)    alignment

Function Documentation

◆ get_fp_type()

llvm::Type* get_fp_type ( const int  width,
llvm::LLVMContext &  context 
)
inline

Definition at line 106 of file IRCodegenUtils.h.

References logger::FATAL, LOG, and UNREACHABLE.

Referenced by CodeGenerator::endArgsNullcheck(), TableFunctionCompilationContext::generateEntryPoint(), and llvm_type().

106  {
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 }
#define LOG(tag)
Definition: Logger.h:188
#define UNREACHABLE()
Definition: Logger.h:241
+ Here is the caller graph for this function:

◆ get_int_array_type()

llvm::ArrayType* get_int_array_type ( int const  width,
int  count,
llvm::LLVMContext &  context 
)
inline

Definition at line 35 of file IRCodegenUtils.h.

References logger::FATAL, and LOG.

Referenced by CodeGenerator::codegenArrayExpr(), CodeGenerator::codegenCast(), and OverlapsJoinHashTable::codegenMatchingSet().

37  {
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 }
#define LOG(tag)
Definition: Logger.h:188
+ Here is the caller graph for this function:

◆ get_int_type()

llvm::Type* get_int_type ( const int  width,
llvm::LLVMContext &  context 
)
inline

Definition at line 83 of file IRCodegenUtils.h.

References logger::FATAL, LOG, and UNREACHABLE.

Referenced by CgenState::addStringConstant(), Executor::aggregateWindowStatePtr(), Executor::castToIntPtrTyIn(), CgenState::castToTypeIn(), TargetExprCodegen::codegen(), JoinLoop::codegen(), GroupByAndAggregate::codegen(), CodeGenerator::codegen(), GroupByAndAggregate::codegenAggArg(), GroupByAndAggregate::codegenAggColumnPtr(), Executor::codegenAggregateWindowState(), CodeGenerator::codegenArrayAt(), CodeGenerator::codegenArrayBuff(), CodeGenerator::codegenArrayExpr(), CodeGenerator::codegenCastBetweenIntTypes(), CodeGenerator::codegenCastBetweenIntTypesOverflowChecks(), CodeGenerator::codegenCastFromFp(), CodeGenerator::codegenCastFromString(), CodeGenerator::codegenCastTimestampToDate(), GroupByAndAggregate::codegenCountDistinct(), CodeGenerator::codegenDateTruncHighPrecisionTimestamps(), CodeGenerator::codegenDiv(), GroupByAndAggregate::codegenEstimator(), CodeGenerator::codegenFixedLengthColVar(), CodeGenerator::codegenFunctionOperCastArgs(), CodeGenerator::codegenFunctionOperNullArg(), CodeGenerator::codegenFunctionOperWithCustomTypeHandling(), CodeGenerator::codegenGeoArgs(), CodeGenerator::codegenGeosConstructorCall(), CodeGenerator::codegenGeosPredicateCall(), CodeGenerator::codegenHoistedConstantsLoads(), CodeGenerator::codegenIsNull(), OverlapsJoinHashTable::codegenKey(), BaselineJoinHashTable::codegenKey(), OverlapsJoinHashTable::codegenManyKey(), BaselineJoinHashTable::codegenMatchingSet(), GroupByAndAggregate::codegenMultiColumnPerfectHash(), GroupByAndAggregate::codegenPerfectHashFunction(), CodeGenerator::codegenQualifierCmp(), GpuSharedMemCodeBuilder::codegenReduction(), BaselineJoinHashTable::codegenSlot(), TargetExprCodegenBuilder::codegenSlotEmptyKey(), CodeGenerator::codegenVariableLengthStringColVar(), Executor::codegenWindowAvgEpilogue(), Executor::codegenWindowFunctionAggregate(), Executor::codegenWindowFunctionStateInit(), GroupByAndAggregate::codegenWindowRowPointer(), CodeGenerator::codgenAdjustFixedEncNull(), ScalarCodeGenerator::compile(), Executor::compileBody(), Executor::compileWorkUnit(), anonymous_namespace{NativeCodegen.cpp}::create_row_function(), anonymous_namespace{ResultSetReductionInterpreterStubs.cpp}::create_stub_function(), CodeGenerator::endArgsNullcheck(), anonymous_namespace{ExtensionsIR.cpp}::ext_arg_type_to_llvm_type(), anonymous_namespace{TableFunctionCompilationContext.cpp}::generate_entry_point(), TableFunctionCompilationContext::generateEntryPoint(), TableFunctionCompilationContext::generateGpuKernel(), StubGenerator::generateStub(), GroupByAndAggregate::getAdditionalLiteral(), Executor::groupByColumnCodegen(), Executor::inlineHoistedLiterals(), ll_bool(), ll_int(), llvm_type(), anonymous_namespace{ScalarCodeGenerator.cpp}::llvm_type_from_sql(), CodeGenerator::posArg(), Executor::redeclareFilterFunction(), and anonymous_namespace{ResultSetReductionCodegen.cpp}::translate_for().

83  {
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 }
#define LOG(tag)
Definition: Logger.h:188
#define UNREACHABLE()
Definition: Logger.h:241

◆ get_int_vector_type()

llvm::VectorType* get_int_vector_type ( int const  width,
int  count,
llvm::LLVMContext &  context 
)
inline

Definition at line 59 of file IRCodegenUtils.h.

References logger::FATAL, and LOG.

61  {
62  switch (width) {
63  case 64:
64  return llvm::VectorType::get(llvm::Type::getInt64Ty(context), count);
65  case 32:
66  return llvm::VectorType::get(llvm::Type::getInt32Ty(context), count);
67  break;
68  case 16:
69  return llvm::VectorType::get(llvm::Type::getInt16Ty(context), count);
70  break;
71  case 8:
72  return llvm::VectorType::get(llvm::Type::getInt8Ty(context), count);
73  break;
74  case 1:
75  return llvm::VectorType::get(llvm::Type::getInt1Ty(context), count);
76  break;
77  default:
78  LOG(FATAL) << "Unsupported integer width: " << width;
79  }
80  return nullptr;
81 }
#define LOG(tag)
Definition: Logger.h:188

◆ ll_bool()

llvm::ConstantInt* ll_bool ( const bool  v,
llvm::LLVMContext &  context 
)
inline

Definition at line 125 of file IRCodegenUtils.h.

References get_int_type(), and read_template_module().

Referenced by JoinLoop::codegen(), CodeGenerator::codegen(), JoinLoop::evaluateOuterJoinCondition(), and CgenState::llBool().

125  {
126  return static_cast<llvm::ConstantInt*>(
127  llvm::ConstantInt::get(get_int_type(1, context), v));
128 }
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ll_int()

template<class T >
llvm::ConstantInt* ll_int ( const T  v,
llvm::LLVMContext &  context 
)
inline

Definition at line 120 of file IRCodegenUtils.h.

References get_int_type().

Referenced by JoinLoop::codegen(), CodeGenerator::codegen(), CodeGenerator::codegenCastTimestampToDate(), CodeGenerator::codegenDateTruncHighPrecisionTimestamps(), GpuSharedMemCodeBuilder::codegenInitialization(), GpuSharedMemCodeBuilder::codegenReduction(), anonymous_namespace{JoinLoopTest.cpp}::generate_descriptors(), CgenState::inlineIntMaxMin(), and CgenState::llInt().

120  {
121  return static_cast<llvm::ConstantInt*>(
122  llvm::ConstantInt::get(get_int_type(sizeof(v) * 8, context), v));
123 }
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ read_template_module()

llvm::Module* read_template_module ( llvm::LLVMContext &  context)

Definition at line 1056 of file NativeCodegen.cpp.

References CHECK, and omnisci::get_root_abs_path().

Referenced by anonymous_namespace{NativeCodegen.cpp}::get_agg_fnames(), and ll_bool().

1056  {
1057  llvm::SMDiagnostic err;
1058 
1059  auto buffer_or_error = llvm::MemoryBuffer::getFile(omnisci::get_root_abs_path() +
1060  "/QueryEngine/RuntimeFunctions.bc");
1061  CHECK(!buffer_or_error.getError());
1062  llvm::MemoryBuffer* buffer = buffer_or_error.get().get();
1063 
1064  auto owner = llvm::parseBitcodeFile(buffer->getMemBufferRef(), context);
1065  CHECK(!owner.takeError());
1066  auto module = owner.get().release();
1067  CHECK(module);
1068 
1069  return module;
1070 }
#define CHECK(condition)
Definition: Logger.h:197
std::string get_root_abs_path()
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ serialize_llvm_object()

template<class T >
std::string serialize_llvm_object ( const T *  llvm_obj)

Definition at line 133 of file IRCodegenUtils.h.

References verify_function_ir().

Referenced by Executor::compileWorkUnit(), TableFunctionCompilationContext::finalize(), ResultSetReductionJIT::finalizeReductionCode(), anonymous_namespace{ExtensionsIR.cpp}::get_arr_struct_type(), Executor::optimizeAndCodegenCPU(), Executor::optimizeAndCodegenGPU(), and GpuSharedMemCodeBuilder::toString().

133  {
134  std::string str;
135  llvm::raw_string_ostream os(str);
136  os << *llvm_obj;
137  os.flush();
138  return str;
139 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ verify_function_ir()

void verify_function_ir ( const llvm::Function *  func)

Definition at line 44 of file JoinLoopTest.cpp.

References logger::FATAL, and LOG.

Referenced by GpuSharedMemCodeBuilder::codegen(), Executor::compileWorkUnit(), anonymous_namespace{JoinLoopTest.cpp}::create_loop_test_function(), TableFunctionCompilationContext::generateEntryPoint(), StubGenerator::generateStub(), serialize_llvm_object(), and translate_function().

44  {
45  std::stringstream err_ss;
46  llvm::raw_os_ostream err_os(err_ss);
47  if (llvm::verifyFunction(*func, &err_os)) {
48  func->print(llvm::outs());
49  LOG(FATAL) << err_ss.str();
50  }
51 }
#define LOG(tag)
Definition: Logger.h:188
+ Here is the caller graph for this function: