Merge branch 'upstream' into merge_2013_03_18
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..e863fb3
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,75 @@
+LOCAL_PATH := $(call my-dir)
+LLVM_ROOT_PATH := $(LOCAL_PATH)
+LLVM_ENABLE_ASSERTION := false
+
+include $(CLEAR_VARS)
+
+# LLVM Libraries
+subdirs := \
+  lib/Analysis \
+  lib/Analysis/IPA \
+  lib/Archive \
+  lib/AsmParser \
+  lib/Bitcode/Reader \
+  lib/Bitcode/Writer \
+  lib/ExecutionEngine/JIT \
+  lib/CodeGen \
+  lib/CodeGen/AsmPrinter \
+  lib/CodeGen/SelectionDAG \
+  lib/IR \
+  lib/Linker \
+  lib/MC \
+  lib/MC/MCParser \
+  lib/Object \
+  lib/Support \
+  lib/TableGen \
+  lib/Target \
+  lib/Transforms/IPO \
+  lib/Transforms/InstCombine \
+  lib/Transforms/Instrumentation \
+  lib/Transforms/ObjCARC \
+  lib/Transforms/Scalar \
+  lib/Transforms/Utils \
+  lib/Transforms/Vectorize \
+  utils/FileCheck \
+  utils/TableGen
+
+# ARM Code Generation Libraries
+subdirs += \
+  lib/Target/ARM \
+  lib/Target/ARM/AsmParser \
+  lib/Target/ARM/InstPrinter \
+  lib/Target/ARM/Disassembler \
+  lib/Target/ARM/MCTargetDesc \
+  lib/Target/ARM/TargetInfo
+
+# MIPS Code Generation Libraries
+subdirs += \
+  lib/Target/Mips \
+  lib/Target/Mips/AsmParser \
+  lib/Target/Mips/InstPrinter \
+  lib/Target/Mips/Disassembler \
+  lib/Target/Mips/MCTargetDesc \
+  lib/Target/Mips/TargetInfo
+
+# X86 Code Generation Libraries
+subdirs += \
+  lib/Target/X86 \
+  lib/Target/X86/AsmParser \
+  lib/Target/X86/InstPrinter \
+  lib/Target/X86/Disassembler \
+  lib/Target/X86/MCTargetDesc \
+  lib/Target/X86/TargetInfo \
+  lib/Target/X86/Utils
+
+# LLVM Command Line Tools
+subdirs += tools/llc
+subdirs += tools/llvm-as
+subdirs += tools/llvm-dis
+subdirs += tools/llvm-link
+#subdirs += tools/opt
+
+
+include $(LOCAL_PATH)/llvm.mk
+include $(LOCAL_PATH)/shared_llvm.mk
+include $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, $(subdirs)))
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..aa21896
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,53 @@
+# 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*)
+$(call add-clean-step, rm -rf $(OUT_DIR)/host/$(HOST_PREBUILT_TAG)/obj/STATIC_LIBRARIES/libLLVMARM*)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libLLVMARM*)
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..fed7d2a
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,171 @@
+==============================================================================
+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}
+
+======================================================================
+== LICENSE.TXT for ./autoconf/LICENSE.TXT
+======================================================================
+
+------------------------------------------------------------------------------
+Autoconf Files
+------------------------------------------------------------------------------
+All autoconf files are licensed under the LLVM license with the following
+additions:
+
+llvm/autoconf/install-sh:
+	This script is licensed under the LLVM license, with the following
+	additional copyrights and restrictions:
+
+	Copyright 1991 by the Massachusetts Institute of Technology
+
+	Permission to use, copy, modify, distribute, and sell this software and its
+	documentation for any purpose is hereby granted without fee, provided that
+	the above copyright notice appear in all copies and that both that
+	copyright notice and this permission notice appear in supporting 
+	documentation, and that the name of M.I.T. not be used in advertising or
+	publicity pertaining to distribution of the software without specific,
+	written prior permission.  M.I.T. makes no representations about the
+	suitability of this software for any purpose.  It is provided "as is"
+	without express or implied warranty.
+
+Please see the source files for additional copyrights.
+
+
+======================================================================
+== LICENSE.TXT for ./projects/sample/autoconf/LICENSE.TXT
+======================================================================
+
+------------------------------------------------------------------------------
+Autoconf Files
+------------------------------------------------------------------------------
+All autoconf files are licensed under the LLVM license with the following
+additions:
+
+llvm/autoconf/install-sh:
+	This script is licensed under the LLVM license, with the following
+	additional copyrights and restrictions:
+
+	Copyright 1991 by the Massachusetts Institute of Technology
+
+	Permission to use, copy, modify, distribute, and sell this software and its
+	documentation for any purpose is hereby granted without fee, provided that
+	the above copyright notice appear in all copies and that both that
+	copyright notice and this permission notice appear in supporting 
+	documentation, and that the name of M.I.T. not be used in advertising or
+	publicity pertaining to distribution of the software without specific,
+	written prior permission.  M.I.T. makes no representations about the
+	suitability of this software for any purpose.  It is provided "as is"
+	without express or implied warranty.
+
+Please see the source files for additional copyrights.
+
+
+======================================================================
+== LICENSE.TXT for ./utils/unittest/googletest/LICENSE.TXT
+======================================================================
+
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+======================================================================
+== LICENSE.TXT for ./include/llvm/Support/LICENSE.TXT
+======================================================================
+
+LLVM System Interface Library
+-------------------------------------------------------------------------------
+The LLVM System Interface Library is licensed under the Illinois Open Source
+License and has the following additional copyright:
+
+Copyright (C) 2004 eXtensible Systems, Inc.
diff --git a/README.android b/README.android
new file mode 100644
index 0000000..8287705
--- /dev/null
+++ b/README.android
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+* For Honeycomb: Synced to upstream r112344.
+* For Honeycomb MR1: Synced to upstream r119309
+* For Honeycomb MR2: Synced to upstream r119309
+* For Ice Cream Sandwich: Synced to upstream r135569
+* For Ice Cream Sandwich MR1: Synced to upstream r142530
+* For Ice Cream Sandwich MR2: Synced to upstream r146714
+* For Jellybean: Synced to upstream r155090
+* For Jellybean MR1: Synced to upstream r162314
+* For Jellybean MR2: Synced to upstream r176139
+
+* Recent downstreaming on 2013/3/5: Synced to r176139 (Contact srhines for merge questions.)
+* Recent downstreaming on 2013/1/8: Synced to r171905 (Contact srhines for merge questions.)
+* Recent downstreaming on 2012/8/23: Synced to r162314 (Contact srhines for merge questions.)
+* Recent downstreaming on 2012/8/3: Synced to r160668 (Contact sliao for merge questions.)
+* Cherry-pick on 2012/05/23: https://llvm.org/svn/llvm-project/llvm/trunk@157317 (Contact srhines for merge questions.)
+* Recent downstreaming on 2012/4/24: Synced to r155090 (Contact sliao for merge questions.)
+* Recent downstreaming on 2012/3/24: Synced to r153224 (Contact sliao & srhines for merge questions.)
+* Recent downstreaming on 2012/3/5: Synced to r152063 (Contact srhines & sliao for merge questions.)
+* Recent downstreaming on 2011/12/17: Synced to r146714 (Contact loganchien & sliao for merge questions.)
+* Recent downstreaming on 2011/11/26: Synced to r145126 (Contact loganchien & sliao for merge questions.)
+* Recent downstreaming on 2011/11/17: Synced to r144606 (Contact loganchien & sliao for merge questions.)
+* Recent downstreaming on 2011/11/14: Synced to r144354 (Contact srhines for merge questions.)
+* Recent downstreaming on 2011/10/22: Synced to r142530 (Contact sliao & loganchien for merge questions.)
+* Recent downstreaming on 2011/7/21:  Synced to r135569 (Contact sliao & loganchien for merge questions.)
+* Recent downstreaming on 2011/7/19:  Synced to r135360 (Contact sliao for merge questions.)
+* Recent downstreaming on 2011/7/2:   Synced to r134306 (Contact sliao for merge questions.)
+* Recent downstreaming on 2011/6/30:  Synced to r133718 (Contact sliao for merge questions.)
+  * This downstreaming could have broken bitcode compatibility
+    * Upstream was migrating from 2.7 bitcode to 3.0 bitcode.
+    * See the 4 commits on 2011/6/17:
+    ==> * 4f6bab9 - Drop the "2" suffix on some enums. (13 days ago) <Chris Lattner>
+    ==> * 96a74c5 - remove support for a bunch of obsolete instruction encodings and other backward compatibility hacks. (13 days ago) <Chris Lattner>
+        * 738f05a - Remove a useless copy of MCELFStreamer. Patch by Logan Chien! (13 days ago) <Benjamin Kramer>
+        * 981d826 - getSuccWeight returns now default 0 if Weights vector is empty. (13 days ago) <Jakub Staszak>
+        * 799a58a55 - missed a file. (13 days ago) <Chris Lattner>
+    ==> * 9d61dd9 - Remove some "2" suffixes from the metadata enums now that "1" is gone. (13 days ago) <Chris Lattner>
+    ==> * 020a5a4 - remove bitcode reader support for LLVM 2.7 metadata encoding. (13 days ago) <Chris Lattner>
+  * We maintain compatibility because Honeycomb SDK is out there.
+    * Our bitcode reader can read both 2.7 and 3.0 versions. Writer is tracking upstream.
+* Recent downstreaming on 2011/6/22:  Synced to r133240 (Contact sliao@ for merge questions.)
+* Recent downstreaming on 2011/4/8:   Synced to r129128 (Contact sliao@ for merge questions.)
+* Recent downstreaming on 2011/3/11:  Synced from r119309 to r127116 (Contact sliao@ for merge questions.)
+
+* 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..46d22a1
--- /dev/null
+++ b/device/include/llvm/Config/AsmParsers.def
@@ -0,0 +1,37 @@
+//===- 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(__mips__)
+  LLVM_ASM_PARSER(Mips)
+#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..c9c7902
--- /dev/null
+++ b/device/include/llvm/Config/AsmPrinters.def
@@ -0,0 +1,37 @@
+//===- 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(__mips__)
+  LLVM_ASM_PRINTER(Mips)
+#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..4a834ea
--- /dev/null
+++ b/device/include/llvm/Config/Disassemblers.def
@@ -0,0 +1,37 @@
+//===- 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(__mips__)
+  LLVM_DISASSEMBLER(Mips)
+#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..4a16bb3
--- /dev/null
+++ b/device/include/llvm/Config/Targets.def
@@ -0,0 +1,36 @@
+/*===- 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(__mips__)
+  LLVM_TARGET(Mips)
+#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..e0ee708
--- /dev/null
+++ b/device/include/llvm/Config/config.h
@@ -0,0 +1,686 @@
+/* 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
+
+/* Bug report URL. */
+#define BUG_REPORT_URL "http://llvm.org/bugs/"
+
+/* Relative directory for resource files */
+#define CLANG_RESOURCE_DIR ""
+
+/* Directories clang will search for headers */
+#define C_INCLUDE_DIRS ""
+
+/* Default <path> to all compiler invocations for --sysroot=<path>. */
+#define DEFAULT_SYSROOT ""
+
+/* Define if position independent code is enabled */
+#define ENABLE_PIC 1
+
+/* Define if timestamp information (e.g., __DATE___) is allowed */
+#define ENABLE_TIMESTAMPS 1
+
+/* Directory where gcc is installed. */
+#define GCC_INSTALL_PREFIX ""
+
+/* 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 `backtrace' function. */
+#if defined(HAVE_BACKTRACE) && HAVE_BACKTRACE == 0
+/* Defined by AndroidConfig.h as 0 */
+#undef HAVE_BACKTRACE
+#endif
+
+/* 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 if __crashreporter_info__ exists. */
+/* #undef HAVE_CRASHREPORTER_INFO */
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#define HAVE_CTYPE_H 1
+
+/* Define to 1 if you have the <cxxabi.h> header file. */
+#define HAVE_CXXABI_H 0
+
+/* Define to 1 if you have the declaration of `strerror_s', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRERROR_S 0
+
+/* 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'. */
+#define HAVE_ERROR_T 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#define HAVE_EXECINFO_H 0
+
+/* 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 to 1 if you have the <fenv.h> header file. */
+#define HAVE_FENV_H 1
+
+/* 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.h> header file. */
+//#define HAVE_MALLOC_H 1 /* Defined by AndroidConfig.h */
+
+/* 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 0
+
+/* 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 to 1 if you have the `pread' function. */
+#define HAVE_PREAD 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 */
+#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
+
+/* 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 <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 the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_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 `writev' function. */
+#define HAVE_WRITEV 1
+
+/* Define if the xdot.py program is available */
+/* #undef HAVE_XDOT_PY */
+
+/* Have host's _alloca */
+/* #undef HAVE__ALLOCA */
+
+/* Have host's __alloca */
+/* #undef HAVE___ALLOCA */
+
+/* Have host's __ashldi3 */
+/* #undef HAVE___ASHLDI3 */
+
+/* Have host's __ashrdi3 */
+/* #undef HAVE___ASHRDI3 */
+
+/* Have host's __chkstk */
+/* #undef HAVE___CHKSTK */
+
+/* Have host's __cmpdi2 */
+/* #undef HAVE___CMPDI2 */
+
+/* Have host's __divdi3 */
+/* #undef HAVE___DIVDI3 */
+
+/* Define to 1 if you have the `__dso_handle' function. */
+#define HAVE___DSO_HANDLE 1
+
+/* Have host's __fixdfdi */
+/* #undef HAVE___FIXDFDI */
+
+/* Have host's __fixsfdi */
+/* #undef HAVE___FIXSFDI */
+
+/* Have host's __floatdidf */
+/* #undef HAVE___FLOATDIDF */
+
+/* Have host's __lshrdi3 */
+/* #undef HAVE___LSHRDI3 */
+
+/* Have host's __main */
+/* #undef HAVE___MAIN */
+
+/* Have host's __moddi3 */
+/* #undef HAVE___MODDI3 */
+
+/* Have host's __udivdi3 */
+/* #undef HAVE___UDIVDI3 */
+
+/* Have host's __umoddi3 */
+/* #undef HAVE___UMODDI3 */
+
+/* Have host's ___chkstk */
+/* #undef HAVE____CHKSTK */
+
+/* Linker version detected at compile time. */
+#define HOST_LINK_VERSION "2.20.1"
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/opt/llvm-android/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue May  8 14:22:45 CST 2012"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/opt/llvm-android/share/llvm"
+
+/* Target triple LLVM will generate code for by default */
+#define LLVM_DEFAULT_TARGET_TRIPLE "i386-unknown-linux"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/opt/llvm-android/share/doc/llvm"
+
+/* Define if threads enabled */
+#define LLVM_ENABLE_THREADS 1
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/opt/llvm-android/etc/llvm"
+
+/* Has gcc/MSVC atomic intrinsics */
+#define LLVM_HAS_ATOMICS 1
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/opt/llvm-android/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/opt/llvm-android/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/opt/llvm-android/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/opt/llvm-android/man"
+
+/* 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 */
+
+/* Define to path to xdot.py program if found or 'echo xdot.py' otherwise */
+/* #undef LLVM_PATH_XDOT_PY */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/opt/llvm-android"
+
+/* Define if we have the Intel JIT API runtime support library */
+#define LLVM_USE_INTEL_JITEVENTS 0
+
+/* Define if we have the oprofile JIT-support library */
+#define LLVM_USE_OPROFILE 0
+
+/* Major version of the LLVM API */
+#define LLVM_VERSION_MAJOR 3
+
+/* Minor version of the LLVM API */
+#define LLVM_VERSION_MINOR 1
+
+/* 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 "http://llvm.org/bugs/"
+
+/* 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 3.1svn"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "llvm"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "3.1svn"
+
+/* 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 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 */
+
+#include "llvm/Config/llvm-platform-config.h"
+
+#endif
diff --git a/device/include/llvm/Config/llvm-config.h b/device/include/llvm/Config/llvm-config.h
new file mode 100644
index 0000000..ca49e77
--- /dev/null
+++ b/device/include/llvm/Config/llvm-config.h
@@ -0,0 +1,94 @@
+/* include/llvm/Config/llvm-config.h.  Generated from llvm-config.h.in by configure.  */
+/*===-- llvm/config/llvm-config.h - llvm configure variable -------*- 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 llvm variables from configure so that
+   they can be in exported headers and won't override package specific
+   directives.  This is a C file so we can include it in the llvm-c headers.  */
+
+/* To avoid multiple inclusions of these variables when we include the exported
+   headers and config.h, conditionally include these.  */
+/* TODO: This is a bit of a hack.  */
+#ifndef CONFIG_H
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/opt/llvm-android/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue May  8 14:22:45 CST 2012"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/opt/llvm-android/share/llvm"
+
+/* Target triple LLVM will generate code for by default */
+#define LLVM_DEFAULT_TARGET_TRIPLE "i386-unknown-linux"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/opt/llvm-android/share/doc/llvm"
+
+/* Define if threads enabled */
+#define LLVM_ENABLE_THREADS 1
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/opt/llvm-android/etc/llvm"
+
+/* Has gcc/MSVC atomic intrinsics */
+#define LLVM_HAS_ATOMICS 1
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/opt/llvm-android/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/opt/llvm-android/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/opt/llvm-android/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/opt/llvm-android/man"
+
+/* 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 */
+
+/* Define to path to xdot.py program if found or 'echo xdot.py' otherwise */
+/* #undef LLVM_PATH_XDOT_PY */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/opt/llvm-android"
+
+/* Major version of the LLVM API */
+#define LLVM_VERSION_MAJOR 3
+
+/* Minor version of the LLVM API */
+#define LLVM_VERSION_MINOR 1
+
+#include "llvm/Config/llvm-platform-config.h"
+
+#endif
diff --git a/host/include/llvm/Config/AsmParsers.def b/host/include/llvm/Config/AsmParsers.def
new file mode 100644
index 0000000..a03b5b6
--- /dev/null
+++ b/host/include/llvm/Config/AsmParsers.def
@@ -0,0 +1,31 @@
+//===- 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(ARM)
+LLVM_ASM_PARSER(Mips)
+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..ed417b0
--- /dev/null
+++ b/host/include/llvm/Config/AsmPrinters.def
@@ -0,0 +1,31 @@
+//===- 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(Mips)
+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..408a77e
--- /dev/null
+++ b/host/include/llvm/Config/Disassemblers.def
@@ -0,0 +1,31 @@
+//===- 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(ARM)
+LLVM_DISASSEMBLER(Mips)
+LLVM_DISASSEMBLER(X86)
+
+#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..176bbbf
--- /dev/null
+++ b/host/include/llvm/Config/Targets.def
@@ -0,0 +1,30 @@
+/*===- 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(Mips)
+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..090f373
--- /dev/null
+++ b/host/include/llvm/Config/config.h
@@ -0,0 +1,719 @@
+/* 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
+
+/* Bug report URL. */
+#define BUG_REPORT_URL "http://llvm.org/bugs/"
+
+/* Relative directory for resource files */
+#define CLANG_RESOURCE_DIR ""
+
+/* Directories clang will search for headers */
+#define C_INCLUDE_DIRS ""
+
+/* Default <path> to all compiler invocations for --sysroot=<path>. */
+#define DEFAULT_SYSROOT ""
+
+/* Define if position independent code is enabled */
+#define ENABLE_PIC 1
+
+/* Define if timestamp information (e.g., __DATE___) is allowed */
+#define ENABLE_TIMESTAMPS 1
+
+/* Directory where gcc is installed. */
+#define GCC_INSTALL_PREFIX ""
+
+/* 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 `backtrace' function. */
+/* #define HAVE_BACKTRACE 1 */ /* Defined by AndroidConfig.h */
+
+/* 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 if __crashreporter_info__ exists. */
+#define HAVE_CRASHREPORTER_INFO 0
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#define HAVE_CTYPE_H 1
+
+/* Define to 1 if you have the <cxxabi.h> header file. */
+#define HAVE_CXXABI_H 0
+
+/* Define to 1 if you have the declaration of `strerror_s', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRERROR_S 0
+
+/* 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'. */
+#define HAVE_ERROR_T 1
+
+/* 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 to 1 if you have the <fenv.h> header file. */
+#define HAVE_FENV_H 1
+
+/* 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. */
+#if !defined(__APPLE__)
+#define HAVE_MALLINFO 1
+#else
+/* #undef HAVE_MALLINFO */
+#endif
+
+/* Define to 1 if you have the <malloc.h> header file. */
+/* #define HAVE_MALLOC_H 1 */ /* Defined by AndroidConfig.h */
+
+/* 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 */
+#if !defined(__APPLE__)
+#define HAVE_MMAP_ANONYMOUS
+#else
+/* #undef HAVE_MMAP_ANONYMOUS */
+#endif
+
+/* 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 to 1 if you have the `pread' function. */
+#if !defined(_WIN32) && !defined(_WIN64)
+#define HAVE_PREAD 1
+#endif
+
+/* 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
+
+#if !defined(_WIN32) && !defined(_WIN64)
+
+/* 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 /* !defined(_WIN32) && !defined(_WIN64) */
+
+/* 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> */
+#define HAVE_STD_ISINF_IN_CMATH 1
+
+/* 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 <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
+
+/* Already defined in system/core/include/arch/darwin-x86/AndroidConfig.h */
+#if !defined(HAVE_SYS_UIO_H)
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+#endif
+
+/* 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 */
+
+#if defined(_WIN32) || defined(_WIN64)
+/* Define to 1 if you have the <windows.h> header file. */
+#define HAVE_WINDOWS_H 1
+
+/* Define to 1 if you have the `writev' function. */
+/* #undef HAVE_WRITEV */
+
+#else
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the `writev' function. */
+#define HAVE_WRITEV 1
+#endif
+
+/* Define if the xdot.py program is available */
+/* #undef HAVE_XDOT_PY */
+
+/* Have host's _alloca */
+/* #undef HAVE__ALLOCA */
+
+/* Have host's __alloca */
+/* #undef HAVE___ALLOCA */
+
+/* Have host's __ashldi3 */
+/* #undef HAVE___ASHLDI3 */
+
+/* Have host's __ashrdi3 */
+/* #undef HAVE___ASHRDI3 */
+
+/* Have host's __chkstk */
+/* #undef HAVE___CHKSTK */
+
+/* Have host's __cmpdi2 */
+/* #undef HAVE___CMPDI2 */
+
+/* Have host's __divdi3 */
+/* #undef HAVE___DIVDI3 */
+
+/* Define to 1 if you have the `__dso_handle' function. */
+#define HAVE___DSO_HANDLE 1
+
+/* Have host's __fixdfdi */
+/* #undef HAVE___FIXDFDI */
+
+/* Have host's __fixsfdi */
+/* #undef HAVE___FIXSFDI */
+
+/* Have host's __floatdidf */
+/* #undef HAVE___FLOATDIDF */
+
+/* Have host's __lshrdi3 */
+/* #undef HAVE___LSHRDI3 */
+
+/* Have host's __main */
+/* #undef HAVE___MAIN */
+
+/* Have host's __moddi3 */
+/* #undef HAVE___MODDI3 */
+
+/* Have host's __udivdi3 */
+/* #undef HAVE___UDIVDI3 */
+
+/* Have host's __umoddi3 */
+/* #undef HAVE___UMODDI3 */
+
+/* Have host's ___chkstk */
+/* #undef HAVE____CHKSTK */
+
+/* Linker version detected at compile time. */
+#define HOST_LINK_VERSION "2.20.1"
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/opt/llvm-android/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue May  8 14:22:45 CST 2012"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/opt/llvm-android/share/llvm"
+
+/* Target triple LLVM will generate code for by default */
+#define LLVM_DEFAULT_TARGET_TRIPLE "i386-unknown-linux"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/opt/llvm-android/share/doc/llvm"
+
+/* Define if threads enabled */
+#define LLVM_ENABLE_THREADS 1
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/opt/llvm-android/etc/llvm"
+
+#if !defined(_WIN32) && !defined(_WIN64)
+
+/* Has gcc/MSVC atomic intrinsics */
+#define LLVM_HAS_ATOMICS 1
+
+#else
+
+#define LLVM_HAS_ATOMICS 0
+
+#endif /* !defined(_WIN32) && !defined(_WIN64) */
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/opt/llvm-android/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/opt/llvm-android/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/opt/llvm-android/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/opt/llvm-android/man"
+
+/* 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 */
+
+/* Define to path to xdot.py program if found or 'echo xdot.py' otherwise */
+/* #undef LLVM_PATH_XDOT_PY */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/opt/llvm-android"
+
+/* Define if we have the Intel JIT API runtime support library */
+#define LLVM_USE_INTEL_JITEVENTS 0
+
+/* Define if we have the oprofile JIT-support library */
+#define LLVM_USE_OPROFILE 0
+
+/* Major version of the LLVM API */
+#define LLVM_VERSION_MAJOR 3
+
+/* Minor version of the LLVM API */
+#define LLVM_VERSION_MINOR 1
+
+/* 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 "http://llvm.org/bugs/"
+
+/* 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 3.1svn"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "llvm"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "3.1svn"
+
+/* 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 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 */
+
+#include "llvm/Config/llvm-platform-config.h"
+
+#endif
diff --git a/host/include/llvm/Config/llvm-config.h b/host/include/llvm/Config/llvm-config.h
new file mode 100644
index 0000000..964a00a
--- /dev/null
+++ b/host/include/llvm/Config/llvm-config.h
@@ -0,0 +1,102 @@
+/* include/llvm/Config/llvm-config.h.  Generated from llvm-config.h.in by configure.  */
+/*===-- llvm/config/llvm-config.h - llvm configure variable -------*- 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 llvm variables from configure so that
+   they can be in exported headers and won't override package specific
+   directives.  This is a C file so we can include it in the llvm-c headers.  */
+
+/* To avoid multiple inclusions of these variables when we include the exported
+   headers and config.h, conditionally include these.  */
+/* TODO: This is a bit of a hack.  */
+#ifndef CONFIG_H
+
+/* Installation directory for binary executables */
+#define LLVM_BINDIR "/opt/llvm-android/bin"
+
+/* Time at which LLVM was configured */
+#define LLVM_CONFIGTIME "Tue May  8 14:22:45 CST 2012"
+
+/* Installation directory for data files */
+#define LLVM_DATADIR "/opt/llvm-android/share/llvm"
+
+/* Target triple LLVM will generate code for by default */
+#define LLVM_DEFAULT_TARGET_TRIPLE "i386-unknown-linux"
+
+/* Installation directory for documentation */
+#define LLVM_DOCSDIR "/opt/llvm-android/share/doc/llvm"
+
+/* Define if threads enabled */
+#define LLVM_ENABLE_THREADS 1
+
+/* Installation directory for config files */
+#define LLVM_ETCDIR "/opt/llvm-android/etc/llvm"
+
+#if !defined(_WIN32) && !defined(_WIN64)
+
+/* Has gcc/MSVC atomic intrinsics */
+#define LLVM_HAS_ATOMICS 1
+
+#else
+
+#define LLVM_HAS_ATOMICS 0
+
+#endif /* !defined(_WIN32) && !defined(_WIN64) */
+
+/* Installation directory for include files */
+#define LLVM_INCLUDEDIR "/opt/llvm-android/include"
+
+/* Installation directory for .info files */
+#define LLVM_INFODIR "/opt/llvm-android/info"
+
+/* Installation directory for libraries */
+#define LLVM_LIBDIR "/opt/llvm-android/lib"
+
+/* Installation directory for man pages */
+#define LLVM_MANDIR "/opt/llvm-android/man"
+
+/* 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 */
+
+/* Define to path to xdot.py program if found or 'echo xdot.py' otherwise */
+/* #undef LLVM_PATH_XDOT_PY */
+
+/* Installation prefix directory */
+#define LLVM_PREFIX "/opt/llvm-android"
+
+/* Major version of the LLVM API */
+#define LLVM_VERSION_MAJOR 3
+
+/* Minor version of the LLVM API */
+#define LLVM_VERSION_MINOR 1
+
+#include "llvm/Config/llvm-platform-config.h"
+
+#endif
diff --git a/include/llvm/CodeGen/LinkAllAsmWriterComponents.h b/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
index 7d1b1fe..4b94173 100644
--- a/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
+++ b/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
@@ -18,6 +18,7 @@
 #include "llvm/CodeGen/GCs.h"
 #include <cstdlib>
 
+#ifndef ANDROID_TARGET_BUILD
 namespace {
   struct ForceAsmWriterLinking {
     ForceAsmWriterLinking() {
@@ -33,5 +34,6 @@
     }
   } ForceAsmWriterLinking; // Force link by creating a global definition.
 }
+#endif
 
 #endif // LLVM_CODEGEN_LINKALLASMWRITERCOMPONENTS_H
diff --git a/include/llvm/Config/llvm-platform-config.h b/include/llvm/Config/llvm-platform-config.h
new file mode 100644
index 0000000..fb1b08f
--- /dev/null
+++ b/include/llvm/Config/llvm-platform-config.h
@@ -0,0 +1,135 @@
+#ifndef LLVM_NATIVE_CONFIG_H
+
+/*===-- llvm/config/llvm-native-config.h --------------------------*- C -*-===*/
+/*                                                                            */
+/*                     The LLVM Compiler Infrastructure                       */
+/*                                                                            */
+/* This file is distributed under the University of Illinois Open Source      */
+/* License. See LICENSE.TXT for details.                                      */
+/*                                                                            */
+/*===----------------------------------------------------------------------===*/
+
+#if defined(__i386__) || defined(__x86_64__)
+
+/* LLVM architecture name for the native architecture, if available */
+#define LLVM_NATIVE_ARCH X86
+
+/* Host triple LLVM will be executed on */
+#define LLVM_HOSTTRIPLE "i686-unknown-linux-gnu"
+
+/* LLVM name for the native AsmParser init function, if available */
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeX86AsmParser
+
+/* LLVM name for the native AsmPrinter init function, if available */
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeX86AsmPrinter
+
+/* LLVM name for the native Disassembler init function, if available */
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeX86Disassembler
+
+/* LLVM name for the native Target init function, if available */
+#define LLVM_NATIVE_TARGET LLVMInitializeX86Target
+
+/* LLVM name for the native TargetInfo init function, if available */
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeX86TargetInfo
+
+/* LLVM name for the native target MC init function, if available */
+#define LLVM_NATIVE_TARGETMC LLVMInitializeX86TargetMC
+
+
+#elif defined(__arm__)
+
+/* LLVM architecture name for the native architecture, if available */
+#define LLVM_NATIVE_ARCH ARM
+
+/* Host triple LLVM will be executed on */
+#define LLVM_HOSTTRIPLE "arm-unknown-linux-gnu"
+
+/* LLVM name for the native AsmParser init function, if available */
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeARMAsmParser
+
+/* LLVM name for the native AsmPrinter init function, if available */
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeARMAsmPrinter
+
+/* LLVM name for the native Disassembler init function, if available */
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeARMDisassembler
+
+/* LLVM name for the native Target init function, if available */
+#define LLVM_NATIVE_TARGET LLVMInitializeARMTarget
+
+/* LLVM name for the native TargetInfo init function, if available */
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeARMTargetInfo
+
+/* LLVM name for the native target MC init function, if available */
+#define LLVM_NATIVE_TARGETMC LLVMInitializeARMTargetMC
+
+
+#elif defined(__mips__)
+
+/* LLVM architecture name for the native architecture, if available */
+#define LLVM_NATIVE_ARCH Mips
+
+/* Host triple LLVM will be executed on */
+#define LLVM_HOSTTRIPLE "mipsel-unknown-linux-gnu"
+
+/* LLVM name for the native AsmParser init function, if available */
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeMipsAsmParser
+
+/* LLVM name for the native AsmPrinter init function, if available */
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeMipsAsmPrinter
+
+/* LLVM name for the native Disassembler init function, if available */
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeMipsDisassembler
+
+/* LLVM name for the native Target init function, if available */
+#define LLVM_NATIVE_TARGET LLVMInitializeMipsTarget
+
+/* LLVM name for the native TargetInfo init function, if available */
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeMipsTargetInfo
+
+/* LLVM name for the native target MC init function, if available */
+#define LLVM_NATIVE_TARGETMC LLVMInitializeMipsTargetMC
+
+
+#else
+
+#error "Unknown native architecture"
+
+#endif
+
+
+
+#if defined(_WIN32) || defined(_WIN64)
+
+/* Define if this is Unixish platform */
+/* #undef LLVM_ON_UNIX */
+
+/* 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
+
+/* Type of 1st arg on ELM Callback */
+#define WIN32_ELMCB_PCSTR PSTR
+
+
+#else /* Linux, Mac OS X, ... Unixish platform */
+
+/* Define if this is Unixish platform */
+#define LLVM_ON_UNIX 1
+
+/* Define if this is Win32ish platform */
+/* #undef LLVM_ON_WIN32 */
+
+/* Type of 1st arg on ELM Callback */
+/* #undef WIN32_ELMCB_PCSTR */
+
+#endif
+
+#endif // LLVM_NATIVE_CONFIG_H
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index 43fbdc9..6aeb8b8 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -21,6 +21,10 @@
 #include "llvm/Support/DataTypes.h"
 #include <vector> // FIXME: Shouldn't be needed.
 
+namespace mcld {
+class Layout;
+}
+
 namespace llvm {
 class raw_ostream;
 class MCAsmLayout;
@@ -39,6 +43,7 @@
 
 class MCFragment : public ilist_node<MCFragment> {
   friend class MCAsmLayout;
+  friend class mcld::Layout;
 
   MCFragment(const MCFragment&) LLVM_DELETED_FUNCTION;
   void operator=(const MCFragment&) LLVM_DELETED_FUNCTION;
@@ -53,7 +58,10 @@
     FT_Org,
     FT_Dwarf,
     FT_DwarfFrame,
-    FT_LEB
+    FT_LEB,
+    FT_Region,
+    FT_Reloc,
+    FT_Target
   };
 
 private:
@@ -828,7 +836,7 @@
 
   MCCodeEmitter &Emitter;
 
-  MCObjectWriter &Writer;
+  MCObjectWriter *Writer;
 
   raw_ostream &OS;
 
@@ -982,7 +990,9 @@
 
   MCCodeEmitter &getEmitter() const { return Emitter; }
 
-  MCObjectWriter &getWriter() const { return Writer; }
+  MCObjectWriter &getWriter() const { return *Writer; }
+
+  void setWriter(MCObjectWriter &ObjectWriter);
 
   /// Finish - Do final processing and write the object to the output stream.
   /// \p Writer is used for custom object writer (as the MCJIT does),
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h
index e575424..5d6cac2 100644
--- a/include/llvm/MC/MCSection.h
+++ b/include/llvm/MC/MCSection.h
@@ -30,7 +30,8 @@
     enum SectionVariant {
       SV_COFF = 0,
       SV_ELF,
-      SV_MachO
+      SV_MachO,
+      SV_LDContext
     };
 
   private:
diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h
index 36e35f5..d5ff6f9 100644
--- a/include/llvm/Object/ELF.h
+++ b/include/llvm/Object/ELF.h
@@ -30,6 +30,8 @@
 #include <limits>
 #include <utility>
 
+#include <ctype.h>
+
 namespace llvm {
 namespace object {
 
diff --git a/include/llvm/Support/DataTypes.h b/include/llvm/Support/DataTypes.h
new file mode 100644
index 0000000..a4a65b8
--- /dev/null
+++ b/include/llvm/Support/DataTypes.h
@@ -0,0 +1,213 @@
+/* include/llvm/Support/DataTypes.h.  Generated from DataTypes.h.in by configure.  */
+/*===-- include/Support/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 functions.                         *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*/
+
+/* Please leave this file C-compatible. */
+
+/* Please keep this file in sync with DataTypes.h.cmake */
+
+#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
+
+#ifndef _MSC_VER
+
+/* 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 Support/DataTypes.h"
+#endif
+
+#if !defined(__STDC_CONSTANT_MACROS)
+# error "Must #define __STDC_CONSTANT_MACROS before " \
+        "#including Support/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/Support/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
+
+#else /* _MSC_VER */
+/* Visual C++ doesn't provide standard integer headers, but it does provide
+   built-in data types. */
+#include <stdlib.h>
+#include <stddef.h>
+#include <sys/types.h>
+#ifdef __cplusplus
+#include <cmath>
+#else
+#include <math.h>
+#endif
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+typedef short int16_t;
+typedef unsigned short uint16_t;
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef signed int ssize_t;
+#ifndef INT8_MAX
+# define INT8_MAX 127
+#endif
+#ifndef INT8_MIN
+# define INT8_MIN -128
+#endif
+#ifndef UINT8_MAX
+# define UINT8_MAX 255
+#endif
+#ifndef INT16_MAX
+# define INT16_MAX 32767
+#endif
+#ifndef INT16_MIN
+# define INT16_MIN -32768
+#endif
+#ifndef UINT16_MAX
+# define UINT16_MAX 65535
+#endif
+#ifndef INT32_MAX
+# define INT32_MAX 2147483647
+#endif
+#ifndef INT32_MIN
+/* MSC treats -2147483648 as -(2147483648U). */
+# define INT32_MIN (-INT32_MAX - 1)
+#endif
+#ifndef UINT32_MAX
+# define UINT32_MAX 4294967295U
+#endif
+/* Certain compatibility updates to VC++ introduce the `cstdint'
+ * header, which defines the INT*_C macros. On default installs they
+ * are absent. */
+#ifndef INT8_C
+# define INT8_C(C)   C##i8
+#endif
+#ifndef UINT8_C
+# define UINT8_C(C)  C##ui8
+#endif
+#ifndef INT16_C
+# define INT16_C(C)  C##i16
+#endif
+#ifndef UINT16_C
+# define UINT16_C(C) C##ui16
+#endif
+#ifndef INT32_C
+# define INT32_C(C)  C##i32
+#endif
+#ifndef UINT32_C
+# define UINT32_C(C) C##ui32
+#endif
+#ifndef INT64_C
+# define INT64_C(C)  C##i64
+#endif
+#ifndef UINT64_C
+# define UINT64_C(C) C##ui64
+#endif
+
+#ifndef PRId64
+# define PRId64 "I64d"
+#endif
+#ifndef PRIi64
+# define PRIi64 "I64i"
+#endif
+#ifndef PRIo64
+# define PRIo64 "I64o"
+#endif
+#ifndef PRIu64
+# define PRIu64 "I64u"
+#endif
+#ifndef PRIx64
+# define PRIx64 "I64x"
+#endif
+#ifndef PRIX64
+# define PRIX64 "I64X"
+#endif
+
+#endif /* _MSC_VER */
+
+/* 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..6153df4
--- /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 \
+  BlockFrequencyInfo.cpp \
+  BranchProbabilityInfo.cpp \
+  CFGPrinter.cpp \
+  CaptureTracking.cpp \
+  CodeMetrics.cpp \
+  ConstantFolding.cpp \
+  CostModel.cpp \
+  DbgInfoPrinter.cpp \
+  DependenceAnalysis.cpp \
+  DomPrinter.cpp \
+  DominanceFrontier.cpp \
+  IVUsers.cpp \
+  InstCount.cpp \
+  InstructionSimplify.cpp \
+  Interval.cpp \
+  IntervalPartition.cpp \
+  LazyValueInfo.cpp \
+  LibCallAliasAnalysis.cpp \
+  LibCallSemantics.cpp \
+  Lint.cpp \
+  Loads.cpp \
+  LoopInfo.cpp \
+  LoopPass.cpp \
+  MemDepPrinter.cpp \
+  MemoryBuiltins.cpp \
+  MemoryDependenceAnalysis.cpp \
+  ModuleDebugInfoPrinter.cpp \
+  NoAliasAnalysis.cpp \
+  PHITransAddr.cpp \
+  PathNumbering.cpp \
+  PathProfileInfo.cpp \
+  PathProfileVerifier.cpp \
+  PostDominators.cpp \
+  ProfileDataLoader.cpp \
+  ProfileDataLoaderPass.cpp \
+  ProfileEstimatorPass.cpp \
+  ProfileInfo.cpp \
+  ProfileInfoLoader.cpp \
+  ProfileInfoLoaderPass.cpp \
+  ProfileVerifierPass.cpp \
+  PtrUseVisitor.cpp \
+  RegionInfo.cpp \
+  RegionPass.cpp \
+  RegionPrinter.cpp \
+  ScalarEvolution.cpp \
+  ScalarEvolutionAliasAnalysis.cpp \
+  ScalarEvolutionExpander.cpp \
+  ScalarEvolutionNormalization.cpp \
+  SparsePropagation.cpp \
+  TargetTransformInfo.cpp \
+  Trace.cpp \
+  TypeBasedAliasAnalysis.cpp \
+  ValueTracking.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMAnalysis
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(analysis_SRC_FILES)
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMAnalysis
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(analysis_SRC_FILES)
+
+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..ff8a4ae
--- /dev/null
+++ b/lib/Analysis/IPA/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+analysis_ipa_SRC_FILES := \
+  CallGraph.cpp \
+  CallGraphSCCPass.cpp \
+  CallPrinter.cpp \
+  FindUsedTypes.cpp \
+  GlobalsModRef.cpp \
+  IPA.cpp \
+  InlineCost.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/Archive/Android.mk b/lib/Archive/Android.mk
new file mode 100644
index 0000000..e679f60
--- /dev/null
+++ b/lib/Archive/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH:= $(call my-dir)
+
+archive_SRC_FILES := \
+	Archive.cpp \
+	ArchiveReader.cpp \
+	ArchiveWriter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(archive_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMArchive
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(archive_SRC_FILES)
+
+LOCAL_MODULE := libLLVMArchive
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp
index 14713e6..2604fdf 100644
--- a/lib/Archive/ArchiveReader.cpp
+++ b/lib/Archive/ArchiveReader.cpp
@@ -18,6 +18,7 @@
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include <cctype>
 #include <cstdio>
 #include <cstdlib>
 using namespace llvm;
diff --git a/lib/AsmParser/Android.mk b/lib/AsmParser/Android.mk
new file mode 100644
index 0000000..2c9bbaf
--- /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..6e95cbc
--- /dev/null
+++ b/lib/Bitcode/Reader/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH:= $(call my-dir)
+
+bitcode_reader_SRC_FILES := \
+	BitReader.cpp	\
+	BitcodeReader.cpp \
+	BitstreamReader.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..fcafe37
--- /dev/null
+++ b/lib/Bitcode/Writer/Android.mk
@@ -0,0 +1,35 @@
+LOCAL_PATH:= $(call my-dir)
+
+bitcode_writer_SRC_FILES := \
+	BitWriter.cpp	\
+	BitcodeWriter.cpp	\
+	BitcodeWriterPass.cpp	\
+	ValueEnumerator.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(bitcode_writer_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMBitWriter
+
+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_writer_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMBitWriter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/CodeGen/Android.mk b/lib/CodeGen/Android.mk
new file mode 100644
index 0000000..3a06d4b
--- /dev/null
+++ b/lib/CodeGen/Android.mk
@@ -0,0 +1,139 @@
+LOCAL_PATH:= $(call my-dir)
+
+codegen_SRC_FILES := \
+  AggressiveAntiDepBreaker.cpp \
+  AllocationOrder.cpp \
+  Analysis.cpp \
+  BasicTargetTransformInfo.cpp \
+  BranchFolding.cpp \
+  CalcSpillWeights.cpp \
+  CallingConvLower.cpp \
+  CodeGen.cpp \
+  CodePlacementOpt.cpp \
+  CriticalAntiDepBreaker.cpp \
+  DFAPacketizer.cpp \
+  DeadMachineInstructionElim.cpp \
+  DwarfEHPrepare.cpp \
+  EarlyIfConversion.cpp \
+  EdgeBundles.cpp \
+  ExecutionDepsFix.cpp \
+  ExpandISelPseudos.cpp \
+  ExpandPostRAPseudos.cpp \
+  GCMetadata.cpp \
+  GCMetadataPrinter.cpp \
+  GCStrategy.cpp \
+  IfConversion.cpp \
+  InlineSpiller.cpp \
+  InterferenceCache.cpp \
+  IntrinsicLowering.cpp \
+  JITCodeEmitter.cpp \
+  LatencyPriorityQueue.cpp \
+  LexicalScopes.cpp \
+  LiveDebugVariables.cpp \
+  LiveInterval.cpp \
+  LiveIntervalAnalysis.cpp \
+  LiveIntervalUnion.cpp \
+  LiveRangeCalc.cpp \
+  LiveRangeEdit.cpp \
+  LiveRegMatrix.cpp \
+  LiveStackAnalysis.cpp \
+  LiveVariables.cpp \
+  LLVMTargetMachine.cpp \
+  LocalStackSlotAllocation.cpp \
+  MachineBasicBlock.cpp \
+  MachineBlockFrequencyInfo.cpp \
+  MachineBlockPlacement.cpp \
+  MachineBranchProbabilityInfo.cpp \
+  MachineCSE.cpp \
+  MachineCodeEmitter.cpp \
+  MachineCopyPropagation.cpp \
+  MachineDominators.cpp \
+  MachineFunction.cpp \
+  MachineFunctionAnalysis.cpp \
+  MachineFunctionPass.cpp \
+  MachineFunctionPrinterPass.cpp \
+  MachineInstr.cpp \
+  MachineInstrBundle.cpp \
+  MachineLICM.cpp \
+  MachineLoopInfo.cpp \
+  MachineModuleInfo.cpp \
+  MachineModuleInfoImpls.cpp \
+  MachinePassRegistry.cpp \
+  MachinePostDominators.cpp \
+  MachineRegisterInfo.cpp \
+  MachineSSAUpdater.cpp \
+  MachineScheduler.cpp \
+  MachineSink.cpp \
+  MachineTraceMetrics.cpp \
+  MachineVerifier.cpp \
+  OcamlGC.cpp \
+  OptimizePHIs.cpp \
+  PHIElimination.cpp \
+  PHIEliminationUtils.cpp \
+  Passes.cpp \
+  PeepholeOptimizer.cpp \
+  PostRASchedulerList.cpp \
+  ProcessImplicitDefs.cpp \
+  PrologEpilogInserter.cpp \
+  PseudoSourceValue.cpp \
+  RegAllocBase.cpp \
+  RegAllocBasic.cpp \
+  RegAllocFast.cpp \
+  RegAllocGreedy.cpp \
+  RegAllocPBQP.cpp \
+  RegisterClassInfo.cpp \
+  RegisterCoalescer.cpp \
+  RegisterPressure.cpp \
+  RegisterScavenging.cpp \
+  ScheduleDAG.cpp \
+  ScheduleDAGInstrs.cpp \
+  ScheduleDAGPrinter.cpp \
+  ScoreboardHazardRecognizer.cpp \
+  ShadowStackGC.cpp \
+  ShrinkWrapping.cpp \
+  SjLjEHPrepare.cpp \
+  SlotIndexes.cpp \
+  SpillPlacement.cpp \
+  Spiller.cpp \
+  SplitKit.cpp \
+  StackColoring.cpp \
+  StackProtector.cpp \
+  StackSlotColoring.cpp \
+  StrongPHIElimination.cpp \
+  TailDuplication.cpp \
+  TargetFrameLoweringImpl.cpp \
+  TargetInstrInfo.cpp \
+  TargetLoweringBase.cpp \
+  TargetLoweringObjectFileImpl.cpp \
+  TargetOptionsImpl.cpp \
+  TargetRegisterInfo.cpp \
+  TargetSchedule.cpp \
+  TwoAddressInstructionPass.cpp \
+  UnreachableBlockElim.cpp \
+  VirtRegMap.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..ce0f49b
--- /dev/null
+++ b/lib/CodeGen/AsmPrinter/Android.mk
@@ -0,0 +1,54 @@
+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	\
+	DwarfAccelTable.cpp \
+	DwarfCFIException.cpp \
+	DwarfCompileUnit.cpp \
+	DwarfDebug.cpp	\
+	DwarfException.cpp	\
+	OcamlGCPrinter.cpp \
+	Win64Exception.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 \
+	AsmPrinterDwarf.cpp \
+	AsmPrinterInlineAsm.cpp \
+	ARMException.cpp        \
+	DIE.cpp \
+	DwarfAccelTable.cpp \
+	DwarfCFIException.cpp \
+	DwarfCompileUnit.cpp \
+	DwarfDebug.cpp  \
+	DwarfException.cpp      \
+	Win64Exception.cpp \
+	$(LOCAL_SRC_FILES)
+
+LOCAL_MODULE:= libLLVMAsmPrinter
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/CodeGen/MachineScheduler.cpp b/lib/CodeGen/MachineScheduler.cpp
index 103b058..c872355 100644
--- a/lib/CodeGen/MachineScheduler.cpp
+++ b/lib/CodeGen/MachineScheduler.cpp
@@ -2182,7 +2182,7 @@
   /// Callback to select the highest priority node from the ready Q.
   virtual SUnit *pickNode(bool &IsTopNode) {
     if (ReadyQ.empty()) return NULL;
-    pop_heap(ReadyQ.begin(), ReadyQ.end(), Cmp);
+    std::pop_heap(ReadyQ.begin(), ReadyQ.end(), Cmp);
     SUnit *SU = ReadyQ.back();
     ReadyQ.pop_back();
     IsTopNode = false;
diff --git a/lib/CodeGen/SelectionDAG/Android.mk b/lib/CodeGen/SelectionDAG/Android.mk
new file mode 100644
index 0000000..3f28e08
--- /dev/null
+++ b/lib/CodeGen/SelectionDAG/Android.mk
@@ -0,0 +1,54 @@
+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 \
+  ResourcePriorityQueue.cpp \
+  ScheduleDAGFast.cpp \
+  ScheduleDAGRRList.cpp \
+  ScheduleDAGSDNodes.cpp \
+  ScheduleDAGVLIW.cpp \
+  SelectionDAG.cpp \
+  SelectionDAGBuilder.cpp \
+  SelectionDAGDumper.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..02cef81
--- /dev/null
+++ b/lib/ExecutionEngine/JIT/Android.mk
@@ -0,0 +1,18 @@
+LOCAL_PATH:= $(call my-dir)
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES :=	\
+	JIT.cpp	\
+	JITDwarfEmitter.cpp	\
+	JITEmitter.cpp	\
+	JITMemoryManager.cpp
+
+LOCAL_MODULE:= libLLVMJIT
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/IR/Android.mk b/lib/IR/Android.mk
new file mode 100644
index 0000000..6df36f8
--- /dev/null
+++ b/lib/IR/Android.mk
@@ -0,0 +1,72 @@
+LOCAL_PATH:= $(call my-dir)
+
+vmcore_SRC_FILES := \
+  AsmWriter.cpp \
+  Attributes.cpp \
+  AutoUpgrade.cpp \
+  BasicBlock.cpp \
+  ConstantFold.cpp \
+  Constants.cpp \
+  Core.cpp \
+  DataLayout.cpp \
+  DebugInfo.cpp \
+  DebugLoc.cpp \
+  DIBuilder.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 \
+  TypeFinder.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/lib/Linker/Android.mk b/lib/Linker/Android.mk
new file mode 100644
index 0000000..17d9a39
--- /dev/null
+++ b/lib/Linker/Android.mk
@@ -0,0 +1,31 @@
+LOCAL_PATH:= $(call my-dir)
+
+linker_SRC_FILES := \
+  LinkModules.cpp \
+  Linker.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_SRC_FILES := $(linker_SRC_FILES)
+
+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..a0b77ba
--- /dev/null
+++ b/lib/MC/Android.mk
@@ -0,0 +1,70 @@
+LOCAL_PATH:= $(call my-dir)
+
+mc_SRC_FILES := \
+  ELFObjectWriter.cpp \
+  MachObjectWriter.cpp \
+  MCAsmBackend.cpp \
+  MCAsmInfo.cpp \
+  MCAsmInfoCOFF.cpp \
+  MCAsmInfoDarwin.cpp \
+  MCAsmStreamer.cpp \
+  MCAssembler.cpp \
+  MCCodeEmitter.cpp \
+  MCCodeGenInfo.cpp \
+  MCContext.cpp \
+  MCDisassembler.cpp \
+  MCDwarf.cpp \
+  MCELF.cpp \
+  MCELFObjectTargetWriter.cpp \
+  MCELFStreamer.cpp \
+  MCExpr.cpp \
+  MCInst.cpp \
+  MCInstPrinter.cpp \
+  MCInstrAnalysis.cpp \
+  MCLabel.cpp \
+  MCMachObjectTargetWriter.cpp \
+  MCMachOStreamer.cpp \
+  MCNullStreamer.cpp \
+  MCObjectFileInfo.cpp \
+  MCObjectStreamer.cpp \
+  MCObjectWriter.cpp \
+  MCRegisterInfo.cpp \
+  MCSection.cpp \
+  MCSectionCOFF.cpp	\
+  MCSectionELF.cpp \
+  MCSectionMachO.cpp \
+  MCStreamer.cpp \
+  MCSubtargetInfo.cpp \
+  MCSymbol.cpp \
+  MCValue.cpp \
+  MCWin64EH.cpp \
+  WinCOFFObjectWriter.cpp \
+  WinCOFFStreamer.cpp \
+  SubtargetFeature.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/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 1829266..208a4d5 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -212,7 +212,8 @@
 }
 
 MCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent)
-  : Kind(_Kind), Parent(_Parent), Atom(0), Offset(~UINT64_C(0))
+  : Kind(_Kind), Parent(_Parent), Atom(0), Offset(~UINT64_C(0)),
+    LayoutOrder(~(0U))
 {
   if (Parent)
     Parent->getFragmentList().push_back(this);
@@ -263,7 +264,7 @@
 MCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,
                          MCCodeEmitter &Emitter_, MCObjectWriter &Writer_,
                          raw_ostream &OS_)
-  : Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(Writer_),
+  : Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(&Writer_),
     OS(OS_), BundleAlignSize(0), RelaxAll(false), NoExecStack(false),
     SubsectionsViaSymbols(false), ELFHeaderEFlags(0) {
 }
@@ -271,6 +272,11 @@
 MCAssembler::~MCAssembler() {
 }
 
+void MCAssembler::setWriter(MCObjectWriter &ObjectWriter) {
+  delete Writer;
+  Writer = &ObjectWriter;
+}
+
 void MCAssembler::reset() {
   Sections.clear();
   Symbols.clear();
diff --git a/lib/MC/MCParser/Android.mk b/lib/MC/MCParser/Android.mk
new file mode 100644
index 0000000..c6045d1
--- /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 \
+  MCTargetAsmParser.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/Object/Android.mk b/lib/Object/Android.mk
new file mode 100644
index 0000000..d7ba85d
--- /dev/null
+++ b/lib/Object/Android.mk
@@ -0,0 +1,40 @@
+LOCAL_PATH := $(call my-dir)
+
+object_SRC_FILES := \
+  Archive.cpp \
+  Binary.cpp \
+  COFFObjectFile.cpp \
+  ELFObjectFile.cpp \
+  Error.cpp \
+  MachOObject.cpp \
+  MachOObjectFile.cpp \
+  Object.cpp \
+  ObjectFile.cpp
+
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMObject
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(object_SRC_FILES)
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device only
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMObject
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(object_SRC_FILES)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp
index ca90e0e..b0b84fc 100644
--- a/lib/Object/COFFObjectFile.cpp
+++ b/lib/Object/COFFObjectFile.cpp
@@ -17,6 +17,8 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Triple.h"
 
+#include <ctype.h>
+
 using namespace llvm;
 using namespace object;
 
diff --git a/lib/Object/ELFObjectFile.cpp b/lib/Object/ELFObjectFile.cpp
index cfe0eb4..62626d7 100644
--- a/lib/Object/ELFObjectFile.cpp
+++ b/lib/Object/ELFObjectFile.cpp
@@ -14,6 +14,8 @@
 #include "llvm/Object/ELF.h"
 #include "llvm/Support/MathExtras.h"
 
+#include <ctype.h>
+
 namespace llvm {
 
 using namespace object;
diff --git a/lib/Support/Android.mk b/lib/Support/Android.mk
new file mode 100644
index 0000000..be3b2e6
--- /dev/null
+++ b/lib/Support/Android.mk
@@ -0,0 +1,113 @@
+LOCAL_PATH:= $(call my-dir)
+
+support_SRC_FILES := \
+  Allocator.cpp \
+  APFloat.cpp \
+  APInt.cpp \
+  APSInt.cpp \
+  Atomic.cpp \
+  BlockFrequency.cpp \
+  BranchProbability.cpp \
+  CommandLine.cpp \
+  ConstantRange.cpp \
+  ConvertUTF.c \
+  ConvertUTFWrapper.cpp \
+  CrashRecoveryContext.cpp \
+  DAGDeltaAlgorithm.cpp \
+  DataStream.cpp \
+  DataExtractor.cpp \
+  Debug.cpp \
+  DeltaAlgorithm.cpp \
+  Dwarf.cpp \
+  DynamicLibrary.cpp \
+  Errno.cpp \
+  ErrorHandling.cpp \
+  FileUtilities.cpp \
+  FoldingSet.cpp \
+  FormattedStream.cpp \
+  GraphWriter.cpp \
+  Hashing.cpp \
+  Host.cpp \
+  IntervalMap.cpp \
+  IntEqClasses.cpp \
+  IntrusiveRefCntPtr.cpp \
+  IsInf.cpp \
+  IsNAN.cpp \
+  Locale.cpp \
+  LockFileManager.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 \
+  StreamableMemoryObject.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 9559ad7..13d16d4 100644
--- a/lib/Support/Atomic.cpp
+++ b/lib/Support/Atomic.cpp
@@ -13,6 +13,9 @@
 
 #include "llvm/Support/Atomic.h"
 #include "llvm/Config/llvm-config.h"
+#if defined(ANDROID_TARGET_BUILD)
+#include "cutils/atomic.h"
+#endif
 
 using namespace llvm;
 
@@ -47,6 +50,9 @@
   if (result == old_value)
     *ptr = new_value;
   return result;
+#elif defined(ANDROID_TARGET_BUILD)
+  return android_atomic_cmpxchg((int32_t)old_value, (int32_t)new_value,
+                                (volatile int*)ptr);
 #elif defined(GNU_ATOMICS)
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 #elif defined(_MSC_VER)
@@ -60,6 +66,8 @@
 #if LLVM_HAS_ATOMICS == 0
   ++(*ptr);
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  return android_atomic_inc((volatile int*)ptr);
 #elif defined(GNU_ATOMICS)
   return __sync_add_and_fetch(ptr, 1);
 #elif defined(_MSC_VER)
@@ -73,6 +81,8 @@
 #if LLVM_HAS_ATOMICS == 0
   --(*ptr);
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  return android_atomic_dec((volatile int*)ptr);
 #elif defined(GNU_ATOMICS)
   return __sync_sub_and_fetch(ptr, 1);
 #elif defined(_MSC_VER)
@@ -86,6 +96,8 @@
 #if LLVM_HAS_ATOMICS == 0
   *ptr += val;
   return *ptr;
+#elif defined(ANDROID_TARGET_BUILD)
+  return android_atomic_add((int32_t)val, (volatile int*)ptr);
 #elif defined(GNU_ATOMICS)
   return __sync_add_and_fetch(ptr, val);
 #elif defined(_MSC_VER)
diff --git a/lib/Support/Unix/PathV2.inc b/lib/Support/Unix/PathV2.inc
index a3dfd4b..11c5b05 100644
--- a/lib/Support/Unix/PathV2.inc
+++ b/lib/Support/Unix/PathV2.inc
@@ -61,6 +61,8 @@
 # define PATH_MAX 4096
 #endif
 
+extern "C" int truncate (const char*, off_t);
+
 using namespace llvm;
 
 namespace {
diff --git a/lib/Support/Unix/Signals.inc b/lib/Support/Unix/Signals.inc
index 66338f1..b8be623 100644
--- a/lib/Support/Unix/Signals.inc
+++ b/lib/Support/Unix/Signals.inc
@@ -27,7 +27,7 @@
 #if HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
-#if HAVE_DLFCN_H && __GNUG__
+#if HAVE_DLFCN_H && HAVE_CXXABI_H && __GNUG__
 #include <dlfcn.h>
 #include <cxxabi.h>
 #endif
@@ -262,7 +262,7 @@
   // Use backtrace() to output a backtrace on Linux systems with glibc.
   int depth = backtrace(StackTrace,
                         static_cast<int>(array_lengthof(StackTrace)));
-#if HAVE_DLFCN_H && __GNUG__
+#if HAVE_DLFCN_H && HAVE_CXXABI_H && __GNUG__
   int width = 0;
   for (int i = 0; i < depth; ++i) {
     Dl_info dlinfo;
@@ -320,7 +320,7 @@
 void llvm::sys::PrintStackTraceOnErrorSignal() {
   AddSignalHandler(PrintStackTraceSignalHandler, 0);
 
-#if defined(__APPLE__)
+#if defined(__APPLE__) && !defined(ANDROID)
   // Environment variable to disable any kind of crash dialog.
   if (getenv("LLVM_DISABLE_CRASH_REPORT")) {
     mach_port_t self = mach_task_self();
@@ -346,7 +346,7 @@
 // the same linkage unit by just defining our own versions of the assert handler
 // and abort.
 
-#ifdef __APPLE__
+#if defined(__APPLE__) && !defined(ANDROID)
 
 #include <signal.h>
 #include <pthread.h>
diff --git a/lib/TableGen/Android.mk b/lib/TableGen/Android.mk
new file mode 100644
index 0000000..2169f33
--- /dev/null
+++ b/lib/TableGen/Android.mk
@@ -0,0 +1,37 @@
+LOCAL_PATH:= $(call my-dir)
+
+libtablegen_SRC_FILES := \
+  Error.cpp \
+  Main.cpp \
+  Record.cpp \
+  StringMatcher.cpp \
+  TableGenBackend.cpp \
+  TGLexer.cpp \
+  TGParser.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(libtablegen_SRC_FILES)
+LOCAL_MODULE:= libLLVMTableGen
+
+LOCAL_MODULE_TAGS := optional
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+## For the device
+## =====================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := $(libtablegen_SRC_FILES)
+#LOCAL_MODULE:= libLLVMTableGen
+#
+#LOCAL_MODULE_TAGS := optional
+#
+#include $(LLVM_DEVICE_BUILD_MK)
+#include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp
index 5e8e173..95decfe 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);
@@ -168,7 +172,13 @@
     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)
@@ -264,8 +274,20 @@
       return Binary;
     }
 
-    unsigned getHiLo16ImmOpValue(const MachineInstr &MI, unsigned Op) const {
-      return 0;
+    unsigned getHiLo16ImmOpValue(const MachineInstr &MI, unsigned Op)
+      const {
+      const MCInstrDesc &MCID = MI.getDesc();
+      const MachineOperand &MO = MI.getOperand(Op);
+
+      unsigned Reloc = (MCID.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)
@@ -287,9 +309,10 @@
     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()) {
@@ -311,10 +334,8 @@
         isAdd = false;
       }
 
-      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)
@@ -453,6 +474,9 @@
     return II->getRegisterInfo().getEncodingValue(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())
@@ -605,7 +629,9 @@
   case ARMII::VFPLdStMulFrm:
     emitVFPLoadStoreMultipleInstruction(MI);
     break;
-
+  case ARMII::VFPMiscFrm:
+    emitMiscInstruction(MI);
+    break;
   // NEON instructions.
   case ARMII::NGetLnFrm:
   case ARMII::NSetLnFrm:
@@ -627,6 +653,56 @@
   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;
+  }
+  }
+
+  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.
@@ -658,35 +734,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);
   }
 }
 
@@ -768,6 +816,32 @@
   emitWordLE(Binary);
 }
 
+void ARMCodeEmitter::emitLEApcrelInstruction(const MachineInstr &MI) {
+  // It's basically add r, pc, (LCPI - $+8)
+  const MCInstrDesc &MCID = 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, MCID);
+
+  // Encode Rd.
+  Binary |= getMachineOpValue(MI, 0) << ARMII::RegRdShift;
+
+  // Encode Rn which is PC.
+  Binary |= II->getRegisterInfo().getEncodingValue(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)
 
@@ -845,6 +919,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: {
     // First emit mov lr, pc
@@ -875,6 +957,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());
@@ -910,7 +995,10 @@
     else
       emitMOVi2piecesInstruction(MI);
     break;
-
+  case ARM::LEApcrel:
+    // Materialize constantpool index address.
+    emitLEApcrelInstruction(MI);
+    break;
   case ARM::LEApcrelJT:
     // Materialize jumptable address.
     emitLEApcrelJTInstruction(MI);
@@ -1011,6 +1099,11 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (MCID.Opcode == ARM::MOVi16 || MCID.Opcode == ARM::MOVTi16) {
+      emitWordLE(Binary);
+      return;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1113,11 +1206,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;
 
@@ -1273,6 +1372,11 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (MCID.getOpcode() == ARM::LDMIA_RET) {
+    IsUpdating = true;
+    Binary |= 0x8B00000;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1480,6 +1584,10 @@
   // Part of binary is determined by TableGn.
   unsigned Binary = getBinaryCodeForInstr(MI);
 
+  if (MCID.Opcode == ARM::B) {
+    Binary = 0xEA000000;
+  }
+
   // Set the conditional execution predicate
   Binary |= II->getPredicate(&MI) << ARMII::CondShift;
 
@@ -1554,9 +1662,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegClass.contains(RegD);
   RegD = II->getRegisterInfo().getEncodingValue(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;
   }
@@ -1569,9 +1678,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegClass.contains(RegN);
   RegN = II->getRegisterInfo().getEncodingValue(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;
   }
@@ -1584,9 +1694,10 @@
   unsigned Binary = 0;
   bool isSPVFP = ARM::SPRRegClass.contains(RegM);
   RegM = II->getRegisterInfo().getEncodingValue(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;
   }
@@ -1603,9 +1714,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++);
@@ -1695,6 +1803,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.
@@ -1770,6 +1884,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);
+}
+
 unsigned ARMCodeEmitter::encodeNEONRd(const MachineInstr &MI,
                                       unsigned OpIdx) const {
   unsigned RegD = MI.getOperand(OpIdx).getReg();
diff --git a/lib/Target/ARM/ARMRelocations.h b/lib/Target/ARM/ARMRelocations.h
index 21877fd..9c32b15 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/ARMSubtarget.cpp b/lib/Target/ARM/ARMSubtarget.cpp
index e11314d..f4d568c 100644
--- a/lib/Target/ARM/ARMSubtarget.cpp
+++ b/lib/Target/ARM/ARMSubtarget.cpp
@@ -26,7 +26,7 @@
 
 using namespace llvm;
 
-static cl::opt<bool>
+cl::opt<bool>
 ReserveR9("arm-reserve-r9", cl::Hidden,
           cl::desc("Reserve R9, making it unavailable as GPR"));
 
diff --git a/lib/Target/ARM/Android.mk b/lib/Target/ARM/Android.mk
new file mode 100644
index 0000000..0c8d7fd
--- /dev/null
+++ b/lib/Target/ARM/Android.mk
@@ -0,0 +1,84 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_codegen_TBLGEN_TABLES := \
+  ARMGenRegisterInfo.inc \
+  ARMGenInstrInfo.inc \
+  ARMGenCodeEmitter.inc \
+  ARMGenMCCodeEmitter.inc \
+  ARMGenMCPseudoLowering.inc \
+  ARMGenAsmWriter.inc \
+  ARMGenAsmMatcher.inc \
+  ARMGenDAGISel.inc \
+  ARMGenFastISel.inc \
+  ARMGenCallingConv.inc \
+  ARMGenSubtargetInfo.inc \
+  ARMGenDisassemblerTables.inc
+
+arm_codegen_SRC_FILES := \
+  ARMAsmPrinter.cpp \
+  ARMBaseInstrInfo.cpp \
+  ARMBaseRegisterInfo.cpp \
+  ARMCodeEmitter.cpp \
+  ARMConstantIslandPass.cpp \
+  ARMConstantPoolValue.cpp \
+  ARMExpandPseudoInsts.cpp \
+  ARMFastISel.cpp \
+  ARMFrameLowering.cpp \
+  ARMHazardRecognizer.cpp \
+  ARMISelDAGToDAG.cpp \
+  ARMISelLowering.cpp \
+  ARMInstrInfo.cpp \
+  ARMJITInfo.cpp \
+  ARMLoadStoreOptimizer.cpp \
+  ARMMCInstLower.cpp \
+  ARMMachineFunctionInfo.cpp \
+  ARMRegisterInfo.cpp \
+  ARMSelectionDAGInfo.cpp \
+  ARMSubtarget.cpp \
+  ARMTargetMachine.cpp \
+  ARMTargetObjectFile.cpp \
+  ARMTargetTransformInfo.cpp \
+  MLxExpansionPass.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)
+
+LOCAL_MODULE:= libLLVMARMCodeGen
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(arm_codegen_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/MCTargetDesc
+TBLGEN_TABLES := $(arm_codegen_TBLGEN_TABLES)
+
+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)
+
+LOCAL_MODULE:= libLLVMARMCodeGen
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(arm_codegen_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/MCTargetDesc
+TBLGEN_TABLES := $(arm_codegen_TBLGEN_TABLES)
+
+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..e17a274
--- /dev/null
+++ b/lib/Target/ARM/AsmParser/Android.mk
@@ -0,0 +1,61 @@
+LOCAL_PATH := $(call my-dir)
+
+#===---------------------------------------------------------------===
+# libARMAsmParser (common)
+#===---------------------------------------------------------------===
+
+arm_asm_parser_SRC_FILES := \
+  ARMAsmParser.cpp
+
+arm_asm_parser_TBLGEN_TABLES := \
+  ARMGenInstrInfo.inc \
+  ARMGenRegisterInfo.inc \
+  ARMGenAsmMatcher.inc \
+  ARMGenSubtargetInfo.inc
+
+arm_asm_parser_TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+arm_asm_parser_C_INCLUDES := $(LOCAL_PATH)/..
+
+
+#===---------------------------------------------------------------===
+# libARMAsmParser (host)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMARMAsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(arm_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(arm_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(arm_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(arm_asm_parser_TBLGEN_TD_DIR)
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+ifneq (,$(filter windows darwin,$(HOST_OS)))
+# Override the default optimization level to work around taking forever (~50m)
+# to compile ARMAsmParser.cpp on Mac with gcc 4.2,
+# or on Linux with mingw32msvc-gcc 4.2, which is used to cross-compile
+# the win_sdk.
+LOCAL_CFLAGS += -O0
+endif
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+#===---------------------------------------------------------------===
+# libARMAsmParser (target)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMARMAsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(arm_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(arm_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(arm_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(arm_asm_parser_TBLGEN_TD_DIR)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/ARM/Disassembler/Android.mk b/lib/Target/ARM/Disassembler/Android.mk
new file mode 100644
index 0000000..51e364b
--- /dev/null
+++ b/lib/Target/ARM/Disassembler/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_disassembler_TBLGEN_TABLES := \
+  ARMGenDisassemblerTables.inc \
+  ARMGenInstrInfo.inc \
+  ARMGenSubtargetInfo.inc \
+  ARMGenRegisterInfo.inc
+
+arm_disassembler_SRC_FILES := \
+  ARMDisassembler.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..a047f6f
--- /dev/null
+++ b/lib/Target/ARM/InstPrinter/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_asm_printer_TBLGEN_TABLES := \
+  ARMGenAsmWriter.inc \
+  ARMGenRegisterInfo.inc \
+  ARMGenSubtargetInfo.inc \
+  ARMGenInstrInfo.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/MCTargetDesc/Android.mk b/lib/Target/ARM/MCTargetDesc/Android.mk
new file mode 100644
index 0000000..b283ec5
--- /dev/null
+++ b/lib/Target/ARM/MCTargetDesc/Android.mk
@@ -0,0 +1,58 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_mc_desc_TBLGEN_TABLES := \
+  ARMGenRegisterInfo.inc \
+  ARMGenInstrInfo.inc \
+  ARMGenMCCodeEmitter.inc \
+  ARMGenSubtargetInfo.inc
+
+arm_mc_desc_SRC_FILES := \
+  ARMAsmBackend.cpp \
+  ARMELFObjectWriter.cpp \
+  ARMELFStreamer.cpp \
+  ARMMCAsmInfo.cpp \
+  ARMMCCodeEmitter.cpp \
+  ARMMCExpr.cpp \
+  ARMMCTargetDesc.cpp \
+  ARMMachObjectWriter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+
+LOCAL_MODULE:= libLLVMARMDesc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(arm_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(arm_mc_desc_TBLGEN_TABLES)
+
+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)
+
+LOCAL_MODULE:= libLLVMARMDesc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(arm_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(arm_mc_desc_TBLGEN_TABLES)
+
+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/TargetInfo/Android.mk b/lib/Target/ARM/TargetInfo/Android.mk
new file mode 100644
index 0000000..d1af6ae
--- /dev/null
+++ b/lib/Target/ARM/TargetInfo/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+arm_target_info_TBLGEN_TABLES := \
+  ARMGenSubtargetInfo.inc \
+  ARMGenRegisterInfo.inc \
+  ARMGenInstrInfo.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..60f5b18
--- /dev/null
+++ b/lib/Target/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+target_SRC_FILES := \
+  Mangler.cpp \
+  Target.cpp \
+  TargetIntrinsicInfo.cpp \
+  TargetJITInfo.cpp \
+  TargetLibraryInfo.cpp \
+  TargetLoweringObjectFile.cpp \
+  TargetMachineC.cpp \
+  TargetMachine.cpp \
+  TargetSubtargetInfo.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/Mips/Android.mk b/lib/Target/Mips/Android.mk
new file mode 100644
index 0000000..44271e9
--- /dev/null
+++ b/lib/Target/Mips/Android.mk
@@ -0,0 +1,75 @@
+LOCAL_PATH := $(call my-dir)
+
+mips_codegen_TBLGEN_TABLES := \
+  MipsGenRegisterInfo.inc \
+  MipsGenInstrInfo.inc \
+  MipsGenCodeEmitter.inc \
+  MipsGenMCCodeEmitter.inc \
+  MipsGenMCPseudoLowering.inc \
+  MipsGenAsmWriter.inc \
+  MipsGenDAGISel.inc \
+  MipsGenCallingConv.inc \
+  MipsGenSubtargetInfo.inc
+
+mips_codegen_SRC_FILES := \
+  Mips16FrameLowering.cpp \
+  Mips16InstrInfo.cpp \
+  Mips16RegisterInfo.cpp \
+  MipsAnalyzeImmediate.cpp \
+  MipsAsmPrinter.cpp \
+  MipsCodeEmitter.cpp \
+  MipsDelaySlotFiller.cpp \
+  MipsFrameLowering.cpp \
+  MipsInstrInfo.cpp \
+  MipsISelDAGToDAG.cpp \
+  MipsISelLowering.cpp \
+  MipsJITInfo.cpp \
+  MipsLongBranch.cpp \
+  MipsMachineFunction.cpp \
+  MipsMCInstLower.cpp \
+  MipsRegisterInfo.cpp \
+  MipsSEFrameLowering.cpp \
+  MipsSEInstrInfo.cpp \
+  MipsSERegisterInfo.cpp \
+  MipsSelectionDAGInfo.cpp \
+  MipsSubtarget.cpp \
+  MipsTargetMachine.cpp \
+  MipsTargetObjectFile.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsCodeGen
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_codegen_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/MCTargetDesc
+
+TBLGEN_TABLES := $(mips_codegen_TBLGEN_TABLES)
+
+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),mips)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsCodeGen
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_codegen_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/MCTargetDesc
+
+TBLGEN_TABLES := $(mips_codegen_TBLGEN_TABLES)
+
+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/Mips/AsmParser/Android.mk b/lib/Target/Mips/AsmParser/Android.mk
new file mode 100644
index 0000000..7d1817d
--- /dev/null
+++ b/lib/Target/Mips/AsmParser/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+#===---------------------------------------------------------------===
+# libLLVMMipsAsmParser (common)
+#===---------------------------------------------------------------===
+
+mips_asm_parser_SRC_FILES := \
+  MipsAsmParser.cpp
+
+mips_asm_parser_C_INCLUDES := $(LOCAL_PATH)/..
+
+mips_asm_parser_TBLGEN_TABLES := \
+  MipsGenAsmMatcher.inc \
+  MipsGenInstrInfo.inc \
+  MipsGenRegisterInfo.inc \
+  MipsGenSubtargetInfo.inc
+
+mips_asm_parser_TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+
+#===---------------------------------------------------------------===
+# libLLVMMipsAsmParser (host)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsAsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(mips_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(mips_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(mips_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+#===---------------------------------------------------------------===
+# libLLVMMipsAsmParser (target)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsAsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(mips_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(mips_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(mips_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/Mips/Disassembler/Android.mk b/lib/Target/Mips/Disassembler/Android.mk
new file mode 100644
index 0000000..4e38c4b
--- /dev/null
+++ b/lib/Target/Mips/Disassembler/Android.mk
@@ -0,0 +1,48 @@
+LOCAL_PATH := $(call my-dir)
+
+mips_disassembler_TBLGEN_TABLES := \
+  MipsGenDisassemblerTables.inc \
+  MipsGenInstrInfo.inc \
+  MipsGenRegisterInfo.inc \
+  MipsGenSubtargetInfo.inc
+
+mips_disassembler_SRC_FILES := \
+  MipsDisassembler.cpp
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),mips)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsDisassembler
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_disassembler_SRC_FILES)
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+TBLGEN_TABLES := $(mips_disassembler_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+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)
+
+LOCAL_MODULE:= libLLVMMipsDisassembler
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_disassembler_SRC_FILES)
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+TBLGEN_TABLES := $(mips_disassembler_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/Target/Mips/InstPrinter/Android.mk b/lib/Target/Mips/InstPrinter/Android.mk
new file mode 100644
index 0000000..fc256cd
--- /dev/null
+++ b/lib/Target/Mips/InstPrinter/Android.mk
@@ -0,0 +1,46 @@
+LOCAL_PATH := $(call my-dir)
+
+mips_asm_printer_TBLGEN_TABLES := \
+  MipsGenAsmWriter.inc \
+  MipsGenRegisterInfo.inc \
+  MipsGenSubtargetInfo.inc \
+  MipsGenInstrInfo.inc
+
+mips_asm_printer_SRC_FILES := \
+  MipsInstPrinter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsAsmPrinter
+LOCAL_MODULE_TAGS := optional
+
+TBLGEN_TABLES := $(mips_asm_printer_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(mips_asm_printer_SRC_FILES)
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+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)
+
+LOCAL_MODULE:= libLLVMMipsAsmPrinter
+LOCAL_MODULE_TAGS := optional
+
+TBLGEN_TABLES := $(mips_asm_printer_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(mips_asm_printer_SRC_FILES)
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/Mips/MCTargetDesc/Android.mk b/lib/Target/Mips/MCTargetDesc/Android.mk
new file mode 100644
index 0000000..733acdb
--- /dev/null
+++ b/lib/Target/Mips/MCTargetDesc/Android.mk
@@ -0,0 +1,57 @@
+LOCAL_PATH := $(call my-dir)
+
+mips_mc_desc_TBLGEN_TABLES := \
+  MipsGenRegisterInfo.inc \
+  MipsGenInstrInfo.inc \
+  MipsGenMCCodeEmitter.inc \
+  MipsGenSubtargetInfo.inc
+
+mips_mc_desc_SRC_FILES := \
+  MipsAsmBackend.cpp \
+  MipsDirectObjLower.cpp \
+  MipsELFObjectWriter.cpp \
+  MipsELFStreamer.cpp \
+  MipsMCAsmInfo.cpp \
+  MipsMCCodeEmitter.cpp \
+  MipsMCTargetDesc.cpp \
+  MipsReginfo.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsDesc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(mips_mc_desc_TBLGEN_TABLES)
+
+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),mips)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsDesc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(mips_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(mips_mc_desc_TBLGEN_TABLES)
+
+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/Mips/TargetInfo/Android.mk b/lib/Target/Mips/TargetInfo/Android.mk
new file mode 100644
index 0000000..e3f41bc
--- /dev/null
+++ b/lib/Target/Mips/TargetInfo/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)
+
+mips_target_info_TBLGEN_TABLES := \
+  MipsGenInstrInfo.inc \
+  MipsGenRegisterInfo.inc \
+  MipsGenSubtargetInfo.inc
+
+mips_target_info_SRC_FILES := \
+  MipsTargetInfo.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsInfo
+LOCAL_MODULE_TAGS := optional
+
+TBLGEN_TABLES := $(mips_target_info_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(mips_target_info_SRC_FILES)
+LOCAL_C_INCLUDES +=	$(LOCAL_PATH)/..
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the device
+# =====================================================
+ifeq ($(TARGET_ARCH),mips)
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMMipsInfo
+LOCAL_MODULE_TAGS := optional
+
+TBLGEN_TABLES := $(mips_target_info_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+LOCAL_SRC_FILES := $(mips_target_info_SRC_FILES)
+LOCAL_C_INCLUDES +=	$(LOCAL_PATH)/..
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
+endif
diff --git a/lib/Target/X86/Android.mk b/lib/Target/X86/Android.mk
new file mode 100644
index 0000000..f159bb2
--- /dev/null
+++ b/lib/Target/X86/Android.mk
@@ -0,0 +1,71 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_codegen_TBLGEN_TABLES := \
+  X86GenAsmWriter.inc \
+  X86GenAsmWriter1.inc \
+  X86GenRegisterInfo.inc \
+  X86GenInstrInfo.inc \
+  X86GenDAGISel.inc \
+  X86GenFastISel.inc \
+  X86GenSubtargetInfo.inc \
+  X86GenCallingConv.inc
+
+x86_codegen_SRC_FILES := \
+  X86AsmPrinter.cpp \
+  X86COFFMachineModuleInfo.cpp \
+  X86CodeEmitter.cpp \
+  X86FastISel.cpp \
+  X86FloatingPoint.cpp \
+  X86FrameLowering.cpp \
+  X86ISelDAGToDAG.cpp \
+  X86ISelLowering.cpp \
+  X86InstrInfo.cpp \
+  X86JITInfo.cpp \
+  X86MachineFunctionInfo.cpp \
+  X86MCInstLower.cpp \
+  X86PadShortFunction.cpp \
+  X86RegisterInfo.cpp \
+  X86SelectionDAGInfo.cpp \
+  X86Subtarget.cpp \
+  X86TargetMachine.cpp \
+  X86TargetObjectFile.cpp \
+  X86TargetTransformInfo.cpp \
+  X86VZeroUpper.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..d6de437
--- /dev/null
+++ b/lib/Target/X86/AsmParser/Android.mk
@@ -0,0 +1,56 @@
+LOCAL_PATH := $(call my-dir)
+
+# For the device only
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+x86_asm_parser_SRC_FILES :=	\
+	X86AsmParser.cpp
+
+x86_asm_parser_TBLGEN_TABLES :=	\
+	X86GenAsmMatcher.inc	\
+	X86GenInstrInfo.inc	\
+	X86GenRegisterInfo.inc \
+	X86GenSubtargetInfo.inc
+
+x86_asm_parser_TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+x86_asm_parser_C_INCLUDES +=	\
+	$(LOCAL_PATH)/..
+
+
+#===---------------------------------------------------------------===
+# libX86AsmParser (host)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMX86AsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(x86_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(x86_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(x86_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(x86_asm_parser_TBLGEN_TD_DIR)
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+#===---------------------------------------------------------------===
+# libX86AsmParser (target)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMX86AsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(x86_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(x86_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(x86_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(x86_asm_parser_TBLGEN_TD_DIR)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/X86/Disassembler/Android.mk b/lib/Target/X86/Disassembler/Android.mk
new file mode 100644
index 0000000..1cee663
--- /dev/null
+++ b/lib/Target/X86/Disassembler/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_disassembler_TBLGEN_TABLES := \
+  X86GenDisassemblerTables.inc \
+  X86GenInstrInfo.inc \
+  X86GenRegisterInfo.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..0fd7058
--- /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 \
+  X86GenInstrInfo.inc \
+  X86GenRegisterInfo.inc \
+  X86GenSubtargetInfo.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/MCTargetDesc/Android.mk b/lib/Target/X86/MCTargetDesc/Android.mk
new file mode 100644
index 0000000..39478b3
--- /dev/null
+++ b/lib/Target/X86/MCTargetDesc/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_mc_desc_TBLGEN_TABLES := \
+  X86GenRegisterInfo.inc \
+  X86GenInstrInfo.inc \
+  X86GenSubtargetInfo.inc
+
+x86_mc_desc_SRC_FILES := \
+  X86AsmBackend.cpp \
+  X86ELFObjectWriter.cpp \
+  X86MCTargetDesc.cpp \
+  X86MCAsmInfo.cpp \
+  X86MCCodeEmitter.cpp \
+  X86MachObjectWriter.cpp \
+  X86WinCOFFObjectWriter.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMX86Desc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(x86_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(x86_mc_desc_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+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)
+
+
+LOCAL_MODULE:= libLLVMX86Desc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(x86_mc_desc_SRC_FILES)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
+TBLGEN_TABLES := $(x86_mc_desc_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+
+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/TargetInfo/Android.mk b/lib/Target/X86/TargetInfo/Android.mk
new file mode 100644
index 0000000..c72b383
--- /dev/null
+++ b/lib/Target/X86/TargetInfo/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+x86_target_info_TBLGEN_TABLES := \
+  X86GenRegisterInfo.inc \
+  X86GenSubtargetInfo.inc \
+  X86GenInstrInfo.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/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 10cf13f..e6858bc 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -18253,8 +18253,8 @@
   if (Res.second == 0) {
     // Map st(0) -> st(7) -> ST0
     if (Constraint.size() == 7 && Constraint[0] == '{' &&
-        tolower(Constraint[1]) == 's' &&
-        tolower(Constraint[2]) == 't' &&
+        std::tolower(Constraint[1]) == 's' &&
+        std::tolower(Constraint[2]) == 't' &&
         Constraint[3] == '(' &&
         (Constraint[4] >= '0' && Constraint[4] <= '7') &&
         Constraint[5] == ')' &&
diff --git a/lib/Transforms/IPO/Android.mk b/lib/Transforms/IPO/Android.mk
new file mode 100644
index 0000000..dcf48df
--- /dev/null
+++ b/lib/Transforms/IPO/Android.mk
@@ -0,0 +1,50 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_ipo_SRC_FILES := \
+  ArgumentPromotion.cpp \
+  BarrierNoopPass.cpp \
+  ConstantMerge.cpp \
+  DeadArgumentElimination.cpp \
+  ExtractGV.cpp \
+  FunctionAttrs.cpp \
+  GlobalDCE.cpp \
+  GlobalOpt.cpp \
+  IPConstantPropagation.cpp \
+  IPO.cpp \
+  InlineAlways.cpp \
+  InlineSimple.cpp \
+  Inliner.cpp \
+  Internalize.cpp \
+  LoopExtractor.cpp \
+  MergeFunctions.cpp \
+  PartialInlining.cpp \
+  PassManagerBuilder.cpp \
+  PruneEH.cpp \
+  StripDeadPrototypes.cpp \
+  StripSymbols.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..31605d9
--- /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..9736619
--- /dev/null
+++ b/lib/Transforms/Instrumentation/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+instrumentation_SRC_FILES := \
+  AddressSanitizer.cpp \
+  BlackList.cpp \
+  BoundsChecking.cpp \
+  EdgeProfiling.cpp \
+  GCOVProfiling.cpp \
+  Instrumentation.cpp \
+  MemorySanitizer.cpp \
+  OptimalEdgeProfiling.cpp \
+  PathProfiling.cpp \
+  ProfilingUtils.cpp \
+  ThreadSanitizer.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMInstrumentation
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(instrumentation_SRC_FILES)
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the target
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMInstrumentation
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(instrumentation_SRC_FILES)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/ObjCARC/Android.mk b/lib/Transforms/ObjCARC/Android.mk
new file mode 100644
index 0000000..126d7ee
--- /dev/null
+++ b/lib/Transforms/ObjCARC/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_objcarc_SRC_FILES := \
+  DependencyAnalysis.cpp \
+  ObjCARCAliasAnalysis.cpp \
+  ObjCARCAPElim.cpp \
+  ObjCARCContract.cpp \
+  ObjCARC.cpp \
+  ObjCARCExpand.cpp \
+  ObjCARCOpts.cpp \
+  ObjCARCUtil.cpp \
+  ProvenanceAnalysis.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_objcarc_SRC_FILES)
+LOCAL_MODULE:= libLLVMTransformObjCARC
+
+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_objcarc_SRC_FILES)
+LOCAL_MODULE:= libLLVMTransformObjCARC
+
+LOCAL_MODULE_TAGS := optional
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/Scalar/Android.mk b/lib/Transforms/Scalar/Android.mk
new file mode 100644
index 0000000..c20b9d9
--- /dev/null
+++ b/lib/Transforms/Scalar/Android.mk
@@ -0,0 +1,70 @@
+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 \
+  GlobalMerge.cpp \
+  GVN.cpp \
+  IndVarSimplify.cpp \
+  JumpThreading.cpp \
+  LICM.cpp \
+  LoopDeletion.cpp \
+  LoopIdiomRecognize.cpp \
+  LoopInstSimplify.cpp \
+  LoopRotation.cpp \
+  LoopStrengthReduce.cpp \
+  LoopUnrollPass.cpp \
+  LoopUnswitch.cpp \
+  LowerAtomic.cpp \
+  MemCpyOptimizer.cpp \
+  Reassociate.cpp \
+  Reg2Mem.cpp \
+  SCCP.cpp \
+  SROA.cpp \
+  Scalar.cpp \
+  ScalarReplAggregates.cpp \
+  SimplifyCFGPass.cpp \
+  SimplifyLibCalls.cpp \
+  Sink.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
+
+# Override the default optimization level to work around a SIGSEGV
+# on x86 target builds for SROA.cpp.
+# Bug: 8047767
+ifeq ($(TARGET_ARCH),x86)
+LOCAL_CFLAGS += -O1
+endif
+
+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..df87208
--- /dev/null
+++ b/lib/Transforms/Utils/Android.mk
@@ -0,0 +1,60 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_utils_SRC_FILES := \
+  BasicBlockUtils.cpp \
+  BreakCriticalEdges.cpp \
+  BuildLibCalls.cpp \
+  BypassSlowDivision.cpp \
+  CloneFunction.cpp \
+  CloneModule.cpp \
+  CmpInstAnalysis.cpp \
+  CodeExtractor.cpp \
+  DemoteRegToStack.cpp \
+  InlineFunction.cpp \
+  InstructionNamer.cpp \
+  LCSSA.cpp \
+  Local.cpp \
+  LoopSimplify.cpp \
+  LoopUnroll.cpp \
+  LoopUnrollRuntime.cpp \
+  LowerExpectIntrinsic.cpp \
+  LowerInvoke.cpp \
+  LowerSwitch.cpp \
+  Mem2Reg.cpp \
+  MetaRenamer.cpp \
+  ModuleUtils.cpp \
+  PromoteMemoryToRegister.cpp \
+  SSAUpdater.cpp \
+  SimplifyCFG.cpp \
+  SimplifyIndVar.cpp \
+  SimplifyInstructions.cpp \
+  SimplifyLibCalls.cpp \
+  UnifyFunctionExitNodes.cpp \
+  Utils.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/Transforms/Vectorize/Android.mk b/lib/Transforms/Vectorize/Android.mk
new file mode 100644
index 0000000..de03793
--- /dev/null
+++ b/lib/Transforms/Vectorize/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH:= $(call my-dir)
+
+transforms_vectorize_SRC_FILES := \
+  BBVectorize.cpp \
+  LoopVectorize.cpp \
+  Vectorize.cpp
+
+# For the host
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(transforms_vectorize_SRC_FILES)
+LOCAL_MODULE:= libLLVMVectorize
+
+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_vectorize_SRC_FILES)
+LOCAL_MODULE:= libLLVMVectorize
+
+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..30baec0
--- /dev/null
+++ b/llvm-device-build.mk
@@ -0,0 +1,76 @@
+LOCAL_CFLAGS :=	\
+	-D_GNU_SOURCE	\
+	-D__STDC_LIMIT_MACROS	\
+	-D__STDC_CONSTANT_MACROS	\
+	-D__STDC_FORMAT_MACROS	\
+	-O2	\
+	-fomit-frame-pointer	\
+	-Wall	\
+	-W	\
+	-Wno-unused-parameter	\
+	-Wwrite-strings	\
+	$(LOCAL_CFLAGS)
+
+# 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)
+
+ifeq ($(TARGET_BUILD_VARIANT),eng)
+LOCAL_CFLAGS := -DANDROID_ENGINEERING_BUILD \
+                $(LOCAL_CFLAGS)
+endif
+
+ifeq ($(LLVM_ENABLE_ASSERTION),true)
+LOCAL_CFLAGS :=	\
+	$(LOCAL_CFLAGS) \
+	-D_DEBUG	\
+	-UNDEBUG
+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 :=	\
+	bionic \
+	external/stlport/stlport \
+	$(LLVM_ROOT_PATH)	\
+	$(LLVM_ROOT_PATH)/include	\
+	$(LLVM_ROOT_PATH)/device/include	\
+	$(LOCAL_C_INCLUDES)
+
+###########################################################
+## Commands for running tblgen to compile a td file
+###########################################################
+define transform-device-td-to-out
+@mkdir -p $(dir $@)
+@echo "Device TableGen (gen-$(1)): $(TBLGEN_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..bae748e
--- /dev/null
+++ b/llvm-gen-intrinsics.mk
@@ -0,0 +1,19 @@
+# We treat Intrinsics.td as a very special target just like what lib/VMCore/Makefile does
+INTRINSICTD := $(LLVM_ROOT_PATH)/include/llvm/IR/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/IR/,Intrinsics.gen)
+LOCAL_GENERATED_SOURCES += $(GENFILE)
+$(GENFILE): TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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..9fd7435
--- /dev/null
+++ b/llvm-host-build.mk
@@ -0,0 +1,62 @@
+LOCAL_CFLAGS :=	\
+	-D_GNU_SOURCE	\
+	-D__STDC_LIMIT_MACROS	\
+	-D__STDC_CONSTANT_MACROS	\
+	-D__STDC_FORMAT_MACROS	\
+	-O2	\
+	-fomit-frame-pointer	\
+	-Wall	\
+	-W	\
+	-Wno-unused-parameter	\
+	-Wwrite-strings	\
+	$(LOCAL_CFLAGS)
+
+ifeq ($(LLVM_ENABLE_ASSERTION),true)
+LOCAL_CFLAGS :=	\
+	$(LOCAL_CFLAGS) \
+	-D_DEBUG	\
+	-UNDEBUG
+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: $(TBLGEN_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..e3a7ca3
--- /dev/null
+++ b/llvm-tblgen-rules.mk
@@ -0,0 +1,208 @@
+###########################################################
+## 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 $(tblgen_source_dir),MCTargetDesc))
+tblgen_td_deps := $(tblgen_source_dir)/../*.td
+else
+tblgen_td_deps := $(tblgen_source_dir)/*.td
+endif
+tblgen_td_deps := $(wildcard $(tblgen_td_deps))
+
+#
+# The directory and the .td directory is not the same.
+#
+ifeq ($(tblgen_source_dir),$(LLVM_ROOT_PATH)/lib/Target/ARM/MCTargetDesc)
+$(intermediates)/%GenRegisterInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/../%.td \
+                                       $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out, register-info)
+
+$(intermediates)/%GenInstrInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/../%.td \
+                                    $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,instr-info)
+
+$(intermediates)/%GenSubtargetInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenSubtargetInfo.inc: $(tblgen_source_dir)/../%.td \
+                                        $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifeq ($(tblgen_source_dir),$(LLVM_ROOT_PATH)/lib/Target/X86/MCTargetDesc)
+$(intermediates)/%GenRegisterInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/../%.td \
+                                       $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out, register-info)
+
+$(intermediates)/%GenInstrInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/../%.td \
+                                    $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,instr-info)
+
+$(intermediates)/%GenSubtargetInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenSubtargetInfo.inc: $(tblgen_source_dir)/../%.td \
+                                        $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifeq ($(tblgen_source_dir),$(LLVM_ROOT_PATH)/lib/Target/Mips/MCTargetDesc)
+$(intermediates)/%GenRegisterInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/../%.td \
+                                       $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out, register-info)
+
+$(intermediates)/%GenInstrInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/../%.td \
+                                    $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,instr-info)
+
+$(intermediates)/%GenSubtargetInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenSubtargetInfo.inc: $(tblgen_source_dir)/../%.td \
+                                        $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+
+ifneq ($(filter %GenRegisterInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenRegisterInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenRegisterInfo.inc: $(tblgen_source_dir)/%.td \
+                                       $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,register-info)
+endif
+
+ifneq ($(filter %GenInstrInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenInstrInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenInstrInfo.inc: $(tblgen_source_dir)/%.td \
+                                    $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,instr-info)
+endif
+
+ifneq ($(filter %GenAsmWriter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenAsmWriter.inc: $(tblgen_source_dir)/%.td \
+                                    $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,asm-writer)
+endif
+
+ifneq ($(filter %GenAsmWriter1.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmWriter1.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenAsmWriter1.inc: $(tblgen_source_dir)/%.td \
+                                     $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,asm-writer -asmwriternum=1)
+endif
+
+ifneq ($(filter %GenAsmMatcher.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenAsmMatcher.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenAsmMatcher.inc: $(tblgen_source_dir)/%.td \
+                                     $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,asm-matcher)
+endif
+
+ifneq ($(filter %GenCodeEmitter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCodeEmitter.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenCodeEmitter.inc: $(tblgen_source_dir)/%.td \
+                                      $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,emitter)
+endif
+
+ifneq ($(filter %GenMCCodeEmitter.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenMCCodeEmitter.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenMCCodeEmitter.inc: $(tblgen_source_dir)/%.td \
+                                        $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,emitter -mc-emitter)
+endif
+
+ifneq ($(filter %GenMCPseudoLowering.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenMCPseudoLowering.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenMCPseudoLowering.inc: $(tblgen_source_dir)/%.td \
+                                           $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,pseudo-lowering)
+endif
+
+ifneq ($(filter %GenDAGISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDAGISel.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenDAGISel.inc: $(tblgen_source_dir)/%.td \
+                                  $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,dag-isel)
+endif
+
+ifneq ($(filter %GenDisassemblerTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDisassemblerTables.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenDisassemblerTables.inc: $(tblgen_source_dir)/%.td \
+                                             $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,disassembler)
+endif
+
+ifneq ($(filter %GenEDInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenEDInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenEDInfo.inc: $(tblgen_source_dir)/%.td \
+                                 $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,enhanced-disassembly-info)
+endif
+
+ifneq ($(filter %GenFastISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenFastISel.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenFastISel.inc: $(tblgen_source_dir)/%.td \
+                                   $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,fast-isel)
+endif
+
+ifneq ($(filter %GenSubtargetInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenSubtargetInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenSubtargetInfo.inc: $(tblgen_source_dir)/%.td \
+                                        $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifneq ($(filter %GenCallingConv.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCallingConv.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenCallingConv.inc: $(tblgen_source_dir)/%.td \
+                                      $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,callingconv)
+endif
+
+ifneq ($(filter %GenIntrinsics.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenIntrinsics.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenIntrinsics.inc: $(tblgen_source_dir)/%.td \
+                                     $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,tgt_intrinsics)
+endif
+
+ifneq ($(findstring ARMGenDecoderTables.inc,$(tblgen_gen_tables)),)
+$(intermediates)/ARMGenDecoderTables.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/ARMGenDecoderTables.inc: $(tblgen_source_dir)/ARM.td \
+                                          $(tblgen_td_deps) | $(TBLGEN)
+	$(call transform-td-to-out,arm-decoder)
+endif
+
+# Reset local variables
+tblgen_td_deps :=
+
+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/shared_llvm.mk b/shared_llvm.mk
new file mode 100644
index 0000000..43f0947
--- /dev/null
+++ b/shared_llvm.mk
@@ -0,0 +1,116 @@
+# Don't build the library in unbundled branches.
+ifeq (,$(TARGET_BUILD_APPS))
+
+LOCAL_PATH:= $(call my-dir)
+
+llvm_pre_static_libraries := \
+  libLLVMLinker \
+  libLLVMipo \
+  libLLVMBitWriter \
+  libLLVMBitReader
+
+llvm_arm_static_libraries := \
+  libLLVMARMCodeGen \
+  libLLVMARMAsmParser \
+  libLLVMARMAsmPrinter \
+  libLLVMARMInfo \
+  libLLVMARMDesc \
+  libLLVMARMDisassembler
+
+llvm_x86_static_libraries := \
+  libLLVMX86CodeGen \
+  libLLVMX86Info \
+  libLLVMX86Desc \
+  libLLVMX86AsmParser \
+  libLLVMX86AsmPrinter \
+  libLLVMX86Utils \
+  libLLVMX86Disassembler
+
+llvm_mips_static_libraries := \
+  libLLVMMipsCodeGen \
+  libLLVMMipsInfo \
+  libLLVMMipsDesc \
+  libLLVMMipsAsmParser \
+  libLLVMMipsAsmPrinter \
+  libLLVMMipsDisassembler
+
+llvm_post_static_libraries := \
+  libLLVMAsmPrinter \
+  libLLVMSelectionDAG \
+  libLLVMCodeGen \
+  libLLVMScalarOpts \
+  libLLVMInstCombine \
+  libLLVMInstrumentation \
+  libLLVMTransformObjCARC \
+  libLLVMTransformUtils \
+  libLLVMipa \
+  libLLVMAnalysis \
+  libLLVMTarget \
+  libLLVMMC \
+  libLLVMMCParser \
+  libLLVMCore \
+  libLLVMArchive \
+  libLLVMAsmParser \
+  libLLVMSupport \
+  libLLVMVectorize
+
+# HOST LLVM shared library build
+include $(CLEAR_VARS)
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_MODULE:= libLLVM
+
+LOCAL_MODULE_TAGS := optional
+
+# Host build pulls in all ARM, Mips, X86 components.
+LOCAL_WHOLE_STATIC_LIBRARIES := \
+  $(llvm_pre_static_libraries) \
+  $(llvm_arm_static_libraries) \
+  $(llvm_x86_static_libraries) \
+  $(llvm_mips_static_libraries) \
+  $(llvm_post_static_libraries)
+
+ifeq ($(HOST_OS),windows)
+  LOCAL_LDLIBS := -limagehlp -lpsapi
+else
+  LOCAL_LDLIBS := -ldl -lpthread
+endif
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
+# DEVICE LLVM shared library build
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVM
+
+LOCAL_MODULE_TAGS := optional
+
+# Device build selectively pulls in ARM, Mips, X86 components.
+LOCAL_WHOLE_STATIC_LIBRARIES := \
+  $(llvm_pre_static_libraries)
+
+ifeq ($(TARGET_ARCH),arm)
+  LOCAL_WHOLE_STATIC_LIBRARIES += $(llvm_arm_static_libraries)
+else
+  ifeq ($(TARGET_ARCH),x86)
+    LOCAL_WHOLE_STATIC_LIBRARIES += $(llvm_x86_static_libraries)
+  else
+    ifeq ($(TARGET_ARCH),mips)
+      LOCAL_WHOLE_STATIC_LIBRARIES += $(llvm_mips_static_libraries)
+    else
+      $(error Unsupported architecture $(TARGET_ARCH))
+    endif
+  endif
+endif
+
+LOCAL_WHOLE_STATIC_LIBRARIES += $(llvm_post_static_libraries)
+
+#LOCAL_LDLIBS := -ldl -lpthread
+LOCAL_SHARED_LIBRARIES := libcutils libdl libstlport
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_SHARED_LIBRARY)
+
+endif # don't build in unbundled branches
\ No newline at end of file
diff --git a/tblgen-rules.mk b/tblgen-rules.mk
new file mode 100644
index 0000000..f2ae041
--- /dev/null
+++ b/tblgen-rules.mk
@@ -0,0 +1,142 @@
+###########################################################
+## 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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenMCCodeEmitter.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,emitter -mc-emitter)
+endif
+
+ifneq ($(filter %GenMCPseudoLowering.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenMCPseudoLowering.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenMCPseudoLowering.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,pseudo-lowering)
+endif
+
+ifneq ($(filter %GenDAGISel.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenDAGISel.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenFastISel.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,fast-isel)
+endif
+
+ifneq ($(filter %GenSubtargetInfo.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenSubtargetInfo.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/%GenSubtargetInfo.inc: $(tblgen_source_dir)/%.td $(TBLGEN)
+	$(call transform-td-to-out,subtarget)
+endif
+
+ifneq ($(filter %GenCallingConv.inc,$(tblgen_gen_tables)),)
+$(intermediates)/%GenCallingConv.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(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_LOCAL_MODULE := $(LOCAL_MODULE)
+$(intermediates)/ARMGenDecoderTables.inc: $(tblgen_source_dir)/ARM.td $(TBLGEN)
+	$(call transform-td-to-out,arm-decoder)
+endif
+
+endif
diff --git a/tools/llc/Android.mk b/tools/llc/Android.mk
new file mode 100644
index 0000000..f74e9a7
--- /dev/null
+++ b/tools/llc/Android.mk
@@ -0,0 +1,125 @@
+LOCAL_PATH := $(call my-dir)
+
+LLVM_ROOT_PATH := $(LOCAL_PATH)/../..
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (common)
+#===---------------------------------------------------------------===
+
+llvm_llc_SRC_FILES := \
+  llc.cpp
+
+llvm_llc_mips_STATIC_LIBRARIES := \
+  libLLVMMipsAsmParser \
+  libLLVMMipsInfo \
+  libLLVMMipsCodeGen \
+  libLLVMMipsDesc \
+  libLLVMMipsAsmPrinter \
+
+llvm_llc_x86_STATIC_LIBRARIES := \
+  libLLVMX86Info \
+  libLLVMX86AsmParser \
+  libLLVMX86CodeGen \
+  libLLVMX86Disassembler \
+  libLLVMX86Desc \
+  libLLVMX86AsmPrinter \
+  libLLVMX86Utils
+
+llvm_llc_arm_STATIC_LIBRARIES := \
+  libLLVMARMCodeGen \
+  libLLVMARMDisassembler \
+  libLLVMARMAsmParser \
+  libLLVMARMAsmPrinter \
+  libLLVMARMDesc \
+  libLLVMARMInfo
+
+llvm_llc_STATIC_LIBRARIES := \
+  libLLVMAsmPrinter \
+  libLLVMAsmParser \
+  libLLVMBitReader \
+  libLLVMBitWriter \
+  libLLVMSelectionDAG \
+  libLLVMInstCombine \
+  libLLVMInstrumentation \
+  libLLVMCodeGen \
+  libLLVMipo \
+  libLLVMipa \
+  libLLVMLinker \
+  libLLVMMC \
+  libLLVMMCParser \
+  libLLVMScalarOpts \
+  libLLVMTransformUtils \
+  libLLVMVectorize \
+  libLLVMAnalysis \
+  libLLVMTarget \
+  libLLVMCore \
+  libLLVMSupport
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (host)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_SRC_FILES := $(llvm_llc_SRC_FILES)
+
+LOCAL_STATIC_LIBRARIES := \
+  $(llvm_llc_arm_STATIC_LIBRARIES) \
+  $(llvm_llc_mips_STATIC_LIBRARIES) \
+  $(llvm_llc_x86_STATIC_LIBRARIES) \
+  $(llvm_llc_STATIC_LIBRARIES)
+
+LOCAL_LDLIBS += -lpthread -lm -ldl
+LOCAL_C_INCLUDES += external/llvm/include
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_EXECUTABLE)
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+
+LOCAL_SRC_FILES := $(llvm_llc_SRC_FILES)
+LOCAL_C_INCLUDES += external/llvm/include
+
+ifeq ($(TARGET_ARCH),arm)
+  LOCAL_STATIC_LIBRARIES := $(llvm_llc_arm_STATIC_LIBRARIES)
+else
+  ifeq ($(TARGET_ARCH),mips)
+    LOCAL_STATIC_LIBRARIES := $(llvm_llc_mips_STATIC_LIBRARIES)
+  else
+    ifeq ($(TARGET_ARCH),x86)
+      LOCAL_STATIC_LIBRARIES := $(llvm_llc_x86_STATIC_LIBRARIES)
+    else
+      $(error "Unsupport llc target $(TARGET_ARCH)")
+    endif
+  endif
+endif
+
+LOCAL_STATIC_LIBRARIES += $(llvm_llc_STATIC_LIBRARIES)
+
+LOCAL_SHARED_LIBRARIES :=  \
+  libcutils  \
+  libdl  \
+  libstlport
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_EXECUTABLE)
diff --git a/tools/llvm-as/Android.mk b/tools/llvm-as/Android.mk
new file mode 100644
index 0000000..44f3d4f
--- /dev/null
+++ b/tools/llvm-as/Android.mk
@@ -0,0 +1,23 @@
+LOCAL_PATH:= $(call my-dir)
+
+llvm_as_SRC_FILES := \
+  llvm-as.cpp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-as
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(llvm_as_SRC_FILES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+LOCAL_STATIC_LIBRARIES := \
+  libLLVMAsmParser \
+  libLLVMBitWriter \
+  libLLVMCore \
+  libLLVMSupport
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/llvm-dis/Android.mk b/tools/llvm-dis/Android.mk
new file mode 100644
index 0000000..22d44fd
--- /dev/null
+++ b/tools/llvm-dis/Android.mk
@@ -0,0 +1,25 @@
+LOCAL_PATH:= $(call my-dir)
+
+llvm_dis_SRC_FILES := \
+  llvm-dis.cpp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-dis
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(llvm_dis_SRC_FILES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+LOCAL_STATIC_LIBRARIES := \
+  libLLVMAnalysis \
+  libLLVMBitReader \
+  libLLVMCore \
+  libLLVMSupport
+
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_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..4398246
--- /dev/null
+++ b/tools/llvm-link/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH:= $(call my-dir)
+
+llvm_link_SRC_FILES := \
+  llvm-link.cpp
+
+llvm_link_STATIC_LIBRARIES := \
+  libLLVMLinker \
+  libLLVMBitReader \
+  libLLVMBitWriter \
+  libLLVMAsmParser \
+  libLLVMTransformUtils \
+  libLLVMAnalysis \
+  libLLVMTarget \
+  libLLVMCore \
+  libLLVMSupport
+
+#===---------------------------------------------------------------===
+# llvm-link command line tool (host)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-link
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(llvm_link_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_link_STATIC_LIBRARIES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
+
+#===---------------------------------------------------------------===
+# llvm-link command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-link
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(llvm_link_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_link_STATIC_LIBRARIES)
+LOCAL_SHARED_LIBRARIES := \
+  libcutils  \
+  libstlport
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_EXECUTABLE)
diff --git a/tools/opt/Android.mk b/tools/opt/Android.mk
new file mode 100644
index 0000000..77183aa
--- /dev/null
+++ b/tools/opt/Android.mk
@@ -0,0 +1,79 @@
+LOCAL_PATH := $(call my-dir)
+
+LLVM_ROOT_PATH := $(LOCAL_PATH)/../..
+
+
+#===---------------------------------------------------------------===
+# opt command line tool (common)
+#===---------------------------------------------------------------===
+
+llvm_opt_SRC_FILES := \
+  AnalysisWrappers.cpp \
+  GraphPrinters.cpp \
+  PrintSCC.cpp \
+  opt.cpp
+
+llvm_opt_STATIC_LIBRARIES := \
+  libLLVMScalarOpts \
+  libLLVMInstCombine \
+  libLLVMInstrumentation \
+  libLLVMMCParser \
+  libLLVMMC \
+  libLLVMAsmParser \
+  libLLVMBitWriter \
+  libLLVMBitReader \
+  libLLVMipa \
+  libLLVMipo \
+  libLLVMTransformUtils \
+  libLLVMVectorize \
+  libLLVMAnalysis \
+  libLLVMTarget \
+  libLLVMCore \
+  libLLVMSupport
+
+
+#===---------------------------------------------------------------===
+# opt command line tool (host)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := opt
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_SRC_FILES := $(llvm_opt_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_opt_STATIC_LIBRARIES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
+LOCAL_C_INCLUDES += external/llvm/include
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_EXECUTABLE)
+
+
+#===---------------------------------------------------------------===
+# opt command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := opt
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+
+LOCAL_SRC_FILES := $(llvm_opt_SRC_FILES)
+LOCAL_C_INCLUDES += external/llvm/include
+LOCAL_STATIC_LIBRARIES := $(llvm_opt_STATIC_LIBRARIES)
+LOCAL_SHARED_LIBRARIES :=  \
+  libcutils  \
+  libdl  \
+  libstlport
+
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_EXECUTABLE)
diff --git a/utils/FileCheck/Android.mk b/utils/FileCheck/Android.mk
new file mode 100644
index 0000000..2c211cf
--- /dev/null
+++ b/utils/FileCheck/Android.mk
@@ -0,0 +1,23 @@
+LOCAL_PATH:= $(call my-dir)
+
+filecheck_SRC_FILES := \
+  FileCheck.cpp
+
+filecheck_STATIC_LIBRARIES := \
+  libLLVMSupport
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := FileCheck
+LOCAL_SRC_FILES := $(filecheck_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(filecheck_STATIC_LIBRARIES)
+LOCAL_C_INCLUDES += external/llvm/include
+LOCAL_C_INCLUDES += external/llvm/host/include
+LOCAL_LDLIBS += -lpthread -lm -ldl
+LOCAL_CFLAGS += -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS
+
+#REQUIRES_EH := 1
+#REQUIRES_RTTI := 1
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/utils/TableGen/Android.mk b/utils/TableGen/Android.mk
new file mode 100644
index 0000000..e15f37b
--- /dev/null
+++ b/utils/TableGen/Android.mk
@@ -0,0 +1,58 @@
+LOCAL_PATH:= $(call my-dir)
+
+tablegen_SRC_FILES := \
+  AsmMatcherEmitter.cpp \
+  AsmWriterEmitter.cpp \
+  AsmWriterInst.cpp \
+  CallingConvEmitter.cpp \
+  CodeEmitterGen.cpp \
+  CodeGenDAGPatterns.cpp \
+  CodeGenInstruction.cpp \
+  CodeGenMapTable.cpp \
+  CodeGenRegisters.cpp \
+  CodeGenSchedule.cpp \
+  CodeGenTarget.cpp \
+  DAGISelEmitter.cpp \
+  DAGISelMatcherEmitter.cpp \
+  DAGISelMatcherGen.cpp \
+  DAGISelMatcherOpt.cpp \
+  DAGISelMatcher.cpp \
+  DFAPacketizerEmitter.cpp \
+  DisassemblerEmitter.cpp \
+  FastISelEmitter.cpp \
+  FixedLenDecoderEmitter.cpp \
+  InstrInfoEmitter.cpp \
+  IntrinsicEmitter.cpp \
+  OptParserEmitter.cpp \
+  PseudoLoweringEmitter.cpp \
+  RegisterInfoEmitter.cpp \
+  SetTheory.cpp \
+  SubtargetEmitter.cpp \
+  TGValueTypes.cpp \
+  TableGen.cpp \
+  X86DisassemblerTables.cpp \
+  X86ModRMFilters.cpp \
+  X86RecognizableInstr.cpp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tblgen
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(tablegen_SRC_FILES)
+
+REQUIRES_EH := 1
+REQUIRES_RTTI := 1
+
+LOCAL_STATIC_LIBRARIES := \
+  libLLVMTableGen \
+  libLLVMSupport
+
+LOCAL_LDLIBS += -lm
+ifeq ($(HOST_OS),windows)
+  LOCAL_LDLIBS += -limagehlp -lpsapi
+else
+  LOCAL_LDLIBS += -lpthread -ldl
+endif
+
+include $(LLVM_HOST_BUILD_MK)
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/utils/TableGen/CodeEmitterGen.cpp b/utils/TableGen/CodeEmitterGen.cpp
index c94d384..e99a171 100644
--- a/utils/TableGen/CodeEmitterGen.cpp
+++ b/utils/TableGen/CodeEmitterGen.cpp
@@ -287,11 +287,14 @@
         IC != EC; ++IC) {
     Record *R = *IC;
     if (R->getValueAsString("Namespace") == "TargetOpcode" ||
-        R->getValueAsBit("isPseudo"))
+        (R->getValueAsBit("isPseudo") && MCEmitter))
       continue;
     const std::string &InstName = R->getValueAsString("Namespace") + "::"
       + R->getName();
-    std::string Case = getInstructionCase(R, Target);
+    std::string Case;
+    if (!R->getValueAsBit("isPseudo")) {
+      Case = getInstructionCase(R, Target);
+    }
 
     CaseMap[Case].push_back(InstName);
   }