OmniSciDB  bf83d84833
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NativeCodegen.cpp File Reference
#include "CodeGenerator.h"
#include "Execute.h"
#include "ExtensionFunctionsWhitelist.h"
#include "GpuSharedMemoryUtils.h"
#include "LLVMFunctionAttributesUtil.h"
#include "OutputBufferInitialization.h"
#include "QueryTemplateGenerator.h"
#include "CudaMgr/CudaMgr.h"
#include "OSDependent/omnisci_path.h"
#include "Shared/InlineNullValues.h"
#include "Shared/MathUtils.h"
#include "StreamingTopN.h"
#include <llvm/Bitcode/BitcodeReader.h>
#include <llvm/Bitcode/BitcodeWriter.h>
#include <llvm/ExecutionEngine/MCJIT.h>
#include <llvm/IR/Attributes.h>
#include <llvm/IR/GlobalValue.h>
#include <llvm/IR/InstIterator.h>
#include <llvm/IR/IntrinsicInst.h>
#include <llvm/IR/Intrinsics.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Linker/Linker.h>
#include <llvm/Support/Casting.h>
#include <llvm/Support/FileSystem.h>
#include <llvm/Support/FormattedStream.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/TargetRegistry.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/Support/raw_os_ostream.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/AlwaysInliner.h>
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
#include <llvm/Transforms/InstCombine/InstCombine.h>
#include <llvm/Transforms/Instrumentation.h>
#include <llvm/Transforms/Scalar.h>
#include <llvm/Transforms/Scalar/InstSimplifyPass.h>
#include <llvm/Transforms/Utils.h>
#include <llvm/Transforms/Utils/BasicBlockUtils.h>
#include <llvm/Transforms/Utils/Cloning.h>
+ Include dependency graph for NativeCodegen.cpp:

Go to the source code of this file.

Namespaces

 anonymous_namespace{NativeCodegen.cpp}
 

Macros

#define SHOW_DEFINED(MODULE)
 
#define SHOW_FUNCTIONS(MODULE)
 

Functions

void anonymous_namespace{NativeCodegen.cpp}::throw_parseIR_error (const llvm::SMDiagnostic &parse_error, std::string src="", const bool is_gpu=false)
 
template<typename T = void>
void anonymous_namespace{NativeCodegen.cpp}::show_defined (llvm::Module &module)
 
template<typename T = void>
void anonymous_namespace{NativeCodegen.cpp}::show_defined (llvm::Module *module)
 
template<typename T = void>
void anonymous_namespace{NativeCodegen.cpp}::show_defined (std::unique_ptr< llvm::Module > &module)
 
template<typename T = void>
void anonymous_namespace{NativeCodegen.cpp}::scan_function_calls (llvm::Function &F, std::unordered_set< std::string > &defined, std::unordered_set< std::string > &undefined, const std::unordered_set< std::string > &ignored)
 
template<typename T = void>
void anonymous_namespace{NativeCodegen.cpp}::scan_function_calls (llvm::Module &module, std::unordered_set< std::string > &defined, std::unordered_set< std::string > &undefined, const std::unordered_set< std::string > &ignored)
 
template<typename T = void>
std::tuple< std::unordered_set
< std::string >
, std::unordered_set
< std::string > > 
anonymous_namespace{NativeCodegen.cpp}::scan_function_calls (llvm::Module &module, const std::unordered_set< std::string > &ignored={})
 
void anonymous_namespace{NativeCodegen.cpp}::eliminate_dead_self_recursive_funcs (llvm::Module &M, const std::unordered_set< llvm::Function * > &live_funcs)
 
void anonymous_namespace{NativeCodegen.cpp}::optimize_ir (llvm::Function *query_func, llvm::Module *module, llvm::legacy::PassManager &pass_manager, const std::unordered_set< llvm::Function * > &live_funcs, const CompilationOptions &co)
 
void verify_function_ir (const llvm::Function *func)
 
std::string anonymous_namespace{NativeCodegen.cpp}::assemblyForCPU (ExecutionEngineWrapper &execution_engine, llvm::Module *module)
 
std::string anonymous_namespace{NativeCodegen.cpp}::cpp_to_llvm_name (const std::string &s)
 
std::string anonymous_namespace{NativeCodegen.cpp}::gen_array_any_all_sigs ()
 
std::string anonymous_namespace{NativeCodegen.cpp}::gen_translate_null_key_sigs ()
 
llvm::StringRef get_gpu_target_triple_string ()
 
llvm::StringRef get_gpu_data_layout ()
 
std::map< std::string,
std::string > 
get_device_parameters (bool cpu_only)
 
llvm::Module * read_template_module (llvm::LLVMContext &context)
 
void anonymous_namespace{NativeCodegen.cpp}::bind_pos_placeholders (const std::string &pos_fn_name, const bool use_resume_param, llvm::Function *query_func, llvm::Module *module)
 
void anonymous_namespace{NativeCodegen.cpp}::set_row_func_argnames (llvm::Function *row_func, const size_t in_col_count, const size_t agg_col_count, const bool hoist_literals)
 
llvm::Function * anonymous_namespace{NativeCodegen.cpp}::create_row_function (const size_t in_col_count, const size_t agg_col_count, const bool hoist_literals, llvm::Module *module, llvm::LLVMContext &context)
 
void anonymous_namespace{NativeCodegen.cpp}::bind_query (llvm::Function *query_func, const std::string &query_fname, llvm::Function *multifrag_query_func, llvm::Module *module)
 
std::vector< std::string > anonymous_namespace{NativeCodegen.cpp}::get_agg_fnames (const std::vector< Analyzer::Expr * > &target_exprs, const bool is_group_by)
 
std::unique_ptr< llvm::Module > g_rt_module (read_template_module(getGlobalLLVMContext()))
 
bool is_udf_module_present (bool cpu_only)
 
bool is_rt_udf_module_present (bool cpu_only)
 
void read_udf_gpu_module (const std::string &udf_ir_filename)
 
void read_udf_cpu_module (const std::string &udf_ir_filename)
 
void read_rt_udf_gpu_module (const std::string &udf_ir_string)
 
void read_rt_udf_cpu_module (const std::string &udf_ir_string)
 
template<typename InstType >
llvm::Value * anonymous_namespace{NativeCodegen.cpp}::find_variable_in_basic_block (llvm::Function *func, std::string bb_name, std::string variable_name)
 
size_t anonymous_namespace{NativeCodegen.cpp}::get_shared_memory_size (const bool shared_mem_used, const QueryMemoryDescriptor *query_mem_desc_ptr)
 
bool anonymous_namespace{NativeCodegen.cpp}::is_gpu_shared_mem_supported (const QueryMemoryDescriptor *query_mem_desc_ptr, const RelAlgExecutionUnit &ra_exe_unit, const CudaMgr_Namespace::CudaMgr *cuda_mgr, const ExecutorDeviceType device_type, const unsigned gpu_blocksize, const unsigned num_blocks_per_mp)
 
std::string anonymous_namespace{NativeCodegen.cpp}::serialize_llvm_metadata_footnotes (llvm::Function *query_func, CgenState *cgen_state)
 
std::unique_ptr< llvm::Module > runtime_module_shallow_copy (CgenState *cgen_state)
 
std::vector< llvm::Value * > generate_column_heads_load (const int num_columns, llvm::Value *byte_stream_arg, llvm::IRBuilder<> &ir_builder, llvm::LLVMContext &ctx)
 

Variables

float g_fraction_code_cache_to_evict = 0.2
 
std::unique_ptr< llvm::Module > udf_gpu_module
 
std::unique_ptr< llvm::Module > udf_cpu_module
 
std::unique_ptr< llvm::Module > rt_udf_gpu_module
 
std::unique_ptr< llvm::Module > rt_udf_cpu_module
 
std::unique_ptr< llvm::Module > g_rt_module
 
const std::string anonymous_namespace{NativeCodegen.cpp}::cuda_rt_decls
 

Macro Definition Documentation

#define SHOW_DEFINED (   MODULE)
Value:
{ \
std::cout << __func__ << "#" << __LINE__ << ": " #MODULE << " "; \
::show_defined(MODULE); \
}
void show_defined(llvm::Module &module)

Definition at line 145 of file NativeCodegen.cpp.

#define SHOW_FUNCTIONS (   MODULE)
Value:
{ \
std::cout << __func__ << "#" << __LINE__ << ": " #MODULE << " "; \
::show_functions(MODULE); \
}

Definition at line 151 of file NativeCodegen.cpp.

Function Documentation

std::unique_ptr<llvm::Module> g_rt_module ( read_template_module(getGlobalLLVMContext())  )
std::vector<llvm::Value*> generate_column_heads_load ( const int  num_columns,
llvm::Value *  byte_stream_arg,
llvm::IRBuilder<> &  ir_builder,
llvm::LLVMContext &  ctx 
)

Loads individual columns from a single, packed pointers buffer (the byte stream arg)

Definition at line 3061 of file NativeCodegen.cpp.

Referenced by TableFunctionCompilationContext::generateEntryPoint().

3064  {
3065  CHECK(byte_stream_arg);
3066  const auto max_col_local_id = num_columns - 1;
3067 
3068  std::vector<llvm::Value*> col_heads;
3069  for (int col_id = 0; col_id <= max_col_local_id; ++col_id) {
3070  col_heads.emplace_back(ir_builder.CreateLoad(ir_builder.CreateGEP(
3071  byte_stream_arg, llvm::ConstantInt::get(llvm::Type::getInt32Ty(ctx), col_id))));
3072  }
3073  return col_heads;
3074 }
#define CHECK(condition)
Definition: Logger.h:197

+ Here is the caller graph for this function:

std::map<std::string, std::string> get_device_parameters ( bool  cpu_only)

Definition at line 860 of file NativeCodegen.cpp.

860  {
861  std::map<std::string, std::string> result;
862 
863  result.insert(std::make_pair("cpu_name", llvm::sys::getHostCPUName()));
864  result.insert(std::make_pair("cpu_triple", llvm::sys::getProcessTriple()));
865  result.insert(
866  std::make_pair("cpu_cores", std::to_string(llvm::sys::getHostNumPhysicalCores())));
867  result.insert(std::make_pair("cpu_threads", std::to_string(cpu_threads())));
868 
869  std::string null_values;
870  null_values += "boolean1:" + std::to_string(serialized_null_value<bool>()) + ";";
871  null_values += "boolean8:" + std::to_string(serialized_null_value<int8_t>()) + ";";
872  null_values += "int8:" + std::to_string(serialized_null_value<int8_t>()) + ";";
873  null_values += "int16:" + std::to_string(serialized_null_value<int16_t>()) + ";";
874  null_values += "int32:" + std::to_string(serialized_null_value<int32_t>()) + ";";
875  null_values += "int64:" + std::to_string(serialized_null_value<int64_t>()) + ";";
876  null_values += "uint8:" + std::to_string(serialized_null_value<uint8_t>()) + ";";
877  null_values += "uint16:" + std::to_string(serialized_null_value<uint16_t>()) + ";";
878  null_values += "uint32:" + std::to_string(serialized_null_value<uint32_t>()) + ";";
879  null_values += "uint64:" + std::to_string(serialized_null_value<uint64_t>()) + ";";
880  null_values += "float32:" + std::to_string(serialized_null_value<float>()) + ";";
881  null_values += "float64:" + std::to_string(serialized_null_value<double>()) + ";";
882  null_values +=
883  "Array<boolean8>:" + std::to_string(serialized_null_value<int8_t, true>()) + ";";
884  null_values +=
885  "Array<int8>:" + std::to_string(serialized_null_value<int8_t, true>()) + ";";
886  null_values +=
887  "Array<int16>:" + std::to_string(serialized_null_value<int16_t, true>()) + ";";
888  null_values +=
889  "Array<int32>:" + std::to_string(serialized_null_value<int32_t, true>()) + ";";
890  null_values +=
891  "Array<int64>:" + std::to_string(serialized_null_value<int64_t, true>()) + ";";
892  null_values +=
893  "Array<float32>:" + std::to_string(serialized_null_value<float, true>()) + ";";
894  null_values +=
895  "Array<float64>:" + std::to_string(serialized_null_value<double, true>()) + ";";
896 
897  result.insert(std::make_pair("null_values", null_values));
898 
899  llvm::StringMap<bool> cpu_features;
900  if (llvm::sys::getHostCPUFeatures(cpu_features)) {
901  std::string features_str = "";
902  for (auto it = cpu_features.begin(); it != cpu_features.end(); ++it) {
903  features_str += (it->getValue() ? " +" : " -");
904  features_str += it->getKey().str();
905  }
906  result.insert(std::make_pair("cpu_features", features_str));
907  }
908 
909  result.insert(std::make_pair("llvm_version",
910  std::to_string(LLVM_VERSION_MAJOR) + "." +
911  std::to_string(LLVM_VERSION_MINOR) + "." +
912  std::to_string(LLVM_VERSION_PATCH)));
913 
914 #ifdef HAVE_CUDA
915  if (!cpu_only) {
916  int device_count = 0;
917  checkCudaErrors(cuDeviceGetCount(&device_count));
918  if (device_count) {
919  CUdevice device{};
920  char device_name[256];
921  int major = 0, minor = 0;
922  int driver_version;
923  checkCudaErrors(cuDeviceGet(&device, 0)); // assuming homogeneous multi-GPU system
924  checkCudaErrors(cuDeviceGetName(device_name, 256, device));
925  checkCudaErrors(cuDeviceGetAttribute(
926  &major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device));
927  checkCudaErrors(cuDeviceGetAttribute(
928  &minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device));
929  checkCudaErrors(cuDriverGetVersion(&driver_version));
930 
931  result.insert(std::make_pair("gpu_name", device_name));
932  result.insert(std::make_pair("gpu_count", std::to_string(device_count)));
933  result.insert(std::make_pair("gpu_compute_capability",
934  std::to_string(major) + "." + std::to_string(minor)));
935  result.insert(std::make_pair("gpu_triple", get_gpu_target_triple_string()));
936  result.insert(std::make_pair("gpu_datalayout", get_gpu_data_layout()));
937  result.insert(std::make_pair("gpu_driver",
938  "CUDA " + std::to_string(driver_version / 1000) + "." +
939  std::to_string((driver_version % 1000) / 10)));
940  }
941  }
942 #endif
943 
944  return result;
945 }
void checkCudaErrors(CUresult err)
Definition: sample.cpp:38
llvm::StringRef get_gpu_data_layout()
std::string to_string(char const *&&v)
llvm::StringRef get_gpu_target_triple_string()
int CUdevice
Definition: nocuda.h:20
int cpu_threads()
Definition: thread_count.h:24
llvm::StringRef get_gpu_data_layout ( )

Definition at line 852 of file NativeCodegen.cpp.

852  {
853  return llvm::StringRef(
854  "e-p:64:64:64-i1:8:8-i8:8:8-"
855  "i16:16:16-i32:32:32-i64:64:64-"
856  "f32:32:32-f64:64:64-v16:16:16-"
857  "v32:32:32-v64:64:64-v128:128:128-n16:32:64");
858 }
llvm::StringRef get_gpu_target_triple_string ( )

Definition at line 848 of file NativeCodegen.cpp.

References rt_udf_gpu_module.

848  {
849  return llvm::StringRef("nvptx64-nvidia-cuda");
850 }
bool is_rt_udf_module_present ( bool  cpu_only)

Definition at line 1667 of file NativeCodegen.cpp.

1667  {
1668  return (cpu_only || rt_udf_gpu_module != nullptr) && (rt_udf_cpu_module != nullptr);
1669 }
std::unique_ptr< llvm::Module > rt_udf_cpu_module
std::unique_ptr< llvm::Module > rt_udf_gpu_module
bool is_udf_module_present ( bool  cpu_only)

Definition at line 1663 of file NativeCodegen.cpp.

1663  {
1664  return (cpu_only || udf_gpu_module != nullptr) && (udf_cpu_module != nullptr);
1665 }
std::unique_ptr< llvm::Module > udf_gpu_module
std::unique_ptr< llvm::Module > udf_cpu_module
void read_rt_udf_cpu_module ( const std::string &  udf_ir_string)

Definition at line 1724 of file NativeCodegen.cpp.

Referenced by DBHandler::register_runtime_extension_functions().

1724  {
1725  llvm::SMDiagnostic parse_error;
1726 
1727  auto buf =
1728  std::make_unique<llvm::MemoryBufferRef>(udf_ir_string, "Runtime UDF for CPU");
1729 
1730  rt_udf_cpu_module = llvm::parseIR(*buf, parse_error, getGlobalLLVMContext());
1731  if (!rt_udf_cpu_module) {
1732  LOG(IR) << "read_rt_udf_cpu_module:LLVM IR:\n" << udf_ir_string << "\nEnd of LLVM IR";
1733  throw_parseIR_error(parse_error);
1734  }
1735 }
std::unique_ptr< llvm::Module > rt_udf_cpu_module
#define LOG(tag)
Definition: Logger.h:188
void throw_parseIR_error(const llvm::SMDiagnostic &parse_error, std::string src="", const bool is_gpu=false)
llvm::LLVMContext & getGlobalLLVMContext()

+ Here is the caller graph for this function:

void read_rt_udf_gpu_module ( const std::string &  udf_ir_string)

Definition at line 1701 of file NativeCodegen.cpp.

Referenced by DBHandler::register_runtime_extension_functions().

1701  {
1702  llvm::SMDiagnostic parse_error;
1703 
1704  auto buf =
1705  std::make_unique<llvm::MemoryBufferRef>(udf_ir_string, "Runtime UDF for GPU");
1706 
1707  rt_udf_gpu_module = llvm::parseIR(*buf, parse_error, getGlobalLLVMContext());
1708  if (!rt_udf_gpu_module) {
1709  LOG(IR) << "read_rt_udf_gpu_module:NVVM IR:\n" << udf_ir_string << "\nEnd of NNVM IR";
1710  throw_parseIR_error(parse_error, "", /* is_gpu= */ true);
1711  }
1712 
1713  llvm::Triple gpu_triple(rt_udf_gpu_module->getTargetTriple());
1714  if (!gpu_triple.isNVPTX()) {
1715  LOG(IR) << "read_rt_udf_gpu_module:NVVM IR:\n" << udf_ir_string << "\nEnd of NNVM IR";
1716  LOG(WARNING) << "Expected triple nvptx64-nvidia-cuda for NVVM IR but got "
1717  << gpu_triple.str()
1718  << ". Executing runtime UDFs on GPU will be disabled.";
1719  rt_udf_gpu_module = nullptr;
1720  return;
1721  }
1722 }
#define LOG(tag)
Definition: Logger.h:188
std::unique_ptr< llvm::Module > rt_udf_gpu_module
void throw_parseIR_error(const llvm::SMDiagnostic &parse_error, std::string src="", const bool is_gpu=false)
llvm::LLVMContext & getGlobalLLVMContext()

+ Here is the caller graph for this function:

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

Definition at line 1318 of file NativeCodegen.cpp.

1318  {
1319  llvm::SMDiagnostic err;
1320 
1321  auto buffer_or_error = llvm::MemoryBuffer::getFile(omnisci::get_root_abs_path() +
1322  "/QueryEngine/RuntimeFunctions.bc");
1323  CHECK(!buffer_or_error.getError());
1324  llvm::MemoryBuffer* buffer = buffer_or_error.get().get();
1325 
1326  auto owner = llvm::parseBitcodeFile(buffer->getMemBufferRef(), context);
1327  CHECK(!owner.takeError());
1328  auto module = owner.get().release();
1329  CHECK(module);
1330 
1331  return module;
1332 }
#define CHECK(condition)
Definition: Logger.h:197
std::string get_root_abs_path()
void read_udf_cpu_module ( const std::string &  udf_ir_filename)

Definition at line 1690 of file NativeCodegen.cpp.

Referenced by UdfCompiler::readCpuCompiledModule().

1690  {
1691  llvm::SMDiagnostic parse_error;
1692 
1693  llvm::StringRef file_name_arg(udf_ir_filename);
1694 
1695  udf_cpu_module = llvm::parseIRFile(file_name_arg, parse_error, getGlobalLLVMContext());
1696  if (!udf_cpu_module) {
1697  throw_parseIR_error(parse_error, udf_ir_filename);
1698  }
1699 }
void throw_parseIR_error(const llvm::SMDiagnostic &parse_error, std::string src="", const bool is_gpu=false)
std::unique_ptr< llvm::Module > udf_cpu_module
llvm::LLVMContext & getGlobalLLVMContext()

+ Here is the caller graph for this function:

void read_udf_gpu_module ( const std::string &  udf_ir_filename)

Definition at line 1671 of file NativeCodegen.cpp.

Referenced by UdfCompiler::readGpuCompiledModule().

1671  {
1672  llvm::SMDiagnostic parse_error;
1673 
1674  llvm::StringRef file_name_arg(udf_ir_filename);
1675  udf_gpu_module = llvm::parseIRFile(file_name_arg, parse_error, getGlobalLLVMContext());
1676 
1677  if (!udf_gpu_module) {
1678  throw_parseIR_error(parse_error, udf_ir_filename, /* is_gpu= */ true);
1679  }
1680 
1681  llvm::Triple gpu_triple(udf_gpu_module->getTargetTriple());
1682  if (!gpu_triple.isNVPTX()) {
1683  LOG(WARNING)
1684  << "Expected triple nvptx64-nvidia-cuda for NVVM IR of loadtime UDFs but got "
1685  << gpu_triple.str() << ". Disabling the NVVM IR module.";
1686  udf_gpu_module = nullptr;
1687  }
1688 }
std::unique_ptr< llvm::Module > udf_gpu_module
#define LOG(tag)
Definition: Logger.h:188
void throw_parseIR_error(const llvm::SMDiagnostic &parse_error, std::string src="", const bool is_gpu=false)
llvm::LLVMContext & getGlobalLLVMContext()

+ Here is the caller graph for this function:

std::unique_ptr<llvm::Module> runtime_module_shallow_copy ( CgenState cgen_state)

Makes a shallow copy (just declarations) of the runtime module. Function definitions are cloned only if they're used from the generated code.

Definition at line 3049 of file NativeCodegen.cpp.

Referenced by ResultSetReductionJIT::codegen(), GpuReductionHelperJIT::codegen(), StubGenerator::generateStub(), and TableFunctionCompilationContext::TableFunctionCompilationContext().

3049  {
3050  return llvm::CloneModule(
3051  *g_rt_module.get(), cgen_state->vmap_, [](const llvm::GlobalValue* gv) {
3052  auto func = llvm::dyn_cast<llvm::Function>(gv);
3053  if (!func) {
3054  return true;
3055  }
3056  return (func->getLinkage() == llvm::GlobalValue::LinkageTypes::PrivateLinkage ||
3057  func->getLinkage() == llvm::GlobalValue::LinkageTypes::InternalLinkage);
3058  });
3059 }
std::unique_ptr< llvm::Module > g_rt_module
llvm::ValueToValueMapTy vmap_
Definition: CgenState.h:330

+ Here is the caller graph for this function:

void verify_function_ir ( const llvm::Function *  func)

Definition at line 362 of file NativeCodegen.cpp.

References logger::FATAL, and LOG.

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

362  {
363  std::stringstream err_ss;
364  llvm::raw_os_ostream err_os(err_ss);
365  err_os << "\n-----\n";
366  if (llvm::verifyFunction(*func, &err_os)) {
367  err_os << "\n-----\n";
368  func->print(err_os, nullptr);
369  err_os << "\n-----\n";
370  LOG(FATAL) << err_ss.str();
371  }
372 }
#define LOG(tag)
Definition: Logger.h:188

+ Here is the caller graph for this function:

Variable Documentation

float g_fraction_code_cache_to_evict = 0.2

Definition at line 71 of file NativeCodegen.cpp.

Referenced by CommandLineOptions::fillAdvancedOptions().

std::unique_ptr<llvm::Module> g_rt_module
std::unique_ptr<llvm::Module> rt_udf_cpu_module

Definition at line 76 of file NativeCodegen.cpp.

Referenced by TableFunctionCompilationContext::finalize().

std::unique_ptr<llvm::Module> rt_udf_gpu_module
std::unique_ptr<llvm::Module> udf_cpu_module

Definition at line 74 of file NativeCodegen.cpp.

std::unique_ptr<llvm::Module> udf_gpu_module

Definition at line 73 of file NativeCodegen.cpp.