r214520 - Add IR Mangler for more stable mangling.

Eli Bendersky eliben at google.com
Fri Aug 1 08:01:10 PDT 2014


Author: eliben
Date: Fri Aug  1 10:01:10 2014
New Revision: 214520

URL: http://llvm.org/viewvc/llvm-project?rev=214520&view=rev
Log:
Add IR Mangler for more stable mangling.

Modified:
    cfe/trunk/test/Index/print-mangled-name.cpp
    cfe/trunk/tools/libclang/CIndex.cpp

Modified: cfe/trunk/test/Index/print-mangled-name.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-mangled-name.cpp?rev=214520&r1=214519&r2=214520&view=diff
==============================================================================
--- cfe/trunk/test/Index/print-mangled-name.cpp (original)
+++ cfe/trunk/test/Index/print-mangled-name.cpp Fri Aug  1 10:01:10 2014
@@ -1,23 +1,30 @@
 // RUN: %clang_cc1 -triple i686-pc-linux-gnu -emit-pch %s -o %t_linux.ast
 // RUN: c-index-test -test-print-mangle %t_linux.ast | FileCheck %s --check-prefix=ITANIUM
 
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-pch %s -o %t_macho.ast
+// RUN: c-index-test -test-print-mangle %t_macho.ast | FileCheck %s --check-prefix=MACHO
+
 // RUN: %clang_cc1 -triple i686-pc-win32 -emit-pch %s -o %t_msft.ast
 // RUN: c-index-test -test-print-mangle %t_msft.ast | FileCheck %s --check-prefix=MICROSOFT
 
 int foo(int, int);
 // ITANIUM: mangled=_Z3fooii
+// MACHO: mangled=__Z3fooii
 // MICROSOFT: mangled=?foo@@YAHHH
 
 int foo(float, int);
 // ITANIUM: mangled=_Z3foofi
+// MACHO: mangled=__Z3foofi
 // MICROSOFT: mangled=?foo@@YAHMH
 
 struct S {
   int x, y;
 };
 // ITANIUM: StructDecl{{.*}}mangled=]
+// MACHO: StructDecl{{.*}}mangled=]
 // MICROSOFT: StructDecl{{.*}}mangled=]
 
 int foo(S, S&);
-// ITANIUM: mangled=_Z3foo1SRS
+// ITANIUM: mangled=_Z3foo1SRS_
+// MACHO: mangled=__Z3foo1SRS_
 // MICROSOFT: mangled=?foo@@YAHUS

Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=214520&r1=214519&r2=214520&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Fri Aug  1 10:01:10 2014
@@ -27,6 +27,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticCategories.h"
 #include "clang/Basic/DiagnosticIDs.h"
+#include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/Version.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/CompilerInstance.h"
@@ -41,6 +42,8 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Config/llvm-config.h"
+#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/Mangler.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/CrashRecoveryContext.h"
 #include "llvm/Support/Format.h"
@@ -3672,25 +3675,31 @@ CXString clang_Cursor_getMangling(CXCurs
   if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
     return cxstring::createEmpty();
 
-  const Decl *D = getCursorDecl(C);
   // Mangling only works for functions and variables.
+  const Decl *D = getCursorDecl(C);
   if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D)))
     return cxstring::createEmpty();
 
+  // First apply frontend mangling.
   const NamedDecl *ND = cast<NamedDecl>(D);
-  std::unique_ptr<MangleContext> MC(ND->getASTContext().createMangleContext());
+  ASTContext &Ctx = ND->getASTContext();
+  std::unique_ptr<MangleContext> MC(Ctx.createMangleContext());
 
-  std::string Buf;
-  llvm::raw_string_ostream OS(Buf);
-  MC->mangleName(ND, OS);
-  OS.flush();
-
-  // The Microsoft mangler may insert a special character in the beginning to
-  // prevent further mangling. We can strip that for display purposes.
-  if (Buf[0] == '\x01') {
-    Buf.erase(0, 1);
-  }
-  return cxstring::createDup(Buf);
+  std::string FrontendBuf;
+  llvm::raw_string_ostream FrontendBufOS(FrontendBuf);
+  MC->mangleName(ND, FrontendBufOS);
+
+  // Now apply backend mangling.
+  std::unique_ptr<llvm::DataLayout> DL(
+      new llvm::DataLayout(Ctx.getTargetInfo().getTargetDescription()));
+  llvm::Mangler BackendMangler(DL.get());
+
+  std::string FinalBuf;
+  llvm::raw_string_ostream FinalBufOS(FinalBuf);
+  BackendMangler.getNameWithPrefix(FinalBufOS,
+                                   llvm::Twine(FrontendBufOS.str()));
+
+  return cxstring::createDup(FinalBufOS.str());
 }
 
 CXString clang_getCursorDisplayName(CXCursor C) {





More information about the cfe-commits mailing list