#ifndef wasm_analysis_cfg_h
#define wasm_analysis_cfg_h
#include <iostream>
#include <vector>
#include "wasm.h"
namespace wasm::analysis {
struct CFG;
struct BasicBlock {
using iterator = std::vector<Expression*>::const_iterator;
iterator begin() const { return insts.cbegin(); }
iterator end() const { return insts.cend(); }
size_t size() const { return insts.size(); }
using reverse_iterator = std::vector<Expression*>::const_reverse_iterator;
reverse_iterator rbegin() const { return insts.rbegin(); }
reverse_iterator rend() const { return insts.rend(); }
struct Predecessors;
struct Successors;
Predecessors preds() const;
Successors succs() const;
void print(std::ostream& os, Module* wasm = nullptr, size_t start = 0) const;
Index getIndex() const { return index; }
private:
Index index;
std::vector<Expression*> insts;
std::vector<BasicBlock*> predecessors;
std::vector<BasicBlock*> successors;
friend CFG;
};
struct CFG {
using iterator = std::vector<BasicBlock>::const_iterator;
iterator begin() const { return blocks.cbegin(); }
iterator end() const { return blocks.cend(); }
size_t size() const { return blocks.size(); }
static CFG fromFunction(Function* func);
void print(std::ostream& os, Module* wasm = nullptr) const;
private:
std::vector<BasicBlock> blocks;
friend BasicBlock;
};
}
#include "cfg-impl.h"
#endif