[PATCH] D150940: [lld][RISCV][test] Add test for relaxation combined with --wrap

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 30 19:14:20 PDT 2023


MaskRay added a comment.

In D150940#4359968 <https://reviews.llvm.org/D150940#4359968>, @jobnoorman wrote:

> In D150940#4356721 <https://reviews.llvm.org/D150940#4356721>, @kishore-rivos wrote:
>
>> To clarify, it isn't necessary for both foo and _wrap_foo to be defined in the same object file.  This bug was also triggered when they were defined in different object files.
>
> Thanks for mentioning this! I just noticed that situation is worse: it's still broken when `bar` is in a different object file but for a different reason than before.
>
> The following test is broken because the value of `bar` does not get adjusted:
>
>   #--- main.s
>   .globl _start
>   _start:
>     call bar
>   .globl bar
>   bar:
>   ## Note that this can be any instruction that gets relaxed. The goal is to force
>   ## the value of __wrap_bar to change.
>     call __wrap_bar
>   
>   #--- wrap.s
>   .globl __wrap_bar
>   __wrap_bar:
>     call __real_bar
>
> This is caused by this loop <https://github.com/llvm/llvm-project/blob/bf497c0be2301c77a18d37ef104fcf6758095956/lld/ELF/Arch/RISCV.cpp#L553-L564>: for some reason, `bar` is part of the symbols returned by `getSymbols()` on `wrap.o` while its `file` points to `main.o`. So it never gets added to `anchors` and hence its value never gets adjusted.
>
> @MaskRay is this something that should be fixed in the relaxation implementation or is there an underlying issue with `--wrap` that should be addressed?

Sorry for my belated response. I sent D151768 <https://reviews.llvm.org/D151768> to fix this case and add a test for the bug fixed by D149735 <https://reviews.llvm.org/D149735>.

> Note that I'm not quite sure whether inserting this symbol twice is actually intended behavior. Could it be worthwhile to look into this?

Having duplicate entries in `anchors` is certainly not ideal, but I think is acceptable as eliminating duplicates will add complexity, increase memory usage, and make the code more difficult to parallelize.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150940/new/

https://reviews.llvm.org/D150940



More information about the llvm-commits mailing list