On older Solaris releases, we didn't get a protype for madvise, and so util/osdep.c provides its own prototype. Some time between the public Solaris 11.4 release and Solaris 11.4.42 CBE, we started getting an madvise prototype that looks like this:
extern int madvise(void *, size_t, int); which conflicts with the prototype in util/osdeps.c. Instead of always declaring this prototype, check if we're missing the madvise() prototype, and only declare it ourselves if the prototype is missing. The 'missing_madvise_proto' meson check contains an obviously wrong prototype for madvise. So if that code compiles and links, we must be missing the actual prototype for madvise. Signed-off-by: Andrew Deason <adea...@sinenomine.net> --- To be clear, I'm okay with removing the prototype workaround unconditionally; I'm just not sure if there's enough consensus on doing that. The "missing prototype" check is based on getting a compiler error on a conflicting prototype, since this just seems more precise and certain than getting an error from a missing prototype (needs -Werror=missing-prototypes or -Werror). But I can do it the other way around if needed. Changes since v1: - madvise prototype check changed to not be platforms-specific, and turned into CONFIG_MADVISE_MISSING_PROTOTYPE. meson.build | 17 +++++++++++++++-- util/osdep.c | 3 +++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 2d6601467f..ff5fce693e 100644 --- a/meson.build +++ b/meson.build @@ -1705,25 +1705,38 @@ config_host_data.set('CONFIG_EVENTFD', cc.links(''' int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' #include <unistd.h> int main(void) { #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 return fdatasync(0); #else #error Not supported #endif }''')) -config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + ''' + +has_madvise = cc.links(gnu_source_prefix + ''' #include <sys/types.h> #include <sys/mman.h> #include <stddef.h> - int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')) + int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') +missing_madvise_proto = false +if has_madvise + missing_madvise_proto = cc.links(gnu_source_prefix + ''' + #include <sys/types.h> + #include <sys/mman.h> + #include <stddef.h> + extern int madvise(int); + int main(void) { return madvise(0); }''') +endif +config_host_data.set('CONFIG_MADVISE', has_madvise) +config_host_data.set('CONFIG_MADVISE_MISSING_PROTOTYPE', missing_madvise_proto) + config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' #include <sys/mman.h> int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' #include <fcntl.h> #if !defined(AT_EMPTY_PATH) # error missing definition #else int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } #endif''')) diff --git a/util/osdep.c b/util/osdep.c index 7c4deda6fe..560ce9111a 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -21,20 +21,23 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "qemu/osdep.h" #include "qapi/error.h" /* Needed early for CONFIG_BSD etc. */ #ifdef CONFIG_SOLARIS #include <sys/statvfs.h> +#endif + +#ifdef HAVE_MADVISE_MISSING_PROTOTYPE /* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for discussion about Solaris header problems */ extern int madvise(char *, size_t, int); #endif #include "qemu-common.h" #include "qemu/cutils.h" #include "qemu/sockets.h" #include "qemu/error-report.h" #include "qemu/madvise.h" -- 2.11.0