[llvm-dev] Mapping stack to IR on x86 backend
Camille Mougey via llvm-dev
llvm-dev at lists.llvm.org
Mon Dec 19 09:04:31 PST 2016
Hi,
I'm currently working on a project in which I start from a semantic
description of an assembly basic block, and I want to output a semantically
similar basic block through LLVM.
For instance:
- Semantic:
EAX = EBX + 2
ECX = EBX
- Expected output:
lea eax, [ebx + 2]
mov ebx, ecx
For now, I have a working PoC using inline asm (for loading a register and
saving to it). I also load and save registers to avoid having them erased
with temporary values.
But I get an unexpected behavior using the ESP register. It seems that the
backend "ignores" the relation between ESP value and the stack.
For instance:
- Semantic:
@32[ESP - 4] = EAX (that is to say, write at (ESP - 4) a 32 bits value, EAX)
- Output:
0: 55 push %ebp
1: 53 push %ebx
2: 57 push %edi
3: 56 push %esi
4: 89 44 24 fc mov %eax,-0x4(%esp)
8: 5e pop %esi
9: 5f pop %edi
a: 5b pop %ebx
b: 5d pop %ebp
Which is obviously wrong.
The corresponding IR LLVM:
define void @"fc"()
{
entry:
%".2" = call i32 asm "", "={eax}"
()
%".3" = call i32 asm "", "={ecx}"
()
...
%".6" = call i32 asm "", "={esp}"
()
...
%".18" = add i32 %".6", 4294967292
%".19" = inttoptr i32 %".18" to i32*
store i32 %".2", i32* %".19"
call void asm sideeffect "", "{eax}"
(i32 %".2")
...
call void asm sideeffect "", "{esp}"
(i32 %".6")
...
ret void
}
I understand that LLVM is not intended to work with this kind of ASM mix,
but maybe I'm missing a feature or something.
A hack would be to use an `alloca` at the beginning of the first basic
block, assuming that it will be mapped relatively to ESP, and then
re-arranging my memory accesses based on it. But it seems to be a very
hacky way to do it...
If you have any idea, I will be happy to test it and provide you feedback.
Thanks in advance,
-- commial
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161219/b55abd08/attachment.html>
More information about the llvm-dev
mailing list