124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DynamicLoader.h -----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_DynamicLoader_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DynamicLoader_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Core/Error.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginInterface.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class DynamicLoader DynamicLoader.h "lldb/Target/DynamicLoader.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A plug-in interface definition class for dynamic loaders.
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Dynamic loader plug-ins track image (shared library) loading and
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// unloading. The class is initialized given a live process that is
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// halted at its entry point or just after attaching.
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Dynamic loader plug-ins can track the process by registering
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// callbacks using the:
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Process::RegisterNotificationCallbacks (const Notifications&)
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// function.
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Breakpoints can also be set in the process which can register
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// functions that get called using:
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Process::BreakpointSetCallback (lldb::user_id_t, BreakpointHitCallback, void *).
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// These breakpoint callbacks return a boolean value that indicates if
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// the process should continue or halt and should return the global
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// setting for this using:
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// DynamicLoader::StopWhenImagesChange() const.
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DynamicLoader :
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public PluginInterface
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Find a dynamic loader plugin for a given process.
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Scans the installed DynamicLoader plug-ins and tries to find
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// an instance that can be used to track image changes in \a
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// process.
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] process
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The process for which to try and locate a dynamic loader
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     plug-in instance.
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plugin_name
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An optional name of a specific dynamic loader plug-in that
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     should be used. If NULL, pick the best plug-in.
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static DynamicLoader*
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindPlugin (Process *process, const char *plugin_name);
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with a process.
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DynamicLoader (Process *process);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The destructor is virtual since this class is designed to be
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// inherited from by the plug-in instance.
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~DynamicLoader ();
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Called after attaching a process.
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Allow DynamicLoader plug-ins to execute some code after
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// attaching to a process.
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidAttach () = 0;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Called after launching a process.
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Allow DynamicLoader plug-ins to execute some code after
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the process has stopped for the first time on launch.
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidLaunch () = 0;
94e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
95e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
960bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    //------------------------------------------------------------------
970bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// Helper function that can be used to detect when a process has
980bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// called exec and is now a new and different process. This can
990bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// be called when necessary to try and detect the exec. The process
1000bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// might be able to answer this question, but sometimes it might
1010bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// not be able and the dynamic loader often knows what the program
1020bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// entry point is. So the process and the dynamic loader can work
1030bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// together to detect this.
1040bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    //------------------------------------------------------------------
1050bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual bool
1060bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    ProcessDidExec ()
1070bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
1080bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        return false;
1090bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
111fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton    /// Get whether the process should stop when images change.
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// When images (executables and shared libraries) get loaded or
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// unloaded, often debug sessions will want to try and resolve or
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// unresolve breakpoints that are set in these images. Any
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// breakpoints set by DynamicLoader plug-in instances should
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// return this value to ensure consistent debug session behaviour.
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns \b true if the process should stop when images
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     change, \b false if the process should resume.
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStopWhenImagesChange () const;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
127fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton    /// Set whether the process should stop when images change.
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// When images (executables and shared libraries) get loaded or
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// unloaded, often debug sessions will want to try and resolve or
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// unresolve breakpoints that are set in these images. The default
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// is set so that the process stops when images change, but this
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// can be overridden using this function callback.
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop
136fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton    ///     Boolean value that indicates whether the process should stop
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     when images change.
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetStopWhenImagesChange (bool stop);
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Provides a plan to step through the dynamic loader trampoline
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// for the current state of \a thread.
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_others
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Whether the plan should be set to stop other threads.
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    A pointer to the plan (caller owned) or NULL if we are not at such
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    a trampoline.
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::ThreadPlanSP
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStepThroughTrampolinePlan (Thread &thread, bool stop_others) = 0;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
1580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    //------------------------------------------------------------------
159323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// Some dynamic loaders provide features where there are a group of symbols "equivalent to"
160323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// a given symbol one of which will be chosen when the symbol is bound.  If you want to
161323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// set a breakpoint on one of these symbols, you really need to set it on all the
162323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// equivalent symbols.
163323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///
164323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///
165323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// @param[in] original_symbol
166323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///     The symbol for which we are finding equivalences.
167323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///
168323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// @param[in] module_list
169323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///     The set of modules in which to search.
170323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///
171323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// @param[out] equivalent_symbols
172323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///     The equivalent symbol list - any equivalent symbols found are appended to this list.
173323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///
174323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    /// @return
175323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    ///    Number of equivalent symbols found.
176323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    //------------------------------------------------------------------
177323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    virtual size_t
178323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    FindEquivalentSymbols (Symbol *original_symbol, ModuleList &module_list, SymbolContextList &equivalent_symbols)
179323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    {
180323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham        return 0;
181323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    }
18284985174d8b0fe4913caf446f7789f1531317650Jason Molenda
183323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    //------------------------------------------------------------------
1840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// Ask if it is ok to try and load or unload an shared library
1850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// (image).
1860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ///
1870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// The dynamic loader often knows when it would be ok to try and
1880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// load or unload a shared library. This function call allows the
1890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// dynamic loader plug-ins to check any current dyld state to make
1900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// sure it is an ok time to load a shared library.
1910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ///
1920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    /// @return
19384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///     \b true if it is currently ok to try and load a shared
1940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ///     library into the process, \b false otherwise.
1950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    //------------------------------------------------------------------
1960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    virtual Error
1970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    CanLoadImage () = 0;
1980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
19984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    //------------------------------------------------------------------
20084985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// Ask if the eh_frame information for the given SymbolContext should
20184985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// be relied on even when it's the first frame in a stack unwind.
20284985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///
20384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// The CFI instructions from the eh_frame section are normally only
20484985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// valid at call sites -- places where a program could throw an
20584985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// exception and need to unwind out.  But some Modules may be known
20684985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// to the system as having reliable eh_frame information at all call
20784985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// sites.  This would be the case if the Module's contents are largely
20884985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// hand-written assembly with hand-written eh_frame information.
20984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// Normally when unwinding from a function at the beginning of a stack
21084985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// unwind lldb will examine the assembly instructions to understand
21184985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// how the stack frame is set up and where saved registers are stored.
21284985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// But with hand-written assembly this is not reliable enough -- we need
21384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// to consult those function's hand-written eh_frame information.
21484985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///
21584985174d8b0fe4913caf446f7789f1531317650Jason Molenda    /// @return
21684985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///     \b True if the symbol context should use eh_frame instructions
21784985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///     unconditionally when unwinding from this frame.  Else \b false,
21884985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///     the normal lldb unwind behavior of only using eh_frame when the
21984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ///     function appears in the middle of the stack.
22084985174d8b0fe4913caf446f7789f1531317650Jason Molenda    //------------------------------------------------------------------
22184985174d8b0fe4913caf446f7789f1531317650Jason Molenda    virtual bool
22284985174d8b0fe4913caf446f7789f1531317650Jason Molenda    AlwaysRelyOnEHUnwindInfo (SymbolContext &sym_ctx)
22384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    {
22484985174d8b0fe4913caf446f7789f1531317650Jason Molenda       return false;
22584985174d8b0fe4913caf446f7789f1531317650Jason Molenda    }
22684985174d8b0fe4913caf446f7789f1531317650Jason Molenda
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process* m_process; ///< The process that this dynamic loader plug-in is tracking.
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (DynamicLoader);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_DynamicLoader_h_
240