Index: sandbox/linux/seccomp-bpf/codegen_unittest.cc |
diff --git a/sandbox/linux/seccomp-bpf/codegen_unittest.cc b/sandbox/linux/seccomp-bpf/codegen_unittest.cc |
index 73b0f88423c1039fa4dc1618d35538ca1e83c0f0..8cc61c79bdbb43927a9d7503001c4804f3420cea 100644 |
--- a/sandbox/linux/seccomp-bpf/codegen_unittest.cc |
+++ b/sandbox/linux/seccomp-bpf/codegen_unittest.cc |
@@ -113,13 +113,7 @@ class ProgramTest : public ::testing::Test { |
CodeGen::Addr res = gen_.MakeInstruction(code, k, jt, jf); |
EXPECT_NE(CodeGen::kNullAddr, res); |
- Hash digest; |
- if (code == BPF_JMP + BPF_JA) { |
- // TODO(mdempsky): Disallow use of JA. |
- digest = Lookup(jt); |
- } else { |
- digest = Hash(code, k, Lookup(jt), Lookup(jf)); |
- } |
+ Hash digest(code, k, Lookup(jt), Lookup(jf)); |
auto it = addr_hashes_.insert(std::make_pair(res, digest)); |
EXPECT_EQ(digest, it.first->second); |
@@ -218,12 +212,12 @@ TEST_F(ProgramTest, Complex) { |
// RET 42 (insn3+) |
CodeGen::Addr insn0 = MakeInstruction(BPF_RET + BPF_K, 42); |
CodeGen::Addr insn1 = MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 42, insn0); |
- CodeGen::Addr insn2 = MakeInstruction(BPF_JMP + BPF_JA, 0, insn1); |
+ CodeGen::Addr insn2 = insn1; // Implicit JUMP |
- // We explicitly duplicate instructions so that MergeTails() can coalesce |
- // them later. |
+ // We explicitly duplicate instructions to check that CodeGen merges them. |
CodeGen::Addr insn3 = MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 42, |
MakeInstruction(BPF_RET + BPF_K, 42)); |
+ EXPECT_EQ(insn2, insn3); |
CodeGen::Addr insn4 = |
MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 42, insn2, insn3); |
@@ -322,5 +316,25 @@ TEST_F(ProgramTest, ConfusingTailsMergeable) { |
RunTest(i0); |
} |
+TEST_F(ProgramTest, InstructionFolding) { |
+ // Check that simple instructions are folded as expected. |
+ CodeGen::Addr a = MakeInstruction(BPF_RET + BPF_K, 0); |
+ EXPECT_EQ(a, MakeInstruction(BPF_RET + BPF_K, 0)); |
+ CodeGen::Addr b = MakeInstruction(BPF_RET + BPF_K, 1); |
+ EXPECT_EQ(a, MakeInstruction(BPF_RET + BPF_K, 0)); |
+ EXPECT_EQ(b, MakeInstruction(BPF_RET + BPF_K, 1)); |
+ EXPECT_EQ(b, MakeInstruction(BPF_RET + BPF_K, 1)); |
+ |
+ // Check that complex sequences are folded too. |
+ CodeGen::Addr c = |
+ MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 0, |
+ MakeInstruction(BPF_JMP + BPF_JSET + BPF_K, 0x100, a, b)); |
+ EXPECT_EQ(c, MakeInstruction( |
+ BPF_LD + BPF_W + BPF_ABS, 0, |
+ MakeInstruction(BPF_JMP + BPF_JSET + BPF_K, 0x100, a, b))); |
+ |
+ RunTest(c); |
+} |
+ |
} // namespace |
rickyz (no longer on Chrome)
2014/11/12 23:43:50
Can you add a test that calls MakeInstruction with
mdempsky
2014/11/18 01:07:30
Done.
|
} // namespace sandbox |