[llvm-dev] Issue with inline assembly, function inlining, and position independent code (original) (raw)
Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Thu Jul 30 23:53:51 PDT 2020
- Previous message: [llvm-dev] Issue with inline assembly, function inlining, and position independent code
- Next message: [llvm-dev] Issue with inline assembly, function inlining, and position independent code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Trying to look at your example. Why is the constraint on the pointer variable to the inline assembly "ri" instead of just "r". Changing it to "r" seems to compile.
~Craig
On Thu, Jul 30, 2020 at 10:59 PM Dominic Chen via llvm-dev < llvm-dev at lists.llvm.org> wrote:
Code: https://godbolt.org/z/T397fo
I'm running some performance experiments on a x86-64 linux system, where I've modified LLVM to reserve a register, and I'd like to use that register in my code. Currently, I'm using %r12d, which is callee save, so I don't need to worry about compatibility with existing libraries or system calls. For security reasons, the generated binaries need to be position independent. To access the register, I need to use inline assembly; either for all dependent computations, or just for moving the register value into a C++ variable. Since the latter results in a second register allocation, I'm just doing assembly for everything. So, I have a function
foothat contains some inline assembly. The problem is that its input arguments can sometimes be pointers to constant data, and after function inlining, the result may no longer link because RX866432S relocations are not permitted. I need to get LLVM to introduce a load-effective address (lea) to move the pointer into a register, if applicable, but I haven't found a method that both works and is performant. I could modify LLVM locally to make this happen, but this seems pretty deep in the X86 backend and not straightforward? 1. Make the input argumentvolatileor introduce avolatilevariable. Works, but adds two moves to and from the stack. 2. Introduce aregistervariable equal to the input argument. Results in an error with C++17, and doesn't seem to work otherwise. 3. Only use inline assembly to move %r12d into a C variable. Mostly works, but the variable isn't incremented afterwards, requires an extra register, and adds multiple extra moves. 4. Use the local register variable extension to force a C variable to %r12d. Not supported by Clang/LLVM. Thanks, Dominic
LLVM Developers mailing list llvm-dev at lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200730/d9c47fe7/attachment.html>
- Previous message: [llvm-dev] Issue with inline assembly, function inlining, and position independent code
- Next message: [llvm-dev] Issue with inline assembly, function inlining, and position independent code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]