220 lines
7.1 KiB
Tcsh
220 lines
7.1 KiB
Tcsh
#################################################################
|
|
# #
|
|
# Copyright 2008, 2011 Fidelity Information Services, Inc #
|
|
# #
|
|
# This source code contains the intellectual property #
|
|
# of its copyright holder(s), and is made available #
|
|
# under a license. If you do not know the terms of #
|
|
# the license, please stop and do not read further. #
|
|
# #
|
|
#################################################################
|
|
|
|
# Most of the logic in this script is similar to its counter-part on sr_ia64
|
|
# Any changes or bugfixes in this files should be updated in its couterpart on sr_ia64
|
|
|
|
# This script is called from two places. If it is called from comlist.mk,it takes source directories as arguments.
|
|
# else it is called from comlist.csh with no arguments.
|
|
if ( $#argv != 0 ) then
|
|
set builds=$buildtypes
|
|
set numbuilds=$#builds
|
|
if ( 1 != $numbuilds ) then
|
|
echo "sr_x86_64/gen_xfer_desc.csh-E-2many: only one buildtype at a time allowed"
|
|
exit 2
|
|
endif
|
|
cd $gtm_ver/$buildtypes/obj
|
|
set lib_count=$#argv
|
|
set ref_libs=""
|
|
|
|
while ( $lib_count != 0 )
|
|
set ref_libs="$ref_libs $argv[$lib_count]"
|
|
@ lib_count--
|
|
end
|
|
|
|
set gtm_src_types = "c m64 s msg"
|
|
set gtm_inc_types = "h max mac si"
|
|
set xfer_dir=`pwd`
|
|
|
|
if (-e src) then
|
|
\rm -rf src
|
|
endif
|
|
|
|
if (-e inc ) then
|
|
\rm -rf inc
|
|
endif
|
|
# Create temporary directories called src and inc
|
|
mkdir src inc
|
|
|
|
pushd $gtm_ver
|
|
|
|
# Following "foreach" logic comes from cms_load.csh
|
|
foreach ref_library ( $ref_libs )
|
|
cd $ref_library
|
|
foreach dir (src inc)
|
|
foreach ftype (`set | grep "^gtm_${dir}_t" | sed 's/^gtm_'$dir'_types[ ][ ]*//g'`)
|
|
set nfiles = `\ls -1 | grep "\.$ftype"'$' | wc -l | sed 's/^[ ]*//g'`
|
|
if ($nfiles != 0) then
|
|
#creates the links for all specific files in src and inc directory.
|
|
\ls -1 | grep "\.$ftype"'$' | xargs -i ln -f -s "$PWD/{}" $xfer_dir/${dir}
|
|
endif
|
|
end
|
|
end
|
|
cd ..
|
|
end
|
|
|
|
popd
|
|
setenv gtm_src `pwd`/src
|
|
setenv gtm_inc `pwd`/inc
|
|
setenv gt_cc_option_I "$gt_cc_option_I -I$gtm_inc"
|
|
rm -rf $xfer_dir/xfer_desc.i
|
|
else
|
|
# set xfer_desc.i path to $gtm_inc in normal build
|
|
set xfer_dir=$gtm_inc
|
|
|
|
# If this is a non-developmental version and the current image is "dbg" and xfer_desc.i already exists, do not
|
|
# recreate xfer_desc.i. The assumption is that a "pro" build had already created xfer_desc.i so we should not
|
|
# change whatever it had relied upon. For development versions, we dont care so we unconditionally recreate this file.
|
|
|
|
if (-e $xfer_dir/xfer_desc.i) then
|
|
if ($gtm_verno !~ V9*) then
|
|
echo "GENXFERDESC-I-EXIST : xfer_desc.i already exists for production version $gtm_verno. Not recreating."
|
|
exit 0
|
|
else
|
|
echo "GENXFERDESC-I-EXIST : xfer_desc.i already exists for development version $gtm_verno. Recreating."
|
|
chmod +w $xfer_dir/xfer_desc.i # in case previous build had reset permissions to be read-only
|
|
rm -f $xfer_dir/xfer_desc.i
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
cd $gtm_src
|
|
|
|
\rm -f temp_xyz_ia.* >&! /dev/null
|
|
cat << TEST >! temp_xyz_ia.c
|
|
/* We have not yet created gtm_threadgbl_deftypes.h and don't need it, signal gtm_threadgbl.h to avoid including it */
|
|
#define NO_THREADGBL_DEFTYPES
|
|
#include "mdef.h"
|
|
#define XFER(a,b) MY_XF,b
|
|
#include "xfer.h"
|
|
TEST
|
|
|
|
$gt_cc_compiler $gt_cc_option_I -E temp_xyz_ia.c >! temp_xyz_ia.1
|
|
awk -F , '/MY_XF/ {print $2}' temp_xyz_ia.1 >! temp_xyz_ia.2
|
|
|
|
cat >> $xfer_dir/xfer_desc.i << EOF
|
|
/* Generated by gen_xfer_desc.csh */
|
|
#define GTM_C_RTN 1
|
|
#define GTM_ASM_RTN 2
|
|
#define GTM_C_VAR_ARGS_RTN 3
|
|
#define DEFINE_XFER_TABLE_DESC char xfer_table_desc[] = \\
|
|
{ \\
|
|
EOF
|
|
|
|
# On X86_64, the calling convention for variable length functions defines that the register $RAX
|
|
# (ie the lower 8 bytes of this register actually) will contain the # of floating point arguments passed to that function.
|
|
# $RAX is not an argument register normally and so is typically unused (and also is not expected to be preserved across calls).
|
|
# since none of the XFER functions actually take double/float arguments, but some are variable length functions,
|
|
# the generated code should set the $RAX register to the value '0'.
|
|
# Theoritically this register can be set to 0 all the time during a function call.
|
|
# But to optimize the number of generated instructions, identify which XFER function is actually a var arg function
|
|
# And if the logic to identify it falls thro, blindly assume its a VAR_ARG function.
|
|
# Hence the logic below might incorrectly mark a few functions like op_sub, op_fnzascii as C_VAR_ARGS. But that is okay.
|
|
|
|
foreach name (`cat temp_xyz_ia.2`)
|
|
set name2 = `grep "^$name" *.s`
|
|
if (-r ${name}.s) then
|
|
set ftype = "GTM_ASM_RTN"
|
|
else if (-r ${name}.c) then
|
|
grep $name $gtm_src/${name}.c | grep "\.\.\." >> /dev/null
|
|
if ( $? == 0 ) then
|
|
set ftype = "GTM_C_VAR_ARGS_RTN"
|
|
else
|
|
set ftype = "GTM_C_RTN"
|
|
endif
|
|
else if ("${name2}" != "") then
|
|
set ftype = "GTM_ASM_RTN"
|
|
else if ("${name2}" == "") then
|
|
set ftype = "GTM_C_VAR_ARGS_RTN"
|
|
endif
|
|
echo "$ftype, /* $name */ \\" >> $xfer_dir/xfer_desc.i
|
|
# print the #defines in a temp file to append to $xfer_dir/xfer_desc.i later.
|
|
# This is done to avoid the whole loop once again.
|
|
echo "#define ${name}_FUNCTYPE $ftype" >> temp_xyz_ia.defines
|
|
end
|
|
echo "0}" >> $xfer_dir/xfer_desc.i
|
|
echo " " >> $xfer_dir/xfer_desc.i
|
|
|
|
# The defines used in resetting xfer_table_desc needs to be generated only for ia64
|
|
set mach_type = `uname -m`
|
|
if ( "ia64" == "$mach_type") then
|
|
echo "/* Defines used in resetting xfer_table_desc on transfer table changes */" >> $xfer_dir/xfer_desc.i
|
|
|
|
# Guess what! Its possible for xfer_table to be intialized by funtions others than
|
|
# then the ones in xfer.h. So append those names explicitly here
|
|
cat >> temp_xyz_ia.3 << EOF
|
|
op_fnzreverse
|
|
op_zst_st_over
|
|
op_zst_fet_over
|
|
op_zstzb_fet_over
|
|
op_zstzb_st_over
|
|
opp_zstepret
|
|
opp_zstepretarg
|
|
op_zstepfetch
|
|
op_zstepstart
|
|
op_zstzbfetch
|
|
op_zstzbstart
|
|
opp_zst_over_ret
|
|
opp_zst_over_retarg
|
|
op_fetchintrrpt
|
|
op_startintrrpt
|
|
op_forintrrpt
|
|
op_mprofextexfun
|
|
op_mprofextcall
|
|
op_mprofcalll
|
|
op_mprofcallb
|
|
op_mprofcallw
|
|
op_mprofcallspl
|
|
op_mprofcallspb
|
|
op_mprofcallspw
|
|
op_mprofexfun
|
|
op_mprofforlcldow
|
|
op_mprofforlcldol
|
|
op_mprofforlcldob
|
|
op_mprofforchk1
|
|
op_mproflinefetch
|
|
op_mproflinestart
|
|
EOF
|
|
|
|
foreach name (`cat temp_xyz_ia.3`)
|
|
set name2 = `grep "^$name" *.s`
|
|
if (-r ${name}.s) then
|
|
set ftype = "GTM_ASM_RTN"
|
|
else if (-r ${name}.c) then
|
|
grep $name $gtm_inc/* | grep "\.\.\." >> /dev/null
|
|
if ( $? == 0 ) then
|
|
set ftype = "GTM_C_VAR_ARGS_RTN"
|
|
else
|
|
set ftype = "GTM_C_RTN"
|
|
endif
|
|
else if ("${name2}" != "") then
|
|
set ftype = "GTM_ASM_RTN"
|
|
else if ("${name2}" == "") then
|
|
set ftype = "GTM_C_VAR_ARGS_RTN"
|
|
endif
|
|
echo "#define ${name}_FUNCTYPE $ftype" >> temp_xyz_ia.defines
|
|
end
|
|
# Append the defines to the end of $xfer_dir/xfer_desc.i
|
|
cat temp_xyz_ia.defines >> $xfer_dir/xfer_desc.i
|
|
echo
|
|
endif
|
|
|
|
\rm temp_xyz_ia.*
|
|
|
|
if ($#argv != 0) then
|
|
cd $xfer_dir
|
|
\rm -rf src
|
|
\rm -rf inc
|
|
endif
|
|
|
|
exit 0
|
|
|