1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 11:42:21 +00:00

Restore build without __sync_fetch_and_{add,sub} (re: 07cc71b8)

The more I think about it, the more it seems obvious that commit
07cc71b8 (PR #14) is quite simply a workaround for a GCC optimiser
bug, and (who knows?) possibly an old, long-fixed one, as the bug
report is years old.

The commit also caused ksh to fail to build on HP-UX B.11.11 with
GCC 4.2.3 (hosted at polarhome.com), because it doesn't have
__sync_fetch_and_add() and __sync_fetch_and_sub(). It may fail on
other systems. The GCC documentation says these are legacy:
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fsync-Builtins.html

HELP WANTED: what I would like best is if someone could come up
with some way of detecting this optimiser bug and then error out
with a message along the lines of "please upgrade your broken
compiler". It would probably need to be a new iffe test.

Meanwhile, let's try it this way for a while and see what happens:

src/cmd/ksh93/include/jobs.h:
- Restore original ksh version of job_lock()/job_unlock() macros.
- Use the workaround version only if the compiler has the builtins
  __sync_fetch_and_add() and __sync_fetch_and_sub().
This commit is contained in:
Martijn Dekker 2020-06-14 23:49:07 +02:00
parent f95d3105ef
commit 58560db768
2 changed files with 26 additions and 2 deletions

2
TODO
View file

@ -9,7 +9,7 @@ Fix regression test failures:
______
Fix build system:
- ksh does not currently build on NetBSD, AIX, HP-UX, Solaris, or QNX.
- ksh does not currently build on NetBSD, AIX, Solaris, or QNX.
- Reimport the removed nmake. It is necessary for changes in Makefiles
to take effect. The machine-generated Mamfiles are now used as a fallback,
but they are not meant to be edited by hand.

View file

@ -149,9 +149,17 @@ extern struct jobs job;
#define vmbusy() 0
#endif
/*
* Job locking and unlocking macros
*/
#if defined(__sync_fetch_and_add) && defined(__sync_fetch_and_sub)
/*
* This version may prevent segfaults due to a GCC optimizer bug.
* See: https://bugzilla.redhat.com/show_bug.cgi?id=1112306
* https://bugs.launchpad.net/ubuntu/+source/ksh/+bug/1697501
*/
#define asoincint(p) __sync_fetch_and_add(p,1)
#define asodecint(p) __sync_fetch_and_sub(p,1)
#define job_lock() asoincint(&job.in_critical)
#define job_unlock() \
do { \
@ -163,6 +171,22 @@ extern struct jobs job;
asodecint(&job.in_critical); \
} \
} while(0)
#else
/*
* Original ksh93 version.
*/
#define job_lock() (job.in_critical++)
#define job_unlock() \
do { \
int sig; \
if (!--job.in_critical && (sig = job.savesig)) \
{ \
if (!job.in_critical++ && !vmbusy()) \
job_reap(sig); \
job.in_critical--; \
} \
} while(0)
#endif /* defined(__sync_fetch_and_add) && defined(__sync_fetch_and_sub) */
extern const char e_jobusage[];
extern const char e_done[];