15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/linux/seccomp-bpf/instruction.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace sandbox {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BasicBlock {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BasicBlock();
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~BasicBlock();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our implementation of the code generator uses a "Less" operator to
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // identify common sequences of basic blocks. This would normally be
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // really easy to do, but STL requires us to wrap the comparator into
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a class. We begrudgingly add some code here that provides this wrapping.
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  template <class T>
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Less {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Less(const T& data,
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         int (*cmp)(const BasicBlock*, const BasicBlock*, const T& data))
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        : data_(data), cmp_(cmp) {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool operator()(const BasicBlock* a, const BasicBlock* b) const {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cmp_(a, b, data_) < 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const T& data_;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int (*cmp_)(const BasicBlock*, const BasicBlock*, const T&);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Basic blocks are essentially nothing more than a set of instructions.
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<Instruction*> instructions;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In order to compute relative branch offsets we need to keep track of
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // how far our block is away from the very last basic block. The "offset_"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is measured in number of BPF instructions.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int offset;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace sandbox
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SANDBOX_LINUX_SECCOMP_BPF_BASICBLOCK_H__
50