Date: Sat, 31 Oct 2020 11:59:20 -0700 (PDT) From: "Rodney W. Grimes" <freebsd@gndrsh.dnsmgr.net> To: Dimitry Andric <dim@freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: Re: svn commit: r367228 - in stable: 11/contrib/llvm-project/lldb/source/Target 12/contrib/llvm-project/lldb/source/Target Message-ID: <202010311859.09VIxKjM006518@gndrsh.dnsmgr.net> In-Reply-To: <202010311842.09VIg41m023136@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> Author: dim > Date: Sat Oct 31 18:42:03 2020 > New Revision: 367228 > URL: https://svnweb.freebsd.org/changeset/base/367228 > > Log: > MFC r364480: > > Merge commit 1ce07cd614be from llvm git (by me): ^^^^^^^ FYI, we have a username me so this is not the best way to express yourself in commit mail: freefall:rgrimes {102} grep ^me: /etc/passwd me:*:589:589:Michael Elbel:/home/me:/usr/local/bin/bash > > 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 > > Modified: > stable/12/contrib/llvm-project/lldb/source/Target/Target.cpp > Directory Properties: > stable/12/ (props changed) > > Changes in other areas also in this revision: > Modified: > stable/11/contrib/llvm-project/lldb/source/Target/Target.cpp > Directory Properties: > stable/11/ (props changed) > stable/11/contrib/llvm-project/lldb/ (props changed) > > Modified: stable/12/contrib/llvm-project/lldb/source/Target/Target.cpp > ============================================================================== > --- stable/12/contrib/llvm-project/lldb/source/Target/Target.cpp Sat Oct 31 17:26:56 2020 (r367227) > +++ stable/12/contrib/llvm-project/lldb/source/Target/Target.cpp Sat Oct 31 18:42:03 2020 (r367228) > @@ -2412,21 +2412,13 @@ lldb::addr_t Target::GetPersistentSymbol(ConstString n > > llvm::Expected<lldb_private::Address> Target::GetEntryPointAddress() { > Module *exe_module = GetExecutableModulePointer(); > - llvm::Error error = llvm::Error::success(); > - assert(!error); // Check the success value when assertions are enabled. > > - if (!exe_module || !exe_module->GetObjectFile()) { > - error = llvm::make_error<llvm::StringError>("No primary executable found", > - llvm::inconvertibleErrorCode()); > - } else { > + // Try to find the entry point address in the primary executable. > + const bool has_primary_executable = exe_module && exe_module->GetObjectFile(); > + if (has_primary_executable) { > Address entry_addr = exe_module->GetObjectFile()->GetEntryPointAddress(); > if (entry_addr.IsValid()) > return entry_addr; > - > - error = llvm::make_error<llvm::StringError>( > - "Could not find entry point address for executable module \"" + > - exe_module->GetFileSpec().GetFilename().GetStringRef() + "\"", > - llvm::inconvertibleErrorCode()); > } > > const ModuleList &modules = GetImages(); > @@ -2437,14 +2429,21 @@ llvm::Expected<lldb_private::Address> Target::GetEntry > continue; > > Address entry_addr = module_sp->GetObjectFile()->GetEntryPointAddress(); > - if (entry_addr.IsValid()) { > - // Discard the error. > - llvm::consumeError(std::move(error)); > + if (entry_addr.IsValid()) > return entry_addr; > - } > } > > - return std::move(error); > + // We haven't found the entry point address. Return an appropriate error. > + if (!has_primary_executable) > + return llvm::make_error<llvm::StringError>( > + "No primary executable found and could not find entry point address in " > + "any executable module", > + llvm::inconvertibleErrorCode()); > + > + return llvm::make_error<llvm::StringError>( > + "Could not find entry point address for primary executable module \"" + > + exe_module->GetFileSpec().GetFilename().GetStringRef() + "\"", > + llvm::inconvertibleErrorCode()); > } > > lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr, > -- Rod Grimes rgrimes@freebsd.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010311859.09VIxKjM006518>