// 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 sw_DLL_hpp #define sw_DLL_hpp #include <windows.h> #include <vector> #include <map> namespace sw { class DLL { public: DLL(const char *name, const void *constants = 0, int constSize = 0); ~DLL(); void addFunction(const void *function, const void *entry, int size); void addRelocation(const void *function, const void *address, bool ripRelative); void emit(); private: int pageAlign(int address) // Align to 4 kB virtual page size { return (address + 0xFFF) & -0x1000; } int fileAlign(int address) // Align to 512 byte file sections { return (address + 0x1FF) & -0x200; } char *dllName; IMAGE_DOS_HEADER DOSheader; IMAGE_NT_HEADERS32 COFFheader32; IMAGE_NT_HEADERS64 COFFheader64; IMAGE_SECTION_HEADER textSection; IMAGE_SECTION_HEADER exportsSection; IMAGE_SECTION_HEADER relocSection; IMAGE_SECTION_HEADER constSection; IMAGE_EXPORT_DIRECTORY exportDirectory; struct Function { Function() {}; Function(unsigned int location, const void *function, const void *entry, int size) : location(location), entry(entry), size(size) { buffer = new unsigned char[size]; memcpy(buffer, function, size); } ~Function() { delete[] buffer; } void *buffer; unsigned int location; const void *entry; int size; }; std::vector<const void*> functionOrder; typedef std::map<const void*, Function*> FunctionList; FunctionList functionList; int codeSize; const void *constants; int constSize; struct Relocation { Relocation(unsigned int offset, bool ripRelative) : offset(offset), ripRelative(ripRelative) { } unsigned int offset; bool ripRelative; }; typedef std::map<const void*, std::vector<Relocation> > GlobalRelocations; GlobalRelocations globalRelocations; typedef std::map<unsigned int, std::vector<unsigned short> > PageRelocations; PageRelocations pageRelocations; }; } #endif // sw_DLL_hpp