Second part of indicating when the user is stopped in optimized code.

The first part was in r243508 -- the extent of the UI changes in that
patchset was to add "[opt]" to the frame-format when a stack frame was
built with optimized code.

In this change, when a stack frame built with optimization is selected,
a message will be printed to the async output channel --

opt1.c was compiled with optimization - stepping may behave oddly; variables may not be available.

The warning will be only be printed once per source file in a debug session.
These warnings may be disabled by

settings set target.process.optimization-warnings false

Internally, a new Process::PrintWarning() method has been added for
warnings that we want to print only once to the user.  It takes a type
of warning (currently only eWarningsOptimization) and an object
pointer (CompileUnit*) - the warning will only be printed once for a
given object pointer value.

This is a bit of a prototype of this change -  I think we will be
tweaking it more in the future.  But I wanted to land this and see
how it goes.  Advanced users will find these warnings unnecessary
noise and will quickly disable them - but anyone who maintains a 
debugger knows that debugging optimized code, without realizing it,
is a constant source of confusion and frustation for more typical
debugger users.  

I imagine there will be more of these "warn once per whatever" style
warnings that we will want to add in the future and we'll need to 
come up with a better way for enabling/disabling them.  But I'm not
srue what form that warning settings should take and I didn't want
to code up something that we regret later, so for now I just added
another process setting for this one warning.

<rdar://problem/19281172> 

llvm-svn: 244190
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index b939aeb..0327fe7 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -360,12 +360,22 @@
         BroadcastEvent(eBroadcastBitSelectedFrameChanged, new ThreadEventData (this->shared_from_this(), new_frame_id));
 }
 
+lldb::StackFrameSP
+Thread::GetSelectedFrame()
+{
+    StackFrameListSP stack_frame_list_sp(GetStackFrameList());
+    StackFrameSP frame_sp = stack_frame_list_sp->GetFrameAtIndex (stack_frame_list_sp->GetSelectedFrameIndex());
+    FunctionOptimizationWarning (frame_sp.get());
+    return frame_sp;
+}
+
 uint32_t
 Thread::SetSelectedFrame (lldb_private::StackFrame *frame, bool broadcast)
 {
     uint32_t ret_value = GetStackFrameList()->SetSelectedFrame(frame);
     if (broadcast)
         BroadcastSelectedFrameChange(frame->GetStackID());
+    FunctionOptimizationWarning (frame);
     return ret_value;
 }
 
@@ -378,6 +388,7 @@
         GetStackFrameList()->SetSelectedFrame(frame_sp.get());
         if (broadcast)
             BroadcastSelectedFrameChange(frame_sp->GetStackID());
+        FunctionOptimizationWarning (frame_sp.get());
         return true;
     }
     else
@@ -403,6 +414,7 @@
 
             bool show_frame_info = true;
             bool show_source = !already_shown;
+            FunctionOptimizationWarning (frame_sp.get());
             return frame_sp->GetStatus (output_stream, show_frame_info, show_source);
         }
         return false;
@@ -411,6 +423,22 @@
         return false;
 }
 
+void
+Thread::FunctionOptimizationWarning (StackFrame *frame)
+{
+    if (frame && frame->HasDebugInformation())
+    {
+        SymbolContext sc = frame->GetSymbolContext (eSymbolContextFunction | eSymbolContextCompUnit);
+        if (sc.function && sc.function->GetIsOptimized() == true && sc.comp_unit)
+        {
+            if (sc.line_entry.file.GetFilename().IsEmpty() == false)
+            {
+                GetProcess()->PrintWarning (Process::Warnings::eWarningsOptimization, sc.comp_unit, "%s was compiled with optimization - stepping may behave oddly; variables may not be available.\n", sc.line_entry.file.GetFilename().GetCString());
+            }
+        }
+    }
+}
+
 
 lldb::StopInfoSP
 Thread::GetStopInfo ()