diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp')
-rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp | 142 |
1 files changed, 55 insertions, 87 deletions
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp index 7ebb5fee1ec6..a429963277d1 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -1,4 +1,4 @@ -//===-- ClangExpressionSourceCode.cpp ---------------------------*- C++ -*-===// +//===-- ClangExpressionSourceCode.cpp -------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -9,6 +9,7 @@ #include "ClangExpressionSourceCode.h" #include "clang/Basic/CharInfo.h" +#include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" #include "llvm/ADT/StringRef.h" @@ -173,8 +174,8 @@ static void AddMacros(const DebugMacros *dm, CompileUnit *comp_unit, lldb_private::ClangExpressionSourceCode::ClangExpressionSourceCode( llvm::StringRef filename, llvm::StringRef name, llvm::StringRef prefix, - llvm::StringRef body, Wrapping wrap) - : ExpressionSourceCode(name, prefix, body, wrap) { + llvm::StringRef body, Wrapping wrap, WrapKind wrap_kind) + : ExpressionSourceCode(name, prefix, body, wrap), m_wrap_kind(wrap_kind) { // Use #line markers to pretend that we have a single-line source file // containing only the user expression. This will hide our wrapper code // from the user when we render diagnostics with Clang. @@ -260,10 +261,9 @@ TokenVerifier::TokenVerifier(std::string body) { } } -static void AddLocalVariableDecls(const lldb::VariableListSP &var_list_sp, - StreamString &stream, - const std::string &expr, - lldb::LanguageType wrapping_language) { +void ClangExpressionSourceCode::AddLocalVariableDecls( + const lldb::VariableListSP &var_list_sp, StreamString &stream, + const std::string &expr) const { TokenVerifier tokens(expr); for (size_t i = 0; i < var_list_sp->GetSize(); i++) { @@ -280,13 +280,12 @@ static void AddLocalVariableDecls(const lldb::VariableListSP &var_list_sp, if (!expr.empty() && !tokens.hasToken(var_name.GetStringRef())) continue; - if ((var_name == "self" || var_name == "_cmd") && - (wrapping_language == lldb::eLanguageTypeObjC || - wrapping_language == lldb::eLanguageTypeObjC_plus_plus)) + const bool is_objc = m_wrap_kind == WrapKind::ObjCInstanceMethod || + m_wrap_kind == WrapKind::ObjCStaticMethod; + if ((var_name == "self" || var_name == "_cmd") && is_objc) continue; - if (var_name == "this" && - wrapping_language == lldb::eLanguageTypeC_plus_plus) + if (var_name == "this" && m_wrap_kind == WrapKind::CppMemberFunction) continue; stream.Printf("using $__lldb_local_vars::%s;\n", var_name.AsCString()); @@ -294,9 +293,8 @@ static void AddLocalVariableDecls(const lldb::VariableListSP &var_list_sp, } bool ClangExpressionSourceCode::GetText( - std::string &text, lldb::LanguageType wrapping_language, bool static_method, - ExecutionContext &exe_ctx, bool add_locals, bool force_add_all_locals, - llvm::ArrayRef<std::string> modules) const { + std::string &text, ExecutionContext &exe_ctx, bool add_locals, + bool force_add_all_locals, llvm::ArrayRef<std::string> modules) const { const char *target_specific_defines = "typedef signed char BOOL;\n"; std::string module_macros; @@ -373,21 +371,11 @@ bool ClangExpressionSourceCode::GetText( lldb::VariableListSP var_list_sp = frame->GetInScopeVariableList(false, true); AddLocalVariableDecls(var_list_sp, lldb_local_var_decls, - force_add_all_locals ? "" : m_body, - wrapping_language); + force_add_all_locals ? "" : m_body); } } if (m_wrap) { - switch (wrapping_language) { - default: - return false; - case lldb::eLanguageTypeC: - case lldb::eLanguageTypeC_plus_plus: - case lldb::eLanguageTypeObjC: - break; - } - // Generate a list of @import statements that will import the specified // module into our expression. std::string module_imports; @@ -406,22 +394,12 @@ bool ClangExpressionSourceCode::GetText( // First construct a tagged form of the user expression so we can find it // later: std::string tagged_body; - switch (wrapping_language) { - default: - tagged_body = m_body; - break; - case lldb::eLanguageTypeC: - case lldb::eLanguageTypeC_plus_plus: - case lldb::eLanguageTypeObjC: - tagged_body.append(m_start_marker); - tagged_body.append(m_body); - tagged_body.append(m_end_marker); - break; - } - switch (wrapping_language) { - default: - break; - case lldb::eLanguageTypeC: + tagged_body.append(m_start_marker); + tagged_body.append(m_body); + tagged_body.append(m_end_marker); + + switch (m_wrap_kind) { + case WrapKind::Function: wrap_stream.Printf("%s" "void \n" "%s(void *$__lldb_arg) \n" @@ -432,7 +410,7 @@ bool ClangExpressionSourceCode::GetText( module_imports.c_str(), m_name.c_str(), lldb_local_var_decls.GetData(), tagged_body.c_str()); break; - case lldb::eLanguageTypeC_plus_plus: + case WrapKind::CppMemberFunction: wrap_stream.Printf("%s" "void \n" "$__lldb_class::%s(void *$__lldb_arg) \n" @@ -443,42 +421,42 @@ bool ClangExpressionSourceCode::GetText( module_imports.c_str(), m_name.c_str(), lldb_local_var_decls.GetData(), tagged_body.c_str()); break; - case lldb::eLanguageTypeObjC: - if (static_method) { - wrap_stream.Printf( - "%s" - "@interface $__lldb_objc_class ($__lldb_category) \n" - "+(void)%s:(void *)$__lldb_arg; \n" - "@end \n" - "@implementation $__lldb_objc_class ($__lldb_category) \n" - "+(void)%s:(void *)$__lldb_arg \n" - "{ \n" - " %s; \n" - "%s" - "} \n" - "@end \n", - module_imports.c_str(), m_name.c_str(), m_name.c_str(), - lldb_local_var_decls.GetData(), tagged_body.c_str()); - } else { - wrap_stream.Printf( - "%s" - "@interface $__lldb_objc_class ($__lldb_category) \n" - "-(void)%s:(void *)$__lldb_arg; \n" - "@end \n" - "@implementation $__lldb_objc_class ($__lldb_category) \n" - "-(void)%s:(void *)$__lldb_arg \n" - "{ \n" - " %s; \n" - "%s" - "} \n" - "@end \n", - module_imports.c_str(), m_name.c_str(), m_name.c_str(), - lldb_local_var_decls.GetData(), tagged_body.c_str()); - } + case WrapKind::ObjCInstanceMethod: + wrap_stream.Printf( + "%s" + "@interface $__lldb_objc_class ($__lldb_category) \n" + "-(void)%s:(void *)$__lldb_arg; \n" + "@end \n" + "@implementation $__lldb_objc_class ($__lldb_category) \n" + "-(void)%s:(void *)$__lldb_arg \n" + "{ \n" + " %s; \n" + "%s" + "} \n" + "@end \n", + module_imports.c_str(), m_name.c_str(), m_name.c_str(), + lldb_local_var_decls.GetData(), tagged_body.c_str()); + break; + + case WrapKind::ObjCStaticMethod: + wrap_stream.Printf( + "%s" + "@interface $__lldb_objc_class ($__lldb_category) \n" + "+(void)%s:(void *)$__lldb_arg; \n" + "@end \n" + "@implementation $__lldb_objc_class ($__lldb_category) \n" + "+(void)%s:(void *)$__lldb_arg \n" + "{ \n" + " %s; \n" + "%s" + "} \n" + "@end \n", + module_imports.c_str(), m_name.c_str(), m_name.c_str(), + lldb_local_var_decls.GetData(), tagged_body.c_str()); break; } - text = wrap_stream.GetString(); + text = std::string(wrap_stream.GetString()); } else { text.append(m_body); } @@ -487,17 +465,7 @@ bool ClangExpressionSourceCode::GetText( } bool ClangExpressionSourceCode::GetOriginalBodyBounds( - std::string transformed_text, lldb::LanguageType wrapping_language, - size_t &start_loc, size_t &end_loc) { - switch (wrapping_language) { - default: - return false; - case lldb::eLanguageTypeC: - case lldb::eLanguageTypeC_plus_plus: - case lldb::eLanguageTypeObjC: - break; - } - + std::string transformed_text, size_t &start_loc, size_t &end_loc) { start_loc = transformed_text.find(m_start_marker); if (start_loc == std::string::npos) return false; |