[Lldb-commits] [lldb] r243748 - Report original thread ID for FreeBSD core files

Ed Maste emaste at freebsd.org
Fri Jul 31 07:24:33 PDT 2015


Author: emaste
Date: Fri Jul 31 09:24:32 2015
New Revision: 243748

URL: http://llvm.org/viewvc/llvm-project?rev=243748&view=rev
Log:
Report original thread ID for FreeBSD core files

On FreeBSD the tid is (somewhat unintuitively) found in the pr_pid
field of the NT_PRSTATUS note. Collect it when parsing the note and
store it in the thread data.

For Linux I've left the original behaviour of using sequential TIDs
(0, 1, 2...) as I don't yet have code to obtain it.

Differential Revision:	http://reviews.llvm.org/D11652

Modified:
    lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp
    lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
    lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h

Modified: lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp?rev=243748&r1=243747&r2=243748&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp Fri Jul 31 09:24:32 2015
@@ -258,7 +258,7 @@ ProcessElfCore::UpdateThreadList (Thread
     for (lldb::tid_t tid = 0; tid < num_threads; ++tid)
     {
         const ThreadData &td = m_thread_data[tid];
-        lldb::ThreadSP thread_sp(new ThreadElfCore (*this, tid, td));
+        lldb::ThreadSP thread_sp(new ThreadElfCore (*this, td));
         new_thread_list.AddThread (thread_sp);
     }
     return new_thread_list.GetSize(false) > 0;
@@ -429,7 +429,7 @@ ParseFreeBSDPrStatus(ThreadData &thread_
         offset += 16;
 
     thread_data.signo = data.GetU32(&offset); // pr_cursig
-    offset += 4;        // pr_pid
+    thread_data.tid = data.GetU32(&offset); // pr_pid
     if (lp64)
         offset += 4;
 
@@ -543,6 +543,8 @@ ProcessElfCore::ParseThreadContextsFromN
                     header_size = ELFLinuxPrStatus::GetSize(arch);
                     len = note_data.GetByteSize() - header_size;
                     thread_data->gpregset = DataExtractor(note_data, header_size, len);
+                    // FIXME: Obtain actual tid on Linux
+                    thread_data->tid = m_thread_data.size();
                     break;
                 case NT_FPREGSET:
                     thread_data->fpregset = note_data;

Modified: lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp?rev=243748&r1=243747&r2=243748&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp Fri Jul 31 09:24:32 2015
@@ -37,9 +37,8 @@ using namespace lldb_private;
 //----------------------------------------------------------------------
 // Construct a Thread object with given data
 //----------------------------------------------------------------------
-ThreadElfCore::ThreadElfCore (Process &process, tid_t tid,
-                              const ThreadData &td) :
-    Thread(process, tid),
+ThreadElfCore::ThreadElfCore (Process &process, const ThreadData &td) :
+    Thread(process, td.tid),
     m_thread_name(td.name),
     m_thread_reg_ctx_sp (),
     m_signo(td.signo),

Modified: lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h?rev=243748&r1=243747&r2=243748&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h Fri Jul 31 09:24:32 2015
@@ -112,6 +112,7 @@ struct ThreadData
     lldb_private::DataExtractor gpregset;
     lldb_private::DataExtractor fpregset;
     lldb_private::DataExtractor vregset;
+    lldb::tid_t tid;
     int signo;
     std::string name;
 };
@@ -119,8 +120,7 @@ struct ThreadData
 class ThreadElfCore : public lldb_private::Thread
 {
 public:
-    ThreadElfCore (lldb_private::Process &process, lldb::tid_t tid,
-                   const ThreadData &td);
+    ThreadElfCore (lldb_private::Process &process, const ThreadData &td);
 
     virtual
     ~ThreadElfCore ();





More information about the lldb-commits mailing list