// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
#define SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
#include <vector>
#include "sandbox/linux/seccomp-bpf/instruction.h"
namespace sandbox {
struct BasicBlock {
BasicBlock();
~BasicBlock();
// Our implementation of the code generator uses a "Less" operator to
// identify common sequences of basic blocks. This would normally be
// really easy to do, but STL requires us to wrap the comparator into
// a class. We begrudgingly add some code here that provides this wrapping.
template <class T>
class Less {
public:
Less(const T& data,
int (*cmp)(const BasicBlock*, const BasicBlock*, const T& data))
: data_(data), cmp_(cmp) {}
bool operator()(const BasicBlock* a, const BasicBlock* b) const {
return cmp_(a, b, data_) < 0;
}
private:
const T& data_;
int (*cmp_)(const BasicBlock*, const BasicBlock*, const T&);
};
// Basic blocks are essentially nothing more than a set of instructions.
std::vector<Instruction*> instructions;
// In order to compute relative branch offsets we need to keep track of
// how far our block is away from the very last basic block. The "offset_"
// is measured in number of BPF instructions.
int offset;
};
} // namespace sandbox
#endif // SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__