[Beignet] [PATCH V2 1/4] Add the string format support for gbe_bin_generater

Zhigang Gong zhigang.gong at linux.intel.com
Wed Oct 9 22:39:43 PDT 2013


Pushed the whole patchset, thanks.

On Wed, Oct 09, 2013 at 03:55:23PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
> 
> The string format of kernel serializaion will be useful for
> generating the code for internal kernel binary load in.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/gbe_bin_generater.cpp |   47 ++++++++++++++++++++++++++++++++++---
>  1 file changed, 44 insertions(+), 3 deletions(-)
> 
> diff --git a/backend/src/gbe_bin_generater.cpp b/backend/src/gbe_bin_generater.cpp
> index afe86f2..37e61e2 100644
> --- a/backend/src/gbe_bin_generater.cpp
> +++ b/backend/src/gbe_bin_generater.cpp
> @@ -33,6 +33,9 @@
>  #include <deque>
>  #include <vector>
>  #include <algorithm>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
>  #include "backend/program.h"
>  #include "backend/program.hpp"
>  
> @@ -49,6 +52,7 @@ protected:
>      string prog_path;
>      string build_opt;
>      static string bin_path;
> +    static bool str_fmt_out;
>      int fd;
>      int file_len;
>      const char* code;
> @@ -100,7 +104,6 @@ public:
>          return *this;
>      }
>  
> -
>      const char* file_map_open (void) throw (int);
>  
>      const char* get_code (void) {
> @@ -125,6 +128,10 @@ public:
>          print_file();
>      }
>  
> +    static void set_str_fmt_out (bool flag) {
> +        str_fmt_out = flag;
> +    }
> +
>      static int set_bin_path (const char* path) {
>          if (bin_path.size())
>              return 0;
> @@ -138,14 +145,43 @@ public:
>  };
>  
>  string program_build_instance::bin_path;
> +bool program_build_instance::str_fmt_out = false;
>  
>  void program_build_instance::serialize_program(void) throw(int)
>  {
>      ofstream ofs;
>      ostringstream oss;
> +    size_t sz;
>      ofs.open(bin_path, ofstream::out | ofstream::app | ofstream::binary);
>  
> -    size_t sz = gbe_prog->serializeToBin(ofs);
> +    if (str_fmt_out) {
> +        string array_name = "Unkown_name_array";
> +        unsigned long last_slash = bin_path.rfind("/");
> +        unsigned long last_dot = bin_path.rfind(".");
> +
> +        if (last_slash != string::npos &&  last_dot != string::npos)
> +            array_name = bin_path.substr(last_slash + 1, last_dot - 1 - last_slash);
> +
> +        ofs << "char " << array_name << "[] = {" << "\n";
> +
> +        sz = gbe_prog->serializeToBin(oss);
> +
> +        for (size_t i = 0; i < sz; i++) {
> +            unsigned char c = oss.str().c_str()[i];
> +            char asic_str[9];
> +            sprintf(asic_str, "%2.2x", c);
> +            ofs << "0x";
> +            ofs << asic_str << ((i == sz - 1) ? "" : ", ");
> +        }
> +
> +        ofs << "};\n";
> +
> +	string array_size = array_name + "_size";
> +	ofs << "int " << array_size << " = " << sz << ";" << "\n";
> +    } else {
> +        sz = gbe_prog->serializeToBin(ofs);
> +    }
> +
>      ofs.close();
>  
>      if (!sz) {
> @@ -211,7 +247,7 @@ int main (int argc, const char **argv)
>          argv_saved.push_back(string(argv[i]));
>      }
>  
> -    while ( (oc = getopt(argc, (char * const *)argv, "o:p:")) != -1 ) {
> +    while ( (oc = getopt(argc, (char * const *)argv, "o:p:s")) != -1 ) {
>          switch (oc) {
>          case 'p':
>          {
> @@ -245,6 +281,11 @@ int main (int argc, const char **argv)
>              used_index[optind-1] = 1;
>              break;
>  
> +        case 's':
> +            program_build_instance::set_str_fmt_out(true);
> +            used_index[optind-1] = 1;
> +            break;
> +
>          case ':':
>              cout << "Miss the file option argument" << endl;
>              return 1;
> -- 
> 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