[Beignet] [PATCH] Implement the %p in the printf

junyan.he at inbox.com junyan.he at inbox.com
Tue Jun 24 08:33:20 PDT 2014


From: Junyan He <junyan.he at linux.intel.com>

Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
 backend/src/ir/printf.cpp               |    3 +++
 backend/src/ir/printf.hpp               |    3 ++-
 backend/src/llvm/llvm_printf_parser.cpp |   21 +++++++++++++++++----
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/backend/src/ir/printf.cpp b/backend/src/ir/printf.cpp
index 68b2ce4..9d60402 100644
--- a/backend/src/ir/printf.cpp
+++ b/backend/src/ir/printf.cpp
@@ -193,6 +193,9 @@ namespace gbe
                       case PRINTF_CONVERSION_a:
                         PRINT_SOMETHING(float, a);
                         break;
+                      case PRINTF_CONVERSION_P:
+                        PRINT_SOMETHING(int, p);
+                        break;
 
                       case PRINTF_CONVERSION_S:
                         pf_str = pf_str + "s";
diff --git a/backend/src/ir/printf.hpp b/backend/src/ir/printf.hpp
index 680b8e6..1aef767 100644
--- a/backend/src/ir/printf.hpp
+++ b/backend/src/ir/printf.hpp
@@ -196,7 +196,8 @@ namespace gbe
           case PRINTF_CONVERSION_U:
           case PRINTF_CONVERSION_X:
           case PRINTF_CONVERSION_x:
-            /* Char will be aligned to sizeof(int) here. */
+          case PRINTF_CONVERSION_P:
+          /* Char will be aligned to sizeof(int) here. */
           case PRINTF_CONVERSION_C:
             return (uint32_t)(sizeof(int) * vec_num);
           case PRINTF_CONVERSION_E:
diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
index ff8e259..74b57ab 100644
--- a/backend/src/llvm/llvm_printf_parser.cpp
+++ b/backend/src/llvm/llvm_printf_parser.cpp
@@ -228,7 +228,7 @@ namespace gbe
         CONVERSION_SPEC_AND_RET('s', S)
         CONVERSION_SPEC_AND_RET('p', P)
 
-        // %% has been handled
+      // %% has been handled
 
       default:
         return -1;
@@ -334,7 +334,8 @@ error:
     static map<CallInst*, PrintfSet::PrintfFmt*> printfs;
     int printf_num;
 
-    PrintfParser(void) : FunctionPass(ID) {
+    PrintfParser(void) : FunctionPass(ID)
+    {
       module = NULL;
       builder = NULL;
       intTy = NULL;
@@ -345,7 +346,8 @@ error:
       printf_num = 0;
     }
 
-    ~PrintfParser(void) {
+    ~PrintfParser(void)
+    {
       for (auto &s : printfs) {
         delete s.second;
         s.second = NULL;
@@ -357,7 +359,8 @@ error:
     bool parseOnePrintfInstruction(CallInst *& call);
     bool generateOneParameterInst(PrintfSlot& slot, Value*& arg, Type*& dst_type, int& sizeof_size);
 
-    virtual const char *getPassName() const {
+    virtual const char *getPassName() const
+    {
       return "Printf Parser";
     }
 
@@ -744,8 +747,18 @@ error:
             slot.state->str = fmt_arg->getAsCString();
             return true;
           }
+          case PRINTF_CONVERSION_P: {
+            arg = builder->CreatePtrToInt(arg, Type::getInt32Ty(module->getContext()));
+            dst_type = arg->getType()->getPointerTo(1);
+            sizeof_size = sizeof(int);
+            return true;
+          }
+          default:
+            return false;
         }
 
+        break;
+
       case Type::VectorTyID: {
         Type* vect_type = arg->getType();
         Type* elt_type = vect_type->getVectorElementType();
-- 
1.7.9.5





More information about the Beignet mailing list