// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef rr_ExecutableMemory_hpp #define rr_ExecutableMemory_hpp #include #include #include namespace rr { size_t memoryPageSize(); void *allocateExecutable(size_t bytes); // Allocates memory that can be made executable using markExecutable() void markExecutable(void *memory, size_t bytes); void deallocateExecutable(void *memory, size_t bytes); template P unaligned_read(P *address) { P value; memcpy(&value, address, sizeof(P)); return value; } template void unaligned_write(P *address, V value) { static_assert(sizeof(V) == sizeof(P), "value size must match pointee size"); memcpy(address, &value, sizeof(P)); } template class unaligned_ref { public: explicit unaligned_ref(void *ptr) : ptr((P*)ptr) {} template P operator=(V value) { unaligned_write(ptr, value); return value; } operator P() { return unaligned_read((P*)ptr); } private: P *ptr; }; template class unaligned_ptr { template friend class unaligned_ptr; public: unaligned_ptr(P *ptr) : ptr(ptr) {} unaligned_ref

operator*() { return unaligned_ref

(ptr); } template operator S() { return S(ptr); } private: void *ptr; }; } #endif // rr_ExecutableMemory_hpp