[Lldb-commits] [lldb] r183313 - Use std::vector for the array of RegisterInfo structs that describe the register context.

Ashok Thirumurthi ashok.thirumurthi at intel.com
Wed Jun 5 07:12:43 PDT 2013


Author: athirumu
Date: Wed Jun  5 09:12:43 2013
New Revision: 183313

URL: http://llvm.org/viewvc/llvm-project?rev=183313&view=rev
Log:
Use std::vector for the array of RegisterInfo structs that describe the register context.
- Ensures that this container is populated once for the lifetime of lldb
--- In particular, static methods can query this data even after the first RegisterContext has been destroyed.
- Uses a singleton function to avoid global constructors.

Thanks to Greg Clayton for the suggestion!

Modified:
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp?rev=183313&r1=183312&r2=183313&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp Wed Jun  5 09:12:43 2013
@@ -8,6 +8,7 @@
 //===---------------------------------------------------------------------===//
 
 #include "RegisterContextFreeBSD_x86_64.h"
+#include <vector>
 
 using namespace lldb_private;
 
@@ -18,13 +19,13 @@ using namespace lldb_private;
 // Update the FreeBSD specific information (offset and size).
 #define UPDATE_GPR_INFO(reg)                                                \
 do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
+    GetRegisterContext()[gpr_##reg].byte_size = sizeof(GPR::reg);               \
+    GetRegisterContext()[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
 } while(false);
 
 #define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
 do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
+    GetRegisterContext()[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
 } while(false);
 
 typedef struct _GPR
@@ -57,20 +58,18 @@ typedef struct _GPR
     uint64_t ss;
 } GPR;
 
-RegisterInfo *RegisterContextFreeBSD_x86_64::m_register_infos = nullptr;
+// Use a singleton function to avoid global constructors in shared libraries.
+static std::vector<RegisterInfo> & GetRegisterContext () {
+    static std::vector<RegisterInfo> g_register_infos;
+    return g_register_infos;
+}
+
 
 RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(Thread &thread, uint32_t concrete_frame_idx):
     RegisterContext_x86_64(thread, concrete_frame_idx)
 {
 }
 
-RegisterContextFreeBSD_x86_64::~RegisterContextFreeBSD_x86_64()
-{
-    if (m_register_infos)
-        delete m_register_infos;
-    m_register_infos = nullptr;
-}
-
 size_t
 RegisterContextFreeBSD_x86_64::GetGPRSize()
 {
@@ -81,19 +80,18 @@ const RegisterInfo *
 RegisterContextFreeBSD_x86_64::GetRegisterInfo()
 {
     // Allocate RegisterInfo only once
-    if (!m_register_infos)
+    if (GetRegisterContext().empty())
     {
-        m_register_infos = new RegisterInfo[k_num_registers];
         // Copy the register information from base class
-        if (m_register_infos)
+        const RegisterInfo *base_info = RegisterContext_x86_64::GetRegisterInfo();
+        if (base_info)
         {
-            memcpy(m_register_infos, RegisterContext_x86_64::GetRegisterInfo(),
-                   sizeof(RegisterInfo) * k_num_registers);
-            // Update the Linux specific register information (offset and size).
+            GetRegisterContext().insert(GetRegisterContext().end(), &base_info[0], &base_info[k_num_registers]);
+            // Update the FreeBSD specific register information (offset and size).
             UpdateRegisterInfo();
         }
     }
-    return m_register_infos;
+    return &GetRegisterContext()[0];
 }
 
 void

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h?rev=183313&r1=183312&r2=183313&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h Wed Jun  5 09:12:43 2013
@@ -17,7 +17,6 @@ class RegisterContextFreeBSD_x86_64:
 {
 public:
     RegisterContextFreeBSD_x86_64(lldb_private::Thread &thread, uint32_t concrete_frame_idx);
-    virtual ~RegisterContextFreeBSD_x86_64();
 
     size_t
     GetGPRSize();
@@ -28,9 +27,6 @@ protected:
 
     virtual void
     UpdateRegisterInfo();
-
-private:
-    static lldb_private::RegisterInfo *m_register_infos;
 };
 
 #endif

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp?rev=183313&r1=183312&r2=183313&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp Wed Jun  5 09:12:43 2013
@@ -8,6 +8,7 @@
 //===---------------------------------------------------------------------===//
 
 #include "RegisterContextLinux_x86_64.h"
+#include <vector>
 
 using namespace lldb_private;
 
@@ -18,13 +19,13 @@ using namespace lldb_private;
 // Update the Linux specific information (offset and size).
 #define UPDATE_GPR_INFO(reg)                                                \
 do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
+    GetRegisterContext()[gpr_##reg].byte_size = sizeof(GPR::reg);               \
+    GetRegisterContext()[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
 } while(false);
 
 #define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
 do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
+    GetRegisterContext()[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
 } while(false);
 
 #define DR_OFFSET(reg_index)                                                \
@@ -32,8 +33,8 @@ do {
 
 #define UPDATE_DR_INFO(reg_index)                                                \
 do {                                                                             \
-    m_register_infos[dr##reg_index].byte_size = sizeof(UserArea::u_debugreg[0]); \
-    m_register_infos[dr##reg_index].byte_offset = DR_OFFSET(reg_index);          \
+    GetRegisterContext()[dr##reg_index].byte_size = sizeof(UserArea::u_debugreg[0]); \
+    GetRegisterContext()[dr##reg_index].byte_offset = DR_OFFSET(reg_index);          \
 } while(false);
 
 typedef struct _GPR
@@ -92,20 +93,17 @@ struct UserArea
     uint64_t fault_address; // Control register CR3.
 };
 
-RegisterInfo *RegisterContextLinux_x86_64::m_register_infos = nullptr;
+// Use a singleton function to avoid global constructors in shared libraries.
+static std::vector<RegisterInfo> & GetRegisterContext () {
+    static std::vector<RegisterInfo> g_register_infos;
+    return g_register_infos;
+}
 
 RegisterContextLinux_x86_64::RegisterContextLinux_x86_64(Thread &thread, uint32_t concrete_frame_idx):
     RegisterContext_x86_64(thread, concrete_frame_idx)
 {
 }
 
-RegisterContextLinux_x86_64::~RegisterContextLinux_x86_64()
-{
-    if (m_register_infos)
-        delete [] m_register_infos;
-    m_register_infos = nullptr;
-}
-
 size_t
 RegisterContextLinux_x86_64::GetGPRSize()
 {
@@ -116,19 +114,18 @@ const RegisterInfo *
 RegisterContextLinux_x86_64::GetRegisterInfo()
 {
     // Allocate RegisterInfo only once
-    if (!m_register_infos)
+    if (GetRegisterContext().empty())
     {
-        m_register_infos = new RegisterInfo[k_num_registers];
         // Copy the register information from base class
-        if (m_register_infos)
+        const RegisterInfo *base_info = RegisterContext_x86_64::GetRegisterInfo();
+        if (base_info)
         {
-            memcpy(m_register_infos, RegisterContext_x86_64::GetRegisterInfo(),
-                   sizeof(RegisterInfo) * k_num_registers);
+            GetRegisterContext().insert(GetRegisterContext().end(), &base_info[0], &base_info[k_num_registers]);
             // Update the Linux specific register information (offset and size).
             UpdateRegisterInfo();
         }
     }
-    return m_register_infos;
+    return &GetRegisterContext()[0];
 }
 
 void

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h?rev=183313&r1=183312&r2=183313&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h Wed Jun  5 09:12:43 2013
@@ -17,7 +17,6 @@ class RegisterContextLinux_x86_64:
 {
 public:
     RegisterContextLinux_x86_64(lldb_private::Thread &thread, uint32_t concrete_frame_idx);
-    virtual ~RegisterContextLinux_x86_64();
 
     size_t
     GetGPRSize();
@@ -28,9 +27,6 @@ protected:
 
     virtual void
     UpdateRegisterInfo();
-
-private:
-    static lldb_private::RegisterInfo *m_register_infos;
 };
 
 #endif





More information about the lldb-commits mailing list