dvlahovski updated this revision to Diff 64902.
dvlahovski added a comment.

Forgot to add alignas to two members of prstatus


https://reviews.llvm.org/D22628

Files:
  source/Plugins/Process/elf-core/ThreadElfCore.cpp
  source/Plugins/Process/elf-core/ThreadElfCore.h

Index: source/Plugins/Process/elf-core/ThreadElfCore.h
===================================================================
--- source/Plugins/Process/elf-core/ThreadElfCore.h
+++ source/Plugins/Process/elf-core/ThreadElfCore.h
@@ -21,42 +21,38 @@
 
 struct compat_timeval
 {
-    int64_t tv_sec;
-    int32_t tv_usec;
+    alignas(8) uint64_t tv_sec;
+    alignas(8) uint64_t tv_usec;
 };
 
 // PRSTATUS structure's size differs based on architecture.
 // Currently parsing done only for x86-64 architecture by
 // simply reading data from the buffer.
-// The following macros are used to specify the size.
-// Calculating size using sizeof() wont work because of padding.
-#define ELFLINUXPRSTATUS64_SIZE (112)
-#define ELFLINUXPRPSINFO64_SIZE (132)
 
 #undef si_signo
 #undef si_code
 #undef si_errno
 
 struct ELFLinuxPrStatus
 {
-    int32_t         si_signo;
-    int32_t         si_code;
-    int32_t         si_errno;
+    int32_t si_signo;
+    int32_t si_code;
+    int32_t si_errno;
 
-    int16_t         pr_cursig;
+    int16_t pr_cursig;
 
-    uint64_t        pr_sigpend;
-    uint64_t        pr_sighold;
+    alignas(8) uint64_t pr_sigpend;
+    alignas(8) uint64_t pr_sighold;
 
-    uint32_t        pr_pid;
-    uint32_t        pr_ppid;
-    uint32_t        pr_pgrp;
-    uint32_t        pr_sid;
+    uint32_t pr_pid;
+    uint32_t pr_ppid;
+    uint32_t pr_pgrp;
+    uint32_t pr_sid;
 
-    compat_timeval  pr_utime;
-    compat_timeval  pr_stime;
-    compat_timeval  pr_cutime;
-    compat_timeval  pr_cstime;
+    compat_timeval pr_utime;
+    compat_timeval pr_stime;
+    compat_timeval pr_cutime;
+    compat_timeval pr_cstime;
 
     ELFLinuxPrStatus();
 
@@ -70,28 +66,30 @@
         {
             case lldb_private::ArchSpec::eCore_s390x_generic:
             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
-                return ELFLINUXPRSTATUS64_SIZE;
+                return sizeof(ELFLinuxPrStatus);
             default:
                 return 0;
         }
     }
 };
 
+static_assert(sizeof(ELFLinuxPrStatus) == 112, "sizeof ELFLinuxPrStatus is not correct!");
+
 struct ELFLinuxPrPsInfo
 {
-    char        pr_state;
-    char        pr_sname;
-    char        pr_zomb;
-    char        pr_nice;
-    uint64_t    pr_flag;
-    uint32_t    pr_uid;
-    uint32_t    pr_gid;
-    int32_t     pr_pid;
-    int32_t     pr_ppid;
-    int32_t     pr_pgrp;
-    int32_t     pr_sid;
-    char        pr_fname[16];
-    char        pr_psargs[80];
+    char pr_state;
+    char pr_sname;
+    char pr_zomb;
+    char pr_nice;
+    alignas(8) uint64_t pr_flag;
+    uint32_t pr_uid;
+    uint32_t pr_gid;
+    int32_t pr_pid;
+    int32_t pr_ppid;
+    int32_t pr_pgrp;
+    int32_t pr_sid;
+    char pr_fname[16];
+    char pr_psargs[80];
 
     ELFLinuxPrPsInfo();
 
@@ -105,13 +103,15 @@
         {
             case lldb_private::ArchSpec::eCore_s390x_generic:
             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
-                return ELFLINUXPRPSINFO64_SIZE;
+                return sizeof(ELFLinuxPrPsInfo);
             default:
                 return 0;
         }
     }
 };
 
+static_assert(sizeof(ELFLinuxPrPsInfo) == 136, "sizeof ELFLinuxPrPsInfo is not correct!");
+
 struct ThreadData
 {
     lldb_private::DataExtractor gpregset;
Index: source/Plugins/Process/elf-core/ThreadElfCore.cpp
===================================================================
--- source/Plugins/Process/elf-core/ThreadElfCore.cpp
+++ source/Plugins/Process/elf-core/ThreadElfCore.cpp
@@ -228,8 +228,8 @@
     {
         case ArchSpec::eCore_s390x_generic:
         case ArchSpec::eCore_x86_64_x86_64:
-            len = data.ExtractBytes(0, ELFLINUXPRSTATUS64_SIZE, byteorder, this);
-            return len == ELFLINUXPRSTATUS64_SIZE;
+            len = data.ExtractBytes(0, sizeof(ELFLinuxPrStatus), byteorder, this);
+            return len == sizeof(ELFLinuxPrStatus);
         default:
             return false;
     }
@@ -252,8 +252,8 @@
     {
         case ArchSpec::eCore_s390x_generic:
         case ArchSpec::eCore_x86_64_x86_64:
-            len = data.ExtractBytes(0, ELFLINUXPRPSINFO64_SIZE, byteorder, this);
-            return len == ELFLINUXPRPSINFO64_SIZE;
+            len = data.ExtractBytes(0, sizeof(ELFLinuxPrPsInfo), byteorder, this);
+            return len == sizeof(ELFLinuxPrPsInfo);
         default:
             return false;
     }
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to