Home | History | Annotate | Download | only in core
      1 //
      2 // Copyright 2012 Francisco Jerez
      3 //
      4 // Permission is hereby granted, free of charge, to any person obtaining a
      5 // copy of this software and associated documentation files (the "Software"),
      6 // to deal in the Software without restriction, including without limitation
      7 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 // and/or sell copies of the Software, and to permit persons to whom the
      9 // Software is furnished to do so, subject to the following conditions:
     10 //
     11 // The above copyright notice and this permission notice shall be included in
     12 // all copies or substantial portions of the Software.
     13 //
     14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 // THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     18 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
     19 // OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     20 // SOFTWARE.
     21 //
     22 
     23 #ifndef __CORE_MODULE_HPP__
     24 #define __CORE_MODULE_HPP__
     25 
     26 #include "core/compat.hpp"
     27 
     28 namespace clover {
     29    struct module {
     30       class noent_error {
     31       public:
     32          virtual ~noent_error() {}
     33       };
     34 
     35       typedef uint32_t resource_id;
     36       typedef uint32_t size_t;
     37 
     38       struct section {
     39          enum type {
     40             text,
     41             data_constant,
     42             data_global,
     43             data_local,
     44             data_private
     45          };
     46 
     47          section(resource_id id, enum type type, size_t size,
     48                  const clover::compat::vector<char> &data) :
     49                  id(id), type(type), size(size), data(data) { }
     50          section() : id(0), type(text), size(0), data() { }
     51 
     52          resource_id id;
     53          type type;
     54          size_t size;
     55          clover::compat::vector<char> data;
     56       };
     57 
     58       struct argument {
     59          enum type {
     60             scalar,
     61             constant,
     62             global,
     63             local,
     64             image2d_rd,
     65             image2d_wr,
     66             image3d_rd,
     67             image3d_wr,
     68             sampler
     69          };
     70 
     71          argument(enum type type, size_t size) : type(type), size(size) { }
     72          argument() : type(scalar), size(0) { }
     73 
     74          type type;
     75          size_t size;
     76       };
     77 
     78       struct symbol {
     79          symbol(const clover::compat::vector<char> &name, resource_id section,
     80                 size_t offset, const clover::compat::vector<argument> &args) :
     81                 name(name), section(section), offset(offset), args(args) { }
     82          symbol() : name(), section(0), offset(0), args() { }
     83 
     84          clover::compat::vector<char> name;
     85          resource_id section;
     86          size_t offset;
     87          clover::compat::vector<argument> args;
     88       };
     89 
     90       void serialize(compat::ostream &os) const;
     91       static module deserialize(compat::istream &is);
     92 
     93       /// Look up a symbol by name.  Throws module::noent_error if not
     94       /// found.
     95       const symbol &sym(compat::string name) const;
     96 
     97       /// Look up a section by type.  Throws module::noent_error if not
     98       /// found.
     99       const section &sec(typename section::type type) const;
    100 
    101       clover::compat::vector<symbol> syms;
    102       clover::compat::vector<section> secs;
    103    };
    104 }
    105 
    106 #endif
    107