[llvm-dev] Added AllocaInsts are relocated in stack (original) (raw)
Tim Northover via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 21 12🔞37 PDT 2018
- Previous message: [llvm-dev] Added AllocaInsts are relocated in stack
- Next message: [llvm-dev] Added AllocaInsts are relocated in stack
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi Sam,
On Fri, 21 Sep 2018 at 19:58, sam djafari <sami.djafari at gmail.com> wrote:
For example for each local variable, I need to maintain a 4-byte metadata. for example, if it is a 4 bytes variable (e.i. int), I need to allocate 8, or if it is a struct, let's say 26 bytes, I need to allocate 30 bytes. How it is possible using AllocaInst?
Your pass would look through the IR, find an alloca it needs to instrument, say (in the most general case):
%var = alloca %complex.type, i32 %some.arr.len, align whatever
It would then calculate the total number of bytes allocated (which might not necessarily be statically known), and emit a new alloca (in the same place) for that plus 4 bytes. In the most general case[*]:
%n.elts = zext i32 %some.arr.len to i64
%alloc.size = mul i64 COMPLEX_TYPE_SIZE, %n.elts ;
COMPLEX_TYPE_SIZE is statically known %alloc.plus.metadata.size = add i64 %alloc.size, 4 %var.as.i8ptr = alloca i8, i64 %alloc.plus.metadata.size, align whatever %var = bitcast i8* %var.as.i8ptr to %complex.type*
At this point you'd call ReplaceAllUses to change everything that referred to the original alloca to refer to the new bitcast instead and all code that existed before your pass should work fine (after all it's just a slightly bigger alloca, and well behaved code doesn't overflow buffers). Then, when you wanted to access your metadata (or at the beginning here to do it just once) you'd emit:
%metadata.as.i8ptr = getelementptr inbounds i8, i8* %var.as.i8ptr,
i64 %alloc.plus.metadata.size %metadata = bitcast i8* %metadata.as.i8ptr to i32*
Then anything that wanted the metadata could access that last bitcast.
A lot of that would be simplified in the common case, where the total size of the alloca is known statically. The mul+add could be done by your pass and never appear in the IR.
Oh, and delete the original alloca from the basic block so you don't waste space!
Cheers.
Tim.
[*] I'm assuming your 4-byte metadata doesn't need to be aligned to 4 bytes. If it does then the calculations get a little more complicated but not fundamentally different. You'd just round the original size up to a multiple of 4 before adding your metadata bit and make sure the new alloca requested at least 4 alignment.
- Previous message: [llvm-dev] Added AllocaInsts are relocated in stack
- Next message: [llvm-dev] Added AllocaInsts are relocated in stack
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]