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