1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
6#define SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
7
8#include <vector>
9
10#include "sandbox/linux/seccomp-bpf/instruction.h"
11
12namespace sandbox {
13
14struct BasicBlock {
15  BasicBlock();
16  ~BasicBlock();
17
18  // Our implementation of the code generator uses a "Less" operator to
19  // identify common sequences of basic blocks. This would normally be
20  // really easy to do, but STL requires us to wrap the comparator into
21  // a class. We begrudgingly add some code here that provides this wrapping.
22  template <class T>
23  class Less {
24   public:
25    Less(const T& data,
26         int (*cmp)(const BasicBlock*, const BasicBlock*, const T& data))
27        : data_(data), cmp_(cmp) {}
28
29    bool operator()(const BasicBlock* a, const BasicBlock* b) const {
30      return cmp_(a, b, data_) < 0;
31    }
32
33   private:
34    const T& data_;
35    int (*cmp_)(const BasicBlock*, const BasicBlock*, const T&);
36  };
37
38  // Basic blocks are essentially nothing more than a set of instructions.
39  std::vector<Instruction*> instructions;
40
41  // In order to compute relative branch offsets we need to keep track of
42  // how far our block is away from the very last basic block. The "offset_"
43  // is measured in number of BPF instructions.
44  int offset;
45};
46
47}  // namespace sandbox
48
49#endif  // SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
50