VapourSynth-llvmexpr
Loading...
Searching...
No Matches
ValidationPass.cpp
Go to the documentation of this file.
1
19
20#include "ValidationPass.hpp"
24#include "BlockAnalysisPass.hpp"
26#include "VarInitPass.hpp"
27
28#include <format>
29
30namespace analysis {
31
32ValidationPass::Result ValidationPass::run(const std::vector<Token>& tokens,
33 AnalysisManager& am) {
34 // Depend on required analysis passes
35 const auto& block_result = am.getResult<BlockAnalysisPass>();
36 const auto& cfg_blocks = block_result.cfg_blocks;
37
38 const auto& var_init_result = am.getResult<VarInitPass>();
39 const auto& var_init_in = var_init_result.var_init_in;
40
41 const auto& static_alloc_result =
43 const auto& static_alloc_in = static_alloc_result.static_alloc_in;
44
45 for (size_t i = 0; i < cfg_blocks.size(); ++i) {
46 std::set<std::string> defined_in_block = var_init_in[i];
47 std::set<std::string> static_in_block = static_alloc_in[i];
48
49 for (int j = cfg_blocks[i].start_token_idx;
50 j < cfg_blocks[i].end_token_idx; ++j) {
51 const auto& token = tokens[j];
52
53 if (token.type == TokenType::VarLoad) {
54 const auto& payload = std::get<TokenPayloadVar>(token.payload);
55 if (!defined_in_block.contains(payload.name)) {
56 throw AnalysisError(
57 std::format("Variable is uninitialized: {}",
58 payload.name),
59 j);
60 }
61 } else if (token.type == TokenType::VarStore) {
62 defined_in_block.insert(
63 std::get<TokenPayloadVar>(token.payload).name);
64 } else if (token.type == TokenType::ArrayLoad ||
65 token.type == TokenType::ArrayStore) {
66 const auto& payload =
67 std::get<TokenPayloadArrayOp>(token.payload);
68 std::string array_name = var_naming::getArrayName(payload.name);
69 if (!defined_in_block.contains(array_name)) {
70 throw AnalysisError(
71 std::format("Array is uninitialized: {}", payload.name),
72 j);
73 }
74 } else if (token.type == TokenType::ArrayAllocStatic ||
75 token.type == TokenType::ArrayAllocDyn) {
76 const auto& payload =
77 std::get<TokenPayloadArrayOp>(token.payload);
78 std::string array_name = var_naming::getArrayName(payload.name);
79
80 if (static_in_block.contains(array_name)) {
81 throw AnalysisError(
82 std::format("Statically allocated array cannot be "
83 "reallocated: {}",
84 payload.name),
85 j);
86 }
87
88 if (token.type == TokenType::ArrayAllocStatic) {
89 static_in_block.insert(array_name);
90 }
91 defined_in_block.insert(array_name);
92 }
93 }
94 }
95
96 return Result{};
97}
98
99} // namespace analysis
@ ArrayAllocStatic
Definition Tokenizer.hpp:51
Result run(const std::vector< Token > &tokens, AnalysisManager &am) override
std::string getArrayName(std::string_view base_name)
Definition VarNaming.hpp:30