Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > by-pkgid > 262285d4422e3b979c3773e423a18bb7 > files > 16

cross-avr-binutils-2.20.51.0.4-1mnb2.src.rpm

#!/bin/sh 

# (C)Copyright                                                    
# Sony Computer Entertainment, Inc.,                              
# 2005,2005.  All rights reserved.                                

#
# Embed SPE ELF executable into PPE object file, and define a
# global pointer variable refering to the embedded file.
#
# Usage: embedspu [flags] symbol_name input_filename output_filename
#
#        input_filename:  SPE ELF executable to be embedded
#        output_filename: Resulting PPE object file
#        symbol_name:     Name of global pointer variable to be defined
#        flags:           GCC flags defining PPE object file format
#                         (e.g. -m32 or -m64)
#

# Determine location of dependent utilities
file=`basename "$0"`
dir=`dirname "$0"`
[ "${file#ppu-}" != "$file" ] && PREFIX=ppu-

PPU_GCC=${PREFIX}gcc
SPU_READELF=spu-readelf

which $PPU_GCC > /dev/null 2>&1
if [ $? -eq 0 ]
then
	:
elif [ -a ${dir}/$PPU_GCC ]
then
	PPU_GCC=${dir}/$PPU_GCC
elif [ -a /opt/cell/ppu/bin/$PPU_GCC ]
then
	PPU_GCC=/opt/cell/ppu/bin/$PPU_GCC
else
	echo Cannot find $PPU_GCC.
	exit 1
fi

which $SPU_READELF > /dev/null 2>&1
if [ $? -eq 0 ]
then
	:
elif [ -a ${dir}/$SPU_READELF ]
then
	SPU_READELF=${dir}/$SPU_READELF
elif [ -a /opt/cell/spu/bin/$SPU_READELF ]
then
	SPU_READELF=/opt/cell/spu/bin/$SPU_READELF
else
	echo Cannot find $SPU_READELF.
	exit 1
fi

# Argument parsing
SYMBOL=
INFILE=
OUTFILE=
FLAGS=

while [ -n "$1" ]; do
  case $1 in
    -*) FLAGS="${FLAGS} $1"
	shift ;;
    *)  if [ -z $SYMBOL ]; then
	  SYMBOL=$1
	elif [ -z $INFILE ]; then
	  INFILE=$1
	elif [ -z $OUTFILE ]; then
	  OUTFILE=$1
	fi
	shift ;;
  esac
done

if [ -z "$SYMBOL" -o -z "$INFILE" -o -z "$OUTFILE" ]; then
  echo "Usage: $0 [symbol_name] [input_filename] [output_filename]"
  exit 1
fi

if [ ! -e "$INFILE" ]; then
  echo "${INFILE}: File not found"
  exit 1
fi

${PPU_GCC} ${FLAGS} -x assembler-with-cpp -nostartfiles -nostdlib \
	-Wl,-r -Wl,-x -o ${OUTFILE} - <<EOF
.section .rodata.speelf,"a",@progbits
.p2align 7
__speelf__:
.incbin "${INFILE}"

.section .data.spetoe,"aw",@progbits
.p2align 7
__spetoe__:
`${SPU_READELF} -s ${INFILE} | egrep ' _EAR_' | sort -k 2 | awk \
'$8 == "_EAR_" { \
	print "#ifdef _LP64"; \
	print ".quad __speelf__"; \
	print ".quad 0"; \
	print "#else"; \
	print ".int 0"; \
	print ".int __speelf__"; \
	print ".int 0"; \
	print ".int 0"; \
	print "#endif"; \
} \
$8 != "_EAR_" { \
	print "#ifdef _LP64"; \
	print ".quad " substr($8, 6); \
	print ".quad 0"; \
	print "#else"; \
	print ".int 0"; \
	print ".int " substr($8, 6); \
	print ".int 0"; \
	print ".int 0"; \
	print "#endif"; \
}'`

.section .data,"aw",@progbits
.globl ${SYMBOL}
${SYMBOL}:
# fill in a struct spe_program_handle
#ifdef _LP64
.int 24
.int 0
.quad __speelf__
.quad __spetoe__
#else
.int 12
.int __speelf__
.int __spetoe__
#endif
EOF