Implement basic version of on-device linking.

Basic means no LTO passes running after linking the modules.
diff --git a/bcc.cpp b/bcc.cpp
index 8b41a9e..48734ff 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -110,6 +110,7 @@
 // VMCore
 #include "llvm/Use.h"
 #include "llvm/User.h"
+#include "llvm/Linker.h"
 #include "llvm/Module.h"
 #include "llvm/Function.h"
 #include "llvm/Constant.h"
@@ -2350,7 +2351,7 @@
   }
 
   int loadModule(const char *bitcode, size_t bitcodeSize) {
-    llvm::MemoryBuffer *SB = NULL;
+    llvm::OwningPtr<llvm::MemoryBuffer> SB;
 
     if (bitcode == NULL || bitcodeSize <= 0)
       return 0;
@@ -2358,20 +2359,47 @@
     GlobalInitialization();
 
     // Package input to object MemoryBuffer
-    SB = llvm::MemoryBuffer::getMemBuffer(
-            llvm::StringRef(bitcode, bitcodeSize));
-    if (SB == NULL) {
-      LOGE("Error reading input Bitcode into memory");
-      setError("Error reading input Bitcode into memory");
-      goto on_bcc_load_module_error;
+    SB.reset(llvm::MemoryBuffer::getMemBuffer(
+                llvm::StringRef(bitcode, bitcodeSize)));
+
+    if (SB.get() == NULL) {
+      setError("Error reading input program bitcode into memory");
+      return hasError();
     }
 
     // Read the input Bitcode as a Module
-    mModule = llvm::ParseBitcodeFile(SB, *mContext, &mError);
+    mModule = llvm::ParseBitcodeFile(SB.get(), *mContext, &mError);
+    SB.reset();
+    return hasError();
+  }
 
- on_bcc_load_module_error:
-    if (SB)
-      delete SB;
+  int linkModule(const char *bitcode, size_t bitcodeSize) {
+    llvm::OwningPtr<llvm::MemoryBuffer> SB;
+
+    if (bitcode == NULL || bitcodeSize <= 0)
+      return 0;
+
+    if (mModule == NULL) {
+      setError("No module presents for linking");
+      return hasError();
+    }
+
+    SB.reset(llvm::MemoryBuffer::getMemBuffer(
+                llvm::StringRef(bitcode, bitcodeSize)));
+
+    if (SB.get() == NULL) {
+      setError("Error reading input library bitcode into memory");
+      return hasError();
+    }
+
+    llvm::OwningPtr<llvm::Module> Lib(llvm::ParseBitcodeFile(SB.get(),
+                                                             *mContext,
+                                                             &mError));
+    if (Lib.get() == NULL)
+      return hasError();
+
+    if (llvm::Linker::LinkModules(mModule, Lib.take(), &mError))
+      return hasError();
 
     return hasError();
   }
@@ -2777,6 +2805,13 @@
 }
 
 extern "C"
+void bccLinkBitcode(BCCscript *script,
+                    const BCCchar *bitcode,
+                    BCCint size) {
+  script->compiler.linkModule(bitcode, size);
+}
+
+extern "C"
 void bccCompileScript(BCCscript *script) {
   int result = script->compiler.compile();
   if (result)