summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Bendersky <eliben@google.com>2014-08-01 15:01:10 +0000
committerEli Bendersky <eliben@google.com>2014-08-01 15:01:10 +0000
commit797595956982456893a91d51d209a787effefafe (patch)
treea6da3506fc69cad13765b629b79a61f1c4c44ece /clang
parent77f1f8f170fd99f2fe9597f3bd077d246c76566e (diff)
downloadbcm5719-llvm-797595956982456893a91d51d209a787effefafe.tar.gz
bcm5719-llvm-797595956982456893a91d51d209a787effefafe.zip
Add IR Mangler for more stable mangling.
llvm-svn: 214520
Diffstat (limited to 'clang')
-rw-r--r--clang/test/Index/print-mangled-name.cpp9
-rw-r--r--clang/tools/libclang/CIndex.cpp33
2 files changed, 29 insertions, 13 deletions
diff --git a/clang/test/Index/print-mangled-name.cpp b/clang/test/Index/print-mangled-name.cpp
index 5aeb57d04b4..b7e79c3f6d6 100644
--- a/clang/test/Index/print-mangled-name.cpp
+++ b/clang/test/Index/print-mangled-name.cpp
@@ -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
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 0c1770d1b3e..d898f90ca62 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -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(CXCursor C) {
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();
+ std::string FrontendBuf;
+ llvm::raw_string_ostream FrontendBufOS(FrontendBuf);
+ MC->mangleName(ND, FrontendBufOS);
- // 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);
+ // 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) {
OpenPOWER on IntegriCloud