Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
b426383
fix: jump_check
quvi007 Aug 20, 2024
cd3150a
fix: jump_check header
quvi007 Aug 20, 2024
c206b47
Update prog_check.c
quvi007 Aug 21, 2024
2d01342
add:is_jmp_cond method
quvi007 Aug 21, 2024
f535dcc
add:is_jmp_cond decl
quvi007 Aug 21, 2024
a82f00a
fix:check_jumping logic
quvi007 Aug 21, 2024
1fe24bc
add func sig of is_last_insn()
quvi007 Aug 21, 2024
0f5a5ba
fix: last insn
linsyking Aug 21, 2024
081c545
feat: check prog
linsyking Aug 21, 2024
74c7ffa
fix: users
linsyking Aug 21, 2024
29348db
fixed check_jumping
quvi007 Aug 21, 2024
80c7fb4
fix: LA
linsyking Aug 21, 2024
087493c
fix: helper
linsyking Aug 21, 2024
bf42ed9
fix: jump check
linsyking Aug 22, 2024
684da53
fix: use int to represent bool
linsyking Aug 22, 2024
6af4a2d
Merge branch 'dev' into feat/prog_check
linsyking Aug 22, 2024
ae8b215
Merge pull request #5 from OrderLab/feat/prog_check
linsyking Aug 22, 2024
a214f15
fix: prog check
linsyking Aug 22, 2024
ffdc1b4
Merge branch 'main' into dev
linsyking Aug 22, 2024
d6da9f9
feat: print error instructions
linsyking Aug 22, 2024
c5d82a0
feat: add error messages
linsyking Aug 22, 2024
9d1962e
fix: operands need to include addr_val
linsyking Aug 22, 2024
53a5512
feat: syntax check
linsyking Aug 22, 2024
f734531
feat: relocation
linsyking Aug 22, 2024
7914499
fix: phi
linsyking Aug 22, 2024
0509a92
feat: better error message
linsyking Aug 22, 2024
15dce95
feat: calc pos
linsyking Aug 22, 2024
90a331d
feat: start relocate
linsyking Aug 23, 2024
b7d0fb3
feat: relocate done
linsyking Aug 23, 2024
c8335ae
feat: synthesis
linsyking Aug 23, 2024
55b20a3
fix: synthesis prog free
linsyking Aug 23, 2024
675d333
docs: todo
linsyking Aug 23, 2024
6e3edd5
chore: move docs
linsyking Aug 23, 2024
2272bcb
docs: type
linsyking Aug 23, 2024
4f820c5
docs: type
linsyking Aug 23, 2024
62602a4
feat: change IR
linsyking Aug 23, 2024
a854a98
refactor: IR generation with ALU type
linsyking Aug 23, 2024
1ebc3e9
refactor: constant type
linsyking Aug 23, 2024
996aa0f
feat: error code
linsyking Aug 25, 2024
f15d906
docs: type
linsyking Aug 25, 2024
3d2fcf9
fix: constant
linsyking Aug 26, 2024
f3e04d2
fix: load & store APIs
linsyking Aug 26, 2024
5105a9f
fix: stack offset
linsyking Aug 26, 2024
59434ee
docs: pipeline
linsyking Aug 26, 2024
7dc9d15
chore: format
linsyking Aug 26, 2024
781d241
fix: constant in translate
linsyking Aug 26, 2024
eaa4d6f
feat: error code
linsyking Aug 26, 2024
5ab0840
feat: spill & prog check for alu
linsyking Aug 26, 2024
90a65c4
feat: spill
linsyking Aug 26, 2024
3ccc7b0
feat: assign constant special case
linsyking Aug 26, 2024
c3ffd26
fix: normalize
linsyking Aug 26, 2024
9e90d24
feat: translate loadraw
linsyking Aug 26, 2024
0d01e42
feat: translate
linsyking Aug 27, 2024
04f4541
feat: storeraw translate
linsyking Aug 27, 2024
dcdb72f
feat: translate alu
linsyking Aug 27, 2024
e78a234
feat: translate ret, call, ja
linsyking Aug 27, 2024
a65279d
feat: translate jmp
linsyking Aug 27, 2024
b3a345c
feat: finish translation
linsyking Aug 27, 2024
73a07aa
fix: running pipeline
linsyking Aug 27, 2024
003adbc
feat: debugging cg output
linsyking Aug 27, 2024
5b53ae8
feat: print bpf prog
linsyking Aug 27, 2024
5aa307f
fix: counter pass store err
linsyking Aug 27, 2024
10cb225
fix: load doesn't need vr_type
linsyking Aug 27, 2024
11c0d24
fix: add alu type to insn constructor
linsyking Aug 27, 2024
248d57c
fix: constraint pass
linsyking Aug 27, 2024
bad8148
fix: spilt bb not updating pred
linsyking Aug 27, 2024
5254d88
chore: add init value
linsyking Aug 27, 2024
29a70cc
feat: add print reachable
linsyking Aug 27, 2024
460227d
feat: improve pass
linsyking Aug 27, 2024
ee37f32
feat: pass opt
linsyking Aug 27, 2024
6e35ef4
fix: print rawoff
linsyking Aug 27, 2024
7810615
fix: end bb
linsyking Aug 27, 2024
3151304
fix: spiller
linsyking Aug 27, 2024
4056403
fix: cond jmp
linsyking Aug 28, 2024
53589e4
fix: alu normalize
linsyking Aug 28, 2024
4e4eff9
fix: remove err header
linsyking Aug 28, 2024
798e01e
chore: add clang files
linsyking Aug 28, 2024
4a4bb7b
chore: format using kernel format
linsyking Aug 28, 2024
7df53cb
refactor: bpf_ir main functions
linsyking Aug 28, 2024
98e4af2
fix: ext
linsyking Aug 28, 2024
829c416
fix: return value
linsyking Aug 28, 2024
660105b
refactor: errored array
linsyking Aug 28, 2024
ea9ba58
refactor: array init
linsyking Aug 28, 2024
a20ed7b
fix: free
linsyking Aug 28, 2024
02402fd
refactor: safe malloc
linsyking Aug 28, 2024
1178d64
refactor: all malloc
linsyking Aug 28, 2024
7494609
fix: ret code
linsyking Aug 28, 2024
611d847
chore: build system
linsyking Aug 28, 2024
c6b46d3
feat: gen kernel file script
linsyking Aug 28, 2024
4c98f27
chore: fix file format
linsyking Aug 28, 2024
284dcc7
refactor: single header file
linsyking Aug 28, 2024
064708c
refactor: header
linsyking Aug 28, 2024
8072920
fix: user read
linsyking Aug 28, 2024
2ecbfb8
refactor: PRINT LOG
linsyking Aug 28, 2024
f118d74
fix: no builtin func
linsyking Aug 28, 2024
de1c0cd
fix: headers
linsyking Aug 28, 2024
b27cc8b
fix: kernel side compilation
linsyking Aug 28, 2024
8a1ddf6
fix: kernel sort
linsyking Aug 28, 2024
691f66c
refactor: rename functions
linsyking Aug 28, 2024
2f5eb0c
refactor: rename
linsyking Aug 29, 2024
37e032d
refactor: bpf_ir.c static
linsyking Aug 29, 2024
3cb241d
refactor: prog check static
linsyking Aug 29, 2024
7579b74
refactor: cg
linsyking Aug 29, 2024
9b6077e
refactor: bb
linsyking Aug 29, 2024
bfc17a0
chore: better header file
linsyking Aug 29, 2024
cc2d2e1
refactor: code generation
linsyking Aug 29, 2024
23836e6
refactor: merge some passes to bpf_ir.c
linsyking Aug 29, 2024
22bda5f
refactor: code gen name
linsyking Aug 29, 2024
db4240d
chore: remove unused functions
linsyking Aug 29, 2024
b20f34b
fix: kernel memory alloc
linsyking Aug 29, 2024
6231580
refactor: header
linsyking Aug 29, 2024
2b2c10f
fix: kernel path
linsyking Aug 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
689 changes: 689 additions & 0 deletions IR/.clang-format

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions IR/.clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
Checks: 'clang-diagnostic-*,-*,misc-*,performance-*,clang-analyzer-*,readability-function-size,readability-identifier-naming,readability-redundant-*,readability-mis*,readability-string-compare,readability-non-const-parameter,-clang-analyzer-security*,cppcoreguidelines-avoid-non-const-global-variables,-misc-no-recursion,bugprone-assignment-in-if-condition,bugprone-infinite-loop,bugprone-integer-division,bugprone-suspicious-string-compare,llvm-header-guard,google-global-names-in-headers,cppcoreguidelines-no-malloc,bugprone-use-after-move'
WarningsAsErrors: '*,-misc-non-private-member-variables-in-classes'
CheckOptions:
- key: readability-function-size.LineThreshold
value: '300'
...

17 changes: 2 additions & 15 deletions IR/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,34 +1,21 @@
cmake_minimum_required(VERSION 3.20)
project(bpf_ir)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -O3")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Wstrict-prototypes -O3")

add_executable(
read
read.c
bpf_ir.c
array.c
ir_helper.c
ir_value.c
ir_bb.c
ir_insn.c
passes/phi_pass.c
passes/reachable_bb.c
passes/add_counter_pass.c
passes/add_constraint_pass.c
passes/cut_bb_pass.c
passes/end_bb.c
aux/live_variable.c
aux/prog_check.c
aux/eliminate_ssa.c
aux/conflict_analysis.c
aux/graph_coloring.c
aux/explicit_reg.c
aux/coaleasing.c
aux/spill.c
aux/translate.c
aux/stack_alloc.c
aux/normalize.c
aux/fix_bb_succ.c
aux/relocate.c
ir_code_gen.c
)

Expand Down
13 changes: 13 additions & 0 deletions IR/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
build:
cmake --build build

run: build
build/read tests/${NAME}.o

kernel: build
./scripts/gen_kernel.sh

format:
./scripts/format.sh

.PHONY: build run format
2 changes: 2 additions & 0 deletions IR/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ One opinion, one benefit of designing the raw constraint from is that our runtim

- [x] Register spilling
- [x] Caller-saved/callee-saved register
- [ ] Fix: stack offset should be changed before CG
- [ ] VR type & Constant type (inference)
- [ ] Translation

# TODO
Expand Down
164 changes: 87 additions & 77 deletions IR/array.c
Original file line number Diff line number Diff line change
@@ -1,95 +1,105 @@
#include "array.h"
#include <stdlib.h>
#include <string.h>
#include <linux/bpf_ir.h>

void *__malloc(size_t size) {
void *data = malloc(size);
memset(data, 0, size);
return data;
void bpf_ir_array_init(struct array *res, size_t size)
{
res->data = NULL;
res->max_elem = 0;
res->elem_size = size;
res->num_elem = 0;
}

void __free(void *ptr) {
free(ptr);
struct array bpf_ir_array_null(void)
{
struct array res;
res.data = NULL;
res.max_elem = 0;
res.elem_size = 0;
res.num_elem = 0;
return res;
}

struct array array_init(size_t size) {
struct array res;
res.data = __malloc(size * 4);
res.max_elem = 4;
res.elem_size = size;
res.num_elem = 0;
return res;
int bpf_ir_array_push(struct array *arr, void *data)
{
if (arr->data == NULL) {
SAFE_MALLOC(arr->data, arr->elem_size * 2)
arr->max_elem = 2;
}
if (arr->num_elem >= arr->max_elem) {
// Reallocate
void *new_data = NULL;
SAFE_MALLOC(new_data, arr->max_elem * 2 * arr->elem_size);
memcpy(new_data, arr->data, arr->num_elem * arr->elem_size);
free_proto(arr->data);
arr->data = new_data;
arr->max_elem *= 2;
}
// Push back
memcpy((char *)(arr->data) + arr->elem_size * arr->num_elem, data,
arr->elem_size);
arr->num_elem++;
return 0;
}

struct array array_null() {
struct array res;
res.data = NULL;
res.max_elem = 0;
res.elem_size = 0;
res.num_elem = 0;
return res;
int bpf_ir_array_push_unique(struct array *arr, void *data)
{
for (size_t i = 0; i < arr->num_elem; ++i) {
if (memcmp((char *)(arr->data) + arr->elem_size * i, data,
arr->elem_size) == 0) {
return 0;
}
}
return bpf_ir_array_push(arr, data);
}

void array_push(struct array *arr, void *data) {
if (arr->num_elem >= arr->max_elem) {
// Reallocate
void *new_data = __malloc(arr->max_elem * 2 * arr->elem_size);
memcpy(new_data, arr->data, arr->num_elem * arr->elem_size);
__free(arr->data);
arr->data = new_data;
arr->max_elem *= 2;
}
// Push back
memcpy((char *)(arr->data) + arr->elem_size * arr->num_elem, data, arr->elem_size);
arr->num_elem++;
void bpf_ir_array_erase(struct array *arr, size_t idx)
{
if (idx >= arr->num_elem) {
return;
}
// Shift elements
for (size_t i = idx; i < arr->num_elem - 1; ++i) {
memcpy((char *)(arr->data) + arr->elem_size * i,
(char *)(arr->data) + arr->elem_size * (i + 1),
arr->elem_size);
}
arr->num_elem--;
}

void array_push_unique(struct array *arr, void *data) {
for (size_t i = 0; i < arr->num_elem; ++i) {
if (memcmp((char *)(arr->data) + arr->elem_size * i, data, arr->elem_size) == 0) {
return;
}
}
array_push(arr, data);
int bpf_ir_array_clear(struct array *arr)
{
free_proto(arr->data);
SAFE_MALLOC(arr->data, arr->elem_size * 4);
arr->max_elem = 4;
arr->num_elem = 0;
return 0;
}

void array_erase(struct array *arr, size_t idx) {
if (idx >= arr->num_elem) {
return;
}
// Shift elements
for (size_t i = idx; i < arr->num_elem - 1; ++i) {
memcpy((char *)(arr->data) + arr->elem_size * i,
(char *)(arr->data) + arr->elem_size * (i + 1), arr->elem_size);
}
arr->num_elem--;
int bpf_ir_array_clone(struct array *res, struct array *arr)
{
res->num_elem = arr->num_elem;
res->max_elem = arr->max_elem;
res->elem_size = arr->elem_size;
if (arr->num_elem == 0) {
res->data = NULL;
return 0;
}
SAFE_MALLOC(res->data, arr->max_elem * arr->elem_size);
memcpy(res->data, arr->data, arr->num_elem * arr->elem_size);
return 0;
}

void array_clear(struct array *arr) {
__free(arr->data);
arr->data = __malloc(arr->elem_size * 4);
arr->max_elem = 4;
arr->num_elem = 0;
void bpf_ir_array_free(struct array *arr)
{
if (arr->data) {
free_proto(arr->data);
}
*arr = bpf_ir_array_null();
}

struct array array_clone(struct array *arr) {
struct array res;
res.num_elem = arr->num_elem;
res.max_elem = arr->max_elem;
res.elem_size = arr->elem_size;
res.data = __malloc(arr->max_elem * arr->elem_size);
memcpy(res.data, arr->data, arr->num_elem * arr->elem_size);
return res;
}

void array_free(struct array *arr) {
__free(arr->data);
*arr = array_null();
}

void *array_get_void(struct array *arr, size_t idx) {
if (idx >= arr->num_elem) {
return NULL;
}
return (char *)(arr->data) + arr->elem_size * idx;
void *bpf_ir_array_get_void(struct array *arr, size_t idx)
{
if (idx >= arr->num_elem) {
return NULL;
}
return (char *)(arr->data) + arr->elem_size * idx;
}
30 changes: 0 additions & 30 deletions IR/aux/coaleasing.c

This file was deleted.

Loading