diff --git a/bin/hipgenisa.sh b/bin/hipgenisa.sh index ffad52393c..dcedfa174d 100755 --- a/bin/hipgenisa.sh +++ b/bin/hipgenisa.sh @@ -1,38 +1,62 @@ #!/bin/bash +function die { + echo "${1-Died}." >&2 + exit 1 +} + if [ $# = 0 ]; then - >&2 echo "$(basename $0): Invalid number of arguments" && exit 1 + die "$(basename $0): Invalid number of arguments" fi : ${ROCM_PATH:=/opt/rocm} : ${ROCM_TARGET:=fiji} -GEN_ISA=$1 -FILE_NAMES=$2 -OUT=$3 -OUTPUT_FILE=$4 +INPUT_FILES="" +OUTPUT_FILE="" +while [[ $# -gt 1 ]]; do + key="$1" + case $key in + -o) + OUTPUT_FILE="$2" + shift + ;; + *) + INPUT_FILES="$INPUT_FILES $key" + esac + shift +done + +[ INPUT_FILES != "" ] || die "No source files specified" +[ OUTPUT_FILE != "" ] || die "Output file not specified" SOURCE="${BASH_SOURCE[0]}" HIP_PATH="$( command cd -P "$( dirname "$SOURCE" )/.." && pwd )" export KMDUMPISA=1 export KMDUMPLLVM=1 -hipgenisa_dir=`mktemp -d --tmpdir=/tmp hip.XXXXXXXX`; -sed 's/extern \+"C" \+//g' $FILE_NAMES > $FILE_NAMES.kernel.tmp.cpp -echo " -int main(){} -" >> $FILE_NAMES.kernel.tmp.cpp -$HIP_PATH/bin/hipcc $FILE_NAMES.kernel.tmp.cpp -o $hipgenisa_dir/a.out +hipgenisa_dir=`mktemp -d --tmpdir=/tmp hip.XXXXXXXX` +hipgenisa_main=`mktemp src.XXXXXXXX.cpp` +hipgenisa_files="$hipgenisa_main" + +for inputfile in $INPUT_FILES; do + sed 's/extern \+"C" \+//g' $inputfile > $inputfile.kernel.tmp.cpp + hipgenisa_files="$hipgenisa_files $inputfile.kernel.tmp.cpp" +done +printf "\nint main(){}\n" >> $hipgenisa_main + +$HIP_PATH/bin/hipcc $hipgenisa_files -o $hipgenisa_dir/a.out mv dump.* $hipgenisa_dir $ROCM_PATH/hcc-lc/bin/llvm-mc -arch=amdgcn -mcpu=$ROCM_TARGET -filetype=obj $hipgenisa_dir/dump.isa -o $hipgenisa_dir/dump.o $ROCM_PATH/llvm/bin/clang -target amdgcn--amdhsa $hipgenisa_dir/dump.o -o $hipgenisa_dir/dump.co + map_sym="" kernels=$(objdump -t $hipgenisa_dir/dump.co | grep grid_launch_parm | sed 's/ \+/ /g; s/\t/ /g' | cut -d" " -f6) -for mangled_sym in $kernels -do +for mangled_sym in $kernels; do real_sym=$(c++filt $(c++filt _$mangled_sym | cut -d: -f3 | sed 's/_functor//g') | cut -d\( -f1) map_sym="--redefine-sym $mangled_sym=$real_sym $map_sym" done objcopy -F elf64-little $map_sym $hipgenisa_dir/dump.co $OUTPUT_FILE -rm $FILE_NAMES.kernel.tmp.cpp + +rm $hipgenisa_files rm -r $hipgenisa_dir