Consider the (two) case(s) double foo(double) __attribute__((sseregparm)); static double bar(double) __attribute__((sseregparm)); static double bar(double x) { return x; }
now, with -mno-sse we have the following choices for call to function foo: 1 Emit the call with SSE arguments regardless of -mno-sse (we get (maybe) SIGILL at runtime) 2 Emit the call with FP stack arguments regardless of attribute sseregparm (bad - we will get wrong results if SSE is actually supported at runtime, else we either get SIGILL or correct result(?)) 3 Error out at compile-time (bad - the call may actually be reached at runtime) 4 Emit a call to abort() with a call to function bar there is a fifth possibility: 5 Ignore the sseregparm attribute for both emitting the function and the call. Currently we do 2, which is not really better than 3 which I implemented before. Bonzini suggested creating an "unreachable" attribute and transforming calls to such function to abort() in the middle-end; I'm currently trying if I can make the backend emit SSE code for the call regardless of -mno-sse, but it looks complicated. So, the first (separate) question is, do we want to support 5? Which leaves us to decide between 1 and 4. Thoughts? Richard.