Re: Help with building ADDR_EXPR node

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



zahed khurasani <sdzahed@xxxxxxxxx> writes:

> This is the error I am getting:
>
> "test8.c:11:7: internal compiler error: in expand_expr_real_1, at expr.c:8755"
>
> Looking at the code I see that this is an assert statement. The call
> to the function
> get_addr_base_and_unit_offset() returns NULL, which is expected as per
> the comments
> on this function.

If you use POINTER_PLUS_EXPR, don't also use ADDR_EXPR.
POINTER_PLUS_EXPR already calculates an address; you don't want to take
the address of that, as there is nothing to take the address of.

Anyhow, that assert appears to the case of a MEM_REF of an ADDR_EXPR.
That really only makes sense when taking the address of some variable.
It doesn't make sense to take a MEM_REF of some variable location; that
variable should be expressed in the MEM_REF, not the ADDR_EXPR.

Ian

> On Fri, Mar 9, 2012 at 9:02 PM, Ian Lance Taylor <iant@xxxxxxxxxx> wrote:
>> zahed khurasani <sdzahed@xxxxxxxxx> writes:
>>
>>> Let me try again. If I have an expression of the from a[i][10], then I
>>> need to insert the
>>> following function call into the tree:
>>> check_deref(a[i][10], sizeof(a[i][10]), &a[i][10]);
>>>
>>> I tried POINTER_PLUS_EXPR. It fails at the same place. However, it
>>> works if I have
>>> constant indices like a[1][10].
>>>
>>> Hope this is clearer than before. Thanks!
>>
>> Exactly how does it fail if you have non-constant indices?
>>
>> Ian
>>
>>> On Fri, Mar 9, 2012 at 7:48 PM, Ian Lance Taylor <iant@xxxxxxxxxx> wrote:
>>>> zahed khurasani <sdzahed@xxxxxxxxx> writes:
>>>>
>>>>> I need to build a node that is equivalent to the address of the memory
>>>>> being derenferenced.
>>>>> MEM_REF would help with the first parameter. But what about the third parameter?
>>>>> I would need an ADDR_EXPR for this parameter. However, the code I am using
>>>>> is failing.
>>>>> Thanks for the help.
>>>>
>>>> I'm not sure I completely understand, but I will say that a
>>>> POINTER_PLUS_EXPR would be the address equivalent of a MEM_REF.
>>>>
>>>> Ian
>>>>
>>>>> On Fri, Mar 9, 2012 at 6:04 PM, Ian Lance Taylor <iant@xxxxxxxxxx> wrote:
>>>>>> zahed khurasani <sdzahed@xxxxxxxxx> writes:
>>>>>>
>>>>>>> My check function accepts three parameters: the value being
>>>>>>> dereferenced, the size of the object and the address in memory. I am
>>>>>>> using the following two lines to get the third address parameter.
>>>>>>>
>>>>>>> addr = build1 (ADDR_EXPR, build_pointer_type (type), t); // t is the
>>>>>>> ARRAY_REF node
>>>>>>> fold_convert_loc(location, ptr_type_node, addr); // type case to void *
>>>>>>>
>>>>>>> However, this is failing whenever the array_ref contains a
>>>>>>> non-constant expression, say like a[i+1]. The specific failure is
>>>>>>> inside the expand_expr_real_1 method in the file expr.c. Looks like
>>>>>>> such non-constant indices are not allowed at this stage in the
>>>>>>> compilation (I've inserted the pass just before lowering to RTL
>>>>>>> happens).
>>>>>>>
>>>>>>> My question is, what would be the right way to get the address? I am
>>>>>>> looking for something that will preferably work for all dereferences
>>>>>>> like MEM_REF, INDIRECT_REF etc.
>>>>>>
>>>>>> ARRAY_REF certainly permits non-constant indices, so I don't think that
>>>>>> is your problem.
>>>>>>
>>>>>> However, MEM_REF is the most general memory reference expression.
>>>>>>
>>>>>> Ian


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux