On 6/19/19 7:04 AM, Florian Rommel wrote: > Hi, > > Recently I wanted to take and print the address of a label. When > compiling with -O2, I noticed that the address equals the function body > start address if the label is not used as a goto target. > > Here is an example: > > #include <stdio.h> > int main(void) { > printf("main: %p\n", main); > printf("label1: %p\n", &&label1); > label1: > puts("---"); > return 0; > } > > compile with: > $ gcc -O2 -o example1 example1.c > > or more specifically: > $ gcc -O1 -fschedule-insns2 -o example1 example1.c > > Output: > main: 0x562ed396216e > label1: 0x562ed396216e > --- > > > (or compile with -S to see that the label is moved to the start of the > function) > > That is not completely surprising because labels as values are not > really valid outside of the originating function [1]. > > However when I assign the two addresses to automatic variables (which > should be okay) and compare them, they are different (despite having > the same value; the substraction result is 0). Passing them to an > external function yields equality again (if the function is not > inlined). > > #include <stdio.h> > void compare(size_t x, size_t y) { > printf("x == y : %d\n", x == y); > } > int main(void) { > size_t m = (size_t)main; > size_t l = (size_t)&&label1; > printf("m: %p\n", m); > printf("l: %p\n", l); > printf("m == l : %d\n", m == l); > printf("m - l :% d\n", m - l); > compare(m, l); > label1: > puts("---"); > return 0; > } > > Output: > m: 0x559a775cd16e > l: 0x559a775cd16e > m - l : 0 > m == l : 0 > x == y : 1 > --- > > > The reasons for this behavior probably lies in constant > folding/propagation. > > I'm not sure whether this is technically a bug (Labels as Values / > Computed Gotos are not Standard C anyway). But this is at least > confusing. Maybe the label should not be moved in the first place? A label used as a value, but which is not a jump target will have an indeterminate value -- it'll end up somewhere in its containing function, that's all we guarantee in that case.
jeff