149480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//===-- SectionLoadList.h -----------------------------------------------*- C++ -*-===//
249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//
349480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//                     The LLVM Compiler Infrastructure
449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//
549480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// This file is distributed under the University of Illinois Open Source
649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// License. See LICENSE.TXT for details.
749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//
849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton//===----------------------------------------------------------------------===//
949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
1049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton#ifndef liblldb_SectionLoadList_h_
1149480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton#define liblldb_SectionLoadList_h_
1249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
1349480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// C Includes
1449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// C++ Includes
1558e844b3561848e73e69d6d98746d4851e78306eGreg Clayton#include <map>
1658e844b3561848e73e69d6d98746d4851e78306eGreg Clayton
1749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// Other libraries and framework includes
180bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton#include "llvm/ADT/DenseMap.h"
1949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton// Project includes
20b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h"
2158e844b3561848e73e69d6d98746d4851e78306eGreg Clayton#include "lldb/Host/Mutex.h"
2249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
2349480b158ee907f30afea651d2c81a67b5dbc971Greg Claytonnamespace lldb_private {
2449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
2549480b158ee907f30afea651d2c81a67b5dbc971Greg Claytonclass SectionLoadList
2649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton{
2749480b158ee907f30afea651d2c81a67b5dbc971Greg Claytonpublic:
2849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    //------------------------------------------------------------------
2949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // Constructors and Destructors
3049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    //------------------------------------------------------------------
3149480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    SectionLoadList () :
320bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton        m_addr_to_sect (),
330bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton        m_sect_to_addr (),
3458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        m_mutex (Mutex::eMutexTypeRecursive)
3558e844b3561848e73e69d6d98746d4851e78306eGreg Clayton
3649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    {
3749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    }
3849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
3949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    ~SectionLoadList()
4049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    {
41226484d8533b19c9a63e5df20d30c37075e51f03Greg Clayton        // Call clear since this takes a lock and clears the section load list
42226484d8533b19c9a63e5df20d30c37075e51f03Greg Clayton        // in case another thread is currently using this section load list
43226484d8533b19c9a63e5df20d30c37075e51f03Greg Clayton        Clear();
4449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    }
4549480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
4649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    bool
4749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    IsEmpty() const;
4849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
4949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    void
5049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    Clear ();
5149480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
5249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    lldb::addr_t
53545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton    GetSectionLoadAddress (const lldb::SectionSP &section_sp) const;
5449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
5549480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    bool
5649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    ResolveLoadAddress (lldb::addr_t load_addr, Address &so_addr) const;
5749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
5849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    bool
59545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton    SetSectionLoadAddress (const lldb::SectionSP &section_sp, lldb::addr_t load_addr, bool warn_multiple = false);
6049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
6149480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // The old load address should be specified when unloading to ensure we get
6249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // the correct instance of the section as a shared library could be loaded
6349480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // at more than one location.
6449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    bool
65545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton    SetSectionUnloaded (const lldb::SectionSP &section_sp, lldb::addr_t load_addr);
6649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
6749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // Unload all instances of a section. This function can be used on systems
6849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // that don't support multiple copies of the same shared library to be
6949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    // loaded at the same time.
7049480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    size_t
71545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton    SetSectionUnloaded (const lldb::SectionSP &section_sp);
7249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
7358e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    void
7458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    Dump (Stream &s, Target *target);
7549480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
7649480b158ee907f30afea651d2c81a67b5dbc971Greg Claytonprotected:
77545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton    typedef std::map<lldb::addr_t, lldb::SectionSP> addr_to_sect_collection;
780bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton    typedef llvm::DenseMap<const Section *, lldb::addr_t> sect_to_addr_collection;
790bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton    addr_to_sect_collection m_addr_to_sect;
800bfda0b1371b2381326b441adc93a6db3dc5f74fGreg Clayton    sect_to_addr_collection m_sect_to_addr;
8158e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    mutable Mutex m_mutex;
8249480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
8349480b158ee907f30afea651d2c81a67b5dbc971Greg Claytonprivate:
8449480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton    DISALLOW_COPY_AND_ASSIGN (SectionLoadList);
8549480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton};
8649480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
8749480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton} // namespace lldb_private
8849480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton
8949480b158ee907f30afea651d2c81a67b5dbc971Greg Clayton#endif  // liblldb_SectionLoadList_h_
90