Skip to content

Commit

Permalink
tmp
Browse files Browse the repository at this point in the history
  • Loading branch information
ajlekcahdp4 committed Dec 3, 2024
1 parent 187aab3 commit d614bf4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 75 deletions.
22 changes: 22 additions & 0 deletions lib/lifter/block-ir-builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,27 @@ void save_registers(BasicBlock &block, BasicBlock::iterator pos, reg2vals &rmap,
}
}

void load_registers(BasicBlock &block, BasicBlock::iterator pos, reg2vals &rmap,
StructType &state) {
auto &ctx = block.getContext();
IRBuilder builder(block.getContext());
builder.SetInsertPoint(&block);
auto *state_arg = get_current_state(*block.getParent());
auto *array_type = *state.element_begin();
// GPR array is the first field
auto *const_zero = ConstantInt::get(ctx, APInt(64, 0));
auto *array_ptr = builder.CreateGEP(&state, state_arg,
ArrayRef<Value *>{const_zero}, "GPRS");
for (auto &&[idx, val] : rmap | ranges::views::enumerate) {
auto *array_idx = ConstantInt::get(ctx, APInt(64, idx));
auto &&[reg, addr] = val;
auto *reg_src_addr = builder.CreateInBoundsGEP(
array_type, array_ptr, ArrayRef<Value *>{const_zero, array_idx});
auto *reg_val = builder.CreateLoad(Type::getIntNTy(ctx, 64), reg_src_addr);
builder.CreateStore(reg_val, addr);
}
}

void save_registers_before_return(Function &func, reg2vals &rmap, mbb2bb &m2b,
StructType &state) {
for (auto &block : func) {
Expand Down Expand Up @@ -379,6 +400,7 @@ auto generate_instruction(const MachineInstr &minst, BasicBlock &bb,
callee->getFunctionType(), callee,
ArrayRef<Value *>{get_current_state(*bb.getParent())});
save_registers(bb, call->getIterator(), rmap, state);
load_registers(bb, call->getIterator(), rmap, state);
return call;
}
auto &instr_module = instrs.get(name);
Expand Down
79 changes: 4 additions & 75 deletions test/tools/llvm-bleach/functions.test
Original file line number Diff line number Diff line change
Expand Up @@ -95,81 +95,10 @@
# CHECK-NEXT: %71 = add nsw i64 %61, %39
# CHECK-NEXT: store i64 %71, ptr %X30, align 8
# CHECK-NEXT: %GPRS1 = getelementptr %register_state, ptr %0, i64 0
# CHECK-NEXT: %72 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 0
# CHECK-NEXT: store i64 %3, ptr %72, align 8
# CHECK-NEXT: %73 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 1
# CHECK-NEXT: store i64 %5, ptr %73, align 8
# CHECK-NEXT: %74 = load i64, ptr %X2, align 8
# CHECK-NEXT: %75 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 2
# CHECK-NEXT: store i64 %74, ptr %75, align 8
# CHECK-NEXT: %76 = load i64, ptr %X3, align 8
# CHECK-NEXT: %77 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 3
# CHECK-NEXT: store i64 %76, ptr %77, align 8
# CHECK-NEXT: %78 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 4
# CHECK-NEXT: store i64 %11, ptr %78, align 8
# CHECK-NEXT: %79 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 5
# CHECK-NEXT: store i64 %13, ptr %79, align 8
# CHECK-NEXT: %80 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 6
# CHECK-NEXT: store i64 %15, ptr %80, align 8
# CHECK-NEXT: %81 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 7
# CHECK-NEXT: store i64 %17, ptr %81, align 8
# CHECK-NEXT: %82 = load i64, ptr %X8, align 8
# CHECK-NEXT: %83 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 8
# CHECK-NEXT: store i64 %82, ptr %83, align 8
# CHECK-NEXT: %84 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 9
# CHECK-NEXT: store i64 %21, ptr %84, align 8
# CHECK-NEXT: %85 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 10
# CHECK-NEXT: store i64 %23, ptr %85, align 8
# CHECK-NEXT: %86 = load i64, ptr %X11, align 8
# CHECK-NEXT: %87 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 11
# CHECK-NEXT: store i64 %86, ptr %87, align 8
# CHECK-NEXT: %88 = load i64, ptr %X12, align 8
# CHECK-NEXT: %89 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 12
# CHECK-NEXT: store i64 %88, ptr %89, align 8
# CHECK-NEXT: %90 = load i64, ptr %X13, align 8
# CHECK-NEXT: %91 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 13
# CHECK-NEXT: store i64 %90, ptr %91, align 8
# CHECK-NEXT: %92 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 14
# CHECK-NEXT: store i64 %70, ptr %92, align 8
# CHECK-NEXT: %93 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 15
# CHECK-NEXT: store i64 %33, ptr %93, align 8
# CHECK-NEXT: %94 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 16
# CHECK-NEXT: store i64 %68, ptr %94, align 8
# CHECK-NEXT: %95 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 17
# CHECK-NEXT: store i64 %37, ptr %95, align 8
# CHECK-NEXT: %96 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 18
# CHECK-NEXT: store i64 %39, ptr %96, align 8
# CHECK-NEXT: %97 = load i64, ptr %X19, align 8
# CHECK-NEXT: %98 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 19
# CHECK-NEXT: store i64 %97, ptr %98, align 8
# CHECK-NEXT: %99 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 20
# CHECK-NEXT: store i64 %43, ptr %99, align 8
# CHECK-NEXT: %100 = load i64, ptr %X21, align 8
# CHECK-NEXT: %101 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 21
# CHECK-NEXT: store i64 %100, ptr %101, align 8
# CHECK-NEXT: %102 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 22
# CHECK-NEXT: store i64 %47, ptr %102, align 8
# CHECK-NEXT: %103 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 23
# CHECK-NEXT: store i64 %49, ptr %103, align 8
# CHECK-NEXT: %104 = load i64, ptr %X24, align 8
# CHECK-NEXT: %105 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 24
# CHECK-NEXT: store i64 %104, ptr %105, align 8
# CHECK-NEXT: %106 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 25
# CHECK-NEXT: store i64 %53, ptr %106, align 8
# CHECK-NEXT: %107 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 26
# CHECK-NEXT: store i64 %55, ptr %107, align 8
# CHECK-NEXT: %108 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 27
# CHECK-NEXT: store i64 %57, ptr %108, align 8
# CHECK-NEXT: %109 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 28
# CHECK-NEXT: store i64 %59, ptr %109, align 8
# CHECK-NEXT: %110 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 29
# CHECK-NEXT: store i64 %61, ptr %110, align 8
# CHECK-NEXT: %111 = load i64, ptr %X30, align 8
# CHECK-NEXT: %112 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 30
# CHECK-NEXT: store i64 %111, ptr %112, align 8
# CHECK-NEXT: %113 = getelementptr inbounds [32 x i64], ptr %GPRS1, i64 0, i64 31
# CHECK-NEXT: store i64 %65, ptr %113, align 8
# CHECK-NEXT: call void @fun2(ptr %0)
# CHECK-32: store i64 {{%[0-9]+}}, ptr {{%[0-9]+}}, align 8
# CHECK: call void @fun2(ptr %0)
# CHECK: %GPRS2 = getelementptr %register_state, ptr %0, i64 0
# CHECK-32: store i64 {{%[0-9]+}}, ptr {{%[0-9]+}}, align 8
# CHECK-NEXT: %114 = add nsw i64 %11, %3
# CHECK-NEXT: store i64 %114, ptr %X8, align 8
# CHECK-NEXT: %115 = add nsw i64 %3, %3
Expand Down

0 comments on commit d614bf4

Please sign in to comment.