Avoid short i386 register names on Solaris/x86 [PR25981]
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Mon, 18 May 2020 15:59:43 +0000 (17:59 +0200)
committerRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Mon, 18 May 2020 15:59:43 +0000 (17:59 +0200)
This is the 32-bit companion to

Remove unused ps_lgetLDT etc. on Solaris/x86 [PR25981]
        https://sourceware.org/pipermail/gdb-patches/2020-May/168713.html

A 32-bit-default gdb fails to compile with the updated <sys/regset.h>.
While it is also affected by the lack of a GS definition, which the
compantion patch above fixes, it also fails to compile i386-sol2-nat.c like
this

/vol/src/gnu/gdb/hg/master/git/gdb/i386-sol2-nat.c:181:3: error: 'EAX' was not declared in this scope
  181 |   EAX, ECX, EDX, EBX,
      |   ^~~

and several more.

While this could be fixed by either including <ucontext.h> here or
provding fallback definitions of the register macros, I chose to do what
the 64-bit-default code in the same file
(amd64_sol2_gregset32_reg_offset[]) does, namely just hardcode the
numeric values instead.  They are part of the ABI and thus guaranteed
not to change.

With this patch, a i386-pc-solaris2.11 configuration on master compiles
again, however, it doesn't work.  However, I could successfully test it
on the gdb-9 branch.

Compiling and testing proved to be messy, unfortunately:

* For one, Solaris <sys/procfs.h> and largefile support used to be
  mutually exclusive (fixed in Solaris 11.4 and Illumos), which was
  exacerbated by the fact that g++ predefines _FILE_OFFSET_BITS=64 since
  GCC 9.1.0.  For now I've worked around this by adding
  -U_FILE_OFFSET_BITS to CXXFLAGS and configuring with
  --disable-largefile.  I hope to clean this up in a future patch.

* gdb still defaults to startup-with-shell on.  However, /bin/bash is a
  64-bit executable which cannot be debugged by a 32-bit gdb.  I hacked
  around that part by pointing $SHELL at a 32-bit bash before running
  make check.

PR build/25981
* i386-sol2-nat.c [PR_MODEL_NATIVE != PR_MODEL_LP64] (regmap):
Hardcode register numbers.

gdb/ChangeLog
gdb/i386-sol2-nat.c

index cba0464770c419cd41317607d60bf802fe7abec6..cc13e41c6498f90ea5ae9a77caf6bb8f25e50303 100644 (file)
@@ -1,5 +1,9 @@
 2020-05-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
+       PR build/25981
+       * i386-sol2-nat.c [PR_MODEL_NATIVE != PR_MODEL_LP64] (regmap):
+       Hardcode register numbers.
+
        PR build/25981
        * procfs.c [(__i386__ || __x86_64__) && sun] (proc_get_LDT_entry,
        procfs_find_LDT_entry): Remove.
index f54b3b109e8d910fec445b543b2ed2674dbcbf94..054d2ec81b6a5da9903107ff1bc756f37948b876 100644 (file)
@@ -178,10 +178,22 @@ fill_fpregset (const struct regcache *regcache,
    format and GDB's register array layout.  */
 static int regmap[] =
 {
-  EAX, ECX, EDX, EBX,
-  UESP, EBP, ESI, EDI,
-  EIP, EFL, CS, SS,
-  DS, ES, FS, GS
+  11   /* EAX */,
+  10   /* ECX */,
+  9    /* EDX */,
+  8    /* EBX */,
+  17   /* UESP */,
+  6    /* EBP */,
+  5    /* ESI */,
+  4    /* EDI */,
+  14   /* EIP */,
+  16   /* EFL */,
+  15   /* CS */,
+  18   /* SS */,
+  3    /* DS */,
+  2    /* ES */,
+  1    /* FS */,
+  0    /* GS */
 };
 
 /* Fill GDB's register array with the general-purpose register values