diff --git a/install-wrappers.sh b/install-wrappers.sh index 180a4d1..e281182 100755 --- a/install-wrappers.sh +++ b/install-wrappers.sh @@ -40,6 +40,7 @@ if [ -n "$HOST" ]; then fi $CC wrappers/clang-target-wrapper.c -o $PREFIX/bin/clang-target-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS $CC wrappers/windres-wrapper.c -o $PREFIX/bin/windres-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS +$CC wrappers/llvm-wrapper.c -o $PREFIX/bin/llvm-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS if [ -n "$EXEEXT" ]; then # For Windows, we should prefer the executable wrapper, which also works # when invoked from outside of MSYS. @@ -55,7 +56,12 @@ for arch in $ARCHS; do ln -sf clang-target-wrapper$CTW_SUFFIX $arch-w64-$target_os-$exec$CTW_LINK_SUFFIX done for exec in ar ranlib nm objcopy strings strip; do - ln -sf llvm-$exec$EXEEXT $arch-w64-$target_os-$exec$EXEEXT || true + if [ -n "$HOST" ]; then + link_target=llvm-wrapper + else + link_target=llvm-$exec + fi + ln -sf $link_target$EXEEXT $arch-w64-$target_os-$exec$EXEEXT || true done for exec in windres; do ln -sf $exec-wrapper$EXEEXT $arch-w64-$target_os-$exec$EXEEXT diff --git a/strip-llvm.sh b/strip-llvm.sh index c559924..317834e 100755 --- a/strip-llvm.sh +++ b/strip-llvm.sh @@ -51,7 +51,7 @@ for i in bugpoint c-index-test clang-* diagtool dsymutil git-clang-format hmapto rm -f $i fi ;; - llvm-ar|llvm-cvtres|llvm-dlltool|llvm-nm|llvm-objdump|llvm-ranlib|llvm-rc|llvm-readobj|llvm-strings|llvm-pdbutil|llvm-objcopy|llvm-strip|llvm-cov|llvm-profdata) + llvm-ar|llvm-cvtres|llvm-dlltool|llvm-nm|llvm-objdump|llvm-ranlib|llvm-rc|llvm-readobj|llvm-strings|llvm-pdbutil|llvm-objcopy|llvm-strip|llvm-cov|llvm-profdata|llvm-wrapper) ;; ld64.lld|wasm-ld) if [ -e $i ]; then diff --git a/wrappers/clang-target-wrapper.c b/wrappers/clang-target-wrapper.c index 95a5d28..76c8d56 100644 --- a/wrappers/clang-target-wrapper.c +++ b/wrappers/clang-target-wrapper.c @@ -222,23 +222,7 @@ int _tmain(int argc, TCHAR* argv[]) { for (int i = 1; i < argc; i++) if (!_tcscmp(argv[i], _T("-v"))) return exec_filtered(exec_argv); - - int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv); - if (ret == -1) { - _tperror(exec_argv[0]); - return 1; - } - return ret; -#else - // On unix, exec() runs the target executable within this same process, - // making the return code propagate implicitly. - // Windows doesn't have such mechanisms, and the exec() family of functions - // makes the calling process exit immediately and always returning - // a zero return. This doesn't work for our case where we need the - // return code propagated. - _texecvp(exec_argv[0], EXECVP_CAST exec_argv); - - _tperror(exec_argv[0]); - return 1; #endif + + return run_final(exec_argv[0], exec_argv); } diff --git a/wrappers/llvm-wrapper.c b/wrappers/llvm-wrapper.c new file mode 100644 index 0000000..de7918a --- /dev/null +++ b/wrappers/llvm-wrapper.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "native-wrapper.h" + +int _tmain(int argc, TCHAR* argv[]) { + const TCHAR *dir; + const TCHAR *exe; + split_argv(argv[0], &dir, NULL, NULL, &exe); + TCHAR *exe_path = concat(dir, concat(_T("llvm-"), exe)); + + return run_final(exe_path, (const TCHAR *const *) argv); +} diff --git a/wrappers/native-wrapper.h b/wrappers/native-wrapper.h index 7cfdf23..f3511c7 100644 --- a/wrappers/native-wrapper.h +++ b/wrappers/native-wrapper.h @@ -158,3 +158,25 @@ static void split_argv(const TCHAR *argv0, const TCHAR **dir_ptr, const TCHAR ** if (exe_ptr) *exe_ptr = exe; } + +static int run_final(const TCHAR *executable, const TCHAR *const *argv) { +#ifdef _WIN32 + int ret = _tspawnvp_escape(_P_WAIT, executable, argv); + if (ret == -1) { + _tperror(executable); + return 1; + } + return ret; +#else + // On unix, exec() runs the target executable within this same process, + // making the return code propagate implicitly. + // Windows doesn't have such mechanisms, and the exec() family of functions + // makes the calling process exit immediately and always returning + // a zero return. This doesn't work for our case where we need the + // return code propagated. + _texecvp(executable, EXECVP_CAST argv); + + _tperror(executable); + return 1; +#endif +}