Extract runtime stub and update 2 runtime function

- Extract runtime stub from Runtime.c
- Remove __muldsi3 from Runtime.def.  Since it is declared static by
  llvm compiler-rt, we should not export them.
- Add alias for __aeabi_f2uiz because libgcc (for android) does not
  come with __aeabi_f2uiz.
diff --git a/Android.mk b/Android.mk
index 07cba90..af1685f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -41,6 +41,7 @@
   lib/bcc/ContextManager.cpp \
   lib/bcc/FileHandle.cpp \
   lib/bcc/Runtime.c \
+  lib/bcc/RuntimeStub.c \
   lib/bcc/Script.cpp \
   lib/bcc/ScriptCompiled.cpp \
   lib/bcc/SourceInfo.cpp
diff --git a/lib/bcc/Runtime.c b/lib/bcc/Runtime.c
index 77f79d8..e814361 100644
--- a/lib/bcc/Runtime.c
+++ b/lib/bcc/Runtime.c
@@ -14,79 +14,7 @@
  * limitations under the License.
  */
 
-#include "runtime/lib/absvdi2.c"
-#include "runtime/lib/absvsi2.c"
-#include "runtime/lib/addvdi3.c"
-#include "runtime/lib/addvsi3.c"
-#if !defined(__i386__) && !defined(__SSE2__)
-#   include "runtime/lib/ashldi3.c"
-#endif
-#ifndef ANDROID
-#   include "runtime/lib/ashrdi3.c"
-#endif
-#include "runtime/lib/clzdi2.c"
-#include "runtime/lib/clzsi2.c"
-#include "runtime/lib/cmpdi2.c"
-#include "runtime/lib/ctzdi2.c"
-#include "runtime/lib/ctzsi2.c"
-#ifndef ANDROID // no complex.h
-#   include "runtime/lib/divdc3.c"
-#endif
-#if !defined(__i386__)
-#   include "runtime/lib/divdi3.c"
-#endif
-#ifndef ANDROID // no complex.h
-#   include "runtime/lib/divsc3.c"
-#endif
-#include "runtime/lib/ffsdi2.c"
-#include "runtime/lib/fixdfdi.c"
-#include "runtime/lib/fixsfdi.c"
-#include "runtime/lib/fixunsdfdi.c"
-#include "runtime/lib/fixunsdfsi.c"
-#include "runtime/lib/fixunssfdi.c"
-#include "runtime/lib/fixunssfsi.c"
-#if !defined(__i386__)
-#   include "runtime/lib/floatdidf.c"
-#   include "runtime/lib/floatdisf.c"
-#   include "runtime/lib/floatundidf.c"
-#   include "runtime/lib/floatundisf.c"
-#   include "runtime/lib/moddi3.c"
-#endif
-#if !defined(__i386__) && !defined(__SSE2__)
-#   include "runtime/lib/lshrdi3.c"
-#endif
-#ifndef ANDROID // no complex.h
-#   include "runtime/lib/muldc3.c"
-#endif
-#if !defined(__i386__)
-#   include "runtime/lib/muldi3.c"
-#endif
-#ifndef ANDROID // no complex.h
-#   include "runtime/lib/mulsc3.c"
-#endif
-#include "runtime/lib/mulvdi3.c"
-#include "runtime/lib/mulvsi3.c"
-#include "runtime/lib/negdi2.c"
-#include "runtime/lib/negvdi2.c"
-#include "runtime/lib/negvsi2.c"
-#include "runtime/lib/paritydi2.c"
-#include "runtime/lib/paritysi2.c"
-#include "runtime/lib/popcountdi2.c"
-#include "runtime/lib/popcountsi2.c"
-#include "runtime/lib/powidf2.c"
-#include "runtime/lib/powisf2.c"
-#include "runtime/lib/subvdi3.c"
-#include "runtime/lib/subvsi3.c"
-#include "runtime/lib/ucmpdi2.c"
-#if !defined(__i386__)
-#   include "runtime/lib/udivdi3.c"
-#endif
-#include "runtime/lib/udivsi3.c"
-#include "runtime/lib/udivmoddi4.c"
-#if !defined(__i386__)
-#   include "runtime/lib/umoddi3.c"
-#endif
-#include "runtime/lib/eprintf.c"
+#include "RuntimeStub.h"
 
 #include <string.h>
 #include <stdlib.h>
diff --git a/lib/bcc/Runtime.def b/lib/bcc/Runtime.def
index e77bbf0..a300b5c 100644
--- a/lib/bcc/Runtime.def
+++ b/lib/bcc/Runtime.def
@@ -57,7 +57,7 @@
   DEF_GENERIC_RUNTIME(__aeabi_f2d)
   DEF_GENERIC_RUNTIME(__aeabi_f2iz)
   DEF_GENERIC_RUNTIME(__aeabi_f2lz)
-//DEF_GENERIC_RUNTIME(__aeabi_f2uiz) // TODO: Missing from libgcc.
+  DEF_GENERIC_RUNTIME(__aeabi_f2uiz)
   DEF_GENERIC_RUNTIME(__aeabi_f2ulz)
   DEF_GENERIC_RUNTIME(__aeabi_fadd)
   DEF_GENERIC_RUNTIME(__aeabi_fcmpeq)
@@ -187,7 +187,6 @@
 DEF_GENERIC_OR_VFP_RUNTIME(__muldf3)
 #if !defined(__i386__)
     DEF_LLVM_RUNTIME(__muldi3)
-    DEF_LLVM_RUNTIME(__muldsi3)
 #endif
 
 #ifndef ANDROID // no complex extension
diff --git a/lib/bcc/RuntimeStub.c b/lib/bcc/RuntimeStub.c
new file mode 100644
index 0000000..ee75e1b
--- /dev/null
+++ b/lib/bcc/RuntimeStub.c
@@ -0,0 +1,85 @@
+#include "RuntimeStub.h"
+
+#include "runtime/lib/int_lib.h"
+
+#include "runtime/lib/absvdi2.c"
+#include "runtime/lib/absvsi2.c"
+#include "runtime/lib/addvdi3.c"
+#include "runtime/lib/addvsi3.c"
+#if !defined(__i386__) && !defined(__SSE2__)
+#   include "runtime/lib/ashldi3.c"
+#endif
+#ifndef ANDROID
+#   include "runtime/lib/ashrdi3.c"
+#endif
+#include "runtime/lib/clzdi2.c"
+#include "runtime/lib/clzsi2.c"
+#include "runtime/lib/cmpdi2.c"
+#include "runtime/lib/ctzdi2.c"
+#include "runtime/lib/ctzsi2.c"
+#ifndef ANDROID // no complex.h
+#   include "runtime/lib/divdc3.c"
+#endif
+#if !defined(__i386__)
+#   include "runtime/lib/divdi3.c"
+#endif
+#ifndef ANDROID // no complex.h
+#   include "runtime/lib/divsc3.c"
+#endif
+#include "runtime/lib/ffsdi2.c"
+#include "runtime/lib/fixdfdi.c"
+#include "runtime/lib/fixsfdi.c"
+#include "runtime/lib/fixunsdfdi.c"
+#include "runtime/lib/fixunsdfsi.c"
+#include "runtime/lib/fixunssfdi.c"
+#include "runtime/lib/fixunssfsi.c"
+#if !defined(__i386__)
+#   include "runtime/lib/floatdidf.c"
+#   include "runtime/lib/floatdisf.c"
+#   include "runtime/lib/floatundidf.c"
+#   include "runtime/lib/floatundisf.c"
+#   include "runtime/lib/moddi3.c"
+#endif
+#if !defined(__i386__) && !defined(__SSE2__)
+#   include "runtime/lib/lshrdi3.c"
+#endif
+#ifndef ANDROID // no complex.h
+#   include "runtime/lib/muldc3.c"
+#endif
+#if !defined(__i386__)
+#   include "runtime/lib/muldi3.c"
+#endif
+#ifndef ANDROID // no complex.h
+#   include "runtime/lib/mulsc3.c"
+#endif
+#include "runtime/lib/mulvdi3.c"
+#include "runtime/lib/mulvsi3.c"
+#include "runtime/lib/negdi2.c"
+#include "runtime/lib/negvdi2.c"
+#include "runtime/lib/negvsi2.c"
+#include "runtime/lib/paritydi2.c"
+#include "runtime/lib/paritysi2.c"
+#include "runtime/lib/popcountdi2.c"
+#include "runtime/lib/popcountsi2.c"
+#include "runtime/lib/powidf2.c"
+#include "runtime/lib/powisf2.c"
+#include "runtime/lib/subvdi3.c"
+#include "runtime/lib/subvsi3.c"
+#include "runtime/lib/ucmpdi2.c"
+#if !defined(__i386__)
+#   include "runtime/lib/udivdi3.c"
+#endif
+#include "runtime/lib/udivsi3.c"
+#include "runtime/lib/udivmoddi4.c"
+#if !defined(__i386__)
+#   include "runtime/lib/umoddi3.c"
+#endif
+#include "runtime/lib/eprintf.c"
+
+#if defined(__arm__)
+// NOTE: __aeabi_f2uiz is missing from libgcc which comes with android,
+// so here's the workaround.  Remove this when __aeabi_f2uiz is available
+// from libgcc.
+unsigned int __aeabi_f2uiz(float a)
+  __attribute__((weak, alias("__fixunssfsi")));
+#endif
diff --git a/lib/bcc/RuntimeStub.h b/lib/bcc/RuntimeStub.h
new file mode 100644
index 0000000..01cb998
--- /dev/null
+++ b/lib/bcc/RuntimeStub.h
@@ -0,0 +1,89 @@
+#ifndef BCC_RUNTIME_STUB_H
+#define BCC_RUNTIME_STUB_H
+
+#include "runtime/lib/int_lib.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern di_int __absvdi2(di_int);
+extern si_int __absvsi2(si_int);
+extern di_int __addvdi3(di_int, di_int);
+extern si_int __addvsi3(si_int, si_int);
+#if !defined(__i386__) && !defined(__SSE2__)
+extern di_int __ashldi3(di_int, si_int);
+#endif
+#ifndef ANDROID
+extern di_int __ashrdi3(di_int, si_int);
+#endif
+extern si_int __clzdi2(di_int);
+extern si_int __clzsi2(si_int);
+extern si_int __cmpdi2(di_int, di_int);
+extern si_int __ctzdi2(di_int);
+extern si_int __ctzsi2(si_int);
+#ifndef ANDROID /* no complex.h */
+extern double _Complex __divdc3(double, double, double, double);
+#endif
+#if !defined(__i386__)
+extern di_int __divdi3(di_int, di_int);
+#endif
+#ifndef ANDROID /* no complex.h */
+extern float _Complex __divsc3(float, float, float, float);
+#endif
+extern si_int __ffsdi2(di_int);
+extern di_int __fixdfdi(double);
+extern di_int __fixsfdi(float);
+extern du_int __fixunsdfdi(double);
+extern su_int __fixunsdfsi(double);
+extern du_int __fixunssfdi(float);
+extern su_int __fixunssfsi(float);
+#if !defined(__i386__)
+extern double __floatdidf(di_int);
+extern float __floatdisf(di_int);
+extern double __floatundidf(du_int);
+extern float __floatundisf(du_int);
+extern di_int __moddi3(di_int, di_int);
+#endif
+#if !defined(__i386__) && !defined(__SSE2__)
+extern di_int __lshrdi3(di_int, si_int);
+#endif
+#ifndef ANDROID /* no complex.h */
+extern double _Complex __muldc3(double, double, double, double);
+#endif
+#if !defined(__i386__)
+extern di_int __muldi3(di_int, di_int);
+#endif
+#ifndef ANDROID /* no complex.h */
+extern float _Complex __mulsc3(float, float, float, float);
+#endif
+extern di_int __mulvdi3(di_int, di_int);
+extern si_int __mulvsi3(si_int, si_int);
+extern di_int __negdi2(di_int);
+extern di_int __negvdi2(di_int);
+extern si_int __negvsi2(si_int);
+extern si_int __paritydi2(di_int);
+extern si_int __paritysi2(si_int);
+extern si_int __popcountdi2(di_int);
+extern si_int __popcountsi2(si_int);
+extern double __powidf2(double, si_int);
+extern float __powisf2(float, si_int);
+extern di_int __subvdi3(di_int, di_int);
+extern si_int __subvsi3(si_int, si_int);
+extern si_int __ucmpdi2(du_int, du_int);
+#if !defined(__i386__)
+extern du_int __udivdi3(du_int, du_int);
+#endif
+extern su_int __udivsi3(su_int, su_int);
+extern du_int __udivmoddi4(du_int, du_int, du_int *);
+#if !defined(__i386__)
+extern du_int __umoddi3(du_int, du_int);
+#endif
+extern void __eprintf(char const *, char const *, char const *, char const *)
+  __attribute__((visibility("hidden")));
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* BCC_RUNTIME_STUB_H */