diff --git a/config/ompi_config_asm.m4 b/config/ompi_config_asm.m4 index d101dccd58..9b3f08c9cd 100644 --- a/config/ompi_config_asm.m4 +++ b/config/ompi_config_asm.m4 @@ -139,7 +139,7 @@ AC_DEFUN([OMPI_CHECK_ASM_GSYM],[ AC_MSG_CHECKING([prefix for global symbol labels]) ompi_cv_asm_gsym="none" - for sym in "_" "" ; do + for sym in "_" "" "." ; do asm_result=0 echo "configure: trying $sym" >& AC_FD_CC cat > conftest_c.c <conftest.out 2>&1 ; then + if grep "$ompi_cv_asm_arch" "${top_ompi_srcdir}/src/asm/asm-data.txt" | grep -F "$ompi_cv_asm_format" >conftest.out 2>&1 ; then ompi_cv_asm_file="`cut -f3 conftest.out`" if test ! "$ompi_cv_asm_file" = "" ; then ompi_cv_asm_file="atomic-${ompi_cv_asm_file}.s" diff --git a/src/asm/Makefile.am b/src/asm/Makefile.am index 7359325ea0..c741b3ba1d 100644 --- a/src/asm/Makefile.am +++ b/src/asm/Makefile.am @@ -51,7 +51,9 @@ noinst_LTLIBRARIES = libasm.la EXTRA_DIST = \ asm-data.txt \ generate-asm.pl \ - generate-all-asm.sh \ + generate-all-asm.pl \ + base/aix.conf \ + base/default.conf \ base/AMD64.asm \ base/IA32.asm \ base/POWERPC32.asm \ @@ -72,4 +74,4 @@ maintainer-clean-local: # dist-hook: mkdir ${distdir}/generated - sh generate-all-asm.sh "$(PERL)" "$(srcdir)" "$(distdir)" + $(PERL) generate-all-asm.pl "$(PERL)" "$(srcdir)" "$(distdir)" diff --git a/src/asm/asm-data.txt b/src/asm/asm-data.txt index b30eff6d5f..6e50fe1ac3 100644 --- a/src/asm/asm-data.txt +++ b/src/asm/asm-data.txt @@ -19,10 +19,13 @@ # FORMAT: # ARCHITECTURE ASSEMBLY FORMAT BASE FILENAME # +# Assembly Format field: +# config_file-text-global-label_suffix-gsym-lsym-type-size-align_log-ppc_r_reg-64_bit -AMD64 .text-.globl-:--.L-@-1-0-1-0 amd64-linux -IA32 .text-.globl-:--.L-@-1-0-1-0 ia32-linux -POWERPC32 .text-.globl-:-_-L--0-1-1-0 powerpc32-osx -POWERPC32 .text-.globl-:-_-L--0-1-1-1 powerpc32-64-osx -POWERPC32 .text-.globl-:--.L-@-1-1-0-0 powerpc32-linux -POWERPC64 .text-.globl-:-_-L--0-1-1-1 powerpc64-osx +AMD64 default-.text-.globl-:--.L-@-1-0-1-0 amd64-linux +IA32 default-.text-.globl-:--.L-@-1-0-1-0 ia32-linux +POWERPC32 default-.text-.globl-:-_-L--0-1-1-0 powerpc32-osx +POWERPC32 default-.text-.globl-:-_-L--0-1-1-1 powerpc32-64-osx +POWERPC32 default-.text-.globl-:--.L-@-1-1-0-0 powerpc32-linux +POWERPC32 aix-.csect .text[PR]-.globl-:-.-L--0-0-0-0 powerpc32-aix +POWERPC64 default-.text-.globl-:-_-L--0-1-1-1 powerpc64-osx diff --git a/src/asm/base/aix.conf b/src/asm/base/aix.conf new file mode 100644 index 0000000000..f42a460c57 --- /dev/null +++ b/src/asm/base/aix.conf @@ -0,0 +1,41 @@ +sub start_file() +{ + my $ret= "\t.toc\n"; + if ($IS64BIT == 1) { + $ret .= "\t.machine \"ppc64\"\n"; + } + return $ret; +} + + +sub start_func($) +{ + my $func_name = shift; + my $ret = ""; + + $ret = "\t$GLOBAL $func_name\n"; + $ret .= "\t$GLOBAL $GSYM$func_name\n"; + $ret .= "\t.csect [DS],3\n"; + + $ret .= "$func_name$SUFFIX\n"; + + if ($IS64BIT == 1) { + $ret .= "\t.llong .$1, TOC[tc0], 0\n"; + } else { + $ret .= "\t.long .$1, TOC[tc0], 0\n"; + } + $ret .= "\t.csect [PR]\n"; + + $ret .= "\t.align 2\n"; + $ret .= "$GSYM$func_name$SUFFIX\n"; + + return $ret; +} + + +sub end_func($) +{ + return ""; +} + +1 diff --git a/src/asm/base/default.conf b/src/asm/base/default.conf new file mode 100644 index 0000000000..81195afd1c --- /dev/null +++ b/src/asm/base/default.conf @@ -0,0 +1,34 @@ +sub start_file +{ + return ""; +} + + +sub start_func($) +{ + my $func_name = shift; + my $ret = ""; + + $ret = "\t$GLOBAL $GSYM$func_name\n"; + if (! $TYPE eq "") { + $ret .= "\t.type $func_name, $TYPE" . "function\n"; + } + $ret .= "$GSYM$func_name$SUFFIX\n"; + + return $ret; +} + + +sub end_func($) +{ + my $func_name = shift; + my $ret = ""; + + if ($SIZE != 0) { + $ret = "\t.size $func_name, .-$func_name\n"; + } + + return $ret; +} + +1 diff --git a/src/asm/generate-all-asm.pl b/src/asm/generate-all-asm.pl new file mode 100644 index 0000000000..ee081d3836 --- /dev/null +++ b/src/asm/generate-all-asm.pl @@ -0,0 +1,27 @@ +#!/usr/bin/perl -w + +my $perl = shift; +my $srcdir = shift; +my $destdir = shift; + +if (! $perl || ! $srcdir || ! $destdir) { + print "ERROR: invalid argument to generate-all-asm.pl"; + print "usage: generate-all-asm.pl [PERL] [SRCDIR] [DESTDIR]"; + exit 1; +} + +open(DATAFILE, "$srcdir/asm-data.txt") || die "Could not open data file: $!\n"; + +my $ASMARCH = ""; +my $ASMFORMAT = ""; +my $ASMFILE = ""; + +while() { + if (/^#/) { next; } + ($ASMARCH, $ASMFORMAT, $ASMFILE) = /(.*)\t(.*)\t(.*)/; + if (! $ASMARCH || ! $ASMFORMAT) { next; } + + print "--> Generating assembly for \"$ASMARCH\" \"$ASMFORMAT\"\n"; + system("$perl generate-asm.pl \"$ASMARCH\" \"$ASMFORMAT\" \"$srcdir/base\" \"$destdir/generated/atomic-$ASMFILE.s\""); + +} diff --git a/src/asm/generate-all-asm.sh b/src/asm/generate-all-asm.sh deleted file mode 100644 index 6eba4aa3ad..0000000000 --- a/src/asm/generate-all-asm.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -perl="$1" -srcdir="$2" -destdir="$3" -ret=0 - -if test "$perl" = "" -o "$srcdir" = "" -o "$destdir" = "" ; then - echo "ERROR: invalid argument to generate-all-asm.sh" - echo "usage: generate-all-asm.sh [PERL] [SRCDIR] [DESTDIR]" - exit 1 -fi - -for asmarch in `grep -v '^#' "$srcdir/asm-data.txt" | cut -f1 | xargs` ; do - if test ! -f "${srcdir}/base/${asmarch}.asm" ; then - echo "WARNING: Skipping missing assembly arch ${asmarch}" - continue - fi - - for asmformat in `grep $asmarch "$srcdir/asm-data.txt" | cut -f2 | xargs` ; do - echo "--> Generating assembly for $asmarch $asmformat" - output="`grep \"$asmarch.*$asmformat\" $srcdir/asm-data.txt | cut -f3`" - $perl generate-asm.pl "$asmarch" "$asmformat" "$srcdir/base" "$destdir/generated/atomic-$output.s" - if test "$?" != "0" ; then - echo "WARNING: Failed to generate assembly for $asmarch $asmformat" - ret=1 - fi - done -done - -exit $ret diff --git a/src/asm/generate-asm.pl b/src/asm/generate-asm.pl index a53e9b60e6..34d825118b 100644 --- a/src/asm/generate-asm.pl +++ b/src/asm/generate-asm.pl @@ -15,23 +15,36 @@ open(INPUT, "$basedir/$asmarch.asm") || die "Could not open $basedir/$asmarch.asm: $!\n"; open(OUTPUT, ">$output") || die "Could not open $output: $1\n"; -my $TEXT = ""; -my $GLOBAL = ""; -my $SUFFIX = ""; -my $GSYM = ""; -my $LSYM = ""; -my $TYPE = ""; -my $SIZE = 0; -my $ALIGN_LOG = 0; -my $DEL_R_REG = 0; -my $IS64BIT = 0; +$CONFIG = "default"; +$TEXT = ""; +$GLOBAL = ""; +$SUFFIX = ""; +$GSYM = ""; +$LSYM = ""; +$TYPE = ""; +$SIZE = 0; +$ALIGN_LOG = 0; +$DEL_R_REG = 0; +$IS64BIT = 0; -($TEXT, $GLOBAL, $SUFFIX, $GSYM, $LSYM, $TYPE, $SIZE, $ALIGN_LOG, $DEL_R_REG, $IS64BIT) = ( - $asmformat =~ /(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)/); +($CONFIG, $TEXT, $GLOBAL, $SUFFIX, $GSYM, $LSYM, $TYPE, $SIZE, $ALIGN_LOG, $DEL_R_REG, $IS64BIT) = ( + $asmformat =~ /(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)\-(.*)/); + +if (0) { +print "CONFIG: $CONFIG\n"; +print "TEXT: $TEXT\n"; +print "GLOBAL: $GLOBAL\n"; +print "SUFFIX: $SUFFIX\n"; +print "GSYM: $GSYM\n"; +print "LSYM: $LSYM\n"; +} my $current_func = ""; my $delete = 0; +# load our configuration +do "$basedir/$CONFIG.conf" or die "Could not open config file $basedir/$CONFIG.conf: $!\n"; + while () { s/TEXT/$TEXT/g; s/GLOBAL/$GLOBAL/g; @@ -41,22 +54,18 @@ while () { s/r([0-9][0-9]?)/$1/g; } + if (/START_FILE/) { + $_ = start_file(); + } + if (/START_FUNC\((.*)\)/) { $current_func = $1; - $_ = "\t$GLOBAL $GSYM$current_func\n"; - if (! $TYPE eq "") { - $_ .= "\t.type $current_func, $TYPE" . "function\n"; - } - $_ .= "$GSYM$current_func$SUFFIX\n"; + $_ = start_func($current_func); } if (/END_FUNC\((.*)\)/) { - s/END_FUNC\((.*)\)//g; - if ($SIZE != 0) { - $_ = "\t.size $current_func, .-$current_func\n"; - } else { - chomp; - } + $current_func = $1; + $_ = end_func($current_func); } if ($ALIGN_LOG == 0) {