diff --git a/Android.mk b/Android.mk
index db76dec..2aca0da 100644
--- a/Android.mk
+++ b/Android.mk
@@ -28,7 +28,8 @@
 
 libbcc_WHOLE_STATIC_LIBRARIES += \
   libbccExecutionEngine \
-  libbccHelper
+  libbccHelper \
+  libbccTransforms
 
 
 #=====================================================================
diff --git a/include/bcc/bcc_assert.h b/include/bcc/bcc_assert.h
new file mode 100644
index 0000000..757961e
--- /dev/null
+++ b/include/bcc/bcc_assert.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011, 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.
+ */
+
+#ifndef _FRAMEWORKS_COMPILE_LIBBCC_INCLUDE_BCC_BCC_ASSERT_H_  // NOLINT
+#define _FRAMEWORKS_COMPILE_LIBBCC_INCLUDE_BCC_BCC_ASSERT_H_
+
+#include "DebugHelper.h"
+
+#ifdef __cplusplus
+#include <cstdlib>
+#include <cstdio>
+#else
+#include <stdlib.h>
+#include <stdio.h>
+#endif  // __cplusplus
+
+#ifdef __DISABLE_ASSERTS
+#define bccAssert(v) do {} while (0)
+#else
+#define __ABORT_ON_FAILURES 1
+#define bccAssert(v)                                \
+  do {                                              \
+    if (!(v)) {                                     \
+      ALOGE("bccAssert failed at %s:%d - '%s'\n",   \
+          __FILE__, __LINE__, #v);                  \
+      if (__ABORT_ON_FAILURES) {                    \
+        abort();                                    \
+      }                                             \
+    }                                               \
+  } while (0)
+#endif  // __DISABLE_ASSERTS
+
+
+#endif  // _FRAMEWORKS_COMPILE_LIBBCC_INCLUDE_BCC_BCC_ASSERT_H_  NOLINT
diff --git a/lib/ExecutionEngine/Android.mk b/lib/ExecutionEngine/Android.mk
index f9877d5..d101107 100644
--- a/lib/ExecutionEngine/Android.mk
+++ b/lib/ExecutionEngine/Android.mk
@@ -39,7 +39,6 @@
   ObjectLoader.cpp \
   OutputFile.cpp \
   RSExecutable.cpp \
-  RSForEachExpand.cpp \
   RSInfo.cpp \
   RSInfoExtractor.cpp \
   RSInfoReader.cpp \
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 458d835..c4a0870 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -33,7 +33,7 @@
 
 #include "librsloader.h"
 
-#include "RSTransforms.h"
+#include "Transforms/BCCTransforms.h"
 
 #include "llvm/ADT/StringRef.h"
 
@@ -270,7 +270,8 @@
   std::vector<std::string> &VarNameList = mpResult->mExportVarsName;
   std::vector<std::string> &FuncNameList = mpResult->mExportFuncsName;
   std::vector<std::string> &ForEachExpandList = mpResult->mExportForEachName;
-  RSInfo::ExportForeachFuncListTy ForEachFuncList;
+  std::vector<std::string> ForEachNameList;
+  std::vector<uint32_t> ForEachSigList;
   std::vector<const char*> ExportSymbols;
 
   // Defaults to maximum optimization level from MetadataExtractor.
@@ -366,9 +367,10 @@
     const char **ForEachNames = ME.getExportForEachNameList();
     const uint32_t *ForEachSigs = ME.getExportForEachSignatureList();
     for (size_t i = 0; i < ForEachSigCount; i++) {
-      ForEachFuncList.push_back(std::make_pair(ForEachNames[i],
-                                               ForEachSigs[i]));
-      ForEachExpandList.push_back(std::string(ForEachNames[i]) + ".expand");
+      std::string Name(ForEachNames[i]);
+      ForEachNameList.push_back(Name);
+      ForEachExpandList.push_back(Name + ".expand");
+      ForEachSigList.push_back(ForEachSigs[i]);
     }
 
     // Need to wait until ForEachExpandList is fully populated to fill in
@@ -386,7 +388,7 @@
     }
   }
 
-  runInternalPasses(ForEachFuncList);
+  runInternalPasses(ForEachNameList, ForEachSigList);
 
   // Perform link-time optimization if we have multiple modules
   if (option.RunLTO) {
@@ -514,11 +516,12 @@
   return 0;
 }
 
-int Compiler::runInternalPasses(RSInfo::ExportForeachFuncListTy pForEachFuncs) {
+int Compiler::runInternalPasses(std::vector<std::string>& Names,
+                                std::vector<uint32_t>& Signatures) {
   llvm::PassManager BCCPasses;
 
   // Expand ForEach on CPU path to reduce launch overhead.
-  BCCPasses.add(createRSForEachExpandPass(pForEachFuncs));
+  BCCPasses.add(createForEachExpandPass(Names, Signatures));
 
   BCCPasses.run(*mModule);
 
diff --git a/lib/ExecutionEngine/Compiler.h b/lib/ExecutionEngine/Compiler.h
index f0e75d1..b5872d6 100644
--- a/lib/ExecutionEngine/Compiler.h
+++ b/lib/ExecutionEngine/Compiler.h
@@ -36,8 +36,6 @@
 #include <vector>
 #include <utility>
 
-#include "RSInfo.h"
-
 
 namespace llvm {
   class Module;
@@ -141,7 +139,8 @@
 
     int runMCCodeGen(llvm::TargetData *TD, llvm::TargetMachine *TM);
 
-    int runInternalPasses(RSInfo::ExportForeachFuncListTy pForEachFuncs);
+    int runInternalPasses(std::vector<std::string>& Names,
+                          std::vector<uint32_t>& Signatures);
 
     int runLTO(llvm::TargetData *TD,
                std::vector<const char*>& ExportSymbols,
diff --git a/lib/ExecutionEngine/RSScript.h b/lib/ExecutionEngine/RSScript.h
index 4fc1f90..50a3eb3 100644
--- a/lib/ExecutionEngine/RSScript.h
+++ b/lib/ExecutionEngine/RSScript.h
@@ -24,12 +24,12 @@
 #include <stddef.h>
 
 #include <llvm/ADT/SmallVector.h>
-#include <llvm/Support/CodeGen.h>
 
 #include <bcc/bcc.h>
 #include <bcc/bcc_mccache.h>
 #include "bcc_internal.h"
 
+#include "Compiler.h"
 #include "Script.h"
 
 namespace llvm {
diff --git a/lib/Transforms/Android.mk b/lib/Transforms/Android.mk
new file mode 100644
index 0000000..c30dd29
--- /dev/null
+++ b/lib/Transforms/Android.mk
@@ -0,0 +1,70 @@
+#
+# Copyright (C) 2012 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.
+#
+#
+
+LOCAL_PATH := $(call my-dir)
+include $(LOCAL_PATH)/../../libbcc-config.mk
+
+#=====================================================================
+# Common: libbccTransforms
+#=====================================================================
+
+libbcc_transforms_SRC_FILES := \
+  ForEachExpand.cpp
+
+#=====================================================================
+# Device Static Library: libbccTransforms
+#=====================================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libbccTransforms
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+LOCAL_CFLAGS += $(libbcc_CFLAGS)
+LOCAL_CFLAGS += -DTARGET_BUILD
+
+LOCAL_C_INCLUDES := $(libbcc_C_INCLUDES)
+LOCAL_SRC_FILES := $(libbcc_transforms_SRC_FILES)
+
+include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
+include $(LLVM_ROOT_PATH)/llvm-device-build.mk
+include $(BUILD_STATIC_LIBRARY)
+
+
+#=====================================================================
+# Host Static Library: libbccTransforms
+#=====================================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libbccTransforms
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_CFLAGS += $(libbcc_CFLAGS)
+LOCAL_CFLAGS += -D__HOST__
+LOCAL_C_INCLUDES := $(libbcc_C_INCLUDES)
+
+LOCAL_SRC_FILES := $(libbcc_transforms_SRC_FILES)
+
+include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
+include $(LLVM_ROOT_PATH)/llvm-host-build.mk
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/ExecutionEngine/RSTransforms.h b/lib/Transforms/BCCTransforms.h
similarity index 66%
rename from lib/ExecutionEngine/RSTransforms.h
rename to lib/Transforms/BCCTransforms.h
index ec5f690..1ac8174 100644
--- a/lib/ExecutionEngine/RSTransforms.h
+++ b/lib/Transforms/BCCTransforms.h
@@ -14,20 +14,11 @@
  * limitations under the License.
  */
 
-#ifndef BCC_EXECUTION_ENGINE_RS_TRANSFORMS_H
-#define BCC_EXECUTION_ENGINE_RS_TRANSFORMS_H
-
-#include "RSInfo.h"
-
-namespace llvm {
-  class ModulePass;
-}
+#include "llvm/Pass.h"
 
 namespace bcc {
 
-llvm::ModulePass *
-createRSForEachExpandPass(const RSInfo::ExportForeachFuncListTy &pForeachFuncs);
+llvm::ModulePass *createForEachExpandPass(std::vector<std::string>& Names,
+                                          std::vector<uint32_t>& Signatures);
 
-} // end namespace bcc
-
-#endif // BCC_EXECUTION_ENGINE_RS_TRANSFORMS_H
+}  // namespace bcc
diff --git a/lib/ExecutionEngine/RSForEachExpand.cpp b/lib/Transforms/ForEachExpand.cpp
similarity index 82%
rename from lib/ExecutionEngine/RSForEachExpand.cpp
rename to lib/Transforms/ForEachExpand.cpp
index b30dd23..53d6bdc 100644
--- a/lib/ExecutionEngine/RSForEachExpand.cpp
+++ b/lib/Transforms/ForEachExpand.cpp
@@ -14,15 +14,10 @@
  * limitations under the License.
  */
 
-//#define RS_FOREACH_EXPAND_PASS_NDEBUG 0
-#include "RSTransforms.h"
-
-#include <cstdlib>
-
 #include "Config.h"
+#include "bcc/bcc_assert.h"
 
 #include "DebugHelper.h"
-#include "RSInfo.h"
 
 #include "llvm/DerivedTypes.h"
 #include "llvm/Function.h"
@@ -32,26 +27,24 @@
 #include "llvm/Type.h"
 #include "llvm/Support/IRBuilder.h"
 
-using namespace bcc;
-
 namespace {
-
-/* RSForEachExpandPass - This pass operates on functions that are able to be
- * called via rsForEach() or "foreach_<NAME>". We create an inner loop for the
- * ForEach-able function to be invoked over the appropriate data cells of the
- * input/output allocations (adjusting other relevant parameters as we go). We
- * support doing this for any ForEach-able compute kernels. The new function
- * name is the original function name followed by ".expand". Note that we
- * still generate code for the original function.
- */
-class RSForEachExpandPass : public llvm::ModulePass {
-private:
+  /* ForEachExpandPass - This pass operates on functions that are able to be
+   * called via rsForEach() or "foreach_<NAME>". We create an inner loop for
+   * the ForEach-able function to be invoked over the appropriate data cells
+   * of the input/output allocations (adjusting other relevant parameters as
+   * we go). We support doing this for any ForEach-able compute kernels.
+   * The new function name is the original function name followed by
+   * ".expand". Note that we still generate code for the original function.
+   */
+  class ForEachExpandPass : public llvm::ModulePass {
+  private:
   static char ID;
 
   llvm::Module *M;
   llvm::LLVMContext *C;
 
-  const RSInfo::ExportForeachFuncListTy &mFuncs;
+  std::vector<std::string>& mNames;
+  std::vector<uint32_t>& mSignatures;
 
   uint32_t getRootSignature(llvm::Function *F) {
     const llvm::NamedMDNode *ExportForEachMetadata =
@@ -72,13 +65,7 @@
       return (1 << RootArgTys.size()) - 1;
     }
 
-#if !RS_FOREACH_EXPAND_PASS_NDEBUG
-    if (ExportForEachMetadata->getNumOperands() <= 0) {
-      ALOGE("Assert failed at %s:%d: Invalid #rs_export_foreach metadata in "
-            " '%s'!", __FILE__, __LINE__, M->getModuleIdentifier().c_str());
-      ::abort();
-    }
-#endif
+    bccAssert(ExportForEachMetadata->getNumOperands() > 0);
 
     // We only handle the case for legacy root() functions here, so this is
     // hard-coded to look at only the first such function.
@@ -120,9 +107,11 @@
     return Signature & 16;
   }
 
-public:
-  RSForEachExpandPass(const RSInfo::ExportForeachFuncListTy &pForeachFuncs)
-      : ModulePass(ID), M(NULL), C(NULL), mFuncs(pForeachFuncs) {
+  public:
+  ForEachExpandPass(std::vector<std::string>& Names,
+                    std::vector<uint32_t>& Signatures)
+      : ModulePass(ID), M(NULL), C(NULL), mNames(Names),
+        mSignatures(Signatures) {
   }
 
   /* Performs the actual optimization on a selected function. On success, the
@@ -271,13 +260,7 @@
       Args++;
     }
 
-#if !RS_FOREACH_EXPAND_PASS_NDEBUG
-    if (Args != F->arg_end()) {
-      ALOGE("Assert failed at %s:%d: Invalid signature to the foreach function "
-            "'%s'!", __FILE__, __LINE__, F->getName().str().c_str());
-      ::abort();
-    }
-#endif
+    bccAssert(Args == F->arg_end());
 
     llvm::BasicBlock *Loop = llvm::BasicBlock::Create(*C, "Loop", ExpandedFunc);
     llvm::BasicBlock *Exit = llvm::BasicBlock::Create(*C, "Exit", ExpandedFunc);
@@ -356,14 +339,11 @@
     this->M = &M;
     C = &M.getContext();
 
-    for (RSInfo::ExportForeachFuncListTy::const_iterator
-             func_iter = mFuncs.begin(), func_end = mFuncs.end();
-         func_iter != func_end; func_iter++) {
-      const char *name = func_iter->first;
-      uint32_t signature = func_iter->second;
-      llvm::Function *kernel = M.getFunction(name);
+    bccAssert(mNames.size() == mSignatures.size());
+    for (int i = 0, e = mNames.size(); i != e; i++) {
+      llvm::Function *kernel = M.getFunction(mNames[i]);
       if (kernel && kernel->getReturnType()->isVoidTy()) {
-        Changed |= ExpandFunction(kernel, signature);
+        Changed |= ExpandFunction(kernel, mSignatures[i]);
       }
     }
 
@@ -374,17 +354,16 @@
     return "ForEach-able Function Expansion";
   }
 
-}; // end RSForEachExpandPass
+  };
+}  // end anonymous namespace
 
-} // end anonymous namespace
-
-char RSForEachExpandPass::ID = 0;
+char ForEachExpandPass::ID = 0;
 
 namespace bcc {
 
-llvm::ModulePass *
-createRSForEachExpandPass(const RSInfo::ExportForeachFuncListTy &pForeachFuncs){
-  return new RSForEachExpandPass(pForeachFuncs);
-}
+  llvm::ModulePass *createForEachExpandPass(std::vector<std::string>& Names,
+                                            std::vector<uint32_t>& Signatures) {
+    return new ForEachExpandPass(Names, Signatures);
+  }
 
-} // end namespace bcc
+}  // namespace bcc
diff --git a/libbcc-config.mk b/libbcc-config.mk
index ac5372b..90e6fab 100644
--- a/libbcc-config.mk
+++ b/libbcc-config.mk
@@ -51,7 +51,9 @@
 #=====================================================================
 
 libbcc_CFLAGS := -Wall -Wno-unused-parameter -Werror
-ifeq ($(TARGET_BUILD_VARIANT),eng)
+ifneq ($(TARGET_BUILD_VARIANT),eng)
+libbcc_CFLAGS += -D__DISABLE_ASSERTS
+else
 libbcc_CFLAGS += -DANDROID_ENGINEERING_BUILD
 endif
 
