Use public fpregset_t type to define fpstate_t

The _libc_fpstate struct tag is an implementation detail of glibc,
and musl uses a different struct tag, _fpstate.

Unfortunately, the public type fpregset_t is a pointer type, so is
not suitable for allocating storage, or referring to constant
storage. Instead, we can use std::remove_pointer<fpregset_t>::type
to refer to the pointed-to type, regardless of the struct tag.

Bug: google-breakpad:631
Change-Id: Iaf47f15b2d834dd8de839431f65a481e9b0c7f9e
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/2096171
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/src/client/linux/dump_writer_common/ucontext_reader.cc b/src/client/linux/dump_writer_common/ucontext_reader.cc
index 6ee6cc1..ee515c4 100644
--- a/src/client/linux/dump_writer_common/ucontext_reader.cc
+++ b/src/client/linux/dump_writer_common/ucontext_reader.cc
@@ -49,7 +49,7 @@
 }
 
 void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                                    const struct _libc_fpstate* fp) {
+                                    const fpstate_t* fp) {
   const greg_t* regs = uc->uc_mcontext.gregs;
 
   out->context_flags = MD_CONTEXT_X86_FULL |
@@ -97,7 +97,7 @@
 }
 
 void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                                    const struct _libc_fpstate* fpregs) {
+                                    const fpstate_t* fpregs) {
   const greg_t* regs = uc->uc_mcontext.gregs;
 
   out->context_flags = MD_CONTEXT_AMD64_FULL;
diff --git a/src/client/linux/dump_writer_common/ucontext_reader.h b/src/client/linux/dump_writer_common/ucontext_reader.h
index f830618..8e74a8a 100644
--- a/src/client/linux/dump_writer_common/ucontext_reader.h
+++ b/src/client/linux/dump_writer_common/ucontext_reader.h
@@ -34,6 +34,7 @@
 #include <sys/user.h>
 
 #include "client/linux/dump_writer_common/raw_context_cpu.h"
+#include "client/linux/minidump_writer/minidump_writer.h"
 #include "common/memory_allocator.h"
 #include "google_breakpad/common/minidump_format.h"
 
@@ -50,7 +51,7 @@
   //   info: the collection of register structures.
 #if defined(__i386__) || defined(__x86_64)
   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                             const struct _libc_fpstate* fp);
+                             const fpstate_t* fp);
 #elif defined(__aarch64__)
   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
                              const struct fpsimd_context* fpregs);
diff --git a/src/client/linux/minidump_writer/minidump_writer.h b/src/client/linux/minidump_writer/minidump_writer.h
index d1dc331..e3b0b16 100644
--- a/src/client/linux/minidump_writer/minidump_writer.h
+++ b/src/client/linux/minidump_writer/minidump_writer.h
@@ -36,6 +36,7 @@
 #include <unistd.h>
 
 #include <list>
+#include <type_traits>
 #include <utility>
 
 #include "client/linux/minidump_writer/linux_dumper.h"
@@ -48,7 +49,7 @@
 #if defined(__aarch64__)
 typedef struct fpsimd_context fpstate_t;
 #elif !defined(__ARM_EABI__) && !defined(__mips__)
-typedef struct _libc_fpstate fpstate_t;
+typedef std::remove_pointer<fpregset_t>::type fpstate_t;
 #endif
 
 // These entries store a list of memory regions that the client wants included