003 File Manager
Current Path:
/usr/src/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus
usr
/
src
/
contrib
/
llvm-project
/
lldb
/
source
/
Plugins
/
Language
/
CPlusPlus
/
📁
..
📄
BlockPointer.cpp
(7.04 KB)
📄
BlockPointer.h
(963 B)
📄
CPlusPlusLanguage.cpp
(45.02 KB)
📄
CPlusPlusLanguage.h
(4.25 KB)
📄
CPlusPlusNameParser.cpp
(19.55 KB)
📄
CPlusPlusNameParser.h
(5.18 KB)
📄
CxxStringTypes.cpp
(8.31 KB)
📄
CxxStringTypes.h
(1.86 KB)
📄
LibCxx.cpp
(26.28 KB)
📄
LibCxx.h
(6.14 KB)
📄
LibCxxAtomic.cpp
(4.36 KB)
📄
LibCxxAtomic.h
(1.15 KB)
📄
LibCxxBitset.cpp
(4.08 KB)
📄
LibCxxInitializerList.cpp
(3.8 KB)
📄
LibCxxList.cpp
(12.13 KB)
📄
LibCxxMap.cpp
(13.8 KB)
📄
LibCxxOptional.cpp
(2.54 KB)
📄
LibCxxQueue.cpp
(2.08 KB)
📄
LibCxxTuple.cpp
(2.88 KB)
📄
LibCxxUnorderedMap.cpp
(7.59 KB)
📄
LibCxxVariant.cpp
(6.64 KB)
📄
LibCxxVariant.h
(1.1 KB)
📄
LibCxxVector.cpp
(8.98 KB)
📄
LibStdcpp.cpp
(12.73 KB)
📄
LibStdcpp.h
(2.22 KB)
📄
LibStdcppTuple.cpp
(3.49 KB)
📄
LibStdcppUniquePointer.cpp
(4.97 KB)
📄
MSVCUndecoratedNameParser.cpp
(2.64 KB)
📄
MSVCUndecoratedNameParser.h
(1.59 KB)
Editing: CPlusPlusNameParser.h
//===-- CPlusPlusNameParser.h -----------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSNAMEPARSER_H #define LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSNAMEPARSER_H #include "clang/Lex/Lexer.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "lldb/Utility/ConstString.h" #include "lldb/lldb-private.h" namespace lldb_private { // Helps to validate and obtain various parts of C++ definitions. class CPlusPlusNameParser { public: CPlusPlusNameParser(llvm::StringRef text) : m_text(text) { ExtractTokens(); } struct ParsedName { llvm::StringRef basename; llvm::StringRef context; }; struct ParsedFunction { ParsedName name; llvm::StringRef arguments; llvm::StringRef qualifiers; }; // Treats given text as a function definition and parses it. // Function definition might or might not have a return type and this should // change parsing result. // Examples: // main(int, chat const*) // T fun(int, bool) // std::vector<int>::push_back(int) // int& map<int, pair<short, int>>::operator[](short) const // int (*get_function(const chat *))() llvm::Optional<ParsedFunction> ParseAsFunctionDefinition(); // Treats given text as a potentially nested name of C++ entity (function, // class, field) and parses it. // Examples: // main // fun // std::vector<int>::push_back // map<int, pair<short, int>>::operator[] // func<C>(int, C&)::nested_class::method llvm::Optional<ParsedName> ParseAsFullName(); private: // A C++ definition to parse. llvm::StringRef m_text; // Tokens extracted from m_text. llvm::SmallVector<clang::Token, 30> m_tokens; // Index of the next token to look at from m_tokens. size_t m_next_token_index = 0; // Range of tokens saved in m_next_token_index. struct Range { size_t begin_index = 0; size_t end_index = 0; Range() {} Range(size_t begin, size_t end) : begin_index(begin), end_index(end) { assert(end >= begin); } size_t size() const { return end_index - begin_index; } bool empty() const { return size() == 0; } }; struct ParsedNameRanges { Range basename_range; Range context_range; }; // Bookmark automatically restores parsing position (m_next_token_index) // when destructed unless it's manually removed with Remove(). class Bookmark { public: Bookmark(size_t &position) : m_position(position), m_position_value(position) {} Bookmark(const Bookmark &) = delete; Bookmark(Bookmark &&b) : m_position(b.m_position), m_position_value(b.m_position_value), m_restore(b.m_restore) { b.Remove(); } Bookmark &operator=(Bookmark &&) = delete; Bookmark &operator=(const Bookmark &) = delete; void Remove() { m_restore = false; } size_t GetSavedPosition() { return m_position_value; } ~Bookmark() { if (m_restore) { m_position = m_position_value; } } private: size_t &m_position; size_t m_position_value; bool m_restore = true; }; bool HasMoreTokens(); void Advance(); void TakeBack(); bool ConsumeToken(clang::tok::TokenKind kind); template <typename... Ts> bool ConsumeToken(Ts... kinds); Bookmark SetBookmark(); size_t GetCurrentPosition(); clang::Token &Peek(); bool ConsumeBrackets(clang::tok::TokenKind left, clang::tok::TokenKind right); llvm::Optional<ParsedFunction> ParseFunctionImpl(bool expect_return_type); // Parses functions returning function pointers 'string (*f(int x))(float y)' llvm::Optional<ParsedFunction> ParseFuncPtr(bool expect_return_type); // Consumes function arguments enclosed within '(' ... ')' bool ConsumeArguments(); // Consumes template arguments enclosed within '<' ... '>' bool ConsumeTemplateArgs(); // Consumes '(anonymous namespace)' bool ConsumeAnonymousNamespace(); // Consumes '{lambda ...}' bool ConsumeLambda(); // Consumes operator declaration like 'operator *' or 'operator delete []' bool ConsumeOperator(); // Skips 'const' and 'volatile' void SkipTypeQualifiers(); // Skips 'const', 'volatile', '&', '&&' in the end of the function. void SkipFunctionQualifiers(); // Consumes built-in types like 'int' or 'unsigned long long int' bool ConsumeBuiltinType(); // Consumes types defined via decltype keyword. bool ConsumeDecltype(); // Skips 'const' and 'volatile' void SkipPtrsAndRefs(); // Consumes things like 'const * const &' bool ConsumePtrsAndRefs(); // Consumes full type name like 'Namespace::Class<int>::Method()::InnerClass' bool ConsumeTypename(); llvm::Optional<ParsedNameRanges> ParseFullNameImpl(); llvm::StringRef GetTextForRange(const Range &range); // Populate m_tokens by calling clang lexer on m_text. void ExtractTokens(); }; } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSNAMEPARSER_H
Upload File
Create Folder