summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2016-02-06 22:36:34 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2016-02-06 22:36:34 +0000
commit5e03c655a3bea99011cbaa9ecafe9d91765c3d32 (patch)
treeba9c54eee412caa9c68d23b83a8d39b1301bc052 /clang
parent4108368a8912c892b3bf21b9ab5126914c4a6588 (diff)
downloadbcm5719-llvm-5e03c655a3bea99011cbaa9ecafe9d91765c3d32.tar.gz
bcm5719-llvm-5e03c655a3bea99011cbaa9ecafe9d91765c3d32.zip
Index: provide adjustment thunk information for C++ manglings
Add support for exposing the adjustment thunk for virtual methods as appropriate. llvm-svn: 260011
Diffstat (limited to 'clang')
-rw-r--r--clang/test/Index/print-cxx-manglings.cpp30
-rw-r--r--clang/tools/libclang/CIndex.cpp39
2 files changed, 69 insertions, 0 deletions
diff --git a/clang/test/Index/print-cxx-manglings.cpp b/clang/test/Index/print-cxx-manglings.cpp
index aae29930172..27d7988eb79 100644
--- a/clang/test/Index/print-cxx-manglings.cpp
+++ b/clang/test/Index/print-cxx-manglings.cpp
@@ -64,3 +64,33 @@ struct v {
// MSVC: CXXConstructor=v{{.*}}[mangled=??0v@@QAE@H@Z] [mangled=??_Fv@@QAEXXZ]
+struct w {
+ virtual int m(int);
+};
+
+// ITANIUM: CXXMethod=m{{.*}} (virtual) [mangled=_ZN1w1mEi]
+
+// MACHO: CXXMethod=m{{.*}} (virtual) [mangled=__ZN1w1mEi]
+
+// MSVC: CXXMethod=m{{.*}} (virtual) [mangled=?m@w@@UAEHH@Z]
+
+struct x {
+ virtual int m(int);
+};
+
+// ITANIUM: CXXMethod=m{{.*}} (virtual) [mangled=_ZN1x1mEi]
+
+// MACHO: CXXMethod=m{{.*}} (virtual) [mangled=__ZN1x1mEi]
+
+// MSVC: CXXMethod=m{{.*}} (virtual) [mangled=?m@x@@UAEHH@Z]
+
+struct y : w, x {
+ virtual int m(int);
+};
+
+// ITANIUM: CXXMethod=m{{.*}} (virtual) {{.*}} [mangled=_ZN1y1mEi] [mangled=_ZThn4_N1y1mEi]
+
+// MACHO: CXXMethod=m{{.*}} (virtual) {{.*}} [mangled=__ZN1y1mEi] [mangled=__ZThn4_N1y1mEi]
+
+// MSVC: CXXMethod=m{{.*}} (virtual) {{.*}} [mangled=?m@y@@UAEHH@Z] [mangled=?m@y@@W3AEHH@Z]
+
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 5146534c0e2..e1219337ac6 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -24,6 +24,7 @@
#include "clang/AST/Attr.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/StmtVisitor.h"
+#include "clang/AST/VTableBuilder.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/DiagnosticCategories.h"
#include "clang/Basic/DiagnosticIDs.h"
@@ -4368,6 +4369,38 @@ CXString clang_Cursor_getMangling(CXCursor C) {
return cxstring::createDup(FinalBufOS.str());
}
+static std::string getMangledName(std::unique_ptr<MangleContext> &M,
+ std::unique_ptr<llvm::DataLayout> &DL,
+ const NamedDecl *ND) {
+ std::string FrontendBuf;
+ llvm::raw_string_ostream FOS(FrontendBuf);
+
+ M->mangleName(ND, FOS);
+
+ std::string BackendBuf;
+ llvm::raw_string_ostream BOS(BackendBuf);
+
+ llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL);
+
+ return BOS.str();
+}
+
+static std::string getMangledThunk(std::unique_ptr<MangleContext> &M,
+ std::unique_ptr<llvm::DataLayout> &DL,
+ const CXXMethodDecl *MD, const ThunkInfo &T) {
+ std::string FrontendBuf;
+ llvm::raw_string_ostream FOS(FrontendBuf);
+
+ M->mangleThunk(MD, T, FOS);
+
+ std::string BackendBuf;
+ llvm::raw_string_ostream BOS(BackendBuf);
+
+ llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL);
+
+ return BOS.str();
+}
+
CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
return nullptr;
@@ -4411,6 +4444,12 @@ CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
if (DD->isVirtual())
Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Deleting));
}
+ } else if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(ND)) {
+ Manglings.emplace_back(getMangledName(M, DL, ND));
+ if (MD->isVirtual())
+ if (const auto *TIV = Ctx.getVTableContext()->getThunkInfo(MD))
+ for (const auto &T : *TIV)
+ Manglings.emplace_back(getMangledThunk(M, DL, MD, T));
}
return cxstring::createSet(Manglings);
OpenPOWER on IntegriCloud