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 §ion_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 §ion_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 §ion_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 §ion_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