[LLD] Fix issue in HIP due to unspecified order of evaluation of the function object
authorAlexandre Ganea <alexandre.ganea@legionlabs.com>
Tue, 8 Feb 2022 22:39:13 +0000 (17:39 -0500)
committerAlexandre Ganea <alexandre.ganea@legionlabs.com>
Wed, 9 Feb 2022 00:12:15 +0000 (19:12 -0500)
commitbb8be26a7ec36d32c605a5a15b92b5614453391f
tree84ff02b36428f904ba3b287681885b9fa645ca28
parent1e661e583d8406d5fce5269e803b287987332831
[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
lld/test/ELF/amdgpu-duplicate-sym.s [new file with mode: 0644]
lld/tools/lld/lld.cpp