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 <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
