blob: f8cbf500bcd03cf258692791019d3f2194f5114f [file] [log] [blame]
// 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