Avoid evaluating Neon macro arguments more than once by disabling type checks.

It turns out that the use of "__extension__" in these macros was disabling
the expected "incompatible pointer" warnings, so these type checks were not
doing anything anyway.  They introduced a serious bug by evaluating some
macro arguments twice, which is a big problem for arguments with side effects.
I'll have to find another way to get the right type checking.  Radar 9947657.

llvm-svn: 137680
This commit is contained in:
Bob Wilson 2011-08-15 23:22:56 +00:00
parent 5a18b7c7c7
commit aecb7501ad
1 changed files with 8 additions and 15 deletions

View File

@ -485,6 +485,7 @@ static bool UseMacro(const std::string &proto) {
/// defined as a macro should be accessed directly instead of being first
/// assigned to a local temporary.
static bool MacroArgUsedDirectly(const std::string &proto, unsigned i) {
// True for constant ints (i), pointers (p) and const pointers (c).
return (proto[i] == 'i' || proto[i] == 'p' || proto[i] == 'c');
}
@ -525,24 +526,16 @@ static std::string GenMacroLocals(const std::string &proto, StringRef typestr) {
for (unsigned i = 1, e = proto.size(); i != e; ++i, ++arg) {
// Do not create a temporary for an immediate argument.
// That would defeat the whole point of using a macro!
if (proto[i] == 'i')
// FIXME: For other (non-immediate) arguments that are used directly, a
// local temporary (or some other method) is still needed to get the
// correct type checking, even if that temporary is not used for anything.
// This is omitted for now because it turns out the the use of
// "__extension__" in the macro disables any warnings from the pointer
// assignment.
if (MacroArgUsedDirectly(proto, i))
continue;
generatedLocal = true;
// For other (non-immediate) arguments that are used directly, a local
// temporary is still needed to get the correct type checking, even though
// that temporary is not used for anything.
if (MacroArgUsedDirectly(proto, i)) {
s += TypeString(proto[i], typestr) + " __";
s.push_back(arg);
s += "_ = (__";
s.push_back(arg);
s += "); (void)__";
s.push_back(arg);
s += "_; ";
continue;
}
s += TypeString(proto[i], typestr) + " __";
s.push_back(arg);
s += " = (";