Skip to content

Commit

Permalink
Provide option to set pc of the file loaded in memory.
Browse files Browse the repository at this point in the history
Summary: This commit adds an option to set PC to the entry point of the file loaded using "target module load" command. In D28804, Greg asked me to separate this part under a different option.

Reviewers: clayborg

Reviewed By: clayborg

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D28944

llvm-svn: 292989
  • Loading branch information
abidh committed Jan 24, 2017
1 parent 8c6ed0f commit b10fb96
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 8 deletions.
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/Module.h
Expand Up @@ -974,7 +974,7 @@ class Module : public std::enable_shared_from_this<Module>,
///
/// @return
//------------------------------------------------------------------
Error LoadInMemory(Target &target);
Error LoadInMemory(Target &target, bool set_pc);

//----------------------------------------------------------------------
/// @class LookupInfo Module.h "lldb/Core/Module.h"
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Symbol/ObjectFile.h
Expand Up @@ -786,7 +786,7 @@ class ObjectFile : public std::enable_shared_from_this<ObjectFile>,
///
/// @return
//------------------------------------------------------------------
virtual Error LoadInMemory(Target &target);
virtual Error LoadInMemory(Target &target, bool set_pc);

protected:
//------------------------------------------------------------------
Expand Down
12 changes: 9 additions & 3 deletions lldb/source/Commands/CommandObjectTarget.cpp
Expand Up @@ -2568,8 +2568,11 @@ class CommandObjectTargetModulesLoad
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.",
Expand All @@ -2578,6 +2581,7 @@ class CommandObjectTargetModulesLoad
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();
}
Expand All @@ -2590,6 +2594,7 @@ class CommandObjectTargetModulesLoad
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");
Expand Down Expand Up @@ -2742,7 +2747,7 @@ class CommandObjectTargetModulesLoad
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;
Expand Down Expand Up @@ -2811,6 +2816,7 @@ class CommandObjectTargetModulesLoad
OptionGroupUUID m_uuid_option_group;
OptionGroupString m_file_option;
OptionGroupBoolean m_load_option;
OptionGroupBoolean m_pc_option;
OptionGroupUInt64 m_slide_option;
};

Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Core/Module.cpp
Expand Up @@ -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);
}
11 changes: 10 additions & 1 deletion lldb/source/Symbol/ObjectFile.cpp
Expand Up @@ -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)
Expand All @@ -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;
}

0 comments on commit b10fb96

Please sign in to comment.