ObjectImageCommon.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //===-- ObjectImageCommon.h - Format independent executuable object image -===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file declares a file format independent ObjectImage class.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
  14. #define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
  15. #include "llvm/ExecutionEngine/ObjectBuffer.h"
  16. #include "llvm/ExecutionEngine/ObjectImage.h"
  17. #include "llvm/Object/ObjectFile.h"
  18. #include <memory>
  19. namespace llvm {
  20. namespace object {
  21. class ObjectFile;
  22. }
  23. class ObjectImageCommon : public ObjectImage {
  24. ObjectImageCommon(); // = delete
  25. ObjectImageCommon(const ObjectImageCommon &other); // = delete
  26. void anchor() override;
  27. protected:
  28. std::unique_ptr<object::ObjectFile> ObjFile;
  29. // This form of the constructor allows subclasses to use
  30. // format-specific subclasses of ObjectFile directly
  31. ObjectImageCommon(ObjectBuffer *Input, std::unique_ptr<object::ObjectFile> Obj)
  32. : ObjectImage(Input), // saves Input as Buffer and takes ownership
  33. ObjFile(std::move(Obj))
  34. {
  35. }
  36. public:
  37. ObjectImageCommon(ObjectBuffer* Input)
  38. : ObjectImage(Input) // saves Input as Buffer and takes ownership
  39. {
  40. // FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
  41. // and should probably be checked for failure.
  42. std::unique_ptr<MemoryBuffer> Buf = Buffer->getMemBuffer();
  43. ObjFile = std::move(object::ObjectFile::createObjectFile(Buf).get());
  44. }
  45. ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input)
  46. : ObjectImage(nullptr), ObjFile(std::move(Input)) {}
  47. virtual ~ObjectImageCommon() { }
  48. object::symbol_iterator begin_symbols() const override
  49. { return ObjFile->symbol_begin(); }
  50. object::symbol_iterator end_symbols() const override
  51. { return ObjFile->symbol_end(); }
  52. object::section_iterator begin_sections() const override
  53. { return ObjFile->section_begin(); }
  54. object::section_iterator end_sections() const override
  55. { return ObjFile->section_end(); }
  56. /* Triple::ArchType */ unsigned getArch() const override
  57. { return ObjFile->getArch(); }
  58. StringRef getData() const override { return ObjFile->getData(); }
  59. object::ObjectFile* getObjectFile() const override { return ObjFile.get(); }
  60. // Subclasses can override these methods to update the image with loaded
  61. // addresses for sections and common symbols
  62. void updateSectionAddress(const object::SectionRef &Sec,
  63. uint64_t Addr) override {}
  64. void updateSymbolAddress(const object::SymbolRef &Sym,
  65. uint64_t Addr) override {}
  66. // Subclasses can override these methods to provide JIT debugging support
  67. void registerWithDebugger() override {}
  68. void deregisterWithDebugger() override {}
  69. };
  70. } // end namespace llvm
  71. #endif