Have separate prepareSharedObject and prepareObject.

Also, provide option for prepareObject to specify relocation model.

Change-Id: Ia9f51f1a463165d069dc918654e0f55189e7a274
diff --git a/lib/ExecutionEngine/bcc.cpp b/lib/ExecutionEngine/bcc.cpp
index 60cefc4..075d6c1 100644
--- a/lib/ExecutionEngine/bcc.cpp
+++ b/lib/ExecutionEngine/bcc.cpp
@@ -29,6 +29,7 @@
 #include <string>
 
 #include <utils/StopWatch.h>
+#include <llvm/Support/CodeGen.h>
 
 using namespace bcc;
 
@@ -123,11 +124,26 @@
 }
 
 
-extern "C" int bccPrepareSharedObject(BCCScriptRef script,
-                                      char const *cacheDir,
-                                      char const *cacheName,
-                                      unsigned long flags) {
-  return unwrap(script)->prepareSharedObject(cacheDir, cacheName, flags);
+extern "C" int bccPrepareObject(BCCScriptRef script,
+                                char const *cacheDir,
+                                char const *cacheName,
+                                bccRelocModelEnum RelocModel,
+                                unsigned long flags) {
+  BCC_FUNC_LOGGER();
+  llvm::Reloc::Model RM;
+
+  switch (RelocModel) {
+    case bccRelocDefault:      RM = llvm::Reloc::Default;      break;
+    case bccRelocStatic:       RM = llvm::Reloc::Static;       break;
+    case bccRelocPIC:          RM = llvm::Reloc::PIC_;         break;
+    case bccRelocDynamicNoPIC: RM = llvm::Reloc::DynamicNoPIC; break;
+    default: {
+      ALOGE("Unrecognized relocation model for bccPrepareObject!");
+      return BCC_INVALID_VALUE;
+    }
+  }
+
+  return unwrap(script)->prepareObject(cacheDir, cacheName, RM, flags);
 }
 
 
@@ -202,4 +218,3 @@
 #endif
   }
 }
-