[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-commits-all
Subject:    svn commit: r367228 - in stable: 11/contrib/llvm-project/lldb/source/Target
From:       Dimitry Andric <dim () FreeBSD ! org>
Date:       2020-10-31 18:42:04
Message-ID: 202010311842.09VIg4pw023142 () repo ! freebsd ! org
[Download RAW message or body]

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):
  
    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/11/contrib/llvm-project/lldb/source/Target/Target.cpp
Directory Properties:
  stable/11/   (props changed)
  stable/11/contrib/llvm-project/lldb/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/12/contrib/llvm-project/lldb/source/Target/Target.cpp
Directory Properties:
  stable/12/   (props changed)

Modified: stable/11/contrib/llvm-project/lldb/source/Target/Target.cpp
==============================================================================
--- stable/11/contrib/llvm-project/lldb/source/Target/Target.cpp	Sat Oct 31 17:26:56 \
                2020	(r367227)
+++ stable/11/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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic