From ecc01413493d1dee253a6e6fea1d926a73cad554 Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Wed, 24 May 2017 06:46:03 +0000 Subject: [PATCH] Header file to help forcibly link GPURuntime Summary: LinkGPURuntime.h defines and creates a structure ForceGPURuntimeLinking which creates an artificial dependency to functions defined in GPUJIT.c. The presence of this structure ensures that these functions are a part of the compiled object/library files including it. Reviewers: grosser, Meinersbur Reviewed By: grosser Subscribers: #polly, pollydev Tags: #polly Differential Revision: https://reviews.llvm.org/D33198 llvm-svn: 303722 --- polly/include/polly/Support/LinkGPURuntime.h | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 polly/include/polly/Support/LinkGPURuntime.h diff --git a/polly/include/polly/Support/LinkGPURuntime.h b/polly/include/polly/Support/LinkGPURuntime.h new file mode 100644 index 0000000000000..85a61890e5890 --- /dev/null +++ b/polly/include/polly/Support/LinkGPURuntime.h @@ -0,0 +1,43 @@ +//===- Support/LinkGPURuntime.h -- Headerfile to help force-link GPURuntime =// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This header helps pull in libGPURuntime.so +// +//===----------------------------------------------------------------------===// +#ifndef POLLY_LINK_GPURUNTIME +#define POLLY_LINK_GPURUNTIME + +extern "C" { +#include "GPURuntime/GPUJIT.h" +} + +namespace polly { +struct ForceGPURuntimeLinking { + ForceGPURuntimeLinking() { + if (std::getenv("bar") != (char *)-1) + return; + // We must reference GPURuntime in such a way that compilers will not + // delete it all as dead code, even with whole program optimization, + // yet is effectively a NO-OP. As the compiler isn't smart enough + // to know that getenv() never returns -1, this will do the job. + polly_initContextCL(); + polly_initContextCUDA(); + polly_getKernel(nullptr, nullptr); + polly_freeKernel(nullptr); + polly_copyFromHostToDevice(nullptr, nullptr, 0); + polly_copyFromDeviceToHost(nullptr, nullptr, 0); + polly_synchronizeDevice(); + polly_launchKernel(nullptr, 0, 0, 0, 0, 0, nullptr); + polly_freeDeviceMemory(nullptr); + polly_freeContext(nullptr); + polly_synchronizeDevice(); + } +} structure; +} // namespace polly +#endif