mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-12 23:31:38 -07:00
51 lines
1.4 KiB
C
51 lines
1.4 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
////////////////////////////////
|
|
// NOTE(allen): Eval Decode Function
|
|
|
|
internal void
|
|
eval_print_decode_from_bytecode(FILE *out, String8 bytecode){
|
|
U8 *ptr = bytecode.str;
|
|
U8 *opl = bytecode.str + bytecode.size;
|
|
|
|
for (;ptr < opl;){
|
|
// consume opcode
|
|
SYMS_EvalOp op = (SYMS_EvalOp)*ptr;
|
|
if (op >= SYMS_EvalOp_COUNT){
|
|
fprintf(out, "decode error: undefined op code\n");
|
|
goto done;
|
|
}
|
|
U8 ctrlbits = syms_eval_opcode_ctrlbits[op];
|
|
ptr += 1;
|
|
|
|
// decode
|
|
U64 imm = 0;
|
|
U32 decode_size = (ctrlbits >> SYMS_EvalOpCtrlBits_DecodeShft)&SYMS_EvalOpCtrlBits_DecodeMask;
|
|
{
|
|
U8 *next_ptr = ptr + decode_size;
|
|
if (next_ptr > opl){
|
|
fprintf(out, "decode error: expected constant goes past the end of bytecode\n");
|
|
goto done;
|
|
}
|
|
// TODO(allen): to improve this:
|
|
// gaurantee 8 bytes padding after the end of serialized bytecode
|
|
// read 8 bytes and mask
|
|
switch (decode_size){
|
|
case 1: imm = *ptr; break;
|
|
case 2: imm = *(U16*)ptr; break;
|
|
case 4: imm = *(U32*)ptr; break;
|
|
case 8: imm = *(U64*)ptr; break;
|
|
}
|
|
ptr = next_ptr;
|
|
}
|
|
|
|
// op string & control bits
|
|
SYMS_String8 op_string = syms_eval_opcode_strings[op];
|
|
|
|
// print
|
|
fprintf(out, "%.*s 0x%llx\n", str8_varg(op_string), imm);
|
|
}
|
|
done:;
|
|
}
|