From patchwork Mon Jun 27 12:50:27 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tristan Gingold X-Patchwork-Id: 102156 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id A6F4BB6F54 for ; Mon, 27 Jun 2011 22:50:59 +1000 (EST) Received: (qmail 26402 invoked by alias); 27 Jun 2011 12:50:57 -0000 Received: (qmail 26376 invoked by uid 22791); 27 Jun 2011 12:50:51 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL, BAYES_00, SARE_RAND_1, TW_CP X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (194.98.77.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 27 Jun 2011 12:50:33 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 06168CB02D1; Mon, 27 Jun 2011 14:50:31 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WAlHduz6YsmD; Mon, 27 Jun 2011 14:50:28 +0200 (CEST) Received: from ulanbator.act-europe.fr (ulanbator.act-europe.fr [10.10.1.67]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by mel.act-europe.fr (Postfix) with ESMTP id F0FC1CB02C8; Mon, 27 Jun 2011 14:50:27 +0200 (CEST) From: Tristan Gingold Subject: [vms] Rewrite CRTL mapping Date: Mon, 27 Jun 2011 14:50:27 +0200 Message-Id: <371502D4-6E84-4A3F-81EE-5509857DD5FE@adacore.com> Cc: "rupp@adacore.com Rupp" To: "gcc-patches@gcc.gnu.org Patches" Mime-Version: 1.0 (Apple Message framework v1084) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, one of the particularities of VMS is the use of prefix for the C runtime (C-RTL). For example, the function fputs() is implemented by the routine decc$fputs. The map is now written in a text file (vms-crtlmap.map) which is translate during build by a script. There is now only one map file (there were 2 .h files before), and this format is simpler to modify. The translation is now done by using (and abusing ?) IDENTIFIER_TRANSPARENT_ALIAS (instead of some alias in the previous implementation). This is less target dependent and lighter than the previous implementation. Committed on trunk. Tristan. 2011-06-27 Tristan Gingold PR target/44241 * config/vms/vms-protos.h: New file. * config/vms/vms-crtlmap.map: New file. * config/vms/vms.c: New file. * config/vms/make-crtlmap.awk: New file. * config/vms/vms-crtl.h: File removed. * config/vms/vms-crtl-64.h: File removed. * config/vms/t-vms (vms-crtlmap.h, vms.o): New targets. * config/alpha/vms64.h: Do not include vms-crtl-64.h * config/alpha/alpha.c (alpha_init_builtins): Remove code to clear some builtins on VMS. Calls vms_patch_builtins. (avms_asm_output_external): Remove. * config/alpha/vms.h (ASM_OUTPUT_EXTERNAL): Remove. (struct crtl_name_spec): Remove (DO_CTRL_NAMES): Remove. * config/ia64/vms.h (struct crtl_name_spec): Remove (DO_CTRL_NAMES): Remove. * config/ia64/ia64.c (alpha_init_builtins): Remove code to clear some builtins on VMS. Calls vms_patch_builtins. (ia64_asm_output_external): Remove DO_CRTL_NAME. * config/ia64/vms64.h: Do not include vms-crtl-64.h * config.gcc (*-*-*vms*): Define extra_objs, target_gtfiles, tm_p_file. Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 175520) +++ gcc/config.gcc (working copy) @@ -721,6 +721,9 @@ extra_options="${extra_options} vms/vms.opt" xmake_file=vms/x-vms tmake_file="vms/t-vms" + extra_objs="vms.o" + target_gtfiles="$target_gtfiles \$(srcdir)/config/vms/vms.c" + tm_p_file="${tm_p_file} vms/vms-protos.h" if test x$gnu_ld != xyes; then # Build wrappers for native case. extra_programs="ld\$(exeext) ar\$(exeext)" Index: gcc/config/alpha/vms.h =================================================================== --- gcc/config/alpha/vms.h (revision 175520) +++ gcc/config/alpha/vms.h (working copy) @@ -225,55 +225,6 @@ #define LINK_EH_SPEC "vms-dwarf2eh.o%s " #define LINK_GCC_C_SEQUENCE_SPEC "%G" -#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ - avms_asm_output_external (FILE, DECL, NAME) - -typedef struct crtl_name_spec -{ - const char *const name; - const char *deccname; - int referenced; -} crtl_name_spec; - -#include "config/vms/vms-crtl.h" - -/* Alias CRTL names to 32/64bit DECCRTL functions. - Fixme: This should do a binary search. */ -#define DO_CRTL_NAMES \ - do \ - { \ - int i; \ - static crtl_name_spec vms_crtl_names[] = CRTL_NAMES; \ - static int malloc64_init = 0; \ - \ - if ((malloc64_init == 0) && TARGET_MALLOC64) \ - { \ - for (i=0; vms_crtl_names [i].name; i++) \ - { \ - if (strcmp ("calloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_calloc64"; \ - else \ - if (strcmp ("malloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_malloc64"; \ - else \ - if (strcmp ("realloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_realloc64"; \ - else \ - if (strcmp ("strdup", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_strdup64"; \ - } \ - malloc64_init = 1; \ - } \ - for (i=0; vms_crtl_names [i].name; i++) \ - if (!vms_crtl_names [i].referenced && \ - (strcmp (name, vms_crtl_names [i].name) == 0)) \ - { \ - fprintf (file, "\t%s=%s\n", \ - name, vms_crtl_names [i].deccname); \ - vms_crtl_names [i].referenced = 1; \ - } \ - } while (0) - /* This is how to output an assembler line that says to advance the location counter to a multiple of 2**LOG bytes. */ Index: gcc/config/alpha/alpha.c =================================================================== --- gcc/config/alpha/alpha.c (revision 175522) +++ gcc/config/alpha/alpha.c (working copy) @@ -6367,12 +6367,6 @@ dimode_integer_type_node = lang_hooks.types.type_for_mode (DImode, 0); - /* Fwrite on VMS is non-standard. */ -#if TARGET_ABI_OPEN_VMS - implicit_built_in_decls[(int) BUILT_IN_FWRITE] = NULL_TREE; - implicit_built_in_decls[(int) BUILT_IN_FWRITE_UNLOCKED] = NULL_TREE; -#endif - ftype = build_function_type_list (dimode_integer_type_node, NULL_TREE); alpha_add_builtins (zero_arg_builtins, ARRAY_SIZE (zero_arg_builtins), ftype); @@ -6409,6 +6403,8 @@ NULL_TREE); alpha_builtin_function ("__builtin_revert_vms_condition_handler", ftype, ALPHA_BUILTIN_REVERT_VMS_CONDITION_HANDLER, 0); + + vms_patch_builtins (); } alpha_v8qi_u = build_vector_type (unsigned_intQI_type_node, 8); @@ -8169,15 +8165,6 @@ inside_function = FALSE; } -#if TARGET_ABI_OPEN_VMS -void avms_asm_output_external (FILE *file, tree decl ATTRIBUTE_UNUSED, const char *name) -{ -#ifdef DO_CRTL_NAMES - DO_CRTL_NAMES; -#endif -} -#endif - #if TARGET_ABI_OSF /* Emit a tail call to FUNCTION after adjusting THIS by DELTA. Index: gcc/config/alpha/vms64.h =================================================================== --- gcc/config/alpha/vms64.h (revision 175520) +++ gcc/config/alpha/vms64.h (working copy) @@ -49,5 +49,3 @@ /* Defaults to "long int" */ #undef SIZE_TYPE #undef PTRDIFF_TYPE - -# include "config/vms/vms-crtl-64.h" Index: gcc/config/vms/vms-protos.h =================================================================== --- gcc/config/vms/vms-protos.h (revision 0) +++ gcc/config/vms/vms-protos.h (revision 0) @@ -0,0 +1,21 @@ +/* Definitions of target machine for GCC for VMS. + Copyright (C) 2011 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC 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, or (at your option) +any later version. + +GCC 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. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +/* vms.c */ +void vms_patch_builtins (void); Index: gcc/config/vms/vms-crtlmap.map =================================================================== --- gcc/config/vms/vms-crtlmap.map (revision 0) +++ gcc/config/vms/vms-crtlmap.map (revision 0) @@ -0,0 +1,200 @@ +# Standard C names to DEC-C names map table. +# All names in the DEC-C shared image (shared library) are prefixed +# with decc$ (this is the standard vms convention for names in public +# shared libraries). This conversion is done by the compiler for all +# languages. +# +# Currently contains only a partial list, e.g. those functions use +# in GNAT and GCC. +# +# File format: +# - Empty lines are ignored. +# - Comment lines start with '#' in the first column. +# - map lines consist in an identifier optionnaly followed by at most 2 +# space-separated flags. +# Flags are: +# FLOAT: will be prefixed by 'x' +# 64: There is a 64-bit variant +# BSD44: name will be prefixed by __bsd44__ +# PRNTF: a 't' prefix will be added. +# MALLOC: malloc related function. +# +# Keep entries alpha-sorted - this is enforced by the awk script. +# +__32_signal +__32_ssignal +__64_signal +__64_ssignal +__utc_localtime +__utc_localtime_t +__utc_stat +__utc_time +__utctz_gmtime +__utctz_localtime +__utctz_localtime_t +abort +abs +accept +access +acos FLOAT +alarm +asin FLOAT +atan FLOAT +atan2 FLOAT +atexit +atoi +atoll +atoq +basename 64 +bcmp +bcopy +bsearch 64 +bzero +calloc 64 MALLOC +ceil FLOAT +chdir +chown +clearerr +clock +close +connect +cos FLOAT +ctermid 64 +ctime +dup +dup2 +exit +exp FLOAT +fabs FLOAT +fclose +fdopen +fflush +ffs +fgetc +fgets 64 +floor FLOAT +fopen +fprintf FLOAT PRNTF +fputc +fputs +fread +free +freopen +fseek +ftell +fwrite +getc +getcwd 64 +getegid +getenv +geteuid +getgid +gethostbyaddr +gethostbyname +getpagesize +getpid +getservbyname +getservbyport +gettimeofday +getuid +gmtime +htons +iconv +index 64 +ioctl +isatty +isdigit +islower +isprint +isspace +isupper +kill +localtime +log FLOAT +log1 FLOAT +lseek +malloc 64 MALLOC +mbstowcs 64 +memchr 64 +memcmp +memcpy 64 +memmove 64 +memset 64 +mkdir +mkstemp +mktemp 64 +mmap 64 +munmap +nl_langinfo +open +pclose +perror +popen +pow FLOAT +printf FLOAT PRNTF +putc +putchar +putenv +puts +qsort 64 +random +read +realloc 64 MALLOC +recv +recvfrom +recvmsg BSD44 64 +rename +rewind +rindex 64 +rmdir +send +sendmsg BSD44 64 +sendto +setenv +setlocale +setvbuf +signal +sigsetmask +sin FLOAT +snprintf FLOAT PRNTF +socket +sprintf FLOAT PRNTF +sqrt FLOAT +stat +strcasecmp +strcat 64 +strchr 64 +strcmp +strcpy 64 +strdup 64 MALLOC +strerror +strlen +strncasecmp +strncmp +strncpy 64 +strrchr 64 +strstr 64 +strtod 64 FLOAT +strtol 64 +strtoul 64 +sysconf +system +tan FLOAT +time +times +tmpfile +tmpnam 64 +tolower +toupper +umask +ungetc +unlink +utime +vfprintf FLOAT PRNTF +vprintf FLOAT PRNTF +vsnprintf FLOAT PRNTF +vsprintf FLOAT PRNTF +wait +waitpid +wcswidth +write Index: gcc/config/vms/vms-crtl-64.h =================================================================== --- gcc/config/vms/vms-crtl-64.h (revision 175520) +++ gcc/config/vms/vms-crtl-64.h (working copy) @@ -1,195 +0,0 @@ -/* Definitions of target machine GNU compiler. 64bit VMS version. - Copyright (C) 2009, 2010 Free Software Foundation, Inc. - Contributed by Douglas B Rupp (rupp@gnat.com). - -This file is part of GCC. - -GCC 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, or (at your option) -any later version. - -GCC 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. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -. */ - -/* - Correlation array of 64bit standard CRTL names with DECCRTL - function names. Currently contains only a partial list, - e.g. those functions use in GNAT and GCC. Memory allocation - routines are 32bit but this can be overridden by -mmalloc - subtarget switch. - - Note: Please keep in alphabetical order. -*/ - -#undef CRTL_NAMES -#define CRTL_NAMES \ -{ \ -{"_calloc32", "decc$calloc", 0}, \ -{"_malloc32", "decc$malloc", 0}, \ -{"_realloc32", "decc$realloc", 0}, \ -{"_strdup32", "decc$strdup", 0}, \ -{"abs", "decc$abs", 0}, \ -{"abort", "decc$abort", 0}, \ -{"access", "decc$access", 0}, \ -{"accept", "decc$accept", 0}, \ -{"acos", "decc$tacos", 0}, \ -{"alarm", "decc$alarm", 0}, \ -{"asin", "decc$tasin", 0}, \ -{"atan", "decc$tatan", 0}, \ -{"atan2", "decc$tatan2", 0}, \ -{"atexit", "decc$atexit", 0}, \ -{"atoi", "decc$atoi", 0}, \ -{"atoll", "decc$atoll", 0}, \ -{"atoq", "decc$atoq", 0}, \ -{"basename", "decc$_basename64", 0}, \ -{"bcmp", "decc$bcmp", 0}, \ -{"bcopy", "decc$bcopy", 0}, \ -{"bsearch", "decc$_bsearch64", 0}, \ -{"bzero", "decc$bzero", 0}, \ -{"calloc", "decc$calloc", 0}, \ -{"ceil", "decc$tceil", 0}, \ -{"chdir", "decc$chdir", 0}, \ -{"chown", "decc$chown", 0}, \ -{"clearerr", "decc$clearerr", 0}, \ -{"clock", "decc$clock", 0}, \ -{"close", "decc$close", 0}, \ -{"cos", "decc$tcos", 0}, \ -{"connect", "decc$connect", 0}, \ -{"ctime", "decc$ctime", 0}, \ -{"dup", "decc$dup", 0}, \ -{"dup2", "decc$dup2", 0}, \ -{"exit", "decc$exit", 0}, \ -{"exp", "decc$texp", 0}, \ -{"fabs", "decc$tfabs", 0}, \ -{"fclose", "decc$fclose", 0}, \ -{"fdopen", "decc$fdopen", 0}, \ -{"fgetc", "decc$fgetc", 0}, \ -{"fgets", "decc$_fgets64", 0}, \ -{"fflush", "decc$fflush", 0}, \ -{"ffs", "decc$ffs", 0}, \ -{"floor", "decc$tfloor", 0}, \ -{"fopen", "decc$fopen", 0}, \ -{"fputc", "decc$fputc", 0}, \ -{"fputs", "decc$fputs", 0}, \ -{"free", "decc$free", 0}, \ -{"fread", "decc$fread", 0}, \ -{"freopen", "decc$freopen", 0}, \ -{"fseek", "decc$fseek", 0}, \ -{"ftell", "decc$ftell", 0}, \ -{"fwrite", "decc$fwrite", 0}, \ -{"getcwd", "decc$_getcwd64", 0}, \ -{"getegid", "decc$getegid", 0}, \ -{"getenv", "decc$getenv", 0}, \ -{"geteuid", "decc$geteuid", 0}, \ -{"getgid", "decc$getgid", 0}, \ -{"gethostbyaddr","decc$gethostbyaddr",0}, \ -{"gethostbyname","decc$gethostbyname",0}, \ -{"getpagesize", "decc$getpagesize", 0}, \ -{"getpid", "decc$getpid", 0}, \ -{"getservbyname","decc$getservbyname",0}, \ -{"getservbyport","decc$getservbyport",0}, \ -{"gettimeofday", "decc$gettimeofday", 0}, \ -{"getuid", "decc$getuid", 0}, \ -{"htons", "decc$htons", 0}, \ -{"iconv", "decc$iconv", 0}, \ -{"index", "decc$_index64", 0}, \ -{"isatty", "decc$isatty", 0}, \ -{"isdigit", "decc$isdigit", 0}, \ -{"kill", "decc$kill", 0}, \ -{"log", "decc$tlog", 0}, \ -{"log10", "decc$tlog10", 0}, \ -{"lseek", "decc$lseek", 0}, \ -{"ioctl", "decc$ioctl", 0}, \ -{"malloc", "decc$malloc", 0}, \ -{"mbstowcs", "decc$_mbstowcs64", 0}, \ -{"memchr", "decc$_memchr64", 0}, \ -{"memcmp", "decc$memcmp", 0}, \ -{"memcpy", "decc$_memcpy64", 0}, \ -{"memmove", "decc$_memmove64", 0}, \ -{"memset", "decc$_memset64", 0}, \ -{"mkstemp", "decc$mkstemp", 0}, \ -{"mktemp", "decc$_mktemp64", 0}, \ -{"mmap", "decc$_mmap64", 0}, \ -{"munmap", "decc$munmap", 0}, \ -{"nl_langinfo", "decc$nl_langinfo", 0}, \ -{"open", "decc$open", 0}, \ -{"pclose", "decc$pclose", 0}, \ -{"popen", "decc$popen", 0}, \ -{"pow", "decc$tpow", 0}, \ -{"printf", "decc$txprintf", 0}, \ -{"putenv", "decc$putenv", 0}, \ -{"puts", "decc$puts", 0}, \ -{"random", "decc$random", 0}, \ -{"read", "decc$read", 0}, \ -{"realloc", "decc$realloc", 0}, \ -{"recv", "decc$recv", 0}, \ -{"recvfrom", "decc$recvfrom", 0}, \ -{"recvmsg", "decc$__bsd44___recvmsg64", 0}, \ -{"rename", "decc$rename", 0}, \ -{"rewind", "decc$rewind", 0}, \ -{"rindex", "decc$_rindex64", 0}, \ -{"rmdir", "decc$rmdir", 0}, \ -{"send", "decc$send", 0}, \ -{"sendmsg", "decc$__bsd44___sendmsg64", 0}, \ -{"sendto", "decc$sendto", 0}, \ -{"setenv", "decc$setenv", 0}, \ -{"setlocale", "decc$setlocale", 0}, \ -{"setvbuf", "decc$setvbuf", 0}, \ -{"signal", "decc$signal", 0}, \ -{"sigsetmask", "decc$sigsetmask", 0}, \ -{"sin", "decc$tsin", 0}, \ -{"snprintf", "decc$txsnprintf", 0}, \ -{"socket", "decc$socket", 0}, \ -{"sqrt", "decc$tsqrt", 0}, \ -{"strcasecmp", "decc$strcasecmp", 0}, \ -{"strchr", "decc$_strchr64", 0}, \ -{"strcpy", "decc$_strcpy64", 0}, \ -{"strdup", "decc$strdup", 0}, \ -{"strerror", "decc$strerror", 0}, \ -{"strlen", "decc$strlen", 0}, \ -{"strncasecmp", "decc$strncasecmp", 0}, \ -{"strncmp", "decc$strncmp", 0}, \ -{"strncpy", "decc$_strncpy64", 0}, \ -{"strrchr", "decc$_strrchr64", 0}, \ -{"strstr", "decc$_strstr64", 0}, \ -{"strtod", "decc$t_strtod64", 0}, \ -{"strtol", "decc$_strtoll64", 0}, \ -{"strtoul", "decc$_strtoull64", 0}, \ -{"sysconf", "decc$sysconf", 0}, \ -{"system", "decc$system", 0}, \ -{"tan", "decc$ttan", 0}, \ -{"time", "decc$time", 0}, \ -{"times", "decc$times", 0}, \ -{"tmpfile", "decc$tmpfile", 0}, \ -{"tmpnam", "decc$_tmpnam64", 0}, \ -{"ungetc", "decc$ungetc", 0}, \ -{"unlink", "decc$unlink", 0}, \ -{"umask", "decc$umask", 0}, \ -{"utime", "decc$utime", 0}, \ -{"wait", "decc$wait", 0}, \ -{"waitpid", "decc$waitpid", 0}, \ -{"wcswidth", "decc$wcswidth", 0}, \ -{"write", "decc$write", 0}, \ -{"vfprintf", "decc$txvfprintf", 0}, \ -{"vprintf", "decc$txvprintf", 0}, \ -{"vsprintf", "decc$txvsprintf", 0}, \ -{"vsnprintf", "decc$txvsnprintf", 0}, \ -{NULL, NULL, 0} \ -} - -/* Initialize of libfuncs that are 32/64 bit memory specific. */ - -#undef MEM_LIBFUNCS_INIT -#define MEM_LIBFUNCS_INIT \ -do { \ - memcpy_libfunc = init_one_libfunc ("decc$_memcpy64"); \ - memmove_libfunc = init_one_libfunc ("decc$_memmove64"); \ - memset_libfunc = init_one_libfunc ("decc$_memset64"); \ -} while (0) Index: gcc/config/vms/vms.c =================================================================== --- gcc/config/vms/vms.c (revision 0) +++ gcc/config/vms/vms.c (revision 0) @@ -0,0 +1,171 @@ +/* Definitions of target machine GNU compiler. 32bit VMS version. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. + Contributed by Douglas B Rupp (rupp@gnat.com). + +This file is part of GCC. + +GCC 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, or (at your option) +any later version. + +GCC 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. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "vms-protos.h" +#include "tm.h" +#include "ggc.h" + +/* Correlation of standard CRTL names with DECCRTL function names. */ + +/* Name is for a function that allocate memory. Use the 64bit version + if -mmalloc64. */ +#define VMS_CRTL_MALLOC (1 << 0) + +/* If long pointer are enabled, use _NAME64 instead. */ +#define VMS_CRTL_64 (1 << 1) + +/* Use tNAME instead. To be applied after the previous rule. */ +#define VMS_CRTL_FLOAT (1 << 2) + +/* Prepend __bsd44__ before the name. To be applied after the P64 + rule. */ +#define VMS_CRTL_BSD44 (1 << 3) + +/* Prepend x before the name for printf like functions. */ +#define VMS_CRTL_PRNTF (1 << 4) + +struct vms_crtl_name +{ + /* The standard C name. */ + const char *const name; + + /* Flags to drive the translation. */ + unsigned int flags; +}; + +/* Map for the translation. */ + +static const struct vms_crtl_name vms_crtl_names[] = + { +#include "vms-crtlmap.h" + }; + +/* Number of entires in the above array. */ + +#define NBR_CRTL_NAMES (sizeof (vms_crtl_names) / sizeof (*vms_crtl_names)) + +/* List of aliased identifiers. They must be persistant accross gc. */ + +static GTY(()) VEC(tree,gc) *aliases_id; + +/* Add a CRTL translation. This simply use the transparent alias + mechanism, which is platform independant and works with the + #pragma extern_prefix (which set the assembler name). */ + +static void +vms_add_crtl_xlat (const char *name, size_t nlen, + const char *id_str, size_t id_len) +{ + tree targ; + + targ = get_identifier_with_length (name, nlen); + gcc_assert (!IDENTIFIER_TRANSPARENT_ALIAS (targ)); + IDENTIFIER_TRANSPARENT_ALIAS (targ) = 1; + TREE_CHAIN (targ) = get_identifier_with_length (id_str, id_len); + + VEC_safe_push (tree, gc, aliases_id, targ); + + /* printf ("vms: %s (%p) -> %.*s\n", name, targ, id_len, id_str); */ +} + +/* Do VMS specific stuff on builtins: disable the ones that are not + standard, mangle names. */ + +void +vms_patch_builtins (void) +{ + /* enum built_in_function bi; */ + unsigned int i; + + /* Fwrite on VMS is non-standard. */ + implicit_built_in_decls[(int) BUILT_IN_FWRITE] = NULL_TREE; + implicit_built_in_decls[(int) BUILT_IN_FWRITE_UNLOCKED] = NULL_TREE; + + /* Define aliases for names. */ + for (i = 0; i < NBR_CRTL_NAMES; i++) + { + const struct vms_crtl_name *n = &vms_crtl_names[i]; + char res[VMS_CRTL_MAXLEN + 3 + 9 + 1 + 1]; + int rlen; + int nlen; + + /* Add the dec-c prefix. */ + memcpy (res, "decc$", 5); + rlen = 5; + + if (n->flags & VMS_CRTL_BSD44) + { + memcpy (res + rlen, "__bsd44__", 9); + rlen += 9; + } + + if (n->flags & VMS_CRTL_FLOAT) + res[rlen++] = 't'; + + if (n->flags & VMS_CRTL_PRNTF) + res[rlen++] = 'x'; + + nlen = strlen (n->name); + memcpy (res + rlen, n->name, nlen); + + if ((n->flags & VMS_CRTL_64) == 0) + vms_add_crtl_xlat (n->name, nlen, res, rlen + nlen); + else + { + char alt[VMS_CRTL_MAXLEN + 3]; + bool use_64; + + /* Add three translations: + _X32 -> X + _X64 -> _X64 + X -> X if short, _X64 if long. */ + alt[0] = '_'; + memcpy (alt + 1, n->name, nlen); + alt[1 + nlen + 0] = '3'; + alt[1 + nlen + 1] = '2'; + alt[1 + nlen + 2] = 0; + vms_add_crtl_xlat (alt, nlen + 3, res, rlen + nlen); + + use_64 = (((n->flags & VMS_CRTL_64) && POINTER_SIZE == 64) + || ((n->flags & VMS_CRTL_MALLOC) + && TARGET_MALLOC64)); + if (!use_64) + vms_add_crtl_xlat (n->name, nlen, res, rlen + nlen); + + res[rlen++] = '_'; + memcpy (res + rlen, n->name, nlen); + res[rlen + nlen + 0] = '6'; + res[rlen + nlen + 1] = '4'; + + if (use_64) + vms_add_crtl_xlat (n->name, nlen, res, rlen + nlen + 2); + + alt[1 + nlen + 0] = '6'; + alt[1 + nlen + 1] = '4'; + vms_add_crtl_xlat (alt, nlen + 3, res, rlen + nlen + 2); + } + } +} + +#include "gt-vms.h" Index: gcc/config/vms/vms-crtl.h =================================================================== --- gcc/config/vms/vms-crtl.h (revision 175520) +++ gcc/config/vms/vms-crtl.h (working copy) @@ -1,191 +0,0 @@ -/* Definitions of target machine GNU compiler. 32bit VMS version. - Copyright (C) 2009, 2010 Free Software Foundation, Inc. - Contributed by Douglas B Rupp (rupp@gnat.com). - -This file is part of GCC. - -GCC 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, or (at your option) -any later version. - -GCC 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. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -. */ - -/* - Correlation array of standard CRTL names with DECCRTL - function names. Currently contains only a partial list, - e.g. those functions use in GNAT and GCC - - Note: Please keep in alphabetical order. -*/ - -#define CRTL_NAMES \ -{ \ -{"_calloc32", "decc$calloc", 0}, \ -{"_malloc32", "decc$malloc", 0}, \ -{"_realloc32", "decc$realloc", 0}, \ -{"_strdup32", "decc$strdup", 0}, \ -{"abs", "decc$abs", 0}, \ -{"abort", "decc$abort", 0}, \ -{"access", "decc$access", 0}, \ -{"accept", "decc$accept", 0}, \ -{"acos", "decc$tacos", 0}, \ -{"alarm", "decc$alarm", 0}, \ -{"asin", "decc$tasin", 0}, \ -{"atan", "decc$tatan", 0}, \ -{"atan2", "decc$tatan2", 0}, \ -{"atexit", "decc$atexit", 0}, \ -{"atoi", "decc$atoi", 0}, \ -{"atoll", "decc$atoll", 0}, \ -{"atoq", "decc$atoq", 0}, \ -{"basename", "decc$basename", 0}, \ -{"bcmp", "decc$bcmp", 0}, \ -{"bcopy", "decc$bcopy", 0}, \ -{"bsearch", "decc$bsearch", 0}, \ -{"bzero", "decc$bzero", 0}, \ -{"calloc", "decc$calloc", 0}, \ -{"ceil", "decc$tceil", 0}, \ -{"chdir", "decc$chdir", 0}, \ -{"chown", "decc$chown", 0}, \ -{"clearerr", "decc$clearerr", 0}, \ -{"clock", "decc$clock", 0}, \ -{"close", "decc$close", 0}, \ -{"cos", "decc$tcos", 0}, \ -{"connect", "decc$connect", 0}, \ -{"ctime", "decc$ctime", 0}, \ -{"dup", "decc$dup", 0}, \ -{"dup2", "decc$dup2", 0}, \ -{"exit", "decc$exit", 0}, \ -{"exp", "decc$texp", 0}, \ -{"fabs", "decc$tfabs", 0}, \ -{"fclose", "decc$fclose", 0}, \ -{"fdopen", "decc$fdopen", 0}, \ -{"fgetc", "decc$fgetc", 0}, \ -{"fgets", "decc$fgets", 0}, \ -{"fflush", "decc$fflush", 0}, \ -{"ffs", "decc$ffs", 0}, \ -{"floor", "decc$tfloor", 0}, \ -{"fopen", "decc$fopen", 0}, \ -{"fputc", "decc$fputc", 0}, \ -{"fputs", "decc$fputs", 0}, \ -{"free", "decc$free", 0}, \ -{"fread", "decc$fread", 0}, \ -{"freopen", "decc$freopen", 0}, \ -{"fseek", "decc$fseek", 0}, \ -{"ftell", "decc$ftell", 0}, \ -{"fwrite", "decc$fwrite", 0}, \ -{"getcwd", "decc$getcwd", 0}, \ -{"getegid", "decc$getegid", 0}, \ -{"getenv", "decc$getenv", 0}, \ -{"geteuid", "decc$geteuid", 0}, \ -{"getgid", "decc$getgid", 0}, \ -{"gethostbyaddr","decc$gethostbyaddr",0}, \ -{"gethostbyname","decc$gethostbyname",0}, \ -{"getpagesize", "decc$getpagesize", 0}, \ -{"getpid", "decc$getpid", 0}, \ -{"getservbyname","decc$getservbyname",0}, \ -{"getservbyport","decc$getservbyport",0}, \ -{"gettimeofday", "decc$gettimeofday", 0}, \ -{"getuid", "decc$getuid", 0}, \ -{"htons", "decc$htons", 0}, \ -{"iconv", "decc$iconv", 0}, \ -{"index", "decc$index", 0}, \ -{"isatty", "decc$isatty", 0}, \ -{"isdigit", "decc$isdigit", 0}, \ -{"kill", "decc$kill", 0}, \ -{"log", "decc$tlog", 0}, \ -{"log10", "decc$tlog10", 0}, \ -{"lseek", "decc$lseek", 0}, \ -{"ioctl", "decc$ioctl", 0}, \ -{"malloc", "decc$malloc", 0}, \ -{"mbstowcs", "decc$mbstowcs", 0}, \ -{"memchr", "decc$memchr", 0}, \ -{"memcmp", "decc$memcmp", 0}, \ -{"memcpy", "decc$memcpy", 0}, \ -{"memmove", "decc$memmove", 0}, \ -{"memset", "decc$memset", 0}, \ -{"mkstemp", "decc$mkstemp", 0}, \ -{"mktemp", "decc$mktemp", 0}, \ -{"mmap", "decc$mmap", 0}, \ -{"munmap", "decc$munmap", 0}, \ -{"nl_langinfo", "decc$nl_langinfo", 0}, \ -{"open", "decc$open", 0}, \ -{"pclose", "decc$pclose", 0}, \ -{"popen", "decc$popen", 0}, \ -{"pow", "decc$tpow", 0}, \ -{"printf", "decc$txprintf", 0}, \ -{"putenv", "decc$putenv", 0}, \ -{"puts", "decc$puts", 0}, \ -{"random", "decc$random", 0}, \ -{"read", "decc$read", 0}, \ -{"realloc", "decc$realloc", 0}, \ -{"recv", "decc$recv", 0}, \ -{"recvfrom", "decc$recvfrom", 0}, \ -{"recvmsg", "decc$__bsd44___recvmsg32", 0}, \ -{"rename", "decc$rename", 0}, \ -{"rewind", "decc$rewind", 0}, \ -{"rindex", "decc$rindex", 0}, \ -{"rmdir", "decc$rmdir", 0}, \ -{"send", "decc$send", 0}, \ -{"sendmsg", "decc$__bsd44___sendmsg32", 0}, \ -{"sendto", "decc$sendto", 0}, \ -{"setenv", "decc$setenv", 0}, \ -{"setlocale", "decc$setlocale", 0}, \ -{"setvbuf", "decc$setvbuf", 0}, \ -{"signal", "decc$signal", 0}, \ -{"sigsetmask", "decc$sigsetmask", 0}, \ -{"sin", "decc$tsin", 0}, \ -{"snprintf", "decc$txsnprintf", 0}, \ -{"socket", "decc$socket", 0}, \ -{"sqrt", "decc$tsqrt", 0}, \ -{"strcasecmp", "decc$strcasecmp", 0}, \ -{"strchr", "decc$strchr", 0}, \ -{"strcpy", "decc$strcpy", 0}, \ -{"strdup", "decc$strdup", 0}, \ -{"strerror", "decc$strerror", 0}, \ -{"strlen", "decc$strlen", 0}, \ -{"strncasecmp", "decc$strncasecmp", 0}, \ -{"strncmp", "decc$strncmp", 0}, \ -{"strncpy", "decc$strncpy", 0}, \ -{"strrchr", "decc$strrchr", 0}, \ -{"strstr", "decc$strstr", 0}, \ -{"strtod", "decc$tstrtod", 0}, \ -{"strtol", "decc$strtoll", 0}, \ -{"strtoul", "decc$strtoull", 0}, \ -{"sysconf", "decc$sysconf", 0}, \ -{"system", "decc$system", 0}, \ -{"tan", "decc$ttan", 0}, \ -{"time", "decc$time", 0}, \ -{"times", "decc$times", 0}, \ -{"tmpfile", "decc$tmpfile", 0}, \ -{"tmpnam", "decc$tmpnam", 0}, \ -{"ungetc", "decc$ungetc", 0}, \ -{"unlink", "decc$unlink", 0}, \ -{"umask", "decc$umask", 0}, \ -{"utime", "decc$utime", 0}, \ -{"wait", "decc$wait", 0}, \ -{"waitpid", "decc$waitpid", 0}, \ -{"wcswidth", "decc$wcswidth", 0}, \ -{"write", "decc$write", 0}, \ -{"vfprintf", "decc$txvfprintf", 0}, \ -{"vprintf", "decc$txvprintf", 0}, \ -{"vsprintf", "decc$txvsprintf", 0}, \ -{"vsnprintf", "decc$txvsnprintf", 0}, \ -{NULL, NULL, 0} \ -} - -/* Initialize of libfuncs that are 32/64 bit memory specific. */ - -#define MEM_LIBFUNCS_INIT \ -do { \ - memcpy_libfunc = init_one_libfunc ("decc$memcpy"); \ - memmove_libfunc = init_one_libfunc ("decc$memmove"); \ - memset_libfunc = init_one_libfunc ("decc$memset"); \ -} while (0) Index: gcc/config/vms/make-crtlmap.awk =================================================================== --- gcc/config/vms/make-crtlmap.awk (revision 0) +++ gcc/config/vms/make-crtlmap.awk (revision 0) @@ -0,0 +1,55 @@ +# Generate the VMS crtl map +# Copyright (C) 2011 Free Software Foundation, Inc. + +BEGIN { + is_first = 1; + maxlen=1; + maxlen_name="??" + prev="" + ORS="" +} + +# Remove comment and blank lines. +/^ *#/ || /^ *$/ { + next; +} + +{ + # Handle comma + if (!is_first) + print ",\n" + else + is_first = 0; + + # Check the map is sorted + if ($0 <= prev) + { + print "Map not sorted!! (with name " $0 ")\n" + exit 1 + } + prev = $0 + + # Compute the max of the identifier len. + l=length($1) + if (l > maxlen) + { + maxlen = l + maxlen_name = $1 + } + + print "{ \"" $1 "\", " + if (NF == 1) + print "0 }" + else if (NF == 2) + printf "VMS_CRTL_" $2 " }" + else if (NF == 3) + printf "VMS_CRTL_" $2 " | VMS_CRTL_" $3 " }" + else + # To be fixed. + exit 1 +} + +END { + print "\n\n" + print "#define VMS_CRTL_MAXLEN " maxlen " /*" maxlen_name " */\n" +} Index: gcc/config/vms/t-vms =================================================================== --- gcc/config/vms/t-vms (revision 175520) +++ gcc/config/vms/t-vms (working copy) @@ -35,3 +35,11 @@ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ -c -o $(T)pcrt0.o -DCRT0_POSIX_EXIT $(srcdir)/config/vms/vms-ucrt0.c +vms-crtlmap.h: $(srcdir)/config/vms/vms-crtlmap.map \ + $(srcdir)/config/vms/make-crtlmap.awk + $(AWK) -f $(srcdir)/config/vms/make-crtlmap.awk \ + $(srcdir)/config/vms/vms-crtlmap.map > $@ + +vms.o: $(srcdir)/config/vms/vms.c $(TREE_H) $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TM_P_H) vms-crtlmap.h + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< Index: gcc/config/ia64/vms.h =================================================================== --- gcc/config/ia64/vms.h (revision 175520) +++ gcc/config/ia64/vms.h (working copy) @@ -132,52 +132,6 @@ /* Maybe same as HPUX? Needs to be checked. */ #define JMP_BUF_SIZE (8 * 76) -typedef struct crtl_name_spec -{ - const char *const name; - const char *deccname; - int referenced; -} crtl_name_spec; - -#include "config/vms/vms-crtl.h" - -/* Alias CRTL names to 32/64bit DECCRTL functions. - Fixme: This should do a binary search. */ -#define DO_CRTL_NAMES \ - do \ - { \ - int i; \ - static crtl_name_spec vms_crtl_names[] = CRTL_NAMES; \ - static int malloc64_init = 0; \ - \ - if ((malloc64_init == 0) && TARGET_MALLOC64) \ - { \ - for (i=0; vms_crtl_names [i].name; i++) \ - { \ - if (strcmp ("calloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_calloc64"; \ - else \ - if (strcmp ("malloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_malloc64"; \ - else \ - if (strcmp ("realloc", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_realloc64"; \ - else \ - if (strcmp ("strdup", vms_crtl_names [i].name) == 0) \ - vms_crtl_names [i].deccname = "decc$_strdup64"; \ - } \ - malloc64_init = 1; \ - } \ - for (i=0; vms_crtl_names [i].name; i++) \ - if (!vms_crtl_names [i].referenced && \ - (strcmp (name, vms_crtl_names [i].name) == 0)) \ - { \ - fprintf (file, "\t.alias %s, \"%s\"\n", \ - name, vms_crtl_names [i].deccname); \ - vms_crtl_names [i].referenced = 1; \ - } \ - } while (0) - #undef SUBTARGET_OPTIMIZATION_OPTIONS #define SUBTARGET_OPTIMIZATION_OPTIONS \ { OPT_LEVELS_ALL, OPT_fmerge_constants, NULL, 0 } Index: gcc/config/ia64/ia64.c =================================================================== --- gcc/config/ia64/ia64.c (revision 175520) +++ gcc/config/ia64/ia64.c (working copy) @@ -10133,8 +10133,7 @@ /* Fwrite on VMS is non-standard. */ if (TARGET_ABI_OPEN_VMS) { - implicit_built_in_decls[(int) BUILT_IN_FWRITE] = NULL_TREE; - implicit_built_in_decls[(int) BUILT_IN_FWRITE_UNLOCKED] = NULL_TREE; + vms_patch_builtins (); } #define def_builtin(name, type, code) \ @@ -10263,10 +10262,6 @@ int need_visibility = ((*targetm.binds_local_p) (decl) && maybe_assemble_visibility (decl)); -#ifdef DO_CRTL_NAMES - DO_CRTL_NAMES; -#endif - /* GNU as does not need anything here, but the HP linker does need something for external functions. */ if ((TARGET_HPUX_LD || !TARGET_GNU_AS) Index: gcc/config/ia64/vms64.h =================================================================== --- gcc/config/ia64/vms64.h (revision 175520) +++ gcc/config/ia64/vms64.h (working copy) @@ -37,5 +37,3 @@ #undef TARGET_DEFAULT #define TARGET_DEFAULT (MASK_DWARF2_ASM | MASK_GNU_AS | MASK_MALLOC64) - -#include "config/vms/vms-crtl-64.h"