Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: sandbox/linux/seccomp-bpf/codegen_unittest.cc

Issue 565713004: Linux sandbox: Remove CodeGen::JoinInstructions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sandbox/linux/seccomp-bpf/codegen.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sandbox/linux/seccomp-bpf/codegen.h" 5 #include "sandbox/linux/seccomp-bpf/codegen.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <linux/filter.h> 8 #include <linux/filter.h>
9 9
10 #include <set> 10 #include <set>
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 Instruction* ret = codegen->MakeInstruction( 77 Instruction* ret = codegen->MakeInstruction(
78 BPF_RET + BPF_K, 0); 78 BPF_RET + BPF_K, 0);
79 return codegen->MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 42, ret, ret); 79 return codegen->MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 42, ret, ret);
80 } 80 }
81 81
82 Instruction* SampleProgramComplex(CodeGen* codegen, int* flags) { 82 Instruction* SampleProgramComplex(CodeGen* codegen, int* flags) {
83 // Creates a basic BPF program that we'll use to test some of the code: 83 // Creates a basic BPF program that we'll use to test some of the code:
84 // JUMP if eq 42 the $0 else $1 (insn6) 84 // JUMP if eq 42 the $0 else $1 (insn6)
85 // 0: LD 23 (insn5) 85 // 0: LD 23 (insn5)
86 // 1: JUMP if eq 42 then $2 else $4 (insn4) 86 // 1: JUMP if eq 42 then $2 else $4 (insn4)
87 // 2: JUMP to $3 (insn1) 87 // 2: JUMP to $3 (insn2)
88 // 3: LD 42 (insn0) 88 // 3: LD 42 (insn1)
89 // RET 42 (insn2) 89 // RET 42 (insn0)
90 // 4: LD 42 (insn3) 90 // 4: LD 42 (insn3)
91 // RET 42 (insn3+) 91 // RET 42 (insn3+)
92 *flags = HAS_MERGEABLE_TAILS; 92 *flags = HAS_MERGEABLE_TAILS;
93 93
94 Instruction* insn0 = codegen->MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 42); 94 Instruction* insn0 = codegen->MakeInstruction(BPF_RET + BPF_K, 42);
95 SANDBOX_ASSERT(insn0); 95 SANDBOX_ASSERT(insn0);
96 SANDBOX_ASSERT(insn0->code == BPF_LD + BPF_W + BPF_ABS); 96 SANDBOX_ASSERT(insn0->code == BPF_RET + BPF_K);
97 SANDBOX_ASSERT(insn0->k == 42);
98 SANDBOX_ASSERT(insn0->next == NULL); 97 SANDBOX_ASSERT(insn0->next == NULL);
99 98
100 Instruction* insn1 = codegen->MakeInstruction(BPF_JMP + BPF_JA, 0, insn0); 99 Instruction* insn1 =
100 codegen->MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 42, insn0);
101 SANDBOX_ASSERT(insn1); 101 SANDBOX_ASSERT(insn1);
102 SANDBOX_ASSERT(insn1->code == BPF_JMP + BPF_JA); 102 SANDBOX_ASSERT(insn1->code == BPF_LD + BPF_W + BPF_ABS);
103 SANDBOX_ASSERT(insn1->jt_ptr == insn0); 103 SANDBOX_ASSERT(insn1->k == 42);
104 SANDBOX_ASSERT(insn1->next == insn0);
104 105
105 Instruction* insn2 = codegen->MakeInstruction(BPF_RET + BPF_K, 42); 106 Instruction* insn2 = codegen->MakeInstruction(BPF_JMP + BPF_JA, 0, insn1);
106 SANDBOX_ASSERT(insn2); 107 SANDBOX_ASSERT(insn2);
107 SANDBOX_ASSERT(insn2->code == BPF_RET + BPF_K); 108 SANDBOX_ASSERT(insn2->code == BPF_JMP + BPF_JA);
108 SANDBOX_ASSERT(insn2->next == NULL); 109 SANDBOX_ASSERT(insn2->jt_ptr == insn1);
109 110
110 // We explicitly duplicate instructions so that MergeTails() can coalesce 111 // We explicitly duplicate instructions so that MergeTails() can coalesce
111 // them later. 112 // them later.
112 Instruction* insn3 = codegen->MakeInstruction( 113 Instruction* insn3 = codegen->MakeInstruction(
113 BPF_LD + BPF_W + BPF_ABS, 114 BPF_LD + BPF_W + BPF_ABS,
114 42, 115 42,
115 codegen->MakeInstruction(BPF_RET + BPF_K, 42)); 116 codegen->MakeInstruction(BPF_RET + BPF_K, 42));
116 117
117 Instruction* insn4 = 118 Instruction* insn4 =
118 codegen->MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 42, insn1, insn3); 119 codegen->MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 42, insn2, insn3);
119 SANDBOX_ASSERT(insn4); 120 SANDBOX_ASSERT(insn4);
120 SANDBOX_ASSERT(insn4->code == BPF_JMP + BPF_JEQ + BPF_K); 121 SANDBOX_ASSERT(insn4->code == BPF_JMP + BPF_JEQ + BPF_K);
121 SANDBOX_ASSERT(insn4->k == 42); 122 SANDBOX_ASSERT(insn4->k == 42);
122 SANDBOX_ASSERT(insn4->jt_ptr == insn1); 123 SANDBOX_ASSERT(insn4->jt_ptr == insn2);
123 SANDBOX_ASSERT(insn4->jf_ptr == insn3); 124 SANDBOX_ASSERT(insn4->jf_ptr == insn3);
124 125
125 codegen->JoinInstructions(insn0, insn2);
126 SANDBOX_ASSERT(insn0->next == insn2);
127
128 Instruction* insn5 = 126 Instruction* insn5 =
129 codegen->MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 23, insn4); 127 codegen->MakeInstruction(BPF_LD + BPF_W + BPF_ABS, 23, insn4);
130 SANDBOX_ASSERT(insn5); 128 SANDBOX_ASSERT(insn5);
131 SANDBOX_ASSERT(insn5->code == BPF_LD + BPF_W + BPF_ABS); 129 SANDBOX_ASSERT(insn5->code == BPF_LD + BPF_W + BPF_ABS);
132 SANDBOX_ASSERT(insn5->k == 23); 130 SANDBOX_ASSERT(insn5->k == 23);
133 SANDBOX_ASSERT(insn5->next == insn4); 131 SANDBOX_ASSERT(insn5->next == insn4);
134 132
135 // Force a basic block that ends in neither a jump instruction nor a return 133 // Force a basic block that ends in neither a jump instruction nor a return
136 // instruction. It only contains "insn5". This exercises one of the less 134 // instruction. It only contains "insn5". This exercises one of the less
137 // common code paths in the topo-sort algorithm. 135 // common code paths in the topo-sort algorithm.
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 assembly.append(reinterpret_cast<char*>(&insn.k), sizeof(insn.k)); 530 assembly.append(reinterpret_cast<char*>(&insn.k), sizeof(insn.k));
533 } 531 }
534 SANDBOX_ASSERT(source == assembly); 532 SANDBOX_ASSERT(source == assembly);
535 } 533 }
536 534
537 SANDBOX_TEST(CodeGen, All) { 535 SANDBOX_TEST(CodeGen, All) {
538 ForAllPrograms(CompileAndCompare); 536 ForAllPrograms(CompileAndCompare);
539 } 537 }
540 538
541 } // namespace sandbox 539 } // namespace sandbox
OLDNEW
« no previous file with comments | « sandbox/linux/seccomp-bpf/codegen.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698