summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2015-09-02 01:59:14 +0000
committerJim Ingham <jingham@apple.com>2015-09-02 01:59:14 +0000
commitaa816b8f3bcd2475afddbaef591042eddcf9ab1e (patch)
tree46ffbc5e427cc5a5d78ca933bb6436ff04bf626c /lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
parentb5c2fd72571203df453b873c26b4a027af44d5b1 (diff)
downloadbcm5719-llvm-aa816b8f3bcd2475afddbaef591042eddcf9ab1e.tar.gz
bcm5719-llvm-aa816b8f3bcd2475afddbaef591042eddcf9ab1e.zip
Move more functionality from the LanguageRuntimes to the Languages.
llvm-svn: 246616
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h')
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
index 62a92a62c07..2ede8d8edde 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -12,9 +12,14 @@
// C Includes
// C++ Includes
+#include <vector>
+
// Other libraries and framework includes
+#include "llvm/ADT/StringRef.h"
+
// Project includes
#include "lldb/lldb-private.h"
+#include "lldb/Core/ConstString.h"
#include "lldb/Target/Language.h"
namespace lldb_private {
@@ -23,6 +28,94 @@ class CPlusPlusLanguage :
public Language
{
public:
+ class MethodName
+ {
+ public:
+ enum Type
+ {
+ eTypeInvalid,
+ eTypeUnknownMethod,
+ eTypeClassMethod,
+ eTypeInstanceMethod
+ };
+
+ MethodName () :
+ m_full(),
+ m_basename(),
+ m_context(),
+ m_arguments(),
+ m_qualifiers(),
+ m_type (eTypeInvalid),
+ m_parsed (false),
+ m_parse_error (false)
+ {
+ }
+
+ MethodName (const ConstString &s) :
+ m_full(s),
+ m_basename(),
+ m_context(),
+ m_arguments(),
+ m_qualifiers(),
+ m_type (eTypeInvalid),
+ m_parsed (false),
+ m_parse_error (false)
+ {
+ }
+
+ void
+ Clear();
+
+ bool
+ IsValid ()
+ {
+ if (!m_parsed)
+ Parse();
+ if (m_parse_error)
+ return false;
+ if (m_type == eTypeInvalid)
+ return false;
+ return (bool)m_full;
+ }
+
+ Type
+ GetType () const
+ {
+ return m_type;
+ }
+
+ const ConstString &
+ GetFullName () const
+ {
+ return m_full;
+ }
+
+ llvm::StringRef
+ GetBasename ();
+
+ llvm::StringRef
+ GetContext ();
+
+ llvm::StringRef
+ GetArguments ();
+
+ llvm::StringRef
+ GetQualifiers ();
+
+ protected:
+ void
+ Parse();
+
+ ConstString m_full; // Full name: "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"
+ llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex"
+ llvm::StringRef m_context; // Decl context: "lldb::SBTarget"
+ llvm::StringRef m_arguments; // Arguments: "(unsigned int)"
+ llvm::StringRef m_qualifiers; // Qualifiers: "const"
+ Type m_type;
+ bool m_parsed;
+ bool m_parse_error;
+ };
+
virtual ~CPlusPlusLanguage() = default;
CPlusPlusLanguage () = default;
@@ -47,6 +140,28 @@ public:
static lldb_private::ConstString
GetPluginNameStatic();
+
+ static bool
+ IsCPPMangledName(const char *name);
+
+ // Extract C++ context and identifier from a string using heuristic matching (as opposed to
+ // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name with parens and arguments.
+ // If the name is a lone C identifier (e.g. C) or a qualified C identifier (e.g. A::B::C) it will return true,
+ // and identifier will be the identifier (C and C respectively) and the context will be "" and "A::B::" respectively.
+ // If the name fails the heuristic matching for a qualified or unqualified C/C++ identifier, then it will return false
+ // and identifier and context will be unchanged.
+
+ static bool
+ ExtractContextAndIdentifier (const char *name, llvm::StringRef &context, llvm::StringRef &identifier);
+
+ // in some cases, compilers will output different names for one same type. when that happens, it might be impossible
+ // to construct SBType objects for a valid type, because the name that is available is not the same as the name that
+ // can be used as a search key in FindTypes(). the equivalents map here is meant to return possible alternative names
+ // for a type through which a search can be conducted. Currently, this is only enabled for C++ but can be extended
+ // to ObjC or other languages if necessary
+ static uint32_t
+ FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents);
+
//------------------------------------------------------------------
// PluginInterface protocol
OpenPOWER on IntegriCloud