[Beignet] [PATCH] GBE: fix relocatable issue for pch file.

Song, Ruiling ruiling.song at intel.com
Tue Nov 11 00:02:42 PST 2014


LGTM

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Tuesday, November 11, 2014 2:00 PM
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH] GBE: fix relocatable issue for pch file.
> 
> When we use pch file, we need to provide the orignal header files.
> Otherwise, clang may complain errors. Clang provide a compile option
> --relocatable-pch to enable pch/header files relocation. We have to use this
> option when we want to install the header files/pch file into system diretory.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/CMakeLists.txt        | 20 ++++++------
>  backend/src/libocl/CMakeLists.txt | 64
> ++++++++++++++++++++++-----------------
>  2 files changed, 47 insertions(+), 37 deletions(-)
> 
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt index
> dacc3a1..b4555f1 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -1,21 +1,21 @@
>  set (OCL_BITCODE_BIN "${BEIGNET_INSTALL_DIR}beignet.bc")
> -set (OCL_HEADER_DIR "${CMAKE_INSTALL_PREFIX}/include/CL/ocl/")
> +set (OCL_HEADER_DIR "${BEIGNET_INSTALL_DIR}/include")
>  set (OCL_PCH_OBJECT "${BEIGNET_INSTALL_DIR}beignet.pch")
>  set (GBE_OBJECT_DIR "${BEIGNET_INSTALL_DIR}/libgbe.so")
>  set (INTERP_OBJECT_DIR "${BEIGNET_INSTALL_DIR}/libgbeinterp.so")
> 
> -set (LOCAL_GBE_OBJECT_DIR
> "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so" PARENT_SCOPE) -set
> (LOCAL_OCL_BITCODE_BIN
> "${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.bc" PARENT_SCOPE)
> -set (LOCAL_OCL_HEADER_DIR
> "${CMAKE_CURRENT_BINARY_DIR}/libocl/include/" PARENT_SCOPE) -set
> (LOCAL_OCL_PCH_OBJECT
> "${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.pch" PARENT_SCOPE)
> -set (LOCAL_INTERP_OBJECT_DIR
> "${CMAKE_CURRENT_BINARY_DIR}/libgbeinterp.so" PARENT_SCOPE)
> -
>  configure_file (
>      "GBEConfig.h.in"
>      "GBEConfig.h"
>  )
> 
>  add_subdirectory(libocl)
> +set (LOCAL_GBE_OBJECT_DIR
> "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so"
> +PARENT_SCOPE) set (LOCAL_INTERP_OBJECT_DIR
> +"${CMAKE_CURRENT_BINARY_DIR}/libgbeinterp.so" PARENT_SCOPE) set
> +(LOCAL_OCL_BITCODE_BIN "${OCL_OBJECT_DIR}/beignet.bc"
> PARENT_SCOPE) set
> +(LOCAL_OCL_HEADER_DIR "${OCL_OBJECT_DIR}/include/" PARENT_SCOPE)
> set
> +(LOCAL_OCL_PCH_OBJECT "${OCL_OBJECT_DIR}/beignet.local.pch"
> +PARENT_SCOPE)
> +
>  add_dependencies(beignet_bitcode libocl)
> 
>  set (GBE_SRC
> @@ -154,6 +154,6 @@ TARGET_LINK_LIBRARIES(gbe_bin_generater gbe)
> 
>  install (TARGETS gbe LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
> install (TARGETS gbeinterp LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
> -install (FILES ${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.bc
> DESTINATION ${BEIGNET_INSTALL_DIR}) -install (FILES
> ${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.pch DESTINATION
> ${BEIGNET_INSTALL_DIR}) -install (DIRECTORY
> ${CMAKE_CURRENT_BINARY_DIR}/libocl/include/ DESTINATION
> ${CMAKE_INSTALL_PREFIX}/include/CL/ocl/ PATTERN *.h)
> +install (FILES ${OCL_OBJECT_DIR}/beignet.bc DESTINATION
> +${BEIGNET_INSTALL_DIR}) install (FILES ${OCL_OBJECT_DIR}/beignet.pch
> +DESTINATION ${BEIGNET_INSTALL_DIR}) install (FILES
> ${OCL_HEADER_FILES}
> +DESTINATION ${BEIGNET_INSTALL_DIR}/include)
> diff --git a/backend/src/libocl/CMakeLists.txt
> b/backend/src/libocl/CMakeLists.txt
> index b0074b3..3e0938a 100644
> --- a/backend/src/libocl/CMakeLists.txt
> +++ b/backend/src/libocl/CMakeLists.txt
> @@ -1,14 +1,14 @@
>  PROJECT(LIBOCL)
> -
> -SET (OCL_HEADER_FILES ${LIBOCL_BINARY_DIR}/include/ocl_defines.h)
> +SET (OCL_OBJECT_DIR ${LIBOCL_BINARY_DIR}/${BEIGNET_INSTALL_DIR})
> +SET (OCL_HEADER_FILES ${OCL_OBJECT_DIR}/include/ocl_defines.h)
>  SET (OCL_SOURCE_FILES "")
> 
> -ADD_CUSTOM_COMMAND(OUTPUT
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h
> -    COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/
> +ADD_CUSTOM_COMMAND(OUTPUT
> ${OCL_OBJECT_DIR}/include/ocl_defines.h
> +    COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/
>      #   COMMAND echo "cat
> ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h \\>
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h"
> -    COMMAND cat ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h >
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h
> +    COMMAND cat ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h >
> + ${OCL_OBJECT_DIR}/include/ocl_defines.h
>      #   COMMAND echo "cat
> ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h \\>\\>
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h"
> -    COMMAND cat ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h >>
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h
> +    COMMAND cat ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h >>
> + ${OCL_OBJECT_DIR}/include/ocl_defines.h
>      DEPENDS ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h
> ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h
>      COMMENT "Generate the header:
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h"
>      )
> @@ -16,13 +16,13 @@ ADD_CUSTOM_COMMAND(OUTPUT
> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h
>  #other module just copy.
>  MACRO(COPY_THE_HEADER _mod)
>      # Use the python script to generate the header files.
> -    STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod})
> +    STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h"
> + output_name ${_mod})
>      STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_SOURCE_DIR}/include/\\1.h" orgin_name ${_mod})
>      SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name})
>      IF(orgin_name STREQUAL output_name)
>      ELSE(orgin_name STREQUAL output_name)
>  	ADD_CUSTOM_COMMAND(OUTPUT ${output_name}
> -	    COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/
> +	    COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/
>  	    #COMMAND echo "cp ${orgin_name} ${output_name}"
>  	    COMMAND cp ${orgin_name} ${output_name}
>  	    DEPENDS ${orgin_name}
> @@ -60,12 +60,12 @@ ENDFOREACH(M)
> 
> 
>  MACRO(GENERATE_HEADER_PY _mod)
> -    STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod})
> +    STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h"
> + output_name ${_mod})
>      STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_SOURCE_DIR}/tmpl/\\1.tmpl.h" tmpl_name ${_mod})
>      STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_SOURCE_DIR}/script/\\1.def" def_name ${_mod})
>      SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name})
>      ADD_CUSTOM_COMMAND(OUTPUT ${output_name}
> -	COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/
> +	COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/
>  	#COMMAND echo "cat ${tmpl_name} \\> ${output_name}"
>  	COMMAND cat ${tmpl_name} > ${output_name}
>  	#COMMAND echo "${LIBOCL_SOURCE_DIR}/script/gen_vector.py
> ${def_name} ${output_name} 1"
> @@ -99,11 +99,11 @@ ENDFOREACH(M)
> 
>  MACRO(GENERATE_HEADER_BASH _mod)
>      # Use the python script to generate the header files.
> -    STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod})
> +    STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h"
> + output_name ${_mod})
>      STRING(REGEX REPLACE "\(o.*\)"
> "${LIBOCL_SOURCE_DIR}/script/\\1.sh" sh_name ${_mod})
>      SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name})
>      ADD_CUSTOM_COMMAND(OUTPUT ${output_name}
> -	COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/
> +	COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/
>  	COMMAND ${sh_name} -p > ${output_name}
>  	DEPENDS ${sh_name}
>  	COMMENT "Generate the header by script: ${output_name}"
> @@ -132,11 +132,11 @@ ENDFOREACH(M)
>  SET (CLANG_OCL_FLAGS -fno-builtin -ffp-contract=off -cl-kernel-arg-info
> -DGEN7_SAMPLER_CLAMP_BORDER_WORKAROUND "-cl-std=CL1.2")
> MACRO(ADD_CL_TO_BC_TARGET _file)
>      # CMake seems can not add pattern rule, use MACRO to replace.
> -    STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl"
> "${LIBOCL_BINARY_DIR}/lib/\\1.bc" output_name ${_file})
> +    STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl"
> + "${OCL_OBJECT_DIR}/\\1.bc" output_name ${_file})
>      ADD_CUSTOM_COMMAND(OUTPUT ${output_name}
> -	COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/
> +	COMMAND mkdir -p ${OCL_OBJECT_DIR}/
>  	#COMMAND echo ${LLVM_INSTALL_DIR}clang -cc1
> ${CLANG_OCL_FLAGS} -I ${LIBOCL_BINARY_DIR}/include/ -emit-llvm-bc
> -triple spir -o ${output_name} -x cl ${_file}
> -	COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -I
> ${LIBOCL_BINARY_DIR}/include/ -emit-llvm-bc -triple spir -o ${output_name}
> -x cl ${_file}
> +	COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -I
> +${OCL_OBJECT_DIR}/include/ -emit-llvm-bc -triple spir -o ${output_name}
> +-x cl ${_file}
>  	DEPENDS ${_file} ${OCL_HEADER_FILES}
>  	COMMENT "Compiling ${_file}"
>  	)
> @@ -148,7 +148,7 @@ FOREACH(f ${OCL_SOURCE_FILES})
>  ENDFOREACH(f)
> 
>  FOREACH(f ${OCL_SOURCE_FILES})
> -    STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl"
> "${LIBOCL_BINARY_DIR}/lib/\\1.bc" bc_name ${f})
> +    STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl"
> + "${OCL_OBJECT_DIR}/\\1.bc" bc_name ${f})
>      SET(OCL_BC_FILES ${OCL_BC_FILES} ${bc_name})
>  ENDFOREACH(f)
> 
> @@ -170,10 +170,10 @@ MACRO(COPY_THE_LL _mod)
>      ENDIF(orgin_name STREQUAL output_name)
>  ENDMACRO(COPY_THE_LL)
>  MACRO(ADD_LL_TO_BC_TARGET M)
> -    STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/lib/\\1.bc"
> output_name ${M})
> +    STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/\\1.bc"
> + output_name ${M})
>      STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/src/\\1.ll"
> srcll_name ${M})
>      ADD_CUSTOM_COMMAND(OUTPUT ${output_name}
> -	COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/
> +	COMMAND mkdir -p ${OCL_OBJECT_DIR}/
>  	#COMMAND echo ${LLVM_INSTALL_DIR}llvm-as -o ${output_name}
> ${srcll_name}
>  	COMMAND ${LLVM_INSTALL_DIR}llvm-as -o ${output_name}
> ${srcll_name}
>  	DEPENDS ${srcll_name}
> @@ -185,24 +185,34 @@ SET (OCL_LL_MODULES ocl_barrier ocl_memcpy
> ocl_memset)  FOREACH(f ${OCL_LL_MODULES})
>      COPY_THE_LL(${f})
>      ADD_LL_TO_BC_TARGET(${f})
> -    STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/lib/\\1.bc"
> bc_name ${f})
> +    STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/\\1.bc"
> bc_name
> + ${f})
>      SET(OCL_BC_FILES ${OCL_BC_FILES} ${bc_name})
>  ENDFOREACH(f)
> 
> 
> -ADD_CUSTOM_COMMAND(OUTPUT ${LIBOCL_BINARY_DIR}/lib/beignet.bc
> +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/beignet.bc
>      COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/
>      #COMMAND echo llvm-link -o ${LIBOCL_BINARY_DIR}/lib/beignet.bc
> ${OCL_BC_FILES}
> -    COMMAND ${LLVM_INSTALL_DIR}llvm-link -o
> ${LIBOCL_BINARY_DIR}/lib/beignet.bc ${OCL_BC_FILES}
> +    COMMAND ${LLVM_INSTALL_DIR}llvm-link -o
> + ${OCL_OBJECT_DIR}/beignet.bc ${OCL_BC_FILES}
>      DEPENDS ${OCL_BC_FILES}
> -    COMMENT "Generate the bitcode file:
> ${LIBOCL_BINARY_DIR}/lib/beignet.bc"
> +    COMMENT "Generate the bitcode file:
> ${OCL_OBJECT_DIR}/beignet.bc"
>      )
> 
> -ADD_CUSTOM_COMMAND(OUTPUT
> ${LIBOCL_BINARY_DIR}/lib/beignet.pch
> -    COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/
> -    COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS}
> -triple spir -I ${LIBOCL_BINARY_DIR}/include/ -emit-pch -x cl
> ${LIBOCL_BINARY_DIR}/include/ocl.h -o
> ${LIBOCL_BINARY_DIR}/lib/beignet.pch
> +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/beignet.pch
> +    COMMAND mkdir -p ${OCL_OBJECT_DIR}
> +    COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS}
> -triple spir -I ${OCL_OBJECT_DIR}/include/ -emit-pch -x cl
> ${OCL_OBJECT_DIR}/include/ocl.h -o ${OCL_OBJECT_DIR}/beignet.pch
> +    DEPENDS ${OCL_HEADER_FILES}
> +    COMMENT "Generate the pch file: ${OCL_OBJECT_DIR}/beignet.pch"
> +    )
> +
> +ADD_CUSTOM_COMMAND(OUTPUT
> ${OCL_OBJECT_DIR}/beignet.local.pch
> +    COMMAND mkdir -p ${OCL_OBJECT_DIR}
> +    COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS}
> -triple
> +spir -I ${OCL_OBJECT_DIR}/include/ --relocatable-pch -emit-pch
> +-isysroot ${LIBOCL_BINARY_DIR} -x cl ${OCL_OBJECT_DIR}/include/ocl.h
> -o
> +${OCL_OBJECT_DIR}/beignet.local.pch
>      DEPENDS ${OCL_HEADER_FILES}
> -    COMMENT "Generate the pch file:
> ${LIBOCL_BINARY_DIR}/lib/beignet.pch"
> +    COMMENT "Generate the pch file:
> ${OCL_OBJECT_DIR}/beignet.local.pch"
>      )
> 
> -add_custom_target(beignet_bitcode ALL DEPENDS
> ${LIBOCL_BINARY_DIR}/lib/beignet.bc
> ${LIBOCL_BINARY_DIR}/lib/beignet.pch)
> +
> +add_custom_target(beignet_bitcode ALL DEPENDS
> +${OCL_OBJECT_DIR}/beignet.bc ${OCL_OBJECT_DIR}/beignet.pch
> +${OCL_OBJECT_DIR}/beignet.local.pch)
> +SET (OCL_OBJECT_DIR ${OCL_OBJECT_DIR} PARENT_SCOPE) SET
> +(OCL_HEADER_FILES ${OCL_HEADER_FILES} PARENT_SCOPE)
> --
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list