[Beignet] [PATCH] Pass user options to clang.

Yang Rong rong.r.yang at intel.com
Tue May 28 20:20:47 PDT 2013


clang do not support all options in opencl.
clang unsupport options:
       -cl-denorms-are-zero, -cl-strict-aliasing
       -cl-no-signed-zeros, -cl-fp32-correctly-rounded-divide-sqrt
all support options, refer to clang/include/clang/Driver/Options.inc
Can ignore these options to avoid warning.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/backend/program.cpp |   27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
index 6816a13..c95fb4a 100644
--- a/backend/src/backend/program.cpp
+++ b/backend/src/backend/program.cpp
@@ -121,11 +121,32 @@ namespace gbe {
     GBE_SAFE_DELETE(program);
   }
 
-  static void buildModuleFromSource(const char* input, const char* output) {
+  static void buildModuleFromSource(const char* input, const char* output, std::string options) {
     // Arguments to pass to the clang frontend
     vector<const char *> args;
+    bool bOpt = true;
+
+    vector<std::string> useless; //hold substrings to avoid c_str free
+    uint32_t start = 0, end = 0;
+    /* clang unsupport options:
+       -cl-denorms-are-zero, -cl-strict-aliasing
+       -cl-no-signed-zeros, -cl-fp32-correctly-rounded-divide-sqrt
+       all support options, refer to clang/include/clang/Driver/Options.inc
+       Maybe can filter these options to avoid warning
+    */
+    while (end != std::string::npos) {
+      end = options.find(' ', start);
+      std::string str = options.substr(start, end - start);
+      if(str.size() == 0)
+        continue;
+      if(str == "-cl-opt-disable") bOpt = false;
+      useless.push_back(str);
+      args.push_back(str.c_str());
+      start = end + 1;
+    }
+
     args.push_back("-emit-llvm");
-    args.push_back("-O3");
+    if(bOpt)  args.push_back("-O3");
     args.push_back("-triple");
     args.push_back("nvptx");
     args.push_back(input);
@@ -206,7 +227,7 @@ namespace gbe {
     fwrite(source, strlen(source), 1, clFile);
     fclose(clFile);
 
-    buildModuleFromSource(clName.c_str(), llName.c_str());
+    buildModuleFromSource(clName.c_str(), llName.c_str(), options ? options : "");
     remove(clName.c_str());
 
     // Now build the program from llvm
-- 
1.7.9.5



More information about the Beignet mailing list