r214520 - Add IR Mangler for more stable mangling.

Reid Kleckner rnk at google.com
Fri Aug 1 12:56:07 PDT 2014


Without a GlobalValue you don't get the right mangling for fastcall or
stdcall, which is half of the complexity of the IR-level mangler.  I guess
all it really needs is the LLVM function prototype and LLVM calling
convention, but that would require calling into CodeGenTypes.h.


On Fri, Aug 1, 2014 at 8:01 AM, Eli Bendersky <eliben at google.com> wrote:

> 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) {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140801/aafbb407/attachment.html>


More information about the cfe-commits mailing list