Expression.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Expression.h"
  7. #include <AK/Format.h>
  8. #include <AK/MemoryStream.h>
  9. #include <sys/arch/i386/regs.h>
  10. namespace Debug::Dwarf::Expression {
  11. Value evaluate(ReadonlyBytes bytes, [[maybe_unused]] PtraceRegisters const& regs)
  12. {
  13. InputMemoryStream stream(bytes);
  14. while (!stream.eof()) {
  15. u8 opcode = 0;
  16. stream >> opcode;
  17. switch (static_cast<Operations>(opcode)) {
  18. #if ARCH(I386)
  19. case Operations::RegEbp: {
  20. ssize_t offset = 0;
  21. stream.read_LEB128_signed(offset);
  22. return Value { Type::UnsignedInteger, { regs.ebp + offset } };
  23. }
  24. case Operations::FbReg: {
  25. ssize_t offset = 0;
  26. stream.read_LEB128_signed(offset);
  27. return Value { Type::UnsignedInteger, { regs.ebp + 2 * sizeof(size_t) + offset } };
  28. }
  29. #endif
  30. default:
  31. dbgln("DWARF expr addr: {}", (const void*)bytes.data());
  32. dbgln("unsupported opcode: {}", (u8)opcode);
  33. VERIFY_NOT_REACHED();
  34. }
  35. }
  36. VERIFY_NOT_REACHED();
  37. }
  38. }