mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-25 05:04:58 -07:00
initial upload
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
// 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:;
|
||||
}
|
||||
Reference in New Issue
Block a user