Index: sandbox/linux/seccomp-bpf/basicblock.h |
diff --git a/sandbox/linux/seccomp-bpf/basicblock.h b/sandbox/linux/seccomp-bpf/basicblock.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d15a372cfea083b7c8bf29398f0a901ff84880b7 |
--- /dev/null |
+++ b/sandbox/linux/seccomp-bpf/basicblock.h |
@@ -0,0 +1,49 @@ |
+// 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__ |