EGREP
GREP
with_llvm
+LLVM_CXXFLAGS
+LLVM_CFLAGS
LLVM_LIBS
LLVM_CONFIG
with_zlib
for pgac_option in `$LLVM_CONFIG --cflags`; do
case $pgac_option in
-I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+ -W*);; # ignore
+ esac
+ done
+
+ for pgac_option in `$LLVM_CONFIG --cxxflags`; do
+ case $pgac_option in
+ -fno-exceptions*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";;
+ -fno-rtti*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";;
esac
done
for pgac_option in `$LLVM_CONFIG --ldflags`; do
-L*) LDFLAGS="$LDFLAGS $pgac_option";;
esac
done
- for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+ for pgac_option in `$LLVM_CONFIG --libs --system-libs engine debuginfodwarf perfjitevents`; do
case $pgac_option in
-l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
esac
+
+
#
# Elf
#
for pgac_option in `$LLVM_CONFIG --cflags`; do
case $pgac_option in
-I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+ -W*);; # ignore
+ esac
+ done
+
+ for pgac_option in `$LLVM_CONFIG --cxxflags`; do
+ case $pgac_option in
+ -fno-exceptions*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";;
+ -fno-rtti*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";;
esac
done
for pgac_option in `$LLVM_CONFIG --ldflags`; do
-L*) LDFLAGS="$LDFLAGS $pgac_option";;
esac
done
- for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+ for pgac_option in `$LLVM_CONFIG --libs --system-libs engine debuginfodwarf perfjitevents`; do
case $pgac_option in
-l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
esac
fi
fi
AC_SUBST(LLVM_LIBS)
+AC_SUBST(LLVM_CFLAGS)
+AC_SUBST(LLVM_CXXFLAGS)
AC_SUBST(with_llvm)
CFLAGS = @CFLAGS@
CFLAGS_VECTOR = @CFLAGS_VECTOR@
CFLAGS_SSE42 = @CFLAGS_SSE42@
+LLVM_CFLAGS = @LLVM_CFLAGS@
+LLVM_CXXFLAGS = @LLVM_CXXFLAGS@
# Kind-of compilers
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c
endif
+ifndef COMPILE.cpp
+COMPILE.cpp = $(CXX) $(CFLAGS) $(CPPFLAGS) -c
+endif
+
DEPDIR = .deps
ifeq ($(GCC), yes)
@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi
$(COMPILE.c) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po
+%.o : %.cpp
+ @if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi
+ $(COMPILE.cpp) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po
+
endif # GCC
# Include all the dependency files generated for the current
# only specify here
LIBS += $(LLVM_LIBS)
+ifeq ($(with_llvm), yes)
+LIBS += -lstdc++
+endif
+
ifeq ($(with_systemd),yes)
LIBS += -lsystemd
endif
include $(top_builddir)/src/Makefile.global
OBJS = binaryheap.o bipartite_match.o hyperloglog.o ilist.o pairingheap.o \
- rbtree.o stringinfo.o llvmjit.o
+ rbtree.o stringinfo.o llvmjit.o llvmjit_profile.o
+
+llvmjit_profile.o: CFLAGS+=$(LLVM_CFLAGS)
+llvmjit_profile.o: CXXFLAGS+=$(LLVM_CXXFLAGS)
include $(top_srcdir)/src/backend/common.mk
LLVMTypeRef StructBlockId;
LLVMTypeRef StructTupleTableSlot;
+static void
+shutdown_perf(void)
+{
+ if (llvm_engine)
+ llvm_shutdown_perf_support(llvm_engine);
+}
+
void
llvm_initialize(void)
{
exit(EXIT_FAILURE);
}
+ llvm_perf_support(llvm_engine);
+ atexit(shutdown_perf);
+
/* so we don't constantly have to decide between 32/64 bit */
#if SIZEOF_DATUM == 8
TypeSizeT = LLVMInt64Type();
--- /dev/null
+extern "C"
+{
+#include "postgres.h"
+#include "lib/llvmjit.h"
+}
+
+
+#ifdef USE_LLVM
+#include "llvm/ExecutionEngine/JITEventListener.h"
+#include "llvm/ExecutionEngine/MCJIT.h"
+
+using namespace llvm;
+
+static JITEventListener *perf_listener = NULL;
+
+extern void
+llvm_perf_support(LLVMExecutionEngineRef EE)
+{
+ perf_listener = JITEventListener::createPerfJITEventListener();
+ unwrap(EE)->RegisterJITEventListener(perf_listener);
+}
+
+extern void
+llvm_shutdown_perf_support(LLVMExecutionEngineRef EE)
+{
+ if (perf_listener)
+ {
+ unwrap(EE)->UnregisterJITEventListener(perf_listener);
+ delete perf_listener;
+ }
+}
+
+#endif /* USE_LLVM */
extern void * llvm_get_function(const char *funcname);
extern void llvm_dispose_module(LLVMModuleRef mod, const char *funcname);
+extern void llvm_perf_support(LLVMExecutionEngineRef EE);
+extern void llvm_shutdown_perf_support(LLVMExecutionEngineRef EE);
+
#endif /* USE_LLVM */
#endif /* LLVMJIT_H */