HIP auto completion does not work with Visual Studio Code
Hi, I tried to use auto completion in Visual Studio Code with the CMake extension at a HIP CMake project. It does not work, because it could not find the header #include <hip/hip_runtime.h>
. Here is the code to reproduce:
cmake_minimum_required(VERSION 3.27)
project(hipcc_test LANGUAGES HIP)
set_source_files_properties(main.cpp PROPERTIES LANGUAGE HIP)
add_executable(tgt_foo)
target_sources(tgt_foo
PRIVATE
main.cpp
)
set_target_properties(tgt_foo PROPERTIES
HIP_STANDARD 17
)
#include <hip/hip_runtime.h>
int main(int argc, char **argv){
return 0;
}
I already opened an issue in vscode-cmake-tools and at the end, we find out that it is not a problem of the vsc extension. https://github.com/microsoft/vscode-cpptools/issues/11500
The problem is, that the /opt/rocm-5.7.0/llvm/bin/clang++ -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
does not display the include path /opt/rocm-5.7.0/include
, where hip/hip_runtime.h
is located.
/opt/rocm-5.7.0/llvm/bin/clang++ -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
clang -cc1 version 17.0.0 based upon LLVM 17.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward
/opt/rocm-5.7.0/llvm/lib/clang/17.0.0/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 430 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2
Also the compile_commands.json
does not contain the include path:
[
{
"directory": "/tmp/simeon/hipcc_test/build",
"command": "/opt/rocm-5.7.0/llvm/bin/clang++ -D__HIP_ROCclr__=1 -g -O -std=c++17 --offload-arch=gfx906 --offload-arch=gfx906 -mllvm -amdgpu-early-inline-all=true -mllvm -amdgpu-function-calls=false -o CMakeFiles/tgt_foo.dir/main.cpp.o -x hip -c /tmp/simeon/hipcc_test/main.cpp",
"file": "/tmp/simeon/hipcc_test/main.cpp",
"output": "CMakeFiles/tgt_foo.dir/main.cpp.o"
}
]
If you run /opt/rocm-5.7.0/bin/hipcc -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
, it displays the include path /opt/rocm-5.7.0/include
.
/opt/rocm-5.7.0/bin/hipcc -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
clang++: warning: argument unused during compilation: '--hip-path=/opt/rocm-5.7.0' [-Wunused-command-line-argument]
clang -cc1 version 17.0.0 based upon LLVM 17.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/opt/rocm-5.7.0/include
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward
/opt/rocm-5.7.0/llvm/lib/clang/17.0.0/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 430 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2
With /opt/rocm-5.7.0/bin/hipcc -### -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
I found out, the hipcc
wrapper script sets the compiler argument isystem /opt/rocm-5.7.0/include
:
hipcc -### -std=c++17 -m64 -Wp,-v -E -x c++ /dev/null
AMD clang version 17.0.0 (https://github.com/RadeonOpenCompute/llvm-project roc-5.7.0 23352 d1e13c532a947d0cbfc94759c00dcf152294aa13)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/rocm-5.7.0/llvm/bin
clang++: warning: argument unused during compilation: '--hip-path=/opt/rocm-5.7.0' [-Wunused-command-line-argument]
(in-process)
"/opt/rocm-5.7.0/llvm/bin/clang-17" "-cc1" "-triple" "x86_64-unknown-linux-gnu" "-E" "-disable-free" "-clear-ast-before-backend" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "null" "-mrelocation-model" "static" "-mframe-pointer=none" "-fmath-errno" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-funwind-tables=2" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-debugger-tuning=gdb" "-fcoverage-compilation-dir=/home/simeon" "-resource-dir" "/opt/rocm-5.7.0/llvm/lib/clang/17.0.0" "-isystem" "/opt/rocm-5.7.0/include" "-v" "-internal-isystem" "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12" "-internal-isystem" "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12" "-internal-isystem" "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward" "-internal-isystem" "/opt/rocm-5.7.0/llvm/lib/clang/17.0.0/include" "-internal-isystem" "/usr/local/include" "-internal-isystem" "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include" "-internal-externc-isystem" "/usr/include/x86_64-linux-gnu" "-internal-externc-isystem" "/include" "-internal-externc-isystem" "/usr/include" "-O3" "-std=c++17" "-fdeprecated-macro" "-fdebug-compilation-dir=/home/simeon" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-fcxx-exceptions" "-fexceptions" "-fcolor-diagnostics" "-vectorize-loops" "-vectorize-slp" "-faddrsig" "-D__GCC_HAVE_DWARF2_CFI_ASM=1" "-o" "-" "-x" "c++" "/dev/null"
So I tried to set the -isystem
path manually in the CMakeLists.txt
. For unknown reasons, it looks like target_include_directories(tgt_foo SYSTEM PUBLIC "/opt/rocm-5.7.0/include")
is "black listed". It does not set the -isystem
argument. Therefore I copied /opt/rocm-5.7.0
to /opt/foo
and added target_include_directories(tgt_foo SYSTEM PUBLIC "/opt/foo/include")
:
cmake_minimum_required(VERSION 3.27)
project(hipcc_test LANGUAGES HIP)
set_source_files_properties(main.cpp PROPERTIES LANGUAGE HIP)
add_executable(tgt_foo)
# /opt/foo is a copy of /opt/rocm-5.7.0
target_include_directories(tgt_foo SYSTEM PUBLIC "/opt/foo/include")
target_sources(tgt_foo
PRIVATE
main.cpp
)
set_target_properties(tgt_foo PROPERTIES
HIP_STANDARD 17
)
Now, the compile command contains -isystem /opt/foo/include
:
[
{
"directory": "/tmp/simeon/hipcc_test/build",
"command": "/opt/rocm-5.7.0/llvm/bin/clang++ -D__HIP_ROCclr__=1 -isystem /opt/foo/include -g -O -std=c++17 --offload-arch=gfx906 --offload-arch=gfx906 -mllvm -amdgpu-early-inline-all=true -mllvm -amdgpu-function-calls=false -o CMakeFiles/tgt_foo.dir/main.cpp.o -x hip -c /tmp/simeon/hipcc_test/main.cpp",
"file": "/tmp/simeon/hipcc_test/main.cpp",
"output": "CMakeFiles/tgt_foo.dir/main.cpp.o"
}
]
With this workaround, vsc code finds the hip/hip_runtime.h
and auto completion is working.
I hope my explanation helps to fix the bug.
Cheers, Simeon