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: ~noent_error()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 sectionclover::module::section47 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) { } sectionclover::module::section50 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 argumentclover::module::argument71 argument(enum type type, size_t size) : type(type), size(size) { } argumentclover::module::argument72 argument() : type(scalar), size(0) { } 73 74 type type; 75 size_t size; 76 }; 77 78 struct symbol { symbolclover::module::symbol79 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) { } symbolclover::module::symbol82 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