forked from ROCm/hcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhc-kernel-assemble.in
executable file
·97 lines (84 loc) · 2.37 KB
/
hc-kernel-assemble.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/bash
# hc-kernel-assemble kernel-bitcode kernel-object
# enable bash debugging
KMDBSCRIPT="${KMDBSCRIPT:=0}"
# dump the LLVM bitcode
KMDUMPLLVM="${KMDUMPLLVM:=0}"
if [ $KMDBSCRIPT == "1" ]
then
set -x
fi
BINDIR=$(dirname $0)
CLANG=$BINDIR/clang
LLVM_LINK=$BINDIR/llvm-link
OPT=$BINDIR/opt
LLVM_AS=$BINDIR/llvm-as
LLVM_DIS=$BINDIR/llvm-dis
CLAMP_ASM=$BINDIR/clamp-assemble
LIBPATH=$BINDIR/../lib
CXXFLAGS="-std=c++amp -stdlib=libc++ -I$BINDIR/../../include"
# Set additional CXXFLAGS based on CMAKE_BUILD_TYPE
shopt -s nocasematch
CMAKE_BUILD_TYPE="@CMAKE_BUILD_TYPE@"
case $CMAKE_BUILD_TYPE in
release)
CXXFLAGS=$CXXFLAGS" -O3"
;;
relwithdebinfo)
CXXFLAGS=$CXXFLAGS" -O2 -g"
;;
minsizerel)
CXXFLAGS=$CXXFLAGS" -Os"
;;
debug)
CXXFLAGS=$CXXFLAGS" -g"
;;
*)
CXXFLAGS=$CXXFLAGS
esac
if [ "$#" -ne 2 ]; then
echo "Usage: $0 kernel-bitcode object" >&2
exit 1
fi
if [ ! -f $1 ]; then
echo "kernel-bitcode $1 is not valid" >&2
exit 1
fi
CO="-c -o"
TEMP_DIR=`mktemp -d`
BASENAME=`basename $2`
TEMP_NAME="$TEMP_DIR/$BASENAME"
# hip-kernel-assemble goes after hip-host-assemble, so attempt to link object from host
if [ -f $2 ]; then
mv $2 $TEMP_DIR/$BASENAME.tmp.o
fi
$LLVM_DIS $1 -o $TEMP_NAME.ll
if [ $KMDUMPLLVM == "1" ]; then
cp $TEMP_NAME.ll ./dump.kernel_input.ll
fi
$OPT -load $LIBPATH/LLVMDirectFuncCall.so -redirect < $TEMP_NAME.ll 2>$TEMP_NAME.kernel_redirect.ll >/dev/null
if [ $KMDUMPLLVM == "1" ]; then
cp $TEMP_NAME.kernel_redirect.ll ./dump.kernel_redirect.ll
fi
if [[ -s $TEMP_NAME.kernel_redirect.ll ]]; then
$OPT -load $LIBPATH/LLVMWrapperGen.so -gensrc < $TEMP_NAME.ll 2>$TEMP_NAME.camp.cpp >/dev/null
if [ $KMDUMPLLVM == "1" ]; then
cp $TEMP_NAME.camp.cpp ./dump.kernel_camp.cpp
fi
$LLVM_AS $TEMP_NAME.kernel_redirect.ll -o $TEMP_NAME.kernel_redirect.bc
$CLANG $CXXFLAGS $TEMP_NAME.camp.cpp $CO $TEMP_NAME.camp.s -emit-llvm
$CLANG $CXXFLAGS $TEMP_NAME.camp.cpp $CO $TEMP_NAME.camp.o
objcopy -R .kernel $TEMP_NAME.camp.o
$LLVM_LINK $TEMP_NAME.kernel_redirect.bc $TEMP_NAME.camp.s -o $TEMP_NAME.link.bc
$CLAMP_ASM $TEMP_NAME.link.bc $TEMP_NAME.camp.o
else
ln -s $1 $1.bc
$CLAMP_ASM $1.bc $TEMP_NAME.camp.o
fi
if [ -f $TEMP_DIR/$BASENAME.tmp.o ]; then
ld -r --allow-multiple-definition $TEMP_DIR/$BASENAME.tmp.o $TEMP_NAME.camp.o -o $2
else
mv $TEMP_NAME.camp.o $2
fi
rm -f $TEMP_NAME.* $1.bc
rmdir $TEMP_DIR