[LLVMdev] Indexing backwards through a structure
Jay Foad
jay.foad at gmail.com
Tue Aug 24 04:35:00 PDT 2010
Hi David,
On 23 August 2010 15:02, David Given <dg at cowlark.com> wrote:
> Given a structure like this (using C syntax rather than LLVM because I'm
> still not fluent with LLVM assembly):
>
> struct Object
> {
> int i1;
> int i2;
> int i3;
> };
>
> Then, if I have an int* pointer which I know is pointing to the i3
> element, what's the best way of recovering a pointer to the structure as
> a whole?
>
> My fallback option is to cast the pointer to an int64, use getelementptr
> to determine the offset of the i3 element, subtract, cast back to a
> pointer, etc. However this feels very clunky to me and I'd like a
> cleaner way of doing it.
Casting the pointer to "i8 *" and then using getelementptr with a
single index, to add a (negative) number of bytes to the pointer, is
probably a bit cleaner.
As for how you calculate the number to subtract, you can either try to
implement offsetof() as a complicated ConstantExpr using
getelementptr, or you can just know that the value is 8. Most front
ends know what the target data layout is, so they can just use a
constant.
As a general suggestion, try writing the code in C and seeing what
llvm-gcc or clang turns it into.
> life←{ ↑1 ⍵∨.^3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵ }
Ha!
Jay.
More information about the llvm-dev
mailing list