diff --git a/src/compiler_llvm/procedure_linkage_table.cc b/src/compiler_llvm/procedure_linkage_table.cc
new file mode 100644
index 0000000..8e03605
--- /dev/null
+++ b/src/compiler_llvm/procedure_linkage_table.cc
@@ -0,0 +1,326 @@
+/*
+ * 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.
+ */
+
+#include "procedure_linkage_table.h"
+
+#include "compiler_runtime_func_list.h"
+#include "globals.h"
+#include "instruction_set.h"
+#include "logging.h"
+#include "runtime_support_func_list.h"
+#include "runtime_support_llvm.h"
+#include "utils_llvm.h"
+
+#include <algorithm>
+
+#include <UniquePtr.h>
+
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+
+namespace {
+  const char* const art_runtime_func_name_list[] = {
+#define DEFINE_ENTRY(ID, NAME) #NAME,
+    RUNTIME_SUPPORT_FUNC_LIST(DEFINE_ENTRY)
+#undef DEFINE_ENTRY
+  };
+
+  const char* const compiler_runtime_func_name_list_arm[] = {
+#define DEFINE_ENTRY(NAME) #NAME,
+    COMPILER_RUNTIME_FUNC_LIST_ARM(DEFINE_ENTRY)
+#undef DEFINE_ENTRY
+  };
+
+  const char* const compiler_runtime_func_name_list_mips[] = {
+#define DEFINE_ENTRY(NAME) #NAME,
+    COMPILER_RUNTIME_FUNC_LIST_MIPS(DEFINE_ENTRY)
+#undef DEFINE_ENTRY
+  };
+
+  const char* const compiler_runtime_func_name_list_x86[] = {
+#define DEFINE_ENTRY(NAME) #NAME,
+    COMPILER_RUNTIME_FUNC_LIST_X86(DEFINE_ENTRY)
+#undef DEFINE_ENTRY
+  };
+
+  const size_t art_runtime_func_count =
+    sizeof(art_runtime_func_name_list) / sizeof(const char*);
+
+  const size_t compiler_runtime_func_count_arm =
+    sizeof(compiler_runtime_func_name_list_arm) / sizeof(const char*);
+
+  const size_t compiler_runtime_func_count_mips =
+    sizeof(compiler_runtime_func_name_list_mips) / sizeof(const char*);
+
+  const size_t compiler_runtime_func_count_x86 =
+    sizeof(compiler_runtime_func_name_list_x86) / sizeof(const char*);
+}
+
+
+namespace art {
+namespace compiler_llvm {
+
+
+ProcedureLinkageTable::ProcedureLinkageTable(InstructionSet insn_set)
+    : insn_set_(insn_set) {
+}
+
+
+ProcedureLinkageTable::~ProcedureLinkageTable() {
+}
+
+
+bool ProcedureLinkageTable::AllocateTable() {
+  if (table_mmap_.get()) {
+    return true;
+  }
+
+  // Allocate the PLT
+  byte* suggested_table_addr = reinterpret_cast<byte*>(kTableAddress);
+
+  UniquePtr<MemMap> table_mmap(
+      MemMap::MapAnonymous(".plt", suggested_table_addr,
+                           GetTableSizeInBytes(), PROT_READ | PROT_WRITE));
+
+  if (!table_mmap.get()) {
+    return false;
+  }
+
+  if (table_mmap->Begin() != suggested_table_addr) {
+    // Our PLT should be allocated at the FIXED address
+    return false;
+  }
+
+  // Create the stubs in the PLT
+  byte* stub_ptr = table_mmap->Begin();
+  size_t stub_size = GetStubSizeInBytes();
+
+  for (size_t i = 0; i < art_runtime_func_count; ++i, stub_ptr += stub_size) {
+    const char* name = art_runtime_func_name_list[i];
+    void* func = art_find_runtime_support_func(NULL, name);
+    DCHECK(func != NULL);
+    CreateStub(stub_ptr, func);
+  }
+
+  const char* const* crt_name_list = NULL;
+  size_t crt_count = 0u;
+
+  switch (insn_set_) {
+  case kArm:
+  case kThumb2:
+    crt_name_list = compiler_runtime_func_name_list_arm;
+    crt_count = compiler_runtime_func_count_arm;
+    break;
+
+  case kMips:
+    crt_name_list = compiler_runtime_func_name_list_mips;
+    crt_count = compiler_runtime_func_count_mips;
+    break;
+
+  case kX86:
+    crt_name_list = compiler_runtime_func_name_list_x86;
+    crt_count = compiler_runtime_func_count_x86;
+    break;
+
+  default:
+    LOG(FATAL) << "Unknown instruction set: " << insn_set_;
+    return false;
+  }
+
+  for (size_t i = 0; i < crt_count; ++i, stub_ptr += stub_size) {
+    void* func = art_find_runtime_support_func(NULL, crt_name_list[i]);
+    DCHECK(func != NULL);
+    CreateStub(stub_ptr, func);
+  }
+
+  // Protect the procedure linkage table
+  table_mmap->Protect(PROT_READ | PROT_EXEC);
+
+  // Flush the instruction cache on specific architecture
+#if defined(__arm__) || defined(__mips__)
+  cacheflush(reinterpret_cast<long int>(table_mmap->Begin()),
+             reinterpret_cast<long int>(table_mmap->End()), 0);
+#endif
+
+  // Transfer the ownership
+  table_mmap_.reset(table_mmap.release());
+
+  return true;
+}
+
+
+uintptr_t ProcedureLinkageTable::GetEntryAddress(const char* name) const {
+  int func_idx = IndexOfRuntimeFunc(name);
+  if (func_idx == -1) {
+    return 0u;
+  }
+
+  return (kTableAddress + func_idx * GetStubSizeInBytes());
+}
+
+
+
+int ProcedureLinkageTable::IndexOfRuntimeFunc(const char* name) const {
+  int result = IndexOfCompilerRuntimeFunc(name);
+  if (result != -1) {
+    return art_runtime_func_count + result;
+  }
+
+  return IndexOfArtRuntimeFunc(name);
+}
+
+
+int ProcedureLinkageTable::IndexOfArtRuntimeFunc(const char* name) {
+  for (size_t i = 0; i < art_runtime_func_count; ++i) {
+    if (strcmp(name, art_runtime_func_name_list[i]) == 0) {
+      return static_cast<int>(i);
+    }
+  }
+  return -1;
+}
+
+int ProcedureLinkageTable::IndexOfCompilerRuntimeFunc(InstructionSet insn_set,
+                                                      const char* name) {
+  const char* const* rt_begin = NULL;
+  const char* const* rt_end = NULL;
+
+  switch (insn_set) {
+  case kArm:
+  case kThumb2:
+    rt_begin = compiler_runtime_func_name_list_arm;
+    rt_end = compiler_runtime_func_name_list_arm +
+             compiler_runtime_func_count_arm;
+    break;
+
+  case kMips:
+    rt_begin = compiler_runtime_func_name_list_mips;
+    rt_end = compiler_runtime_func_name_list_mips +
+             compiler_runtime_func_count_mips;
+    break;
+
+  case kX86:
+    rt_begin = compiler_runtime_func_name_list_x86;
+    rt_end = compiler_runtime_func_name_list_x86 +
+             compiler_runtime_func_count_x86;
+    break;
+
+  default:
+    LOG(FATAL) << "Unknown instruction set: " << insn_set;
+    return -1;
+  }
+
+  const char* const* name_lbound_ptr =
+      std::lower_bound(rt_begin, rt_end, name, CStringLessThanComparator());
+
+  if (name_lbound_ptr < rt_end && strcmp(*name_lbound_ptr, name) == 0) {
+    return (name_lbound_ptr - rt_begin);
+  } else {
+    return -1;
+  }
+}
+
+
+size_t ProcedureLinkageTable::GetStubCount(InstructionSet insn_set) {
+  switch (insn_set) {
+  case kArm:
+  case kThumb2:
+    return art_runtime_func_count + compiler_runtime_func_count_arm;
+
+  case kMips:
+    return art_runtime_func_count + compiler_runtime_func_count_mips;
+
+  case kX86:
+    return art_runtime_func_count + compiler_runtime_func_count_x86;
+
+  default:
+    LOG(FATAL) << "Unknown instruction set: " << insn_set;
+    return 0u;
+  }
+}
+
+
+size_t ProcedureLinkageTable::GetStubSizeInBytes(InstructionSet insn_set) {
+  switch (insn_set) {
+  case kArm:
+  case kThumb2:
+    return 8u;
+
+  case kMips:
+    return 16u;
+
+  case kX86:
+    return 8u;
+
+  default:
+    LOG(FATAL) << "Unknown instruction set: " << insn_set;
+    return 0u;
+  }
+}
+
+
+void ProcedureLinkageTable::CreateStub(InstructionSet insn_set,
+                                       byte* stub, void* dest_) {
+  switch (insn_set) {
+  case kArm:
+  case kThumb2:
+    {
+      uint32_t dest = static_cast<uint32_t>(
+                      reinterpret_cast<uintptr_t>(dest_) & 0xfffffffful);
+      uint32_t* stub_w = reinterpret_cast<uint32_t*>(stub);
+
+      stub_w[0] = 0xe51ff004ul; // ldr pc, [pc #-4]
+      stub_w[1] = dest;
+    }
+    break;
+
+  case kMips:
+    {
+      uint32_t dest = static_cast<uint32_t>(
+                      reinterpret_cast<uintptr_t>(dest_) & 0xfffffffful);
+      uint32_t* stub_w = reinterpret_cast<uint32_t*>(stub);
+
+      stub_w[0] = 0x3c190000ul | ((dest >> 16) & 0xfffful); // lui
+      stub_w[1] = 0x37390000ul | (dest & 0xfffful);; // ori
+      stub_w[2] = 0x03200008ul; // jr (jump register)
+      stub_w[3] = 0x00000000ul; // nop
+    }
+    break;
+
+  case kX86:
+    {
+      uint32_t off = static_cast<uint32_t>(
+                     reinterpret_cast<uintptr_t>(dest_) -
+                     reinterpret_cast<uintptr_t>(stub + 1) - 4);
+      // jmp (32-bit offset)
+      stub[0] = 0xe9u;
+      stub[1] = off & 0xffu;
+      stub[2] = (off >> 8) & 0xffu;
+      stub[2] = (off >> 16) & 0xffu;
+      stub[2] = (off >> 24) & 0xffu;
+    }
+    break;
+
+  default:
+    LOG(FATAL) << "Unknown instruction set: " << insn_set;
+  }
+}
+
+
+} // namespace compiler_llvm
+} // namespace art
