[Beignet] [PATCH V4] Fix the bug when we pass argument with spaces.

Yang, Rong R rong.r.yang at intel.com
Sun Jan 24 17:39:01 PST 2016


LGTM, pushed, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> junyan.he at inbox.com
> Sent: Thursday, January 21, 2016 18:44
> To: beignet at lists.freedesktop.org
> Subject: [Beignet] [PATCH V4] Fix the bug when we pass argument with
> spaces.
> 
> From: Junyan He <junyan.he at linux.intel.com>
> 
> We failed to handle -I "/XX X/YY YY/" like path or -DAAA=BBB"CC DDD"EEE
> like defines from the build option.
> We need to consider the spaces here and pass it correctly to Clang.
> 
> V4:
>   Fix a minor mistake.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/backend/program.cpp |   73
> +++++++++++++++++++++++++++++++++++----
>  1 file changed, 67 insertions(+), 6 deletions(-)
> 
> diff --git a/backend/src/backend/program.cpp
> b/backend/src/backend/program.cpp index f886d03..e3df36b 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -770,9 +770,9 @@ namespace gbe {
>      bool useDefaultCLCVersion = true;
> 
>      if (options) {
> -      char *str = (char *)malloc(sizeof(char) * (strlen(options) + 1));
> -      memcpy(str, options, strlen(options) + 1);
> -      std::string optionStr(str);
> +      char *c_str = (char *)malloc(sizeof(char) * (strlen(options) + 1));
> +      memcpy(c_str, options, strlen(options) + 1);
> +      std::string optionStr(c_str);
>        const std::string unsupportedOptions("-cl-denorms-are-zero, -cl-strict-
> aliasing, -cl-opt-disable,"
>                         "-cl-no-signed-zeros, -cl-fp32-correctly-rounded-divide-sqrt");
> 
> @@ -781,14 +781,75 @@ namespace gbe {
>        while (end != std::string::npos) {
>          end = optionStr.find(' ', start);
>          std::string str = optionStr.substr(start, end - start);
> -        start = end + 1;
> -        if(str.size() == 0)
> +
> +        if(str.size() == 0) {
> +          start = end + 1;
>            continue;
> +        }
> +
> +EXTEND_QUOTE:
> +        /* We need to find the ", if the there are odd number of " within this
> string,
> +           we need to extend the string to the matched " of the last one. */
> +        int quoteNum = 0;
> +        for (size_t i = 0; i < str.size(); i++) {
> +          if (str[i] == '"') {
> +            quoteNum++;
> +          }
> +        }
> +
> +        if (quoteNum % 2) { // Odd number of ", need to extend the string.
> +          /* find the second " */
> +          while (end < optionStr.size() && optionStr[end] != '"')
> +            end++;
> +
> +          if (end == optionStr.size()) {
> +            printf("Warning: Unmatched \" number in build option\n");
> +            free(c_str);
> +            return false;
> +          }
> +
> +          GBE_ASSERT(optionStr[end] == '"');
> +          end++;
> +
> +          if (end < optionStr.size() && optionStr[end] != ' ') {
> +            // "CC AAA"BBDDDD case, need to further extend.
> +            end = optionStr.find(' ', end);
> +            str = optionStr.substr(start, end - start);
> +            goto EXTEND_QUOTE;
> +          } else {
> +            str = optionStr.substr(start, end - start);
> +          }
> +        }
> +        start = end + 1;
> 
>          if(unsupportedOptions.find(str) != std::string::npos) {
>            continue;
>          }
> 
> +        /* if -I, we need to extract "path" to path, no " */
> +        if (clOpt.back() == "-I") {
> +          if (str[0] == '"') {
> +            GBE_ASSERT(str[str.size() - 1] == '"');
> +            if (str.size() > 2) {
> +              clOpt.push_back(str.substr(1, str.size() - 2));
> +            } else {
> +              clOpt.push_back("");
> +            }
> +            continue;
> +          }
> +        }
> +        // The -I"YYYY" like case.
> +        if (str.size() > 4 && str[0] == '-' && str[1] == 'I' && str[2] == '"') {
> +          GBE_ASSERT(str[str.size() - 1] == '"');
> +          clOpt.push_back("-I");
> +          if (str.size() > 4) {
> +            clOpt.push_back(str.substr(3, str.size() - 4));
> +          } else {
> +            clOpt.push_back("");
> +          }
> +          continue;
> +        }
> +
>          if(str.find("-cl-std=") != std::string::npos) {
>            useDefaultCLCVersion = false;
>            if (str == "-cl-std=CL1.1")
> @@ -822,7 +883,7 @@ namespace gbe {
> 
>          clOpt.push_back(str);
>        }
> -      free(str);
> +      free(c_str);
>      }
> 
>      if (useDefaultCLCVersion) {
> --
> 1.7.9.5
> 
> 
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list