summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/wavm/Include/WAVM/IR/Validate.h
blob: 7da2301bee45f6e3ba1f8cc9f4c9d77e3eac0e92 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#pragma once

#include <memory>
#include <string>
#include "WAVM/IR/IR.h"
#include "WAVM/IR/Operators.h"

namespace WAVM { namespace IR {
	struct FunctionDef;
	struct Module;

	struct ValidationException
	{
		std::string message;
		ValidationException(std::string&& inMessage) : message(inMessage) {}
	};

	struct ModuleValidationState;
	struct CodeValidationStreamImpl;

	struct CodeValidationStream
	{
		typedef void Result;

		WAVM_API CodeValidationStream(ModuleValidationState& moduleValidationState,
									  const FunctionDef& function);
		WAVM_API ~CodeValidationStream();

		WAVM_API void finish();

#define VISIT_OPCODE(_, name, nameString, Imm, ...) WAVM_API void name(Imm imm = {});
		WAVM_ENUM_OPERATORS(VISIT_OPCODE)
#undef VISIT_OPCODE

	private:
		CodeValidationStreamImpl* impl;
	};

	template<typename InnerStream> struct CodeValidationProxyStream
	{
		CodeValidationProxyStream(ModuleValidationState& moduleValidationState,
								  const FunctionDef& function,
								  InnerStream& inInnerStream)
		: codeValidationStream(moduleValidationState, function), innerStream(inInnerStream)
		{
		}

		void finishValidation() { codeValidationStream.finish(); }

#define VISIT_OPCODE(_, name, nameString, Imm, ...)                                                \
	void name(Imm imm = {})                                                                        \
	{                                                                                              \
		codeValidationStream.name(imm);                                                            \
		innerStream.name(imm);                                                                     \
	}
		WAVM_ENUM_OPERATORS(VISIT_OPCODE)
#undef VISIT_OPCODE

	private:
		CodeValidationStream codeValidationStream;
		InnerStream& innerStream;
	};

	WAVM_API std::shared_ptr<ModuleValidationState> createModuleValidationState(
		const Module& module);

	WAVM_API void validateTypes(ModuleValidationState& state);
	WAVM_API void validateImports(ModuleValidationState& state);
	WAVM_API void validateFunctionDeclarations(ModuleValidationState& state);
	WAVM_API void validateTableDefs(ModuleValidationState& state);
	WAVM_API void validateMemoryDefs(ModuleValidationState& state);
	WAVM_API void validateGlobalDefs(ModuleValidationState& state);
	WAVM_API void validateExceptionTypeDefs(ModuleValidationState& state);
	WAVM_API void validateExports(ModuleValidationState& state);
	WAVM_API void validateStartFunction(ModuleValidationState& state);
	WAVM_API void validateElemSegments(ModuleValidationState& state);
	WAVM_API void validateDataSegments(ModuleValidationState& state);

	inline void validatePreCodeSections(ModuleValidationState& state)
	{
		validateTypes(state);
		validateImports(state);
		validateFunctionDeclarations(state);
		validateTableDefs(state);
		validateMemoryDefs(state);
		validateGlobalDefs(state);
		validateExceptionTypeDefs(state);
		validateExports(state);
		validateStartFunction(state);
		validateElemSegments(state);
	}

	WAVM_API void validateCodeSection(ModuleValidationState& state);

	inline void validatePostCodeSections(ModuleValidationState& state)
	{
		validateDataSegments(state);
	}
}}