Thank you very much!!! :D --- Mer 24/3/10, Ian Lance Taylor <i...@google.com> ha scritto:
> Da: Ian Lance Taylor <i...@google.com> > Oggetto: Re: Problem with ADDR_EXPR array offset > A: "Massimo Nazaria" <ma...@rocketmail.com> > Cc: gcc@gcc.gnu.org > Data: Mercoledì 24 marzo 2010, 23:59 > Massimo Nazaria <ma...@rocketmail.com> > writes: > > > I'm working on a pass and I need to handle some > pointer expressions. > > For example, I have this C-code: > > int v[1000]; > > int *p; > > p = &v[10]; > > > > The problem is that, when I'm trying to parse "p = > &v[10];", I'm not able to get the array offset (10 in > this case). > > > > Namely, for a given statement like "p = &v[10]", I > need to get: > > array: v (I can do that) > > offset: 10 > > > > Here is the code I am working on: > > op0 = gimple_op (stmt, 0); > > op1 = gimple_op (stmt, 1); > > > > if (gimple_assign_rhs_code (stmt) == > ADDR_EXPR) > > { > > base = get_base_address > (TREE_OPERAND (op1, 0)); // the array v, OK > > offset = // ??? > > > > How can I do? > > There is nothing wrong with calling get_base_address, but > by doing > that you have thrown away the offset information. I > would expected > TREE_OPERAND (op1, 0) to be an ARRAY_REF. Operand 0 > of that will be > an array, operand 1 will be an index. > > I would recommend taking a look at get_inner_reference > rather than > get_base_address. > > Ian >