Merge upstream to r133240 at Fri. 17th Jun 2011.

Conflicts:
	lib/CodeGen/AsmPrinter/AsmPrinter.cpp
	lib/Target/ARM/ARMCodeEmitter.cpp
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..8739a18
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)
+LLVM_ROOT_PATH := $(LOCAL_PATH)
+LLVM_ENABLE_ASSERTION := false
+
+include $(CLEAR_VARS)
+
+subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
+		lib/Support	\
+		utils/TableGen	\
+		tools/llvm-as	\
+		tools/llvm-link	\
+		lib/VMCore	\
+		lib/Bitcode/Reader	\
+		lib/Bitcode/Writer	\
+		lib/Analysis	\
+		lib/Analysis/IPA	\
+		lib/AsmParser \
+		lib/Transforms/IPO	\
+		lib/Transforms/Utils	\
+		lib/Transforms/Scalar	\
+		lib/Transforms/InstCombine	\
+		lib/Transforms/Instrumentation	\
+		lib/CodeGen	\
+		lib/CodeGen/SelectionDAG	\
+		lib/CodeGen/AsmPrinter	\
+		lib/Target	\
+		lib/Target/ARM	\
+		lib/Target/ARM/AsmParser 	\
+		lib/Target/ARM/InstPrinter \
+		lib/Target/ARM/Disassembler	\
+		lib/Target/ARM/TargetInfo	\
+		lib/Target/X86	\
+		lib/Target/X86/AsmParser 	\
+		lib/Target/X86/InstPrinter	\
+		lib/Target/X86/Disassembler	\
+		lib/Target/X86/TargetInfo	\
+		lib/Target/X86/Utils	\
+		lib/ExecutionEngine/JIT	\
+		lib/MC	\
+		lib/MC/MCParser	\
+                lib/Linker      \
+	))
+
+include $(LOCAL_PATH)/llvm.mk
+
+include $(subdirs)
+
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..77d06c4
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,51 @@
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/stingray/obj/STATIC_LIBRARIES/libLLVM*)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/stingray/obj/STATIC_LIBRARIES/libLLVMARMCodeGen_intermediates*)
diff --git a/MODULE_LICENSE_BSD_LIKE b/MODULE_LICENSE_BSD_LIKE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_BSD_LIKE
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..1b1047c
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,69 @@
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
diff --git a/README.android b/README.android
new file mode 100644
index 0000000..13fbcd0
--- /dev/null
+++ b/README.android
@@ -0,0 +1,41 @@
+/*
+ * README.android describes in high-level the LLVM changes that we cannot push
+ * upstream to the llvm.org repository:
+ *  - Changes due to Android's build system.
+ *  - Changes due to Android's toolchain.
+ *  - Changes due to the limitations in Android-based consumer electronics.
+ *
+ * Some of them are to-dos. If and when they are done, there will no longer be 
+ * merge conflicts with upstream on those parts.
+ *
+ * The file contains useful hints when we try to resolve future 3-way merge 
+ * conflicts. 
+ */ 
+
+* Synced to r129128.
+
+* We add 40+ Android's *.mk files that are specific to Android's build system.
+
+* All the configuration files because we don't have configure/make/make-install
+
+* Changes for enabling both host and device builds.
+
+* All the tblgen work to enable Android to build a generator-generator binary
+  and then run it in the middle of Android build process.
+
+* Explicitly include <cctype> header since is*() are not builtin functions in 
+Android toolchain.
+
+* Code changes to make Android's toolchain stop outputting warnings. (This part
+  should be pushed upstream eventually.)
+
+* lib/Target/{X86,ARM}/AsmPrinter/{X86,ARM}AsmPrinter.cpp
+   Move from lib/Target/{X86,ARM}/{X86,ARM}AsmPrinter.cpp. 
+   AsmPrinter is only needed in Android when disassembly functionality 
+      is desired to be included.
+
+* Our ARM code generation fixes that upstream hasn't accepted yet. (This
+  conflict will be resolved eventually, but there will always be time lag.)
+
+* Assorted size optimizations because Android-based consumer electronics
+  need them.
diff --git a/clear_tblgen_vars.mk b/clear_tblgen_vars.mk
new file mode 100644
index 0000000..6c9623e
--- /dev/null
+++ b/clear_tblgen_vars.mk
@@ -0,0 +1,2 @@
+TBLGEN_TABLES :=
+TBLGEN_TD_DIR :=
diff --git a/copy-diff.py b/copy-diff.py
new file mode 100755
index 0000000..076f2da
--- /dev/null
+++ b/copy-diff.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import os
+import shutil
+import sys
+
+BUFFER_SIZE = 1024
+
+def is_file_different(a, b):
+    if os.path.getsize(a) != os.path.getsize(b):
+        # If the file size is different, the content must be different.
+        return True
+
+    # Read the content of the files, and compare them.
+    result = False
+
+    fa = open(a, 'rb')
+    fb = open(b, 'rb')
+
+    while True:
+        buff_a = fa.read(BUFFER_SIZE)
+        buff_b = fb.read(BUFFER_SIZE)
+
+        if buff_a != buff_b:
+            # File is different in this block.
+            result = True
+            break
+
+        if len(buff_a) < BUFFER_SIZE:
+            # Finished
+            break
+
+    fa.close()
+    fb.close()
+
+    # File is the same.
+    return result
+
+def copyfile(src, dest):
+    if not os.path.exists(src):
+        raise ValueError('Source file not found')
+
+    # Make parent directory (if necessary)
+    destdir = os.path.dirname(dest)
+    if not os.path.exists(destdir):
+        try:
+            os.makedirs(destdir)
+        except os.error, e:
+            raise ValueError('Unable to create directory ' + destdir)
+    elif not os.path.isdir(destdir):
+        raise ValueError(destdir + ' is not a directory')
+
+    if not os.path.exists(dest) or is_file_different(src, dest):
+        # If the destination file does not exist or the source file is
+        # different from the destination file, then we copy the file.
+        shutil.copyfile(src, dest)
+
+def main():
+    if len(sys.argv) < 3:
+        print >> sys.stderr, 'USAGE:', sys.argv[0], '<srcfile> <destfile>'
+        sys.exit(1)
+
+    srcfile = os.path.abspath(sys.argv[1])
+    destfile = os.path.abspath(sys.argv[2])
+
+    if srcfile == destfile:
+        print >> sys.stderr, 'WARNING: <srcfile> is equal to <destfile>'
+    else:
+        try:
+            copyfile(srcfile, destfile)
+        except ValueError, e:
+            print >> sys.stderr, 'ERROR: ', e
+            sys.exit(1)
+
+if __name__ == '__main__':
+    main()
diff --git a/device/include/llvm/Config/AsmParsers.def b/device/include/llvm/Config/AsmParsers.def
new file mode 100644
index 0000000..45903a4
--- /dev/null
+++ b/device/include/llvm/Config/AsmParsers.def
@@ -0,0 +1,35 @@
+//===- llvm/Config/AsmParsers.def - LLVM Assembly Parsers -------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language parsers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PARSER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly parsers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ASM_PARSER
+#  error Please define the macro LLVM_ASM_PARSER(TargetName)
+#endif
+
+#if defined(__arm__)
+  LLVM_ASM_PARSER(ARM)
+#elif defined(__i386__)
+  LLVM_ASM_PARSER(X86)
+#else
+#  error Unsupported TARGET_ARCH for LLVM_ASM_PARSER
+#endif
+
+#undef LLVM_ASM_PARSER
diff --git a/device/include/llvm/Config/AsmPrinters.def b/device/include/llvm/Config/AsmPrinters.def
new file mode 100644
index 0000000..b7311ba
--- /dev/null
+++ b/device/include/llvm/Config/AsmPrinters.def
@@ -0,0 +1,35 @@
+//===- llvm/Config/AsmPrinters.def - LLVM Assembly Printers -----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language printers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PRINTER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly printers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ASM_PRINTER
+#  error Please define the macro LLVM_ASM_PRINTER(TargetName)
+#endif
+
+#if defined(__arm__)
+  LLVM_ASM_PRINTER(ARM)
+#elif defined(__i386__)
+  LLVM_ASM_PRINTER(X86)
+#else
+#  error Unsupported TARGET_ARCH for LLVM_ASM_PRINTER
+#endif
+
+#undef LLVM_ASM_PRINTER
diff --git a/device/include/llvm/Config/Disassemblers.def b/device/include/llvm/Config/Disassemblers.def
new file mode 100644
index 0000000..39df62e
--- /dev/null
+++ b/device/include/llvm/Config/Disassemblers.def
@@ -0,0 +1,35 @@
+//===- llvm/Config/Disassemblers.def - LLVM Assembly Parsers ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language parsers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PARSER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly parsers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DISASSEMBLER
+#  error Please define the macro LLVM_DISASSEMBLER(TargetName)
+#endif
+
+#if defined(__arm__)
+  LLVM_DISASSEMBLER(ARM)
+#elif defined(__i386__)
+  LLVM_DISASSEMBLER(X86)
+#else
+#  error Unsupported TARGET_ARCH for LLVM_DISASSEMBLER
+#endif
+
+#undef LLVM_DISASSEMBLER
diff --git a/device/include/llvm/Config/Targets.def b/device/include/llvm/Config/Targets.def
new file mode 100644
index 0000000..4094606
--- /dev/null
+++ b/device/include/llvm/Config/Targets.def
@@ -0,0 +1,34 @@
+/*===- llvm/Config/Targets.def - LLVM Target Architectures ------*- C++ -*-===*\
+|*                                                                            *|
+|*                     The LLVM Compiler Infrastructure                       *|
+|*                                                                            *|
+|* This file is distributed under the University of Illinois Open Source      *|
+|* License. See LICENSE.TXT for details.                                      *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*|
+|*                                                                            *|
+|* This file enumerates all of the target architectures supported by          *|
+|* this build of LLVM. Clients of this file should define the                 *|
+|* LLVM_TARGET macro to be a function-like macro with a single                *|
+|* parameter (the name of the target); including this file will then          *|
+|* enumerate all of the targets.                                              *|
+|*                                                                            *|
+|* The set of targets supported by LLVM is generated at configuration         *|
+|* time, at which point this header is generated. Do not modify this          *|
+|* header directly.                                                           *|
+|*                                                                            *|
+\*===----------------------------------------------------------------------===*/
+
+#ifndef LLVM_TARGET
+#  error Please define the macro LLVM_TARGET(TargetName)
+#endif
+
+#if defined(__arm__)
+  LLVM_TARGET(ARM)
+#elif defined(__i386__)
+  LLVM_TARGET(X86)
+#else
+#  error Unsupported TARGET_ARCH for LLVM_ASM_PRINTER
+#endif
+
+#undef LLVM_TARGET
diff --git a/device/include/llvm/Config/config.h b/device/include/llvm/Config/config.h
new file mode 100644
index 0000000..593199c
--- /dev/null
+++ b/device/include/llvm/Config/config.h
@@ -0,0 +1,624 @@
+/* include/llvm/Config/config.h.  Generated from config.h.in by configure.  */
+/* include/llvm/Config/config.h.in.  Generated from autoconf/configure.ac by autoheader.  */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* Relative directory for resource files */
+#define CLANG_RESOURCE_DIR ""
+
+/* 32 bit multilib directory. */
+#define CXX_INCLUDE_32BIT_DIR ""
+
+/* 64 bit multilib directory. */
+#define CXX_INCLUDE_64BIT_DIR ""
+
+/* Arch the libstdc++ headers. */
+#define CXX_INCLUDE_ARCH ""
+
+/* Directory with the libstdc++ headers. */
+#define CXX_INCLUDE_ROOT ""
+
+/* Directories clang will search for headers */
+#define C_INCLUDE_DIRS ""
+
+/* Define if CBE is enabled for printf %a output */
+#define ENABLE_CBE_PRINTF_A 1
+
+/* Define if position independent code is enabled */
+#define ENABLE_PIC 0
+
+/* Define if threads enabled */
+#define ENABLE_THREADS 0
+
+/* Define if timestamp information (e.g., __DATE___) is allowed */
+#define ENABLE_TIMESTAMPS 1
+
+/* Define to 1 if you have the `argz_append' function. */
+#define HAVE_ARGZ_APPEND 1
+
+/* Define to 1 if you have the `argz_create_sep' function. */
+#define HAVE_ARGZ_CREATE_SEP 1
+
+/* Define to 1 if you have the <argz.h> header file. */
+#define HAVE_ARGZ_H 1
+
+/* Define to 1 if you have the `argz_insert' function. */
+#define HAVE_ARGZ_INSERT 1
+
+/* Define to 1 if you have the `argz_next' function. */
+#define HAVE_ARGZ_NEXT 1
+
+/* Define to 1 if you have the `argz_stringify' function. */
+#define HAVE_ARGZ_STRINGIFY 1
+
+/* Define to 1 if you have the <assert.h> header file. */
+#define HAVE_ASSERT_H 1
+
+/* Define to 1 if you have the `backtrace' function. */
+#undef HAVE_BACKTRACE
+
+/* Define to 1 if you have the `bcopy' function. */
+/* #undef HAVE_BCOPY */
+
+/* Define to 1 if you have the `ceilf' function. */
+#define HAVE_CEILF 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_CIRCO */
+
+/* Define to 1 if you have the `closedir' function. */
+#define HAVE_CLOSEDIR 1
+
+/* Define to 1 if you have the <CrashReporterClient.h> header file. */
+/* #undef HAVE_CRASHREPORTERCLIENT_H */
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#define HAVE_CTYPE_H 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#define HAVE_DIRENT_H 1
+
+/* Define if you have the GNU dld library. */
+/* #undef HAVE_DLD */
+
+/* Define to 1 if you have the <dld.h> header file. */
+/* #undef HAVE_DLD_H */
+
+/* Define to 1 if you have the `dlerror' function. */
+#define HAVE_DLERROR 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define if dlopen() is available on this platform. */
+#define HAVE_DLOPEN 1
+
+/* Define to 1 if you have the <dl.h> header file. */
+/* #undef HAVE_DL_H */
+
+/* Define if the dot program is available */
+/* #undef HAVE_DOT */
+
+/* Define if the dotty program is available */
+/* #undef HAVE_DOTTY */
+
+/* Define if you have the _dyld_func_lookup function. */
+/* #undef HAVE_DYLD */
+
+/* Define to 1 if you have the <errno.h> header file. */
+#define HAVE_ERRNO_H 1
+
+/* Define to 1 if the system has the type `error_t'. */
+#define HAVE_ERROR_T 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+/* #undef HAVE_EXECINFO_H */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_FDP */
+
+/* Define if libffi is available on this platform. */
+/* #undef HAVE_FFI_CALL */
+
+/* Define to 1 if you have the <ffi/ffi.h> header file. */
+/* #undef HAVE_FFI_FFI_H */
+
+/* Define to 1 if you have the <ffi.h> header file. */
+/* #undef HAVE_FFI_H */
+
+/* Set to 1 if the finite function is found in <ieeefp.h> */
+/* #undef HAVE_FINITE_IN_IEEEFP_H */
+
+/* Define to 1 if you have the `floorf' function. */
+#define HAVE_FLOORF 1
+
+/* Define to 1 if you have the `fmodf' function. */
+#define HAVE_FMODF 1
+
+/* Define to 1 if you have the `getcwd' function. */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getrlimit' function. */
+#define HAVE_GETRLIMIT 1
+
+/* Define to 1 if you have the `getrusage' function. */
+#define HAVE_GETRUSAGE 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define if the Graphviz program is available */
+/* #undef HAVE_GRAPHVIZ */
+
+/* Define if the gv program is available */
+/* #undef HAVE_GV */
+
+/* Define to 1 if you have the `index' function. */
+/* #undef HAVE_INDEX */
+
+/* Define to 1 if the system has the type `int64_t'. */
+#define HAVE_INT64_T 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `isatty' function. */
+#define HAVE_ISATTY 1
+
+/* Set to 1 if the isinf function is found in <cmath> */
+#define HAVE_ISINF_IN_CMATH 1
+
+/* Set to 1 if the isinf function is found in <math.h> */
+#define HAVE_ISINF_IN_MATH_H 1
+
+/* Set to 1 if the isnan function is found in <cmath> */
+#define HAVE_ISNAN_IN_CMATH 1
+
+/* Set to 1 if the isnan function is found in <math.h> */
+#define HAVE_ISNAN_IN_MATH_H 1
+
+/* Define if you have the libdl library or equivalent. */
+#define HAVE_LIBDL 1
+
+/* Define to 1 if you have the `imagehlp' library (-limagehlp). */
+/* #undef HAVE_LIBIMAGEHLP */
+
+/* Define to 1 if you have the `m' library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define to 1 if you have the `psapi' library (-lpsapi). */
+/* #undef HAVE_LIBPSAPI */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_LIBPTHREAD 1
+
+/* Define to 1 if you have the `udis86' library (-ludis86). */
+/* #undef HAVE_LIBUDIS86 */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define if you can use -Wl,-export-dynamic. */
+#define HAVE_LINK_EXPORT_DYNAMIC 1
+
+/* Define to 1 if you have the <link.h> header file. */
+#define HAVE_LINK_H 1
+
+/* Define if you can use -Wl,-R. to pass -R. to the linker, in order to add
+   the current directory to the dynamic linker search path. */
+#define HAVE_LINK_R 1
+
+/* Define to 1 if you have the `longjmp' function. */
+#define HAVE_LONGJMP 1
+
+/* Define to 1 if you have the <mach/mach.h> header file. */
+/* #undef HAVE_MACH_MACH_H */
+
+/* Define to 1 if you have the <mach-o/dyld.h> header file. */
+/* #undef HAVE_MACH_O_DYLD_H */
+
+/* Define if mallinfo() is available on this platform. */
+#define HAVE_MALLINFO 1
+
+/* Define to 1 if you have the <malloc/malloc.h> header file. */
+/* #undef HAVE_MALLOC_MALLOC_H */
+
+/* Define to 1 if you have the `malloc_zone_statistics' function. */
+/* #undef HAVE_MALLOC_ZONE_STATISTICS */
+
+/* Define to 1 if you have the `memcpy' function. */
+#define HAVE_MEMCPY 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkdtemp' function. */
+/* #undef HAVE_MKDTEMP */
+
+/* Define to 1 if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the `mktemp' function. */
+#define HAVE_MKTEMP 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* Define if mmap() uses MAP_ANONYMOUS to map anonymous pages, or undefine if
+   it uses MAP_ANON */
+#define HAVE_MMAP_ANONYMOUS 1
+
+/* Define if mmap() can map files into memory */
+#define HAVE_MMAP_FILE
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the `nearbyintf' function. */
+#define HAVE_NEARBYINTF 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_NEATO */
+
+/* Define to 1 if you have the `opendir' function. */
+#define HAVE_OPENDIR 1
+
+/* Define to 1 if you have the `posix_spawn' function. */
+/* #undef HAVE_POSIX_SPAWN */
+
+/* Define to 1 if you have the `powf' function. */
+#define HAVE_POWF 1
+
+/* Define if libtool can extract symbol lists from object files. */
+#define HAVE_PRELOADED_SYMBOLS 1
+
+/* Define to have the %a format string */
+#define HAVE_PRINTF_A 1
+
+/* Have pthread_getspecific */
+/* #undef HAVE_PTHREAD_GETSPECIFIC */
+
+/* Define to 1 if you have the <pthread.h> header file. */
+/* #undef HAVE_PTHREAD_H */
+
+/* Have pthread_mutex_lock */
+/* #undef HAVE_PTHREAD_MUTEX_LOCK */
+
+/* Have pthread_rwlock_init */
+/* #undef HAVE_PTHREAD_RWLOCK_INIT */
+
+/* Define to 1 if srand48/lrand48/drand48 exist in <stdlib.h> */
+#define HAVE_RAND48 1
+
+/* Define to 1 if you have the `readdir' function. */
+#define HAVE_READDIR 1
+
+/* Define to 1 if you have the `realpath' function. */
+#define HAVE_REALPATH 1
+
+/* Define to 1 if you have the `rindex' function. */
+/* #undef HAVE_RINDEX */
+
+/* Define to 1 if you have the `rintf' function. */
+#define HAVE_RINTF 1
+
+/* Define to 1 if you have the `round' function. */
+#define HAVE_ROUND 1
+
+/* Define to 1 if you have the `roundf' function. */
+#define HAVE_ROUNDF 1
+
+/* Define to 1 if you have the `sbrk' function. */
+#define HAVE_SBRK 1
+
+/* Define to 1 if you have the `setenv' function. */
+#define HAVE_SETENV 1
+
+/* Define to 1 if you have the `setjmp' function. */
+#define HAVE_SETJMP 1
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#define HAVE_SETJMP_H 1
+
+/* Define to 1 if you have the `setrlimit' function. */
+#define HAVE_SETRLIMIT 1
+
+/* Define if you have the shl_load function. */
+/* #undef HAVE_SHL_LOAD */
+
+/* Define to 1 if you have the `siglongjmp' function. */
+#define HAVE_SIGLONGJMP 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the `sigsetjmp' function. */
+/* #undef HAVE_SIGSETJMP */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Set to 1 if the std::isinf function is found in <cmath> */
+/* #undef HAVE_STD_ISINF_IN_CMATH */
+
+/* Set to 1 if the std::isnan function is found in <cmath> */
+#define HAVE_STD_ISNAN_IN_CMATH 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strcmp' function. */
+#define HAVE_STRCMP 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+#define HAVE_STRERROR_R 1
+
+/* Define to 1 if you have the `strerror_s' function. */
+/* #undef HAVE_STRERROR_S */
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strrchr' function. */
+#define HAVE_STRRCHR 1
+
+/* Define to 1 if you have the `strtof' function. */
+#define HAVE_STRTOF 1
+
+/* Define to 1 if you have the `strtoll' function. */
+#define HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoq' function. */
+#define HAVE_STRTOQ 1
+
+/* Define to 1 if you have the `sysconf' function. */
+#define HAVE_SYSCONF 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/dl.h> header file. */
+/* #undef HAVE_SYS_DL_H */
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_TWOPI */
+
+/* Define to 1 if the system has the type `uint64_t'. */
+#define HAVE_UINT64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define to 1 if the system has the type `u_int64_t'. */
+/* #undef HAVE_U_INT64_T */
+
+/* Define to 1 if you have the <valgrind/valgrind.h> header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the `__dso_handle' function. */
+#define HAVE___DSO_HANDLE 1
+
+/* Linker version detected at compile time. */
+/* #undef HOST_LINK_VERSION */
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/usr/local/google/llvm/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue Apr 27 18:30:43 CST 2010"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/usr/local/google/llvm/share/llvm"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/usr/local/google/llvm/docs/llvm"
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/usr/local/google/llvm/etc/llvm"
+
+/* Host triple we were built on */
+#define LLVM_HOSTTRIPLE "x86_64-unknown-linux-gnu"
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/usr/local/google/llvm/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/usr/local/google/llvm/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/usr/local/google/llvm/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/usr/local/google/llvm/man"
+
+/* Build multithreading support into LLVM */
+/* #undef LLVM_MULTITHREADED */
+
+/* LLVM architecture name for the native architecture, if available */
+#if defined(__arm__)
+#   define LLVM_NATIVE_ARCH ARMTarget
+#elif defined(__i386__)
+#   define LLVM_NATIVE_ARCH X86Target
+#else
+#   error Unsupported target architecture for LLVM_NATIVE_ARCH
+#endif
+
+/* Short LLVM architecture name for the native architecture, if available */
+#if defined(__arm__)
+#   define LLVM_NATIVE_ARCHNAME ARM
+#elif defined(__i386__)
+#   define LLVM_NATIVE_ARCHNAME X86
+#else
+#   error Unsupported target architecture for LLVM_NATIVE_ARCHNAME
+#endif
+
+/* Define if this is Unixish platform */
+#define LLVM_ON_UNIX 1
+
+/* Define if this is Win32ish platform */
+/* #undef LLVM_ON_WIN32 */
+
+/* Define to path to circo program if found or 'echo circo' otherwise */
+/* #undef LLVM_PATH_CIRCO */
+
+/* Define to path to dot program if found or 'echo dot' otherwise */
+/* #undef LLVM_PATH_DOT */
+
+/* Define to path to dotty program if found or 'echo dotty' otherwise */
+/* #undef LLVM_PATH_DOTTY */
+
+/* Define to path to fdp program if found or 'echo fdp' otherwise */
+/* #undef LLVM_PATH_FDP */
+
+/* Define to path to Graphviz program if found or 'echo Graphviz' otherwise */
+/* #undef LLVM_PATH_GRAPHVIZ */
+
+/* Define to path to gv program if found or 'echo gv' otherwise */
+/* #undef LLVM_PATH_GV */
+
+/* Define to path to neato program if found or 'echo neato' otherwise */
+/* #undef LLVM_PATH_NEATO */
+
+/* Define to path to twopi program if found or 'echo twopi' otherwise */
+/* #undef LLVM_PATH_TWOPI */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/usr/local/google/llvm"
+
+/* Define if the OS needs help to load dependent libraries for dlopen(). */
+/* #undef LTDL_DLOPEN_DEPLIBS */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LTDL_OBJDIR ".libs/"
+
+/* Define to the name of the environment variable that determines the dynamic
+   library search path. */
+#define LTDL_SHLIBPATH_VAR "LD_LIBRARY_PATH"
+
+/* Define to the extension used for shared libraries, say, ".so". */
+#define LTDL_SHLIB_EXT ".so"
+
+/* Define to the system default library search path. */
+#define LTDL_SYSSEARCHPATH "/lib:/usr/lib:/usr/local/lib:/lib:/usr/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib32:/usr/lib32:/usr/local/lib32:/usr/x86_64-pc-linux-gnu/lib:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/32:/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2:/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/32"
+
+/* Define if /dev/zero should be used when mapping RWX memory, or undefine if
+   its not necessary */
+/* #undef NEED_DEV_ZERO_FOR_MMAP */
+
+/* Define if dlsym() requires a leading underscore in symbol names. */
+/* #undef NEED_USCORE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "llvm"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "llvm 2.8svn"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "-llvm-"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.8svn"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define if we have the oprofile JIT-support library */
+#define USE_OPROFILE 0
+
+/* Define if use udis86 library */
+#define USE_UDIS86 0
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to a type to use for `error_t' if it is not otherwise available. */
+/* #undef error_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+#endif
diff --git a/host/include/llvm/Config/AsmParsers.def b/host/include/llvm/Config/AsmParsers.def
new file mode 100644
index 0000000..dd5c70c
--- /dev/null
+++ b/host/include/llvm/Config/AsmParsers.def
@@ -0,0 +1,29 @@
+//===- llvm/Config/AsmParsers.def - LLVM Assembly Parsers -------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language parsers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PARSER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly parsers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ASM_PARSER
+#  error Please define the macro LLVM_ASM_PARSER(TargetName)
+#endif
+
+LLVM_ASM_PARSER(X86) LLVM_ASM_PARSER(X86)
+
+#undef LLVM_ASM_PARSER
diff --git a/host/include/llvm/Config/AsmPrinters.def b/host/include/llvm/Config/AsmPrinters.def
new file mode 100644
index 0000000..cefdfeb
--- /dev/null
+++ b/host/include/llvm/Config/AsmPrinters.def
@@ -0,0 +1,29 @@
+//===- llvm/Config/AsmPrinters.def - LLVM Assembly Printers -----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language printers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PRINTER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly printers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ASM_PRINTER
+#  error Please define the macro LLVM_ASM_PRINTER(TargetName)
+#endif
+
+LLVM_ASM_PRINTER(ARM) LLVM_ASM_PRINTER(X86) LLVM_ASM_PRINTER(X86)
+
+#undef LLVM_ASM_PRINTER
diff --git a/host/include/llvm/Config/Disassemblers.def b/host/include/llvm/Config/Disassemblers.def
new file mode 100644
index 0000000..d3a679a
--- /dev/null
+++ b/host/include/llvm/Config/Disassemblers.def
@@ -0,0 +1,30 @@
+//===- llvm/Config/Disassemblers.def - LLVM Assembly Parsers ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates all of the assembly-language parsers
+// supported by this build of LLVM. Clients of this file should define
+// the LLVM_ASM_PARSER macro to be a function-like macro with a
+// single parameter (the name of the target whose assembly can be
+// generated); including this file will then enumerate all of the
+// targets with assembly parsers.
+//
+// The set of targets supported by LLVM is generated at configuration
+// time, at which point this header is generated. Do not modify this
+// header directly.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DISASSEMBLER
+#  error Please define the macro LLVM_DISASSEMBLER(TargetName)
+#endif
+
+LLVM_DISASSEMBLER(X86)
+LLVM_DISASSEMBLER(ARM)
+
+#undef LLVM_DISASSEMBLER
diff --git a/host/include/llvm/Config/Targets.def b/host/include/llvm/Config/Targets.def
new file mode 100644
index 0000000..32f469d
--- /dev/null
+++ b/host/include/llvm/Config/Targets.def
@@ -0,0 +1,28 @@
+/*===- llvm/Config/Targets.def - LLVM Target Architectures ------*- C++ -*-===*\
+|*                                                                            *|
+|*                     The LLVM Compiler Infrastructure                       *|
+|*                                                                            *|
+|* This file is distributed under the University of Illinois Open Source      *|
+|* License. See LICENSE.TXT for details.                                      *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*|
+|*                                                                            *|
+|* This file enumerates all of the target architectures supported by          *|
+|* this build of LLVM. Clients of this file should define the                 *|
+|* LLVM_TARGET macro to be a function-like macro with a single                *|
+|* parameter (the name of the target); including this file will then          *|
+|* enumerate all of the targets.                                              *|
+|*                                                                            *|
+|* The set of targets supported by LLVM is generated at configuration         *|
+|* time, at which point this header is generated. Do not modify this          *|
+|* header directly.                                                           *|
+|*                                                                            *|
+\*===----------------------------------------------------------------------===*/
+
+#ifndef LLVM_TARGET
+#  error Please define the macro LLVM_TARGET(TargetName)
+#endif
+
+LLVM_TARGET(ARM) LLVM_TARGET(X86) LLVM_TARGET(X86)
+
+#undef LLVM_TARGET
diff --git a/host/include/llvm/Config/config.h b/host/include/llvm/Config/config.h
new file mode 100644
index 0000000..5a1f7bb
--- /dev/null
+++ b/host/include/llvm/Config/config.h
@@ -0,0 +1,617 @@
+/* include/llvm/Config/config.h.  Generated from config.h.in by configure.  */
+/* include/llvm/Config/config.h.in.  Generated from autoconf/configure.ac by autoheader.  */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* Relative directory for resource files */
+#define CLANG_RESOURCE_DIR ""
+
+/* 32 bit multilib directory. */
+#define CXX_INCLUDE_32BIT_DIR ""
+
+/* 64 bit multilib directory. */
+#define CXX_INCLUDE_64BIT_DIR ""
+
+/* Arch the libstdc++ headers. */
+#define CXX_INCLUDE_ARCH ""
+
+/* Directory with the libstdc++ headers. */
+#define CXX_INCLUDE_ROOT ""
+
+/* Directories clang will search for headers */
+#define C_INCLUDE_DIRS ""
+
+/* Define if CBE is enabled for printf %a output */
+#define ENABLE_CBE_PRINTF_A 1
+
+/* Define if position independent code is enabled */
+#define ENABLE_PIC 1
+
+/* Define if threads enabled */
+#define ENABLE_THREADS 1
+
+/* Define if timestamp information (e.g., __DATE___) is allowed */
+#define ENABLE_TIMESTAMPS 1
+
+/* Define to 1 if you have the `argz_append' function. */
+/* #undef HAVE_ARGZ_APPEND */
+
+/* Define to 1 if you have the `argz_create_sep' function. */
+/* #undef HAVE_ARGZ_CREATE_SEP */
+
+/* Define to 1 if you have the <argz.h> header file. */
+/* #undef HAVE_ARGZ_H */
+
+/* Define to 1 if you have the `argz_insert' function. */
+/* #undef HAVE_ARGZ_INSERT */
+
+/* Define to 1 if you have the `argz_next' function. */
+/* #undef HAVE_ARGZ_NEXT */
+
+/* Define to 1 if you have the `argz_stringify' function. */
+/* #undef HAVE_ARGZ_STRINGIFY */
+
+/* Define to 1 if you have the <assert.h> header file. */
+#define HAVE_ASSERT_H 1
+
+/* Define to 1 if you have the `bcopy' function. */
+/* #undef HAVE_BCOPY */
+
+/* Define to 1 if you have the `ceilf' function. */
+#define HAVE_CEILF 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_CIRCO */
+
+/* Define to 1 if you have the `closedir' function. */
+#define HAVE_CLOSEDIR 1
+
+/* Define to 1 if you have the <CrashReporterClient.h> header file. */
+/* #undef HAVE_CRASHREPORTERCLIENT_H */
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#define HAVE_CTYPE_H 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#define HAVE_DIRENT_H 1
+
+/* Define if you have the GNU dld library. */
+/* #undef HAVE_DLD */
+
+/* Define to 1 if you have the <dld.h> header file. */
+/* #undef HAVE_DLD_H */
+
+/* Define to 1 if you have the `dlerror' function. */
+#define HAVE_DLERROR 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define if dlopen() is available on this platform. */
+#define HAVE_DLOPEN 1
+
+/* Define to 1 if you have the <dl.h> header file. */
+/* #undef HAVE_DL_H */
+
+/* Define if the dot program is available */
+/* #undef HAVE_DOT */
+
+/* Define if the dotty program is available */
+/* #undef HAVE_DOTTY */
+
+/* Define if you have the _dyld_func_lookup function. */
+/* #undef HAVE_DYLD */
+
+/* Define to 1 if you have the <errno.h> header file. */
+#define HAVE_ERRNO_H 1
+
+/* Define to 1 if the system has the type `error_t'. */
+/* #undef HAVE_ERROR_T */
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#define HAVE_EXECINFO_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_FDP */
+
+/* Define if libffi is available on this platform. */
+/* #undef HAVE_FFI_CALL */
+
+/* Define to 1 if you have the <ffi/ffi.h> header file. */
+/* #undef HAVE_FFI_FFI_H */
+
+/* Define to 1 if you have the <ffi.h> header file. */
+/* #undef HAVE_FFI_H */
+
+/* Set to 1 if the finite function is found in <ieeefp.h> */
+/* #undef HAVE_FINITE_IN_IEEEFP_H */
+
+/* Define to 1 if you have the `floorf' function. */
+#define HAVE_FLOORF 1
+
+/* Define to 1 if you have the `fmodf' function. */
+#define HAVE_FMODF 1
+
+/* Define to 1 if you have the `getcwd' function. */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getrlimit' function. */
+#define HAVE_GETRLIMIT 1
+
+/* Define to 1 if you have the `getrusage' function. */
+#define HAVE_GETRUSAGE 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define if the Graphviz program is available */
+/* #undef HAVE_GRAPHVIZ */
+
+/* Define if the gv program is available */
+/* #undef HAVE_GV */
+
+/* Define to 1 if you have the `index' function. */
+/* #undef HAVE_INDEX */
+
+/* Define to 1 if the system has the type `int64_t'. */
+#define HAVE_INT64_T 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `isatty' function. */
+#define HAVE_ISATTY 1
+
+/* Set to 1 if the isinf function is found in <cmath> */
+/* #undef HAVE_ISINF_IN_CMATH */
+
+/* Set to 1 if the isinf function is found in <math.h> */
+#define HAVE_ISINF_IN_MATH_H 1
+
+/* Set to 1 if the isnan function is found in <cmath> */
+/* #undef HAVE_ISNAN_IN_CMATH */
+
+/* Set to 1 if the isnan function is found in <math.h> */
+#define HAVE_ISNAN_IN_MATH_H 1
+
+/* Define if you have the libdl library or equivalent. */
+#define HAVE_LIBDL 1
+
+/* Define to 1 if you have the `m' library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define to 1 if you have the `udis86' library (-ludis86). */
+/* #undef HAVE_LIBUDIS86 */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define if you can use -Wl,-export-dynamic. */
+/* #undef HAVE_LINK_EXPORT_DYNAMIC */
+
+/* Define to 1 if you have the <link.h> header file. */
+/* #undef HAVE_LINK_H */
+
+/* Define if you can use -Wl,-R. to pass -R. to the linker, in order to add
+   the current directory to the dynamic linker search path. */
+/* #undef HAVE_LINK_R */
+
+/* Define to 1 if you have the `longjmp' function. */
+#define HAVE_LONGJMP 1
+
+/* Define to 1 if you have the <mach/mach.h> header file. */
+/* #undef HAVE_MACH_MACH_H */
+
+/* Define to 1 if you have the <mach-o/dyld.h> header file. */
+/* #undef HAVE_MACH_O_DYLD_H */
+
+/* Define if mallinfo() is available on this platform. */
+/* #undef HAVE_MALLINFO */
+
+/* Define to 1 if you have the <malloc/malloc.h> header file. */
+/* #undef HAVE_MALLOC_MALLOC_H */
+
+/* Define to 1 if you have the `malloc_zone_statistics' function. */
+/* #undef HAVE_MALLOC_ZONE_STATISTICS */
+
+/* Define to 1 if you have the `memcpy' function. */
+#define HAVE_MEMCPY 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkdtemp' function. */
+#define HAVE_MKDTEMP 1
+
+/* Define to 1 if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the `mktemp' function. */
+#define HAVE_MKTEMP 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* Define if mmap() uses MAP_ANONYMOUS to map anonymous pages, or undefine if
+   it uses MAP_ANON */
+/* #undef HAVE_MMAP_ANONYMOUS */
+
+/* Define if mmap() can map files into memory */
+#define HAVE_MMAP_FILE
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the `nearbyintf' function. */
+#define HAVE_NEARBYINTF 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_NEATO */
+
+/* Define to 1 if you have the `opendir' function. */
+#define HAVE_OPENDIR 1
+
+/* Define to 1 if you have the `posix_spawn' function. */
+/*#define HAVE_POSIX_SPAWN 1*/
+
+/* Define to 1 if you have the `powf' function. */
+#define HAVE_POWF 1
+
+/* Define if libtool can extract symbol lists from object files. */
+#define HAVE_PRELOADED_SYMBOLS 1
+
+/* Define to have the %a format string */
+#define HAVE_PRINTF_A 1
+
+#ifndef USE_MINGW
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_LIBPTHREAD 1
+
+/* Have pthread_getspecific */
+#define HAVE_PTHREAD_GETSPECIFIC 1
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Have pthread_mutex_lock */
+#define HAVE_PTHREAD_MUTEX_LOCK 1
+
+/* Have pthread_rwlock_init */
+#define HAVE_PTHREAD_RWLOCK_INIT 1
+#endif /* not USE_MINGW */
+
+/* Define to 1 if srand48/lrand48/drand48 exist in <stdlib.h> */
+#define HAVE_RAND48 1
+
+/* Define to 1 if you have the `readdir' function. */
+#define HAVE_READDIR 1
+
+/* Define to 1 if you have the `realpath' function. */
+#define HAVE_REALPATH 1
+
+/* Define to 1 if you have the `rindex' function. */
+/* #undef HAVE_RINDEX */
+
+/* Define to 1 if you have the `rintf' function. */
+#define HAVE_RINTF 1
+
+/* Define to 1 if you have the `round' function. */
+#define HAVE_ROUND 1
+
+/* Define to 1 if you have the `roundf' function. */
+#define HAVE_ROUNDF 1
+
+/* Define to 1 if you have the `sbrk' function. */
+#define HAVE_SBRK 1
+
+/* Define to 1 if you have the `setenv' function. */
+#define HAVE_SETENV 1
+
+/* Define to 1 if you have the `setjmp' function. */
+#define HAVE_SETJMP 1
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#define HAVE_SETJMP_H 1
+
+/* Define to 1 if you have the `setrlimit' function. */
+#define HAVE_SETRLIMIT 1
+
+/* Define if you have the shl_load function. */
+/* #undef HAVE_SHL_LOAD */
+
+/* Define to 1 if you have the `siglongjmp' function. */
+#define HAVE_SIGLONGJMP 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the `sigsetjmp' function. */
+/* #undef HAVE_SIGSETJMP */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Set to 1 if the std::isinf function is found in <cmath> */
+/* #undef HAVE_STD_ISINF_IN_CMATH */
+
+/* Set to 1 if the std::isnan function is found in <cmath> */
+#define HAVE_STD_ISNAN_IN_CMATH 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strcmp' function. */
+#define HAVE_STRCMP 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+#ifndef USE_MINGW
+#define HAVE_STRERROR_R 1
+#endif
+
+/* Define to 1 if you have the `strerror_s' function. */
+/* #undef HAVE_STRERROR_S */
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strrchr' function. */
+#define HAVE_STRRCHR 1
+
+/* Define to 1 if you have the `strtof' function. */
+#define HAVE_STRTOF 1
+
+/* Define to 1 if you have the `strtoll' function. */
+#define HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoq' function. */
+#define HAVE_STRTOQ 1
+
+/* Define to 1 if you have the `sysconf' function. */
+#define HAVE_SYSCONF 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/dl.h> header file. */
+/* #undef HAVE_SYS_DL_H */
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define if the neat program is available */
+/* #undef HAVE_TWOPI */
+
+/* Define to 1 if the system has the type `uint64_t'. */
+#define HAVE_UINT64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define to 1 if the system has the type `u_int64_t'. */
+/* #undef HAVE_U_INT64_T */
+
+/* Define to 1 if you have the `__dso_handle' function. */
+#define HAVE___DSO_HANDLE 1
+
+/* Linker version detected at compile time. */
+/* #undef HOST_LINK_VERSION */
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/usr/local/google/llvm/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue Apr 27 18:30:43 CST 2010"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/usr/local/google/llvm/share/llvm"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/usr/local/google/llvm/docs/llvm"
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/usr/local/google/llvm/etc/llvm"
+
+/* Host triple we were built on */
+#define LLVM_HOSTTRIPLE "i386-unknown-linux"
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/usr/local/google/llvm/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/usr/local/google/llvm/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/usr/local/google/llvm/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/usr/local/google/llvm/man"
+
+/* Build multithreading support into LLVM */
+#define LLVM_MULTITHREADED 0
+
+/* LLVM architecture name for the native architecture, if available */
+#define LLVM_NATIVE_ARCH X86Target
+
+/* Short LLVM architecture name for the native architecture, if available */
+#define LLVM_NATIVE_ARCHNAME X86
+
+#ifdef USE_MINGW
+/* Define if this is Win32ish platform */
+#define LLVM_ON_WIN32 1
+
+/* Define to 1 if you have the <windows.h> header file. */
+#define HAVE_WINDOWS_H 1
+
+/* Define to 1 if you have the `psapi' library (-lpsapi). */
+#define HAVE_LIBPSAPI 1
+
+/* Define to 1 if you have the `imagehlp' library (-limagehlp). */
+#define HAVE_LIBIMAGEHLP 1
+
+#else /* not USE_MINGW */
+
+/* Define if this is Unixish platform */
+#define LLVM_ON_UNIX 1
+
+#endif
+
+
+/* Define to path to circo program if found or 'echo circo' otherwise */
+/* #undef LLVM_PATH_CIRCO */
+
+/* Define to path to dot program if found or 'echo dot' otherwise */
+/* #undef LLVM_PATH_DOT */
+
+/* Define to path to dotty program if found or 'echo dotty' otherwise */
+/* #undef LLVM_PATH_DOTTY */
+
+/* Define to path to fdp program if found or 'echo fdp' otherwise */
+/* #undef LLVM_PATH_FDP */
+
+/* Define to path to Graphviz program if found or 'echo Graphviz' otherwise */
+/* #undef LLVM_PATH_GRAPHVIZ */
+
+/* Define to path to gv program if found or 'echo gv' otherwise */
+/* #undef LLVM_PATH_GV */
+
+/* Define to path to neato program if found or 'echo neato' otherwise */
+/* #undef LLVM_PATH_NEATO */
+
+/* Define to path to twopi program if found or 'echo twopi' otherwise */
+/* #undef LLVM_PATH_TWOPI */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/usr/local/google/llvm"
+
+/* Define if the OS needs help to load dependent libraries for dlopen(). */
+/* #undef LTDL_DLOPEN_DEPLIBS */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LTDL_OBJDIR ".libs/"
+
+/* Define to the name of the environment variable that determines the dynamic
+   library search path. */
+#define LTDL_SHLIBPATH_VAR "LD_LIBRARY_PATH"
+
+/* Define to the extension used for shared libraries, say, ".so". */
+#define LTDL_SHLIB_EXT ".so"
+
+/* Define to the system default library search path. */
+#define LTDL_SYSSEARCHPATH "/lib:/usr/lib:/usr/local/lib:/lib:/usr/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib32:/usr/lib32:/usr/local/lib32:/usr/x86_64-pc-linux-gnu/lib:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/32:/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2:/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/32"
+
+/* Define if /dev/zero should be used when mapping RWX memory, or undefine if
+   its not necessary */
+/* #undef NEED_DEV_ZERO_FOR_MMAP */
+
+/* Define if dlsym() requires a leading underscore in symbol names. */
+/* #undef NEED_USCORE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "llvm"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "llvm 2.8svn"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "-llvm-"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.8svn"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define if we have the oprofile JIT-support library */
+#define USE_OPROFILE 0
+
+/* Define if use udis86 library */
+#define USE_UDIS86 0
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to a type to use for `error_t' if it is not otherwise available. */
+/* #undef error_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+#endif
+
diff --git a/include/llvm/Config/llvm-config.h b/include/llvm/Config/llvm-config.h
new file mode 100644
index 0000000..451efe3
--- /dev/null
+++ b/include/llvm/Config/llvm-config.h
@@ -0,0 +1 @@
+#include "llvm/Config/config.h"
diff --git a/include/llvm/Support/DataTypes.h b/include/llvm/Support/DataTypes.h
new file mode 100644
index 0000000..d325c66
--- /dev/null
+++ b/include/llvm/Support/DataTypes.h
@@ -0,0 +1,111 @@
+/*===-- include/System/DataTypes.h - Define fixed size types -----*- C -*-===*\
+|*                                                                            *|
+|*                     The LLVM Compiler Infrastructure                       *|
+|*                                                                            *|
+|* This file is distributed under the University of Illinois Open Source      *|
+|* License. See LICENSE.TXT for details.                                      *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*|
+|*                                                                            *|
+|* This file contains definitions to figure out the size of _HOST_ data types.*|
+|* This file is important because different host OS's define different macros,*|
+|* which makes portability tough.  This file exports the following            *|
+|* definitions:                                                               *|
+|*                                                                            *|
+|*   [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*|
+|*   [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values.     *|
+|*                                                                            *|
+|* No library is required when using these functinons.                        *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*/
+
+/* Please leave this file C-compatible. */
+
+#ifndef SUPPORT_DATATYPES_H
+#define SUPPORT_DATATYPES_H
+
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_UINT64_T 1
+/* #undef HAVE_U_INT64_T */
+
+#ifdef __cplusplus
+#include <cmath>
+#else
+#include <math.h>
+#endif
+
+/* Note that this header's correct operation depends on __STDC_LIMIT_MACROS
+   being defined.  We would define it here, but in order to prevent Bad Things
+   happening when system headers or C++ STL headers include stdint.h before we
+   define it here, we define it on the g++ command line (in Makefile.rules). */
+#if !defined(__STDC_LIMIT_MACROS)
+# error "Must #define __STDC_LIMIT_MACROS before #including System/DataTypes.h"
+#endif
+
+#if !defined(__STDC_CONSTANT_MACROS)
+# error "Must #define __STDC_CONSTANT_MACROS before " \
+        "#including System/DataTypes.h"
+#endif
+
+/* Note that <inttypes.h> includes <stdint.h>, if this is a C99 system. */
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#ifdef _AIX
+#include "llvm/System/AIXDataTypesFix.h"
+#endif
+
+/* Handle incorrect definition of uint64_t as u_int64_t */
+#ifndef HAVE_UINT64_T
+#ifdef HAVE_U_INT64_T
+typedef u_int64_t uint64_t;
+#else
+# error "Don't have a definition for uint64_t on this platform"
+#endif
+#endif
+
+#ifdef _OpenBSD_
+#define INT8_MAX 127
+#define INT8_MIN -128
+#define UINT8_MAX 255
+#define INT16_MAX 32767
+#define INT16_MIN -32768
+#define UINT16_MAX 65535
+#define INT32_MAX 2147483647
+#define INT32_MIN -2147483648
+#define UINT32_MAX 4294967295U
+#endif
+
+/* Set defaults for constants which we cannot find. */
+#if !defined(INT64_MAX)
+# define INT64_MAX 9223372036854775807LL
+#endif
+#if !defined(INT64_MIN)
+# define INT64_MIN ((-INT64_MAX)-1)
+#endif
+#if !defined(UINT64_MAX)
+# define UINT64_MAX 0xffffffffffffffffULL
+#endif
+
+#if __GNUC__ > 3
+#define END_WITH_NULL __attribute__((sentinel))
+#else
+#define END_WITH_NULL
+#endif
+
+#ifndef HUGE_VALF
+#define HUGE_VALF (float)HUGE_VAL
+#endif
+
+#endif  /* SUPPORT_DATATYPES_H */
diff --git a/lib/Analysis/Android.mk b/lib/Analysis/Android.mk
new file mode 100644
index 0000000..17e4b37
--- /dev/null
+++ b/lib/Analysis/Android.mk
@@ -0,0 +1,87 @@
+LOCAL_PATH:= $(call my-dir)
+
+analysis_SRC_FILES :=	\
+	AliasAnalysis.cpp	\
+	AliasAnalysisCounter.cpp	\
+	AliasAnalysisEvaluator.cpp	\
+	AliasDebugger.cpp	\
+	AliasSetTracker.cpp	\
+	Analysis.cpp	\
+	BasicAliasAnalysis.cpp	\
+	CFGPrinter.cpp	\
+	CaptureTracking.cpp	\
+	ConstantFolding.cpp	\
+	DIBuilder.cpp		\
+	DbgInfoPrinter.cpp	\
+	DebugInfo.cpp	\
+	DominanceFrontier.cpp	\
+	DomPrinter.cpp	\
+	IVUsers.cpp	\
+	InlineCost.cpp	\
+	InstCount.cpp	\
+	InstructionSimplify.cpp	\
+	Interval.cpp	\
+	IntervalPartition.cpp	\
+	LazyValueInfo.cpp	\
+	LibCallAliasAnalysis.cpp	\
+	LibCallSemantics.cpp	\
+	Loads.cpp	\
+	NoAliasAnalysis.cpp \
+	MemDepPrinter.cpp \
+	MemoryBuiltins.cpp  \
+	MemoryDependenceAnalysis.cpp    \
+	RegionPass.cpp  \
+	LoopDependenceAnalysis.cpp  \
+	LoopInfo.cpp    \
+	LoopPass.cpp    \
+	PathNumbering.cpp \
+	PathProfileInfo.cpp \
+	PathProfileVerifier.cpp \
+	PHITransAddr.cpp    \
+	PostDominators.cpp  \
+	ProfileEstimatorPass.cpp    \
+	ProfileInfo.cpp \
+	ProfileInfoLoader.cpp   \
+	ProfileInfoLoaderPass.cpp   \
+	ProfileVerifierPass.cpp \
+	ScalarEvolution.cpp \
+	ScalarEvolutionAliasAnalysis.cpp    \
+	ScalarEvolutionExpander.cpp \
+	ScalarEvolutionNormalization.cpp    \
+	SparsePropagation.cpp   \
+	Trace.cpp   \
+        TypeBasedAliasAnalysis.cpp \
+	ValueTracking.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	$(analysis_SRC_FILES) \
+	Lint.cpp	\
+	ModuleDebugInfoPrinter.cpp	\
+	RegionInfo.cpp	\
+	RegionPrinter.cpp
+
+LOCAL_MODULE:= libLLVMAnalysis
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(analysis_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMAnalysis
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Analysis/IPA/Android.mk b/lib/Analysis/IPA/Android.mk
new file mode 100644
index 0000000..ffa9f44
--- /dev/null
+++ b/lib/Analysis/IPA/Android.mk
@@ -0,0 +1,35 @@
+LOCAL_PATH:= $(call my-dir)
+
+analysis_ipa_SRC_FILES :=	\
+	CallGraph.cpp	\
+	CallGraphSCCPass.cpp	\
+	FindUsedTypes.cpp	\
+	GlobalsModRef.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(analysis_ipa_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMipa
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(analysis_ipa_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMipa
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Analysis/NOTICE b/lib/Analysis/NOTICE
new file mode 100644
index 0000000..1b1047c
--- /dev/null
+++ b/lib/Analysis/NOTICE
@@ -0,0 +1,69 @@
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
diff --git a/lib/AsmParser/Android.mk b/lib/AsmParser/Android.mk
new file mode 100644
index 0000000..a54192e
--- /dev/null
+++ b/lib/AsmParser/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH:= $(call my-dir)
+
+asm_parser_SRC_FILES :=	\
+	LLLexer.cpp	\
+	LLParser.cpp	\
+	Parser.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(asm_parser_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMAsmParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LOCAL_PATH)/../../llvm-host-build.mk
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(asm_parser_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMAsmParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LOCAL_PATH)/../../llvm-device-build.mk
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Bitcode/Reader/Android.mk b/lib/Bitcode/Reader/Android.mk
new file mode 100644
index 0000000..02fc617
--- /dev/null
+++ b/lib/Bitcode/Reader/Android.mk
@@ -0,0 +1,33 @@
+LOCAL_PATH:= $(call my-dir)
+
+bitcode_reader_SRC_FILES :=	\
+	BitReader.cpp	\
+	BitcodeReader.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(bitcode_reader_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMBitReader
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(bitcode_reader_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMBitReader
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Bitcode/Writer/Android.mk b/lib/Bitcode/Writer/Android.mk
new file mode 100644
index 0000000..22b2054
--- /dev/null
+++ b/lib/Bitcode/Writer/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH:= $(call my-dir)
+
+# For the host only
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	BitWriter.cpp	\
+	BitcodeWriter.cpp	\
+	BitcodeWriterPass.cpp	\
+	ValueEnumerator.cpp
+
+LOCAL_MODULE:= libLLVMBitWriter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/CodeGen/Android.mk b/lib/CodeGen/Android.mk
new file mode 100644
index 0000000..16e0f88
--- /dev/null
+++ b/lib/CodeGen/Android.mk
@@ -0,0 +1,116 @@
+LOCAL_PATH:= $(call my-dir)
+
+codegen_SRC_FILES :=   \
+	AggressiveAntiDepBreaker.cpp    \
+	Analysis.cpp    \
+	BranchFolding.cpp   \
+	CalcSpillWeights.cpp    \
+	CallingConvLower.cpp	\
+	CodePlacementOpt.cpp    \
+	CriticalAntiDepBreaker.cpp  \
+	DeadMachineInstructionElim.cpp  \
+	DwarfEHPrepare.cpp  \
+	EdgeBundles.cpp \
+	ELFCodeEmitter.cpp  \
+	ELFWriter.cpp   \
+	ExpandISelPseudos.cpp \
+	GCMetadata.cpp  \
+	GCMetadataPrinter.cpp   \
+	GCStrategy.cpp  \
+	IfConversion.cpp    \
+	InlineSpiller.cpp	\
+	IntrinsicLowering.cpp   \
+	LLVMTargetMachine.cpp   \
+	LatencyPriorityQueue.cpp    \
+	LiveDebugVariables.cpp \
+	LiveInterval.cpp    \
+	LiveIntervalAnalysis.cpp    \
+	LiveRangeEdit.cpp \
+	LiveStackAnalysis.cpp   \
+	LiveVariables.cpp   \
+	LocalStackSlotAllocation.cpp	\
+	LowerSubregs.cpp    \
+	MachineBasicBlock.cpp   \
+	MachineCSE.cpp  \
+	MachineDominators.cpp   \
+	MachineFunction.cpp \
+	MachineFunctionAnalysis.cpp \
+	MachineFunctionPass.cpp \
+	MachineFunctionPrinterPass.cpp  \
+	MachineInstr.cpp    \
+	MachineLICM.cpp \
+	MachineLoopInfo.cpp \
+	MachineModuleInfo.cpp   \
+	MachineModuleInfoImpls.cpp  \
+	MachinePassRegistry.cpp \
+	MachineRegisterInfo.cpp \
+	MachineSSAUpdater.cpp   \
+	MachineSink.cpp \
+	MachineVerifier.cpp \
+	ObjectCodeEmitter.cpp   \
+	OcamlGC.cpp \
+	OptimizePHIs.cpp    \
+	PHIElimination.cpp  \
+	PHIEliminationUtils.cpp \
+	Passes.cpp  \
+	PeepholeOptimizer.cpp	\
+	PostRASchedulerList.cpp \
+	PreAllocSplitting.cpp   \
+	ProcessImplicitDefs.cpp \
+	PrologEpilogInserter.cpp    \
+	PseudoSourceValue.cpp   \
+	RegAllocFast.cpp	\
+	RegAllocLinearScan.cpp  \
+	RegAllocPBQP.cpp    \
+	RegisterCoalescer.cpp   \
+	RegisterScavenging.cpp  \
+	RenderMachineFunction.cpp	\
+	ScheduleDAG.cpp \
+	ScheduleDAGEmit.cpp \
+	ScheduleDAGInstrs.cpp   \
+	ScheduleDAGPrinter.cpp  \
+	ScoreboardHazardRecognizer.cpp \
+	ShadowStackGC.cpp   \
+	ShrinkWrapping.cpp  \
+	SimpleRegisterCoalescing.cpp    \
+	SjLjEHPrepare.cpp   \
+	SlotIndexes.cpp \
+	Spiller.cpp \
+	SplitKit.cpp	\
+	Splitter.cpp	\
+	StackProtector.cpp  \
+	StackSlotColoring.cpp   \
+	StrongPHIElimination.cpp    \
+	TailDuplication.cpp \
+	TargetInstrInfoImpl.cpp \
+	TargetLoweringObjectFileImpl.cpp    \
+	TwoAddressInstructionPass.cpp   \
+	UnreachableBlockElim.cpp    \
+	VirtRegMap.cpp  \
+	VirtRegRewriter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(codegen_SRC_FILES)
+LOCAL_MODULE:= libLLVMCodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(codegen_SRC_FILES)
+LOCAL_MODULE:= libLLVMCodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/CodeGen/AsmPrinter/Android.mk b/lib/CodeGen/AsmPrinter/Android.mk
new file mode 100644
index 0000000..bc609b3
--- /dev/null
+++ b/lib/CodeGen/AsmPrinter/Android.mk
@@ -0,0 +1,42 @@
+LOCAL_PATH := $(call my-dir)
+
+codegen_asmprinter_SRC_FILES :=	\
+	AsmPrinter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	AsmPrinter.cpp	\
+	AsmPrinterDwarf.cpp	\
+	AsmPrinterInlineAsm.cpp	\
+	ARMException.cpp	\
+	DIE.cpp	\
+	DwarfCFIException.cpp \
+	DwarfDebug.cpp	\
+	DwarfException.cpp	\
+	DwarfTableException.cpp \
+	OcamlGCPrinter.cpp
+
+LOCAL_MODULE:= libLLVMAsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	AsmPrinter.cpp	\
+	AsmPrinterInlineAsm.cpp
+
+LOCAL_MODULE:= libLLVMAsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index f0dc555..b544ff1 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -13,8 +13,10 @@
 
 #define DEBUG_TYPE "asm-printer"
 #include "llvm/CodeGen/AsmPrinter.h"
-#include "DwarfDebug.h"
-#include "DwarfException.h"
+#ifndef ANDROID_TARGET_BUILD
+#   include "DwarfDebug.h"
+#   include "DwarfException.h"
+#endif // ANDROID_TARGET_BUILD
 #include "llvm/Module.h"
 #include "llvm/CodeGen/GCMetadataPrinter.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
@@ -46,6 +48,7 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/Timer.h"
+#include <ctype.h>
 using namespace llvm;
 
 static const char *DWARFGroupName = "DWARF Emission";
@@ -186,6 +189,7 @@
     OutStreamer.AddBlankLine();
   }
 
+#ifndef ANDROID_TARGET_BUILD
   if (MAI->doesSupportDebugInformation())
     DD = new DwarfDebug(this, &M);
 
@@ -203,6 +207,9 @@
     DE = new Win64Exception(this);
     return false;
   }
+#else
+  return false;
+#endif // ANDROID_TARGET_BUILD
 
   llvm_unreachable("Unknown exception type.");
 }
@@ -459,6 +466,7 @@
   }
 
   // Emit pre-function debug and/or EH information.
+#ifndef ANDROID_TARGET_BUILD
   if (DE) {
     NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
     DE->BeginFunction(MF);
@@ -467,6 +475,7 @@
     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
     DD->beginFunction(MF);
   }
+#endif // ANDROID_TARGET_BUILD
 }
 
 /// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
@@ -655,14 +664,16 @@
       if (!II->isLabel() && !II->isImplicitDef() && !II->isKill() &&
           !II->isDebugValue()) {
         HasAnyRealCode = true;
+      
         ++EmittedInsts;
       }
-
+#ifndef ANDROID_TARGET_BUILD
       if (ShouldPrintDebugScopes) {
         NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
         DD->beginInstruction(II);
       }
-
+#endif // ANDROID_TARGET_BUILD
+      
       if (isVerbose())
         EmitComments(*II, OutStreamer.GetCommentOS());
 
@@ -697,11 +708,13 @@
         EmitInstruction(II);
         break;
       }
-
+      
+#ifndef ANDROID_TARGET_BUILD
       if (ShouldPrintDebugScopes) {
         NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
         DD->endInstruction(II);
       }
+#endif // ANDROID_TARGET_BUILD
     }
   }
 
@@ -744,6 +757,7 @@
   }
 
   // Emit post-function debug information.
+#ifndef ANDROID_TARGET_BUILD
   if (DD) {
     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
     DD->endFunction(MF);
@@ -752,6 +766,7 @@
     NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
     DE->EndFunction();
   }
+#endif // ANDROID_TARGET_BUILD
   MMI->EndFunction();
 
   // Print out jump tables referenced by the function.
@@ -835,6 +850,7 @@
   }
 
   // Finalize debug and EH information.
+#ifndef ANDROID_TARGET_BUILD
   if (DE) {
     {
       NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
@@ -849,7 +865,8 @@
     }
     delete DD; DD = 0;
   }
-
+#endif // ANDROID_TARGET_BUILD
+  
   // If the target wants to know about weak references, print them all.
   if (MAI->getWeakRefDirective()) {
     // FIXME: This is not lazy, it would be nice to only print weak references
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
index c6166e2..6a86c85 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -68,6 +68,7 @@
 
 /// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
 void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode) const {
+#ifndef ANDROID_TARGET_BUILD
   assert(!Str.empty() && "Can't emit empty inline asm block");
 
   // Remember if the buffer is nul terminated or not so we can avoid a copy.
@@ -122,12 +123,14 @@
                         /*NoFinalize*/ true);
   if (Res && !HasDiagHandler)
     report_fatal_error("Error parsing inline asm\n");
+#endif // ANDROID_TARGET_BUILD
 }
 
 
 /// EmitInlineAsm - This method formats and emits the specified machine
 /// instruction that is an inline asm.
 void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
+#ifndef ANDROID_TARGET_BUILD
   assert(MI->isInlineAsm() && "printInlineAsm only works on inline asms");
 
   unsigned NumOperands = MI->getNumOperands();
@@ -355,6 +358,7 @@
   if (OutStreamer.hasRawTextSupport())
     OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
                             MAI->getInlineAsmEnd());
+#endif // ANDROID_TARGET_BUILD
 }
 
 
diff --git a/lib/CodeGen/SelectionDAG/Android.mk b/lib/CodeGen/SelectionDAG/Android.mk
new file mode 100644
index 0000000..d3522fe
--- /dev/null
+++ b/lib/CodeGen/SelectionDAG/Android.mk
@@ -0,0 +1,52 @@
+LOCAL_PATH:= $(call my-dir)
+
+codegen_selectiondag_SRC_FILES :=	\
+	DAGCombiner.cpp	\
+	FastISel.cpp	\
+	FunctionLoweringInfo.cpp	\
+	InstrEmitter.cpp	\
+	LegalizeDAG.cpp	\
+	LegalizeFloatTypes.cpp	\
+	LegalizeIntegerTypes.cpp	\
+	LegalizeTypes.cpp	\
+	LegalizeTypesGeneric.cpp	\
+	LegalizeVectorOps.cpp	\
+	LegalizeVectorTypes.cpp	\
+	ScheduleDAGFast.cpp	\
+	ScheduleDAGList.cpp	\
+	ScheduleDAGRRList.cpp	\
+	ScheduleDAGSDNodes.cpp	\
+	SelectionDAG.cpp	\
+	SelectionDAGBuilder.cpp	\
+	SelectionDAGISel.cpp	\
+	SelectionDAGPrinter.cpp	\
+	TargetLowering.cpp      \
+        TargetSelectionDAGInfo.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(codegen_selectiondag_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMSelectionDAG
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(codegen_selectiondag_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMSelectionDAG
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/ExecutionEngine/JIT/Android.mk b/lib/ExecutionEngine/JIT/Android.mk
new file mode 100644
index 0000000..3c79f29
--- /dev/null
+++ b/lib/ExecutionEngine/JIT/Android.mk
@@ -0,0 +1,36 @@
+LOCAL_PATH:= $(call my-dir)
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	Intercept.cpp	\
+	JIT.cpp	\
+	JITDebugRegisterer.cpp	\
+	JITDwarfEmitter.cpp	\
+	JITEmitter.cpp	\
+	JITMemoryManager.cpp	\
+	OProfileJITEventListener.cpp	\
+	TargetSelect.cpp
+
+LOCAL_MODULE:= libLLVMJIT
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	JITMemoryManager.cpp
+
+LOCAL_MODULE:= libLLVMJIT
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Linker/Android.mk b/lib/Linker/Android.mk
new file mode 100644
index 0000000..792a675
--- /dev/null
+++ b/lib/Linker/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH:= $(call my-dir)
+
+linker_SRC_FILES :=	\
+     LinkModules.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_SRC_FILES :=      \
+     $(linker_SRC_FILES)\
+     LinkArchives.cpp   \
+     Linker.cpp         \
+     LinkItems.cpp
+
+LOCAL_MODULE:= libLLVMLinker 
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(linker_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMLinker
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/MC/Android.mk b/lib/MC/Android.mk
new file mode 100644
index 0000000..658cdbb
--- /dev/null
+++ b/lib/MC/Android.mk
@@ -0,0 +1,64 @@
+LOCAL_PATH:= $(call my-dir)
+
+mc_SRC_FILES :=    \
+	ELFObjectWriter.cpp	\
+	MachObjectWriter.cpp    \
+	MCAsmInfo.cpp   \
+	MCAsmInfoCOFF.cpp   \
+	MCAsmInfoDarwin.cpp \
+	MCAsmStreamer.cpp   \
+	MCAssembler.cpp \
+	MCCodeEmitter.cpp   \
+	MCContext.cpp   \
+	MCDisassembler.cpp  \
+	MCDwarf.cpp \
+	MCELF.cpp   \
+	MCELFObjectTargetWriter.cpp \
+	MCELFStreamer.cpp   \
+	MCExpr.cpp  \
+	MCInst.cpp  \
+	MCInstPrinter.cpp   \
+	MCLabel.cpp	\
+	MCLoggingStreamer.cpp	\
+	MCMachObjectTargetWriter.cpp \
+	MCMachOStreamer.cpp \
+	MCNullStreamer.cpp  \
+	MCObjectStreamer.cpp\
+	MCObjectWriter.cpp  \
+	MCSection.cpp   \
+	MCSectionCOFF.cpp	\
+	MCSectionELF.cpp    \
+	MCSectionMachO.cpp  \
+	MCStreamer.cpp  \
+	MCSymbol.cpp    \
+	MCValue.cpp \
+	WinCOFFObjectWriter.cpp	\
+	WinCOFFStreamer.cpp	\
+	TargetAsmBackend.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(mc_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMMC
+
+LOCAL_MODULE_TAGS := optional
+
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(mc_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMMC
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/MC/MCParser/Android.mk b/lib/MC/MCParser/Android.mk
new file mode 100644
index 0000000..33d3aea
--- /dev/null
+++ b/lib/MC/MCParser/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+mc_parser_SRC_FILES :=	\
+	AsmLexer.cpp	\
+	AsmParser.cpp	\
+	COFFAsmParser.cpp \
+        DarwinAsmParser.cpp	\
+        ELFAsmParser.cpp	\
+	MCAsmLexer.cpp	\
+	MCAsmParser.cpp	\
+        MCAsmParserExtension.cpp	\
+	TargetAsmParser.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(mc_parser_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMMCParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(mc_parser_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMMCParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Support/Android.mk b/lib/Support/Android.mk
new file mode 100644
index 0000000..7af2025
--- /dev/null
+++ b/lib/Support/Android.mk
@@ -0,0 +1,102 @@
+LOCAL_PATH:= $(call my-dir)
+
+support_SRC_FILES :=   \
+	Allocator.cpp   \
+	APFloat.cpp \
+	APInt.cpp   \
+	APSInt.cpp  \
+	Atomic.cpp  \
+	CommandLine.cpp \
+	ConstantRange.cpp   \
+	CrashRecoveryContext.cpp	\
+	DAGDeltaAlgorithm.cpp	\
+	Debug.cpp   \
+	DeltaAlgorithm.cpp  \
+	Dwarf.cpp   \
+	DynamicLibrary.cpp	\
+	Errno.cpp	\
+	ErrorHandling.cpp   \
+	FileUtilities.cpp   \
+	FoldingSet.cpp  \
+	FormattedStream.cpp \
+	GraphWriter.cpp \
+	Host.cpp	\
+	IntervalMap.cpp \
+	IntEqClasses.cpp\
+	IsInf.cpp   \
+	IsNAN.cpp   \
+	ManagedStatic.cpp   \
+	Memory.cpp	\
+	MemoryBuffer.cpp    \
+	MemoryObject.cpp    \
+	Mutex.cpp \
+	Path.cpp \
+	PathV2.cpp \
+	PluginLoader.cpp    \
+	PrettyStackTrace.cpp    \
+	Process.cpp \
+	Program.cpp \
+	Regex.cpp   \
+	RWMutex.cpp \
+	SearchForAddressOfSpecialSymbol.cpp \
+	Signals.cpp \
+	SmallPtrSet.cpp \
+	SmallVector.cpp \
+	SourceMgr.cpp   \
+	Statistic.cpp   \
+	StringExtras.cpp    \
+	StringMap.cpp   \
+	StringPool.cpp  \
+	StringRef.cpp   \
+	SystemUtils.cpp \
+	TargetRegistry.cpp  \
+	Threading.cpp \
+	ThreadLocal.cpp \
+	Timer.cpp   \
+	TimeValue.cpp	\
+	ToolOutputFile.cpp \
+	Triple.cpp  \
+	Twine.cpp   \
+	Valgrind.cpp\
+	circular_raw_ostream.cpp    \
+	raw_os_ostream.cpp  \
+	raw_ostream.cpp \
+	regcomp.c   \
+	regerror.c  \
+	regexec.c   \
+	regfree.c   \
+	regstrlcpy.c\
+	system_error.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+# FIXME: This only requires RTTI because tblgen uses it.  Fix that.
+REQUIRES_RTTI := 1
+
+LOCAL_SRC_FILES := $(support_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMSupport
+
+LOCAL_CFLAGS := -D__android__
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(support_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMSupport
+
+LOCAL_CFLAGS := -D__android__
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Support/Atomic.cpp b/lib/Support/Atomic.cpp
index c7b4bff..05339f4 100644
--- a/lib/Support/Atomic.cpp
+++ b/lib/Support/Atomic.cpp
@@ -13,6 +13,9 @@
 
 #include "llvm/Support/Atomic.h"
 #include "llvm/Config/config.h"
+#if defined(ANDROID_TARGET_BUILD)
+#  include "sys/atomics.h"
+#endif
 
 using namespace llvm;
 
@@ -43,6 +46,8 @@
   if (result == old_value)
     *ptr = new_value;
   return result;
+#elif defined(ANDROID_TARGET_BUILD)
+  return __atomic_cmpxchg(old_value, new_value, (volatile int*)ptr);
 #elif defined(__GNUC__)
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 #elif defined(_MSC_VER)
@@ -56,6 +61,8 @@
 #if LLVM_MULTITHREADED==0
   ++(*ptr);
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  return __atomic_inc((volatile int*)ptr);
 #elif defined(__GNUC__)
   return __sync_add_and_fetch(ptr, 1);
 #elif defined(_MSC_VER)
@@ -69,6 +76,8 @@
 #if LLVM_MULTITHREADED==0
   --(*ptr);
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  return __atomic_dec((volatile int*)ptr);
 #elif defined(__GNUC__)
   return __sync_sub_and_fetch(ptr, 1);
 #elif defined(_MSC_VER)
@@ -82,6 +91,13 @@
 #if LLVM_MULTITHREADED==0
   *ptr += val;
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  sys::cas_flag original, result;
+  do {
+    original = *ptr;
+    result = original + val;
+  } while (__atomic_cmpxchg(original, result, (volatile int*)ptr) != original);
+  return result;
 #elif defined(__GNUC__)
   return __sync_add_and_fetch(ptr, val);
 #elif defined(_MSC_VER)
diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp
index 455c380..9bedfb5 100644
--- a/lib/Support/DynamicLibrary.cpp
+++ b/lib/Support/DynamicLibrary.cpp
@@ -141,7 +141,7 @@
 // On linux we have a weird situation. The stderr/out/in symbols are both
 // macros and global variables because of standards requirements. So, we
 // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.
-#if defined(__linux__)
+#if defined(__linux__) && !defined(__android__)
   {
     EXPLICIT_SYMBOL(stderr);
     EXPLICIT_SYMBOL(stdout);
diff --git a/lib/Support/Unix/Host.inc b/lib/Support/Unix/Host.inc
index 5fd0e5e..a286a15 100644
--- a/lib/Support/Unix/Host.inc
+++ b/lib/Support/Unix/Host.inc
@@ -22,6 +22,7 @@
 #include <sys/utsname.h>
 #include <cctype>
 #include <string>
+#include <ctype.h>
 
 using namespace llvm;
 
diff --git a/lib/Support/Unix/PathV2.inc b/lib/Support/Unix/PathV2.inc
index 03ff283..15df8a2 100644
--- a/lib/Support/Unix/PathV2.inc
+++ b/lib/Support/Unix/PathV2.inc
@@ -43,6 +43,8 @@
 #include <stdio.h>
 #endif
 
+extern "C" int truncate (const char*, off_t);
+
 using namespace llvm;
 
 namespace {
diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp
index 16d4ca5..97bac88 100644
--- a/lib/Target/ARM/ARMCodeEmitter.cpp
+++ b/lib/Target/ARM/ARMCodeEmitter.cpp
@@ -88,9 +88,11 @@
 
     void emitWordLE(unsigned Binary);
     void emitDWordLE(uint64_t Binary);
+    void emitConstantToMemory(unsigned CPI, const Constant *CV);
     void emitConstPoolInstruction(const MachineInstr &MI);
     void emitMOVi32immInstruction(const MachineInstr &MI);
     void emitMOVi2piecesInstruction(const MachineInstr &MI);
+    void emitLEApcrelInstruction(const MachineInstr &MI);
     void emitLEApcrelJTInstruction(const MachineInstr &MI);
     void emitPseudoMoveInstruction(const MachineInstr &MI);
     void addPCLabel(unsigned LabelID);
@@ -139,6 +141,8 @@
 
     void emitVFPLoadStoreMultipleInstruction(const MachineInstr &MI);
 
+    void emitMiscInstruction(const MachineInstr &MI);
+
     void emitNEONLaneInstruction(const MachineInstr &MI);
     void emitNEONDupInstruction(const MachineInstr &MI);
     void emitNEON1RegModImmInstruction(const MachineInstr &MI);
@@ -161,14 +165,20 @@
     //  are already handled elsewhere. They are placeholders to allow this
     //  encoder to continue to function until the MC encoder is sufficiently
     //  far along that this one can be eliminated entirely.
-    unsigned NEONThumb2DataIPostEncoder(const MachineInstr &MI, unsigned Val) 
+    unsigned NEONThumb2DataIPostEncoder(const MachineInstr &MI, unsigned Val)
       const { return 0; }
-    unsigned NEONThumb2LoadStorePostEncoder(const MachineInstr &MI,unsigned Val) 
+    unsigned NEONThumb2LoadStorePostEncoder(const MachineInstr &MI,unsigned Val)
       const { return 0; }
-    unsigned NEONThumb2DupPostEncoder(const MachineInstr &MI,unsigned Val) 
+    unsigned NEONThumb2DupPostEncoder(const MachineInstr &MI,unsigned Val)
       const { return 0; }
     unsigned VFPThumb2PostEncoder(const MachineInstr&MI, unsigned Val)
-      const { return 0; }
+      const {
+      if (IsThumb) {
+        Val &= 0x0FFFFFFF;
+        Val |= 0xE0000000;
+      }
+      return Val;
+    }
     unsigned getAdrLabelOpValue(const MachineInstr &MI, unsigned Op)
       const { return 0; }
     unsigned getThumbAdrLabelOpValue(const MachineInstr &MI, unsigned Op)
@@ -260,8 +270,20 @@
       return Binary;
     }
 
-    unsigned getHiLo16ImmOpValue(const MachineInstr &MI, unsigned Op) const {
-      return 0;
+    unsigned getHiLo16ImmOpValue(const MachineInstr &MI, unsigned Op)
+      const {
+      const TargetInstrDesc &TID = MI.getDesc();
+      const MachineOperand &MO = MI.getOperand(Op);
+
+      unsigned Reloc = (TID.Opcode == ARM::MOVi16 ?
+                       ARM::reloc_arm_movw : ARM::reloc_arm_movt);
+
+      if (!MO.isImm()) {
+        emitGlobalAddress(MO.getGlobal(), Reloc, true, false);
+        return 0;
+      }
+      unsigned Imm16 = static_cast<unsigned>(MO.getImm());
+      return Imm16;
     }
 
     uint32_t getAddrMode2OpValue(const MachineInstr &MI, unsigned OpIdx)
@@ -281,34 +303,27 @@
     uint32_t getAddrModePCOpValue(const MachineInstr &MI, unsigned Op)
       const { return 0; }
     uint32_t getAddrMode5OpValue(const MachineInstr &MI, unsigned Op) const {
-      // {17-13} = reg
-      // {12}    = (U)nsigned (add == '1', sub == '0')
-      // {11-0}  = imm12
+      // {12-9}  = reg
+      // {8}     = (U)nsigned (add == '1', sub == '0')
+      // {7-0}   = imm8
+      uint32_t Binary = 0;
       const MachineOperand &MO  = MI.getOperand(Op);
-      const MachineOperand &MO1 = MI.getOperand(Op + 1);
-      if (!MO.isReg()) {
-        emitConstPoolAddress(MO.getIndex(), ARM::reloc_arm_cp_entry);
-        return 0;
-      }
-      unsigned Reg = getARMRegisterNumbering(MO.getReg());
-      int32_t Imm12 = MO1.getImm();
+      uint32_t Reg = getMachineOpValue(MI, MO);
+      Binary |= (Reg << 9);
 
-      // Special value for #-0
-      if (Imm12 == INT32_MIN)
-        Imm12 = 0;
-
-      // Immediate is always encoded as positive. The 'U' bit controls add vs
-      // sub.
-      bool isAdd = true;
-      if (Imm12 < 0) {
-        Imm12 = -Imm12;
-        isAdd = false;
+      // If there is a non-zero immediate offset, encode it.
+      if (MO.isReg()) {
+          const MachineOperand &MO1 = MI.getOperand(Op + 1);
+        if (uint32_t ImmOffs = ARM_AM::getAM5Offset(MO1.getImm())) {
+          if (ARM_AM::getAM5Op(MO1.getImm()) == ARM_AM::add)
+            Binary |= 1 << 8;
+          Binary |= ImmOffs & 0xff;
+          return Binary;
+        }
       }
 
-      uint32_t Binary = Imm12 & 0xfff;
-      if (isAdd)
-        Binary |= (1 << 12);
-      Binary |= (Reg << 13);
+      // If immediate offset is omitted, default to +0.
+      Binary |= 1 << 8;
       return Binary;
     }
     unsigned getNEONVcvtImm32OpValue(const MachineInstr &MI, unsigned Op)
@@ -438,6 +453,9 @@
     return getARMRegisterNumbering(MO.getReg());
   else if (MO.isImm())
     return static_cast<unsigned>(MO.getImm());
+  else if (MO.isFPImm())
+    return static_cast<unsigned>(MO.getFPImm()->getValueAPF()
+                      .bitcastToAPInt().getHiBits(32).getLimitedValue());
   else if (MO.isGlobal())
     emitGlobalAddress(MO.getGlobal(), ARM::reloc_arm_branch, true, false);
   else if (MO.isSymbol())
@@ -592,7 +610,9 @@
   case ARMII::VFPLdStMulFrm:
     emitVFPLoadStoreMultipleInstruction(MI);
     break;
-
+  case ARMII::VFPMiscFrm:
+    emitMiscInstruction(MI);
+    break;
   // NEON instructions.
   case ARMII::NGetLnFrm:
   case ARMII::NSetLnFrm:
@@ -614,6 +634,61 @@
   MCE.processDebugLoc(MI.getDebugLoc(), false);
 }
 
+void ARMCodeEmitter::emitConstantToMemory(unsigned CPI, const Constant *C) {
+  DEBUG({
+      errs() << "  ** Constant pool #" << CPI << " @ "
+             << (void*)MCE.getCurrentPCValue() << " ";
+      if (const Function *F = dyn_cast<Function>(C))
+        errs() << F->getName();
+      else
+        errs() << *C;
+      errs() << '\n';
+    });
+
+  switch (C->getValueID()) {
+  default: {
+    llvm_unreachable("Unable to handle this constantpool entry!");
+    break;
+  }
+  case Value::GlobalVariableVal: {
+    emitGlobalAddress(static_cast<const GlobalValue*>(C),
+                      ARM::reloc_arm_absolute, isa<Function>(C), false);
+    emitWordLE(0);
+    break;
+  }
+  case Value::ConstantIntVal: {
+    const ConstantInt *CI = static_cast<const ConstantInt*>(C);
+    uint32_t Val = *(uint32_t*)CI->getValue().getRawData();
+    emitWordLE(Val);
+    break;
+  }
+  case Value::ConstantFPVal: {
+    const ConstantFP *CFP = static_cast<const ConstantFP*>(C);
+    if (CFP->getType()->isFloatTy())
+      emitWordLE(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
+    else if (CFP->getType()->isDoubleTy())
+      emitDWordLE(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
+    else {
+      llvm_unreachable("Unable to handle this constantpool entry!");
+    }
+    break;
+  }
+  case Value::ConstantArrayVal: {
+    const ConstantArray *CA = static_cast<const ConstantArray*>(C);
+    for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
+      emitConstantToMemory(CPI, CA->getOperand(i));
+    break;
+  }
+  case Value::ConstantVectorVal:{
+    //FIXME:emit vector
+    const ConstantVector *CV = static_cast<const ConstantVector*>(C);
+    break;
+  }
+  }
+
+  return;
+}
+
 void ARMCodeEmitter::emitConstPoolInstruction(const MachineInstr &MI) {
   unsigned CPI = MI.getOperand(0).getImm();       // CP instruction index.
   unsigned CPIndex = MI.getOperand(1).getIndex(); // Actual cp entry index.
@@ -644,35 +719,7 @@
     }
     emitWordLE(0);
   } else {
-    const Constant *CV = MCPE.Val.ConstVal;
-
-    DEBUG({
-        errs() << "  ** Constant pool #" << CPI << " @ "
-               << (void*)MCE.getCurrentPCValue() << " ";
-        if (const Function *F = dyn_cast<Function>(CV))
-          errs() << F->getName();
-        else
-          errs() << *CV;
-        errs() << '\n';
-      });
-
-    if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) {
-      emitGlobalAddress(GV, ARM::reloc_arm_absolute, isa<Function>(GV), false);
-      emitWordLE(0);
-    } else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
-      uint32_t Val = uint32_t(*CI->getValue().getRawData());
-      emitWordLE(Val);
-    } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
-      if (CFP->getType()->isFloatTy())
-        emitWordLE(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
-      else if (CFP->getType()->isDoubleTy())
-        emitDWordLE(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
-      else {
-        llvm_unreachable("Unable to handle this constantpool entry!");
-      }
-    } else {
-      llvm_unreachable("Unable to handle this constantpool entry!");
-    }
+    emitConstantToMemory(CPI, MCPE.Val.ConstVal);
   }
 }
 
@@ -754,6 +801,32 @@
   emitWordLE(Binary);
 }
 
+void ARMCodeEmitter::emitLEApcrelInstruction(const MachineInstr &MI) {
+  // It's basically add r, pc, (LCPI - $+8)
+  const TargetInstrDesc &TID = MI.getDesc();
+
+  unsigned Binary = 0;
+
+  // Set the conditional execution predicate
+  Binary |= II->getPredicate(&MI) << ARMII::CondShift;
+
+  // Encode S bit if MI modifies CPSR.
+  Binary |= getAddrModeSBit(MI, TID);
+
+  // Encode Rd.
+  Binary |= getMachineOpValue(MI, 0) << ARMII::RegRdShift;
+
+  // Encode Rn which is PC.
+  Binary |= getARMRegisterNumbering(ARM::PC) << ARMII::RegRnShift;
+
+  // Encode the displacement which is a so_imm.
+  // Set bit I(25) to identify this is the immediate form of <shifter_op>
+  Binary |= 1 << ARMII::I_BitShift;
+  emitConstPoolAddress(MI.getOperand(1).getIndex(), ARM::reloc_arm_so_imm_cp_entry);
+
+  emitWordLE(Binary);
+}
+
 void ARMCodeEmitter::emitLEApcrelJTInstruction(const MachineInstr &MI) {
   // It's basically add r, pc, (LJTI - $+8)
 
@@ -831,6 +904,14 @@
   switch (Opcode) {
   default:
     llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction");
+  case ARM::B:
+    emitBranchInstruction(MI);
+    break;
+  case ARM::BR_JTr:
+  case ARM::BR_JTm:
+  case ARM::BR_JTadd:
+    emitMiscBranchInstruction(MI);
+    break;
   case ARM::BX_CALL:
   case ARM::BMOVPCRX_CALL:
   case ARM::BXr9_CALL:
@@ -863,6 +944,9 @@
   case ARM::CONSTPOOL_ENTRY:
     emitConstPoolInstruction(MI);
     break;
+  case ARM::LDMIA_RET:
+    emitLoadStoreMultipleInstruction(MI);
+    break;
   case ARM::PICADD: {
     // Remember of the address of the PC label for relocation later.
     addPCLabel(MI.getOperand(2).getImm());
@@ -898,7 +982,10 @@
     else
       emitMOVi2piecesInstruction(MI);
     break;
-
+  case ARM::LEApcrel:
+    // Materialize constantpool index address.
+    emitLEApcrelInstruction(MI);
+    break;
   case ARM::LEApcrelJT:
     // Materialize jumptable address.
     emitLEApcrelJTInstruction(MI);
@@ -999,6 +1086,11 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (TID.Opcode == ARM::MOVi16 || TID.Opcode == ARM::MOVTi16) {
+      emitWordLE(Binary);
+      return;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1014,23 +1106,7 @@
     // Special handling for implicit use (e.g. PC).
     Binary |= (getARMRegisterNumbering(ImplicitRd) << ARMII::RegRdShift);
 
-  if (TID.Opcode == ARM::MOVi16) {
-      // Get immediate from MI.
-      unsigned Lo16 = getMovi32Value(MI, MI.getOperand(OpIdx),
-                      ARM::reloc_arm_movw);
-      // Encode imm which is the same as in emitMOVi32immInstruction().
-      Binary |= Lo16 & 0xFFF;
-      Binary |= ((Lo16 >> 12) & 0xF) << 16;
-      emitWordLE(Binary);
-      return;
-  } else if(TID.Opcode == ARM::MOVTi16) {
-      unsigned Hi16 = (getMovi32Value(MI, MI.getOperand(OpIdx),
-                       ARM::reloc_arm_movt) >> 16);
-      Binary |= Hi16 & 0xFFF;
-      Binary |= ((Hi16 >> 12) & 0xF) << 16;
-      emitWordLE(Binary);
-      return;
-  } else if ((TID.Opcode == ARM::BFC) || (TID.Opcode == ARM::BFI)) {
+  if ((TID.Opcode == ARM::BFC) || (TID.Opcode == ARM::BFI)) {
       uint32_t v = ~MI.getOperand(2).getImm();
       int32_t lsb = CountTrailingZeros_32(v);
       int32_t msb = (32 - CountLeadingZeros_32(v)) - 1;
@@ -1101,11 +1177,17 @@
 
   // If this is an LDRi12, STRi12 or LDRcp, nothing more needs be done.
   if (MI.getOpcode() == ARM::LDRi12 || MI.getOpcode() == ARM::LDRcp ||
-      MI.getOpcode() == ARM::STRi12) {
+      MI.getOpcode() == ARM::STRi12 || MI.getOpcode() == ARM::LDRBi12 ||
+      MI.getOpcode() == ARM::STRBi12) {
     emitWordLE(Binary);
     return;
   }
 
+  if (MI.getOpcode() == ARM::BR_JTm)
+    Binary = 0x710F000;
+  else if (MI.getOpcode() == ARM::BR_JTr)
+    Binary = 0x1A0F000;
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1261,6 +1343,11 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (TID.getOpcode() == ARM::LDMIA_RET) {
+    IsUpdating = true;
+    Binary |= 0x8B00000;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1468,6 +1555,10 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (TID.Opcode == ARM::B) {
+    Binary = 0xEA000000;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1541,9 +1632,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegisterClass->contains(RegD);
   RegD = getARMRegisterNumbering(RegD);
-  if (!isSPVFP)
-    Binary |=   RegD               << ARMII::RegRdShift;
-  else {
+  if (!isSPVFP) {
+    Binary |=  (RegD & 0x0F)       << ARMII::RegRdShift;
+    Binary |= ((RegD & 0x10) >> 4) << ARMII::D_BitShift;
+  } else {
     Binary |= ((RegD & 0x1E) >> 1) << ARMII::RegRdShift;
     Binary |=  (RegD & 0x01)       << ARMII::D_BitShift;
   }
@@ -1555,9 +1647,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegisterClass->contains(RegN);
   RegN = getARMRegisterNumbering(RegN);
-  if (!isSPVFP)
-    Binary |=   RegN               << ARMII::RegRnShift;
-  else {
+  if (!isSPVFP) {
+    Binary |=  (RegN & 0x0F)       << ARMII::RegRnShift;
+    Binary |= ((RegN & 0x10) >> 4) << ARMII::N_BitShift;
+  } else {
     Binary |= ((RegN & 0x1E) >> 1) << ARMII::RegRnShift;
     Binary |=  (RegN & 0x01)       << ARMII::N_BitShift;
   }
@@ -1569,9 +1662,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegisterClass->contains(RegM);
   RegM = getARMRegisterNumbering(RegM);
-  if (!isSPVFP)
-    Binary |=   RegM;
-  else {
+  if (!isSPVFP) {
+    Binary |=  (RegM & 0x0F);
+    Binary |= ((RegM & 0x10) >> 4) << ARMII::M_BitShift;
+  } else {
     Binary |= ((RegM & 0x1E) >> 1);
     Binary |=  (RegM & 0x01)       << ARMII::M_BitShift;
   }
@@ -1588,9 +1682,6 @@
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
   unsigned OpIdx = 0;
-  assert((Binary & ARMII::D_BitShift) == 0 &&
-         (Binary & ARMII::N_BitShift) == 0 &&
-         (Binary & ARMII::M_BitShift) == 0 && "VFP encoding bug!");
 
   // Encode Dd / Sd.
   Binary |= encodeVFPRd(MI, OpIdx++);
@@ -1680,6 +1771,12 @@
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
+  if (MI.getOpcode() == ARM::VLDRS || MI.getOpcode() == ARM::VLDRD ||
+      MI.getOpcode() == ARM::VSTRS || MI.getOpcode() == ARM::VSTRD){
+    emitWordLE(Binary);
+    return;
+  }
+
   unsigned OpIdx = 0;
 
   // Encode Dd / Sd.
@@ -1755,6 +1852,26 @@
   emitWordLE(Binary);
 }
 
+void ARMCodeEmitter::emitMiscInstruction(const MachineInstr &MI) {
+  unsigned Opcode = MI.getDesc().Opcode;
+  // Part of binary is determined by TableGn.
+  unsigned Binary = getBinaryCodeForInstr(MI);
+
+  if (Opcode == ARM::FCONSTS) {
+    unsigned Imm = getMachineOpValue(MI, 1);
+    Binary &= ~(0x780000 >> 19);
+    Binary |= (Imm & 0x780000) >> 19;
+    Binary &= ~(0x3800000 >> 7);
+    Binary |= (Imm & 0x3800000) >> 7;
+    Binary = VFPThumb2PostEncoder(MI, Binary);
+  }
+
+  // Set the conditional execution predicate
+  Binary |= II->getPredicate(&MI) << ARMII::CondShift;
+
+  emitWordLE(Binary);
+}
+
 static unsigned encodeNEONRd(const MachineInstr &MI, unsigned OpIdx) {
   unsigned RegD = MI.getOperand(OpIdx).getReg();
   unsigned Binary = 0;
diff --git a/lib/Target/ARM/ARMJITInfo.cpp b/lib/Target/ARM/ARMJITInfo.cpp
index 45b7e48..11f1b33 100644
--- a/lib/Target/ARM/ARMJITInfo.cpp
+++ b/lib/Target/ARM/ARMJITInfo.cpp
@@ -15,6 +15,7 @@
 #include "ARMJITInfo.h"
 #include "ARMInstrInfo.h"
 #include "ARMConstantPoolValue.h"
+#include "ARMAddressingModes.h"
 #include "ARMRelocations.h"
 #include "ARMSubtarget.h"
 #include "llvm/Function.h"
@@ -48,7 +49,7 @@
 // write our own wrapper, which does things our way, so we have complete
 // control over register saving and restoring.
 extern "C" {
-#if defined(__arm__)
+#if defined(__arm__) && !defined(ANDROID)
   void ARMCompilationCallback();
   asm(
     ".text\n"
@@ -248,6 +249,7 @@
     return getJumpTableBaseAddr(MR->getJumpTableIndex());
   case ARM::reloc_arm_cp_entry:
   case ARM::reloc_arm_vfp_cp_entry:
+  case ARM::reloc_arm_so_imm_cp_entry:
     // Constant pool entry address.
     return getConstantPoolEntryAddr(MR->getConstantPoolIndex());
   case ARM::reloc_arm_machine_cp_entry: {
@@ -294,6 +296,29 @@
         getARMRegisterNumbering(ARM::PC) << ARMII::RegRnShift;
       break;
     }
+    case ARM::reloc_arm_so_imm_cp_entry: {
+      ResultPtr = ResultPtr - (intptr_t)RelocPos - 8;
+      // If the result is positive, set bit U(23) to 1.
+      if (ResultPtr >= 0)
+        *((intptr_t*)RelocPos) |= 1 << ARMII::U_BitShift;
+      else {
+        // Otherwise, obtain the absolute value and set bit U(23) to 0.
+        *((intptr_t*)RelocPos) &= ~(1 << ARMII::U_BitShift);
+        // FIXME: Also set bit 22 to 1 since 'sub' instruction is going to be used.
+        *((intptr_t*)RelocPos) |= 1 << 22;
+        ResultPtr = - ResultPtr;
+      }
+
+      int SoImmVal = ARM_AM::getSOImmVal(ResultPtr);
+      assert(SoImmVal != -1 && "Not a valid so_imm value!");
+      *((intptr_t*)RelocPos) |= (ARM_AM::getSOImmValRot((unsigned)SoImmVal) >> 1)
+            << ARMII::SoRotImmShift;
+      *((intptr_t*)RelocPos) |= ARM_AM::getSOImmValImm((unsigned)SoImmVal);
+      // Set register Rn to PC.
+      *((intptr_t*)RelocPos) |=
+        getARMRegisterNumbering(ARM::PC) << ARMII::RegRnShift;
+      break;
+    }
     case ARM::reloc_arm_pic_jt:
     case ARM::reloc_arm_machine_cp_entry:
     case ARM::reloc_arm_absolute: {
diff --git a/lib/Target/ARM/ARMRelocations.h b/lib/Target/ARM/ARMRelocations.h
index 86e7206..291f3cc 100644
--- a/lib/Target/ARM/ARMRelocations.h
+++ b/lib/Target/ARM/ARMRelocations.h
@@ -35,6 +35,10 @@
       // should be divided by 4.
       reloc_arm_vfp_cp_entry,
 
+      // reloc_arm_so_imm - Same as reloc_arm_cp_entry except contant should be
+      // encoded as so_imm value.
+      reloc_arm_so_imm_cp_entry,
+
       // reloc_arm_machine_cp_entry - Relocation of a ARM machine constantpool
       // entry.
       reloc_arm_machine_cp_entry,
diff --git a/lib/Target/ARM/Android.mk b/lib/Target/ARM/Android.mk
new file mode 100644
index 0000000..9bb6026
--- /dev/null
+++ b/lib/Target/ARM/Android.mk
@@ -0,0 +1,92 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_codegen_TBLGEN_TABLES :=	\
+	ARMGenAsmWriter.inc	\
+	ARMGenMCCodeEmitter.inc \
+	ARMGenRegisterInfo.h.inc\
+	ARMGenRegisterNames.inc	\
+	ARMGenRegisterInfo.inc	\
+	ARMGenInstrNames.inc	\
+	ARMGenInstrInfo.inc	\
+	ARMGenDAGISel.inc	\
+	ARMGenFastISel.inc	\
+	ARMGenSubtarget.inc	\
+	ARMGenCodeEmitter.inc	\
+	ARMGenCallingConv.inc
+
+arm_codegen_SRC_FILES :=   \
+	ARMAsmBackend.cpp \
+	ARMAsmPrinter.cpp \
+	ARMBaseInstrInfo.cpp    \
+	ARMBaseRegisterInfo.cpp \
+	ARMCodeEmitter.cpp  \
+	ARMConstantIslandPass.cpp   \
+	ARMConstantPoolValue.cpp    \
+	ARMELFWriterInfo.cpp \
+	ARMExpandPseudoInsts.cpp    \
+	ARMFastISel.cpp	\
+	ARMFrameLowering.cpp \
+	ARMGlobalMerge.cpp  \
+	ARMHazardRecognizer.cpp \
+	ARMISelDAGToDAG.cpp \
+	ARMISelLowering.cpp \
+	ARMInstrInfo.cpp    \
+	ARMJITInfo.cpp  \
+	ARMLoadStoreOptimizer.cpp   \
+	ARMMCAsmInfo.cpp    \
+	ARMMCCodeEmitter.cpp\
+	ARMMCExpr.cpp	\
+	ARMMCInstLower.cpp  \
+	ARMRegisterInfo.cpp \
+	ARMSelectionDAGInfo.cpp	\
+	ARMSubtarget.cpp    \
+	ARMTargetMachine.cpp    \
+	ARMTargetObjectFile.cpp \
+	InstPrinter/ARMInstPrinter.cpp \
+	MLxExpansionPass.cpp \
+	NEONMoveFix.cpp \
+	Thumb1FrameLowering.cpp \
+	Thumb1InstrInfo.cpp \
+	Thumb1RegisterInfo.cpp  \
+	Thumb2ITBlockPass.cpp   \
+	Thumb2InstrInfo.cpp \
+	Thumb2RegisterInfo.cpp  \
+	Thumb2SizeReduction.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_codegen_TBLGEN_TABLES)
+
+LOCAL_SRC_FILES := $(arm_codegen_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMARMCodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device only
+# =====================================================
+ifeq ($(TARGET_ARCH),arm)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_codegen_TBLGEN_TABLES)
+
+LOCAL_SRC_FILES := $(arm_codegen_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMARMCodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
diff --git a/lib/Target/ARM/AsmParser/Android.mk b/lib/Target/ARM/AsmParser/Android.mk
new file mode 100644
index 0000000..552dedd
--- /dev/null
+++ b/lib/Target/ARM/AsmParser/Android.mk
@@ -0,0 +1,30 @@
+LOCAL_PATH := $(call my-dir)
+
+# For the host only
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES :=	\
+	ARMGenInstrNames.inc	\
+	ARMGenRegisterNames.inc	\
+	ARMGenRegisterInfo.h.inc \
+	ARMGenAsmMatcher.inc
+
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES :=	\
+	ARMAsmLexer.cpp	\
+	ARMAsmParser.cpp
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMAsmParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Target/ARM/Disassembler/Android.mk b/lib/Target/ARM/Disassembler/Android.mk
new file mode 100644
index 0000000..0e3c32c
--- /dev/null
+++ b/lib/Target/ARM/Disassembler/Android.mk
@@ -0,0 +1,58 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_disassembler_TBLGEN_TABLES := \
+    ARMGenDecoderTables.inc \
+    ARMGenEDInfo.inc \
+    ARMGenInstrNames.inc \
+    ARMGenInstrInfo.inc \
+    ARMGenRegisterNames.inc \
+    ARMGenRegisterInfo.h.inc
+
+arm_disassembler_SRC_FILES := \
+    ARMDisassembler.cpp \
+    ARMDisassemblerCore.cpp
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),arm)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_disassembler_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_disassembler_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMDisassembler
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_disassembler_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_disassembler_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMDisassembler
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
diff --git a/lib/Target/ARM/InstPrinter/Android.mk b/lib/Target/ARM/InstPrinter/Android.mk
new file mode 100644
index 0000000..3a35023
--- /dev/null
+++ b/lib/Target/ARM/InstPrinter/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_asm_printer_TBLGEN_TABLES :=    \
+    ARMGenAsmWriter.inc \
+    ARMGenRegisterNames.inc\
+    ARMGenInstrNames.inc
+
+arm_asm_printer_SRC_FILES :=    \
+    ARMInstPrinter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_asm_printer_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_asm_printer_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMARMAsmPrinter
+
+LOCAL_C_INCLUDES += \
+    $(LOCAL_PATH)/..
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device only
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_asm_printer_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_asm_printer_SRC_FILES)
+
+LOCAL_C_INCLUDES+= \
+    $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMAsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+
diff --git a/lib/Target/ARM/TargetInfo/Android.mk b/lib/Target/ARM/TargetInfo/Android.mk
new file mode 100644
index 0000000..e07da39
--- /dev/null
+++ b/lib/Target/ARM/TargetInfo/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_target_info_TBLGEN_TABLES :=	\
+	ARMGenRegisterNames.inc	\
+	ARMGenInstrNames.inc
+
+arm_target_info_SRC_FILES :=	\
+	ARMTargetInfo.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_target_info_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_target_info_SRC_FILES)
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMInfo
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),arm)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(arm_target_info_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(arm_target_info_SRC_FILES)
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMARMInfo
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
diff --git a/lib/Target/Android.mk b/lib/Target/Android.mk
new file mode 100644
index 0000000..09a33ad
--- /dev/null
+++ b/lib/Target/Android.mk
@@ -0,0 +1,44 @@
+LOCAL_PATH:= $(call my-dir)
+
+target_SRC_FILES :=	\
+	Mangler.cpp	\
+	SubtargetFeature.cpp	\
+	Target.cpp	\
+	TargetAsmInfo.cpp	\
+	TargetAsmLexer.cpp	\
+	TargetData.cpp	\
+	TargetELFWriterInfo.cpp	\
+	TargetFrameLowering.cpp \
+	TargetInstrInfo.cpp	\
+	TargetIntrinsicInfo.cpp	\
+	TargetLoweringObjectFile.cpp	\
+	TargetLibraryInfo.cpp	\
+	TargetMachine.cpp	\
+	TargetRegisterInfo.cpp	\
+	TargetSubtarget.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(target_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMTarget
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(target_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMTarget
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/X86/Android.mk b/lib/Target/X86/Android.mk
new file mode 100644
index 0000000..d0e5334
--- /dev/null
+++ b/lib/Target/X86/Android.mk
@@ -0,0 +1,76 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_codegen_TBLGEN_TABLES :=	\
+    X86GenAsmWriter.inc \
+    X86GenAsmWriter1.inc \
+    X86GenRegisterInfo.h.inc	\
+    X86GenRegisterNames.inc	\
+    X86GenRegisterInfo.inc	\
+    X86GenInstrNames.inc	\
+    X86GenInstrInfo.inc	\
+    X86GenDAGISel.inc	\
+    X86GenFastISel.inc	\
+    X86GenSubtarget.inc	\
+    X86GenCallingConv.inc
+
+x86_codegen_SRC_FILES :=	\
+    SSEDomainFix.cpp	\
+    X86AsmBackend.cpp	\
+    X86AsmPrinter.cpp	\
+    X86COFFMachineModuleInfo.cpp	\
+    X86CodeEmitter.cpp	\
+    X86ELFWriterInfo.cpp	\
+    X86FastISel.cpp	\
+    X86FloatingPoint.cpp\
+    X86FrameLowering.cpp\
+    X86ISelDAGToDAG.cpp	\
+    X86ISelLowering.cpp	\
+    X86InstrInfo.cpp	\
+    X86JITInfo.cpp	\
+    X86MachObjectWriter.cpp \
+    X86MCAsmInfo.cpp	\
+    X86MCCodeEmitter.cpp	\
+    X86MCInstLower.cpp	\
+    X86RegisterInfo.cpp	\
+    X86SelectionDAGInfo.cpp	\
+    X86Subtarget.cpp	\
+    X86TargetMachine.cpp	\
+    X86TargetObjectFile.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_codegen_TBLGEN_TABLES)
+
+LOCAL_SRC_FILES := $(x86_codegen_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMX86CodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device only
+# =====================================================
+ifeq ($(TARGET_ARCH),x86)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_codegen_TBLGEN_TABLES)
+
+LOCAL_SRC_FILES := $(x86_codegen_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMX86CodeGen
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
diff --git a/lib/Target/X86/AsmParser/Android.mk b/lib/Target/X86/AsmParser/Android.mk
new file mode 100644
index 0000000..00b06c4
--- /dev/null
+++ b/lib/Target/X86/AsmParser/Android.mk
@@ -0,0 +1,29 @@
+LOCAL_PATH := $(call my-dir)
+
+# For the device only
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES :=	\
+	X86GenAsmMatcher.inc	\
+	X86GenInstrNames.inc	\
+	X86GenRegisterNames.inc
+
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES :=	\
+	X86AsmLexer.cpp	\
+	X86AsmParser.cpp
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86AsmParser
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Target/X86/Disassembler/Android.mk b/lib/Target/X86/Disassembler/Android.mk
new file mode 100644
index 0000000..0c65722
--- /dev/null
+++ b/lib/Target/X86/Disassembler/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_disassembler_TBLGEN_TABLES := \
+	X86GenDisassemblerTables.inc	\
+	X86GenEDInfo.inc	\
+	X86GenRegisterNames.inc
+
+x86_disassembler_SRC_FILES := \
+	X86Disassembler.cpp	\
+	X86DisassemblerDecoder.c
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),x86)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_disassembler_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_disassembler_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Disassembler
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_disassembler_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_disassembler_SRC_FILES)
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Disassembler
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Target/X86/InstPrinter/Android.mk b/lib/Target/X86/InstPrinter/Android.mk
new file mode 100644
index 0000000..6f14bcd
--- /dev/null
+++ b/lib/Target/X86/InstPrinter/Android.mk
@@ -0,0 +1,57 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_instprinter_TBLGEN_TABLES := \
+  X86GenAsmWriter.inc \
+  X86GenAsmWriter1.inc \
+  X86GenInstrNames.inc \
+  X86GenRegisterNames.inc \
+  X86GenRegisterInfo.h.inc
+
+x86_instprinter_SRC_FILES := \
+  X86ATTInstPrinter.cpp \
+  X86IntelInstPrinter.cpp \
+  X86InstComments.cpp
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),x86)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_instprinter_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_instprinter_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86AsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_instprinter_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_instprinter_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE := libLLVMX86AsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Target/X86/TargetInfo/Android.mk b/lib/Target/X86/TargetInfo/Android.mk
new file mode 100644
index 0000000..4c99807
--- /dev/null
+++ b/lib/Target/X86/TargetInfo/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_target_info_TBLGEN_TABLES :=	\
+	X86GenRegisterNames.inc	\
+	X86GenInstrNames.inc
+
+x86_target_info_SRC_FILES :=	\
+	X86TargetInfo.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_target_info_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_target_info_SRC_FILES)
+
+LOCAL_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Info
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),x86)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+TBLGEN_TABLES := $(x86_target_info_TBLGEN_TABLES)
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(x86_target_info_SRC_FILES)
+
+LOCAL_C_INCLUDES +=     \
+        $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Info
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
diff --git a/lib/Target/X86/Utils/Android.mk b/lib/Target/X86/Utils/Android.mk
new file mode 100644
index 0000000..d9dd670
--- /dev/null
+++ b/lib/Target/X86/Utils/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_utils_SRC_FILES := \
+  X86ShuffleDecode.cpp
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(x86_utils_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Utils
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(x86_utils_SRC_FILES)
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+LOCAL_MODULE:= libLLVMX86Utils
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Transforms/IPO/Android.mk b/lib/Transforms/IPO/Android.mk
new file mode 100644
index 0000000..e939382
--- /dev/null
+++ b/lib/Transforms/IPO/Android.mk
@@ -0,0 +1,51 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_ipo_SRC_FILES :=	\
+	ArgumentPromotion.cpp	\
+	ConstantMerge.cpp	\
+	DeadArgumentElimination.cpp	\
+	DeadTypeElimination.cpp	\
+	ExtractGV.cpp	\
+	FunctionAttrs.cpp	\
+	GlobalDCE.cpp	\
+	GlobalOpt.cpp	\
+	IPConstantPropagation.cpp	\
+	IPO.cpp	\
+	InlineAlways.cpp	\
+	InlineSimple.cpp	\
+	Inliner.cpp	\
+	Internalize.cpp	\
+	LoopExtractor.cpp	\
+	LowerSetJmp.cpp	\
+	MergeFunctions.cpp	\
+	PartialInlining.cpp	\
+	PruneEH.cpp	\
+	StripDeadPrototypes.cpp	\
+	StripSymbols.cpp	\
+	StructRetPromotion.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_ipo_SRC_FILES)
+LOCAL_MODULE:= libLLVMipo
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_ipo_SRC_FILES)
+LOCAL_MODULE:= libLLVMipo
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/InstCombine/Android.mk b/lib/Transforms/InstCombine/Android.mk
new file mode 100644
index 0000000..b30fcd9
--- /dev/null
+++ b/lib/Transforms/InstCombine/Android.mk
@@ -0,0 +1,42 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_inst_combine_SRC_FILES :=	\
+	InstCombineAddSub.cpp	\
+	InstCombineAndOrXor.cpp	\
+	InstCombineCalls.cpp	\
+	InstCombineCasts.cpp	\
+	InstCombineCompares.cpp	\
+	InstCombineLoadStoreAlloca.cpp	\
+	InstCombineMulDivRem.cpp	\
+	InstCombinePHI.cpp	\
+	InstCombineSelect.cpp	\
+	InstCombineShifts.cpp	\
+	InstCombineSimplifyDemanded.cpp	\
+	InstCombineVectorOps.cpp	\
+	InstructionCombining.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_inst_combine_SRC_FILES)
+LOCAL_MODULE:= libLLVMInstCombine
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_inst_combine_SRC_FILES)
+LOCAL_MODULE:= libLLVMInstCombine
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/Instrumentation/Android.mk b/lib/Transforms/Instrumentation/Android.mk
new file mode 100644
index 0000000..94f4651
--- /dev/null
+++ b/lib/Transforms/Instrumentation/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH:= $(call my-dir)
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=      \
+     EdgeProfiling.cpp   \
+     Instrumentation.cpp \
+     ProfilingUtils.cpp      \
+     PathProfiling.cpp \
+     OptimalEdgeProfiling.cpp
+
+LOCAL_MODULE:= libLLVMInstrumentation
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Transforms/Scalar/Android.mk b/lib/Transforms/Scalar/Android.mk
new file mode 100644
index 0000000..662c83c
--- /dev/null
+++ b/lib/Transforms/Scalar/Android.mk
@@ -0,0 +1,61 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_scalar_SRC_FILES := \
+	ADCE.cpp    \
+	BasicBlockPlacement.cpp \
+	CodeGenPrepare.cpp  \
+	ConstantProp.cpp    \
+	CorrelatedValuePropagation.cpp \
+	DCE.cpp \
+	DeadStoreElimination.cpp    \
+	EarlyCSE.cpp \
+	GVN.cpp \
+	IndVarSimplify.cpp  \
+	JumpThreading.cpp   \
+	LICM.cpp    \
+	LoopDeletion.cpp    \
+	LoopIdiomRecognize.cpp \
+	LoopRotation.cpp    \
+	LoopStrengthReduce.cpp  \
+	LoopUnrollPass.cpp  \
+	LoopUnswitch.cpp    \
+	LowerAtomic.cpp \
+	MemCpyOptimizer.cpp \
+	Reassociate.cpp \
+	Reg2Mem.cpp \
+	SCCP.cpp    \
+	Scalar.cpp  \
+	ScalarReplAggregates.cpp    \
+	SimplifyCFGPass.cpp \
+	SimplifyLibCalls.cpp    \
+	Sink.cpp	\
+	TailDuplication.cpp \
+	TailRecursionElimination.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	$(transforms_scalar_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMScalarOpts
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_scalar_SRC_FILES)
+LOCAL_MODULE:= libLLVMScalarOpts
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/Utils/Android.mk b/lib/Transforms/Utils/Android.mk
new file mode 100644
index 0000000..07a2883
--- /dev/null
+++ b/lib/Transforms/Utils/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_utils_SRC_FILES :=	\
+	AddrModeMatcher.cpp	\
+	BasicBlockUtils.cpp	\
+	BasicInliner.cpp	\
+	BreakCriticalEdges.cpp	\
+	BuildLibCalls.cpp	\
+	CloneFunction.cpp	\
+	CloneLoop.cpp	\
+	CloneModule.cpp	\
+	CodeExtractor.cpp	\
+	DemoteRegToStack.cpp	\
+	InlineFunction.cpp	\
+	InstructionNamer.cpp	\
+	LCSSA.cpp	\
+	Local.cpp	\
+	LoopSimplify.cpp	\
+	LoopUnroll.cpp	\
+	LowerInvoke.cpp	\
+	LowerSwitch.cpp	\
+	Mem2Reg.cpp	\
+	PromoteMemoryToRegister.cpp	\
+	SSAUpdater.cpp	\
+	SimplifyCFG.cpp	\
+	SimplifyInstructions.cpp	\
+	UnifyFunctionExitNodes.cpp	\
+	ValueMapper.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_utils_SRC_FILES)
+LOCAL_MODULE:= libLLVMTransformUtils
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_utils_SRC_FILES)
+LOCAL_MODULE:= libLLVMTransformUtils
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/VMCore/Android.mk b/lib/VMCore/Android.mk
new file mode 100644
index 0000000..7b99aeb
--- /dev/null
+++ b/lib/VMCore/Android.mk
@@ -0,0 +1,70 @@
+LOCAL_PATH:= $(call my-dir)
+
+vmcore_SRC_FILES :=	\
+	AsmWriter.cpp	\
+	Attributes.cpp	\
+	AutoUpgrade.cpp	\
+	BasicBlock.cpp	\
+	ConstantFold.cpp	\
+	Constants.cpp	\
+	Core.cpp	\
+	DebugLoc.cpp	\
+	DebugInfoProbe.cpp \
+	Dominators.cpp	\
+	Function.cpp	\
+	GVMaterializer.cpp	\
+	Globals.cpp	\
+	IRBuilder.cpp	\
+	InlineAsm.cpp	\
+	Instruction.cpp	\
+	Instructions.cpp	\
+	IntrinsicInst.cpp	\
+	LLVMContext.cpp	\
+	LLVMContextImpl.cpp	\
+	LeakDetector.cpp	\
+	Metadata.cpp	\
+	Module.cpp	\
+	Pass.cpp	\
+	PassManager.cpp	\
+	PassRegistry.cpp	\
+	PrintModulePass.cpp	\
+	Type.cpp	\
+	TypeSymbolTable.cpp	\
+	Use.cpp	\
+	User.cpp\
+	Value.cpp	\
+	ValueSymbolTable.cpp	\
+	ValueTypes.cpp	\
+	Verifier.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+REQUIRES_RTTI := 1
+
+LOCAL_SRC_FILES := $(vmcore_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMCore
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+REQUIRES_RTTI := 1
+
+LOCAL_SRC_FILES := $(vmcore_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMCore
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/llvm-device-build.mk b/llvm-device-build.mk
new file mode 100644
index 0000000..83fc5ef
--- /dev/null
+++ b/llvm-device-build.mk
@@ -0,0 +1,77 @@
+LOCAL_CFLAGS :=	\
+	-D_GNU_SOURCE	\
+	-D__STDC_LIMIT_MACROS	\
+	-D__STDC_CONSTANT_MACROS	\
+	-O2	\
+	-fomit-frame-pointer	\
+	-Wall	\
+	-W	\
+	-Wno-unused-parameter	\
+	-Wwrite-strings	\
+	$(LOCAL_CFLAGS)
+
+ifneq ($(TARGET_SIMULATOR),true)
+# The three inline options together reduce libbcc.so almost 1MB.
+# We move them from global build/core/combo/TARGET_linux-arm.mk
+# to here.
+LOCAL_CFLAGS := -DANDROID_TARGET_BUILD \
+		-finline-limit=64 \
+		-finline-functions \
+		-fno-inline-functions-called-once \
+		$(LOCAL_CFLAGS)
+endif
+
+ifeq ($(LLVM_ENABLE_ASSERTION),true)
+LOCAL_CFLAGS :=	\
+	-D_DEBUG	\
+	-UNDEBUG	\
+	$(LOCAL_CFLAGS)
+endif
+
+ifneq ($(REQUIRES_EH),1)
+LOCAL_CFLAGS +=	-fno-exceptions
+else
+# No action. The device target should not have exception enabled since bionic
+# doesn't support it
+REQUIRES_EH := 0
+endif
+
+ifneq ($(REQUIRES_RTTI),1)
+LOCAL_CPPFLAGS +=	-fno-rtti
+else
+REQUIRES_RTTI := 0
+endif
+
+LOCAL_CPPFLAGS :=	\
+	$(LOCAL_CPPFLAGS)	\
+	-Woverloaded-virtual	\
+	-Wno-sign-promo   
+
+# Make sure bionic is first so we can include system headers.
+LOCAL_C_INCLUDES :=	\
+	$(LLVM_ROOT_PATH)	\
+	$(LLVM_ROOT_PATH)/include	\
+	$(LLVM_ROOT_PATH)/device/include	\
+	$(LOCAL_C_INCLUDES)
+
+ifneq ($(TARGET_SIMULATOR),true)
+LOCAL_C_INCLUDES := \
+	bionic \
+	external/stlport/stlport \
+	$(LOCAL_C_INCLUDES)
+endif
+
+###########################################################
+## Commands for running tblgen to compile a td file
+###########################################################
+define transform-device-td-to-out
+@mkdir -p $(dir $@)
+@echo "Device TableGen (gen-$(1)): $(LOCAL_MODULE) <= $<"
+$(hide) $(TBLGEN) \
+	-I $(dir $<)	\
+	-I $(LLVM_ROOT_PATH)/include	\
+	-I $(LLVM_ROOT_PATH)/device/include	\
+	-I $(LLVM_ROOT_PATH)/lib/Target	\
+    -gen-$(strip $(1)) \
+    -o $@ $<
+endef
diff --git a/llvm-gen-intrinsics.mk b/llvm-gen-intrinsics.mk
new file mode 100644
index 0000000..decccdd
--- /dev/null
+++ b/llvm-gen-intrinsics.mk
@@ -0,0 +1,18 @@
+# We treat Intrinsics.td as a very special target just like what lib/VMCore/Makefile does
+INTRINSICTD := $(LLVM_ROOT_PATH)/include/llvm/Intrinsics.td
+INTRINSICTDS := $(wildcard $(dir $(INTRINSICTD))/Intrinsics*.td)
+
+LOCAL_SRC_FILES := $(INTRINSICTD) $(LOCAL_SRC_FILES)
+
+ifeq ($(LOCAL_MODULE_CLASS),)
+	LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+endif
+
+GENFILE := $(addprefix $(call local-intermediates-dir)/llvm/,Intrinsics.gen)
+LOCAL_GENERATED_SOURCES += $(GENFILE)
+$(GENFILE): $(INTRINSICTD) $(INTRINSICTDS) $(TBLGEN)
+ifeq ($(LOCAL_IS_HOST_MODULE),true)
+	$(call transform-host-td-to-out,intrinsic)
+else
+	$(call transform-device-td-to-out,intrinsic)
+endif
diff --git a/llvm-host-build.mk b/llvm-host-build.mk
new file mode 100644
index 0000000..d7ef682
--- /dev/null
+++ b/llvm-host-build.mk
@@ -0,0 +1,67 @@
+LOCAL_CFLAGS :=	\
+	-D_GNU_SOURCE	\
+	-D__STDC_LIMIT_MACROS	\
+	-D__STDC_CONSTANT_MACROS	\
+	-O2	\
+	-fomit-frame-pointer	\
+	-Wall	\
+	-W	\
+	-Wno-unused-parameter	\
+	-Wwrite-strings	\
+	$(LOCAL_CFLAGS)
+
+ifeq ($(LLVM_ENABLE_ASSERTION),true)
+LOCAL_CFLAGS :=	\
+	-D_DEBUG	\
+	-UNDEBUG	\
+	$(LOCAL_CFLAGS)
+endif
+
+# force 32 bit code for sim build
+ifeq ($(TARGET_SIMULATOR),true)
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32
+endif
+
+ifneq ($(REQUIRES_EH),1)
+LOCAL_CFLAGS += -fno-exceptions
+else
+REQUIRES_EH := 0
+LOCAL_CFLAGS += -fexceptions
+endif
+
+ifneq ($(REQUIRES_RTTI),1)
+LOCAL_CPPFLAGS += -fno-rtti
+else
+REQUIRES_RTTI := 0
+endif
+
+LOCAL_CPPFLAGS :=	\
+	$(LOCAL_CPPFLAGS)	\
+	-Woverloaded-virtual	\
+	-Wno-sign-promo
+
+# Make sure bionic is first so we can include system headers.
+LOCAL_C_INCLUDES :=	\
+	$(LLVM_ROOT_PATH)	\
+	$(LLVM_ROOT_PATH)/include	\
+	$(LLVM_ROOT_PATH)/host/include	\
+	$(LOCAL_C_INCLUDES)
+
+LOCAL_IS_HOST_MODULE := true
+
+###########################################################
+## Commands for running tblgen to compile a td file
+###########################################################
+define transform-host-td-to-out
+@mkdir -p $(dir $@)
+@echo "Host TableGen: $(LOCAL_MODULE) (gen-$(1)) <= $<"
+$(hide) $(TBLGEN) \
+	-I $(dir $<)	\
+	-I $(LLVM_ROOT_PATH)/include	\
+	-I $(LLVM_ROOT_PATH)/host/include	\
+	-I $(LLVM_ROOT_PATH)/lib/Target	\
+	$(if $(strip $(CLANG_ROOT_PATH)),-I $(CLANG_ROOT_PATH)/include,)	\
+	-gen-$(strip $(1))	\
+	-o $@ $<
+endef
diff --git a/llvm-tblgen-rules.mk b/llvm-tblgen-rules.mk
new file mode 100644
index 0000000..79d1b0a
--- /dev/null
+++ b/llvm-tblgen-rules.mk
@@ -0,0 +1,121 @@
+###########################################################
+## Commands for running tblgen to compile a td file
+##########################################################
+define transform-td-to-out
+$(if $(LOCAL_IS_HOST_MODULE),	\
+	$(call transform-host-td-to-out,$(1)),	\
+	$(call transform-device-td-to-out,$(1)))
+endef
+
+###########################################################
+## TableGen: Compile .td files to .inc.
+###########################################################
+
+# Set LOCAL_MODULE_CLASS to STATIC_LIBRARIES default (require
+# for macro local-intermediates-dir)
+ifeq ($(LOCAL_MODULE_CLASS),)
+	LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+endif
+
+ifneq ($(strip $(TBLGEN_TABLES)),)
+
+intermediates := $(call local-intermediates-dir)
+tblgen_gen_tables := $(addprefix $(intermediates)/,$(TBLGEN_TABLES))
+LOCAL_GENERATED_SOURCES += $(tblgen_gen_tables)
+
+tblgen_source_dir := $(LOCAL_PATH)
+ifneq ($(TBLGEN_TD_DIR),)
+tblgen_source_dir := $(TBLGEN_TD_DIR)
+endif
+
+ifneq ($(filter %GenRegisterNames.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterNames.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-enums)
+endif
+
+ifneq ($(filter %GenRegisterInfo.h.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterInfo.h.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-desc-header)
+endif
+
+ifneq ($(filter %GenRegisterInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-desc)
+endif
+
+ifneq ($(filter %GenInstrNames.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenInstrNames.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,instr-enums)
+endif
+
+ifneq ($(filter %GenInstrInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,instr-desc)
+endif
+
+ifneq ($(filter %GenAsmWriter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-writer)
+endif
+
+ifneq ($(filter %GenAsmWriter1.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter1.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-writer -asmwriternum=1)
+endif
+
+ifneq ($(filter %GenAsmMatcher.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmMatcher.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-matcher)
+endif
+
+ifneq ($(filter %GenCodeEmitter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCodeEmitter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,emitter)
+endif
+
+ifneq ($(filter %GenMCCodeEmitter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenMCCodeEmitter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,emitter -mc-emitter)
+endif
+
+ifneq ($(filter %GenDAGISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDAGISel.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,dag-isel)
+endif
+
+ifneq ($(filter %GenDisassemblerTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDisassemblerTables.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,disassembler)
+endif
+
+ifneq ($(filter %GenEDInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenEDInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,enhanced-disassembly-info)
+endif
+
+ifneq ($(filter %GenFastISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenFastISel.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,fast-isel)
+endif
+
+ifneq ($(filter %GenSubtarget.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenSubtarget.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifneq ($(filter %GenCallingConv.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCallingConv.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,callingconv)
+endif
+
+ifneq ($(filter %GenIntrinsics.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenIntrinsics.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,tgt_intrinsics)
+endif
+
+ifneq ($(findstring ARMGenDecoderTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/ARMGenDecoderTables.inc: $(tblgen_source_dir)/ARM.td $(TBLGEN)
+	$(call transform-td-to-out,arm-decoder)
+endif
+
+endif
diff --git a/llvm.mk b/llvm.mk
new file mode 100644
index 0000000..badc445
--- /dev/null
+++ b/llvm.mk
@@ -0,0 +1,11 @@
+ifeq ($(LLVM_ROOT_PATH),)
+$(error Must set variable LLVM_ROOT_PATH before including this! $(LOCAL_PATH))
+endif
+
+TBLGEN := $(BUILD_OUT_EXECUTABLES)/tblgen$(BUILD_EXECUTABLE_SUFFIX)
+
+CLEAR_TBLGEN_VARS := $(LLVM_ROOT_PATH)/clear_tblgen_vars.mk
+LLVM_HOST_BUILD_MK := $(LLVM_ROOT_PATH)/llvm-host-build.mk
+LLVM_DEVICE_BUILD_MK := $(LLVM_ROOT_PATH)/llvm-device-build.mk
+LLVM_GEN_INTRINSICS_MK := $(LLVM_ROOT_PATH)/llvm-gen-intrinsics.mk
+LLVM_TBLGEN_RULES_MK := $(LLVM_ROOT_PATH)/llvm-tblgen-rules.mk
diff --git a/tblgen-rules.mk b/tblgen-rules.mk
new file mode 100644
index 0000000..6e7bcf1
--- /dev/null
+++ b/tblgen-rules.mk
@@ -0,0 +1,113 @@
+###########################################################
+## Commands for running tblgen to compile a td file
+##########################################################
+define transform-td-to-out
+$(if $(LOCAL_IS_HOST_MODULE),	\
+	$(call transform-host-td-to-out,$(1)),	\
+	$(call transform-device-td-to-out,$(1)))
+endef
+
+###########################################################
+## TableGen: Compile .td files to .inc.
+###########################################################
+ifeq ($(LOCAL_MODULE_CLASS),)
+	LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+endif
+
+ifneq ($(strip $(TBLGEN_TABLES)),)
+
+intermediates := $(call local-intermediates-dir)
+tblgen_gen_tables := $(addprefix $(intermediates)/,$(TBLGEN_TABLES))
+LOCAL_GENERATED_SOURCES += $(tblgen_gen_tables)
+
+tblgen_source_dir := $(LOCAL_PATH)
+ifneq ($(TBLGEN_TD_DIR),)
+tblgen_source_dir := $(TBLGEN_TD_DIR)
+endif
+
+ifneq ($(filter %GenRegisterNames.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterNames.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-enums)
+endif
+
+ifneq ($(filter %GenRegisterInfo.h.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterInfo.h.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-desc-header)
+endif
+
+ifneq ($(filter %GenRegisterInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,register-desc)
+endif
+
+ifneq ($(filter %GenInstrNames.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenInstrNames.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,instr-enums)
+endif
+
+ifneq ($(filter %GenInstrInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,instr-desc)
+endif
+
+ifneq ($(filter %GenAsmWriter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-writer)
+endif
+
+ifneq ($(filter %GenAsmWriter1.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter1.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-writer -asmwriternum=1)
+endif
+
+ifneq ($(filter %GenAsmMatcher.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmMatcher.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,asm-matcher)
+endif
+
+ifneq ($(filter %GenCodeEmitter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCodeEmitter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,emitter)
+endif
+
+ifneq ($(filter %GenDAGISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDAGISel.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,dag-isel)
+endif
+
+ifneq ($(filter %GenDisassemblerTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDisassemblerTables.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,disassembler)
+endif
+
+ifneq ($(filter %GenEDInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenEDInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,enhanced-disassembly-info)
+endif
+
+ifneq ($(filter %GenFastISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenFastISel.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,fast-isel)
+endif
+
+ifneq ($(filter %GenSubtarget.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenSubtarget.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifneq ($(filter %GenCallingConv.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCallingConv.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,callingconv)
+endif
+
+ifneq ($(filter %GenIntrinsics.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenIntrinsics.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,tgt_intrinsics)
+endif
+
+ifneq ($(findstring ARMGenDecoderTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/ARMGenDecoderTables.inc: $(tblgen_source_dir)/ARM.td $(TBLGEN)
+	$(call transform-td-to-out,arm-decoder)
+endif
+
+endif
diff --git a/tools/llvm-as/Android.mk b/tools/llvm-as/Android.mk
new file mode 100644
index 0000000..b44ecb7
--- /dev/null
+++ b/tools/llvm-as/Android.mk
@@ -0,0 +1,23 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-as
+
+LOCAL_SRC_FILES := llvm-as.cpp
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+LOCAL_STATIC_LIBRARIES := \
+    libLLVMAsmParser \
+    libLLVMBitWriter \
+    libLLVMCore \
+    libLLVMSupport
+
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/llvm-link/Android.mk b/tools/llvm-link/Android.mk
new file mode 100644
index 0000000..e24d744
--- /dev/null
+++ b/tools/llvm-link/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	llvm-link.cpp
+
+LOCAL_STATIC_LIBRARIES := \
+    libLLVMLinker \
+    libLLVMBitReader \
+    libLLVMBitWriter \
+    libLLVMCore \
+    libLLVMSupport \
+    libLLVMAsmParser \
+    libLLVMTransformUtils
+
+LOCAL_MODULE := llvm-link
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/opt/Android.mk.disabled b/tools/opt/Android.mk.disabled
new file mode 100644
index 0000000..d03aa41
--- /dev/null
+++ b/tools/opt/Android.mk.disabled
@@ -0,0 +1,21 @@
+# Only use this on the device or emulator.
+ifeq ($(TARGET_ARCH),arm)
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	  \
+	opt.cpp           \
+        GraphPrinters.cpp \
+        PrintSCC.cpp
+
+LOCAL_STATIC_LIBRARIES := libLLVMipo libLLVMScalarOpts libLLVMInstCombine libLLVMInstrumentation libLLVMTransformUtils libLLVMipa libLLVMAnalysis libLLVMTarget libLLVMMC libLLVMAsmParser libLLVMBitWriter libLLVMBitReader libLLVMCore libLLVMSupport libLLVMSystem
+LOCAL_MODULE := opt
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_EXECUTABLE)
+
+endif
diff --git a/utils/TableGen/Android.mk b/utils/TableGen/Android.mk
new file mode 100644
index 0000000..141ae30
--- /dev/null
+++ b/utils/TableGen/Android.mk
@@ -0,0 +1,60 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	ARMDecoderEmitter.cpp	\
+	AsmMatcherEmitter.cpp   \
+	AsmWriterEmitter.cpp    \
+	AsmWriterInst.cpp   \
+	CallingConvEmitter.cpp  \
+	ClangASTNodesEmitter.cpp	\
+	ClangAttrEmitter.cpp	\
+	ClangDiagnosticsEmitter.cpp \
+	ClangSACheckersEmitter.cpp  \
+	CodeEmitterGen.cpp  \
+	CodeGenDAGPatterns.cpp  \
+	CodeGenInstruction.cpp  \
+	CodeGenTarget.cpp   \
+	DAGISelEmitter.cpp  \
+	DAGISelMatcher.cpp  \
+	DAGISelMatcherEmitter.cpp   \
+	DAGISelMatcherGen.cpp   \
+	DAGISelMatcherOpt.cpp   \
+	DisassemblerEmitter.cpp \
+	EDEmitter.cpp   \
+	FastISelEmitter.cpp \
+	FixedLenDecoderEmitter.cpp \
+	InstrEnumEmitter.cpp    \
+	InstrInfoEmitter.cpp    \
+	IntrinsicEmitter.cpp    \
+	LLVMCConfigurationEmitter.cpp   \
+	NeonEmitter.cpp	\
+	OptParserEmitter.cpp    \
+	Record.cpp  \
+	RegisterInfoEmitter.cpp \
+	StringMatcher.cpp \
+	SubtargetEmitter.cpp    \
+	TGLexer.cpp \
+	TGParser.cpp    \
+	TGValueTypes.cpp    \
+	TableGen.cpp    \
+	TableGenBackend.cpp \
+	X86DisassemblerTables.cpp   \
+	X86RecognizableInstr.cpp
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+LOCAL_STATIC_LIBRARIES := libLLVMSupport
+LOCAL_MODULE := tblgen
+LOCAL_LDLIBS += -lm
+ifeq ($(HOST_OS),windows)
+  LOCAL_LDLIBS += -limagehlp -lpsapi
+else
+  LOCAL_LDLIBS += -lpthread -ldl
+endif
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)