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;
diff --git a/lib/ExecutionEngine/ELFObjectLoaderImpl.h b/lib/ExecutionEngine/ELFObjectLoaderImpl.h
index 37766fb..bc96eb4 100644
--- a/lib/ExecutionEngine/ELFObjectLoaderImpl.h
+++ b/lib/ExecutionEngine/ELFObjectLoaderImpl.h
@@ -45,6 +45,10 @@
 
   virtual void *getSymbolAddress(const char *pName) const;
 
+  virtual size_t getSymbolSize(const char *pName) const;
+
+  virtual bool getSymbolNameList(android::Vector<const char *>& pNameList,
+                                 ObjectLoader::SymbolType pType) const;
   ~ELFObjectLoaderImpl();
 };
 
diff --git a/lib/ExecutionEngine/ObjectLoader.cpp b/lib/ExecutionEngine/ObjectLoader.cpp
index 8ec3dd2..ade11ab 100644
--- a/lib/ExecutionEngine/ObjectLoader.cpp
+++ b/lib/ExecutionEngine/ObjectLoader.cpp
@@ -152,6 +152,15 @@
   return mImpl->getSymbolAddress(pName);
 }
 
+size_t ObjectLoader::getSymbolSize(const char *pName) const {
+  return mImpl->getSymbolSize(pName);
+}
+
+bool ObjectLoader::getSymbolNameList(android::Vector<const char *>& pNameList,
+                                     SymbolType pType) const {
+  return mImpl->getSymbolNameList(pNameList, pType);
+}
+
 ObjectLoader::~ObjectLoader() {
   delete mImpl;
   delete [] reinterpret_cast<uint8_t *>(mDebugImage);
diff --git a/lib/ExecutionEngine/ObjectLoaderImpl.h b/lib/ExecutionEngine/ObjectLoaderImpl.h
index 0e0f2c1..a9de913 100644
--- a/lib/ExecutionEngine/ObjectLoaderImpl.h
+++ b/lib/ExecutionEngine/ObjectLoaderImpl.h
@@ -19,6 +19,11 @@
 
 #include <cstring>
 
+#include "bcc/ExecutionEngine/ObjectLoader.h"
+#include "bcc/Support/Log.h"
+
+#include <utils/Vector.h>
+
 namespace bcc {
 
 class SymbolResolverInterface;
@@ -35,6 +40,11 @@
 
   virtual void *getSymbolAddress(const char *pName) const = 0;
 
+  virtual size_t getSymbolSize(const char *pName) const = 0;
+
+  virtual bool getSymbolNameList(android::Vector<const char *>& pNameList,
+                                 ObjectLoader::SymbolType pType) const = 0;
+
   virtual ~ObjectLoaderImpl() { }
 };