1diff --git a/CMakeLists.txt b/CMakeLists.txt
2index 62b857b..d21c7f4 100644
3--- a/CMakeLists.txt
4+++ b/CMakeLists.txt
5@@ -147,8 +147,8 @@ if (UNIX)
6 list(APPEND AMD_COMGR_PUBLIC_LINKER_OPTIONS -pthread)
7 if (NOT APPLE AND COMGR_BUILD_SHARED_LIBS)
8 configure_file(
9- ${CMAKE_CURRENT_SOURCE_DIR}/src/exportmap.in
10- ${CMAKE_CURRENT_BINARY_DIR}/src/exportmap @ONLY)
11+ src/exportmap.in
12+ src/exportmap @ONLY)
13 list(APPEND AMD_COMGR_PRIVATE_LINKER_OPTIONS
14 "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/src/exportmap")
15 # When building a shared library with -fsanitize=address we can't be
16@@ -175,10 +175,6 @@ endif()
17 # the shared header.
18 list(APPEND AMD_COMGR_PRIVATE_COMPILE_DEFINITIONS AMD_COMGR_EXPORT)
19
20-configure_file(
21- ${CMAKE_CURRENT_SOURCE_DIR}/include/amd_comgr.h.in
22- ${CMAKE_CURRENT_BINARY_DIR}/include/amd_comgr.h @ONLY)
23-
24 include(bc2h)
25 include(opencl_pch)
26 include(DeviceLibs)
27@@ -212,10 +208,14 @@ target_include_directories(amd_comgr
28 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
29 $<INSTALL_INTERFACE:include>)
30
31+configure_file(
32+ include/amd_comgr.h.in
33+ include/amd_comgr.h @ONLY)
34+
35 set(AMD_COMGR_CONFIG_NAME amd_comgr-config.cmake)
36 set(AMD_COMGR_TARGETS_NAME amd_comgr-targets.cmake)
37 set(AMD_COMGR_VERSION_NAME amd_comgr-config-version.cmake)
38-set(AMD_COMGR_PACKAGE_PREFIX ${CMAKE_INSTALL_LIBDIR}/cmake/amd_comgr)
39+set(AMD_COMGR_PACKAGE_PREFIX cmake/amd_comgr)
40
41 # Generate the build-tree package.
42 set(AMD_COMGR_PREFIX_CODE)
43@@ -226,13 +226,13 @@ if (NOT COMGR_BUILD_SHARED_LIBS)
44 endif()
45
46 set(AMD_COMGR_TARGETS_PATH
47- "${CMAKE_CURRENT_BINARY_DIR}/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
48+ "${CMAKE_CURRENT_BINARY_DIR}/lib/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
49 set(AMD_COMGR_VERSION_PATH
50- "${CMAKE_CURRENT_BINARY_DIR}/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_VERSION_NAME}")
51+ "${CMAKE_CURRENT_BINARY_DIR}/lib/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_VERSION_NAME}")
52 export(TARGETS amd_comgr
53- FILE "${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
54+ FILE "lib/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
55 configure_file("cmake/${AMD_COMGR_CONFIG_NAME}.in"
56- "${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_CONFIG_NAME}"
57+ "lib/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_CONFIG_NAME}"
58 @ONLY)
59 write_basic_package_version_file("${AMD_COMGR_VERSION_PATH}"
60 VERSION "${amd_comgr_VERSION}"
61@@ -266,7 +266,7 @@ install(FILES
62 set(AMD_COMGR_PREFIX_CODE "
63 # Derive absolute install prefix from config file path.
64 get_filename_component(AMD_COMGR_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)")
65-string(REGEX REPLACE "/" ";" count "${AMD_COMGR_PACKAGE_PREFIX}")
66+string(REGEX REPLACE "/" ";" count "${CMAKE_INSTALL_LIBDIR}/${AMD_COMGR_PACKAGE_PREFIX}")
67 foreach(p ${count})
68 set(AMD_COMGR_PREFIX_CODE "${AMD_COMGR_PREFIX_CODE}
69 get_filename_component(AMD_COMGR_PREFIX \"\${AMD_COMGR_PREFIX}\" PATH)")
70@@ -278,20 +278,20 @@ if (NOT COMGR_BUILD_SHARED_LIBS)
71 string(APPEND AMD_COMGR_PREFIX_CODE "find_dependency(LLD REQUIRED)\n")
72 endif()
73
74-set(AMD_COMGR_TARGETS_PATH "\${AMD_COMGR_PREFIX}/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
75+set(AMD_COMGR_TARGETS_PATH "\${AMD_COMGR_PREFIX}/${CMAKE_INSTALL_LIBDIR}/${AMD_COMGR_PACKAGE_PREFIX}/${AMD_COMGR_TARGETS_NAME}")
76 configure_file("cmake/${AMD_COMGR_CONFIG_NAME}.in"
77- "${CMAKE_CURRENT_BINARY_DIR}/${AMD_COMGR_CONFIG_NAME}.install"
78+ "${AMD_COMGR_CONFIG_NAME}.install"
79 @ONLY)
80 install(FILES
81 "${CMAKE_CURRENT_BINARY_DIR}/${AMD_COMGR_CONFIG_NAME}.install"
82- DESTINATION "${AMD_COMGR_PACKAGE_PREFIX}"
83+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/${AMD_COMGR_PACKAGE_PREFIX}"
84 RENAME "${AMD_COMGR_CONFIG_NAME}")
85 install(EXPORT amd_comgr_export
86- DESTINATION "${AMD_COMGR_PACKAGE_PREFIX}"
87+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/${AMD_COMGR_PACKAGE_PREFIX}"
88 FILE "${AMD_COMGR_TARGETS_NAME}")
89 install(FILES
90 "${AMD_COMGR_VERSION_PATH}"
91- DESTINATION "${AMD_COMGR_PACKAGE_PREFIX}")
92+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/${AMD_COMGR_PACKAGE_PREFIX}")
93
94 if(TARGET clangFrontendTool)
95 set(CLANG_LIBS
96diff --git a/cmake/DeviceLibs.cmake b/cmake/DeviceLibs.cmake
97index 27e9546..dfe1b57 100644
98--- a/cmake/DeviceLibs.cmake
99+++ b/cmake/DeviceLibs.cmake
100@@ -1,8 +1,7 @@
101 set(INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
102
103 set(GEN_LIBRARY_INC_FILE ${INC_DIR}/libraries.inc)
104-
105-file(WRITE ${GEN_LIBRARY_INC_FILE} "// Automatically generated file; DO NOT EDIT.\n")
106+set(GEN_LIBRARY_DEFS_INC_FILE ${INC_DIR}/libraries_defs.inc)
107
108 # cmake does not provide a way to query targets produced by a project,
109 # so we have to make one up. Ordinarily, individual library target
110@@ -23,6 +22,7 @@ if(NOT AMD_DEVICE_LIBS_TARGETS)
111 message(FATAL_ERROR "Could not find list of device libraries")
112 endif()
113
114+set(TARGETS_INCLUDES "")
115 foreach(AMDGCN_LIB_TARGET ${AMD_DEVICE_LIBS_TARGETS})
116 set(header ${AMDGCN_LIB_TARGET}.inc)
117
118@@ -54,75 +54,52 @@ foreach(AMDGCN_LIB_TARGET ${AMD_DEVICE_LIBS_TARGETS})
119 add_custom_target(${AMDGCN_LIB_TARGET}_header DEPENDS ${INC_DIR}/${header})
120 add_dependencies(amd_comgr ${AMDGCN_LIB_TARGET}_header)
121
122- file(APPEND ${GEN_LIBRARY_INC_FILE} "#include \"${header}\"\n")
123+ list(APPEND TARGETS_INCLUDES "#include \"${header}\"")
124+endforeach()
125+
126+list(JOIN TARGETS_INCLUDES "\n" TARGETS_INCLUDES)
127+file(GENERATE OUTPUT ${GEN_LIBRARY_INC_FILE} CONTENT "${TARGETS_INCLUDES}")
128+
129+foreach(OPENCL_VERSION 1.2 2.0)
130+ string(REPLACE . _ OPENCL_UNDERSCORE_VERSION ${OPENCL_VERSION})
131+ add_custom_command(OUTPUT ${INC_DIR}/opencl${OPENCL_VERSION}-c.inc
132+ COMMAND bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl${OPENCL_VERSION}-c.pch
133+ ${INC_DIR}/opencl${OPENCL_VERSION}-c.inc
134+ opencl${OPENCL_UNDERSCORE_VERSION}_c
135+ DEPENDS bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl${OPENCL_VERSION}-c.pch
136+ COMMENT "Generating opencl${OPENCL_VERSION}-c.inc"
137+ )
138+ set_property(DIRECTORY APPEND PROPERTY
139+ ADDITIONAL_MAKE_CLEAN_FILES ${INC_DIR}/opencl${OPENCL_VERSION}-c.inc)
140+ add_custom_target(opencl${OPENCL_VERSION}-c.inc_target DEPENDS ${INC_DIR}/opencl${OPENCL_VERSION}-c.inc)
141+ add_dependencies(amd_comgr opencl${OPENCL_VERSION}-c.inc_target)
142 endforeach()
143
144-add_custom_command(OUTPUT ${INC_DIR}/opencl1.2-c.inc
145- COMMAND bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.pch
146- ${INC_DIR}/opencl1.2-c.inc
147- opencl1_2_c
148- DEPENDS bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.pch
149- COMMENT "Generating opencl1.2-c.inc"
150-)
151-set_property(DIRECTORY APPEND PROPERTY
152- ADDITIONAL_MAKE_CLEAN_FILES ${INC_DIR}/opencl1.2-c.inc)
153-add_custom_target(opencl1.2-c.inc_target DEPENDS ${INC_DIR}/opencl1.2-c.inc)
154-add_dependencies(amd_comgr opencl1.2-c.inc_target)
155-file(APPEND ${GEN_LIBRARY_INC_FILE} "#include \"opencl1.2-c.inc\"\n")
156-
157-add_custom_command(OUTPUT ${INC_DIR}/opencl2.0-c.inc
158- COMMAND bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.pch
159- ${INC_DIR}/opencl2.0-c.inc
160- opencl2_0_c
161- DEPENDS bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.pch
162- COMMENT "Generating opencl2.0-c.inc"
163-)
164-set_property(DIRECTORY APPEND PROPERTY
165- ADDITIONAL_MAKE_CLEAN_FILES ${INC_DIR}/opencl2.0-c.inc)
166-add_custom_target(opencl2.0-c.inc_target DEPENDS ${INC_DIR}/opencl2.0-c.inc)
167-add_dependencies(amd_comgr opencl2.0-c.inc_target)
168-file(APPEND ${GEN_LIBRARY_INC_FILE} "#include \"opencl2.0-c.inc\"\n")
169-
170-# Generate function to select libraries for a given GFXIP number.
171-file(APPEND ${GEN_LIBRARY_INC_FILE} "#include \"llvm/ADT/StringRef.h\"\n")
172-file(APPEND ${GEN_LIBRARY_INC_FILE}
173- "static std::tuple<const char*, const void*, size_t> get_oclc_isa_version(llvm::StringRef gfxip) {")
174+set(TARGETS_DEFS "")
175+list(APPEND TARGETS_DEFS "#ifndef AMD_DEVICE_LIBS_TARGET\n#define AMD_DEVICE_LIBS_TARGET(t)\n#endif")
176+list(APPEND TARGETS_DEFS "#ifndef AMD_DEVICE_LIBS_GFXIP\n#define AMD_DEVICE_LIBS_GFXIP(t, g)\n#endif")
177+list(APPEND TARGETS_DEFS "#ifndef AMD_DEVICE_LIBS_FUNCTION\n#define AMD_DEVICE_LIBS_FUNCTION(t, f)\n#endif")
178+list(APPEND TARGETS_DEFS "")
179 foreach(AMDGCN_LIB_TARGET ${AMD_DEVICE_LIBS_TARGETS})
180+ list(APPEND TARGETS_DEFS "AMD_DEVICE_LIBS_TARGET(${AMDGCN_LIB_TARGET})")
181+ # Generate function to select libraries for a given GFXIP number.
182 if (${AMDGCN_LIB_TARGET} MATCHES "^oclc_isa_version_.+$")
183 string(REGEX REPLACE "^oclc_isa_version_(.+)$" "\\1" gfxip ${AMDGCN_LIB_TARGET})
184- file(APPEND ${GEN_LIBRARY_INC_FILE}
185- "if (gfxip == \"${gfxip}\") return std::make_tuple(\"${AMDGCN_LIB_TARGET}.bc\", ${AMDGCN_LIB_TARGET}_lib, ${AMDGCN_LIB_TARGET}_lib_size);")
186+ list(APPEND TARGETS_DEFS "AMD_DEVICE_LIBS_GFXIP(${AMDGCN_LIB_TARGET}, \"${gfxip}\")")
187 endif()
188-endforeach()
189-file(APPEND ${GEN_LIBRARY_INC_FILE}
190- "return std::make_tuple(nullptr, nullptr, 0); }")
191-
192-# Generate function to select libraries for given feature.
193-foreach(AMDGCN_LIB_TARGET ${AMD_DEVICE_LIBS_TARGETS})
194+ # Generate function to select libraries for given feature.
195 if (${AMDGCN_LIB_TARGET} MATCHES "^oclc_.*_on$")
196 string(REGEX REPLACE "^oclc_(.*)_on" "\\1" function ${AMDGCN_LIB_TARGET})
197- file(APPEND ${GEN_LIBRARY_INC_FILE}
198- "static std::tuple<const char*, const void*, size_t> get_oclc_${function}(bool on) { \
199- return std::make_tuple( \
200- on ? \"oclc_${function}_on_lib.bc\" : \"oclc_${function}_off_lib.bc\", \
201- on ? oclc_${function}_on_lib : oclc_${function}_off_lib, \
202- on ? oclc_${function}_on_lib_size : oclc_${function}_off_lib_size \
203- ); }")
204+ list(APPEND TARGETS_DEFS "AMD_DEVICE_LIBS_FUNCTION(${AMDGCN_LIB_TARGET}, ${function})")
205 endif()
206 endforeach()
207
208-# Generate function yield all libraries.
209-file(APPEND ${GEN_LIBRARY_INC_FILE} "\n#include \"llvm/ADT/ArrayRef.h\"\n")
210-file(APPEND ${GEN_LIBRARY_INC_FILE}
211- "llvm::ArrayRef<std::tuple<llvm::StringRef, llvm::StringRef>> COMGR::getDeviceLibraries() { \
212- static std::tuple<llvm::StringRef, llvm::StringRef> DeviceLibs[] = {")
213-foreach(AMDGCN_LIB_TARGET ${AMD_DEVICE_LIBS_TARGETS})
214- file(APPEND ${GEN_LIBRARY_INC_FILE}
215- "{\"${AMDGCN_LIB_TARGET}.bc\", llvm::StringRef(reinterpret_cast<const char *>(${AMDGCN_LIB_TARGET}_lib), ${AMDGCN_LIB_TARGET}_lib_size)},")
216-endforeach()
217-file(APPEND ${GEN_LIBRARY_INC_FILE}
218- "}; \
219- return DeviceLibs; \
220- }")
221+list(APPEND TARGETS_DEFS "")
222+list(APPEND TARGETS_DEFS "#undef AMD_DEVICE_LIBS_TARGET")
223+list(APPEND TARGETS_DEFS "#undef AMD_DEVICE_LIBS_GFXIP")
224+list(APPEND TARGETS_DEFS "#undef AMD_DEVICE_LIBS_FUNCTION")
225+
226+list(JOIN TARGETS_DEFS "\n" TARGETS_DEFS)
227+file(GENERATE OUTPUT ${GEN_LIBRARY_DEFS_INC_FILE} CONTENT "${TARGETS_DEFS}")
228
229 include_directories(${INC_DIR})
230diff --git a/cmake/bc2h.cmake b/cmake/bc2h.cmake
231index 146fe2b..9134985 100644
232--- a/cmake/bc2h.cmake
233+++ b/cmake/bc2h.cmake
234@@ -1,40 +1,41 @@
235-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/bc2h.c
236-"#include <stdio.h>\n"
237-"int main(int argc, char **argv){\n"
238-" FILE *ifp, *ofp;\n"
239-" int c, i, l;\n"
240-" if (argc != 4) return 1;\n"
241-" ifp = fopen(argv[1], \"rb\");\n"
242-" if (!ifp) return 1;\n"
243-" i = fseek(ifp, 0, SEEK_END);\n"
244-" if (i < 0) return 1;\n"
245-" l = ftell(ifp);\n"
246-" if (l < 0) return 1;\n"
247-" i = fseek(ifp, 0, SEEK_SET);\n"
248-" if (i < 0) return 1;\n"
249-" ofp = fopen(argv[2], \"wb+\");\n"
250-" if (!ofp) return 1;\n"
251-" fprintf(ofp, \"#define %s_size %d\\n\\n\"\n"
252-" \"#if defined __GNUC__\\n\"\n"
253-" \"__attribute__((aligned (4096)))\\n\"\n"
254-" \"#elif defined _MSC_VER\\n\"\n"
255-" \"__declspec(align(4096))\\n\"\n"
256-" \"#endif\\n\"\n"
257-" \"static const unsigned char %s[%s_size+1] = {\",\n"
258-" argv[3], l,\n"
259-" argv[3], argv[3]);\n"
260-" i = 0;\n"
261-" while ((c = getc(ifp)) != EOF) {\n"
262-" if (0 == (i&7)) fprintf(ofp, \"\\n \");\n"
263-" fprintf(ofp, \" 0x%02x,\", c);\n"
264-" ++i;\n"
265-" }\n"
266-" fprintf(ofp, \" 0x00\\n};\\n\\n\");\n"
267-" fclose(ifp);\n"
268-" fclose(ofp);\n"
269-" return 0;\n"
270-"}\n"
271-)
272+file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/bc2h.c
273+ CONTENT
274+"#include <stdio.h>
275+int main(int argc, char **argv){
276+ FILE *ifp, *ofp;
277+ int c, i, l;
278+ if (argc != 4) return 1;
279+ ifp = fopen(argv[1], \"rb\");
280+ if (!ifp) return 1;
281+ i = fseek(ifp, 0, SEEK_END);
282+ if (i < 0) return 1;
283+ l = ftell(ifp);
284+ if (l < 0) return 1;
285+ i = fseek(ifp, 0, SEEK_SET);
286+ if (i < 0) return 1;
287+ ofp = fopen(argv[2], \"wb+\");
288+ if (!ofp) return 1;
289+ fprintf(ofp, \"#define %s_size %d\\n\\n\"
290+ \"#if defined __GNUC__\\n\"
291+ \"__attribute__((aligned (4096)))\\n\"
292+ \"#elif defined _MSC_VER\\n\"
293+ \"__declspec(align(4096))\\n\"
294+ \"#endif\\n\"
295+ \"static const unsigned char %s[%s_size+1] = {\",
296+ argv[3], l,
297+ argv[3], argv[3]);
298+ i = 0;
299+ while ((c = getc(ifp)) != EOF) {
300+ if (0 == (i&7)) fprintf(ofp, \"\\n \");
301+ fprintf(ofp, \" 0x%02x,\", c);
302+ ++i;
303+ }
304+ fprintf(ofp, \" 0x00\\n};\\n\\n\");
305+ fclose(ifp);
306+ fclose(ofp);
307+ return 0;
308+}
309+")
310
311 add_executable(bc2h ${CMAKE_CURRENT_BINARY_DIR}/bc2h.c)
312 if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
313diff --git a/src/comgr-device-libs.cpp b/src/comgr-device-libs.cpp
314index 4d2b914..80786d1 100644
315--- a/src/comgr-device-libs.cpp
316+++ b/src/comgr-device-libs.cpp
317@@ -35,7 +35,7 @@
318
319 #include "comgr-device-libs.h"
320 #include "comgr.h"
321-#include "libraries.inc"
322+#include "comgr-libraries.h"
323 #include "llvm/ADT/StringSwitch.h"
324 #include <cstdint>
325
326diff --git a/src/comgr-libraries.h b/src/comgr-libraries.h
327new file mode 100644
328index 0000000..3caa0a0
329--- /dev/null
330+++ b/src/comgr-libraries.h
331@@ -0,0 +1,34 @@
332+#include "libraries.inc"
333+#include "opencl1.2-c.inc"
334+#include "opencl2.0-c.inc"
335+#include "llvm/ADT/StringRef.h"
336+#include "llvm/ADT/ArrayRef.h"
337+
338+static std::tuple<const char*, const void*, size_t> get_oclc_isa_version(llvm::StringRef gfxip) {
339+#define AMD_DEVICE_LIBS_GFXIP(target, target_gfxip) \
340+ if (gfxip == target_gfxip) return std::make_tuple(#target ".bc", target##_lib, target##_lib_size);
341+#include "libraries_defs.inc"
342+
343+ return std::make_tuple(nullptr, nullptr, 0);
344+}
345+
346+#define AMD_DEVICE_LIBS_FUNCTION(target, function) \
347+ static std::tuple<const char*, const void*, size_t> get_oclc_##function(bool on) { \
348+ return std::make_tuple( \
349+ on ? "oclc_" #function "_on_lib.bc" : "oclc_" #function "_off_lib.bc", \
350+ on ? oclc_##function##_on_lib : oclc_##function##_off_lib, \
351+ on ? oclc_##function##_on_lib_size : oclc_##function##_off_lib_size \
352+ ); \
353+ }
354+#include "libraries_defs.inc"
355+
356+llvm::ArrayRef<std::tuple<llvm::StringRef, llvm::StringRef>> COMGR::getDeviceLibraries() {
357+ static std::tuple<llvm::StringRef, llvm::StringRef> DeviceLibs[] = {
358+#define AMD_DEVICE_LIBS_TARGET(target) \
359+ {#target ".bc", llvm::StringRef(reinterpret_cast<const char *>(target##_lib), target##_lib_size)},
360+#include "libraries_defs.inc"
361+ };
362+ return DeviceLibs;
363+}
364+
365+