/*------------------------------------------------------------------------- * * llvmjit_wrap.cpp * Parts of the LLVM interface not (yet) exposed to C. * * Copyright (c) 2016-2023, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/llvm/llvmjit_wrap.cpp * *------------------------------------------------------------------------- */ extern "C" { #include "postgres.h" } #include /* Avoid macro clash with LLVM's C++ headers */ #undef Min #include #include #include #include #include "jit/llvmjit.h" /* * C-API extensions. */ #if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME char *LLVMGetHostCPUName(void) { return strdup(llvm::sys::getHostCPUName().data()); } #endif #if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES char *LLVMGetHostCPUFeatures(void) { llvm::SubtargetFeatures Features; llvm::StringMap HostFeatures; if (llvm::sys::getHostCPUFeatures(HostFeatures)) for (auto &F : HostFeatures) Features.AddFeature(F.first(), F.second); return strdup(Features.getString().c_str()); } #endif /* * Like LLVM's LLVMGetAttributeCountAtIndex(), works around a bug in LLVM 3.9. * * In LLVM <= 3.9, LLVMGetAttributeCountAtIndex() segfaults if there are no * attributes at an index (fixed in LLVM commit ce9bb1097dc2). */ unsigned LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx) { /* * This is more expensive, so only do when using a problematic LLVM * version. */ #if LLVM_VERSION_MAJOR < 4 if (!llvm::unwrap(F)->getAttributes().hasAttributes(Idx)) return 0; #endif /* * There is no nice public API to determine the count nicely, so just * always fall back to LLVM's C API. */ return LLVMGetAttributeCountAtIndex(F, Idx); }