[PATCH] D149579: [X86][MC] Fix parsing Intel syntax indirect branch with symbol only

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 4 18:19:58 PDT 2023


MaskRay added a comment.

In D149579#4312025 <https://reviews.llvm.org/D149579#4312025>, @alvinhochun wrote:

> Turns out this change affects MS inline assembly and possibly other inline assemblies as well. Looking at ms-inline-asm-functions.c <https://github.com/llvm/llvm-project/blob/7cf7ebd9170119f61ff998b61fe0de261dcdae65/clang/test/CodeGen/ms-inline-asm-functions.c> (on Compiler Explorer - https://godbolt.org/z/3xfW75Go4):
>
> - Direct call: `__asm call k;` generates the inline assembly `call dword ptr ${1:P}` (which seems wrong, should be `call ${1:P}` instead?), which is converted into `call dword ptr _k`, gets compiled as `call dword ptr [_k]` with this patch (incorrect).
> - Call through a global function pointer, which is marked as a "broken case" in the test: `__asm call kptr;` generates the inline assembly `call $4`, which is converted into `call [offset _kptr]`, gets compiled as `call dword ptr [_kptr]` with this patch, which actually fixes the test case, //except that// `call [offset _kptr]` doesn't seem right (see below).
> - Direct jump: `__asm jmp k;` generates the inline assembly `jmp dword ptr ${1:P}`, same issue as direct call.
>
> Among these, the usage of operator `offset` in `call` seems questionable. I checked the behaviour of other assemblers:
>
> - NASM:
>   - Does not support `offset` operator.
> - MASM (ml) Version 14.35.32215.0:
>   - `call offset fn` is oddly assembled as `push cs \n call fn`.
>   - `call [offset fn]` generates error A2023:instruction operand must have size.
>   - `call dword ptr [offset fn]` is assembled as `call dword ptr [fn]`.
> - GAS (Intel syntax):
>   - Both `call offset fn` and `call [offset fn]` are assembled the same way as `call fn`, which seems odd.
>   - `call dword ptr [offset fn]` is assembled as `call dword ptr [fn]`.
>
> ---
>
> I think this issue may end up being too much for me to handle. I already spent more time than I wanted tracing the code and trying various hacks, but couldn't quite come up with proper fixes. Will someone be willing to take over this?

OK. I  think after D149695 <https://reviews.llvm.org/D149695> (landed), D149920 <https://reviews.llvm.org/D149920>, and this patch D149579 <https://reviews.llvm.org/D149579>, these cases should be correct.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D149579



More information about the llvm-commits mailing list