// Returns true if base value is undef, or if all members are undef bool AreAllUndefined(const llvm::Value* value) { if (IsUndef(value)) return true; // Assume a fully undef aggregate satisfies "IsUndef" at the highest level return false; // If a fully undef aggregate ever needs to be walked to to verify that, // use the following code. //if (const llvm::User* user = llvm::dyn_cast<llvm::User>(value)) { // switch(user->getType()->getTypeID()) { // case llvm::Type::VectorTyID: // case llvm::Type::ArrayTyID: // case llvm::Type::StructTyID: // if (user->getNumOperands() > 0) { // for (llvm::User::const_op_iterator i = user->op_begin(), e = user->op_end(); i != e; ++i) { // if (! AreAllUndefined(*i)) // return false; // } // } // } //} //return true; }
String CppMacro::ToString() const { String r; if(param.GetCount()) { String h = param; h.Replace(".", "..."); r << "(" << h << ")"; } if(IsUndef()) r << " #undef"; else r << ' ' << body; return r; }
// Returns false if base value is undef, or if any member is undef bool AreAllDefined(const llvm::Value* value) { if (IsUndef(value)) return false; if (const llvm::User* user = llvm::dyn_cast<llvm::User>(value)) { switch(user->getType()->getTypeID()) { case llvm::Type::VectorTyID: case llvm::Type::ArrayTyID: case llvm::Type::StructTyID: if (user->getNumOperands() > 0) { for (llvm::User::const_op_iterator i = user->op_begin(), e = user->op_end(); i != e; ++i) { if (! AreAllDefined(*i)) return false; } } } } return true; }