diff options
| author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-06 22:36:34 +0000 |
|---|---|---|
| committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-06 22:36:34 +0000 |
| commit | 5e03c655a3bea99011cbaa9ecafe9d91765c3d32 (patch) | |
| tree | ba9c54eee412caa9c68d23b83a8d39b1301bc052 /clang | |
| parent | 4108368a8912c892b3bf21b9ab5126914c4a6588 (diff) | |
| download | bcm5719-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.cpp | 30 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 39 |
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); |

