hipgenisa.sh: Refactor to handle multiple source files
Change-Id: Icc212c43b3bf8c33fb856cd6fc5be7bbebb38d42
This commit is contained in:
+38
-14
@@ -1,38 +1,62 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
function die {
|
||||||
|
echo "${1-Died}." >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
if [ $# = 0 ]; then
|
if [ $# = 0 ]; then
|
||||||
>&2 echo "$(basename $0): Invalid number of arguments" && exit 1
|
die "$(basename $0): Invalid number of arguments"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
: ${ROCM_PATH:=/opt/rocm}
|
: ${ROCM_PATH:=/opt/rocm}
|
||||||
: ${ROCM_TARGET:=fiji}
|
: ${ROCM_TARGET:=fiji}
|
||||||
|
|
||||||
GEN_ISA=$1
|
INPUT_FILES=""
|
||||||
FILE_NAMES=$2
|
OUTPUT_FILE=""
|
||||||
OUT=$3
|
while [[ $# -gt 1 ]]; do
|
||||||
OUTPUT_FILE=$4
|
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]}"
|
SOURCE="${BASH_SOURCE[0]}"
|
||||||
HIP_PATH="$( command cd -P "$( dirname "$SOURCE" )/.." && pwd )"
|
HIP_PATH="$( command cd -P "$( dirname "$SOURCE" )/.." && pwd )"
|
||||||
|
|
||||||
export KMDUMPISA=1
|
export KMDUMPISA=1
|
||||||
export KMDUMPLLVM=1
|
export KMDUMPLLVM=1
|
||||||
hipgenisa_dir=`mktemp -d --tmpdir=/tmp hip.XXXXXXXX`;
|
hipgenisa_dir=`mktemp -d --tmpdir=/tmp hip.XXXXXXXX`
|
||||||
sed 's/extern \+"C" \+//g' $FILE_NAMES > $FILE_NAMES.kernel.tmp.cpp
|
hipgenisa_main=`mktemp src.XXXXXXXX.cpp`
|
||||||
echo "
|
hipgenisa_files="$hipgenisa_main"
|
||||||
int main(){}
|
|
||||||
" >> $FILE_NAMES.kernel.tmp.cpp
|
for inputfile in $INPUT_FILES; do
|
||||||
$HIP_PATH/bin/hipcc $FILE_NAMES.kernel.tmp.cpp -o $hipgenisa_dir/a.out
|
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
|
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/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
|
$ROCM_PATH/llvm/bin/clang -target amdgcn--amdhsa $hipgenisa_dir/dump.o -o $hipgenisa_dir/dump.co
|
||||||
|
|
||||||
map_sym=""
|
map_sym=""
|
||||||
kernels=$(objdump -t $hipgenisa_dir/dump.co | grep grid_launch_parm | sed 's/ \+/ /g; s/\t/ /g' | cut -d" " -f6)
|
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
|
for mangled_sym in $kernels; do
|
||||||
do
|
|
||||||
real_sym=$(c++filt $(c++filt _$mangled_sym | cut -d: -f3 | sed 's/_functor//g') | cut -d\( -f1)
|
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"
|
map_sym="--redefine-sym $mangled_sym=$real_sym $map_sym"
|
||||||
done
|
done
|
||||||
objcopy -F elf64-little $map_sym $hipgenisa_dir/dump.co $OUTPUT_FILE
|
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
|
rm -r $hipgenisa_dir
|
||||||
|
|||||||
Fai riferimento in un nuovo problema
Block a user