diff --git a/src/compiler_llvm/utils_llvm.cc b/src/compiler_llvm/utils_llvm.cc
new file mode 100644
index 0000000..1a8e8a2
--- /dev/null
+++ b/src/compiler_llvm/utils_llvm.cc
@@ -0,0 +1,89 @@
+/*
+ * 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 "utils_llvm.h"
+
+#include "class_loader.h"
+#include "object.h"
+#include "object_utils.h"
+
+namespace art {
+
+std::string MangleForLLVM(const std::string& s) {
+  std::string result;
+  size_t char_count = CountModifiedUtf8Chars(s.c_str());
+  const char* cp = &s[0];
+  for (size_t i = 0; i < char_count; ++i) {
+    uint16_t ch = GetUtf16FromUtf8(&cp);
+    if (ch == '$' || ch == '<' || ch == '>' || ch > 127) {
+      StringAppendF(&result, "_0%04x", ch);
+    } else {
+      switch (ch) {
+      case '_':
+        result += "_1";
+        break;
+      case ';':
+        result += "_2";
+        break;
+      case '[':
+        result += "_3";
+        break;
+      case '/':
+        result += "_";
+        break;
+      default:
+        result.push_back(ch);
+        break;
+      }
+    }
+  }
+  return result;
+}
+
+std::string LLVMShortName(const Method* m) {
+  MethodHelper mh(m);
+  std::string class_name(mh.GetDeclaringClassDescriptor());
+  // Remove the leading 'L' and trailing ';'...
+  CHECK_EQ(class_name[0], 'L') << class_name;
+  CHECK_EQ(class_name[class_name.size() - 1], ';') << class_name;
+  class_name.erase(0, 1);
+  class_name.erase(class_name.size() - 1, 1);
+
+  std::string method_name(mh.GetName());
+
+  std::string short_name;
+  short_name += "Art_";
+  short_name += MangleForLLVM(class_name);
+  short_name += "_";
+  short_name += MangleForLLVM(method_name);
+  return short_name;
+}
+
+std::string LLVMLongName(const Method* m) {
+  std::string long_name;
+  long_name += LLVMShortName(m);
+  long_name += "__";
+
+  std::string signature(MethodHelper(m).GetSignature());
+  signature.erase(0, 1);
+  signature.erase(signature.begin() + signature.find(')'), signature.end());
+
+  long_name += MangleForLLVM(signature);
+
+  return long_name;
+}
+
+}  // namespace art
diff --git a/src/compiler_llvm/utils_llvm.h b/src/compiler_llvm/utils_llvm.h
new file mode 100644
index 0000000..a1624d7
--- /dev/null
+++ b/src/compiler_llvm/utils_llvm.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 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 ART_SRC_UTILS_LLVM_H_
+#define ART_SRC_UTILS_LLVM_H_
+
+#include "object.h"
+
+#include <string>
+
+namespace art {
+
+// Performs LLVM name mangling (similar to MangleForJni with additional '<' and
+// '>' being mangled).
+std::string MangleForLLVM(const std::string& s);
+
+// Returns the LLVM function name for the non-overloaded method 'm'.
+std::string LLVMShortName(const Method* m);
+
+// Returns the LLVM function name for the overloaded method 'm'.
+std::string LLVMLongName(const Method* m);
+
+}  // namespace art
+
+#endif  // ART_SRC_UTILS_LLVM_H_
diff --git a/src/compiler_llvm/utils_llvm_test.cc b/src/compiler_llvm/utils_llvm_test.cc
new file mode 100644
index 0000000..f5a2c0e
--- /dev/null
+++ b/src/compiler_llvm/utils_llvm_test.cc
@@ -0,0 +1,82 @@
+/*
+ * 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 "object.h"
+#include "common_test.h"
+#include "utils_llvm.h"
+
+namespace art {
+
+class UtilsLLVMTest : public CommonTest {
+};
+
+TEST_F(UtilsLLVMTest, MangleForLLVM) {
+  // Unit test inheritted from MangleForJni
+  EXPECT_EQ("hello_00024world", MangleForLLVM("hello$world"));
+  EXPECT_EQ("hello_000a9world", MangleForLLVM("hello\xc2\xa9world"));
+  EXPECT_EQ("hello_1world", MangleForLLVM("hello_world"));
+  EXPECT_EQ("Ljava_lang_String_2", MangleForLLVM("Ljava/lang/String;"));
+  EXPECT_EQ("_3C", MangleForLLVM("[C"));
+
+  // MangleForLLVM()-specific unit test
+  EXPECT_EQ("_0003cinit_0003e", MangleForLLVM("<init>"));
+  EXPECT_EQ("_0003cclinit_0003e", MangleForLLVM("<clinit>"));
+}
+
+TEST_F(UtilsLLVMTest, LLVMShortName_LLVMLongName) {
+  Class* c = class_linker_->FindSystemClass("Ljava/lang/String;");
+  ASSERT_TRUE(c != NULL);
+  Method* m;
+
+  // Unit test inheritted from MangleForJni
+  m = c->FindVirtualMethod("charAt", "(I)C");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String_charAt", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String_charAt__I", LLVMLongName(m));
+
+  m = c->FindVirtualMethod("indexOf", "(Ljava/lang/String;I)I");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String_indexOf", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String_indexOf__Ljava_lang_String_2I", LLVMLongName(m));
+
+  m = c->FindDirectMethod("copyValueOf", "([CII)Ljava/lang/String;");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String_copyValueOf", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String_copyValueOf___3CII", LLVMLongName(m));
+
+  // MangleForLLVM()-specific unit test
+  m = c->FindDirectMethod("<init>", "()V");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e__", LLVMLongName(m));
+
+  m = c->FindDirectMethod("<init>", "([C)V");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e___3C", LLVMLongName(m));
+
+  m = c->FindDirectMethod("<init>", "([CII)V");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e___3CII", LLVMLongName(m));
+
+  m = c->FindDirectMethod("<init>", "(Ljava/lang/String;)V");
+  ASSERT_TRUE(m != NULL);
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e", LLVMShortName(m));
+  EXPECT_EQ("Art_java_lang_String__0003cinit_0003e__Ljava_lang_String_2", LLVMLongName(m));
+}
+
+}  // namespace art
