Skip to content

Commit eb41eed

Browse files
committed
MFC r364480:
Merge commit 1ce07cd614be from llvm git (by me): Instantiate Error in Target::GetEntryPointAddress() only when necessary When Target::GetEntryPointAddress() calls exe_module->GetObjectFile()->GetEntryPointAddress(), and the returned entry_addr is valid, it can immediately be returned. However, just before that, an llvm::Error value has been setup, but in this case it is not consumed before returning, like is done further below in the function. In https://bugs.freebsd.org/248745 we got a bug report for this, where a very simple test case aborts and dumps core: * thread #1, name = 'testcase', stop reason = breakpoint 1.1 frame #0: 0x00000000002018d4 testcase`main(argc=1, argv=0x00007fffffffea18) at testcase.c:3:5 1 int main(int argc, char *argv[]) 2 { -> 3 return 0; 4 } (lldb) p argc Program aborted due to an unhandled Error: Error value was Success. (Note: Success values must still be checked prior to being destroyed). Thread 1 received signal SIGABRT, Aborted. thr_kill () at thr_kill.S:3 3 thr_kill.S: No such file or directory. (gdb) bt #0 thr_kill () at thr_kill.S:3 #1 0x00000008049a0004 in __raise (s=6) at /usr/src/lib/libc/gen/raise.c:52 #2 0x0000000804916229 in abort () at /usr/src/lib/libc/stdlib/abort.c:67 #3 0x000000000451b5f5 in fatalUncheckedError () at /usr/src/contrib/llvm-project/llvm/lib/Support/Error.cpp:112 #4 0x00000000019cf008 in GetEntryPointAddress () at /usr/src/contrib/llvm-project/llvm/include/llvm/Support/Error.h:267 #5 0x0000000001bccbd8 in ConstructorSetup () at /usr/src/contrib/llvm-project/lldb/source/Target/ThreadPlanCallFunction.cpp:67 #6 0x0000000001bcd2c0 in ThreadPlanCallFunction () at /usr/src/contrib/llvm-project/lldb/source/Target/ThreadPlanCallFunction.cpp:114 #7 0x00000000020076d4 in InferiorCallMmap () at /usr/src/contrib/llvm-project/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp:97 #8 0x0000000001f4be33 in DoAllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/ProcessFreeBSD.cpp:604 #9 0x0000000001fe51b9 in AllocatePage () at /usr/src/contrib/llvm-project/lldb/source/Target/Memory.cpp:347 #10 0x0000000001fe5385 in AllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Target/Memory.cpp:383 #11 0x0000000001974da2 in AllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Target/Process.cpp:2301 #12 CanJIT () at /usr/src/contrib/llvm-project/lldb/source/Target/Process.cpp:2331 #13 0x0000000001a1bf3d in Evaluate () at /usr/src/contrib/llvm-project/lldb/source/Expression/UserExpression.cpp:190 #14 0x00000000019ce7a2 in EvaluateExpression () at /usr/src/contrib/llvm-project/lldb/source/Target/Target.cpp:2372 #15 0x0000000001ad784c in EvaluateExpression () at /usr/src/contrib/llvm-project/lldb/source/Commands/CommandObjectExpression.cpp:414 #16 0x0000000001ad86ae in DoExecute () at /usr/src/contrib/llvm-project/lldb/source/Commands/CommandObjectExpression.cpp:646 #17 0x0000000001a5e3ed in Execute () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandObject.cpp:1003 #18 0x0000000001a6c4a3 in HandleCommand () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:1762 #19 0x0000000001a6f98c in IOHandlerInputComplete () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:2760 #20 0x0000000001a90b08 in Run () at /usr/src/contrib/llvm-project/lldb/source/Core/IOHandler.cpp:548 #21 0x00000000019a6c6a in ExecuteIOHandlers () at /usr/src/contrib/llvm-project/lldb/source/Core/Debugger.cpp:903 #22 0x0000000001a70337 in RunCommandInterpreter () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:2946 #23 0x0000000001d9d812 in RunCommandInterpreter () at /usr/src/contrib/llvm-project/lldb/source/API/SBDebugger.cpp:1169 #24 0x0000000001918be8 in MainLoop () at /usr/src/contrib/llvm-project/lldb/tools/driver/Driver.cpp:675 #25 0x000000000191a114 in main () at /usr/src/contrib/llvm-project/lldb/tools/driver/Driver.cpp:890 Fix the incorrect error catch by only instantiating an Error object if it is necessary. Reviewed By: JDevlieghere Differential Revision: https://reviews.llvm.org/D86355 This should fix lldb aborting as described in the scenario above. Reported by: dmgk PR: 248745
1 parent a6a496c commit eb41eed

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

contrib/llvm-project/lldb/source/Target/Target.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2412,21 +2412,13 @@ lldb::addr_t Target::GetPersistentSymbol(ConstString name) {
24122412

24132413
llvm::Expected<lldb_private::Address> Target::GetEntryPointAddress() {
24142414
Module *exe_module = GetExecutableModulePointer();
2415-
llvm::Error error = llvm::Error::success();
2416-
assert(!error); // Check the success value when assertions are enabled.
24172415

2418-
if (!exe_module || !exe_module->GetObjectFile()) {
2419-
error = llvm::make_error<llvm::StringError>("No primary executable found",
2420-
llvm::inconvertibleErrorCode());
2421-
} else {
2416+
// Try to find the entry point address in the primary executable.
2417+
const bool has_primary_executable = exe_module && exe_module->GetObjectFile();
2418+
if (has_primary_executable) {
24222419
Address entry_addr = exe_module->GetObjectFile()->GetEntryPointAddress();
24232420
if (entry_addr.IsValid())
24242421
return entry_addr;
2425-
2426-
error = llvm::make_error<llvm::StringError>(
2427-
"Could not find entry point address for executable module \"" +
2428-
exe_module->GetFileSpec().GetFilename().GetStringRef() + "\"",
2429-
llvm::inconvertibleErrorCode());
24302422
}
24312423

24322424
const ModuleList &modules = GetImages();
@@ -2437,14 +2429,21 @@ llvm::Expected<lldb_private::Address> Target::GetEntryPointAddress() {
24372429
continue;
24382430

24392431
Address entry_addr = module_sp->GetObjectFile()->GetEntryPointAddress();
2440-
if (entry_addr.IsValid()) {
2441-
// Discard the error.
2442-
llvm::consumeError(std::move(error));
2432+
if (entry_addr.IsValid())
24432433
return entry_addr;
2444-
}
24452434
}
24462435

2447-
return std::move(error);
2436+
// We haven't found the entry point address. Return an appropriate error.
2437+
if (!has_primary_executable)
2438+
return llvm::make_error<llvm::StringError>(
2439+
"No primary executable found and could not find entry point address in "
2440+
"any executable module",
2441+
llvm::inconvertibleErrorCode());
2442+
2443+
return llvm::make_error<llvm::StringError>(
2444+
"Could not find entry point address for primary executable module \"" +
2445+
exe_module->GetFileSpec().GetFilename().GetStringRef() + "\"",
2446+
llvm::inconvertibleErrorCode());
24482447
}
24492448

24502449
lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr,

0 commit comments

Comments
 (0)