This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Frame pointer, bug or feature? (x86)


On Mon, Nov 18, 2013 at 10:47 AM, Hendrik Greving
<hendrik.greving.intel@gmail.com> wrote:
> What's the difference in the C vs. the C++ spec that makes it a VLA in GNU-C?


max in C++ is considered an integer constant expression while in C it
is just an expression.

Thanks,
Andrew Pinski

>
> On Fri, Nov 15, 2013 at 10:07 AM, Andrew Pinski <pinskia@gmail.com> wrote:
>> On Fri, Nov 15, 2013 at 9:31 AM, Hendrik Greving
>> <hendrik.greving.intel@gmail.com> wrote:
>>> In the below test case, "CASE_A" actually uses a frame pointer, while
>>> !CASE_A doesn't. I can't imagine this is a feature, this is a bug,
>>> isn't it? Is there any reason the compiler couldn't know that
>>> loop_blocks never needs a dynamic stack size?
>>
>>
>> Both a feature and a bug.  In the CASE_A case (with GNU C) it is a VLA
>> while in the !CASE_A case (or in either case with C++), it is a normal
>> array definition.  The compiler could have converted the VLA to a
>> normal array but does not depending on the size of the array.
>>
>> Thanks,
>> Andrew Pinski
>>
>>>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>>
>>> #define MY_DEFINE 100
>>> #define CASE_A 1
>>>
>>> extern init(int (*a)[]);
>>>
>>> int
>>> foo()
>>> {
>>> #if CASE_A
>>>     const int max = MY_DEFINE * 2;
>>>     int loop_blocks[max];
>>> #else
>>>     int loop_blocks[MY_DEFINE * 2];
>>> #endif
>>>     init(&loop_blocks);
>>>     return loop_blocks[5];
>>> }
>>>
>>> int
>>> main()
>>> {
>>>     int i = foo();
>>>     printf("is is %d\n", i);
>>> }
>>>
>>> Thanks,
>>> Hendrik Greving


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]