This is the mail archive of the gcc-bugs@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: target/7559: kdelibs miscompilation


> The following C testcase is equivalent in miscompiled-behavior. If you
> don't want to bother compiling the C++ front-end for tests. ;-)

This could be a mis-classification of the other eightbyte sub-object. 

1) Actually, the following testcase fails too and occurs because we have a
two eightbytes object, "sliced" in the middle (aka two sub-aggregates). As
a result, only the first eightbyte is actually passed in register. The
other one vanished.

[gb@gauss vrac]$ cat struct.c
extern void abort();

struct A {
  int x, y;
};

struct R {
  struct A a, b;
};

struct R R = {
  { 100, 100 },
  { 200, 200 }
};

void f(struct R r) {
  if (r.a.x != R.a.x || r.a.y != R.a.y || r.b.x != R.b.x || r.b.y != 
R.b.y)
    abort();
}

int main() {
  f(R);
  return 0;
}

2) The following testcase *won't* fail though we have a two eightbytes 
object, and is not "sliced" in.

[gb@gauss vrac]$ cat other.c
extern void abort();

struct A {
  int a, b, c, d;
};

struct A X = {
  100, 200, 300, 400
};

void f(struct A x) {
  if (x.a != X.a || x.b != X.b || x.c != X.c || x.d != X.d)
    abort();
}

int main(void) {
  f(X);
  return 0;
}

3) The last testcase is ultra-reduced to a two eightbytes object, with 
only one member in each one. That one do fails.

extern void abort();

struct A {
  long x;
};

struct R {
  struct A a, b;
};

struct R R = {
  100, 200
};

void f(struct R r) {
  if (r.a.x != R.a.x || r.b.x != R.b.x)
    abort();
}

int main() {
  f(R);
  return 0;
}

4) The <struct.c> testcase won't fail if we add some garbage in struct R, 
because the size of the object will be > 16 bytes, thus having MEMORY 
class.

HTH,
Gwenole.


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