<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 4, 2021 at 3:19 AM Fāng-ruì Sòng via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">If --gcc-toolchain is specified, its value overrides the cmake variable GCC_INSTALL_PREFIX.<br>When the value is non-empty: the value is appended to the --prefix list and is used to detect GCC installations.<br>The GCC installation is used to provide include directories/library directories and some startup files (e.g. crtbegin).<br><br>Problem 1.<br><br>--prefix(-B) does more than --gcc-toolchain: clang::driver::Driver::GetProgramPath basically searches for $prefix/$triple-$file and $prefix$file,<br>where $prefix is taken from the list of --prefix(-B). --gcc-toolchain does not participate in the search. <have attached a summary of the algorithm at the bottom><br>The result is that 'ld' and 'as' may come from the system (more precisely, sysroot):<br><br>cd clang/test/Driver<br># Make sure Inputs/opensuse_42.2_aarch64_tree/usr/bin/ld exists.<br>clang -target aarch64-suse-linux --gcc-toolchain=Inputs/opensuse_42.2_aarch64_tree/usr '-###' gcc-toolchain.cpp -v<br><br>   # I have ld in my /usr/local/bin and it takes precedence over /usr/bin/ld<br> "/usr/local/bin/ld" "-EL" "--eh-frame-hdr" "-m" "aarch64linux" "-dynamic-linker" "/lib/ld-linux-aarch64.so.1" "-o" "a.out" "Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64/crt1.o" "Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64/crti.o" "Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtbegin.o" "-LInputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8" "-LInputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64" "-L/lib/aarch64-linux-gnu" "-L/lib/../lib64" "-L/usr/lib/aarch64-linux-gnu" "-L/usr/lib/../lib64" "-LInputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/../../.." "-L/tmp/RelA/bin/../lib" "-L/lib" "-L/usr/lib" "/tmp/gcc-toolchain-f87f08.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtend.o" "Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64/crtn.o"<br><br>The -L and crt* files are indeed from Inputs/opensuse_42.2_aarch64_tree/usr, but ld (and as if -fno-integrated-as) is from the system.<br>On many Linux distributions you can normally assume that the system ld and as only support the host architecture.<br>This means --gcc-toolchain can only be used to specify a GCC installation with the same architecture.<br></div></blockquote><div>... and specifying a GCC installation with the same architecture (e.g., to use a newer libstdc++) is something that people do:</div><div><span style="font-family:monospace">$ clang++ -fuse-ld=ld --gcc-toolchain=/opt/rh/devtoolset-7/root -xc - -fno-integrated-as <<<'#include <stdio.h>'$'\n''int main(void) { printf("Hello, world!\n"); }' && echo OKAY<br>OKAY</span></div>... but it does seem <span style="font-family:monospace">ld</span> is coming from <span style="font-family:monospace">--gcc-toolchain</span> for me anyway:<div><span style="font-family:monospace">$ ./build/bootstrap/stage1/build/bin/clang++ -fuse-ld=ld --gcc-toolchain=/opt/rh/devtoolset-7/root -xc - -fno-integrated-as <<<'#include <stdio.h>'$'\n''int main(void) { printf("Hello, world!\n"); }' -### 2>&1 | grep /ld<br> "/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7/../../../../bin/ld" "--hash-style=gnu" "--eh-frame-hdr" "-m" "elf64lppc" "-dynamic-linker" "/lib64/ld64.so.2" "-o" "a.out" "/lib/../lib64/crt1.o" "/lib/../lib64/crti.o" "/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7/crtbegin.o" "-L/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7" "-L/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7/../../../../lib64" "-L/lib/powerpc64le-linux-gnu" "-L/lib/../lib64" "-L/usr/lib/powerpc64le-linux-gnu" "-L/usr/lib/../lib64" "-L/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7/../../.." "-L/data1/hstong.local/wybuild/build/bootstrap/stage1/build/bin/../lib" "-L/lib" "-L/usr/lib" "/tmp/--8f8c6a.o" "-lstdc++" "-lm" "-lgcc_s" "-lgcc" "-lc" "-lgcc_s" "-lgcc" "/opt/rh/devtoolset-7/root/lib/gcc/ppc64le-redhat-linux/7/crtend.o" "/lib/../lib64/crtn.o"</span></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">--prefix can make as and ld paths correct, but: if another --prefix is needed, why do we use --gcc-toolchain?<br></div></blockquote><div>Well, I'm not sure that another <span style="font-family:monospace">--prefix</span> is needed. Also, <span style="font-family:monospace">--prefix</span> doesn't help to pick up the GCC header and library paths and <span style="font-family:monospace">--sysroot</span> overrides too much:<br><span style="font-family:monospace">$ clang++ -fuse-ld=ld --sysroot=/opt/rh/devtoolset-7/root -xc - -fno-integrated-as <<<'#include <stdio.h>'$'\n''int main(void) { printf("Hello, world!\n"); }'<br><stdin>:1:10: fatal error: 'stdio.h' file not found<br>#include <stdio.h><br>         ^~~~~~~~~<br>1 error generated.</span><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>I have sent a patch to document the current state: <a href="https://reviews.llvm.org/D97902" target="_blank">https://reviews.llvm.org/D97902</a><br>
</div></blockquote></div></div>