diff --git a/lib/clamp-device.in b/lib/clamp-device.in index 6742366c4b6..ce86685cea0 100755 --- a/lib/clamp-device.in +++ b/lib/clamp-device.in @@ -34,6 +34,9 @@ KMOPTLLC="${KMOPTLLC:="-O2"}" # enable LLVM hijacking KMHACKLLVM="${KMHACKLLVM:=0}" +# enable ISA hijacking +KMHACKISA="${KMHACKISA:=0}" + # enable ThinLTO KMTHINLTO="${KMTHINLTO:=0}" @@ -68,6 +71,7 @@ LLC=$BINDIR/llc LINK=$BINDIR/llvm-link LIB=$BINDIR/../lib LLD=$BINDIR/ld.lld +MC=$BINDIR/llvm-mc ################ @@ -128,6 +132,10 @@ do KMDUMPDIR="${ARG#*=}" continue ;; + --input-filename=*) + INPUT_FILENAME="${ARG#*=}" + continue + ;; esac done @@ -230,34 +238,56 @@ if [ $KMDUMPLLVM == "1" ]; then cp $2.opt.bc ${KMDUMPDIR}/dump-$AMDGPU_TARGET.opt.bc fi - # Disable code object v3, generate code object v2 for now CODE_OBJECT_FORMAT="-mattr=-code-object-v3" -if [ $KMTHINLTO == "1" ]; then - $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ - $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=obj -o $2 $2.opt.bc -else - $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ - $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=obj -o $2.isabin $2.opt.bc -fi - -# error handling for llc -RETVAL=$? -if [ $RETVAL != 0 ]; then - echo "Generating AMD GCN kernel failed in llc for target: $AMDGPU_TARGET" - exit $RETVAL -fi +if [[ $KMHACKISA == "1" && -e ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa ]]; then + # hijack ISA + if [ $KMTHINLTO == "1" ]; then + echo "Use ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa to hijack $2" + $MC --triple=amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ + -filetype=obj -o $2 ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa + else + echo "Use ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa to hijack $2.isabin" + $MC --triple=amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ + -filetype=obj -o $2.isabin ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa + fi -if [ $KMDUMPISA == "1" ]; then + if [ $KMDUMPISA == "1" ]; then + if [ $KMTHINLTO == "1" ]; then + cp $2 ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + else + cp $2.isabin ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + fi + cp ./hack-$INPUT_FILENAME-$AMDGPU_TARGET.isa ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isa + fi +else if [ $KMTHINLTO == "1" ]; then - cp $2 ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ + $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=obj -o $2 $2.opt.bc else - cp $2.isabin ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ + $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=obj -o $2.isabin $2.opt.bc + fi + + # error handling for llc + RETVAL=$? + if [ $RETVAL != 0 ]; then + echo "Generating AMD GCN kernel failed in llc for target: $AMDGPU_TARGET" + exit $RETVAL + fi + + if [ $KMDUMPISA == "1" ]; then + if [ $KMTHINLTO == "1" ]; then + cp $2 ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + else + cp $2.isabin ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isabin + fi + + $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ + $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=asm -o $2.isa $2.opt.bc + mv $2.isa ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isa fi - $LLC -mtriple amdgcn-amd-amdhsa -mcpu=$AMDGPU_TARGET $CODE_OBJECT_FORMAT \ - $KMOPTLLC -amdgpu-function-calls=$AMDGPU_FUNC_CALLS -filetype=asm -o $2.isa $2.opt.bc - mv $2.isa ${KMDUMPDIR}/dump-$AMDGPU_TARGET.isa fi # ThinLTO does not performs LLD here inside clamp-device.in. diff --git a/lib/hc-kernel-assemble.in b/lib/hc-kernel-assemble.in index 172c48add6f..3df70dbf258 100755 --- a/lib/hc-kernel-assemble.in +++ b/lib/hc-kernel-assemble.in @@ -146,9 +146,9 @@ if [ $AMDGPU_OBJ_CODEGEN == 1 ]; then # for each GPU target, lower to GCN ISA in HSACO format for AMDGPU_TARGET in ${AMDGPU_TARGET_ARRAY[@]}; do if [ $AMDGPU_FUNC_CALLS == "1" ]; then - { $CLAMP_DEVICE "$KERNEL_INPUT" "$TEMP_DIR/kernel-$AMDGPU_TARGET.hsaco" --amdgpu-target=$AMDGPU_TARGET --early-finalize --amdgpu-func-calls; } & + { $CLAMP_DEVICE "$KERNEL_INPUT" "$TEMP_DIR/kernel-$AMDGPU_TARGET.hsaco" --amdgpu-target=$AMDGPU_TARGET --early-finalize --amdgpu-func-calls --input-filename=`basename -s .o $2`; } & else - { $CLAMP_DEVICE "$KERNEL_INPUT" "$TEMP_DIR/kernel-$AMDGPU_TARGET.hsaco" --amdgpu-target=$AMDGPU_TARGET --early-finalize ; } & + { $CLAMP_DEVICE "$KERNEL_INPUT" "$TEMP_DIR/kernel-$AMDGPU_TARGET.hsaco" --amdgpu-target=$AMDGPU_TARGET --early-finalize --input-filename=`basename -s .o $2`; } & fi # error handling