re PR target/20366 (AIX g++ -D_LARGE_FILES fails to compile #include <iostream>)

fixincludes/
2008-03-07  Peter O'Gorman  <pogma@thewrittenword.com>

	PR c++/20366
	* inclhack.def (AAB_aix_stdio): Hack stdio.h for -D_LARGE_FILES.
	* fixincl.x: Regenerate.
	* tests/base/stdio.h: Add test.

gcc/testsuite/
2008-03-07  Peter O'Gorman  <pogma@thewrittenword.com>

	PR c++/20366
	* g++.dg/other/pr20366.C: New test.

From-SVN: r133001
This commit is contained in:
Peter O'Gorman 2008-03-07 06:53:59 +00:00 committed by Ralf Wildenhues
parent cb6f415f34
commit 83644cd500
6 changed files with 215 additions and 18 deletions

View File

@ -1,3 +1,10 @@
2008-03-07 Peter O'Gorman <pogma@thewrittenword.com>
PR c++/20366
* inclhack.def (AAB_aix_stdio): Hack stdio.h for -D_LARGE_FILES.
* fixincl.x: Regenerate.
* tests/base/stdio.h: Add test.
2008-02-25 Ben Elliston <bje@au.ibm.com> 2008-02-25 Ben Elliston <bje@au.ibm.com>
PR other/32948 PR other/32948

View File

@ -2,11 +2,11 @@
* *
* DO NOT EDIT THIS FILE (fixincl.x) * DO NOT EDIT THIS FILE (fixincl.x)
* *
* It has been AutoGen-ed Wednesday February 20, 2008 at 05:10:00 AM CET * It has been AutoGen-ed Friday March 7, 2008 at 07:37:21 AM CET
* From the definitions inclhack.def * From the definitions inclhack.def
* and the template file fixincl * and the template file fixincl
*/ */
/* DO NOT SVN-MERGE THIS FILE, EITHER Wed Feb 20 05:10:00 CET 2008 /* DO NOT SVN-MERGE THIS FILE, EITHER Fr 7. Mär 07:37:22 CET 2008
* *
* You must regenerate it. Use the ./genfixes script. * You must regenerate it. Use the ./genfixes script.
* *
@ -15,32 +15,85 @@
* certain ANSI-incompatible system header files which are fixed to work * certain ANSI-incompatible system header files which are fixed to work
* correctly with ANSI C and placed in a directory that GNU C will search. * correctly with ANSI C and placed in a directory that GNU C will search.
* *
* This file contains 212 fixup descriptions. * This file contains 213 fixup descriptions.
* *
* See README for more information. * See README for more information.
* *
* inclhack copyright (c) 1998, 1999, 2000, 2001 * inclhack copyright (c) 1998, 1999, 2000, 2001
* The Free Software Foundation, Inc. * The Free Software Foundation, Inc.
* *
* inclhack is free software. * inclhack is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* *
* You may redistribute it and/or modify it under the terms of the * inclhack is distributed in the hope that it will be useful, but
* GNU General Public License, as published by the Free Software * WITHOUT ANY WARRANTY; without even the implied warranty of
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* inclhack is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License along
* along with inclhack. If not, write to: * with this program. If not, see <http://www.gnu.org/licenses/>.
* The Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301, USA.
*/ */
/* * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Description of Aab_Aix_Stdio fix
*/
tSCC zAab_Aix_StdioName[] =
"AAB_aix_stdio";
/*
* File name selection pattern
*/
tSCC zAab_Aix_StdioList[] =
"stdio.h\0";
/*
* Machine/OS name selection pattern
*/
tSCC* apzAab_Aix_StdioMachs[] = {
"*-*-aix*",
(const char*)NULL };
/*
* content selection pattern - do fix if pattern found
*/
tSCC zAab_Aix_StdioSelect0[] =
"define fopen fopen64";
#define AAB_AIX_STDIO_TEST_CT 1
static tTestDesc aAab_Aix_StdioTests[] = {
{ TT_EGREP, zAab_Aix_StdioSelect0, (regex_t*)NULL }, };
/*
* Fix Command Arguments for Aab_Aix_Stdio
*/
static const char* apzAab_Aix_StdioPatch[] = {
"wrap",
"",
"\n\
#if defined __GNUG__ && defined _LARGE_FILES && defined __cplusplus\n\
#define __need__aix_stdio_h_fix\n\
#ifdef __need__aix_stdio_h_fix\n\
#undef fseeko\n\
#undef ftello\n\
#undef fgetpos\n\
#undef fsetpos\n\
#undef fopen\n\
#undef freopen\n\
/* Alias the symbols using asm */\n\
extern \"C\" {\n\
extern int fgetpos(FILE *, fpos64_t *) __asm__(\"fgetpos64\");\n\
extern FILE *fopen(const char *, const char *) __asm__(\"fopen64\");\n\
extern FILE *freopen(const char *, const char *, FILE *) __asm__(\"freopen64\");\n\
extern int fseeko(FILE *, off64_t, int) __asm__(\"fseeko64\");\n\
extern int fsetpos(FILE *, const fpos64_t *) __asm__(\"fsetpos64\");\n\
extern off64_t ftello(FILE *) __asm__(\"ftello64\");\n\
}\n\
#endif\n\
#endif\n",
(char*)NULL };
/* * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Description of Aab_Darwin7_9_Long_Double_Funcs fix * Description of Aab_Darwin7_9_Long_Double_Funcs fix
@ -8611,14 +8664,15 @@ static const char* apzX11_SprintfPatch[] = {
* *
* List of all fixes * List of all fixes
*/ */
#define REGEX_COUNT 255 #define REGEX_COUNT 256
#define MACH_LIST_SIZE_LIMIT 261 #define MACH_LIST_SIZE_LIMIT 261
#define FIX_COUNT 212 #define FIX_COUNT 213
/* /*
* Enumerate the fixes * Enumerate the fixes
*/ */
typedef enum { typedef enum {
AAB_AIX_STDIO_FIXIDX,
AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_FIXIDX, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_FIXIDX,
AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_2_FIXIDX, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_2_FIXIDX,
AAB_FD_ZERO_ASM_POSIX_TYPES_H_FIXIDX, AAB_FD_ZERO_ASM_POSIX_TYPES_H_FIXIDX,
@ -8834,6 +8888,11 @@ typedef enum {
} t_fixinc_idx; } t_fixinc_idx;
tFixDesc fixDescList[ FIX_COUNT ] = { tFixDesc fixDescList[ FIX_COUNT ] = {
{ zAab_Aix_StdioName, zAab_Aix_StdioList,
apzAab_Aix_StdioMachs,
AAB_AIX_STDIO_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
aAab_Aix_StdioTests, apzAab_Aix_StdioPatch, 0 },
{ zAab_Darwin7_9_Long_Double_FuncsName, zAab_Darwin7_9_Long_Double_FuncsList, { zAab_Darwin7_9_Long_Double_FuncsName, zAab_Darwin7_9_Long_Double_FuncsList,
apzAab_Darwin7_9_Long_Double_FuncsMachs, apzAab_Darwin7_9_Long_Double_FuncsMachs,
AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,

View File

@ -20,6 +20,47 @@ autogen definitions fixincl;
FIXINC_DEBUG = yes; FIXINC_DEBUG = yes;
#endif #endif
/* On AIX when _LARGE_FILES is defined stdio.h defines fopen to
* fopen64 etc. and this causes problems when building with g++
* because cstdio udefs everything from stdio.h, leaving us with
* ::fopen has not been declared errors. This fixes stdio.h to
* undef those defines and use __asm__ to alias the symbols if
* building with g++ and -D_LARGE_FILES
*/
fix = {
hackname = AAB_aix_stdio;
files = stdio.h;
select = "define fopen fopen64";
mach = "*-*-aix*";
c_fix = wrap;
c_fix_arg = "";
c_fix_arg = "\n"
"#if defined __GNUG__ && defined _LARGE_FILES && defined __cplusplus\n"
"#define __need__aix_stdio_h_fix\n"
"#ifdef __need__aix_stdio_h_fix\n"
"#undef fseeko\n"
"#undef ftello\n"
"#undef fgetpos\n"
"#undef fsetpos\n"
"#undef fopen\n"
"#undef freopen\n"
"/* Alias the symbols using asm */\n"
"extern \"C\" {\n"
"extern int fgetpos(FILE *, fpos64_t *) __asm__(\"fgetpos64\");\n"
"extern FILE *fopen(const char *, const char *) __asm__(\"fopen64\");\n"
"extern FILE *freopen(const char *, const char *, FILE *) __asm__(\"freopen64\");\n"
"extern int fseeko(FILE *, off64_t, int) __asm__(\"fseeko64\");\n"
"extern int fsetpos(FILE *, const fpos64_t *) __asm__(\"fsetpos64\");\n"
"extern off64_t ftello(FILE *) __asm__(\"ftello64\");\n"
"}\n"
"#endif\n"
"#endif\n";
test_text = "";
};
/* /*
* On Mac OS 10.3.9, the 'long double' functions are available in * On Mac OS 10.3.9, the 'long double' functions are available in

View File

@ -14,6 +14,11 @@
#include <stdarg.h> #include <stdarg.h>
#if defined( AAB_AIX_STDIO_CHECK )
#endif /* AAB_AIX_STDIO_CHECK */
#if defined( ALPHA_GETOPT_CHECK ) #if defined( ALPHA_GETOPT_CHECK )
extern int getopt(int, char *const[], const char *); extern int getopt(int, char *const[], const char *);
#endif /* ALPHA_GETOPT_CHECK */ #endif /* ALPHA_GETOPT_CHECK */

View File

@ -1,3 +1,8 @@
2008-03-07 Peter O'Gorman <pogma@thewrittenword.com>
PR c++/20366
* g++.dg/other/pr20366.C: New test.
2008-03-06 Andrew Pinski <andrew_pinski@playstation.sony.com> 2008-03-06 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR tree-opt/35402 PR tree-opt/35402

View File

@ -0,0 +1,80 @@
// Test fix for PR20366
//
// { dg-do compile { target *-*-aix* } }
// { dg-options "-D_LARGE_FILES" }
//
// cstdio includes stdio.h and undefs most of the functions declared
// therein, unfortunately this means that #define fopen fopen64 goes
// away. This tests the fix, and ensures that with -D_LARGE_FILES
// fopen et. al. are indeed aliased to the large file equivalents.
//
// There are many other #define foo foo64 in the AIX headers, but
// these all work out fine as they are not undefined in libstdc++.
// This list is probably incomplete:
//
// Symbol Return type Large file declaration.
//
// aio.h (different for different AIX versions)
// =====
// aio_read int aio_read64(int, struct aiocb64 *);
// aio_write int aio_write64(int, struct aiocb64 *);
// lio_listio int lio_listio64(int, struct liocb64 *[], int, void *);
// aio_cancel int aio_cancel64(int, struct aiocb64 *);
// aio_suspend int aio_suspend64(int, struct aiocb64 *[]);
//
// stdio.h
// =======
// fgetpos int fgetpos64(FILE *, fpos64_t *);
// fopen FILE *fopen64(const char *, const char *);
// freopen FILE *freopen64(const char *, const char *, FILE *);
// fseeko int fseeko64(FILE *, off64_t, int);
// fsetpos int fsetpos64(FILE *, const fpos64_t *);
// ftello off64_t ftello64(FILE *);
//
// unistd.h
// ========
// fclear off64_t fclear64(int, off64_t);
// fsync_range int fsync_range64(int, int, off64_t, off64_t);
// ftruncate int ftruncate64(int, off64_t);
// truncate int truncate64(const char *, off64_t);
// lseek off64_t lseek64(int, off64_t, int);
// pread ssize_t pread64(int, void *, size_t, off64_t);
// pwrite ssize_t pwrite64(int, const void *, size_t, off64_t);
//
// fcntl.h
// =======
// open int open64(const char *, int, ...);
// creat int creat64(const char *, mode_t);
//
// sys/stat.h
// ==========
// stat int stat64(const char *, struct stat64 *);
// fstat int fstat64(int, struct stat64 *);
// lstat int lstat64(const char *, struct stat64 *);
//
// stdlib.h
// ========
// mkstemp int mkstemp64(char *);
//
// ftw.h
// =====
// ftw int ftw64(const char *, int (*)(const char *,const struct stat64 *, int), int);
// nftw int nftw64(const char *, int (*)(const char *, const struct stat64 *, int, struct FTW*), int, int);
//
// It seems unlikely that any of these will be used (and #undef'ed) by
// libstdc++ in the future, if they are then this test and its
// associated patch to fixincludes will have to be revisited.
#include <cstdio>
extern "C" {
int fgetpos(FILE *, fpos64_t *);
FILE *fopen(const char *, const char *);
FILE *freopen(const char *, const char *, FILE *);
int fseeko(FILE *, off64_t, int);
int fsetpos(FILE *, const fpos64_t *);
off64_t ftello(FILE *);
}
int main() {
return 0;
}