binary_file.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (C) 2024 Xiaomi Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef BINARY_FILE_H_
  6. #define BINARY_FILE_H_
  7. #include "aot_runtime.h"
  8. #include "bh_read_file.h"
  9. #include "common.h"
  10. #include "config.h"
  11. #include "wasm_export.h"
  12. namespace analyzer {
  13. class BinaryFile
  14. {
  15. public:
  16. BinaryFile(const char *file_name);
  17. ~BinaryFile();
  18. Result ReadModule();
  19. virtual Result Scan();
  20. void ANALYZER_PRINTF_FORMAT(2, 3) PrintError(const char *format, ...);
  21. Result UpdateCurrentPos(uint32_t steps);
  22. const char *GetFileName() { return file_name_; }
  23. uint8_t *GetFileData() { return file_data_; }
  24. uint32_t GetFileSize() { return file_size_; }
  25. size_t GetCurrentPos() { return current_pos_; }
  26. wasm_module_t GetModule() { return module_; }
  27. WASMModuleMemConsumption GetMemConsumption() { return mem_conspn_; }
  28. private:
  29. const char *file_name_;
  30. uint8_t *file_data_;
  31. uint32_t file_size_;
  32. size_t current_pos_;
  33. wasm_module_t module_;
  34. WASMModuleMemConsumption mem_conspn_;
  35. };
  36. template<typename T>
  37. Result
  38. ReadT(T *out_value, BinaryFile *file, const char *type_name)
  39. {
  40. if (file == NULL
  41. || file->GetCurrentPos() + sizeof(T) > file->GetFileSize()) {
  42. return Result::Error;
  43. }
  44. #if WAMR_BIG_ENDIAN
  45. uint8_t tmp[sizeof(T)];
  46. memcpy(tmp, file->GetFileData() + file->GetCurrentPos(), sizeof(tmp));
  47. SwapBytesSized(tmp, sizeof(tmp));
  48. memcpy(out_value, tmp, sizeof(T));
  49. #else
  50. memcpy(out_value, file->GetFileData() + file->GetCurrentPos(), sizeof(T));
  51. #endif
  52. file->UpdateCurrentPos(sizeof(T));
  53. return Result::Ok;
  54. }
  55. } // namespace analyzer
  56. #endif