summaryrefslogtreecommitdiff
path: root/lld/tools
diff options
context:
space:
mode:
authorAlexandre Ganea <alexandre.ganea@legionlabs.com>2022-02-08 17:39:13 -0500
committerAlexandre Ganea <alexandre.ganea@legionlabs.com>2022-02-08 19:12:15 -0500
commitbb8be26a7ec36d32c605a5a15b92b5614453391f (patch)
tree84ff02b36428f904ba3b287681885b9fa645ca28 /lld/tools
parent1e661e583d8406d5fce5269e803b287987332831 (diff)
downloadllvm-bb8be26a7ec36d32c605a5a15b92b5614453391f.tar.gz
[LLD] Fix issue in HIP due to unspecified order of evaluation of the function object
This fixes the issue raised in https://reviews.llvm.org/D108850#3303452 Before C++17, the function object is evaluated in a unspecified order. In the following example: https://godbolt.org/z/8ao4vdsr7 the function object is either evaluated before or after the arguments, depending on the compiler. With MSVC and /std:c++14 the function object is evaluated after the arguments; with clang and gcc, it is evaluated before. With C++17, the function object is guaranteed to be evaluated before the arguments, see: https://riptutorial.com/cplusplus/example/19369/evaluation-order-of-function-arguments In our case, the issue was that the `args` conversion to `ArrayRef` was evaluated before the lambda call `link`, which internally was calling `parseFlavor()`, which in turned modified `args`. We ended with an `ArrayRef` argument that reflected the previous contents of `args`. Add coverage for `-flavor` which we didn't have before. Differential Revision: https://reviews.llvm.org/D119278
Diffstat (limited to 'lld/tools')
-rw-r--r--lld/tools/lld/lld.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/lld/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp
index 0a6439fff2a2..d6c39fa7cce4 100644
--- a/lld/tools/lld/lld.cpp
+++ b/lld/tools/lld/lld.cpp
@@ -159,9 +159,9 @@ static int lldMain(int argc, const char **argv, llvm::raw_ostream &stdoutOS,
die("lld is a generic driver.\n"
"Invoke ld.lld (Unix), ld64.lld (macOS), lld-link (Windows), wasm-ld"
" (WebAssembly) instead");
- };
+ }();
// Run the driver. If an error occurs, false will be returned.
- bool r = link()(args, stdoutOS, stderrOS, exitEarly, inTestOutputDisabled);
+ bool r = link(args, stdoutOS, stderrOS, exitEarly, inTestOutputDisabled);
// Call exit() if we can to avoid calling destructors.
if (exitEarly)