summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/Module.h2
-rw-r--r--lldb/include/lldb/Symbol/ObjectFile.h2
-rw-r--r--lldb/source/Commands/CommandObjectTarget.cpp12
-rw-r--r--lldb/source/Core/Module.cpp4
-rw-r--r--lldb/source/Symbol/ObjectFile.cpp11
5 files changed, 23 insertions, 8 deletions
diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h
index aa56e84891b..c8305773bf4 100644
--- a/lldb/include/lldb/Core/Module.h
+++ b/lldb/include/lldb/Core/Module.h
@@ -974,7 +974,7 @@ public:
///
/// @return
//------------------------------------------------------------------
- Error LoadInMemory(Target &target);
+ Error LoadInMemory(Target &target, bool set_pc);
//----------------------------------------------------------------------
/// @class LookupInfo Module.h "lldb/Core/Module.h"
diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h
index 346e465371b..47614d2688a 100644
--- a/lldb/include/lldb/Symbol/ObjectFile.h
+++ b/lldb/include/lldb/Symbol/ObjectFile.h
@@ -786,7 +786,7 @@ public:
///
/// @return
//------------------------------------------------------------------
- virtual Error LoadInMemory(Target &target);
+ virtual Error LoadInMemory(Target &target, bool set_pc);
protected:
//------------------------------------------------------------------
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 61e9e9bcd94..37dec184805 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -2568,8 +2568,11 @@ public:
m_file_option(LLDB_OPT_SET_1, false, "file", 'f', 0, eArgTypeName,
"Fullpath or basename for module to load.", ""),
m_load_option(LLDB_OPT_SET_1, false, "load", 'l',
- "Write file contents to the memory.",
- false, true),
+ "Write file contents to the memory.", false, true),
+ m_pc_option(LLDB_OPT_SET_1, false, "--set-pc-to-entry", 'p',
+ "Set PC to the entry point."
+ " Only applicable with '--load' option.",
+ false, true),
m_slide_option(LLDB_OPT_SET_1, false, "slide", 's', 0, eArgTypeOffset,
"Set the load address for all sections to be the "
"virtual address in the file plus the offset.",
@@ -2578,6 +2581,7 @@ public:
LLDB_OPT_SET_1);
m_option_group.Append(&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
m_option_group.Append(&m_load_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+ m_option_group.Append(&m_pc_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
m_option_group.Append(&m_slide_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
m_option_group.Finalize();
}
@@ -2590,6 +2594,7 @@ protected:
bool DoExecute(Args &args, CommandReturnObject &result) override {
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
const bool load = m_load_option.GetOptionValue().GetCurrentValue();
+ const bool set_pc = m_pc_option.GetOptionValue().GetCurrentValue();
if (target == nullptr) {
result.AppendError("invalid target, create a debug target using the "
"'target create' command");
@@ -2742,7 +2747,7 @@ protected:
process->Flush();
}
if (load) {
- Error error = module->LoadInMemory(*target);
+ Error error = module->LoadInMemory(*target, set_pc);
if (error.Fail()) {
result.AppendError(error.AsCString());
return false;
@@ -2811,6 +2816,7 @@ protected:
OptionGroupUUID m_uuid_option_group;
OptionGroupString m_file_option;
OptionGroupBoolean m_load_option;
+ OptionGroupBoolean m_pc_option;
OptionGroupUInt64 m_slide_option;
};
diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp
index 8cd06f11507..d36f7cea359 100644
--- a/lldb/source/Core/Module.cpp
+++ b/lldb/source/Core/Module.cpp
@@ -1665,6 +1665,6 @@ bool Module::GetIsDynamicLinkEditor() {
return false;
}
-Error Module::LoadInMemory(Target &target) {
- return m_objfile_sp->LoadInMemory(target);
+Error Module::LoadInMemory(Target &target, bool set_pc) {
+ return m_objfile_sp->LoadInMemory(target, set_pc);
}
diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp
index ecae78e3954..c5f0b477a91 100644
--- a/lldb/source/Symbol/ObjectFile.cpp
+++ b/lldb/source/Symbol/ObjectFile.cpp
@@ -652,11 +652,13 @@ ConstString ObjectFile::GetNextSyntheticSymbolName() {
return ConstString(ss.GetString());
}
-Error ObjectFile::LoadInMemory(Target &target) {
+Error ObjectFile::LoadInMemory(Target &target, bool set_pc) {
Error error;
ProcessSP process = target.CalculateProcess();
if (!process)
return Error("No Process");
+ if (set_pc && !GetEntryPointAddress().IsValid())
+ return Error("No entry address in object file");
SectionList *section_list = GetSectionList();
if (!section_list)
@@ -677,5 +679,12 @@ Error ObjectFile::LoadInMemory(Target &target) {
return error;
}
}
+ if (set_pc) {
+ ThreadList &thread_list = process->GetThreadList();
+ ThreadSP curr_thread(thread_list.GetSelectedThread());
+ RegisterContextSP reg_context(curr_thread->GetRegisterContext());
+ Address file_entry = GetEntryPointAddress();
+ reg_context->SetPC(file_entry.GetLoadAddress(&target));
+ }
return error;
}
OpenPOWER on IntegriCloud