// 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
