[Lldb-commits] [lldb] r264793 - Figure out what the fixed expression is, and print it. Added another target setting to

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 29 15:00:08 PDT 2016


Author: jingham
Date: Tue Mar 29 17:00:08 2016
New Revision: 264793

URL: http://llvm.org/viewvc/llvm-project?rev=264793&view=rev
Log:
Figure out what the fixed expression is, and print it.  Added another target setting to
quietly apply fixits for those who really trust clang's fixits.

Also, moved the retry into ClangUserExpression::Evaluate, where I can make a whole new ClangUserExpression 
to do the work.  Reusing any of the parts of a UserExpression in situ isn't supported at present.

<rdar://problem/25351938>

Modified:
    lldb/trunk/include/lldb/Expression/DiagnosticManager.h
    lldb/trunk/include/lldb/Expression/ExpressionSourceCode.h
    lldb/trunk/include/lldb/Expression/UserExpression.h
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py
    lldb/trunk/source/Commands/CommandObjectExpression.cpp
    lldb/trunk/source/Commands/CommandObjectExpression.h
    lldb/trunk/source/Expression/ExpressionSourceCode.cpp
    lldb/trunk/source/Expression/REPL.cpp
    lldb/trunk/source/Expression/UserExpression.cpp
    lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
    lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
    lldb/trunk/source/Target/Target.cpp

Modified: lldb/trunk/include/lldb/Expression/DiagnosticManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/DiagnosticManager.h?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/DiagnosticManager.h (original)
+++ lldb/trunk/include/lldb/Expression/DiagnosticManager.h Tue Mar 29 17:00:08 2016
@@ -122,7 +122,6 @@ public:
     Clear()
     {
         m_diagnostics.clear();
-        m_auto_apply_fixits = true;
         m_fixed_expression.clear();
     }
 
@@ -204,21 +203,9 @@ public:
         fixed_expression.clear();
     }
     
-    void
-    SetAutoApplyFixIts(bool auto_apply)
-    {
-        m_auto_apply_fixits = auto_apply;
-    }
-    
-    bool ShouldAutoApplyFixIts()
-    {
-        return m_auto_apply_fixits;
-    }
-
 protected:
     DiagnosticList m_diagnostics;
     std::string m_fixed_expression;
-    bool m_auto_apply_fixits = true;
 };
 }
 

Modified: lldb/trunk/include/lldb/Expression/ExpressionSourceCode.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/ExpressionSourceCode.h?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/ExpressionSourceCode.h (original)
+++ lldb/trunk/include/lldb/Expression/ExpressionSourceCode.h Tue Mar 29 17:00:08 2016
@@ -58,6 +58,14 @@ public:
                   bool static_method,
                   ExecutionContext &exe_ctx) const;
     
+    // Given a string returned by GetText, find the beginning and end of the body passed to CreateWrapped.
+    // Return true if the bounds could be found.  This will also work on text with FixItHints applied.
+    static bool
+    GetOriginalBodyBounds(std::string transformed_text,
+                          lldb::LanguageType wrapping_language,
+                          size_t &start_loc,
+                          size_t &end_loc);
+    
 private:
     ExpressionSourceCode (const char *name,
                           const char *prefix,

Modified: lldb/trunk/include/lldb/Expression/UserExpression.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/UserExpression.h?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/UserExpression.h (original)
+++ lldb/trunk/include/lldb/Expression/UserExpression.h Tue Mar 29 17:00:08 2016
@@ -281,6 +281,9 @@ public:
     /// @param[in] line_offset
     ///     The offset of the first line of the expression from the "beginning" of a virtual source file used for error reporting and debug info.
     ///
+    /// @param[out] fixed_expression
+    ///     If non-nullptr, the fixed expression is copied into the provided string.
+    ///
     /// @param[out] jit_module_sp_ptr
     ///     If non-nullptr, used to persist the generated IR module.
     ///
@@ -295,9 +298,18 @@ public:
              lldb::ValueObjectSP &result_valobj_sp,
              Error &error,
              uint32_t line_offset = 0,
+             std::string *fixed_expression = nullptr,
              lldb::ModuleSP *jit_module_sp_ptr = nullptr);
 
     static const Error::ValueType kNoResult = 0x1001; ///< ValueObject::GetError() returns this if there is no result from the expression.
+    
+    const char *
+    GetFixedText()
+    {
+        if (m_fixed_text.empty())
+            return nullptr;
+        return m_fixed_text.c_str();
+    }
 
 protected:
     static lldb::addr_t
@@ -321,6 +333,7 @@ protected:
     Address                                     m_address;              ///< The address the process is stopped in.
     std::string                                 m_expr_text;            ///< The text of the expression, as typed by the user
     std::string                                 m_expr_prefix;          ///< The text of the translation-level definitions, as provided by the user
+    std::string                                 m_fixed_text;           ///< The text of the expression with fixits applied - this won't be set if the fixed text doesn't parse.
     lldb::LanguageType                          m_language;             ///< The language to use when parsing (eLanguageTypeUnknown means use defaults)
     ResultType                                  m_desired_type;         ///< The type to coerce the expression's result to.  If eResultTypeAny, inferred from the expression.
     EvaluateExpressionOptions                   m_options;              ///< Additional options provided by the user.

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Tue Mar 29 17:00:08 2016
@@ -152,6 +152,9 @@ public:
     GetEnableAutoApplyFixIts () const;
     
     bool
+    GetEnableNotifyAboutFixIts () const;
+    
+    bool
     GetEnableSyntheticValue () const;
     
     uint32_t
@@ -1375,7 +1378,8 @@ public:
     EvaluateExpression (const char *expression,
                         ExecutionContextScope *exe_scope,
                         lldb::ValueObjectSP &result_valobj_sp,
-                        const EvaluateExpressionOptions& options = EvaluateExpressionOptions());
+                        const EvaluateExpressionOptions& options = EvaluateExpressionOptions(),
+                        std::string *fixed_expression = nullptr);
 
     lldb::ExpressionVariableSP
     GetPersistentVariable(const ConstString &name);

Modified: lldb/trunk/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py Tue Mar 29 17:00:08 2016
@@ -70,8 +70,12 @@ class ExprCommandWithFixits(TestBase):
 
         # Now turn off the fixits, and the expression should fail:
         options.SetAutoApplyFixIts(False)
-        value = frame.EvaluateExpression("two_error_expression", options)
+        value = frame.EvaluateExpression(two_error_expression, options)
         self.assertTrue(value.IsValid())
         self.assertTrue(value.GetError().Fail())
+        error_string = value.GetError().GetCString()
+        self.assertTrue(error_string.find("fixed expression suggested:") != -1, "Fix was suggested")
+        self.assertTrue(error_string.find("my_pointer->second.a") != -1, "Fix was right")
+
         
 

Modified: lldb/trunk/source/Commands/CommandObjectExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectExpression.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectExpression.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectExpression.cpp Tue Mar 29 17:00:08 2016
@@ -336,7 +336,14 @@ CommandObjectExpression::EvaluateExpress
         else
             options.SetTimeoutUsec(0);
 
-        target->EvaluateExpression(expr, frame, result_valobj_sp, options);
+        ExpressionResults success = target->EvaluateExpression(expr, frame, result_valobj_sp, options, &m_fixed_expression);
+        
+        // We only tell you about the FixIt if we applied it.  The compiler errors will suggest the FixIt if it parsed.
+        if (error_stream && !m_fixed_expression.empty() && target->GetEnableNotifyAboutFixIts())
+        {
+            if (success == eExpressionCompleted)
+                error_stream->Printf ("  Fixit applied, fixed expression was: \n    %s\n", m_fixed_expression.c_str());
+        }
 
         if (result_valobj_sp)
         {
@@ -477,6 +484,7 @@ bool
 CommandObjectExpression::DoExecute(const char *command,
                                    CommandReturnObject &result)
 {
+    m_fixed_expression.clear();
     m_option_group.NotifyOptionParsingStarting();
 
     const char * expr = nullptr;
@@ -598,7 +606,26 @@ CommandObjectExpression::DoExecute(const
         expr = command;
     
     if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
+    {
+        Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
+        if (!m_fixed_expression.empty() && target->GetEnableNotifyAboutFixIts())
+        {
+            CommandHistory &history = m_interpreter.GetCommandHistory();
+            // FIXME: Can we figure out what the user actually typed (e.g. some alias for expr???)
+            // If we can it would be nice to show that.
+            std::string fixed_command("expression ");
+            if (expr == command)
+                fixed_command.append(m_fixed_expression);
+            else
+            {
+                // Add in any options that might have been in the original command:
+                fixed_command.append(command, expr - command);
+                fixed_command.append(m_fixed_expression);
+            }
+            history.AppendString(fixed_command);
+        }
         return true;
+    }
 
     result.SetStatus (eReturnStatusFailed);
     return false;

Modified: lldb/trunk/source/Commands/CommandObjectExpression.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectExpression.h?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectExpression.h (original)
+++ lldb/trunk/source/Commands/CommandObjectExpression.h Tue Mar 29 17:00:08 2016
@@ -108,6 +108,7 @@ protected:
     CommandOptions m_command_options;
     uint32_t m_expr_line_count;
     std::string m_expr_lines; // Multi-line expression support
+    std::string m_fixed_expression;  // Holds the current expression's fixed text.
 };
 
 } // namespace lldb_private

Modified: lldb/trunk/source/Expression/ExpressionSourceCode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ExpressionSourceCode.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ExpressionSourceCode.cpp (original)
+++ lldb/trunk/source/Expression/ExpressionSourceCode.cpp Tue Mar 29 17:00:08 2016
@@ -61,6 +61,9 @@ extern "C"
 }
 )";
 
+static const char *c_start_marker = "    /*LLDB_BODY_START*/\n    ";
+static const char *c_end_marker   = ";\n    /*LLDB_BODY_END*/\n";
+
 namespace {
 
 class AddMacroState
@@ -301,6 +304,22 @@ bool ExpressionSourceCode::GetText (std:
                            target_specific_defines,
                            m_prefix.c_str());
         
+        // 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(c_start_marker);
+                tagged_body.append(m_body);
+                tagged_body.append(c_end_marker);
+                break;
+            
+        }
         switch (wrapping_language) 
         {
         default:
@@ -310,23 +329,23 @@ bool ExpressionSourceCode::GetText (std:
                                "%s(void *$__lldb_arg)          \n"
                                "{                              \n"
                                "    %s;                        \n"
-                               "    %s;                        \n" 
+                               "%s"
                                "}                              \n",
                                m_name.c_str(),
                                lldb_local_var_decls.GetData(),
-                               m_body.c_str());
+                               tagged_body.c_str());
             break;
         case lldb::eLanguageTypeC_plus_plus:
             wrap_stream.Printf("void                                   \n"
                                "$__lldb_class::%s(void *$__lldb_arg) %s\n"
                                "{                                      \n"
                                "    %s;                                \n"
-                               "    %s;                                \n" 
+                               "%s"
                                "}                                      \n",
                                m_name.c_str(),
                                (const_object ? "const" : ""),
                                lldb_local_var_decls.GetData(),
-                               m_body.c_str());
+                               tagged_body.c_str());
             break;
         case lldb::eLanguageTypeObjC:
             if (static_method)
@@ -337,12 +356,12 @@ bool ExpressionSourceCode::GetText (std:
                                    "@implementation $__lldb_objc_class ($__lldb_category)   \n"
                                    "+(void)%s:(void *)$__lldb_arg                           \n"
                                    "{                                                       \n"
-                                   "    %s;                                                 \n"
+                                   "%s"
                                    "}                                                       \n"
                                    "@end                                                    \n",
                                    m_name.c_str(),
                                    m_name.c_str(),
-                                   m_body.c_str());
+                                   tagged_body.c_str());
             }
             else
             {
@@ -352,12 +371,12 @@ bool ExpressionSourceCode::GetText (std:
                                    "@implementation $__lldb_objc_class ($__lldb_category)  \n"
                                    "-(void)%s:(void *)$__lldb_arg                          \n"
                                    "{                                                      \n"
-                                   "    %s;                                                \n"
+                                   "%s"
                                    "}                                                      \n"
                                    "@end                                                   \n",
                                    m_name.c_str(),
                                    m_name.c_str(),
-                                   m_body.c_str());
+                                   tagged_body.c_str());
             }
             break;
         }
@@ -371,3 +390,35 @@ bool ExpressionSourceCode::GetText (std:
 
     return true;
 }
+
+bool
+ExpressionSourceCode::GetOriginalBodyBounds(std::string transformed_text,
+                                            lldb::LanguageType wrapping_language,
+                                            size_t &start_loc,
+                                            size_t &end_loc)
+{
+    const char *start_marker;
+    const char *end_marker;
+    
+    switch (wrapping_language)
+    {
+    default:
+        return false;
+    case lldb::eLanguageTypeC:
+    case lldb::eLanguageTypeC_plus_plus:
+    case lldb::eLanguageTypeObjC:
+        start_marker = c_start_marker;
+        end_marker = c_end_marker;
+        break;
+    }
+    
+    start_loc = transformed_text.find(start_marker);
+    if (start_loc == std::string::npos)
+        return false;
+    start_loc += strlen(start_marker);
+    end_loc  = transformed_text.find(end_marker);
+    if (end_loc == std::string::npos)
+        return false;
+    return true;
+}
+

Modified: lldb/trunk/source/Expression/REPL.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/REPL.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Expression/REPL.cpp (original)
+++ lldb/trunk/source/Expression/REPL.cpp Tue Mar 29 17:00:08 2016
@@ -363,6 +363,7 @@ REPL::IOHandlerInputComplete (IOHandler
                                                                                   result_valobj_sp,
                                                                                   error,
                                                                                   0, // Line offset
+                                                                                  nullptr, // Fixed Expression
                                                                                   &jit_module_sp);
             
             //CommandInterpreter &ci = debugger.GetCommandInterpreter();

Modified: lldb/trunk/source/Expression/UserExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/UserExpression.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Expression/UserExpression.cpp (original)
+++ lldb/trunk/source/Expression/UserExpression.cpp Tue Mar 29 17:00:08 2016
@@ -160,6 +160,7 @@ UserExpression::Evaluate (ExecutionConte
                                lldb::ValueObjectSP &result_valobj_sp,
                                Error &error,
                                uint32_t line_offset,
+                               std::string *fixed_expression,
                                lldb::ModuleSP *jit_module_sp_ptr)
 {
     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_EXPRESSIONS | LIBLLDB_LOG_STEP));
@@ -253,18 +254,65 @@ UserExpression::Evaluate (ExecutionConte
     }
 
     DiagnosticManager diagnostic_manager;
-    diagnostic_manager.SetAutoApplyFixIts(options.GetAutoApplyFixIts());
 
-    if (!user_expression_sp->Parse(diagnostic_manager, exe_ctx, execution_policy, keep_expression_in_memory,
-                                   generate_debug_info))
+    bool parse_success = user_expression_sp->Parse(diagnostic_manager,
+                                                   exe_ctx,
+                                                   execution_policy,
+                                                   keep_expression_in_memory,
+                                                   generate_debug_info);
+    
+    // Calculate the fixed expression always, since we need it for errors.
+    std::string tmp_fixed_expression;
+    if (fixed_expression == nullptr)
+        fixed_expression = &tmp_fixed_expression;
+
+    const char *fixed_text = user_expression_sp->GetFixedText();
+    if (fixed_text != nullptr)
+            fixed_expression->append(fixed_text);
+    
+    // If there is a fixed expression, try to parse it:
+    if (!parse_success)
     {
         execution_results = lldb::eExpressionParseError;
-        if (!diagnostic_manager.Diagnostics().size())
-            error.SetExpressionError(execution_results, "expression failed to parse, unknown error");
-        else
-            error.SetExpressionError(execution_results, diagnostic_manager.GetString().c_str());
+        if (fixed_expression && !fixed_expression->empty() && options.GetAutoApplyFixIts())
+        {
+            lldb::UserExpressionSP fixed_expression_sp(target->GetUserExpressionForLanguage (fixed_expression->c_str(),
+                                                                                             full_prefix,
+                                                                                             language,
+                                                                                             desired_type,
+                                                                                             options,
+                                                                                             error));
+            DiagnosticManager fixed_diagnostic_manager;
+            parse_success = fixed_expression_sp->Parse(fixed_diagnostic_manager,
+                                                       exe_ctx,
+                                                       execution_policy,
+                                                       keep_expression_in_memory,
+                                                       generate_debug_info);
+            if (parse_success)
+            {
+                diagnostic_manager.Clear();
+                user_expression_sp = fixed_expression_sp;
+            }
+        }
+        
+        if (!parse_success)
+        {
+            if (!fixed_expression->empty() && target->GetEnableNotifyAboutFixIts())
+            {
+                error.SetExpressionErrorWithFormat(execution_results, "expression failed to parse, fixed expression suggested:\n  %s",
+                                                   fixed_expression->c_str());
+            }
+            else
+            {
+                if (!diagnostic_manager.Diagnostics().size())
+                    error.SetExpressionError(execution_results, "expression failed to parse, unknown error");
+                else
+                    error.SetExpressionError(execution_results, diagnostic_manager.GetString().c_str());
+            }
+        }
     }
-    else
+    
+    if (parse_success)
     {
         // If a pointer to a lldb::ModuleSP was passed in, return the JIT'ed module if one was created
         if (jit_module_sp_ptr)

Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp (original)
+++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp Tue Mar 29 17:00:08 2016
@@ -399,6 +399,8 @@ ClangUserExpression::Parse(DiagnosticMan
         }
     }
 
+    lldb::LanguageType lang_type = lldb::eLanguageTypeUnknown;
+
     if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
     {
         m_transformed_text = m_expr_text;
@@ -408,8 +410,6 @@ ClangUserExpression::Parse(DiagnosticMan
         std::unique_ptr<ExpressionSourceCode> source_code(
             ExpressionSourceCode::CreateWrapped(prefix.c_str(), m_expr_text.c_str()));
 
-        lldb::LanguageType lang_type;
-
         if (m_in_cplusplus_method)
             lang_type = lldb::eLanguageTypeC_plus_plus;
         else if (m_in_objectivec_method)
@@ -491,37 +491,25 @@ ClangUserExpression::Parse(DiagnosticMan
     // We use a shared pointer here so we can use the original parser - if it succeeds
     // or the rewrite parser we might make if it fails.  But the parser_sp will never be empty.
     
-    std::shared_ptr<ClangExpressionParser> parser_sp(new ClangExpressionParser(exe_scope, *this, generate_debug_info));
+    ClangExpressionParser parser(exe_scope, *this, generate_debug_info);
 
-    unsigned num_errors = parser_sp->Parse(diagnostic_manager);
+    unsigned num_errors = parser.Parse(diagnostic_manager);
 
-    // Check here for FixItHints.  If there are any try fixing the source and re-parsing...
-    if (num_errors && diagnostic_manager.HasFixIts() && diagnostic_manager.ShouldAutoApplyFixIts())
+    // Check here for FixItHints.  If there are any try to apply the fixits and set the fixed text in m_fixed_text
+    // before returning an error.
+    if (num_errors)
     {
-        if (parser_sp->RewriteExpression(diagnostic_manager))
+        if (diagnostic_manager.HasFixIts())
         {
-            std::string backup_source = std::move(m_transformed_text);
-            m_transformed_text = diagnostic_manager.GetFixedExpression();
-            // Make a new diagnostic manager and parser, and try again with the rewritten expression:
-            // FIXME: It would be nice to reuse the parser we have but that doesn't seem to be possible.
-            DiagnosticManager rewrite_manager;
-            std::shared_ptr<ClangExpressionParser> rewrite_parser_sp(new ClangExpressionParser(exe_scope, *this, generate_debug_info));
-            unsigned rewrite_errors = rewrite_parser_sp->Parse(rewrite_manager);
-            if (rewrite_errors == 0)
-            {
-                diagnostic_manager.Clear();
-                parser_sp = rewrite_parser_sp;
-                num_errors = 0;
-            }
-            else
+            if (parser.RewriteExpression(diagnostic_manager))
             {
-                m_transformed_text = std::move(backup_source);
+                size_t fixed_start;
+                size_t fixed_end;
+                const std::string &fixed_expression = diagnostic_manager.GetFixedExpression();
+                if (ExpressionSourceCode::GetOriginalBodyBounds(fixed_expression, lang_type, fixed_start, fixed_end))
+                    m_fixed_text = fixed_expression.substr(fixed_start, fixed_end - fixed_start);
             }
         }
-    }
-    
-    if (num_errors)
-    {
         diagnostic_manager.Printf(eDiagnosticSeverityError, "%u error%s parsing expression", num_errors,
                                   num_errors == 1 ? "" : "s");
 
@@ -535,12 +523,12 @@ ClangUserExpression::Parse(DiagnosticMan
     //
 
     {
-        Error jit_error = parser_sp->PrepareForExecution(m_jit_start_addr,
-                                                         m_jit_end_addr,
-                                                         m_execution_unit_sp,
-                                                         exe_ctx,
-                                                         m_can_interpret,
-                                                         execution_policy);
+        Error jit_error = parser.PrepareForExecution(m_jit_start_addr,
+                                                     m_jit_end_addr,
+                                                     m_execution_unit_sp,
+                                                     exe_ctx,
+                                                     m_can_interpret,
+                                                     execution_policy);
 
         if (!jit_error.Success())
         {
@@ -555,7 +543,7 @@ ClangUserExpression::Parse(DiagnosticMan
 
     if (exe_ctx.GetProcessPtr() && execution_policy == eExecutionPolicyTopLevel)
     {
-        Error static_init_error = parser_sp->RunStaticInitializers(m_execution_unit_sp, exe_ctx);
+        Error static_init_error = parser.RunStaticInitializers(m_execution_unit_sp, exe_ctx);
 
         if (!static_init_error.Success())
         {

Modified: lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp (original)
+++ lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp Tue Mar 29 17:00:08 2016
@@ -186,9 +186,14 @@ AddressSanitizerRuntime::RetrieveReportD
     options.SetIgnoreBreakpoints(true);
     options.SetTimeoutUsec(RETRIEVE_REPORT_DATA_FUNCTION_TIMEOUT_USEC);
     options.SetPrefix(address_sanitizer_retrieve_report_data_prefix);
+    options.SetAutoApplyFixIts(false);
     
     ValueObjectSP return_value_sp;
-    if (process_sp->GetTarget().EvaluateExpression(address_sanitizer_retrieve_report_data_command, frame_sp.get(), return_value_sp, options) != eExpressionCompleted)
+    std::string fixed_expression;
+    if (process_sp->GetTarget().EvaluateExpression(address_sanitizer_retrieve_report_data_command,
+                                                   frame_sp.get(),
+                                                   return_value_sp,
+                                                   options) != eExpressionCompleted)
         return StructuredData::ObjectSP();
     
     int present = return_value_sp->GetValueForExpressionPath(".present")->GetValueAsUnsigned(0);

Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=264793&r1=264792&r2=264793&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Tue Mar 29 17:00:08 2016
@@ -2234,7 +2234,8 @@ ExpressionResults
 Target::EvaluateExpression(const char *expr_cstr,
                            ExecutionContextScope *exe_scope,
                            lldb::ValueObjectSP &result_valobj_sp,
-                           const EvaluateExpressionOptions& options)
+                           const EvaluateExpressionOptions& options,
+                           std::string *fixed_expression)
 {
     result_valobj_sp.reset();
     
@@ -2284,7 +2285,9 @@ Target::EvaluateExpression(const char *e
                                                       expr_cstr,
                                                       prefix,
                                                       result_valobj_sp,
-                                                      error);
+                                                      error,
+                                                      0, // Line Number
+                                                      fixed_expression);
     }
     
     m_suppress_stop_hooks = old_suppress_value;
@@ -3426,6 +3429,7 @@ g_properties[] =
     { "clang-module-search-paths"          , OptionValue::eTypeFileSpecList, false, 0                       , nullptr, nullptr, "List of directories to be searched when locating modules for Clang." },
     { "auto-import-clang-modules"          , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Automatically load Clang modules referred to by the program." },
     { "auto-apply-fixits"                  , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Automatically apply fixit hints to expressions." },
+    { "notify-about-fixits"                , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Print the fixed expression text." },
     { "max-children-count"                 , OptionValue::eTypeSInt64    , false, 256                       , nullptr, nullptr, "Maximum number of children to expand in any level of depth." },
     { "max-string-summary-length"          , OptionValue::eTypeSInt64    , false, 1024                      , nullptr, nullptr, "Maximum number of characters to show when using %s in summary strings." },
     { "max-memory-read-size"               , OptionValue::eTypeSInt64    , false, 1024                      , nullptr, nullptr, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
@@ -3483,6 +3487,7 @@ enum
     ePropertyClangModuleSearchPaths,
     ePropertyAutoImportClangModules,
     ePropertyAutoApplyFixIts,
+    ePropertyNotifyAboutFixIts,
     ePropertyMaxChildrenCount,
     ePropertyMaxSummaryLength,
     ePropertyMaxMemReadSize,
@@ -3862,6 +3867,13 @@ TargetProperties::GetEnableAutoApplyFixI
     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
 }
 
+bool
+TargetProperties::GetEnableNotifyAboutFixIts() const
+{
+    const uint32_t idx = ePropertyNotifyAboutFixIts;
+    return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
+}
+
 bool
 TargetProperties::GetEnableSyntheticValue () const
 {




More information about the lldb-commits mailing list