On Sun, 2007-01-28 at 07:04 -0800, Chris Lattner wrote: > > Changes in directory llvm/tools/llvm-upgrade: > > > > UpgradeParser.y updated: 1.49 -> 1.50 > > UpgradeParser.y.cvs updated: 1.47 -> 1.48 > > --- > > Log message: > > > > Drop CSRET CC > > Is this patch right?
No its not. It reverts the fix for PR1137. > > Two issues: > > 1. You removed TypeHasInteger[I]. Is that correct? > 2. You map csretcc directly to ccc. You should also arrange for the > 'sret' attribute to be applied to the first argument. Maybe I'm > missing how this is done. > > -Chris > > > > > --- > > Diffs of the changes: (+22 -126) > > > > UpgradeParser.y | 74 ++++++ > > +--------------------------------------------- > > UpgradeParser.y.cvs | 74 ++++++ > > +--------------------------------------------- > > 2 files changed, 22 insertions(+), 126 deletions(-) > > > > > > Index: llvm/tools/llvm-upgrade/UpgradeParser.y > > diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.49 llvm/tools/ > > llvm-upgrade/UpgradeParser.y:1.50 > > --- llvm/tools/llvm-upgrade/UpgradeParser.y:1.49 Sat Jan 27 > > 18:51:40 2007 > > +++ llvm/tools/llvm-upgrade/UpgradeParser.y Sun Jan 28 07:36:18 2007 > > @@ -570,7 +570,6 @@ > > } > > } > > > > -/// @brief This just makes any name given to it unique, up to > > MAX_UINT times. > > static std::string makeNameUnique(const std::string& Name) { > > static unsigned UniqueNameCounter = 1; > > std::string Result(Name); > > @@ -578,57 +577,6 @@ > > return Result; > > } > > > > -/// This is the implementation portion of TypeHasInteger. It > > traverses the > > -/// type given, avoiding recursive types, and returns true as soon > > as it finds > > -/// an integer type. If no integer type is found, it returns false. > > -static bool TypeHasIntegerI(const Type *Ty, std::vector<const > > Type*> Stack) { > > - // Handle some easy cases > > - if (Ty->isPrimitiveType() || (Ty->getTypeID() == Type::OpaqueTyID)) > > - return false; > > - if (Ty->isInteger()) > > - return true; > > - if (const SequentialType *STy = dyn_cast<SequentialType>(Ty)) > > - return STy->getElementType()->isInteger(); > > - > > - // Avoid type structure recursion > > - for (std::vector<const Type*>::iterator I = Stack.begin(), E = > > Stack.end(); > > - I != E; ++I) > > - if (Ty == *I) > > - return false; > > - > > - // Push us on the type stack > > - Stack.push_back(Ty); > > - > > - if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) { > > - if (TypeHasIntegerI(FTy->getReturnType(), Stack)) > > - return true; > > - FunctionType::param_iterator I = FTy->param_begin(); > > - FunctionType::param_iterator E = FTy->param_end(); > > - for (; I != E; ++I) > > - if (TypeHasIntegerI(*I, Stack)) > > - return true; > > - return false; > > - } else if (const StructType *STy = dyn_cast<StructType>(Ty)) { > > - StructType::element_iterator I = STy->element_begin(); > > - StructType::element_iterator E = STy->element_end(); > > - for (; I != E; ++I) { > > - if (TypeHasIntegerI(*I, Stack)) > > - return true; > > - } > > - return false; > > - } > > - // There shouldn't be anything else, but its definitely not integer > > - assert(0 && "What type is this?"); > > - return false; > > -} > > - > > -/// This is the interface to TypeHasIntegerI. It just provides the > > type stack, > > -/// to avoid recursion, and then calls TypeHasIntegerI. > > -static inline bool TypeHasInteger(const Type *Ty) { > > - std::vector<const Type*> TyStack; > > - return TypeHasIntegerI(Ty, TyStack); > > -} > > - > > // setValueName - Set the specified value to the name given. The > > name may be > > // null potentially, in which case this is a noop. The string > > passed in is > > // assumed to be a malloc'd string buffer, and is free'd by this > > function. > > @@ -657,16 +605,16 @@ > > } > > } > > if (Existing) { > > - // An existing value of the same name was found. This might > > have happened > > - // because of the integer type planes collapsing in LLVM 2.0. > > - if (Existing->getType() == V->getType() && > > - !TypeHasInteger(Existing->getType())) { > > - // If the type does not contain any integers in them then > > this can't be > > - // a type plane collapsing issue. It truly is a > > redefinition and we > > - // should error out as the assembly is invalid. > > - error("Redefinition of value named '" + Name + "' of type > > '" + > > - V->getType()->getDescription() + "'"); > > - return; > > + if (Existing->getType() == V->getType()) { > > + // The type of the Existing value and the new one are the > > same. This > > + // is probably a type plane collapsing error. If the types > > involved > > + // are both integer, just rename it. Otherwise it > > + // is a redefinition error. > > + if (!Existing->getType()->isInteger()) { > > + error("Redefinition of value named '" + Name + "' in the > > '" + > > + V->getType()->getDescription() + "' type plane"); > > + return; > > + } > > } > > // In LLVM 2.0 we don't allow names to be re-used for any > > values in a > > // function, regardless of Type. Previously re-use of names > > was okay as > > @@ -1628,7 +1576,7 @@ > > OptCallingConv > > : /*empty*/ { $$ = CallingConv::C; } > > | CCC_TOK { $$ = CallingConv::C; } > > - | CSRETCC_TOK { $$ = CallingConv::CSRet; } > > + | CSRETCC_TOK { $$ = CallingConv::C; } > > | FASTCC_TOK { $$ = CallingConv::Fast; } > > | COLDCC_TOK { $$ = CallingConv::Cold; } > > | X86_STDCALLCC_TOK { $$ = CallingConv::X86_StdCall; } > > > > > > Index: llvm/tools/llvm-upgrade/UpgradeParser.y.cvs > > diff -u llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.47 llvm/tools/ > > llvm-upgrade/UpgradeParser.y.cvs:1.48 > > --- llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.47 Sat Jan 27 > > 18:52:05 2007 > > +++ llvm/tools/llvm-upgrade/UpgradeParser.y.cvs Sun Jan 28 07:36:18 > > 2007 > > @@ -570,7 +570,6 @@ > > } > > } > > > > -/// @brief This just makes any name given to it unique, up to > > MAX_UINT times. > > static std::string makeNameUnique(const std::string& Name) { > > static unsigned UniqueNameCounter = 1; > > std::string Result(Name); > > @@ -578,57 +577,6 @@ > > return Result; > > } > > > > -/// This is the implementation portion of TypeHasInteger. It > > traverses the > > -/// type given, avoiding recursive types, and returns true as soon > > as it finds > > -/// an integer type. If no integer type is found, it returns false. > > -static bool TypeHasIntegerI(const Type *Ty, std::vector<const > > Type*> Stack) { > > - // Handle some easy cases > > - if (Ty->isPrimitiveType() || (Ty->getTypeID() == Type::OpaqueTyID)) > > - return false; > > - if (Ty->isInteger()) > > - return true; > > - if (const SequentialType *STy = dyn_cast<SequentialType>(Ty)) > > - return STy->getElementType()->isInteger(); > > - > > - // Avoid type structure recursion > > - for (std::vector<const Type*>::iterator I = Stack.begin(), E = > > Stack.end(); > > - I != E; ++I) > > - if (Ty == *I) > > - return false; > > - > > - // Push us on the type stack > > - Stack.push_back(Ty); > > - > > - if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) { > > - if (TypeHasIntegerI(FTy->getReturnType(), Stack)) > > - return true; > > - FunctionType::param_iterator I = FTy->param_begin(); > > - FunctionType::param_iterator E = FTy->param_end(); > > - for (; I != E; ++I) > > - if (TypeHasIntegerI(*I, Stack)) > > - return true; > > - return false; > > - } else if (const StructType *STy = dyn_cast<StructType>(Ty)) { > > - StructType::element_iterator I = STy->element_begin(); > > - StructType::element_iterator E = STy->element_end(); > > - for (; I != E; ++I) { > > - if (TypeHasIntegerI(*I, Stack)) > > - return true; > > - } > > - return false; > > - } > > - // There shouldn't be anything else, but its definitely not integer > > - assert(0 && "What type is this?"); > > - return false; > > -} > > - > > -/// This is the interface to TypeHasIntegerI. It just provides the > > type stack, > > -/// to avoid recursion, and then calls TypeHasIntegerI. > > -static inline bool TypeHasInteger(const Type *Ty) { > > - std::vector<const Type*> TyStack; > > - return TypeHasIntegerI(Ty, TyStack); > > -} > > - > > // setValueName - Set the specified value to the name given. The > > name may be > > // null potentially, in which case this is a noop. The string > > passed in is > > // assumed to be a malloc'd string buffer, and is free'd by this > > function. > > @@ -657,16 +605,16 @@ > > } > > } > > if (Existing) { > > - // An existing value of the same name was found. This might > > have happened > > - // because of the integer type planes collapsing in LLVM 2.0. > > - if (Existing->getType() == V->getType() && > > - !TypeHasInteger(Existing->getType())) { > > - // If the type does not contain any integers in them then > > this can't be > > - // a type plane collapsing issue. It truly is a > > redefinition and we > > - // should error out as the assembly is invalid. > > - error("Redefinition of value named '" + Name + "' of type > > '" + > > - V->getType()->getDescription() + "'"); > > - return; > > + if (Existing->getType() == V->getType()) { > > + // The type of the Existing value and the new one are the > > same. This > > + // is probably a type plane collapsing error. If the types > > involved > > + // are both integer, just rename it. Otherwise it > > + // is a redefinition error. > > + if (!Existing->getType()->isInteger()) { > > + error("Redefinition of value named '" + Name + "' in the > > '" + > > + V->getType()->getDescription() + "' type plane"); > > + return; > > + } > > } > > // In LLVM 2.0 we don't allow names to be re-used for any > > values in a > > // function, regardless of Type. Previously re-use of names > > was okay as > > @@ -1628,7 +1576,7 @@ > > OptCallingConv > > : /*empty*/ { $$ = CallingConv::C; } > > | CCC_TOK { $$ = CallingConv::C; } > > - | CSRETCC_TOK { $$ = CallingConv::CSRet; } > > + | CSRETCC_TOK { $$ = CallingConv::C; } > > | FASTCC_TOK { $$ = CallingConv::Fast; } > > | COLDCC_TOK { $$ = CallingConv::Cold; } > > | X86_STDCALLCC_TOK { $$ = CallingConv::X86_StdCall; } > > > > > > > > _______________________________________________ > > llvm-commits mailing list > > llvm-commits@cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits