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