Add GetElfImages() method to CompilerLLVM.

(cherry picked from commit 950fc6e6a6b568f0cf511c092bee3d31547dc857)

Change-Id: I1ded5909bae4d87ed05b2c192fcb2362eaa37461
diff --git a/src/compiler.cc b/src/compiler.cc
index c5da125..ba8853a 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -1458,6 +1458,17 @@
                                                             const Method* method) const {
   return compiler_get_method_invoke_stub_addr_(*this, cm, method);
 }
+
+std::vector<ElfImage> Compiler::GetElfImages() const {
+  typedef std::vector<ElfImage> (*GetElfImagesFn)(const Compiler&);
+
+  GetElfImagesFn get_elf_images =
+    FindFunction<GetElfImagesFn>(MakeCompilerSoName(instruction_set_),
+                                 compiler_library_,
+                                 "compilerLLVMGetElfImages");
+
+  return get_elf_images(*this);
+}
 #endif
 
 }  // namespace art
diff --git a/src/compiler.h b/src/compiler.h
index 9834d78..74af408 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -20,12 +20,14 @@
 #include <map>
 #include <set>
 #include <string>
+#include <vector>
 
 #include "compiled_class.h"
 #include "compiled_method.h"
 #include "constants.h"
 #include "dex_cache.h"
 #include "dex_file.h"
+#include "elf_image.h"
 #include "oat_file.h"
 #include "object.h"
 #include "runtime.h"
@@ -145,6 +147,8 @@
 
   const Method::InvokeStub* GetMethodInvokeStubAddr(const CompiledInvokeStub* cm,
                                                     const Method* method) const;
+
+  std::vector<ElfImage> GetElfImages() const;
 #else
   void EnableAutoElfLoader() { }
 
@@ -157,6 +161,10 @@
                                                     const Method*) const {
     return NULL;
   }
+
+  std::vector<ElfImage> GetElfImages() const {
+    return std::vector<ElfImage>();
+  }
 #endif
 
   void SetCompilerContext(void* compiler_context) {
diff --git a/src/compiler_llvm/compiler_llvm.cc b/src/compiler_llvm/compiler_llvm.cc
index 65d53b9..e02c913 100644
--- a/src/compiler_llvm/compiler_llvm.cc
+++ b/src/compiler_llvm/compiler_llvm.cc
@@ -225,6 +225,17 @@
 }
 
 
+std::vector<ElfImage> CompilerLLVM::GetElfImages() const {
+  std::vector<ElfImage> result;
+
+  for (size_t i = 0; i < cunits_.size(); ++i) {
+    result.push_back(cunits_[i]->GetElfImage());
+  }
+
+  return result;
+}
+
+
 CompiledMethod* CompilerLLVM::
 CompileDexMethod(OatCompilationUnit* oat_compilation_unit) {
   MutexLock GUARD(compiler_lock_);
@@ -362,6 +373,10 @@
   return compiler_llvm->GetMethodInvokeStubAddr(cm, method);
 }
 
+extern "C" std::vector<art::ElfImage> compilerLLVMGetElfImages(const art::Compiler& compiler) {
+  return ContextOf(compiler)->GetElfImages();
+}
+
 // Note: Using this function carefully!!! This is temporary solution, we will remove it.
 extern "C" art::MutexLock* compilerLLVMMutexLock(art::Compiler& compiler) {
   return new art::MutexLock(ContextOf(compiler)->compiler_lock_);
diff --git a/src/compiler_llvm/compiler_llvm.h b/src/compiler_llvm/compiler_llvm.h
index f5a282a..90537ff 100644
--- a/src/compiler_llvm/compiler_llvm.h
+++ b/src/compiler_llvm/compiler_llvm.h
@@ -17,6 +17,7 @@
 #ifndef ART_SRC_COMPILER_LLVM_COMPILER_LLVM_H_
 #define ART_SRC_COMPILER_LLVM_COMPILER_LLVM_H_
 
+#include "compiler.h"
 #include "constants.h"
 #include "dex_file.h"
 #include "elf_image.h"
@@ -26,6 +27,8 @@
 #include <UniquePtr.h>
 
 #include <string>
+#include <utility>
+#include <vector>
 
 namespace art {
   class ClassLoader;
@@ -101,6 +104,8 @@
                                 const CompiledInvokeStub* cm,
                                 const Method* method) const;
 
+  std::vector<ElfImage> GetElfImages() const;
+
   CompiledMethod* CompileDexMethod(OatCompilationUnit* oat_compilation_unit);
 
   CompiledMethod* CompileNativeMethod(OatCompilationUnit* oat_compilation_unit);