[lldb][NFC] Fix all formatting errors in .cpp file headers
Summary:
A *.cpp file header in LLDB (and in LLDB) should like this:
```
//===-- TestUtilities.cpp -------------------------------------------------===//
```
However in LLDB most of our source files have arbitrary changes to this format and
these changes are spreading through LLDB as folks usually just use the existing
source files as templates for their new files (most notably the unnecessary
editor language indicator `-*- C++ -*-` is spreading and in every review
someone is pointing out that this is wrong, resulting in people pointing out that this
is done in the same way in other files).
This patch removes most of these inconsistencies including the editor language indicators,
all the different missing/additional '-' characters, files that center the file name, missing
trailing `===//` (mostly caused by clang-format breaking the line).
Reviewers: aprantl, espindola, jfb, shafik, JDevlieghere
Reviewed By: JDevlieghere
Subscribers: dexonsmith, wuzish, emaste, sdardis, nemanjai, kbarton, MaskRay, atanasyan, arphaman, jfb, abidh, jsji, JDevlieghere, usaxena95, lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D73258
2020-01-24 15:23:27 +08:00
|
|
|
//===-- SectionLoadList.cpp -----------------------------------------------===//
|
2010-09-15 07:52:43 +08:00
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2010-09-15 07:52:43 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "lldb/Target/SectionLoadList.h"
|
|
|
|
|
|
|
|
#include "lldb/Core/Module.h"
|
|
|
|
#include "lldb/Core/Section.h"
|
|
|
|
#include "lldb/Symbol/Block.h"
|
|
|
|
#include "lldb/Symbol/Symbol.h"
|
|
|
|
#include "lldb/Symbol/SymbolContext.h"
|
2017-03-04 04:56:28 +08:00
|
|
|
#include "lldb/Utility/Log.h"
|
2017-02-03 05:39:50 +08:00
|
|
|
#include "lldb/Utility/Stream.h"
|
2010-09-15 07:52:43 +08:00
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
2016-05-18 09:59:10 +08:00
|
|
|
SectionLoadList::SectionLoadList(const SectionLoadList &rhs)
|
|
|
|
: m_addr_to_sect(), m_sect_to_addr(), m_mutex() {
|
|
|
|
std::lock_guard<std::recursive_mutex> guard(rhs.m_mutex);
|
2013-12-06 09:12:00 +08:00
|
|
|
m_addr_to_sect = rhs.m_addr_to_sect;
|
|
|
|
m_sect_to_addr = rhs.m_sect_to_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SectionLoadList::operator=(const SectionLoadList &rhs) {
|
2019-03-30 01:07:30 +08:00
|
|
|
std::lock(m_mutex, rhs.m_mutex);
|
|
|
|
std::lock_guard<std::recursive_mutex> lhs_guard(m_mutex, std::adopt_lock);
|
|
|
|
std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_mutex, std::adopt_lock);
|
2013-12-06 09:12:00 +08:00
|
|
|
m_addr_to_sect = rhs.m_addr_to_sect;
|
|
|
|
m_sect_to_addr = rhs.m_sect_to_addr;
|
|
|
|
}
|
|
|
|
|
2010-09-15 07:52:43 +08:00
|
|
|
bool SectionLoadList::IsEmpty() const {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2011-02-05 10:25:06 +08:00
|
|
|
return m_addr_to_sect.empty();
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void SectionLoadList::Clear() {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2011-02-05 10:25:06 +08:00
|
|
|
m_addr_to_sect.clear();
|
|
|
|
m_sect_to_addr.clear();
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
addr_t
|
2012-07-07 09:24:12 +08:00
|
|
|
SectionLoadList::GetSectionLoadAddress(const lldb::SectionSP §ion) const {
|
2010-09-15 07:52:43 +08:00
|
|
|
// TODO: add support for the same section having multiple load addresses
|
|
|
|
addr_t section_load_addr = LLDB_INVALID_ADDRESS;
|
2010-12-08 13:08:21 +08:00
|
|
|
if (section) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2012-07-07 09:24:12 +08:00
|
|
|
sect_to_addr_collection::const_iterator pos =
|
|
|
|
m_sect_to_addr.find(section.get());
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2011-02-05 10:25:06 +08:00
|
|
|
if (pos != m_sect_to_addr.end())
|
|
|
|
section_load_addr = pos->second;
|
2010-12-08 13:08:21 +08:00
|
|
|
}
|
|
|
|
return section_load_addr;
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
|
|
|
|
2012-07-07 09:24:12 +08:00
|
|
|
bool SectionLoadList::SetSectionLoadAddress(const lldb::SectionSP §ion,
|
|
|
|
addr_t load_addr,
|
|
|
|
bool warn_multiple) {
|
2017-02-05 08:44:54 +08:00
|
|
|
Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER));
|
2013-08-13 09:42:25 +08:00
|
|
|
ModuleSP module_sp(section->GetModule());
|
2014-04-04 12:06:10 +08:00
|
|
|
|
2013-08-13 09:42:25 +08:00
|
|
|
if (module_sp) {
|
2017-02-05 08:44:54 +08:00
|
|
|
LLDB_LOGV(log, "(section = {0} ({1}.{2}), load_addr = {3:x}) module = {4}",
|
|
|
|
section.get(), module_sp->GetFileSpec(), section->GetName(),
|
|
|
|
load_addr, module_sp.get());
|
2010-09-15 07:52:43 +08:00
|
|
|
|
2013-08-13 09:42:25 +08:00
|
|
|
if (section->GetByteSize() == 0)
|
|
|
|
return false; // No change
|
2012-02-14 07:10:39 +08:00
|
|
|
|
2013-08-13 09:42:25 +08:00
|
|
|
// Fill in the section -> load_addr map
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-08-13 09:42:25 +08:00
|
|
|
sect_to_addr_collection::iterator sta_pos =
|
|
|
|
m_sect_to_addr.find(section.get());
|
|
|
|
if (sta_pos != m_sect_to_addr.end()) {
|
|
|
|
if (load_addr == sta_pos->second)
|
|
|
|
return false; // No change...
|
|
|
|
else
|
|
|
|
sta_pos->second = load_addr;
|
2010-12-08 13:08:21 +08:00
|
|
|
} else
|
2013-08-13 09:42:25 +08:00
|
|
|
m_sect_to_addr[section.get()] = load_addr;
|
2011-02-05 10:25:06 +08:00
|
|
|
|
2013-08-13 09:42:25 +08:00
|
|
|
// Fill in the load_addr -> section map
|
|
|
|
addr_to_sect_collection::iterator ats_pos = m_addr_to_sect.find(load_addr);
|
|
|
|
if (ats_pos != m_addr_to_sect.end()) {
|
|
|
|
// Some sections are ok to overlap, and for others we should warn. When
|
|
|
|
// we have multiple load addresses that correspond to a section, we will
|
2014-07-09 02:05:41 +08:00
|
|
|
// always attribute the section to the be last section that claims it
|
2013-08-13 09:42:25 +08:00
|
|
|
// exists at that address. Sometimes it is ok for more that one section
|
2018-05-01 00:49:04 +08:00
|
|
|
// to be loaded at a specific load address, and other times it isn't. The
|
|
|
|
// "warn_multiple" parameter tells us if we should warn in this case or
|
|
|
|
// not. The DynamicLoader plug-in subclasses should know which sections
|
|
|
|
// should warn and which shouldn't (darwin shared cache modules all
|
|
|
|
// shared the same "__LINKEDIT" sections, so the dynamic loader can pass
|
|
|
|
// false for "warn_multiple").
|
2013-08-13 09:42:25 +08:00
|
|
|
if (warn_multiple && section != ats_pos->second) {
|
|
|
|
ModuleSP module_sp(section->GetModule());
|
|
|
|
if (module_sp) {
|
|
|
|
ModuleSP curr_module_sp(ats_pos->second->GetModule());
|
|
|
|
if (curr_module_sp) {
|
|
|
|
module_sp->ReportWarning(
|
|
|
|
"address 0x%16.16" PRIx64
|
|
|
|
" maps to more than one section: %s.%s and %s.%s",
|
|
|
|
load_addr, module_sp->GetFileSpec().GetFilename().GetCString(),
|
|
|
|
section->GetName().GetCString(),
|
|
|
|
curr_module_sp->GetFileSpec().GetFilename().GetCString(),
|
|
|
|
ats_pos->second->GetName().GetCString());
|
2012-02-14 07:10:39 +08:00
|
|
|
}
|
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2013-08-13 09:42:25 +08:00
|
|
|
ats_pos->second = section;
|
|
|
|
} else
|
|
|
|
m_addr_to_sect[load_addr] = section;
|
|
|
|
return true; // Changed
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
} else {
|
|
|
|
if (log) {
|
2019-07-25 01:56:10 +08:00
|
|
|
LLDB_LOGF(
|
|
|
|
log,
|
2013-08-13 09:42:25 +08:00
|
|
|
"SectionLoadList::%s (section = %p (%s), load_addr = 0x%16.16" PRIx64
|
|
|
|
") error: module has been deleted",
|
2014-04-04 12:06:10 +08:00
|
|
|
__FUNCTION__, static_cast<void *>(section.get()),
|
|
|
|
section->GetName().AsCString(), load_addr);
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
2013-08-13 09:42:25 +08:00
|
|
|
}
|
|
|
|
return false;
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
|
|
|
|
2012-07-07 09:24:12 +08:00
|
|
|
size_t SectionLoadList::SetSectionUnloaded(const lldb::SectionSP §ion_sp) {
|
|
|
|
size_t unload_count = 0;
|
2010-09-15 07:52:43 +08:00
|
|
|
|
2012-07-07 09:24:12 +08:00
|
|
|
if (section_sp) {
|
2017-02-05 08:44:54 +08:00
|
|
|
Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER));
|
2010-09-15 07:52:43 +08:00
|
|
|
|
2017-02-05 08:44:54 +08:00
|
|
|
if (log && log->GetVerbose()) {
|
2016-01-30 04:21:33 +08:00
|
|
|
ModuleSP module_sp = section_sp->GetModule();
|
|
|
|
std::string module_name("<Unknown>");
|
|
|
|
if (module_sp) {
|
|
|
|
const FileSpec &module_file_spec(
|
|
|
|
section_sp->GetModule()->GetFileSpec());
|
|
|
|
module_name = module_file_spec.GetPath();
|
|
|
|
}
|
2019-07-25 01:56:10 +08:00
|
|
|
LLDB_LOGF(log, "SectionLoadList::%s (section = %p (%s.%s))", __FUNCTION__,
|
|
|
|
static_cast<void *>(section_sp.get()), module_name.c_str(),
|
|
|
|
section_sp->GetName().AsCString());
|
2012-07-07 09:24:12 +08:00
|
|
|
}
|
2011-02-05 10:25:06 +08:00
|
|
|
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2014-04-04 12:06:10 +08:00
|
|
|
|
2012-07-07 09:24:12 +08:00
|
|
|
sect_to_addr_collection::iterator sta_pos =
|
|
|
|
m_sect_to_addr.find(section_sp.get());
|
|
|
|
if (sta_pos != m_sect_to_addr.end()) {
|
2013-01-29 09:17:09 +08:00
|
|
|
++unload_count;
|
2012-07-07 09:24:12 +08:00
|
|
|
addr_t load_addr = sta_pos->second;
|
|
|
|
m_sect_to_addr.erase(sta_pos);
|
|
|
|
|
|
|
|
addr_to_sect_collection::iterator ats_pos =
|
|
|
|
m_addr_to_sect.find(load_addr);
|
|
|
|
if (ats_pos != m_addr_to_sect.end())
|
|
|
|
m_addr_to_sect.erase(ats_pos);
|
2011-02-05 10:25:06 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2010-09-15 07:52:43 +08:00
|
|
|
return unload_count;
|
|
|
|
}
|
|
|
|
|
2012-07-07 09:24:12 +08:00
|
|
|
bool SectionLoadList::SetSectionUnloaded(const lldb::SectionSP §ion_sp,
|
|
|
|
addr_t load_addr) {
|
2017-02-05 08:44:54 +08:00
|
|
|
Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER));
|
2010-09-15 07:52:43 +08:00
|
|
|
|
2017-02-05 08:44:54 +08:00
|
|
|
if (log && log->GetVerbose()) {
|
2016-01-30 04:21:33 +08:00
|
|
|
ModuleSP module_sp = section_sp->GetModule();
|
|
|
|
std::string module_name("<Unknown>");
|
|
|
|
if (module_sp) {
|
|
|
|
const FileSpec &module_file_spec(section_sp->GetModule()->GetFileSpec());
|
2012-07-07 09:24:12 +08:00
|
|
|
module_name = module_file_spec.GetPath();
|
2011-02-05 10:25:06 +08:00
|
|
|
}
|
2019-07-25 01:56:10 +08:00
|
|
|
LLDB_LOGF(
|
|
|
|
log,
|
2013-04-30 01:25:54 +08:00
|
|
|
"SectionLoadList::%s (section = %p (%s.%s), load_addr = 0x%16.16" PRIx64
|
2016-09-07 04:57:50 +08:00
|
|
|
")",
|
2014-04-04 12:06:10 +08:00
|
|
|
__FUNCTION__, static_cast<void *>(section_sp.get()),
|
|
|
|
module_name.c_str(), section_sp->GetName().AsCString(), load_addr);
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2011-02-05 10:25:06 +08:00
|
|
|
bool erased = false;
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2012-07-07 09:24:12 +08:00
|
|
|
sect_to_addr_collection::iterator sta_pos =
|
|
|
|
m_sect_to_addr.find(section_sp.get());
|
2011-02-05 10:25:06 +08:00
|
|
|
if (sta_pos != m_sect_to_addr.end()) {
|
|
|
|
erased = true;
|
|
|
|
m_sect_to_addr.erase(sta_pos);
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2014-04-04 12:06:10 +08:00
|
|
|
|
2011-02-05 10:25:06 +08:00
|
|
|
addr_to_sect_collection::iterator ats_pos = m_addr_to_sect.find(load_addr);
|
|
|
|
if (ats_pos != m_addr_to_sect.end()) {
|
|
|
|
erased = true;
|
|
|
|
m_addr_to_sect.erase(ats_pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
return erased;
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
|
|
|
|
2017-06-08 21:26:35 +08:00
|
|
|
bool SectionLoadList::ResolveLoadAddress(addr_t load_addr, Address &so_addr,
|
|
|
|
bool allow_section_end) const {
|
2016-05-18 09:59:10 +08:00
|
|
|
// First find the top level section that this load address exists in
|
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2011-05-18 02:13:59 +08:00
|
|
|
if (!m_addr_to_sect.empty()) {
|
|
|
|
addr_to_sect_collection::const_iterator pos =
|
|
|
|
m_addr_to_sect.lower_bound(load_addr);
|
|
|
|
if (pos != m_addr_to_sect.end()) {
|
|
|
|
if (load_addr != pos->first && pos != m_addr_to_sect.begin())
|
|
|
|
--pos;
|
2013-02-02 05:38:35 +08:00
|
|
|
const addr_t pos_load_addr = pos->first;
|
|
|
|
if (load_addr >= pos_load_addr) {
|
|
|
|
addr_t offset = load_addr - pos_load_addr;
|
2017-06-08 21:26:35 +08:00
|
|
|
if (offset < pos->second->GetByteSize() + (allow_section_end ? 1 : 0)) {
|
2011-05-18 02:13:59 +08:00
|
|
|
// We have found the top level section, now we need to find the
|
|
|
|
// deepest child section.
|
2017-06-08 21:26:35 +08:00
|
|
|
return pos->second->ResolveContainedAddress(offset, so_addr,
|
|
|
|
allow_section_end);
|
2011-05-18 02:13:59 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2011-05-18 02:13:59 +08:00
|
|
|
} else {
|
2018-05-01 00:49:04 +08:00
|
|
|
// There are no entries that have an address that is >= load_addr, so we
|
|
|
|
// need to check the last entry on our collection.
|
2011-05-19 02:22:47 +08:00
|
|
|
addr_to_sect_collection::const_reverse_iterator rpos =
|
|
|
|
m_addr_to_sect.rbegin();
|
|
|
|
if (load_addr >= rpos->first) {
|
|
|
|
addr_t offset = load_addr - rpos->first;
|
2017-06-08 21:26:35 +08:00
|
|
|
if (offset <
|
|
|
|
rpos->second->GetByteSize() + (allow_section_end ? 1 : 0)) {
|
2011-05-18 02:13:59 +08:00
|
|
|
// We have found the top level section, now we need to find the
|
|
|
|
// deepest child section.
|
2017-06-08 21:26:35 +08:00
|
|
|
return rpos->second->ResolveContainedAddress(offset, so_addr,
|
|
|
|
allow_section_end);
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2010-09-15 07:52:43 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2010-09-15 07:52:43 +08:00
|
|
|
so_addr.Clear();
|
|
|
|
return false;
|
|
|
|
}
|
2010-12-08 13:08:21 +08:00
|
|
|
|
|
|
|
void SectionLoadList::Dump(Stream &s, Target *target) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2011-02-05 10:25:06 +08:00
|
|
|
addr_to_sect_collection::const_iterator pos, end;
|
|
|
|
for (pos = m_addr_to_sect.begin(), end = m_addr_to_sect.end(); pos != end;
|
|
|
|
++pos) {
|
2014-04-04 12:06:10 +08:00
|
|
|
s.Printf("addr = 0x%16.16" PRIx64 ", section = %p: ", pos->first,
|
|
|
|
static_cast<void *>(pos->second.get()));
|
2020-05-13 17:13:19 +08:00
|
|
|
pos->second->Dump(s.AsRawOstream(), s.GetIndentLevel(), target, 0);
|
2010-12-08 13:08:21 +08:00
|
|
|
}
|
|
|
|
}
|