On 11/02/2014 11:07 PM, Alan Modra wrote:
Really, it's a fiction that the size argument of obstack_blank_fast has a type.
Yes and no. It's a fiction in the sense that obstack_blank_fast is a macro, so
its argument doesn't actually have a C type. But it's not a fiction in the
sense that obstack_blank_fast can be documented as if it were a function, and if
a program calls it with valid arguments that a function would have, it behaves
like that function.
In this sense, obstack_blank_fast is like putchar. Although putchar is a macro
and strictly speaking its argument doesn't have a C type, it is documented to
take a value of type int, and if you call it according to its specification it
behaves properly.
I've added: "Earlier versions of obstacks allowed you to use
@code{obstack_blank} to shrink objects. This will no longer work."
But this doesn't suffice for obstack_blank_stack, which *can* shrink objects and
where user code relies on this feature. E.g., the following code (taken from
GCC's finish_regexp_representation) should work if the current object size fits
into 'int', and should continue to work if we change its 'int' to 'size_t' and
allocate objects larger than what 'int' can represent:
int length = obstack_object_size (&irp);
obstack_blank_fast (&irp, -length);
There another gnulib issue too. AC_FUNC_OBSTACK is no longer correct. The
system libc may support obstacks, but not the current version. It seems to me
the easiest solution is to always include obstack.o in libgnu.a.
Thanks, I wrote a "harder" solution, which builds obstack.o only if the system
version doesn't work with arbitrary size_t values. This is always true now but
won't be once these fixes make their way into glibc.
Ianother small tweak: Don't use alignof.h if __IBM__ALIGNOF__ is defined
(alignof.h just uses __alignof__ in that case), or when __alignof__ is defined
(for oddball systems, or testing).
I'd rather insulate obstack from that internal detail of alignof. I gave a shot
at doing this in a different way, which preserves the insulation better.
A couple more things. obstack_chunkfun and obstack_freefun should also return
void. And the code should avoid casting function values from one calling
convention to another: this sort-of-works with the old API on glibc's current
platforms but is likely to cause problems with the transition to the new one.
I installed the attached patches to gnulib to try to implement the above; please
let me know of any issues.
From 3d99d9fb66ceea0f93a6cfeb496f0471efa212d3 Mon Sep 17 00:00:00 2001
From: Paul Eggert
Date: Mon, 3 Nov 2014 16:34:52 -0800
Subject: [PATCH 1/4] obstack: port to platforms that #define __alignof__
* lib/obstack.c: Include if !defined __alignof__,
not if !_LIBC. We don't know of any platforms that #define
__alignof__, but it might be useful in tests. Conversely,
glibc assumes GCC.
---
ChangeLog | 8
lib/obstack.c | 5 -
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/ChangeLog b/ChangeLog
index 6728893..274b794 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-11-03 Paul Eggert
+
+ obstack: port to platforms that #define __alignof__
+ * lib/obstack.c: Include if !defined __alignof__,
+ not if !_LIBC. We don't know of any platforms that #define
+ __alignof__, but it might be useful in tests. Conversely,
+ glibc assumes GCC.
+
2014-11-03 Pádraig Brady
linkat: don't unconditionally replace on GNU/Linux
diff --git a/lib/obstack.c b/lib/obstack.c
index ba7dff3..d763c57 100644
--- a/lib/obstack.c
+++ b/lib/obstack.c
@@ -48,7 +48,10 @@
#endif
#ifndef _OBSTACK_ELIDE_CODE
-# if !defined _LIBC && !defined __GNUC__
+/* If GCC, or if an oddball (testing?) host that #defines __alignof__,
+ use the already-supplied __alignof__. Otherwise, this must be Gnulib
+ (as glibc assumes GCC); defer to Gnulib's alignof_type. */
+# if !defined __GNUC__ && !defined __alignof__
# include
# define __alignof__(type) alignof_type (type)
# endif
--
1.9.3
From 035a186cc20f21354720c51cc303b6c0d6017c5f Mon Sep 17 00:00:00 2001
From: Paul Eggert
Date: Mon, 3 Nov 2014 16:36:27 -0800
Subject: [PATCH 2/4] obstack: do not assume system-supplied obstack is size_t
safe
* m4/obstack.m4: New file.
* modules/obstack (Files): Add it.
---
ChangeLog | 4
m4/obstack.m4 | 35 +++
modules/obstack | 1 +
3 files changed, 40 insertions(+)
create mode 100644 m4/obstack.m4
diff --git a/ChangeLog b/ChangeLog
index 274b794..23accbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2014-11-03 Paul Eggert
+ obstack: do not assume system-supplied obstack is size_t safe
+ * m4/obstack.m4: New file.
+ * modules/obstack (Files): Add it.
+
obstack: port to platforms that #define __alignof__
* lib/obstack.c: Include if !defined __alignof__,
not if !_LIBC. We don't