diff --git a/src/pixelflinger2/pixelflinger2.h b/src/pixelflinger2/pixelflinger2.h
index 3be7fd9..b7f3046 100644
--- a/src/pixelflinger2/pixelflinger2.h
+++ b/src/pixelflinger2/pixelflinger2.h
@@ -62,9 +62,9 @@
 #  define MAX2(a, b) ((a) > (b) ? (a) : (b))
 #endif
 
-namespace bcc
+namespace llvm
 {
-class BCCContext;
+class LLVMContext;
 };
 
 #if !USE_LLVM_SCANLINE
@@ -88,7 +88,7 @@
    GGLSurface depthSurface;
    GGLSurface stencilSurface;
 
-   bcc::BCCContext * bccCtx;
+   llvm::LLVMContext * llvmCtx;
 
    struct {
       int depth; // assuming ieee 754 32 bit float and 32 bit 2's complement int; z_32
diff --git a/src/pixelflinger2/shader.cpp b/src/pixelflinger2/shader.cpp
index 7e01bd5..e5277d8 100644
--- a/src/pixelflinger2/shader.cpp
+++ b/src/pixelflinger2/shader.cpp
@@ -22,18 +22,9 @@
 
 #include <llvm/LLVMContext.h>
 #include <llvm/Module.h>
-#include <llvm/Support/raw_ostream.h>
+#include <bcc/bcc.h>
 #include <dlfcn.h>
 
-#include <bcc/BCCContext.h>
-#include <bcc/Compiler.h>
-#include <bcc/ExecutionEngine/ObjectLoader.h>
-#include <bcc/ExecutionEngine/SymbolResolvers.h>
-#include <bcc/Script.h>
-#include <bcc/Source.h>
-#include <bcc/Support/Initialization.h>
-#include <bcc/Support/TargetCompilerConfigs.h>
-
 
 #include "src/talloc/hieralloc.h"
 #include "src/mesa/main/shaderobj.h"
@@ -116,13 +107,15 @@
 };
 
 struct Instance {
-   bcc::Script * script;
-   llvm::SmallVector<char, 1024> resultObj;
-   bcc::ObjectLoader * exec;
+   llvm::Module * module;
+   struct BCCOpaqueScript * script;
    void (* function)();
    ~Instance() {
-      delete script;
-      delete exec;
+      // TODO: check bccDisposeScript, which seems to dispose llvm::Module
+      if (script)
+         bccDisposeScript(script);
+      else if (module)
+         delete module;
    }
 };
 
@@ -393,45 +386,31 @@
 static void CodeGen(Instance * instance, const char * mainName, gl_shader * shader,
                     gl_shader_program * program, const GGLState * gglCtx)
 {
-   bcc::Compiler compiler;
-   bcc::Compiler::ErrorCode compile_result;
-   llvm::raw_svector_ostream out(instance->resultObj);
+   SymbolLookupContext ctx = {gglCtx, program, shader};
+   int result = 0;
 
 //   instance->module->dump();
 
-   compile_result = compiler.config(bcc::DefaultCompilerConfig());
-   if (compile_result != bcc::Compiler::kSuccess) {
-      ALOGD("failed config compiler (%s)", bcc::Compiler::GetErrorString(compile_result));
+   BCCScriptRef & script = instance->script;
+   script = bccCreateScript();
+   result = bccReadModule(script, "glsl", (LLVMModuleRef)instance->module, 0);
+   assert(0 == result);
+   result = bccRegisterSymbolCallback(script, SymbolLookup, &ctx);
+   assert(0 == result);
+   result = bccPrepareExecutable(script, NULL, NULL, 0);
+
+   result = bccGetError(script);
+   if (result != 0) {
+      ALOGD("failed bcc_compile");
       assert(0);
       return;
    }
 
-   compiler.enableLTO(/* pEnable */false); // Disable LTO passes execution.
-
-   compile_result = compiler.compile(*instance->script, out);
-   if (compile_result != bcc::Compiler::kSuccess) {
-      ALOGD("failed to compile (%s)", bcc::Compiler::GetErrorString(compile_result));
-      assert(0);
-      return;
-   }
-
-   SymbolLookupContext ctx = {gglCtx, program, shader};
-   bcc::LookupFunctionSymbolResolver<void*> resolver(SymbolLookup, &ctx);
-
-   instance->exec = bcc::ObjectLoader::Load(instance->resultObj.begin(), instance->resultObj.size(),
-                                            /* pName */"glsl", resolver, /* pEnableGDBDebug */false);
-
-   if (!instance->exec) {
-      ALOGD("failed to load the result object");
-      assert(0);
-      return;
-   }
-
-   instance->function = reinterpret_cast<void (*)()>(instance->exec->getSymbolAddress(mainName));
+   instance->function = (void (*)())bccGetFuncAddr(script, mainName);
    assert(instance->function);
-   if (!instance->function) {
-      ALOGD("Could not find '%s'\n", mainName);
-   }
+   result = bccGetError(script);
+   if (result != BCC_NO_ERROR)
+      ALOGD("Could not find '%s': %d\n", mainName, result);
 //   else
 //      printf("bcc_compile %s=%p \n", mainName, instance->function);
 
@@ -441,7 +420,7 @@
 void GenerateScanLine(const GGLState * gglCtx, const gl_shader_program * program, llvm::Module * mod,
                       const char * shaderName, const char * scanlineName);
 
-void GGLShaderUse(void * bccCtx, const GGLState * gglState, gl_shader_program * program)
+void GGLShaderUse(void * llvmCtx, const GGLState * gglState, gl_shader_program * program)
 {
 //   ALOGD("%s", program->Shaders[MESA_SHADER_FRAGMENT]->Source);
    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
@@ -457,12 +436,10 @@
       ShaderKey shaderKey;
       GetShaderKey(gglState, shader, &shaderKey);
       Instance * instance = shader->executable->instances[shaderKey];
-      bcc::BCCContext * compilerCtx = reinterpret_cast<bcc::BCCContext *>(bccCtx);
       if (!instance) {
 //         puts("begin jit new shader");
          instance = hieralloc_zero(shader->executable, Instance);
-
-         llvm::Module * module = new llvm::Module("glsl", compilerCtx->getLLVMContext());
+         instance->module = new llvm::Module("glsl", *(llvm::LLVMContext *)llvmCtx);
 
          char shaderName [SHADER_KEY_STRING_LEN] = {0};
          GetShaderKeyString(shader->Type, &shaderKey, shaderName, sizeof shaderName / sizeof *shaderName);
@@ -491,20 +468,9 @@
 //         }
 //         fclose(file);
 //#endif
-         if (!glsl_ir_to_llvm_module(shader->ir, module, gglState, shaderName)) {
+         llvm::Module * module = glsl_ir_to_llvm_module(shader->ir, instance->module, gglState, shaderName);
+         if (!module)
             assert(0);
-            delete module;
-         }
-         bcc::Source * source = bcc::Source::CreateFromModule(*compilerCtx, *module);
-         if (!source) {
-            delete module;
-            assert(0);
-         }
-         instance->script = new bcc::Script(*source);
-         if (!instance->script) {
-            delete source;
-            assert(0);
-         }
 //#ifdef __arm__
 //         static const char fileName[] = "/data/pf2.txt";
 //         FILE * file = freopen(fileName, "w", stderr);
@@ -581,7 +547,7 @@
       return;
    }
 
-   GGLShaderUse(ctx->bccCtx, &ctx->state, program);
+   GGLShaderUse(ctx->llvmCtx, &ctx->state, program);
    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
       if (!program->_LinkedShaders[i])
          continue;
@@ -967,9 +933,7 @@
 void InitializeShaderFunctions(struct GGLInterface * iface)
 {
    GGL_GET_CONTEXT(ctx, iface);
-   bcc::init::Initialize();
-
-   ctx->bccCtx = new bcc::BCCContext();
+   ctx->llvmCtx = new llvm::LLVMContext();
 
    iface->ShaderCreate = ShaderCreate;
    iface->ShaderSource = GGLShaderSource;
@@ -1001,6 +965,6 @@
    GGL_GET_CONTEXT(ctx, iface);
    _mesa_glsl_release_types();
    _mesa_glsl_release_functions();
-   delete ctx->bccCtx;
-   ctx->bccCtx = NULL;
+   delete ctx->llvmCtx;
+   ctx->llvmCtx = NULL;
 }
