classification
Title: Python/dtoa.c:158: #error "Failed to find an exact-width 32-bit integer type" (FreeBSD 4.11 + gcc 2.95.4)
Type: compile error Stage: patch review
Components: Build Versions: Python 3.2, Python 3.3, Python 3.4, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: mark.dickinson Nosy List: Tom.OConnor, akitada, eric.smith, mark.dickinson, python-dev, skrah, trent
Priority: normal Keywords: patch

Created on 2010-10-09 07:26 by akitada, last changed 2012-12-02 13:23 by mark.dickinson. This issue is now closed.

Files
File name Uploaded Description Edit
issue10052.diff akitada, 2010-10-17 00:03 patch for FreeBSD 4 review
issue10052.patch mark.dickinson, 2012-12-02 11:26 review
Messages (17)
msg118246 - (view) Author: Akira Kitada (akitada) * Date: 2010-10-09 07:26
Building Python 2.7 fails on FreeBSD 4.11 with gcc 2.95.4 as below:

"""
gcc -pthread -c -fno-strict-aliasing -g -O2 -DNDEBUG -g  -O3 -Wall -Wstrict-prototypes  -I. -IInclude -I./Include   -DPy_BUILD_CORE -o Python/dtoa.o Python/dtoa.c
Python/dtoa.c:158: #error "Failed to find an exact-width 32-bit integer type"
gmake: *** [Python/dtoa.o] Error 1
"""

This error occurs when HAVE_UINT32_T or HAVE_INT32_T are not defined.
Those constants are defined in Include/pyport.h as:

"""
#if (defined UINT32_MAX || defined uint32_t)
#ifndef PY_UINT32_T
#define HAVE_UINT32_T 1
#define PY_UINT32_T uint32_t
#endif
#endif
"""

"""
#if (defined INT32_MAX || defined int32_t)
#ifndef PY_INT32_T
#define HAVE_INT32_T 1
#define PY_INT32_T int32_t
#endif
#endif
"""

This doesn't work for FreeBSD 4, where exact-width integer types are defined #typedef and does not provide *_MAX for them.

I don't think this is the right fix but adding following macro to pyport.h fixed the problem.

"""
#define UINT32_MAX 0xffffffff
#define INT32_MAX 0x7fffffff
"""
msg118293 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2010-10-09 22:21
Thanks for the report.  Some questions:

1. Have you tested this with Python 3.x at all?  I'd expect the same issues to show up for Python 3.1 and 3.2.

2. Also, do you have the relevant configure output to hand?  On my machine, the output from './configure' includes:

checking for uint32_t... yes
checking for uint64_t... yes
checking for int32_t... no
checking for int64_t... no
checking for ssize_t... yes

what do you get here?  (Aside:  those .... 'no's look odd to me;  I think there may be an autoconf bug here.)

3. Do you know which header file declares uint32_t on FreeBSD 4?

IIRC, the theory is that if stdint.h or inttypes.h #defines/typedefs uint32_t, then the UINT32_T_MAX macro should also be #defined somewhere in one of those header files;  OTOH if neither stdint nor inttypes includes declarations for uint32_t then the configure script should find something suitable, and #define uint32_t.
msg118299 - (view) Author: Akira Kitada (akitada) * Date: 2010-10-10 02:21
> 1. Have you tested this with Python 3.x at all?  I'd expect the same issues to show up for Python 3.1 and 3.2.

Yes, I can reproduce this in 2.7, 3.1 and 3.2.

> 2. Also, do you have the relevant configure output to hand?  On my machine, the output from './configure' includes:
> 
> checking for uint32_t... yes
> checking for uint64_t... yes
> checking for int32_t... no
> checking for int64_t... no
> checking for ssize_t... yes
>
> what do you get here?  (Aside:  those .... 'no's look odd to me;  I think there may be an autoconf bug here.)

Same here. It looks like a bug in autoconf:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=560105

My output is below:

"""
checking for uint32_t... yes
checking for uint64_t... yes
checking for int32_t... no
checking for int64_t... no
checking for ssize_t... yes
"""

> 3. Do you know which header file declares uint32_t on FreeBSD 4?

They are declared in inttypes.h.

"""
/*
 * This file is in the public domain.
 * $FreeBSD: src/sys/sys/inttypes.h,v 1.2 1999/08/28 00:51:47 peter Exp $
 */

#ifndef _SYS_INTTYPES_H_
#define _SYS_INTTYPES_H_

#include <machine/ansi.h>

typedef __int8_t        int8_t;
typedef __int16_t       int16_t;
typedef __int32_t       int32_t;
typedef __int64_t       int64_t;

typedef __uint8_t       uint8_t;
typedef __uint16_t      uint16_t;
typedef __uint32_t      uint32_t;
typedef __uint64_t      uint64_t;

typedef __intptr_t      intptr_t;
typedef __uintptr_t     uintptr_t;

#endif /* !_SYS_INTTYPES_H_ */
"""
msg118310 - (view) Author: Akira Kitada (akitada) * Date: 2010-10-10 06:34
Forgot to mention that there's no _MAX macro for exact-width integer types.

$ egrep -r 'INT[0-9].*_MAX' /usr/include/ | wc -l
       0

How about adding those macros when the system does not provide them?
msg118325 - (view) Author: Stefan Krah (skrah) * (Python committer) Date: 2010-10-10 09:33
FreeBSD 5.0 has stdint.h, which includes machine/_stdint.h. In the
latter file the *_MAX constants are defined.

It looks like FreeBSD has had the correct setup for more than 7 years:

http://svn.freebsd.org/viewvc/base/release/5.0.0/sys/i386/include/


I would be moderately against making changes in Python for dated systems.
Could you perhaps just copy the files from 5.0?
msg118330 - (view) Author: Akira Kitada (akitada) * Date: 2010-10-10 10:02
I understand FreeBSD 4.x is old platform (4.11, the last 4.x series, is released 5 years ago) but, in my opinion, as long as it does not make Python code cluttered, supporting old platforms is not that bad idea.

Anyway, I would like to leave the decision to the core developers.
msg118384 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2010-10-11 19:56
> Anyway, I would like to leave the decision to the core developers.

You mean the core developers other than Stefan? ;-)

I don't have any objection to a patch for this problem, provided that that patch is specifically targeted at FreeBSD 4, and clearly doesn't change behaviour on any other platform.

On one hand I agree that FreeBSD 4 isn't a high priority platform;  on the other, it's not *that* obscure, and failure to build the Python core (rather than the extension modules) is quite a big deal.  It's also a regression from 2.6, IIUC.  And it should be easy to fix, with a single block of code in pyport.h.
msg118727 - (view) Author: Tom O'Connor (Tom.OConnor) Date: 2010-10-14 22:40
Same problem on SGI IRIX 6.5.28 GCC 3.3.

Adding the following to pyport.h got me through as well.

#define UINT32_MAX 0xffffffff
#define INT32_MAX 0x7fffffff
msg118907 - (view) Author: Akira Kitada (akitada) * Date: 2010-10-17 00:03
This patch is specifically targeted at FreeBSD 4.
tested on FreeBSD 4.11 and OS X 10.6.4

I don't know how to accommodate SGI IRIX's case.
msg120677 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2010-11-07 13:08
Thanks for the patch.  This looks fine, in principle.

A couple of comments and questions:

(1) I think the patch should provide *MIN values alongside the *MAX values (for signed types only, of course).

(2) Are we sure that these values are valid on all FreeBSD 4 platforms, or should these definitions be further restricted to Free BSD 4 / x86?

(3) Are the types of the constants definitely correct?  E.g., UINT64_MAX should have type uint64_t.  That gets a bit tricky, since we can't use casts (which would prevent these constants being used in preprocessor #ifs), so we need to determine exactly what basic types uint32_t and uint64_t match, and make sure to use the correct suffix (e.g., ULL, LL, UL, L).  For uint32_t I guess this is easy:  it'll almost certainly be the same type as unsigned int.  Is uint64_t defined as unsigned long long, or as unsigned long?
msg176573 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2012-11-28 20:38
This is also an issue on the Tru64 / alpha on Snakebite:  that platform has inttypes.h but no stdint.h, and inttypes.h has typedefs for uint32_t and friends, but no defines for UINT32_MAX, etc.  So the pyport.h check:

#if (defined UINT32_MAX || defined uint32_t)

fails (uint32_t is a typedef rather than a #define). To make matters worse, the autoconf macro AC_TYPE_UINT32_T correctly detects that uint32_t exists, so doesn't bother to define it.

The ideal place to fix this would be in the configure scripts.
msg176784 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2012-12-02 11:26
Here's a patch (against the default branch).  It adds simple AC_CHECK_TYPE configure-time typechecks for uint32_t and friends.
msg176788 - (view) Author: Roundup Robot (python-dev) Date: 2012-12-02 12:11
New changeset 6f9aba5f8d32 by Mark Dickinson in branch 'default':
Issue 10052: fix failed uint32_t / uint64_t / int32_t / int64_t detection on some platforms.
http://hg.python.org/cpython/rev/6f9aba5f8d32
msg176789 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2012-12-02 12:12
Committed to default.  I want to look at the buildbot results and try some manual snakebite tests before deciding whether to backport.
msg176790 - (view) Author: Roundup Robot (python-dev) Date: 2012-12-02 13:16
New changeset 48fbe78167cd by Mark Dickinson in branch '2.7':
Issue 10052: fix failed uint32_t / uint64_t / int32_t / int64_t detection on some platforms.
http://hg.python.org/cpython/rev/48fbe78167cd
msg176791 - (view) Author: Roundup Robot (python-dev) Date: 2012-12-02 13:22
New changeset d82b73366227 by Mark Dickinson in branch '3.2':
Issue 10052: fix failed uint32_t / uint64_t / int32_t / int64_t detection on some platforms.
http://hg.python.org/cpython/rev/d82b73366227

New changeset 48de792747dc by Mark Dickinson in branch '3.3':
Issue 10052: merge fix from 3.2.
http://hg.python.org/cpython/rev/48de792747dc

New changeset 22d891a2d533 by Mark Dickinson in branch 'default':
Issue 10052: null merge from 3.3
http://hg.python.org/cpython/rev/22d891a2d533
msg176792 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2012-12-02 13:23
Fixed in all branches.
History
Date User Action Args
2012-12-02 13:23:45mark.dickinsonsetstatus: open -> closed
resolution: fixed
messages: + msg176792
2012-12-02 13:22:56python-devsetmessages: + msg176791
2012-12-02 13:16:01python-devsetmessages: + msg176790
2012-12-02 12:12:41mark.dickinsonsetmessages: + msg176789
2012-12-02 12:11:49python-devsetnosy: + python-dev
messages: + msg176788
2012-12-02 11:26:11mark.dickinsonsetfiles: + issue10052.patch

messages: + msg176784
2012-11-28 20:45:26mark.dickinsonsetversions: + Python 3.3, Python 3.4
2012-11-28 20:45:07mark.dickinsonsetassignee: mark.dickinson
2012-11-28 20:38:13mark.dickinsonsetmessages: + msg176573
2012-11-28 20:35:29trentsetnosy: + trent
2011-11-29 06:18:00ezio.melottisetstage: patch review
versions: - Python 3.1
2010-11-07 13:08:19mark.dickinsonsetmessages: + msg120677
2010-10-17 00:03:20akitadasetfiles: + issue10052.diff
keywords: + patch
messages: + msg118907
2010-10-14 22:40:30Tom.OConnorsetnosy: + Tom.OConnor
messages: + msg118727
2010-10-11 19:56:25mark.dickinsonsetmessages: + msg118384
2010-10-10 10:02:19akitadasetmessages: + msg118330
2010-10-10 09:33:50skrahsetnosy: + skrah
messages: + msg118325
2010-10-10 06:34:53akitadasetmessages: + msg118310
2010-10-10 02:21:13akitadasetmessages: + msg118299
versions: + Python 3.1, Python 3.2
2010-10-09 22:21:56mark.dickinsonsetmessages: + msg118293
2010-10-09 11:19:50eric.smithsetnosy: + mark.dickinson, eric.smith
2010-10-09 07:26:43akitadacreate