[Beignet] [V2 PATCH] Disable the PCH valid check to save a lot of compiling time.
Zhigang Gong
zhigang.gong at linux.intel.com
Tue Dec 10 22:26:58 PST 2013
LGTM, pushed, thanks.
On Wed, Dec 11, 2013 at 11:09:27AM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
>
> In clang, The PCH file will be used as an AST source, so
> the check is strict. The macro define is also checked,
> and if anything is different, the PCH is invalid and
> the build processing will start from scratch.
> Disable Clang's PCH valid check and do the compatible
> check by ourself.
>
> This patch do not solve the clang version problems.
> Because the AST represent is an internal Clang's
> data struct and may change between two clang versions.
> So we will modify this issue later.
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
> backend/src/backend/program.cpp | 92 ++++++++++++++++++++++++++++++++++-------
> 1 file changed, 77 insertions(+), 15 deletions(-)
>
> diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> index 294bb16..fc9b03c 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -569,6 +569,9 @@ namespace gbe {
> clang::LangOptions & lang_opts = Clang.getLangOpts();
> lang_opts.OpenCL = 1;
>
> + clang::PreprocessorOptions prep_opt = Clang.getPreprocessorOpts();
> + prep_opt.DisablePCHValidation = 1;
> +
> //llvm flags need command line parsing to take effect
> if (!Clang.getFrontendOpts().LLVMArgs.empty()) {
> unsigned NumArgs = Clang.getFrontendOpts().LLVMArgs.size();
> @@ -645,32 +648,91 @@ namespace gbe {
> FILE *clFile = fopen(clName.c_str(), "w");
> FATAL_IF(clFile == NULL, "Failed to open temporary file");
>
> - bool usePCH = false;
> + bool usePCH = true;
> + bool findPCH = false;
> +
> + /* Because our header file is so big, we want to avoid recompile the header from
> + scratch. We use the PCH support of Clang to save the huge compiling time.
> + We just use the most general build opt to build the PCH header file, so if
> + user pass new build options here, the PCH can not pass the Clang's compitable
> + validating. Clang will do three kinds of compatible check: Language Option,
> + Target Option and Preprocessing Option. Other kinds of options such as the
> + CodeGen options will not affect the AST result, so no need to check.
> +
> + According to OpenCL 1.1's spec, the CL build options:
> + -D name=definition
> + If the definition is not used in our header, it is compitable
> +
> + -cl-single-precision-constant
> + -cl-denorms-are-zero
> + -cl-std=
> + Language options, really affect.
> +
> + -cl-opt-disable
> + -cl-mad-enable
> + -cl-no-signed-zeros
> + -cl-unsafe-math-optimizations
> + -cl-finite-math-only
> + -cl-fast-relaxed-math
> + CodeGen options, not affect
> +
> + -Werror
> + -w
> + Our header should not block the compiling because of warning.
> +
> + So we just disable the PCH validation of Clang and do the judgement by ourself. */
> +
> + if(options) {
> + char *p;
> + const char * incompatible_opts[] = {
> + "-cl-single-precision-constant",
> +// "-cl-denorms-are-zero",
> + "-cl-std=",
> + };
> + const char * incompatible_defs[] = {
> + "GET_FLOAT_WORD",
> + "__NV_CL_C_VERSION",
> + "GEN7_SAMPLER_CLAMP_BORDER_WORKAROUND"
> + };
> +
> + for (unsigned int i = 0; i < sizeof(incompatible_opts)/sizeof(char *); i++ ) {
> + p = strstr(const_cast<char *>(options), incompatible_opts[i]);
> + if (p) {
> + usePCH = false;
> + break;
> + }
> + }
> +
> + if (usePCH) {
> + for (unsigned int i = 0; i < sizeof(incompatible_defs)/sizeof(char *); i++ ) {
> + p = strstr(const_cast<char *>(options), incompatible_defs[i]);
> + if (p) {
> + usePCH = false;
> + break;
> + }
> + }
> + }
>
> - if(options)
> clOpt += options;
> + }
>
> - if (options || !OCL_USE_PCH) {
> - /* Some building option may cause the prebuild pch header file
> - not compatible with the XXX.cl source. We need rebuild all here.*/
> - usePCH = false;
> - } else {
> - std::string dirs = PCH_OBJECT_DIR;
> - std::istringstream idirs(dirs);
> + std::string dirs = PCH_OBJECT_DIR;
> + std::istringstream idirs(dirs);
>
> - while (getline(idirs, pchHeaderName, ';')) {
> - if(access(pchHeaderName.c_str(), R_OK) == 0) {
> - usePCH = true;
> - break;
> - }
> + while (getline(idirs, pchHeaderName, ';')) {
> + if(access(pchHeaderName.c_str(), R_OK) == 0) {
> + findPCH = true;
> + break;
> }
> }
> - if (usePCH) {
> +
> + if (usePCH && findPCH) {
> clOpt += " -include-pch ";
> clOpt += pchHeaderName;
> clOpt += " ";
> } else
> fwrite(ocl_stdlib_str.c_str(), strlen(ocl_stdlib_str.c_str()), 1, clFile);
> +
> // Write the source to the cl file
> fwrite(source, strlen(source), 1, clFile);
> fclose(clFile);
> --
> 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