module.hpp revision c6db1b3396384186aab5b685fe1fd540e17b3a62
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 28namespace 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 resource_id id; 48 type type; 49 size_t size; 50 clover::compat::vector<char> data; 51 }; 52 53 struct argument { 54 enum type { 55 scalar, 56 constant, 57 global, 58 local, 59 image2d_rd, 60 image2d_wr, 61 image3d_rd, 62 image3d_wr, 63 sampler 64 }; 65 66 type type; 67 size_t size; 68 }; 69 70 struct symbol { 71 clover::compat::vector<char> name; 72 resource_id section; 73 size_t offset; 74 clover::compat::vector<argument> args; 75 }; 76 77 void serialize(compat::ostream &os) const; 78 static module deserialize(compat::istream &is); 79 80 /// Look up a symbol by name. Throws module::noent_error if not 81 /// found. 82 const symbol &sym(compat::string name) const; 83 84 /// Look up a section by type. Throws module::noent_error if not 85 /// found. 86 const section &sec(typename section::type type) const; 87 88 clover::compat::vector<symbol> syms; 89 clover::compat::vector<section> secs; 90 }; 91} 92 93#endif 94