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