Add APIs to get symbol size and symbol name list. BUG=6841435.

Change-Id: I4ed2af9fcfed1086f48830f9f041299fd037f436
diff --git a/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp b/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
index 86e6efd..4525daa 100644
--- a/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
+++ b/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
@@ -104,7 +104,7 @@
     return NULL;
   }
 
-  ELFSymbol<32> *symbol = mSymTab->getByName(pName);
+  const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
   if (symbol == NULL) {
     ALOGV("Request symbol '%s' is not found in the object!", pName);
     return NULL;
@@ -114,6 +114,62 @@
                             /* autoAlloc */false);
 }
 
+size_t ELFObjectLoaderImpl::getSymbolSize(const char *pName) const {
+  if (mSymTab == NULL) {
+    return 0;
+  }
+
+  const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
+
+  if (symbol == NULL) {
+    ALOGV("Request symbol '%s' is not found in the object!", pName);
+    return 0;
+  }
+
+  return static_cast<size_t>(symbol->getSize());
+
+}
+
+bool
+ELFObjectLoaderImpl::getSymbolNameList(android::Vector<const char *>& pNameList,
+                                       ObjectLoader::SymbolType pType) const {
+  if (mSymTab == NULL) {
+    return false;
+  }
+
+  unsigned elf_type;
+  switch (pType) {
+    case ObjectLoader::kFunctionType: {
+      elf_type = llvm::ELF::STT_FUNC;
+      break;
+    }
+    case ObjectLoader::kUnknownType: {
+      break;
+    }
+    default: {
+      assert(false && "Invalid symbol type given!");
+      return false;
+    }
+  }
+
+  for (size_t i = 0, e = mSymTab->size(); i != e; i++) {
+    ELFSymbol<32> *symbol = (*mSymTab)[i];
+    if (symbol == NULL) {
+      continue;
+    }
+
+    if ((pType == ObjectLoader::kUnknownType) ||
+        (symbol->getType() == elf_type)) {
+      const char *symbol_name = symbol->getName();
+      if (symbol_name != NULL) {
+        pNameList.push_back(symbol_name);
+      }
+    }
+  }
+
+  return true;
+}
+
 ELFObjectLoaderImpl::~ELFObjectLoaderImpl() {
   delete mObject;
   return;