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 12 namespace sandbox { 13 14 struct 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