From reid at x10sys.com Mon Feb 5 00:10:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 00:10:35 -0600 Subject: [llvm-commits] CVS: llvm/utils/findmisopt Message-ID: <200702050610.l156AZ4i005329@zion.cs.uiuc.edu> Changes in directory llvm/utils: findmisopt updated: 1.11 -> 1.12 --- Log message: Use opt to generate the list of passes to run. --- Diffs of the changes: (+5 -5) findmisopt | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) Index: llvm/utils/findmisopt diff -u llvm/utils/findmisopt:1.11 llvm/utils/findmisopt:1.12 --- llvm/utils/findmisopt:1.11 Fri Dec 8 22:42:33 2006 +++ llvm/utils/findmisopt Mon Feb 5 00:10:19 2007 @@ -93,11 +93,11 @@ ex1=$? # Define the list of optimizations to run. This comprises the same set of -# optimizations that gccas and gccld run, in the same order. -all_switches="-verify -lowersetjmp -funcresolve -raiseallocs -simplifycfg -mem2reg -globalopt -globaldce -ipconstprop -deadargelim -instcombine -simplifycfg -prune-eh -inline -simplify-libcalls -argpromotion -raise -tailduplicate -simplifycfg -scalarrepl -instcombine -predsimplify -condprop -tailcallelim -simplifycfg -reassociate -licm -loop-unswitch -instcombine -indvars -loop-unroll -instcombine -load-vn -gcse -sccp -instcombine -condprop -dse -dce -simplifycfg -deadtypeelim -constmerge -funcresolve -internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify" -# Here's an alternative list of optimizations comprising just the ones that -# gccld uses. To use, just comment out the line above, and uncomment this one -#all_switches="-funcresolve -internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify" +# optimizations that opt -std-compile-opts and gccld run, in the same order. +opt_switches=`llvm-as < /dev/null -o - | opt -std-compile-opts -disable-output -debug-pass=Arguments 2>&1 | sed 's/Pass Arguments: //'` +gccld_switches="-internalize -ipsccp -globalopt -constmerge -deadargelim -inline -prune-eh -globalopt -globaldce -argpromotion -instcombine -predsimplify -scalarrepl -globalsmodref-aa -licm -load-vn -gcse -dse -instcombine -simplifycfg -verify" +all_switches="$opt_switches $gccld_switches" +echo "Passes : $all_switches" # Current set of switches is empty function tryit { From sabre at nondot.org Mon Feb 5 00:31:07 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 00:31:07 -0600 Subject: [llvm-commits] CVS: llvm/docs/ProgrammersManual.html Message-ID: <200702050631.l156V7I5005726@zion.cs.uiuc.edu> Changes in directory llvm/docs: ProgrammersManual.html updated: 1.120 -> 1.121 --- Log message: add a note --- Diffs of the changes: (+28 -1) ProgrammersManual.html | 29 ++++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletion(-) Index: llvm/docs/ProgrammersManual.html diff -u llvm/docs/ProgrammersManual.html:1.120 llvm/docs/ProgrammersManual.html:1.121 --- llvm/docs/ProgrammersManual.html:1.120 Sat Feb 3 18:00:26 2007 +++ llvm/docs/ProgrammersManual.html Mon Feb 5 00:30:51 2007 @@ -797,6 +797,33 @@ itself (which would waste space for elements that aren't in the container). vector is also useful when interfacing with code that expects vectors :).

+ +

One worthwhile note about std::vector: avoid code like this:

+ +
+
+for ( ... ) {
+   std::vector V;
+   use V;
+}
+
+
+ +

Instead, write this as:

+ +
+
+std::vector V;
+for ( ... ) {
+   use V;
+   V.clear();
+}
+
+
+ +

Doing so will save (at least) one heap allocation and free per iteration of +the loop.

+ @@ -3170,7 +3197,7 @@ Dinakar Dhurjati and Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2007/02/04 00:00:26 $ + Last modified: $Date: 2007/02/05 06:30:51 $ From reid at x10sys.com Mon Feb 5 03:43:33 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 03:43:33 -0600 Subject: [llvm-commits] CVS: llvm/Makefile Message-ID: <200702050943.l159hXFM017637@zion.cs.uiuc.edu> Changes in directory llvm: Makefile updated: 1.67 -> 1.68 --- Log message: Don't prevent install target from descending into the utils directory. It prevents "make install" on a clean directory from working. --- Diffs of the changes: (+0 -7) Makefile | 7 ------- 1 files changed, 7 deletions(-) Index: llvm/Makefile diff -u llvm/Makefile:1.67 llvm/Makefile:1.68 --- llvm/Makefile:1.67 Thu Nov 16 21:32:33 2006 +++ llvm/Makefile Mon Feb 5 03:43:17 2007 @@ -40,13 +40,6 @@ OPTIONAL_DIRS := endif -# Don't install utils, examples, or projects they are only used to -# build LLVM. -ifeq ($(MAKECMDGOALS),install) - DIRS := $(filter-out utils, $(DIRS)) - OPTIONAL_DIRS := -endif - # Include the main makefile machinery. include $(LLVM_SRC_ROOT)/Makefile.rules From reid at x10sys.com Mon Feb 5 04:16:26 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 04:16:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200702051016.l15AGQqG018713@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.317 -> 1.318 --- Log message: There is nothing exclamatory about an error message. No other compiler or assembler uses ! at the end of every message. We shouldn't either. --- Diffs of the changes: (+102 -102) llvmAsmParser.y | 204 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 102 insertions(+), 102 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.317 llvm/lib/AsmParser/llvmAsmParser.y:1.318 --- llvm/lib/AsmParser/llvmAsmParser.y:1.317 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Feb 5 04:16:10 2007 @@ -283,7 +283,7 @@ } break; default: - GenerateError("Internal parser error: Invalid symbol type reference!"); + GenerateError("Internal parser error: Invalid symbol type reference"); return 0; } @@ -370,7 +370,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Signed integral constant '" + itostr(D.ConstPool64) + "' is invalid for type '" + - Ty->getDescription() + "'!"); + Ty->getDescription() + "'"); return 0; } return ConstantInt::get(Ty, D.ConstPool64); @@ -379,7 +379,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Integral constant '" + utostr(D.UConstPool64) + - "' is invalid or out of range!"); + "' is invalid or out of range"); return 0; } else { // This is really a signed reference. Transmogrify. return ConstantInt::get(Ty, D.ConstPool64); @@ -390,14 +390,14 @@ case ValID::ConstFPVal: // Is it a floating point const pool reference? if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) { - GenerateError("FP constant invalid for type!!"); + GenerateError("FP constant invalid for type"); return 0; } return ConstantFP::get(Ty, D.ConstPoolFP); case ValID::ConstNullVal: // Is it a null value? if (!isa(Ty)) { - GenerateError("Cannot create a a non pointer null!"); + GenerateError("Cannot create a a non pointer null"); return 0; } return ConstantPointerNull::get(cast(Ty)); @@ -410,7 +410,7 @@ case ValID::ConstantVal: // Fully resolved constant? if (D.ConstantValue->getType() != Ty) { - GenerateError("Constant expression type different from required type!"); + GenerateError("Constant expression type different from required type"); return 0; } return D.ConstantValue; @@ -420,7 +420,7 @@ const FunctionType *FTy = PTy ? dyn_cast(PTy->getElementType()) : 0; if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) { - GenerateError("Invalid type for asm constraint string!"); + GenerateError("Invalid type for asm constraint string"); return 0; } InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints, @@ -429,11 +429,11 @@ return IA; } default: - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } // End of switch - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } @@ -455,7 +455,7 @@ if (TriggerError) return 0; if (!Ty->isFirstClassType() && !isa(Ty)) { - GenerateError("Invalid use of a composite type!"); + GenerateError("Invalid use of a composite type"); return 0; } @@ -484,7 +484,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope!"); + assert(inFunctionScope() && "Can't get basic block at global scope"); std::string Name; BasicBlock *BB = 0; @@ -573,7 +573,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); ValID &DID = PHI->second.first; @@ -635,15 +635,15 @@ free(NameStr); // Free old string if (V->getType() == Type::VoidTy) { - GenerateError("Can't assign name '" + Name+"' to value with void type!"); + GenerateError("Can't assign name '" + Name+"' to value with void type"); return; } - assert(inFunctionScope() && "Must be in function scope!"); + assert(inFunctionScope() && "Must be in function scope"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + - V->getType()->getDescription() + "'!"); + V->getType()->getDescription() + "'"); return; } @@ -660,7 +660,7 @@ bool isConstantGlobal, const Type *Ty, Constant *Initializer) { if (isa(Ty)) { - GenerateError("Cannot declare global vars of function type!"); + GenerateError("Cannot declare global vars of function type"); return 0; } @@ -702,7 +702,7 @@ // the same as the old one. if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'!"); + "' of type '" + Ty->getDescription() + "'"); return 0; } } @@ -724,7 +724,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names!"); + assert(!inFunctionScope() && "Can't give types function-local names"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -732,7 +732,7 @@ // We don't allow assigning names to void type if (T == Type::VoidTy) { - GenerateError("Can't assign name '" + Name + "' to the void type!"); + GenerateError("Can't assign name '" + Name + "' to the void type"); return false; } @@ -759,7 +759,7 @@ // Any other kind of (non-equivalent) redefinition is an error. GenerateError("Redefinition of type named '" + Name + "' of type '" + - T->getDescription() + "'!"); + T->getDescription() + "'"); } return false; @@ -1126,7 +1126,7 @@ X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } | CC_TOK EUINT64VAL { if ((unsigned)$2 != $2) - GEN_ERROR("Calling conv too large!"); + GEN_ERROR("Calling conv too large"); $$ = $2; CHECK_FOR_ERROR }; @@ -1159,14 +1159,14 @@ ALIGN EUINT64VAL { $$ = $2; if ($$ != 0 && !isPowerOf2_32($$)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR }; OptCAlign : /*empty*/ { $$ = 0; } | ',' ALIGN EUINT64VAL { $$ = $3; if ($$ != 0 && !isPowerOf2_32($$)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR }; @@ -1174,7 +1174,7 @@ SectionString : SECTION STRINGCONSTANT { for (unsigned i = 0, e = strlen($2); i != e; ++i) if ($2[i] == '"' || $2[i] == '\\') - GEN_ERROR("Invalid character in section name!"); + GEN_ERROR("Invalid character in section name"); $$ = $2; CHECK_FOR_ERROR }; @@ -1194,7 +1194,7 @@ } | ALIGN EUINT64VAL { if ($2 != 0 && !isPowerOf2_32($2)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CurGV->setAlignment($2); CHECK_FOR_ERROR }; @@ -1229,7 +1229,7 @@ $$ = new PATypeHolder(tmp); } | '\\' EUINT64VAL { // Type UpReference - if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector... $$ = new PATypeHolder(OT); @@ -1284,7 +1284,7 @@ if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger()) GEN_ERROR("Element type of a PackedType must be primitive"); if (!isPowerOf2_32($2)) - GEN_ERROR("Vector length should be a power of 2!"); + GEN_ERROR("Vector length should be a power of 2"); $$ = new PATypeHolder(HandleUpRefs(PackedType::get(*$4, (unsigned)$2))); delete $4; CHECK_FOR_ERROR @@ -1331,7 +1331,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); if (!(*$1)->isFirstClassType()) - GEN_ERROR("LLVM functions cannot return aggregate types!"); + GEN_ERROR("LLVM functions cannot return aggregate types"); $$ = $1; } | VOID { @@ -1396,7 +1396,7 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); @@ -1404,7 +1404,7 @@ if (NumElements != -1 && NumElements != (int)$3->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + utostr($3->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < $3->size(); i++) { @@ -1424,12 +1424,12 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" - " arguments, but has size of " + itostr(NumElements) +"!"); + " arguments, but has size of " + itostr(NumElements) +""); $$ = ConstantArray::get(ATy, std::vector()); delete $1; CHECK_FOR_ERROR @@ -1440,7 +1440,7 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); @@ -1448,7 +1448,7 @@ if (NumElements != -1 && NumElements != (EndStr-$3)) GEN_ERROR("Can't build string constant of size " + itostr((int)(EndStr-$3)) + - " when array has size " + itostr(NumElements) + "!"); + " when array has size " + itostr(NumElements) + ""); std::vector Vals; if (ETy == Type::Int8Ty) { for (unsigned char *C = (unsigned char *)$3; @@ -1456,7 +1456,7 @@ Vals.push_back(ConstantInt::get(ETy, *C)); } else { free($3); - GEN_ERROR("Cannot build string arrays of non byte sized elements!"); + GEN_ERROR("Cannot build string arrays of non byte sized elements"); } free($3); $$ = ConstantArray::get(ATy, Vals); @@ -1469,7 +1469,7 @@ const PackedType *PTy = dyn_cast($1->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); @@ -1477,7 +1477,7 @@ if (NumElements != -1 && NumElements != (int)$3->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + utostr($3->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < $3->size(); i++) { @@ -1495,10 +1495,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if ($3->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = $3->size(); i != e; ++i) @@ -1506,7 +1506,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -1522,10 +1522,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -1539,10 +1539,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if ($4->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = $4->size(); i != e; ++i) @@ -1550,7 +1550,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -1566,10 +1566,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -1585,7 +1585,7 @@ const PointerType *PTy = dyn_cast($1->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); $$ = ConstantPointerNull::get(PTy); delete $1; @@ -1603,7 +1603,7 @@ GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); const PointerType *Ty = dyn_cast($1->get()); if (Ty == 0) - GEN_ERROR("Global const reference must be a pointer type!"); + GEN_ERROR("Global const reference must be a pointer type"); // ConstExprs can exist in the body of a function, thus creating // GlobalValues whenever they refer to a variable. Because we are in @@ -1625,7 +1625,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers!"); + assert(isa(Ty) && "Globals may only be used as pointers"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -1679,20 +1679,20 @@ GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); const Type *Ty = $1->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) - GEN_ERROR("Cannot create a null initialized value of this type!"); + GEN_ERROR("Cannot create a null initialized value of this type"); $$ = Constant::getNullValue(Ty); delete $1; CHECK_FOR_ERROR } | IntType ESINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } | IntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } @@ -1708,7 +1708,7 @@ } | FPType FPVAL { // Float & Double constants if (!ConstantFP::isValueValidForType($1, $2)) - GEN_ERROR("Floating point constant invalid for type!!"); + GEN_ERROR("Floating point constant invalid for type"); $$ = ConstantFP::get($1, $2); CHECK_FOR_ERROR }; @@ -1722,25 +1722,25 @@ if (!CastInst::castIsValid($1, $3, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); $$ = ConstantExpr::getCast($1, $3, DestTy); delete $5; } | GETELEMENTPTR '(' ConstVal IndexList ')' { if (!isa($3->getType())) - GEN_ERROR("GetElementPtr requires a pointer operand!"); + GEN_ERROR("GetElementPtr requires a pointer operand"); const Type *IdxTy = GetElementPtrInst::getIndexedType($3->getType(), *$4, true); if (!IdxTy) - GEN_ERROR("Index list invalid for constant getelementptr!"); + GEN_ERROR("Index list invalid for constant getelementptr"); SmallVector IdxVec; for (unsigned i = 0, e = $4->size(); i != e; ++i) if (Constant *C = dyn_cast((*$4)[i])) IdxVec.push_back(C); else - GEN_ERROR("Indices to constant getelementptr must be constants!"); + GEN_ERROR("Indices to constant getelementptr must be constants"); delete $4; @@ -1749,54 +1749,54 @@ } | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' { if ($3->getType() != Type::Int1Ty) - GEN_ERROR("Select condition must be of boolean type!"); + GEN_ERROR("Select condition must be of boolean type"); if ($5->getType() != $7->getType()) - GEN_ERROR("Select operand types must match!"); + GEN_ERROR("Select operand types must match"); $$ = ConstantExpr::getSelect($3, $5, $7); CHECK_FOR_ERROR } | ArithmeticOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) - GEN_ERROR("Binary operator types must match!"); + GEN_ERROR("Binary operator types must match"); CHECK_FOR_ERROR; $$ = ConstantExpr::get($1, $3, $5); } | LogicalOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) - GEN_ERROR("Logical operator types must match!"); + GEN_ERROR("Logical operator types must match"); if (!$3->getType()->isInteger()) { if (Instruction::isShift($1) || !isa($3->getType()) || !cast($3->getType())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } $$ = ConstantExpr::get($1, $3, $5); CHECK_FOR_ERROR } | ICMP IPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) - GEN_ERROR("icmp operand types must match!"); + GEN_ERROR("icmp operand types must match"); $$ = ConstantExpr::getICmp($2, $4, $6); } | FCMP FPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) - GEN_ERROR("fcmp operand types must match!"); + GEN_ERROR("fcmp operand types must match"); $$ = ConstantExpr::getFCmp($2, $4, $6); } | EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' { if (!ExtractElementInst::isValidOperands($3, $5)) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); $$ = ConstantExpr::getExtractElement($3, $5); CHECK_FOR_ERROR } | INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' { if (!InsertElementInst::isValidOperands($3, $5, $7)) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); $$ = ConstantExpr::getInsertElement($3, $5, $7); CHECK_FOR_ERROR } | SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' { if (!ShuffleVectorInst::isValidOperands($3, $5, $7)) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); $$ = ConstantExpr::getShuffleVector($3, $5, $7); CHECK_FOR_ERROR }; @@ -1904,7 +1904,7 @@ | OptGlobalAssign GVVisibilityStyle GlobalType ConstVal { /* "Externally Visible" Linkage */ if ($4 == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage, $2, $3, $4->getType(), $4); CHECK_FOR_ERROR @@ -1913,7 +1913,7 @@ } | OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal { if ($5 == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5); CHECK_FOR_ERROR } GlobalVarAttributes { @@ -1985,7 +1985,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription()); if (*$3 == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = $4; E.Ty = $3; E.Name = $5; $$ = $1; $1->push_back(E); @@ -1995,7 +1995,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); if (*$1 == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = $2; E.Ty = $1; E.Name = $3; $$ = new ArgListType; $$->push_back(E); @@ -2082,7 +2082,7 @@ // If this is the case, either we need to be a forward decl, or it needs // to be. if (!CurFun.isDeclare && !Fn->isDeclaration()) - GEN_ERROR("Redefinition of function '" + FunctionName + "'!"); + GEN_ERROR("Redefinition of function '" + FunctionName + "'"); // Make sure to strip off any argument names so we can't get conflicts. if (Fn->isDeclaration()) @@ -2116,7 +2116,7 @@ if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& - "Not a varargs marker!"); + "Not a varargs marker"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } @@ -2377,7 +2377,7 @@ if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else - GEN_ERROR("Switch case is constant, but not a simple integer!"); + GEN_ERROR("Switch case is constant, but not a simple integer"); } delete $8; CHECK_FOR_ERROR @@ -2428,7 +2428,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -2439,7 +2439,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } @@ -2448,7 +2448,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the InvokeInst @@ -2474,7 +2474,7 @@ Constant *V = cast(getValNonImprovising($2, $3)); CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal($6); CHECK_FOR_ERROR @@ -2486,7 +2486,7 @@ CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal($5); CHECK_FOR_ERROR @@ -2565,19 +2565,19 @@ if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() && !isa((*$2).get())) GEN_ERROR( - "Arithmetic operator requires integer, FP, or packed operands!"); + "Arithmetic operator requires integer, FP, or packed operands"); if (isa((*$2).get()) && ($1 == Instruction::URem || $1 == Instruction::SRem || $1 == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types!"); + GEN_ERROR("U/S/FRem not supported on packed types"); Value* val1 = getVal(*$2, $3); CHECK_FOR_ERROR Value* val2 = getVal(*$2, $5); CHECK_FOR_ERROR $$ = BinaryOperator::create($1, val1, val2); if ($$ == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete $2; } | LogicalOps Types ValueRef ',' ValueRef { @@ -2586,7 +2586,7 @@ if (!(*$2)->isInteger()) { if (Instruction::isShift($1) || !isa($2->get()) || !cast($2->get())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } Value* tmpVal1 = getVal(*$2, $3); CHECK_FOR_ERROR @@ -2594,7 +2594,7 @@ CHECK_FOR_ERROR $$ = BinaryOperator::create($1, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete $2; } | ICMP IPredicates Types ValueRef ',' ValueRef { @@ -2608,7 +2608,7 @@ CHECK_FOR_ERROR $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("icmp operator returned null!"); + GEN_ERROR("icmp operator returned null"); } | FCMP FPredicates Types ValueRef ',' ValueRef { if (!UpRefs.empty()) @@ -2621,7 +2621,7 @@ CHECK_FOR_ERROR $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("fcmp operator returned null!"); + GEN_ERROR("fcmp operator returned null"); } | CastOps ResolvedVal TO Types { if (!UpRefs.empty()) @@ -2631,15 +2631,15 @@ if (!CastInst::castIsValid($1, Val, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); $$ = CastInst::create($1, Val, DestTy); delete $4; } | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal { if ($2->getType() != Type::Int1Ty) - GEN_ERROR("select condition must be boolean!"); + GEN_ERROR("select condition must be boolean"); if ($4->getType() != $6->getType()) - GEN_ERROR("select value types should match!"); + GEN_ERROR("select value types should match"); $$ = new SelectInst($2, $4, $6); CHECK_FOR_ERROR } @@ -2652,31 +2652,31 @@ } | EXTRACTELEMENT ResolvedVal ',' ResolvedVal { if (!ExtractElementInst::isValidOperands($2, $4)) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); $$ = new ExtractElementInst($2, $4); CHECK_FOR_ERROR } | INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal { if (!InsertElementInst::isValidOperands($2, $4, $6)) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); $$ = new InsertElementInst($2, $4, $6); CHECK_FOR_ERROR } | SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal { if (!ShuffleVectorInst::isValidOperands($2, $4, $6)) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); $$ = new ShuffleVectorInst($2, $4, $6); CHECK_FOR_ERROR } | PHI_TOK PHIList { const Type *Ty = $2->front().first->getType(); if (!Ty->isFirstClassType()) - GEN_ERROR("PHI node operands must be of first class type!"); + GEN_ERROR("PHI node operands must be of first class type"); $$ = new PHINode(Ty); ((PHINode*)$$)->reserveOperandSpace($2->size()); while ($2->begin() != $2->end()) { if ($2->front().first->getType() != Ty) - GEN_ERROR("All elements of a PHI node must be of the same type!"); + GEN_ERROR("All elements of a PHI node must be of the same type"); cast($$)->addIncoming($2->front().first, $2->front().second); $2->pop_front(); } @@ -2716,7 +2716,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -2728,7 +2728,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } if (Ty->isVarArg()) { @@ -2736,7 +2736,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the call node CallInst *CI = new CallInst(V, Args); @@ -2796,7 +2796,7 @@ | FREE ResolvedVal { if (!isa($2->getType())) GEN_ERROR("Trying to free nonpointer type " + - $2->getType()->getDescription() + "!"); + $2->getType()->getDescription() + ""); $$ = new FreeInst($2); CHECK_FOR_ERROR } @@ -2825,7 +2825,7 @@ const Type *ElTy = PT->getElementType(); if (ElTy != $3->getType()) GEN_ERROR("Can't store '" + $3->getType()->getDescription() + - "' into space of type '" + ElTy->getDescription() + "'!"); + "' into space of type '" + ElTy->getDescription() + "'"); Value* tmpVal = getVal(*$5, $6); CHECK_FOR_ERROR @@ -2836,11 +2836,11 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription()); if (!isa($2->get())) - GEN_ERROR("getelementptr insn requires pointer operand!"); + GEN_ERROR("getelementptr insn requires pointer operand"); if (!GetElementPtrInst::getIndexedType(*$2, *$4, true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*$2)->getDescription()+ "'!"); + (*$2)->getDescription()+ "'"); Value* tmpVal = getVal(*$2, $3); CHECK_FOR_ERROR $$ = new GetElementPtrInst(tmpVal, *$4); From reid at x10sys.com Mon Feb 5 04:18:07 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 04:18:07 -0600 Subject: [llvm-commits] CVS: llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll Message-ID: <200702051018.l15AI7iL018752@zion.cs.uiuc.edu> Changes in directory llvm/test/Assembler: 2004-11-28-InvalidTypeCrash.ll updated: 1.5 -> 1.6 --- Log message: Assembler no longer prints ! at the end of its error messages. --- Diffs of the changes: (+1 -1) 2004-11-28-InvalidTypeCrash.ll | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll diff -u llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll:1.5 llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll:1.6 --- llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll:1.5 Fri Jan 26 02:25:05 2007 +++ llvm/test/Assembler/2004-11-28-InvalidTypeCrash.ll Mon Feb 5 04:17:51 2007 @@ -1,4 +1,4 @@ ; RUN: llvm-as 2>&1 < %s -o /dev/null -f | \ -; RUN: grep 'Cannot create a null initialized value of this type!' +; RUN: grep 'Cannot create a null initialized value of this type' ; Test for PR463. This program is erroneous, but should not crash llvm-as. @.FOO = internal global %struct.none zeroinitializer From reid at x10sys.com Mon Feb 5 04:18:22 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 04:18:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs llvmAsmParser.y.cvs Message-ID: <200702051018.l15AIMMd018765@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp.cvs updated: 1.62 -> 1.63 llvmAsmParser.y.cvs updated: 1.63 -> 1.64 --- Log message: Regenerate. --- Diffs of the changes: (+204 -204) llvmAsmParser.cpp.cvs | 204 +++++++++++++++++++++++++------------------------- llvmAsmParser.y.cvs | 204 +++++++++++++++++++++++++------------------------- 2 files changed, 204 insertions(+), 204 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.62 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.63 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.62 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Mon Feb 5 04:18:06 2007 @@ -603,7 +603,7 @@ } break; default: - GenerateError("Internal parser error: Invalid symbol type reference!"); + GenerateError("Internal parser error: Invalid symbol type reference"); return 0; } @@ -690,7 +690,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Signed integral constant '" + itostr(D.ConstPool64) + "' is invalid for type '" + - Ty->getDescription() + "'!"); + Ty->getDescription() + "'"); return 0; } return ConstantInt::get(Ty, D.ConstPool64); @@ -699,7 +699,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Integral constant '" + utostr(D.UConstPool64) + - "' is invalid or out of range!"); + "' is invalid or out of range"); return 0; } else { // This is really a signed reference. Transmogrify. return ConstantInt::get(Ty, D.ConstPool64); @@ -710,14 +710,14 @@ case ValID::ConstFPVal: // Is it a floating point const pool reference? if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) { - GenerateError("FP constant invalid for type!!"); + GenerateError("FP constant invalid for type"); return 0; } return ConstantFP::get(Ty, D.ConstPoolFP); case ValID::ConstNullVal: // Is it a null value? if (!isa(Ty)) { - GenerateError("Cannot create a a non pointer null!"); + GenerateError("Cannot create a a non pointer null"); return 0; } return ConstantPointerNull::get(cast(Ty)); @@ -730,7 +730,7 @@ case ValID::ConstantVal: // Fully resolved constant? if (D.ConstantValue->getType() != Ty) { - GenerateError("Constant expression type different from required type!"); + GenerateError("Constant expression type different from required type"); return 0; } return D.ConstantValue; @@ -740,7 +740,7 @@ const FunctionType *FTy = PTy ? dyn_cast(PTy->getElementType()) : 0; if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) { - GenerateError("Invalid type for asm constraint string!"); + GenerateError("Invalid type for asm constraint string"); return 0; } InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints, @@ -749,11 +749,11 @@ return IA; } default: - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } // End of switch - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } @@ -775,7 +775,7 @@ if (TriggerError) return 0; if (!Ty->isFirstClassType() && !isa(Ty)) { - GenerateError("Invalid use of a composite type!"); + GenerateError("Invalid use of a composite type"); return 0; } @@ -804,7 +804,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope!"); + assert(inFunctionScope() && "Can't get basic block at global scope"); std::string Name; BasicBlock *BB = 0; @@ -893,7 +893,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); ValID &DID = PHI->second.first; @@ -955,15 +955,15 @@ free(NameStr); // Free old string if (V->getType() == Type::VoidTy) { - GenerateError("Can't assign name '" + Name+"' to value with void type!"); + GenerateError("Can't assign name '" + Name+"' to value with void type"); return; } - assert(inFunctionScope() && "Must be in function scope!"); + assert(inFunctionScope() && "Must be in function scope"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + - V->getType()->getDescription() + "'!"); + V->getType()->getDescription() + "'"); return; } @@ -980,7 +980,7 @@ bool isConstantGlobal, const Type *Ty, Constant *Initializer) { if (isa(Ty)) { - GenerateError("Cannot declare global vars of function type!"); + GenerateError("Cannot declare global vars of function type"); return 0; } @@ -1022,7 +1022,7 @@ // the same as the old one. if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'!"); + "' of type '" + Ty->getDescription() + "'"); return 0; } } @@ -1044,7 +1044,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names!"); + assert(!inFunctionScope() && "Can't give types function-local names"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -1052,7 +1052,7 @@ // We don't allow assigning names to void type if (T == Type::VoidTy) { - GenerateError("Can't assign name '" + Name + "' to the void type!"); + GenerateError("Can't assign name '" + Name + "' to the void type"); return false; } @@ -1079,7 +1079,7 @@ // Any other kind of (non-equivalent) redefinition is an error. GenerateError("Redefinition of type named '" + Name + "' of type '" + - T->getDescription() + "'!"); + T->getDescription() + "'"); } return false; @@ -3271,7 +3271,7 @@ #line 1127 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) - GEN_ERROR("Calling conv too large!"); + GEN_ERROR("Calling conv too large"); (yyval.UIntVal) = (yyvsp[0].UInt64Val); CHECK_FOR_ERROR ;} @@ -3336,7 +3336,7 @@ { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR ;} break; @@ -3351,7 +3351,7 @@ { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR ;} break; @@ -3361,7 +3361,7 @@ { for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') - GEN_ERROR("Invalid character in section name!"); + GEN_ERROR("Invalid character in section name"); (yyval.StrVal) = (yyvsp[0].StrVal); CHECK_FOR_ERROR ;} @@ -3400,7 +3400,7 @@ #line 1195 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CurGV->setAlignment((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} @@ -3445,7 +3445,7 @@ case 122: #line 1231 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { // Type UpReference - if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector... (yyval.TypeVal) = new PATypeHolder(OT); @@ -3515,7 +3515,7 @@ if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger()) GEN_ERROR("Element type of a PackedType must be primitive"); if (!isPowerOf2_32((yyvsp[-3].UInt64Val))) - GEN_ERROR("Vector length should be a power of 2!"); + GEN_ERROR("Vector length should be a power of 2"); (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR @@ -3580,7 +3580,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); if (!(*(yyvsp[0].TypeVal))->isFirstClassType()) - GEN_ERROR("LLVM functions cannot return aggregate types!"); + GEN_ERROR("LLVM functions cannot return aggregate types"); (yyval.TypeVal) = (yyvsp[0].TypeVal); ;} break; @@ -3664,7 +3664,7 @@ const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); @@ -3672,7 +3672,7 @@ if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { @@ -3696,12 +3696,12 @@ const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" - " arguments, but has size of " + itostr(NumElements) +"!"); + " arguments, but has size of " + itostr(NumElements) +""); (yyval.ConstVal) = ConstantArray::get(ATy, std::vector()); delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR @@ -3716,7 +3716,7 @@ const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); @@ -3724,7 +3724,7 @@ if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal))) GEN_ERROR("Can't build string constant of size " + itostr((int)(EndStr-(yyvsp[0].StrVal))) + - " when array has size " + itostr(NumElements) + "!"); + " when array has size " + itostr(NumElements) + ""); std::vector Vals; if (ETy == Type::Int8Ty) { for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); @@ -3732,7 +3732,7 @@ Vals.push_back(ConstantInt::get(ETy, *C)); } else { free((yyvsp[0].StrVal)); - GEN_ERROR("Cannot build string arrays of non byte sized elements!"); + GEN_ERROR("Cannot build string arrays of non byte sized elements"); } free((yyvsp[0].StrVal)); (yyval.ConstVal) = ConstantArray::get(ATy, Vals); @@ -3749,7 +3749,7 @@ const PackedType *PTy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); @@ -3757,7 +3757,7 @@ if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { @@ -3779,10 +3779,10 @@ const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) @@ -3790,7 +3790,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -3810,10 +3810,10 @@ const StructType *STy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -3831,10 +3831,10 @@ const StructType *STy = dyn_cast((yyvsp[-5].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-5].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-5].TypeVal))->getDescription() + "'"); if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i) @@ -3842,7 +3842,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -3862,10 +3862,10 @@ const StructType *STy = dyn_cast((yyvsp[-4].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-4].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-4].TypeVal))->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -3885,7 +3885,7 @@ const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*(yyvsp[-1].TypeVal))->getDescription() + "'!"); + (*(yyvsp[-1].TypeVal))->getDescription() + "'"); (yyval.ConstVal) = ConstantPointerNull::get(PTy); delete (yyvsp[-1].TypeVal); @@ -3911,7 +3911,7 @@ GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal)->get()); if (Ty == 0) - GEN_ERROR("Global const reference must be a pointer type!"); + GEN_ERROR("Global const reference must be a pointer type"); // ConstExprs can exist in the body of a function, thus creating // GlobalValues whenever they refer to a variable. Because we are in @@ -3933,7 +3933,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers!"); + assert(isa(Ty) && "Globals may only be used as pointers"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -3995,7 +3995,7 @@ GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); const Type *Ty = (yyvsp[-1].TypeVal)->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) - GEN_ERROR("Cannot create a null initialized value of this type!"); + GEN_ERROR("Cannot create a null initialized value of this type"); (yyval.ConstVal) = Constant::getNullValue(Ty); delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR @@ -4006,7 +4006,7 @@ #line 1687 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)); CHECK_FOR_ERROR ;} @@ -4016,7 +4016,7 @@ #line 1693 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} @@ -4044,7 +4044,7 @@ #line 1709 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { // Float & Double constants if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) - GEN_ERROR("Floating point constant invalid for type!!"); + GEN_ERROR("Floating point constant invalid for type"); (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal)); CHECK_FOR_ERROR ;} @@ -4060,7 +4060,7 @@ if (!CastInst::castIsValid((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy); delete (yyvsp[-1].TypeVal); ;} @@ -4070,19 +4070,19 @@ #line 1729 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!isa((yyvsp[-2].ConstVal)->getType())) - GEN_ERROR("GetElementPtr requires a pointer operand!"); + GEN_ERROR("GetElementPtr requires a pointer operand"); const Type *IdxTy = GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true); if (!IdxTy) - GEN_ERROR("Index list invalid for constant getelementptr!"); + GEN_ERROR("Index list invalid for constant getelementptr"); SmallVector IdxVec; for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i) if (Constant *C = dyn_cast((*(yyvsp[-1].ValueList))[i])) IdxVec.push_back(C); else - GEN_ERROR("Indices to constant getelementptr must be constants!"); + GEN_ERROR("Indices to constant getelementptr must be constants"); delete (yyvsp[-1].ValueList); @@ -4095,9 +4095,9 @@ #line 1750 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-5].ConstVal)->getType() != Type::Int1Ty) - GEN_ERROR("Select condition must be of boolean type!"); + GEN_ERROR("Select condition must be of boolean type"); if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) - GEN_ERROR("Select operand types must match!"); + GEN_ERROR("Select operand types must match"); (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} @@ -4107,7 +4107,7 @@ #line 1758 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) - GEN_ERROR("Binary operator types must match!"); + GEN_ERROR("Binary operator types must match"); CHECK_FOR_ERROR; (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} @@ -4117,11 +4117,11 @@ #line 1764 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) - GEN_ERROR("Logical operator types must match!"); + GEN_ERROR("Logical operator types must match"); if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) { if (Instruction::isShift((yyvsp[-5].BinaryOpVal)) || !isa((yyvsp[-3].ConstVal)->getType()) || !cast((yyvsp[-3].ConstVal)->getType())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR @@ -4132,7 +4132,7 @@ #line 1775 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) - GEN_ERROR("icmp operand types must match!"); + GEN_ERROR("icmp operand types must match"); (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[-5].IPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} break; @@ -4141,7 +4141,7 @@ #line 1780 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) - GEN_ERROR("fcmp operand types must match!"); + GEN_ERROR("fcmp operand types must match"); (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[-5].FPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} break; @@ -4150,7 +4150,7 @@ #line 1785 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} @@ -4160,7 +4160,7 @@ #line 1791 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} @@ -4170,7 +4170,7 @@ #line 1797 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} @@ -4317,7 +4317,7 @@ { /* "Externally Visible" Linkage */ if ((yyvsp[0].ConstVal) == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-2].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR @@ -4335,7 +4335,7 @@ #line 1914 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[0].ConstVal) == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable((yyvsp[-4].StrVal), (yyvsp[-3].Linkage), (yyvsp[-2].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR ;} @@ -4444,7 +4444,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); if (*(yyvsp[-2].TypeVal) == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal); (yyval.ArgList) = (yyvsp[-4].ArgList); (yyvsp[-4].ArgList)->push_back(E); @@ -4458,7 +4458,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); if (*(yyvsp[-2].TypeVal) == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal); (yyval.ArgList) = new ArgListType; (yyval.ArgList)->push_back(E); @@ -4562,7 +4562,7 @@ // If this is the case, either we need to be a forward decl, or it needs // to be. if (!CurFun.isDeclare && !Fn->isDeclaration()) - GEN_ERROR("Redefinition of function '" + FunctionName + "'!"); + GEN_ERROR("Redefinition of function '" + FunctionName + "'"); // Make sure to strip off any argument names so we can't get conflicts. if (Fn->isDeclaration()) @@ -4596,7 +4596,7 @@ if ((yyvsp[-4].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0&& - "Not a varargs marker!"); + "Not a varargs marker"); delete (yyvsp[-4].ArgList)->back().Ty; (yyvsp[-4].ArgList)->pop_back(); // Delete the last entry } @@ -4951,7 +4951,7 @@ if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else - GEN_ERROR("Switch case is constant, but not a simple integer!"); + GEN_ERROR("Switch case is constant, but not a simple integer"); } delete (yyvsp[-1].JumpTable); CHECK_FOR_ERROR @@ -5009,7 +5009,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -5020,7 +5020,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } @@ -5029,7 +5029,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the InvokeInst @@ -5064,7 +5064,7 @@ Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR @@ -5080,7 +5080,7 @@ CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR @@ -5194,19 +5194,19 @@ if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && !isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR( - "Arithmetic operator requires integer, FP, or packed operands!"); + "Arithmetic operator requires integer, FP, or packed operands"); if (isa((*(yyvsp[-3].TypeVal)).get()) && ((yyvsp[-4].BinaryOpVal) == Instruction::URem || (yyvsp[-4].BinaryOpVal) == Instruction::SRem || (yyvsp[-4].BinaryOpVal) == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types!"); + GEN_ERROR("U/S/FRem not supported on packed types"); Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2); if ((yyval.InstVal) == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete (yyvsp[-3].TypeVal); ;} break; @@ -5219,7 +5219,7 @@ if (!(*(yyvsp[-3].TypeVal))->isInteger()) { if (Instruction::isShift((yyvsp[-4].BinaryOpVal)) || !isa((yyvsp[-3].TypeVal)->get()) || !cast((yyvsp[-3].TypeVal)->get())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR @@ -5227,7 +5227,7 @@ CHECK_FOR_ERROR (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); if ((yyval.InstVal) == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete (yyvsp[-3].TypeVal); ;} break; @@ -5245,7 +5245,7 @@ CHECK_FOR_ERROR (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].IPredicate), tmpVal1, tmpVal2); if ((yyval.InstVal) == 0) - GEN_ERROR("icmp operator returned null!"); + GEN_ERROR("icmp operator returned null"); ;} break; @@ -5262,7 +5262,7 @@ CHECK_FOR_ERROR (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].FPredicate), tmpVal1, tmpVal2); if ((yyval.InstVal) == 0) - GEN_ERROR("fcmp operator returned null!"); + GEN_ERROR("fcmp operator returned null"); ;} break; @@ -5276,7 +5276,7 @@ if (!CastInst::castIsValid((yyvsp[-3].CastOpVal), Val, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal), Val, DestTy); delete (yyvsp[0].TypeVal); ;} @@ -5286,9 +5286,9 @@ #line 2638 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-4].ValueVal)->getType() != Type::Int1Ty) - GEN_ERROR("select condition must be boolean!"); + GEN_ERROR("select condition must be boolean"); if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType()) - GEN_ERROR("select value types should match!"); + GEN_ERROR("select value types should match"); (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} @@ -5309,7 +5309,7 @@ #line 2653 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} @@ -5319,7 +5319,7 @@ #line 2659 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} @@ -5329,7 +5329,7 @@ #line 2665 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} @@ -5340,12 +5340,12 @@ { const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); if (!Ty->isFirstClassType()) - GEN_ERROR("PHI node operands must be of first class type!"); + GEN_ERROR("PHI node operands must be of first class type"); (yyval.InstVal) = new PHINode(Ty); ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size()); while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) { if ((yyvsp[0].PHIList)->front().first->getType() != Ty) - GEN_ERROR("All elements of a PHI node must be of the same type!"); + GEN_ERROR("All elements of a PHI node must be of the same type"); cast((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second); (yyvsp[0].PHIList)->pop_front(); } @@ -5388,7 +5388,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -5400,7 +5400,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } if (Ty->isVarArg()) { @@ -5408,7 +5408,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the call node CallInst *CI = new CallInst(V, Args); @@ -5496,7 +5496,7 @@ { if (!isa((yyvsp[0].ValueVal)->getType())) GEN_ERROR("Trying to free nonpointer type " + - (yyvsp[0].ValueVal)->getType()->getDescription() + "!"); + (yyvsp[0].ValueVal)->getType()->getDescription() + ""); (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} @@ -5532,7 +5532,7 @@ const Type *ElTy = PT->getElementType(); if (ElTy != (yyvsp[-3].ValueVal)->getType()) GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() + - "' into space of type '" + ElTy->getDescription() + "'!"); + "' into space of type '" + ElTy->getDescription() + "'"); Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR @@ -5547,11 +5547,11 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); if (!isa((yyvsp[-2].TypeVal)->get())) - GEN_ERROR("getelementptr insn requires pointer operand!"); + GEN_ERROR("getelementptr insn requires pointer operand"); if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), *(yyvsp[0].ValueList), true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*(yyvsp[-2].TypeVal))->getDescription()+ "'!"); + (*(yyvsp[-2].TypeVal))->getDescription()+ "'"); Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[0].ValueList)); Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.63 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.64 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.63 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Mon Feb 5 04:18:06 2007 @@ -283,7 +283,7 @@ } break; default: - GenerateError("Internal parser error: Invalid symbol type reference!"); + GenerateError("Internal parser error: Invalid symbol type reference"); return 0; } @@ -370,7 +370,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Signed integral constant '" + itostr(D.ConstPool64) + "' is invalid for type '" + - Ty->getDescription() + "'!"); + Ty->getDescription() + "'"); return 0; } return ConstantInt::get(Ty, D.ConstPool64); @@ -379,7 +379,7 @@ if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Integral constant '" + utostr(D.UConstPool64) + - "' is invalid or out of range!"); + "' is invalid or out of range"); return 0; } else { // This is really a signed reference. Transmogrify. return ConstantInt::get(Ty, D.ConstPool64); @@ -390,14 +390,14 @@ case ValID::ConstFPVal: // Is it a floating point const pool reference? if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) { - GenerateError("FP constant invalid for type!!"); + GenerateError("FP constant invalid for type"); return 0; } return ConstantFP::get(Ty, D.ConstPoolFP); case ValID::ConstNullVal: // Is it a null value? if (!isa(Ty)) { - GenerateError("Cannot create a a non pointer null!"); + GenerateError("Cannot create a a non pointer null"); return 0; } return ConstantPointerNull::get(cast(Ty)); @@ -410,7 +410,7 @@ case ValID::ConstantVal: // Fully resolved constant? if (D.ConstantValue->getType() != Ty) { - GenerateError("Constant expression type different from required type!"); + GenerateError("Constant expression type different from required type"); return 0; } return D.ConstantValue; @@ -420,7 +420,7 @@ const FunctionType *FTy = PTy ? dyn_cast(PTy->getElementType()) : 0; if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) { - GenerateError("Invalid type for asm constraint string!"); + GenerateError("Invalid type for asm constraint string"); return 0; } InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints, @@ -429,11 +429,11 @@ return IA; } default: - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } // End of switch - assert(0 && "Unhandled case!"); + assert(0 && "Unhandled case"); return 0; } @@ -455,7 +455,7 @@ if (TriggerError) return 0; if (!Ty->isFirstClassType() && !isa(Ty)) { - GenerateError("Invalid use of a composite type!"); + GenerateError("Invalid use of a composite type"); return 0; } @@ -484,7 +484,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope!"); + assert(inFunctionScope() && "Can't get basic block at global scope"); std::string Name; BasicBlock *BB = 0; @@ -573,7 +573,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); ValID &DID = PHI->second.first; @@ -635,15 +635,15 @@ free(NameStr); // Free old string if (V->getType() == Type::VoidTy) { - GenerateError("Can't assign name '" + Name+"' to value with void type!"); + GenerateError("Can't assign name '" + Name+"' to value with void type"); return; } - assert(inFunctionScope() && "Must be in function scope!"); + assert(inFunctionScope() && "Must be in function scope"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + - V->getType()->getDescription() + "'!"); + V->getType()->getDescription() + "'"); return; } @@ -660,7 +660,7 @@ bool isConstantGlobal, const Type *Ty, Constant *Initializer) { if (isa(Ty)) { - GenerateError("Cannot declare global vars of function type!"); + GenerateError("Cannot declare global vars of function type"); return 0; } @@ -702,7 +702,7 @@ // the same as the old one. if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'!"); + "' of type '" + Ty->getDescription() + "'"); return 0; } } @@ -724,7 +724,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names!"); + assert(!inFunctionScope() && "Can't give types function-local names"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -732,7 +732,7 @@ // We don't allow assigning names to void type if (T == Type::VoidTy) { - GenerateError("Can't assign name '" + Name + "' to the void type!"); + GenerateError("Can't assign name '" + Name + "' to the void type"); return false; } @@ -759,7 +759,7 @@ // Any other kind of (non-equivalent) redefinition is an error. GenerateError("Redefinition of type named '" + Name + "' of type '" + - T->getDescription() + "'!"); + T->getDescription() + "'"); } return false; @@ -1126,7 +1126,7 @@ X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } | CC_TOK EUINT64VAL { if ((unsigned)$2 != $2) - GEN_ERROR("Calling conv too large!"); + GEN_ERROR("Calling conv too large"); $$ = $2; CHECK_FOR_ERROR }; @@ -1159,14 +1159,14 @@ ALIGN EUINT64VAL { $$ = $2; if ($$ != 0 && !isPowerOf2_32($$)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR }; OptCAlign : /*empty*/ { $$ = 0; } | ',' ALIGN EUINT64VAL { $$ = $3; if ($$ != 0 && !isPowerOf2_32($$)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR }; @@ -1174,7 +1174,7 @@ SectionString : SECTION STRINGCONSTANT { for (unsigned i = 0, e = strlen($2); i != e; ++i) if ($2[i] == '"' || $2[i] == '\\') - GEN_ERROR("Invalid character in section name!"); + GEN_ERROR("Invalid character in section name"); $$ = $2; CHECK_FOR_ERROR }; @@ -1194,7 +1194,7 @@ } | ALIGN EUINT64VAL { if ($2 != 0 && !isPowerOf2_32($2)) - GEN_ERROR("Alignment must be a power of two!"); + GEN_ERROR("Alignment must be a power of two"); CurGV->setAlignment($2); CHECK_FOR_ERROR }; @@ -1229,7 +1229,7 @@ $$ = new PATypeHolder(tmp); } | '\\' EUINT64VAL { // Type UpReference - if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector... $$ = new PATypeHolder(OT); @@ -1284,7 +1284,7 @@ if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger()) GEN_ERROR("Element type of a PackedType must be primitive"); if (!isPowerOf2_32($2)) - GEN_ERROR("Vector length should be a power of 2!"); + GEN_ERROR("Vector length should be a power of 2"); $$ = new PATypeHolder(HandleUpRefs(PackedType::get(*$4, (unsigned)$2))); delete $4; CHECK_FOR_ERROR @@ -1331,7 +1331,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); if (!(*$1)->isFirstClassType()) - GEN_ERROR("LLVM functions cannot return aggregate types!"); + GEN_ERROR("LLVM functions cannot return aggregate types"); $$ = $1; } | VOID { @@ -1396,7 +1396,7 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); @@ -1404,7 +1404,7 @@ if (NumElements != -1 && NumElements != (int)$3->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + utostr($3->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < $3->size(); i++) { @@ -1424,12 +1424,12 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" - " arguments, but has size of " + itostr(NumElements) +"!"); + " arguments, but has size of " + itostr(NumElements) +""); $$ = ConstantArray::get(ATy, std::vector()); delete $1; CHECK_FOR_ERROR @@ -1440,7 +1440,7 @@ const ArrayType *ATy = dyn_cast($1->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); @@ -1448,7 +1448,7 @@ if (NumElements != -1 && NumElements != (EndStr-$3)) GEN_ERROR("Can't build string constant of size " + itostr((int)(EndStr-$3)) + - " when array has size " + itostr(NumElements) + "!"); + " when array has size " + itostr(NumElements) + ""); std::vector Vals; if (ETy == Type::Int8Ty) { for (unsigned char *C = (unsigned char *)$3; @@ -1456,7 +1456,7 @@ Vals.push_back(ConstantInt::get(ETy, *C)); } else { free($3); - GEN_ERROR("Cannot build string arrays of non byte sized elements!"); + GEN_ERROR("Cannot build string arrays of non byte sized elements"); } free($3); $$ = ConstantArray::get(ATy, Vals); @@ -1469,7 +1469,7 @@ const PackedType *PTy = dyn_cast($1->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); @@ -1477,7 +1477,7 @@ if (NumElements != -1 && NumElements != (int)$3->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + utostr($3->size()) + " arguments, but has size of " + - itostr(NumElements) + "!"); + itostr(NumElements) + ""); // Verify all elements are correct type! for (unsigned i = 0; i < $3->size(); i++) { @@ -1495,10 +1495,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if ($3->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = $3->size(); i != e; ++i) @@ -1506,7 +1506,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -1522,10 +1522,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is not packed if (STy->isPacked()) @@ -1539,10 +1539,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if ($4->size() != STy->getNumContainedTypes()) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! for (unsigned i = 0, e = $4->size(); i != e; ++i) @@ -1550,7 +1550,7 @@ GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + - " of structure initializer!"); + " of structure initializer"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -1566,10 +1566,10 @@ const StructType *STy = dyn_cast($1->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) - GEN_ERROR("Illegal number of initializers for structure type!"); + GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that Type is packed if (!STy->isPacked()) @@ -1585,7 +1585,7 @@ const PointerType *PTy = dyn_cast($1->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*$1)->getDescription() + "'!"); + (*$1)->getDescription() + "'"); $$ = ConstantPointerNull::get(PTy); delete $1; @@ -1603,7 +1603,7 @@ GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); const PointerType *Ty = dyn_cast($1->get()); if (Ty == 0) - GEN_ERROR("Global const reference must be a pointer type!"); + GEN_ERROR("Global const reference must be a pointer type"); // ConstExprs can exist in the body of a function, thus creating // GlobalValues whenever they refer to a variable. Because we are in @@ -1625,7 +1625,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers!"); + assert(isa(Ty) && "Globals may only be used as pointers"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -1679,20 +1679,20 @@ GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); const Type *Ty = $1->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) - GEN_ERROR("Cannot create a null initialized value of this type!"); + GEN_ERROR("Cannot create a null initialized value of this type"); $$ = Constant::getNullValue(Ty); delete $1; CHECK_FOR_ERROR } | IntType ESINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } | IntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) - GEN_ERROR("Constant value doesn't fit in type!"); + GEN_ERROR("Constant value doesn't fit in type"); $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } @@ -1708,7 +1708,7 @@ } | FPType FPVAL { // Float & Double constants if (!ConstantFP::isValueValidForType($1, $2)) - GEN_ERROR("Floating point constant invalid for type!!"); + GEN_ERROR("Floating point constant invalid for type"); $$ = ConstantFP::get($1, $2); CHECK_FOR_ERROR }; @@ -1722,25 +1722,25 @@ if (!CastInst::castIsValid($1, $3, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); $$ = ConstantExpr::getCast($1, $3, DestTy); delete $5; } | GETELEMENTPTR '(' ConstVal IndexList ')' { if (!isa($3->getType())) - GEN_ERROR("GetElementPtr requires a pointer operand!"); + GEN_ERROR("GetElementPtr requires a pointer operand"); const Type *IdxTy = GetElementPtrInst::getIndexedType($3->getType(), *$4, true); if (!IdxTy) - GEN_ERROR("Index list invalid for constant getelementptr!"); + GEN_ERROR("Index list invalid for constant getelementptr"); SmallVector IdxVec; for (unsigned i = 0, e = $4->size(); i != e; ++i) if (Constant *C = dyn_cast((*$4)[i])) IdxVec.push_back(C); else - GEN_ERROR("Indices to constant getelementptr must be constants!"); + GEN_ERROR("Indices to constant getelementptr must be constants"); delete $4; @@ -1749,54 +1749,54 @@ } | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' { if ($3->getType() != Type::Int1Ty) - GEN_ERROR("Select condition must be of boolean type!"); + GEN_ERROR("Select condition must be of boolean type"); if ($5->getType() != $7->getType()) - GEN_ERROR("Select operand types must match!"); + GEN_ERROR("Select operand types must match"); $$ = ConstantExpr::getSelect($3, $5, $7); CHECK_FOR_ERROR } | ArithmeticOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) - GEN_ERROR("Binary operator types must match!"); + GEN_ERROR("Binary operator types must match"); CHECK_FOR_ERROR; $$ = ConstantExpr::get($1, $3, $5); } | LogicalOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) - GEN_ERROR("Logical operator types must match!"); + GEN_ERROR("Logical operator types must match"); if (!$3->getType()->isInteger()) { if (Instruction::isShift($1) || !isa($3->getType()) || !cast($3->getType())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } $$ = ConstantExpr::get($1, $3, $5); CHECK_FOR_ERROR } | ICMP IPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) - GEN_ERROR("icmp operand types must match!"); + GEN_ERROR("icmp operand types must match"); $$ = ConstantExpr::getICmp($2, $4, $6); } | FCMP FPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) - GEN_ERROR("fcmp operand types must match!"); + GEN_ERROR("fcmp operand types must match"); $$ = ConstantExpr::getFCmp($2, $4, $6); } | EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' { if (!ExtractElementInst::isValidOperands($3, $5)) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); $$ = ConstantExpr::getExtractElement($3, $5); CHECK_FOR_ERROR } | INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' { if (!InsertElementInst::isValidOperands($3, $5, $7)) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); $$ = ConstantExpr::getInsertElement($3, $5, $7); CHECK_FOR_ERROR } | SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' { if (!ShuffleVectorInst::isValidOperands($3, $5, $7)) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); $$ = ConstantExpr::getShuffleVector($3, $5, $7); CHECK_FOR_ERROR }; @@ -1904,7 +1904,7 @@ | OptGlobalAssign GVVisibilityStyle GlobalType ConstVal { /* "Externally Visible" Linkage */ if ($4 == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage, $2, $3, $4->getType(), $4); CHECK_FOR_ERROR @@ -1913,7 +1913,7 @@ } | OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal { if ($5 == 0) - GEN_ERROR("Global value initializer is not a constant!"); + GEN_ERROR("Global value initializer is not a constant"); CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5); CHECK_FOR_ERROR } GlobalVarAttributes { @@ -1985,7 +1985,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription()); if (*$3 == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = $4; E.Ty = $3; E.Name = $5; $$ = $1; $1->push_back(E); @@ -1995,7 +1995,7 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); if (*$1 == Type::VoidTy) - GEN_ERROR("void typed arguments are invalid!"); + GEN_ERROR("void typed arguments are invalid"); ArgListEntry E; E.Attrs = $2; E.Ty = $1; E.Name = $3; $$ = new ArgListType; $$->push_back(E); @@ -2082,7 +2082,7 @@ // If this is the case, either we need to be a forward decl, or it needs // to be. if (!CurFun.isDeclare && !Fn->isDeclaration()) - GEN_ERROR("Redefinition of function '" + FunctionName + "'!"); + GEN_ERROR("Redefinition of function '" + FunctionName + "'"); // Make sure to strip off any argument names so we can't get conflicts. if (Fn->isDeclaration()) @@ -2116,7 +2116,7 @@ if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& - "Not a varargs marker!"); + "Not a varargs marker"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } @@ -2377,7 +2377,7 @@ if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else - GEN_ERROR("Switch case is constant, but not a simple integer!"); + GEN_ERROR("Switch case is constant, but not a simple integer"); } delete $8; CHECK_FOR_ERROR @@ -2428,7 +2428,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -2439,7 +2439,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } @@ -2448,7 +2448,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the InvokeInst @@ -2474,7 +2474,7 @@ Constant *V = cast(getValNonImprovising($2, $3)); CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal($6); CHECK_FOR_ERROR @@ -2486,7 +2486,7 @@ CHECK_FOR_ERROR if (V == 0) - GEN_ERROR("May only switch on a constant pool value!"); + GEN_ERROR("May only switch on a constant pool value"); BasicBlock* tmpBB = getBBVal($5); CHECK_FOR_ERROR @@ -2565,19 +2565,19 @@ if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() && !isa((*$2).get())) GEN_ERROR( - "Arithmetic operator requires integer, FP, or packed operands!"); + "Arithmetic operator requires integer, FP, or packed operands"); if (isa((*$2).get()) && ($1 == Instruction::URem || $1 == Instruction::SRem || $1 == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types!"); + GEN_ERROR("U/S/FRem not supported on packed types"); Value* val1 = getVal(*$2, $3); CHECK_FOR_ERROR Value* val2 = getVal(*$2, $5); CHECK_FOR_ERROR $$ = BinaryOperator::create($1, val1, val2); if ($$ == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete $2; } | LogicalOps Types ValueRef ',' ValueRef { @@ -2586,7 +2586,7 @@ if (!(*$2)->isInteger()) { if (Instruction::isShift($1) || !isa($2->get()) || !cast($2->get())->getElementType()->isInteger()) - GEN_ERROR("Logical operator requires integral operands!"); + GEN_ERROR("Logical operator requires integral operands"); } Value* tmpVal1 = getVal(*$2, $3); CHECK_FOR_ERROR @@ -2594,7 +2594,7 @@ CHECK_FOR_ERROR $$ = BinaryOperator::create($1, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("binary operator returned null!"); + GEN_ERROR("binary operator returned null"); delete $2; } | ICMP IPredicates Types ValueRef ',' ValueRef { @@ -2608,7 +2608,7 @@ CHECK_FOR_ERROR $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("icmp operator returned null!"); + GEN_ERROR("icmp operator returned null"); } | FCMP FPredicates Types ValueRef ',' ValueRef { if (!UpRefs.empty()) @@ -2621,7 +2621,7 @@ CHECK_FOR_ERROR $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); if ($$ == 0) - GEN_ERROR("fcmp operator returned null!"); + GEN_ERROR("fcmp operator returned null"); } | CastOps ResolvedVal TO Types { if (!UpRefs.empty()) @@ -2631,15 +2631,15 @@ if (!CastInst::castIsValid($1, Val, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + - DestTy->getDescription() + "'!"); + DestTy->getDescription() + "'"); $$ = CastInst::create($1, Val, DestTy); delete $4; } | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal { if ($2->getType() != Type::Int1Ty) - GEN_ERROR("select condition must be boolean!"); + GEN_ERROR("select condition must be boolean"); if ($4->getType() != $6->getType()) - GEN_ERROR("select value types should match!"); + GEN_ERROR("select value types should match"); $$ = new SelectInst($2, $4, $6); CHECK_FOR_ERROR } @@ -2652,31 +2652,31 @@ } | EXTRACTELEMENT ResolvedVal ',' ResolvedVal { if (!ExtractElementInst::isValidOperands($2, $4)) - GEN_ERROR("Invalid extractelement operands!"); + GEN_ERROR("Invalid extractelement operands"); $$ = new ExtractElementInst($2, $4); CHECK_FOR_ERROR } | INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal { if (!InsertElementInst::isValidOperands($2, $4, $6)) - GEN_ERROR("Invalid insertelement operands!"); + GEN_ERROR("Invalid insertelement operands"); $$ = new InsertElementInst($2, $4, $6); CHECK_FOR_ERROR } | SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal { if (!ShuffleVectorInst::isValidOperands($2, $4, $6)) - GEN_ERROR("Invalid shufflevector operands!"); + GEN_ERROR("Invalid shufflevector operands"); $$ = new ShuffleVectorInst($2, $4, $6); CHECK_FOR_ERROR } | PHI_TOK PHIList { const Type *Ty = $2->front().first->getType(); if (!Ty->isFirstClassType()) - GEN_ERROR("PHI node operands must be of first class type!"); + GEN_ERROR("PHI node operands must be of first class type"); $$ = new PHINode(Ty); ((PHINode*)$$)->reserveOperandSpace($2->size()); while ($2->begin() != $2->end()) { if ($2->front().first->getType() != Ty) - GEN_ERROR("All elements of a PHI node must be of the same type!"); + GEN_ERROR("All elements of a PHI node must be of the same type"); cast($$)->addIncoming($2->front().first, $2->front().second); $2->pop_front(); } @@ -2716,7 +2716,7 @@ // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " - "expects arguments!"); + "expects arguments"); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! @@ -2728,7 +2728,7 @@ for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + - (*I)->getDescription() + "'!"); + (*I)->getDescription() + "'"); Args.push_back(ArgI->Val); } if (Ty->isVarArg()) { @@ -2736,7 +2736,7 @@ for (; ArgI != ArgE; ++ArgI) Args.push_back(ArgI->Val); // push the remaining varargs } else if (I != E || ArgI != ArgE) - GEN_ERROR("Invalid number of parameters detected!"); + GEN_ERROR("Invalid number of parameters detected"); } // Create the call node CallInst *CI = new CallInst(V, Args); @@ -2796,7 +2796,7 @@ | FREE ResolvedVal { if (!isa($2->getType())) GEN_ERROR("Trying to free nonpointer type " + - $2->getType()->getDescription() + "!"); + $2->getType()->getDescription() + ""); $$ = new FreeInst($2); CHECK_FOR_ERROR } @@ -2825,7 +2825,7 @@ const Type *ElTy = PT->getElementType(); if (ElTy != $3->getType()) GEN_ERROR("Can't store '" + $3->getType()->getDescription() + - "' into space of type '" + ElTy->getDescription() + "'!"); + "' into space of type '" + ElTy->getDescription() + "'"); Value* tmpVal = getVal(*$5, $6); CHECK_FOR_ERROR @@ -2836,11 +2836,11 @@ if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription()); if (!isa($2->get())) - GEN_ERROR("getelementptr insn requires pointer operand!"); + GEN_ERROR("getelementptr insn requires pointer operand"); if (!GetElementPtrInst::getIndexedType(*$2, *$4, true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*$2)->getDescription()+ "'!"); + (*$2)->getDescription()+ "'"); Value* tmpVal = getVal(*$2, $3); CHECK_FOR_ERROR $$ = new GetElementPtrInst(tmpVal, *$4); From reid at x10sys.com Mon Feb 5 04:09:57 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 04:09:57 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/X86/overlap-add.ll Message-ID: <200702051009.l15A9vYs018600@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/X86: overlap-add.ll updated: 1.5 -> 1.6 --- Log message: Make the RUN: line readable. --- Diffs of the changes: (+2 -1) overlap-add.ll | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/test/CodeGen/X86/overlap-add.ll diff -u llvm/test/CodeGen/X86/overlap-add.ll:1.5 llvm/test/CodeGen/X86/overlap-add.ll:1.6 --- llvm/test/CodeGen/X86/overlap-add.ll:1.5 Fri Dec 1 22:23:08 2006 +++ llvm/test/CodeGen/X86/overlap-add.ll Mon Feb 5 04:09:41 2007 @@ -6,7 +6,8 @@ ; Check that the shift gets turned into an LEA. -; RUN: llvm-upgrade < %s | llvm-as | llc -march=x86 -x86-asm-syntax=intel | not grep 'mov E.X, E.X' +; RUN: llvm-upgrade < %s | llvm-as | llc -march=x86 -x86-asm-syntax=intel | \ +; RUN: not grep 'mov E.X, E.X' ; FIXME: We need live variable information about flags to do this xform safely. :( ; XFAIL: * From lauro.venancio at gmail.com Mon Feb 5 10:34:12 2007 From: lauro.venancio at gmail.com (Lauro Ramos Venancio) Date: Mon, 5 Feb 2007 10:34:12 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/ARM/unord.ll Message-ID: <200702051634.l15GYCg9025010@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/ARM: unord.ll updated: 1.1 -> 1.2 --- Log message: Fix unord test. --- Diffs of the changes: (+2 -2) unord.ll | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/test/CodeGen/ARM/unord.ll diff -u llvm/test/CodeGen/ARM/unord.ll:1.1 llvm/test/CodeGen/ARM/unord.ll:1.2 --- llvm/test/CodeGen/ARM/unord.ll:1.1 Fri Feb 2 18:50:45 2007 +++ llvm/test/CodeGen/ARM/unord.ll Mon Feb 5 10:33:56 2007 @@ -1,6 +1,6 @@ ; RUN: llvm-as < %s | llc -march=arm && -; RUN: llvm-as < %s | llc -march=arm | grep bne | wc -l | grep 1 && -; RUN: llvm-as < %s | llc -march=arm | grep beq | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -march=arm | grep movne | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -march=arm | grep moveq | wc -l | grep 1 && ; RUN: llvm-as < %s | llc -march=arm -enable-thumb && ; RUN: llvm-as < %s | llc -march=arm -enable-thumb | grep bne | wc -l | grep 1 && ; RUN: llvm-as < %s | llc -march=arm -enable-thumb | grep beq | wc -l | grep 1 From reid at x10sys.com Mon Feb 5 11:01:36 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 11:01:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200702051701.l15H1akM026186@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.318 -> 1.319 --- Log message: ! removal was a little over zealous. Put the ! back in asserts. --- Diffs of the changes: (+9 -9) llvmAsmParser.y | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.318 llvm/lib/AsmParser/llvmAsmParser.y:1.319 --- llvm/lib/AsmParser/llvmAsmParser.y:1.318 Mon Feb 5 04:16:10 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Feb 5 11:01:20 2007 @@ -429,11 +429,11 @@ return IA; } default: - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } // End of switch - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } @@ -484,7 +484,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope"); + assert(inFunctionScope() && "Can't get basic block at global scope!"); std::string Name; BasicBlock *BB = 0; @@ -573,7 +573,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); ValID &DID = PHI->second.first; @@ -639,7 +639,7 @@ return; } - assert(inFunctionScope() && "Must be in function scope"); + assert(inFunctionScope() && "Must be in function scope!"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + @@ -724,7 +724,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names"); + assert(!inFunctionScope() && "Can't give types function-local names!"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -741,7 +741,7 @@ if (AlreadyExists) { // Inserting a name that is already defined??? const Type *Existing = CurModule.CurrentModule->getTypeByName(Name); - assert(Existing && "Conflict but no matching type?"); + assert(Existing && "Conflict but no matching type?!"); // There is only one case where this is allowed: when we are refining an // opaque type. In this case, Existing will be an opaque type. @@ -1625,7 +1625,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers"); + assert(isa(Ty) && "Globals may only be used as pointers!"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -2116,7 +2116,7 @@ if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& - "Not a varargs marker"); + "Not a varargs marker!"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } From reid at x10sys.com Mon Feb 5 11:04:17 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 11:04:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs llvmAsmParser.y.cvs Message-ID: <200702051704.l15H4HGW026337@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp.cvs updated: 1.63 -> 1.64 llvmAsmParser.y.cvs updated: 1.64 -> 1.65 --- Log message: Regenerate. --- Diffs of the changes: (+18 -18) llvmAsmParser.cpp.cvs | 18 +++++++++--------- llvmAsmParser.y.cvs | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.63 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.64 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.63 Mon Feb 5 04:18:06 2007 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Mon Feb 5 11:04:00 2007 @@ -749,11 +749,11 @@ return IA; } default: - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } // End of switch - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } @@ -804,7 +804,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope"); + assert(inFunctionScope() && "Can't get basic block at global scope!"); std::string Name; BasicBlock *BB = 0; @@ -893,7 +893,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); ValID &DID = PHI->second.first; @@ -959,7 +959,7 @@ return; } - assert(inFunctionScope() && "Must be in function scope"); + assert(inFunctionScope() && "Must be in function scope!"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + @@ -1044,7 +1044,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names"); + assert(!inFunctionScope() && "Can't give types function-local names!"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -1061,7 +1061,7 @@ if (AlreadyExists) { // Inserting a name that is already defined??? const Type *Existing = CurModule.CurrentModule->getTypeByName(Name); - assert(Existing && "Conflict but no matching type?"); + assert(Existing && "Conflict but no matching type?!"); // There is only one case where this is allowed: when we are refining an // opaque type. In this case, Existing will be an opaque type. @@ -3933,7 +3933,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers"); + assert(isa(Ty) && "Globals may only be used as pointers!"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -4596,7 +4596,7 @@ if ((yyvsp[-4].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0&& - "Not a varargs marker"); + "Not a varargs marker!"); delete (yyvsp[-4].ArgList)->back().Ty; (yyvsp[-4].ArgList)->pop_back(); // Delete the last entry } Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.64 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.65 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.64 Mon Feb 5 04:18:06 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Mon Feb 5 11:04:00 2007 @@ -429,11 +429,11 @@ return IA; } default: - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } // End of switch - assert(0 && "Unhandled case"); + assert(0 && "Unhandled case!"); return 0; } @@ -484,7 +484,7 @@ /// or may not be a forward reference. /// static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { - assert(inFunctionScope() && "Can't get basic block at global scope"); + assert(inFunctionScope() && "Can't get basic block at global scope!"); std::string Name; BasicBlock *BB = 0; @@ -573,7 +573,7 @@ std::map >::iterator PHI = CurModule.PlaceHolderInfo.find(V); - assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error"); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); ValID &DID = PHI->second.first; @@ -639,7 +639,7 @@ return; } - assert(inFunctionScope() && "Must be in function scope"); + assert(inFunctionScope() && "Must be in function scope!"); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); if (ST.lookup(V->getType(), Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + @@ -724,7 +724,7 @@ // allowed to be redefined in the specified context. If the name is a new name // for the type plane, it is inserted and false is returned. static bool setTypeName(const Type *T, char *NameStr) { - assert(!inFunctionScope() && "Can't give types function-local names"); + assert(!inFunctionScope() && "Can't give types function-local names!"); if (NameStr == 0) return false; std::string Name(NameStr); // Copy string @@ -741,7 +741,7 @@ if (AlreadyExists) { // Inserting a name that is already defined??? const Type *Existing = CurModule.CurrentModule->getTypeByName(Name); - assert(Existing && "Conflict but no matching type?"); + assert(Existing && "Conflict but no matching type?!"); // There is only one case where this is allowed: when we are refining an // opaque type. In this case, Existing will be an opaque type. @@ -1625,7 +1625,7 @@ // in the future with the right type of variable. // if (V == 0) { - assert(isa(Ty) && "Globals may only be used as pointers"); + assert(isa(Ty) && "Globals may only be used as pointers!"); const PointerType *PT = cast(Ty); // First check to see if the forward references value is already created! @@ -2116,7 +2116,7 @@ if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& - "Not a varargs marker"); + "Not a varargs marker!"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } From zhousheng00 at gmail.com Mon Feb 5 11:29:32 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Mon, 5 Feb 2007 11:29:32 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702051729.l15HTWwe027584@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h added (r1.1) --- Log message: Add a class APInt to represent arbitrary precision constant integral values. It is a functional replacement for common case integer type like "unsigned", "uint64_t", but also allows non-byte-width integer type and large integer value types such as 3-bits, 15-bits, or more than 64-bits of precision. For more details, see pr1043: http://llvm.org/PR1043 . --- Diffs of the changes: (+489 -0) APInt.h | 489 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 489 insertions(+) Index: llvm/include/llvm/ADT/APInt.h diff -c /dev/null llvm/include/llvm/ADT/APInt.h:1.1 *** /dev/null Mon Feb 5 11:29:26 2007 --- llvm/include/llvm/ADT/APInt.h Mon Feb 5 11:29:16 2007 *************** *** 0 **** --- 1,489 ---- + //===-- llvm/Support/APInt.h - For Arbitrary Precision Integer -*- C++ -*--===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Sheng Zhou and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements a class to represent arbitrary precision integral + // constant values. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_APINT_H + #define LLVM_APINT_H + + #include "llvm/Support/DataTypes.h" + #include + + namespace llvm { + + //===----------------------------------------------------------------------===// + // APInt Class + //===----------------------------------------------------------------------===// + + /// APInt - This class represents arbitrary precision constant integral values. + /// It is a functional replacement for common case unsigned integer type like + /// "unsigned", "unsigned long" or "uint64_t", but also allows non-byte-width + /// integer type and large integer value types such as 3-bits, 15-bits, or more + /// than 64-bits of precision. APInt provides a variety of arithmetic operators + /// and methods to manipulate integer values of any bit-width. It supports not + /// only all the operations of uint64_t but also bitwise manipulation. + /// + /// @brief Class for arbitrary precision integers. + /// + class APInt { + /// Friend Functions of APInt Declared here. For detailed comments, + /// see bottom of this file. + friend bool isIntN(unsigned N, const APInt& APIVal); + friend APInt ByteSwap(const APInt& APIVal); + friend APInt LogBase2(const APInt& APIVal); + friend double APIntToDouble(const APInt& APIVal); + friend float APIntToFloat(const APInt& APIVal); + + unsigned bitsnum; ///< The number of bits. + bool isSigned; ///< The sign flag for this APInt. + + /// This union is used to store the integer value. When the + /// integer bit-width <= 64, it is used as an uint64_t; + /// otherwise it uses an uint64_t array. + union { + uint64_t VAL; ///< Used to store the <= 64 bits integer value. + uint64_t *pVal; ///< Used to store the >64 bits integer value. + }; + + /// This enum is just used to hold constant we needed for APInt. + enum { + APINT_BITS_PER_WORD = sizeof(uint64_t) * 8 + }; + + /// @returns the number of words to hold the integer value of this APInt. + /// Here one word's bitwidth equals to that of uint64_t. + /// @brief Get the number of the words. + inline unsigned numWords() const { + return bitsnum < 1 ? 0 : (bitsnum + APINT_BITS_PER_WORD - 1) / + APINT_BITS_PER_WORD; + } + + /// @returns true if the number of bits <= 64, false otherwise. + /// @brief Determine if this APInt just has one word to store value. + inline bool isSingleWord() const + { return bitsnum <= APINT_BITS_PER_WORD; } + + /// @returns the word position for the specified bit position. + /// Note: the bitPosition and the return value are zero-based. + static inline unsigned whichWord(unsigned bitPosition) + { return bitPosition / APINT_BITS_PER_WORD; } + + /// @returns the byte position for the specified bit position. + /// Note: the bitPosition and the return value are zero-based. + static inline unsigned whichByte(unsigned bitPosition); + + /// @returns the bit position in a word for the specified bit position + /// in APInt. + /// Note: the bitPosition and the return value are zero-based. + static inline unsigned whichBit(unsigned bitPosition) + { return bitPosition % APINT_BITS_PER_WORD; } + + /// @returns a uint64_t type integer with just bit position at + /// "whichBit(bitPosition)" setting, others zero. + /// Note: the bitPosition and the return value are zero-based. + static inline uint64_t maskBit(unsigned bitPosition) + { return (static_cast(1)) << whichBit(bitPosition); } + + inline void TruncToBits() { + if (isSingleWord()) + VAL &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum); + else + pVal[numWords() - 1] &= ~uint64_t(0ULL) >> + (APINT_BITS_PER_WORD - (whichBit(bitsnum - 1) + 1)); + } + + /// @returns the corresponding word for the specified bit position. + /// Note: the bitPosition is zero-based. + inline uint64_t& getWord(unsigned bitPosition); + + /// @returns the corresponding word for the specified bit position. + /// This is a constant version. + /// Note: the bitPosition is zero-based. + inline uint64_t getWord(unsigned bitPosition) const; + + /// mul_1 - This function performs the multiplication operation on a + /// large integer (represented as a integer array) and a uint64_t integer. + /// @returns the carry of the multiplication. + static uint64_t mul_1(uint64_t dest[], uint64_t x[], + unsigned len, uint64_t y); + + /// mul - This function performs the multiplication operation on two large + /// integers (represented as integer arrays). + static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, + uint64_t y[], unsigned ylen); + + /// add_1 - This function performs the addition operation on a large integer + /// and a uint64_t integer. + /// @returns the carry of the addtion. + static uint64_t add_1(uint64_t dest[], uint64_t x[], + unsigned len, uint64_t y); + + /// add - This function performs the addtion operation on two large integers. + static uint64_t add(uint64_t dest[], uint64_t x[], + uint64_t y[], unsigned len); + + /// sub_1 - This function performs the subtraction operation on a large + /// integer and a uint64_t integer. + static uint64_t sub_1(uint64_t x[], unsigned len, uint64_t y); + + /// sub - This function performs the subtraction operation on two large + /// integers. + static uint64_t sub(uint64_t dest[], uint64_t x[], + uint64_t y[], unsigned len); + + /// unitDiv - This function divides uint64_t N by unsigned D. + /// @returns (remainder << 32) + quotient. + /// @assumes (N >> 32) < D. + static uint64_t unitDiv(uint64_t N, unsigned D); + + /// subMul - This function subtract x[len-1 : 0] * y from + /// dest[offset+len-1 : offset]. + /// @returns the most significant word of the product, minus borrow-out from + /// the subtraction. + static unsigned subMul(unsigned dest[], unsigned offset, + unsigned x[], unsigned len, unsigned y); + + /// div - This function divides the large integer zds[] by y[]. + /// The remainder ends up in zds[ny-1 : 0]. + /// The quotient ends up in zds[ny : nx]. + /// @assumes nx > ny and (int)y[ny-1] < 0. + static void div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny); + + /// lshift - This function shifts x[len-1 : 0] by shiftAmt, and store the + /// "len" least significant words of the result in + /// dest[d_offset+len-1 : d_offset]. + /// @returns the bits shifted out from the most significant digit. + static uint64_t lshift(uint64_t dest[], unsigned d_offset, + uint64_t x[], unsigned len, unsigned shiftAmt); + + public: + /// Create a new APInt of numBits bit-width, and initalized as val. + APInt(uint64_t val = 0, unsigned numBits = APINT_BITS_PER_WORD, + bool sign = false); + + /// Create a new APInt of numBits bit-width, and initalized as bigVal[]. + APInt(unsigned numBits, uint64_t bigVal[], bool sign = false); + + /// Create a new APInt by translating the string represented integer value. + APInt(std::string& Val, uint8_t radix = 10, bool sign = false); + + /// Copy Constructor. + APInt(const APInt& API); + + /// Destructor. + ~APInt(); + + /// @brief Copy assignment operator. Create a new object from the given + /// APInt one by initialization. + APInt& operator=(const APInt& RHS); + + /// @brief Assignment operator. Assigns a common case integer value to + /// the APInt. + APInt& operator=(uint64_t RHS); + + /// @brief Postfix increment operator. Increments the APInt by one. + const APInt operator++(int); + + /// @brief Prefix increment operator. Increments the APInt by one. + APInt& operator++(); + + /// @brief Postfix decrement operator. Decrements the APInt by one. + const APInt operator--(int); + + /// @brief Prefix decrement operator. Decrements the APInt by one. + APInt& operator--(); + + /// @brief Bitwise AND assignment operator. Performs bitwise AND operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& operator&=(const APInt& RHS); + + /// @brief Bitwise OR assignment operator. Performs bitwise OR operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& operator|=(const APInt& RHS); + + /// @brief Bitwise XOR assignment operator. Performs bitwise XOR operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& operator^=(const APInt& RHS); + + /// @brief Left-shift assignment operator. Left-shift the APInt by shiftAmt + /// and assigns the result to this APInt. + APInt& operator<<=(unsigned shiftAmt); + + /// @brief Right-shift assignment operator. Right-shift the APInt by shiftAmt + /// and assigns the result to this APInt. + APInt& operator>>=(unsigned shiftAmt); + + /// @brief Bitwise complement operator. Performs a bitwise complement + /// operation on this APInt. + APInt operator~() const; + + /// @brief Multiplication assignment operator. Multiplies this APInt by the + /// given APInt& RHS and assigns the result to this APInt. + APInt& operator*=(const APInt& RHS); + + /// @brief Division assignment operator. Divides this APInt by the given APInt + /// &RHS and assigns the result to this APInt. + APInt& operator/=(const APInt& RHS); + + /// @brief Addition assignment operator. Adds this APInt by the given APInt& + /// RHS and assigns the result to this APInt. + APInt& operator+=(const APInt& RHS); + + /// @brief Subtraction assignment operator. Subtracts this APInt by the given + /// APInt &RHS and assigns the result to this APInt. + APInt& operator-=(const APInt& RHS); + + /// @brief Remainder assignment operator. Yields the remainder from the + /// division of this APInt by the given APInt& RHS and assigns the remainder + /// to this APInt. + APInt& operator%=(const APInt& RHS); + + /// @brief Bitwise AND operator. Performs bitwise AND operation on this APInt + /// and the given APInt& RHS. + APInt operator&(const APInt& RHS) const; + + /// @brief Bitwise OR operator. Performs bitwise OR operation on this APInt + /// and the given APInt& RHS. + APInt operator|(const APInt& RHS) const; + + /// @brief Bitwise XOR operator. Performs bitwise XOR operation on this APInt + /// and the given APInt& RHS. + APInt operator^(const APInt& RHS) const; + + /// @brief Logical AND operator. Performs logical AND operation on this APInt + /// and the given APInt& RHS. + bool operator&&(const APInt& RHS) const; + + /// @brief Logical OR operator. Performs logical OR operation on this APInt + /// and the given APInt& RHS. + bool operator||(const APInt& RHS) const; + + /// @brief Logical negation operator. Performs logical negation operation on + /// this APInt. + bool operator !() const; + + /// @brief Multiplication operator. Multiplies this APInt by the given APInt& + /// RHS. + APInt operator*(const APInt& RHS) const; + + /// @brief Division operator. Divides this APInt by the given APInt& RHS. + APInt operator/(const APInt& RHS) const; + + /// @brief Remainder operator. Yields the remainder from the division of this + /// APInt and the given APInt& RHS. + APInt operator%(const APInt& RHS) const; + + /// @brief Addition operator. Adds this APInt by the given APInt& RHS. + APInt operator+(const APInt& RHS) const; + + /// @brief Subtraction operator. Subtracts this APInt by the given APInt& RHS + APInt operator-(const APInt& RHS) const; + + /// @brief Left-shift operator. Left-shift the APInt by shiftAmt. + APInt operator<<(unsigned shiftAmt) const; + + /// @brief Right-shift operator. Right-shift the APInt by shiftAmt. + APInt operator>>(unsigned shiftAmt) const; + + /// @brief Array-indexing support. + bool operator[](unsigned bitPosition) const; + + /// @brief Equality operator. Compare this APInt with the given APInt& RHS + /// for the validity of the equality relationship. + bool operator==(const APInt& RHS) const; + + /// @brief Inequality operator. Compare this APInt with the given APInt& RHS + /// for the validity of the inequality relationship. + bool operator!=(const APInt& RHS) const; + + /// @brief Less-than operator. Compare this APInt with the given APInt& RHS + /// for the validity of the less-than relationship. + bool operator <(const APInt& RHS) const; + + /// @brief Less-than-or-equal operator. Compare this APInt with the given + /// APInt& RHS for the validity of the less-than-or-equal relationship. + bool operator<=(const APInt& RHS) const; + + /// @brief Greater-than operator. Compare this APInt with the given APInt& RHS + /// for the validity of the greater-than relationship. + bool operator> (const APInt& RHS) const; + + /// @brief Greater-than-or-equal operator. Compare this APInt with the given + /// APInt& RHS for the validity of the greater-than-or-equal relationship. + bool operator>=(const APInt& RHS) const; + + /// @returns a uint64_t value from this APInt. If this APInt contains a single + /// word, just returns VAL, otherwise pVal[0]. + inline uint64_t getValue() { + if (isSingleWord()) + return isSigned ? ((int64_t(VAL) << (APINT_BITS_PER_WORD - bitsnum)) >> + (APINT_BITS_PER_WORD - bitsnum)) : + VAL; + else + return pVal[0]; + } + + /// @returns the largest value for an APInt of the specified bit-width and + /// if isSign == true, it should be largest signed value, otherwise largest + /// unsigned value. + /// @brief Gets max value of the APInt with bitwidth <= 64. + static APInt getMaxValue(unsigned numBits, bool isSign); + + /// @returns the smallest value for an APInt of the given bit-width and + /// if isSign == true, it should be smallest signed value, otherwise zero. + /// @brief Gets min value of the APInt with bitwidth <= 64. + static APInt getMinValue(unsigned numBits, bool isSign); + + /// @returns the all-ones value for an APInt of the specified bit-width. + /// @brief Get the all-ones value. + static APInt getAllOnesValue(unsigned numBits); + + /// @brief Set every bit to 1. + APInt& set(); + + /// Set the given bit to 1 whose poition is given as "bitPosition". + /// @brief Set a given bit to 1. + APInt& set(unsigned bitPosition); + + /// @returns the '0' value for an APInt of the specified bit-width. + /// @brief Get the '0' value. + static APInt getNullValue(unsigned numBits); + + /// @brief Set every bit to 0. + APInt& clear(); + + /// Set the given bit to 0 whose position is given as "bitPosition". + /// @brief Set a given bit to 0. + APInt& clear(unsigned bitPosition); + + /// @brief Toggle every bit to its opposite value. + APInt& flip(); + + /// Toggle a given bit to its opposite value whose position is given + /// as "bitPosition". + /// @brief Toggles a given bit to its opposite value. + APInt& flip(unsigned bitPosition); + + /// @returns a character interpretation of the APInt. + std::string to_string(uint8_t radix = 10) const; + + /// @returns the high "numBits" bits of this APInt. + APInt HiBits(unsigned numBits) const; + + /// @returns the low "numBits" bits of this APInt. + APInt LoBits(unsigned numBits) const; + + /// @returns true if the argument APInt value is a power of two > 0. + inline const bool isPowerOf2() const { + return *this && !(*this & (*this - 1)); + } + + /// @returns the number of zeros from the most significant bit to the first + /// one bits. + unsigned CountLeadingZeros() const; + + /// @returns the number of zeros from the least significant bit to the first + /// one bit. + unsigned CountTrailingZeros() const; + + /// @returns the number of set bits. + unsigned CountPopulation() const; + + /// @returns the total number of bits. + inline unsigned getNumBits() const + { return bitsnum; } + + }; + + /// @brief Check if the specified APInt has a N-bits integer value. + inline bool isIntN(unsigned N, const APInt& APIVal) { + if (APIVal.isSingleWord()) { + APInt Tmp(N, APIVal.VAL); + return Tmp == APIVal; + } else { + APInt Tmp(N, APIVal.pVal); + return Tmp == APIVal; + } + } + + /// @returns true if the argument APInt value is a sequence of ones + /// starting at the least significant bit with the remainder zero. + inline const bool isMask(unsigned numBits, const APInt& APIVal) { + return APIVal && ((APIVal + 1) & APIVal) == 0; + } + + /// @returns true if the argument APInt value contains a sequence of ones + /// with the remainder zero. + inline const bool isShiftedMask(unsigned numBits, const APInt& APIVal) { + return isMask(numBits, (APIVal - 1) | APIVal); + } + + /// @returns a byte-swapped representation of the specified APInt Value. + APInt ByteSwap(const APInt& APIVal); + + /// @returns the floor log base 2 of the specified APInt value. + inline APInt LogBase2(const APInt& APIVal) { + return APIVal.numWords() * APInt::APINT_BITS_PER_WORD - + APIVal.CountLeadingZeros(); + } + + /// @returns the greatest common divisor of the two values + /// using Euclid's algorithm. + APInt GreatestCommonDivisor(const APInt& API1, const APInt& API2); + + /// @returns the bit equivalent double. + /// If the APInt numBits > 64, truncated first and then convert to double. + inline double APIntToDouble(const APInt& APIVal) { + uint64_t value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; + union { + uint64_t I; + double D; + } T; + T.I = value; + return T.D; + } + + /// @returns the bit equivalent float. + /// If the APInt numBits > 32, truncated first and then convert to double. + inline float APIntToFloat(const APInt& APIVal) { + unsigned value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; + union { + unsigned I; + float F; + } T; + T.I = value; + return T.F; + } + + /// @returns the bit equivalent APInt. + inline APInt DoubleToAPInt(double Double) { + union { + uint64_t L; + double D; + } T; + T.D = Double; + return APInt(T.L); + } + + /// @returns the bit equivalent APInt. + inline APInt FloatToAPInt(float Float) { + union { + uint32_t I; + float F; + } T; + T.F = Float; + return APInt(uint64_t(T.I)); + } + + } // End of llvm namespace + + #endif From clattner at apple.com Mon Feb 5 12:18:09 2007 From: clattner at apple.com (clattner at apple.com) Date: Mon, 5 Feb 2007 10:18:09 -0800 (PST) Subject: [llvm-commits] [123438] libtransforms is no more. Message-ID: <20070205181809.569F929F33A3@src> Revision: 123438 Author: clattner Date: 2007-02-05 10:18:09 -0800 (Mon, 05 Feb 2007) Log Message: ----------- libtransforms is no more. Modified Paths: -------------- apple-local/branches/llvm/gcc/Makefile.in Modified: apple-local/branches/llvm/gcc/Makefile.in =================================================================== --- apple-local/branches/llvm/gcc/Makefile.in 2007-02-05 16:15:58 UTC (rev 123437) +++ apple-local/branches/llvm/gcc/Makefile.in 2007-02-05 18:18:09 UTC (rev 123438) @@ -1069,7 +1069,7 @@ # We use llvm-config to determine the libraries that we need to link in our # target, optimizations analyses and the bcwriter. -LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils analysis bcwriter ipo transforms +LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils analysis bcwriter ipo LLVMLIBFILES := $(shell $(LLVMBINPATH)/llvm-config --libfiles $(LLVMCOMPONENTS)) LLVMLDFLAGS := $(shell $(LLVMBINPATH)/llvm-config --ldflags) LIBS += $(LLVMLDFLAGS) From clattner at apple.com Mon Feb 5 12:27:43 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 5 Feb 2007 10:27:43 -0800 Subject: [llvm-commits] CVS: llvm/Makefile In-Reply-To: <200702050943.l159hXFM017637@zion.cs.uiuc.edu> References: <200702050943.l159hXFM017637@zion.cs.uiuc.edu> Message-ID: <8824EB21-3253-4810-B33C-DC3081E89FBD@apple.com> > Don't prevent install target from descending into the utils directory. > It prevents "make install" on a clean directory from working. Does this change what gets installed into PREFIX? -Chris > > --- > Diffs of the changes: (+0 -7) > > Makefile | 7 ------- > 1 files changed, 7 deletions(-) > > > Index: llvm/Makefile > diff -u llvm/Makefile:1.67 llvm/Makefile:1.68 > --- llvm/Makefile:1.67 Thu Nov 16 21:32:33 2006 > +++ llvm/Makefile Mon Feb 5 03:43:17 2007 > @@ -40,13 +40,6 @@ > OPTIONAL_DIRS := > endif > > -# Don't install utils, examples, or projects they are only used to > -# build LLVM. > -ifeq ($(MAKECMDGOALS),install) > - DIRS := $(filter-out utils, $(DIRS)) > - OPTIONAL_DIRS := > -endif > - > # Include the main makefile machinery. > include $(LLVM_SRC_ROOT)/Makefile.rules > > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From rspencer at reidspencer.com Mon Feb 5 12:28:28 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 05 Feb 2007 10:28:28 -0800 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h In-Reply-To: <200702051729.l15HTWwe027584@zion.cs.uiuc.edu> References: <200702051729.l15HTWwe027584@zion.cs.uiuc.edu> Message-ID: <1170700108.7248.123.camel@bashful.x10sys.com> Sheng, Some comments for you .. On Mon, 2007-02-05 at 11:29 -0600, Zhou Sheng wrote: > > Changes in directory llvm/include/llvm/ADT: > > APInt.h added (r1.1) > --- > Log message: > > Add a class APInt to represent arbitrary precision constant integral values. > It is a functional replacement for common case integer type like "unsigned", > "uint64_t", but also allows non-byte-width integer type and large integer > value types such as 3-bits, 15-bits, or more than 64-bits of precision. For > more details, see pr1043: http://llvm.org/PR1043 . > > > --- > Diffs of the changes: (+489 -0) > > APInt.h | 489 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 489 insertions(+) > > > Index: llvm/include/llvm/ADT/APInt.h > diff -c /dev/null llvm/include/llvm/ADT/APInt.h:1.1 > *** /dev/null Mon Feb 5 11:29:26 2007 > --- llvm/include/llvm/ADT/APInt.h Mon Feb 5 11:29:16 2007 > *************** > *** 0 **** > --- 1,489 ---- > + //===-- llvm/Support/APInt.h - For Arbitrary Precision Integer -*- C++ -*--===// > + // > + // The LLVM Compiler Infrastructure > + // > + // This file was developed by Sheng Zhou and is distributed under the > + // University of Illinois Open Source License. See LICENSE.TXT for details. > + // > + //===----------------------------------------------------------------------===// > + // > + // This file implements a class to represent arbitrary precision integral > + // constant values. > + // > + //===----------------------------------------------------------------------===// > + > + #ifndef LLVM_APINT_H > + #define LLVM_APINT_H > + > + #include "llvm/Support/DataTypes.h" > + #include > + > + namespace llvm { > + > + //===----------------------------------------------------------------------===// > + // APInt Class > + //===----------------------------------------------------------------------===// > + > + /// APInt - This class represents arbitrary precision constant integral values. > + /// It is a functional replacement for common case unsigned integer type like > + /// "unsigned", "unsigned long" or "uint64_t", but also allows non-byte-width > + /// integer type and large integer value types such as 3-bits, 15-bits, or more > + /// than 64-bits of precision. APInt provides a variety of arithmetic operators > + /// and methods to manipulate integer values of any bit-width. It supports not > + /// only all the operations of uint64_t but also bitwise manipulation. > + /// > + /// @brief Class for arbitrary precision integers. > + /// > + class APInt { > + /// Friend Functions of APInt Declared here. For detailed comments, Declared -> declared > + /// see bottom of this file. > + friend bool isIntN(unsigned N, const APInt& APIVal); > + friend APInt ByteSwap(const APInt& APIVal); > + friend APInt LogBase2(const APInt& APIVal); > + friend double APIntToDouble(const APInt& APIVal); > + friend float APIntToFloat(const APInt& APIVal); > + > + unsigned bitsnum; ///< The number of bits. > + bool isSigned; ///< The sign flag for this APInt. > + > + /// This union is used to store the integer value. When the > + /// integer bit-width <= 64, it is used as an uint64_t; it is used as an uint64_t -> it uses VAL > + /// otherwise it uses an uint64_t array. an uint64_t -> the PVal > + union { > + uint64_t VAL; ///< Used to store the <= 64 bits integer value. > + uint64_t *pVal; ///< Used to store the >64 bits integer value. > + }; > + > + /// This enum is just used to hold constant we needed for APInt. hold constant -> hold a constant > + enum { > + APINT_BITS_PER_WORD = sizeof(uint64_t) * 8 > + }; > + > + /// @returns the number of words to hold the integer value of this APInt. > + /// Here one word's bitwidth equals to that of uint64_t. I think this line needs to go above @returns or else it gets included in @returns. > + /// @brief Get the number of the words. of the words -> of words > + inline unsigned numWords() const { > + return bitsnum < 1 ? 0 : (bitsnum + APINT_BITS_PER_WORD - 1) / > + APINT_BITS_PER_WORD; > + } > + > + /// @returns true if the number of bits <= 64, false otherwise. > + /// @brief Determine if this APInt just has one word to store value. > + inline bool isSingleWord() const > + { return bitsnum <= APINT_BITS_PER_WORD; } > + > + /// @returns the word position for the specified bit position. > + /// Note: the bitPosition and the return value are zero-based. > + static inline unsigned whichWord(unsigned bitPosition) > + { return bitPosition / APINT_BITS_PER_WORD; } > + > + /// @returns the byte position for the specified bit position. > + /// Note: the bitPosition and the return value are zero-based. > + static inline unsigned whichByte(unsigned bitPosition); > + > + /// @returns the bit position in a word for the specified bit position > + /// in APInt. > + /// Note: the bitPosition and the return value are zero-based. > + static inline unsigned whichBit(unsigned bitPosition) > + { return bitPosition % APINT_BITS_PER_WORD; } > + > + /// @returns a uint64_t type integer with just bit position at > + /// "whichBit(bitPosition)" setting, others zero. > + /// Note: the bitPosition and the return value are zero-based. > + static inline uint64_t maskBit(unsigned bitPosition) > + { return (static_cast(1)) << whichBit(bitPosition); } > + > + inline void TruncToBits() { > + if (isSingleWord()) > + VAL &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum); > + else > + pVal[numWords() - 1] &= ~uint64_t(0ULL) >> > + (APINT_BITS_PER_WORD - (whichBit(bitsnum - 1) + 1)); > + } > + > + /// @returns the corresponding word for the specified bit position. > + /// Note: the bitPosition is zero-based. > + inline uint64_t& getWord(unsigned bitPosition); I don't see this method defined in the .h file. If it is inline its body needs to be attached here or defined later in the file. Is it defined inline in the .cpp file? > + > + /// @returns the corresponding word for the specified bit position. > + /// This is a constant version. > + /// Note: the bitPosition is zero-based. I would prefer that all these "Note: the bit position is zero-based" notices be moved into the class comment as a general statement that all bit/byte/word positions are zero-based. > + inline uint64_t getWord(unsigned bitPosition) const; Same thing .. where is it inline? > + > + /// mul_1 - This function performs the multiplication operation on a > + /// large integer (represented as a integer array) and a uint64_t integer. as a integer -> as an integer > + /// @returns the carry of the multiplication. > + static uint64_t mul_1(uint64_t dest[], uint64_t x[], > + unsigned len, uint64_t y); This private static function does not need to be a member of this class nor does it need to be in the .h file. Please move it to the .cpp file. This will unclutter the .h file with implementation details as well as allow the C++ compiler to optimize it better if its defined as static in the .cpp or placed in the anonymous namespace in the .cpp. > + > + /// mul - This function performs the multiplication operation on two large > + /// integers (represented as integer arrays). > + static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, > + uint64_t y[], unsigned ylen); Same thing. Remove this from the header, put it in the .cpp > + > + /// add_1 - This function performs the addition operation on a large integer > + /// and a uint64_t integer. > + /// @returns the carry of the addtion. > + static uint64_t add_1(uint64_t dest[], uint64_t x[], > + unsigned len, uint64_t y); Same thing. Remove this from the header, put it in the .cpp > + > + /// add - This function performs the addtion operation on two large integers. addtion -> addition > + static uint64_t add(uint64_t dest[], uint64_t x[], > + uint64_t y[], unsigned len); > + Same thing. Remove this from the header, put it in the .cpp > + /// sub_1 - This function performs the subtraction operation on a large > + /// integer and a uint64_t integer. > + static uint64_t sub_1(uint64_t x[], unsigned len, uint64_t y); Same thing. Remove this from the header, put it in the .cpp > + /// sub - This function performs the subtraction operation on two large > + /// integers. > + static uint64_t sub(uint64_t dest[], uint64_t x[], > + uint64_t y[], unsigned len); Same thing. Remove this from the header, put it in the .cpp > + /// unitDiv - This function divides uint64_t N by unsigned D. > + /// @returns (remainder << 32) + quotient. > + /// @assumes (N >> 32) < D. > + static uint64_t unitDiv(uint64_t N, unsigned D); Same thing. Remove this from the header, put it in the .cpp > + > + /// subMul - This function subtract x[len-1 : 0] * y from > + /// dest[offset+len-1 : offset]. > + /// @returns the most significant word of the product, minus borrow-out from > + /// the subtraction. > + static unsigned subMul(unsigned dest[], unsigned offset, > + unsigned x[], unsigned len, unsigned y); Same thing. Remove this from the header, put it in the .cpp > + > + /// div - This function divides the large integer zds[] by y[]. > + /// The remainder ends up in zds[ny-1 : 0]. > + /// The quotient ends up in zds[ny : nx]. > + /// @assumes nx > ny and (int)y[ny-1] < 0. > + static void div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny); Same thing. Remove this from the header, put it in the .cpp > + > + /// lshift - This function shifts x[len-1 : 0] by shiftAmt, and store the > + /// "len" least significant words of the result in > + /// dest[d_offset+len-1 : d_offset]. > + /// @returns the bits shifted out from the most significant digit. > + static uint64_t lshift(uint64_t dest[], unsigned d_offset, > + uint64_t x[], unsigned len, unsigned shiftAmt); Same thing. Remove this from the header, put it in the .cpp > + > + public: > + /// Create a new APInt of numBits bit-width, and initalized as val. initialized > + APInt(uint64_t val = 0, unsigned numBits = APINT_BITS_PER_WORD, > + bool sign = false); > + > + /// Create a new APInt of numBits bit-width, and initalized as bigVal[]. initialized > + APInt(unsigned numBits, uint64_t bigVal[], bool sign = false); > + > + /// Create a new APInt by translating the string represented integer value. This comment must must start with @brief or doxygen will ignore it. > + APInt(std::string& Val, uint8_t radix = 10, bool sign = false); > + > + /// Copy Constructor. Same thing .. @brief > + APInt(const APInt& API); > + > + /// Destructor. Same thing .. @brief > + ~APInt(); > + > + /// @brief Copy assignment operator. Create a new object from the given > + /// APInt one by initialization. Separate the @brief from the many comment, like this: /// Create a new object from the given APInt by initialization. /// @brief Copy assignment operator. Furthermore, this comment isn't right. This isn't creating a new object. It is assigning one APInt to another. Nothing new is created. Please make sure its implemented that way. > + APInt& operator=(const APInt& RHS); > + > + /// @brief Assignment operator. Assigns a common case integer value to a common case integer -> an integer > + /// the APInt. > + APInt& operator=(uint64_t RHS); > + > + /// @brief Postfix increment operator. Increments the APInt by one. > + const APInt operator++(int); > + > + /// @brief Prefix increment operator. Increments the APInt by one. > + APInt& operator++(); > + > + /// @brief Postfix decrement operator. Decrements the APInt by one. > + const APInt operator--(int); > + > + /// @brief Prefix decrement operator. Decrements the APInt by one. > + APInt& operator--(); > + > + /// @brief Bitwise AND assignment operator. Performs bitwise AND operation on > + /// this APInt and the given APInt& RHS, assigns the result to this APInt. > + APInt& operator&=(const APInt& RHS); > + > + /// @brief Bitwise OR assignment operator. Performs bitwise OR operation on > + /// this APInt and the given APInt& RHS, assigns the result to this APInt. > + APInt& operator|=(const APInt& RHS); > + > + /// @brief Bitwise XOR assignment operator. Performs bitwise XOR operation on > + /// this APInt and the given APInt& RHS, assigns the result to this APInt. > + APInt& operator^=(const APInt& RHS); > + > + /// @brief Left-shift assignment operator. Left-shift the APInt by shiftAmt > + /// and assigns the result to this APInt. > + APInt& operator<<=(unsigned shiftAmt); > + > + /// @brief Right-shift assignment operator. Right-shift the APInt by shiftAmt > + /// and assigns the result to this APInt. > + APInt& operator>>=(unsigned shiftAmt); > + > + /// @brief Bitwise complement operator. Performs a bitwise complement > + /// operation on this APInt. > + APInt operator~() const; > + > + /// @brief Multiplication assignment operator. Multiplies this APInt by the > + /// given APInt& RHS and assigns the result to this APInt. > + APInt& operator*=(const APInt& RHS); > + > + /// @brief Division assignment operator. Divides this APInt by the given APInt > + /// &RHS and assigns the result to this APInt. > + APInt& operator/=(const APInt& RHS); > + > + /// @brief Addition assignment operator. Adds this APInt by the given APInt& > + /// RHS and assigns the result to this APInt. > + APInt& operator+=(const APInt& RHS); > + > + /// @brief Subtraction assignment operator. Subtracts this APInt by the given > + /// APInt &RHS and assigns the result to this APInt. > + APInt& operator-=(const APInt& RHS); > + > + /// @brief Remainder assignment operator. Yields the remainder from the > + /// division of this APInt by the given APInt& RHS and assigns the remainder > + /// to this APInt. > + APInt& operator%=(const APInt& RHS); > + > + /// @brief Bitwise AND operator. Performs bitwise AND operation on this APInt > + /// and the given APInt& RHS. > + APInt operator&(const APInt& RHS) const; > + > + /// @brief Bitwise OR operator. Performs bitwise OR operation on this APInt > + /// and the given APInt& RHS. > + APInt operator|(const APInt& RHS) const; > + > + /// @brief Bitwise XOR operator. Performs bitwise XOR operation on this APInt > + /// and the given APInt& RHS. > + APInt operator^(const APInt& RHS) const; > + > + /// @brief Logical AND operator. Performs logical AND operation on this APInt > + /// and the given APInt& RHS. > + bool operator&&(const APInt& RHS) const; > + > + /// @brief Logical OR operator. Performs logical OR operation on this APInt > + /// and the given APInt& RHS. > + bool operator||(const APInt& RHS) const; > + > + /// @brief Logical negation operator. Performs logical negation operation on > + /// this APInt. > + bool operator !() const; > + > + /// @brief Multiplication operator. Multiplies this APInt by the given APInt& > + /// RHS. > + APInt operator*(const APInt& RHS) const; > + > + /// @brief Division operator. Divides this APInt by the given APInt& RHS. > + APInt operator/(const APInt& RHS) const; > + > + /// @brief Remainder operator. Yields the remainder from the division of this > + /// APInt and the given APInt& RHS. > + APInt operator%(const APInt& RHS) const; > + > + /// @brief Addition operator. Adds this APInt by the given APInt& RHS. > + APInt operator+(const APInt& RHS) const; > + > + /// @brief Subtraction operator. Subtracts this APInt by the given APInt& RHS > + APInt operator-(const APInt& RHS) const; > + > + /// @brief Left-shift operator. Left-shift the APInt by shiftAmt. > + APInt operator<<(unsigned shiftAmt) const; > + > + /// @brief Right-shift operator. Right-shift the APInt by shiftAmt. > + APInt operator>>(unsigned shiftAmt) const; > + > + /// @brief Array-indexing support. > + bool operator[](unsigned bitPosition) const; > + > + /// @brief Equality operator. Compare this APInt with the given APInt& RHS > + /// for the validity of the equality relationship. > + bool operator==(const APInt& RHS) const; > + > + /// @brief Inequality operator. Compare this APInt with the given APInt& RHS > + /// for the validity of the inequality relationship. > + bool operator!=(const APInt& RHS) const; > + > + /// @brief Less-than operator. Compare this APInt with the given APInt& RHS > + /// for the validity of the less-than relationship. > + bool operator <(const APInt& RHS) const; > + > + /// @brief Less-than-or-equal operator. Compare this APInt with the given > + /// APInt& RHS for the validity of the less-than-or-equal relationship. > + bool operator<=(const APInt& RHS) const; > + > + /// @brief Greater-than operator. Compare this APInt with the given APInt& RHS > + /// for the validity of the greater-than relationship. > + bool operator> (const APInt& RHS) const; > + > + /// @brief Greater-than-or-equal operator. Compare this APInt with the given > + /// APInt& RHS for the validity of the greater-than-or-equal relationship. > + bool operator>=(const APInt& RHS) const; In all the above methods, please put the @brief sentence on a line by itself and put it at the end of the comment block. Otherwise doxygen will make the main comment part of the brief comment. > + > + /// @returns a uint64_t value from this APInt. If this APInt contains a single > + /// word, just returns VAL, otherwise pVal[0]. > + inline uint64_t getValue() { > + if (isSingleWord()) > + return isSigned ? ((int64_t(VAL) << (APINT_BITS_PER_WORD - bitsnum)) >> > + (APINT_BITS_PER_WORD - bitsnum)) : > + VAL; > + else > + return pVal[0]; > + } > + > + /// @returns the largest value for an APInt of the specified bit-width and > + /// if isSign == true, it should be largest signed value, otherwise largest > + /// unsigned value. > + /// @brief Gets max value of the APInt with bitwidth <= 64. > + static APInt getMaxValue(unsigned numBits, bool isSign); > + > + /// @returns the smallest value for an APInt of the given bit-width and > + /// if isSign == true, it should be smallest signed value, otherwise zero. > + /// @brief Gets min value of the APInt with bitwidth <= 64. > + static APInt getMinValue(unsigned numBits, bool isSign); > + > + /// @returns the all-ones value for an APInt of the specified bit-width. > + /// @brief Get the all-ones value. > + static APInt getAllOnesValue(unsigned numBits); > + > + /// @brief Set every bit to 1. > + APInt& set(); > + > + /// Set the given bit to 1 whose poition is given as "bitPosition". poition -> position > + /// @brief Set a given bit to 1. > + APInt& set(unsigned bitPosition); > + > + /// @returns the '0' value for an APInt of the specified bit-width. > + /// @brief Get the '0' value. > + static APInt getNullValue(unsigned numBits); > + > + /// @brief Set every bit to 0. > + APInt& clear(); > + > + /// Set the given bit to 0 whose position is given as "bitPosition". > + /// @brief Set a given bit to 0. > + APInt& clear(unsigned bitPosition); > + > + /// @brief Toggle every bit to its opposite value. > + APInt& flip(); > + > + /// Toggle a given bit to its opposite value whose position is given > + /// as "bitPosition". > + /// @brief Toggles a given bit to its opposite value. > + APInt& flip(unsigned bitPosition); > + > + /// @returns a character interpretation of the APInt. > + std::string to_string(uint8_t radix = 10) const; > + > + /// @returns the high "numBits" bits of this APInt. > + APInt HiBits(unsigned numBits) const; > + > + /// @returns the low "numBits" bits of this APInt. > + APInt LoBits(unsigned numBits) const; Please indicate in the comment for this function whether the APInt returned has the same number of bits as "this" or numBits. I would assume its the same as "this" and LoBits is just acting as a zero mask on the high bits? > + > + /// @returns true if the argument APInt value is a power of two > 0. > + inline const bool isPowerOf2() const { > + return *this && !(*this & (*this - 1)); > + } how does converting *this to boolean help? If the value is 0 does the conversion to boolean return false? If so, it might read a little more cleanly as: (*this != 0) && ... The compiler should clean it up so there's no performance penalty. > + > + /// @returns the number of zeros from the most significant bit to the first > + /// one bits. > + unsigned CountLeadingZeros() const; > + > + /// @returns the number of zeros from the least significant bit to the first > + /// one bit. > + unsigned CountTrailingZeros() const; > + > + /// @returns the number of set bits. > + unsigned CountPopulation() const; > + > + /// @returns the total number of bits. > + inline unsigned getNumBits() const > + { return bitsnum; } > + > + }; > + > + /// @brief Check if the specified APInt has a N-bits integer value. > + inline bool isIntN(unsigned N, const APInt& APIVal) { > + if (APIVal.isSingleWord()) { > + APInt Tmp(N, APIVal.VAL); > + return Tmp == APIVal; > + } else { > + APInt Tmp(N, APIVal.pVal); > + return Tmp == APIVal; > + } > + } > + > + /// @returns true if the argument APInt value is a sequence of ones > + /// starting at the least significant bit with the remainder zero. > + inline const bool isMask(unsigned numBits, const APInt& APIVal) { > + return APIVal && ((APIVal + 1) & APIVal) == 0; > + } > + > + /// @returns true if the argument APInt value contains a sequence of ones > + /// with the remainder zero. > + inline const bool isShiftedMask(unsigned numBits, const APInt& APIVal) { > + return isMask(numBits, (APIVal - 1) | APIVal); > + } > + > + /// @returns a byte-swapped representation of the specified APInt Value. > + APInt ByteSwap(const APInt& APIVal); > + > + /// @returns the floor log base 2 of the specified APInt value. > + inline APInt LogBase2(const APInt& APIVal) { > + return APIVal.numWords() * APInt::APINT_BITS_PER_WORD - > + APIVal.CountLeadingZeros(); > + } > + > + /// @returns the greatest common divisor of the two values > + /// using Euclid's algorithm. > + APInt GreatestCommonDivisor(const APInt& API1, const APInt& API2); > + > + /// @returns the bit equivalent double. > + /// If the APInt numBits > 64, truncated first and then convert to double. > + inline double APIntToDouble(const APInt& APIVal) { > + uint64_t value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; > + union { > + uint64_t I; > + double D; > + } T; > + T.I = value; > + return T.D; > + } > + > + /// @returns the bit equivalent float. > + /// If the APInt numBits > 32, truncated first and then convert to double. > + inline float APIntToFloat(const APInt& APIVal) { > + unsigned value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; > + union { > + unsigned I; > + float F; > + } T; > + T.I = value; > + return T.F; > + } > + > + /// @returns the bit equivalent APInt. > + inline APInt DoubleToAPInt(double Double) { > + union { > + uint64_t L; > + double D; > + } T; > + T.D = Double; > + return APInt(T.L); > + } > + > + /// @returns the bit equivalent APInt. > + inline APInt FloatToAPInt(float Float) { > + union { > + uint32_t I; > + float F; > + } T; > + T.F = Float; > + return APInt(uint64_t(T.I)); > + } These four float/double <-> APInt conversions are doing the equivalent of a bit cast. I don't think we have a need for these in LLVM. Perhaps they should be trying to convert the APInt value to/from a double value numerically instead of bitwise? > + > + } // End of llvm namespace > + > + #endif > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From rspencer at reidspencer.com Mon Feb 5 12:39:07 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 05 Feb 2007 10:39:07 -0800 Subject: [llvm-commits] CVS: llvm/Makefile In-Reply-To: <8824EB21-3253-4810-B33C-DC3081E89FBD@apple.com> References: <200702050943.l159hXFM017637@zion.cs.uiuc.edu> <8824EB21-3253-4810-B33C-DC3081E89FBD@apple.com> Message-ID: <1170700747.7248.126.camel@bashful.x10sys.com> On Mon, 2007-02-05 at 10:27 -0800, Chris Lattner wrote: > > Don't prevent install target from descending into the utils directory. > > It prevents "make install" on a clean directory from working. > > Does this change what gets installed into PREFIX? Perhaps. It might cause tblgen to be installed when previously it wasn't. Thing is, "make install" must be able to build everything from scratch and it currently doesn't. If we don't want tblgen installed then we need to modify the llvm/utils/TableGen/Makefile not completely avoid descending into utils from llvm/Makefile. > > -Chris > > > > > --- > > Diffs of the changes: (+0 -7) > > > > Makefile | 7 ------- > > 1 files changed, 7 deletions(-) > > > > > > Index: llvm/Makefile > > diff -u llvm/Makefile:1.67 llvm/Makefile:1.68 > > --- llvm/Makefile:1.67 Thu Nov 16 21:32:33 2006 > > +++ llvm/Makefile Mon Feb 5 03:43:17 2007 > > @@ -40,13 +40,6 @@ > > OPTIONAL_DIRS := > > endif > > > > -# Don't install utils, examples, or projects they are only used to > > -# build LLVM. > > -ifeq ($(MAKECMDGOALS),install) > > - DIRS := $(filter-out utils, $(DIRS)) > > - OPTIONAL_DIRS := > > -endif > > - > > # Include the main makefile machinery. > > include $(LLVM_SRC_ROOT)/Makefile.rules > > > > > > > > > > _______________________________________________ > > llvm-commits mailing list > > llvm-commits at cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Feb 5 12:46:05 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 5 Feb 2007 10:46:05 -0800 Subject: [llvm-commits] CVS: llvm/Makefile In-Reply-To: <1170700747.7248.126.camel@bashful.x10sys.com> References: <200702050943.l159hXFM017637@zion.cs.uiuc.edu> <8824EB21-3253-4810-B33C-DC3081E89FBD@apple.com> <1170700747.7248.126.camel@bashful.x10sys.com> Message-ID: <88D55BF6-A1E1-4EA4-9DAA-262E4C8D7262@apple.com> On Feb 5, 2007, at 10:39 AM, Reid Spencer wrote: > On Mon, 2007-02-05 at 10:27 -0800, Chris Lattner wrote: >>> Don't prevent install target from descending into the utils >>> directory. >>> It prevents "make install" on a clean directory from working. >> >> Does this change what gets installed into PREFIX? > > Perhaps. It might cause tblgen to be installed when previously it > wasn't. Thing is, "make install" must be able to build everything > from > scratch and it currently doesn't. If we don't want tblgen installed > then > we need to modify the llvm/utils/TableGen/Makefile not completely > avoid > descending into utils from llvm/Makefile. Okay, sounds reasonable, will you do that please? Thanks, -Chris >> >> -Chris >> >>> >>> --- >>> Diffs of the changes: (+0 -7) >>> >>> Makefile | 7 ------- >>> 1 files changed, 7 deletions(-) >>> >>> >>> Index: llvm/Makefile >>> diff -u llvm/Makefile:1.67 llvm/Makefile:1.68 >>> --- llvm/Makefile:1.67 Thu Nov 16 21:32:33 2006 >>> +++ llvm/Makefile Mon Feb 5 03:43:17 2007 >>> @@ -40,13 +40,6 @@ >>> OPTIONAL_DIRS := >>> endif >>> >>> -# Don't install utils, examples, or projects they are only used to >>> -# build LLVM. >>> -ifeq ($(MAKECMDGOALS),install) >>> - DIRS := $(filter-out utils, $(DIRS)) >>> - OPTIONAL_DIRS := >>> -endif >>> - >>> # Include the main makefile machinery. >>> include $(LLVM_SRC_ROOT)/Makefile.rules >>> >>> >>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From clattner at apple.com Mon Feb 5 13:08:53 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 5 Feb 2007 11:08:53 -0800 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h In-Reply-To: <200702051729.l15HTWwe027584@zion.cs.uiuc.edu> References: <200702051729.l15HTWwe027584@zion.cs.uiuc.edu> Message-ID: Hi Sheng/Reid, Some comments about the approach, on top of what Reid already sent. The most significant is that isSigned should go away: > + class APInt { > + /// Friend Functions of APInt Declared here. For detailed > comments, > + /// see bottom of this file. > + friend bool isIntN(unsigned N, const APInt& APIVal); > + friend APInt ByteSwap(const APInt& APIVal); > + friend APInt LogBase2(const APInt& APIVal); > + friend double APIntToDouble(const APInt& APIVal); > + friend float APIntToFloat(const APInt& APIVal); Instead of making these things friends, why not just add accessors for whatever they need? > + unsigned bitsnum; ///< The number of bits. Please name this 'NumBits' or something like that. > + bool isSigned; ///< The sign flag for this APInt. Why do you need isSigned? This seems very strange. It would be better to keep the value in 2s complement form and add an accessor to get the sign-bit if needed. Having the sign bit be explicit makes sizeof(APInt) = 16 instead of 12. > + /// @returns the number of words to hold the integer value of > this APInt. > + /// Here one word's bitwidth equals to that of uint64_t. > + /// @brief Get the number of the words. > + inline unsigned numWords() const { getNumWords() > + return bitsnum < 1 ? 0 : (bitsnum + APINT_BITS_PER_WORD - 1) / > + APINT_BITS_PER_WORD; You don't need the special case for bitsnum < 1. > + /// Create a new APInt by translating the string represented > integer value. > + APInt(std::string& Val, uint8_t radix = 10, bool sign = false); the string should be 'const&'. It would also be useful to have a version that takes a character range: APInt(const char *StrStart, const char *StrEnd, uint8_t radix = 10); which would allow construction of an APInt without copying the string data. > > + /// @brief Postfix increment operator. Increments the APInt by > one. > + const APInt operator++(int); > + /// @brief Postfix decrement operator. Decrements the APInt by > one. > + const APInt operator--(int); Postfix ++/-- operations are typically declared inline, as trivial wrappers around the prefix version. > + /// @brief Equality operator. Compare this APInt with the given > APInt& RHS > + /// for the validity of the equality relationship. > + bool operator==(const APInt& RHS) const; == and != are often used to compare against specific values. We should have specialized versions that take 'uint64_t', do you agree? We don't want to bloat the API and do this for every method, but I think equality comparisons are worthwhile. > + /// @brief Inequality operator. Compare this APInt with the > given APInt& RHS > + /// for the validity of the inequality relationship. > + bool operator!=(const APInt& RHS) const; This should be an inline wrapper that calls !operator==. > + /// @returns a uint64_t value from this APInt. If this APInt > contains a single > + /// word, just returns VAL, otherwise pVal[0]. > + inline uint64_t getValue() { > + if (isSingleWord()) > + return isSigned ? ((int64_t(VAL) << (APINT_BITS_PER_WORD - > bitsnum)) >> > + (APINT_BITS_PER_WORD - bitsnum)) : > + VAL; > + else > + return pVal[0]; > + } This should assert if there are more than 64 bits. Not doing so will make client errors very difficult to track down. > + > + /// @returns the largest value for an APInt of the specified > bit-width and > + /// if isSign == true, it should be largest signed value, > otherwise largest > + /// unsigned value. > + /// @brief Gets max value of the APInt with bitwidth <= 64. > + static APInt getMaxValue(unsigned numBits, bool isSign); > + static APInt getMinValue(unsigned numBits, bool isSign); > It makes sense for these to have 'isSign' but not for APInt itself. > + /// @returns the all-ones value for an APInt of the specified > bit-width. > + /// @brief Get the all-ones value. > + static APInt getAllOnesValue(unsigned numBits); > + > + /// @brief Set every bit to 1. > + APInt& set(); > + /// @brief Set every bit to 0. > + APInt& clear(); These seems extraneous. > + /// @brief Toggle every bit to its opposite value. > + APInt& flip(); Isn't this just operator~ ? > + /// @brief Check if the specified APInt has a N-bits integer value. > + inline bool isIntN(unsigned N, const APInt& APIVal) { Please eliminate this and just allow operator== to take a uint64_t operand. > + /// @returns true if the argument APInt value is a sequence of ones > + /// starting at the least significant bit with the remainder zero. > + inline const bool isMask(unsigned numBits, const APInt& APIVal) { > + return APIVal && ((APIVal + 1) & APIVal) == 0; > + } I'm not sure what this does. > + /// @returns the bit equivalent double. > + /// If the APInt numBits > 64, truncated first and then convert > to double. > + inline double APIntToDouble(const APInt& APIVal) { > + uint64_t value = APIVal.isSingleWord() ? APIVal.VAL : > APIVal.pVal[0]; This is not needed. BitsToDouble should be sufficient, and it should only work for integers exactly 64-bits in size, which means APInt need not have this sort of API. Likewise with the other convertions to FP values. What you *are* missing is value conversions to FP values, i.e. "10" - > "10.0". -Chris From dpatel at apple.com Mon Feb 5 13:33:36 2007 From: dpatel at apple.com (Devang Patel) Date: Mon, 5 Feb 2007 13:33:36 -0600 Subject: [llvm-commits] CVS: llvm/test/Other/2006-02-05-PassManager.ll Message-ID: <200702051933.l15JXavh031472@zion.cs.uiuc.edu> Changes in directory llvm/test/Other: 2006-02-05-PassManager.ll added (r1.1) --- Log message: Test case for PR1158: http://llvm.org/PR1158 --- Diffs of the changes: (+5 -0) 2006-02-05-PassManager.ll | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/test/Other/2006-02-05-PassManager.ll diff -c /dev/null llvm/test/Other/2006-02-05-PassManager.ll:1.1 *** /dev/null Mon Feb 5 13:33:30 2007 --- llvm/test/Other/2006-02-05-PassManager.ll Mon Feb 5 13:33:20 2007 *************** *** 0 **** --- 1,5 ---- + ; RUN: llvm-as < %s | opt -domtree -idom -gcse -etforest -constmerge -disable-output + + define i32 @test1() { + unreachable + } From dpatel at apple.com Mon Feb 5 13:34:33 2007 From: dpatel at apple.com (Devang Patel) Date: Mon, 5 Feb 2007 13:34:33 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp Message-ID: <200702051934.l15JYXKd031506@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: PassManager.cpp updated: 1.133 -> 1.134 --- Log message: Fix PR1158: http://llvm.org/PR1158 Do not insert Analysis pass, if it is already available. --- Diffs of the changes: (+5 -0) PassManager.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/VMCore/PassManager.cpp diff -u llvm/lib/VMCore/PassManager.cpp:1.133 llvm/lib/VMCore/PassManager.cpp:1.134 --- llvm/lib/VMCore/PassManager.cpp:1.133 Thu Feb 1 16:08:25 2007 +++ llvm/lib/VMCore/PassManager.cpp Mon Feb 5 13:34:17 2007 @@ -377,6 +377,11 @@ // TODO : Allocate function manager for this pass, other wise required set // may be inserted into previous function manager + // If this Analysis is already requested by one of the previous pass + // and it is still available then do not insert new pass in the queue again. + if (findAnalysisPass(P->getPassInfo())) + return; + AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); const std::vector &RequiredSet = AnUsage.getRequiredSet(); From reid at x10sys.com Mon Feb 5 14:24:50 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:24:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Message-ID: <200702052024.l15KOoSu000515@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: StripDeadPrototypes.cpp added (r1.1) --- Log message: Create a pass to strip dead function declarations (prototypes). This is for use by llvm-extract and bugpoint. --- Diffs of the changes: (+61 -0) StripDeadPrototypes.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 61 insertions(+) Index: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp diff -c /dev/null llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.1 *** /dev/null Mon Feb 5 14:24:35 2007 --- llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Mon Feb 5 14:24:25 2007 *************** *** 0 **** --- 1,61 ---- + //===-- StripDeadPrototypes.cpp - Removed unused function declarations ----===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This pass loops over all of the functions in the input module, looking for + // dead declarations and removes them. + // + //===----------------------------------------------------------------------===// + + #include "llvm/Transforms/IPO.h" + #include "llvm/Pass.h" + #include "llvm/Module.h" + #include "llvm/ADT/Statistic.h" + #include "llvm/Support/Debug.h" + #include + using namespace llvm; + + STATISTIC(NumDeadPrototypes, "Number of dead prototypes removed"); + + namespace { + + /// @brief Pass to remove unused function declarations. + class StripDeadPrototypesPass : public ModulePass { + public: + StripDeadPrototypesPass() { } + virtual bool runOnModule(Module &M); + }; + RegisterPass X("strip-dead-prototypes", + "Strip Unused Function Prototypes"); + + bool StripDeadPrototypesPass::runOnModule(Module &M) { + // Collect all the functions we want to erase + std::vector FuncsToErase; + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (I->isDeclaration() && // Function must be only a prototype + I->use_empty()) { // Function must not be used + FuncsToErase.push_back(&(*I)); + } + + // Erase the functions + for (std::vector::iterator I = FuncsToErase.begin(), + E = FuncsToErase.end(); I != E; ++I ) + (*I)->eraseFromParent(); + + // Increment the statistic + NumDeadPrototypes += FuncsToErase.size(); + + // Return an indication of whether we changed anything or not. + return !FuncsToErase.empty(); + } + + } // end anonymous namespace + + ModulePass *llvm::createStripDeadPrototypesPass() { + return new StripDeadPrototypesPass(); + } From llvm at cs.uiuc.edu Mon Feb 5 14:41:28 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Mon, 5 Feb 2007 14:41:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/FunctionResolution.cpp Message-ID: <200702052041.l15KfSYV000961@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: FunctionResolution.cpp (r1.66) removed --- Log message: For PR411: http://llvm.org/PR411 : This pass is no longer needed. --- Diffs of the changes: (+0 -0) 0 files changed From reid at x10sys.com Mon Feb 5 14:48:27 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Reader.h Message-ID: <200702052048.l15KmRQL001201@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.30 -> 1.31 Reader.cpp updated: 1.229 -> 1.230 Reader.h updated: 1.43 -> 1.44 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+38 -33) Analyzer.cpp | 43 ++++++++++++++++++++++--------------------- Reader.cpp | 20 +++++++++++--------- Reader.h | 8 +++++--- 3 files changed, 38 insertions(+), 33 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.30 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.31 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.30 Tue Jan 30 13:36:46 2007 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Mon Feb 5 14:47:20 2007 @@ -270,19 +270,15 @@ *os << " } END BLOCK: CompactionTable\n"; } - virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) { + virtual void handleTypeSymbolTableBegin(TypeSymbolTable* ST) { bca.numSymTab++; if (os) - *os << " BLOCK: SymbolTable {\n"; + *os << " BLOCK: TypeSymbolTable {\n"; } - - virtual void handleSymbolTablePlane(unsigned Ty, unsigned NumEntries, - const Type* Typ) { - if (os) { - *os << " Plane: Ty=" << Ty << " Size=" << NumEntries << " Type: "; - WriteTypeSymbolic(*os,Typ,M); - *os << "\n"; - } + virtual void handleValueSymbolTableBegin(Function* CF, ValueSymbolTable* ST) { + bca.numSymTab++; + if (os) + *os << " BLOCK: ValueSymbolTable {\n"; } virtual void handleSymbolTableType(unsigned i, unsigned TypSlot, @@ -292,18 +288,23 @@ << " Name: " << name << "\n"; } - virtual void handleSymbolTableValue(unsigned i, unsigned ValSlot, - const std::string& name ) { + virtual void handleSymbolTableValue(unsigned TySlot, unsigned ValSlot, + const std::string& name) { if (os) - *os << " Value " << i << " Slot=" << ValSlot + *os << " Value " << TySlot << " Slot=" << ValSlot << " Name: " << name << "\n"; if (ValSlot > bca.maxValueSlot) bca.maxValueSlot = ValSlot; } - virtual void handleSymbolTableEnd() { + virtual void handleValueSymbolTableEnd() { if (os) - *os << " } END BLOCK: SymbolTable\n"; + *os << " } END BLOCK: ValueSymbolTable\n"; + } + + virtual void handleTypeSymbolTableEnd() { + if (os) + *os << " } END BLOCK: TypeSymbolTable\n"; } virtual void handleFunctionBegin(Function* Func, unsigned Size) { @@ -358,15 +359,15 @@ } virtual bool handleInstruction( unsigned Opcode, const Type* iType, - std::vector& Operands, unsigned Size){ + std::vector& Operands, + Instruction *Inst, + unsigned Size){ if (os) { *os << " INST: OpCode=" - << Instruction::getOpcodeName(Opcode) << " Type=\""; - WriteTypeSymbolic(*os,iType,M); - *os << "\""; + << Instruction::getOpcodeName(Opcode); for ( unsigned i = 0; i < Operands.size(); ++i ) - *os << " Op(" << i << ")=Slot(" << Operands[i] << ")"; - *os << "\n"; + *os << " Op(" << Operands[i] << ")"; + *os << *Inst; } bca.numInstructions++; Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.229 llvm/lib/Bytecode/Reader/Reader.cpp:1.230 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.229 Thu Feb 1 20:16:22 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Mon Feb 5 14:47:20 2007 @@ -23,7 +23,6 @@ #include "llvm/Constants.h" #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/Bytecode/Format.h" #include "llvm/Config/alloca.h" @@ -55,6 +54,7 @@ inline void BytecodeReader::error(const std::string& err) { ErrorMsg = err + " (Vers=" + itostr(RevisionNum) + ", Pos=" + itostr(At-MemStart) + ")"; + if (Handler) Handler->handleError(ErrorMsg); longjmp(context,1); } @@ -443,10 +443,6 @@ // of opcodes. Instruction* Result = 0; - // We have enough info to inform the handler now. - if (Handler) - Handler->handleInstruction(Opcode, InstTy, Oprnds, At-SaveAt); - // First, handle the easy binary operators case if (Opcode >= Instruction::BinaryOpsBegin && Opcode < Instruction::BinaryOpsEnd && Oprnds.size() == 2) { @@ -861,6 +857,10 @@ else TypeSlot = getTypeSlot(Result->getType()); + // We have enough info to inform the handler now. + if (Handler) + Handler->handleInstruction(Opcode, InstTy, Oprnds, Result, At-SaveAt); + insertValue(Result, TypeSlot, FunctionValues); } @@ -936,9 +936,9 @@ /// CurrentFunction's symbol table. For Module level symbol tables, the /// CurrentFunction argument must be zero. void BytecodeReader::ParseValueSymbolTable(Function *CurrentFunction, - SymbolTable *ST) { + ValueSymbolTable *VST) { - if (Handler) Handler->handleSymbolTableBegin(CurrentFunction,ST); + if (Handler) Handler->handleValueSymbolTableBegin(CurrentFunction,VST); // Allow efficient basic block lookup by number. std::vector BBMap; @@ -963,13 +963,15 @@ } else { V = getValue(Typ, slot, false); // Find mapping... } + if (Handler) Handler->handleSymbolTableValue(Typ, slot, Name); if (V == 0) - error("Failed value look-up for name '" + Name + "'"); + error("Failed value look-up for name '" + Name + "', type #" + + utostr(Typ) + " slot #" + utostr(slot)); V->setName(Name); } } checkPastBlockEnd("Symbol Table"); - if (Handler) Handler->handleSymbolTableEnd(); + if (Handler) Handler->handleValueSymbolTableEnd(); } // Parse a single type. The typeid is read in first. If its a primitive type Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.43 llvm/lib/Bytecode/Reader/Reader.h:1.44 --- llvm/lib/Bytecode/Reader/Reader.h:1.43 Tue Jan 30 13:36:46 2007 +++ llvm/lib/Bytecode/Reader/Reader.h Mon Feb 5 14:47:20 2007 @@ -28,8 +28,10 @@ namespace llvm { -class BytecodeHandler; ///< Forward declare the handler interface -class TypeSymbolTable; ///< Forward declare +// Forward declarations +class BytecodeHandler; +class TypeSymbolTable; +class ValueSymbolTable; /// This class defines the interface for parsing a buffer of bytecode. The /// parser itself takes no action except to call the various functions of @@ -204,7 +206,7 @@ void ParseTypeSymbolTable(TypeSymbolTable *ST); /// @brief Parse a value symbol table - void ParseValueSymbolTable(Function* Func, SymbolTable *ST); + void ParseValueSymbolTable(Function* Func, ValueSymbolTable *ST); /// @brief Parse functions lazily. void ParseFunctionLazily(); From reid at x10sys.com Mon Feb 5 14:48:28 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:28 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Transforms/IPO.h Message-ID: <200702052048.l15KmSPs001206@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Transforms: IPO.h updated: 1.48 -> 1.49 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+11 -20) IPO.h | 31 +++++++++++-------------------- 1 files changed, 11 insertions(+), 20 deletions(-) Index: llvm/include/llvm/Transforms/IPO.h diff -u llvm/include/llvm/Transforms/IPO.h:1.48 llvm/include/llvm/Transforms/IPO.h:1.49 --- llvm/include/llvm/Transforms/IPO.h:1.48 Sun Jan 28 07:31:35 2007 +++ llvm/include/llvm/Transforms/IPO.h Mon Feb 5 14:47:19 2007 @@ -87,19 +87,6 @@ //===----------------------------------------------------------------------===// -/// FunctionResolvingPass - Go over the functions that are in the module and -/// look for functions that have the same name. More often than not, there will -/// be things like: -/// void "foo"(...) -/// void "foo"(int, int) -/// because of the way things are declared in C. If this is the case, patch -/// things up. -/// -/// This is an interprocedural pass. -/// -ModulePass *createFunctionResolvingPass(); - -//===----------------------------------------------------------------------===// /// createFunctionInliningPass - Return a new pass object that uses a heuristic /// to inline direct function calls to small functions. /// @@ -163,20 +150,24 @@ /// FunctionPass *createSingleLoopExtractorPass(); -// createBlockExtractorPass - This pass extracts all blocks (except those -// specified in the argument list) from the functions in the module. -// +/// createBlockExtractorPass - This pass extracts all blocks (except those +/// specified in the argument list) from the functions in the module. +/// ModulePass *createBlockExtractorPass(std::vector &BTNE); -// createOptimizeWellKnownCallsPass - This pass optimizes specific calls to -// specific well-known (library) functions. +/// createOptimizeWellKnownCallsPass - This pass optimizes specific calls to +/// specific well-known (library) functions. ModulePass *createSimplifyLibCallsPass(); -// createIndMemRemPass - This pass removes potential indirect calls of -// malloc and free +/// createIndMemRemPass - This pass removes potential indirect calls of +/// malloc and free ModulePass *createIndMemRemPass(); +/// createStripDeadPrototypesPass - This pass removes any function declarations +/// (prototypes) that are not used. +ModulePass *createStripDeadPrototypesPass(); + } // End llvm namespace #endif From reid at x10sys.com Mon Feb 5 14:48:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:29 -0600 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200702052048.l15KmTNN001213@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.33 -> 1.34 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -7) lto.cpp | 7 ------- 1 files changed, 7 deletions(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.33 llvm/tools/lto/lto.cpp:1.34 --- llvm/tools/lto/lto.cpp:1.33 Wed Jan 31 19:46:06 2007 +++ llvm/tools/lto/lto.cpp Mon Feb 5 14:47:21 2007 @@ -17,7 +17,6 @@ #include "llvm/Linker.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" -#include "llvm/SymbolTable.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Bytecode/Writer.h" #include "llvm/Support/CommandLine.h" @@ -248,12 +247,6 @@ // Add an appropriate TargetData instance for this module... Passes.add(new TargetData(*Target->getTargetData())); - // Often if the programmer does not specify proper prototypes for the - // functions they are calling, they end up calling a vararg version of the - // function that does not get a body filled in (the real function has typed - // arguments). This pass merges the two functions. - Passes.add(createFunctionResolvingPass()); - // Internalize symbols if export list is nonemty if (!exportList.empty()) Passes.add(createInternalizePass(exportList)); From reid at x10sys.com Mon Feb 5 14:48:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Writer/SlotCalculator.cpp SlotCalculator.h Writer.cpp WriterInternals.h Message-ID: <200702052048.l15KmT1v001235@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Writer: SlotCalculator.cpp updated: 1.81 -> 1.82 SlotCalculator.h updated: 1.26 -> 1.27 Writer.cpp updated: 1.155 -> 1.156 WriterInternals.h updated: 1.28 -> 1.29 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+35 -28) SlotCalculator.cpp | 29 ++++++++++++----------------- SlotCalculator.h | 5 +++-- Writer.cpp | 26 ++++++++++++++++++-------- WriterInternals.h | 3 ++- 4 files changed, 35 insertions(+), 28 deletions(-) Index: llvm/lib/Bytecode/Writer/SlotCalculator.cpp diff -u llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.81 llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.82 --- llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.81 Tue Jan 30 13:36:46 2007 +++ llvm/lib/Bytecode/Writer/SlotCalculator.cpp Mon Feb 5 14:47:20 2007 @@ -21,9 +21,9 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/Type.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Analysis/ConstantsScanner.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/STLExtras.h" @@ -218,8 +218,8 @@ // processTypeSymbolTable - Insert all of the type sin the specified symbol // table. -void SlotCalculator::processTypeSymbolTable(const TypeSymbolTable *ST) { - for (TypeSymbolTable::const_iterator TI = ST->begin(), TE = ST->end(); +void SlotCalculator::processTypeSymbolTable(const TypeSymbolTable *TST) { + for (TypeSymbolTable::const_iterator TI = TST->begin(), TE = TST->end(); TI != TE; ++TI ) getOrCreateSlot(TI->second); } @@ -227,23 +227,18 @@ // processSymbolTable - Insert all of the values in the specified symbol table // into the values table... // -void SlotCalculator::processValueSymbolTable(const SymbolTable *ST) { - for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), - PE = ST->plane_end(); PI != PE; ++PI) - for (SymbolTable::value_const_iterator VI = PI->second.begin(), - VE = PI->second.end(); VI != VE; ++VI) - getOrCreateSlot(VI->second); +void SlotCalculator::processValueSymbolTable(const ValueSymbolTable *VST) { + for (ValueSymbolTable::const_iterator VI = VST->begin(), VE = VST->end(); + VI != VE; ++VI) + getOrCreateSlot(VI->second); } -void SlotCalculator::processSymbolTableConstants(const SymbolTable *ST) { +void SlotCalculator::processSymbolTableConstants(const ValueSymbolTable *VST) { // Now do the constant values in all planes - for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), - PE = ST->plane_end(); PI != PE; ++PI) - for (SymbolTable::value_const_iterator VI = PI->second.begin(), - VE = PI->second.end(); VI != VE; ++VI) - if (isa(VI->second) && - !isa(VI->second)) - getOrCreateSlot(VI->second); + for (ValueSymbolTable::const_iterator VI = VST->begin(), VE = VST->end(); + VI != VE; ++VI) + if (isa(VI->second) && !isa(VI->second)) + getOrCreateSlot(VI->second); } Index: llvm/lib/Bytecode/Writer/SlotCalculator.h diff -u llvm/lib/Bytecode/Writer/SlotCalculator.h:1.26 llvm/lib/Bytecode/Writer/SlotCalculator.h:1.27 --- llvm/lib/Bytecode/Writer/SlotCalculator.h:1.26 Tue Jan 30 13:36:46 2007 +++ llvm/lib/Bytecode/Writer/SlotCalculator.h Mon Feb 5 14:47:20 2007 @@ -31,6 +31,7 @@ class Function; class SymbolTable; class TypeSymbolTable; +class ValueSymbolTable; class ConstantArray; class SlotCalculator { @@ -130,8 +131,8 @@ // into the values table... // void processTypeSymbolTable(const TypeSymbolTable *ST); - void processValueSymbolTable(const SymbolTable *ST); - void processSymbolTableConstants(const SymbolTable *ST); + void processValueSymbolTable(const ValueSymbolTable *ST); + void processSymbolTableConstants(const ValueSymbolTable *ST); // insertPrimitives - helper for constructors to insert primitive types. void insertPrimitives(); Index: llvm/lib/Bytecode/Writer/Writer.cpp diff -u llvm/lib/Bytecode/Writer/Writer.cpp:1.155 llvm/lib/Bytecode/Writer/Writer.cpp:1.156 --- llvm/lib/Bytecode/Writer/Writer.cpp:1.155 Tue Jan 30 14:08:37 2007 +++ llvm/lib/Bytecode/Writer/Writer.cpp Mon Feb 5 14:47:20 2007 @@ -26,8 +26,8 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/Compressor.h" #include "llvm/Support/MathExtras.h" @@ -1144,21 +1144,31 @@ } } -void BytecodeWriter::outputValueSymbolTable(const SymbolTable &MST) { +void BytecodeWriter::outputValueSymbolTable(const ValueSymbolTable &VST) { // Do not output the Bytecode block for an empty symbol table, it just wastes // space! - if (MST.isEmpty()) return; + if (VST.empty()) return; BytecodeBlock SymTabBlock(BytecodeFormat::ValueSymbolTableBlockID, *this, true/*ElideIfEmpty*/); - // Now do each of the type planes in order. - for (SymbolTable::plane_const_iterator PI = MST.plane_begin(), - PE = MST.plane_end(); PI != PE; ++PI) { - SymbolTable::value_const_iterator I = MST.value_begin(PI->first); - SymbolTable::value_const_iterator End = MST.value_end(PI->first); + // Organize the symbol table by type + typedef std::pair PlaneMapEntry; + typedef std::vector PlaneMapVector; + typedef std::map PlaneMap; + PlaneMap Planes; + for (ValueSymbolTable::const_iterator SI = VST.begin(), SE = VST.end(); + SI != SE; ++SI) + Planes[SI->second->getType()].push_back( + std::make_pair(SI->first,SI->second)); + + for (PlaneMap::const_iterator PI = Planes.begin(), PE = Planes.end(); + PI != PE; ++PI) { int Slot; + PlaneMapVector::const_iterator I = PI->second.begin(); + PlaneMapVector::const_iterator End = PI->second.end(); + if (I == End) continue; // Don't mess with an absent type... // Write the number of values in this plane Index: llvm/lib/Bytecode/Writer/WriterInternals.h diff -u llvm/lib/Bytecode/Writer/WriterInternals.h:1.28 llvm/lib/Bytecode/Writer/WriterInternals.h:1.29 --- llvm/lib/Bytecode/Writer/WriterInternals.h:1.28 Sat Jan 6 01:24:43 2007 +++ llvm/lib/Bytecode/Writer/WriterInternals.h Mon Feb 5 14:47:20 2007 @@ -26,6 +26,7 @@ namespace llvm { class InlineAsm; class TypeSymbolTable; + class ValueSymbolTable; class BytecodeWriter { std::vector &Out; @@ -66,7 +67,7 @@ void outputModuleInfoBlock(const Module *C); void outputTypeSymbolTable(const TypeSymbolTable &TST); - void outputValueSymbolTable(const SymbolTable &ST); + void outputValueSymbolTable(const ValueSymbolTable &ST); void outputTypes(unsigned StartNo); void outputConstantsInPlane(const std::vector &Plane, unsigned StartNo); From reid at x10sys.com Mon Feb 5 14:48:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:29 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/BytecodeHandler.h Message-ID: <200702052048.l15KmTmj001233@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: BytecodeHandler.h updated: 1.11 -> 1.12 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+12 -10) BytecodeHandler.h | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) Index: llvm/include/llvm/Bytecode/BytecodeHandler.h diff -u llvm/include/llvm/Bytecode/BytecodeHandler.h:1.11 llvm/include/llvm/Bytecode/BytecodeHandler.h:1.12 --- llvm/include/llvm/Bytecode/BytecodeHandler.h:1.11 Fri Jan 26 02:09:01 2007 +++ llvm/include/llvm/Bytecode/BytecodeHandler.h Mon Feb 5 14:47:19 2007 @@ -181,16 +181,14 @@ virtual void handleCompactionTableEnd() {} /// @brief Handle start of a symbol table - virtual void handleSymbolTableBegin( - Function* Func, ///< The function to which the ST belongs - SymbolTable* ST ///< The symbol table being filled + virtual void handleTypeSymbolTableBegin( + TypeSymbolTable* ST ///< The symbol table being filled ) {} - /// @brief Handle start of a symbol table plane - virtual void handleSymbolTablePlane( - unsigned TySlot, ///< The slotnum of the type plane - unsigned NumEntries, ///< Number of entries in the plane - const Type* Typ ///< The type of this type plane + /// @brief Handle start of a symbol table + virtual void handleValueSymbolTableBegin( + Function* Func, ///< The function to which the ST belongs or 0 for Mod + ValueSymbolTable* ST ///< The symbol table being filled ) {} /// @brief Handle a named type in the symbol table @@ -207,8 +205,11 @@ const std::string& name ///< Name of the value. ) {} - /// @brief Handle the end of a symbol table - virtual void handleSymbolTableEnd() {} + /// @brief Handle the end of a value symbol table + virtual void handleTypeSymbolTableEnd() {} + + /// @brief Handle the end of a type symbol table + virtual void handleValueSymbolTableEnd() {} /// @brief Handle the beginning of a function body virtual void handleFunctionBegin( @@ -233,6 +234,7 @@ unsigned Opcode, ///< Opcode of the instruction const Type* iType, ///< Instruction type std::vector& Operands, ///< Vector of slot # operands + Instruction *Inst, ///< The resulting instruction unsigned Length ///< Length of instruction in bc bytes ) { return false; } From reid at x10sys.com Mon Feb 5 14:48:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/LoopExtractor.cpp RaiseAllocations.cpp StripSymbols.cpp Message-ID: <200702052048.l15KmTn4001228@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: LoopExtractor.cpp updated: 1.21 -> 1.22 RaiseAllocations.cpp updated: 1.36 -> 1.37 StripSymbols.cpp updated: 1.10 -> 1.11 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+57 -38) LoopExtractor.cpp | 3 + RaiseAllocations.cpp | 90 ++++++++++++++++++++++++++++++--------------------- StripSymbols.cpp | 2 - 3 files changed, 57 insertions(+), 38 deletions(-) Index: llvm/lib/Transforms/IPO/LoopExtractor.cpp diff -u llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.21 llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.22 --- llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.21 Tue Dec 19 16:09:18 2006 +++ llvm/lib/Transforms/IPO/LoopExtractor.cpp Mon Feb 5 14:47:20 2007 @@ -167,7 +167,8 @@ Function *F = BB->getParent(); // Map the corresponding function in this module. - Function *MF = M.getFunction(F->getName(), F->getFunctionType()); + Function *MF = M.getFunction(F->getName()); + assert(MF->getFunctionType() == F->getFunctionType() && "Wrong function?"); // Figure out which index the basic block is in its function. Function::iterator BBI = MF->begin(); Index: llvm/lib/Transforms/IPO/RaiseAllocations.cpp diff -u llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.36 llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.37 --- llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.36 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/RaiseAllocations.cpp Mon Feb 5 14:47:20 2007 @@ -65,47 +65,65 @@ // function into the appropriate instruction. // void RaiseAllocations::doInitialization(Module &M) { - const FunctionType *MallocType = // Get the type for malloc - FunctionType::get(PointerType::get(Type::Int8Ty), - std::vector(1, Type::Int64Ty), false); - - const FunctionType *FreeType = // Get the type for free - FunctionType::get(Type::VoidTy, - std::vector(1, PointerType::get(Type::Int8Ty)), - false); // Get Malloc and free prototypes if they exist! - MallocFunc = M.getFunction("malloc", MallocType); - FreeFunc = M.getFunction("free" , FreeType); - - // Check to see if the prototype is wrong, giving us sbyte*(uint) * malloc - // This handles the common declaration of: 'void *malloc(unsigned);' - if (MallocFunc == 0) { - MallocType = FunctionType::get(PointerType::get(Type::Int8Ty), - std::vector(1, Type::Int32Ty), false); - MallocFunc = M.getFunction("malloc", MallocType); - } - - // Check to see if the prototype is missing, giving us sbyte*(...) * malloc - // This handles the common declaration of: 'void *malloc();' - if (MallocFunc == 0) { - MallocType = FunctionType::get(PointerType::get(Type::Int8Ty), - std::vector(), true); - MallocFunc = M.getFunction("malloc", MallocType); - } + MallocFunc = M.getFunction("malloc"); + if (MallocFunc) { + const FunctionType* TyWeHave = MallocFunc->getFunctionType(); - // Check to see if the prototype was forgotten, giving us void (...) * free - // This handles the common forward declaration of: 'void free();' - if (FreeFunc == 0) { - FreeType = FunctionType::get(Type::VoidTy, std::vector(),true); - FreeFunc = M.getFunction("free", FreeType); + // Get the expected prototype for malloc + const FunctionType *Malloc1Type = + FunctionType::get(PointerType::get(Type::Int8Ty), + std::vector(1, Type::Int64Ty), false); + + // Chck to see if we got the expected malloc + if (TyWeHave != Malloc1Type) { + // Check to see if the prototype is wrong, giving us sbyte*(uint) * malloc + // This handles the common declaration of: 'void *malloc(unsigned);' + const FunctionType *Malloc2Type = + FunctionType::get(PointerType::get(Type::Int8Ty), + std::vector(1, Type::Int32Ty), false); + if (TyWeHave != Malloc2Type) { + // Check to see if the prototype is missing, giving us + // sbyte*(...) * malloc + // This handles the common declaration of: 'void *malloc();' + const FunctionType *Malloc3Type = + FunctionType::get(PointerType::get(Type::Int8Ty), + std::vector(), true); + if (TyWeHave != Malloc3Type) + // Give up + MallocFunc = 0; + } + } } - // One last try, check to see if we can find free as 'int (...)* free'. This - // handles the case where NOTHING was declared. - if (FreeFunc == 0) { - FreeType = FunctionType::get(Type::Int32Ty, std::vector(),true); - FreeFunc = M.getFunction("free", FreeType); + FreeFunc = M.getFunction("free"); + if (FreeFunc) { + const FunctionType* TyWeHave = FreeFunc->getFunctionType(); + + // Get the expected prototype for void free(i8*) + const FunctionType *Free1Type = FunctionType::get(Type::VoidTy, + std::vector(1, PointerType::get(Type::Int8Ty)), false); + + if (TyWeHave != Free1Type) { + // Check to see if the prototype was forgotten, giving us + // void (...) * free + // This handles the common forward declaration of: 'void free();' + const FunctionType* Free2Type = FunctionType::get(Type::VoidTy, + std::vector(),true); + + if (TyWeHave != Free2Type) { + // One last try, check to see if we can find free as + // int (...)* free. This handles the case where NOTHING was declared. + const FunctionType* Free3Type = FunctionType::get(Type::Int32Ty, + std::vector(),true); + + if (TyWeHave != Free3Type) { + // Give up. + FreeFunc = 0; + } + } + } } // Don't mess with locally defined versions of these functions... Index: llvm/lib/Transforms/IPO/StripSymbols.cpp diff -u llvm/lib/Transforms/IPO/StripSymbols.cpp:1.10 llvm/lib/Transforms/IPO/StripSymbols.cpp:1.11 --- llvm/lib/Transforms/IPO/StripSymbols.cpp:1.10 Sat Jan 6 01:24:44 2007 +++ llvm/lib/Transforms/IPO/StripSymbols.cpp Mon Feb 5 14:47:20 2007 @@ -28,7 +28,7 @@ #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/Pass.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/TypeSymbolTable.h" using namespace llvm; From reid at x10sys.com Mon Feb 5 14:48:30 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:30 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/CrashDebugger.cpp ExtractFunction.cpp Miscompilation.cpp Message-ID: <200702052048.l15KmUVI001245@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: CrashDebugger.cpp updated: 1.55 -> 1.56 ExtractFunction.cpp updated: 1.57 -> 1.58 Miscompilation.cpp updated: 1.85 -> 1.86 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+21 -17) CrashDebugger.cpp | 17 +++++++++-------- ExtractFunction.cpp | 10 +++++----- Miscompilation.cpp | 11 +++++++---- 3 files changed, 21 insertions(+), 17 deletions(-) Index: llvm/tools/bugpoint/CrashDebugger.cpp diff -u llvm/tools/bugpoint/CrashDebugger.cpp:1.55 llvm/tools/bugpoint/CrashDebugger.cpp:1.56 --- llvm/tools/bugpoint/CrashDebugger.cpp:1.55 Tue Jan 30 14:08:38 2007 +++ llvm/tools/bugpoint/CrashDebugger.cpp Mon Feb 5 14:47:21 2007 @@ -20,7 +20,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/PassManager.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Bytecode/Writer.h" #include "llvm/Support/CFG.h" @@ -206,9 +206,9 @@ // FIXME: bugpoint should add names to all stripped symbols. assert(!Funcs[i]->getName().empty() && "Bugpoint doesn't work on stripped modules yet PR718!"); - Function *CMF = M->getFunction(Funcs[i]->getName(), - Funcs[i]->getFunctionType()); + Function *CMF = M->getFunction(Funcs[i]->getName()); assert(CMF && "Function not in module?!"); + assert(CMF->getFunctionType() == Funcs[i]->getFunctionType() && "wrong ty"); Functions.insert(CMF); } @@ -271,8 +271,9 @@ for (unsigned i = 0, e = BBs.size(); i != e; ++i) { // Convert the basic block from the original module to the new module... const Function *F = BBs[i]->getParent(); - Function *CMF = M->getFunction(F->getName(), F->getFunctionType()); + Function *CMF = M->getFunction(F->getName()); assert(CMF && "Function not in module?!"); + assert(CMF->getFunctionType() == F->getFunctionType() && "wrong type?"); // Get the mapped basic block... Function::iterator CBI = CMF->begin(); @@ -337,10 +338,10 @@ // module, and that they don't include any deleted blocks. BBs.clear(); for (unsigned i = 0, e = BlockInfo.size(); i != e; ++i) { - SymbolTable &ST = BlockInfo[i].first->getValueSymbolTable(); - SymbolTable::plane_iterator PI = ST.find(Type::LabelTy); - if (PI != ST.plane_end() && PI->second.count(BlockInfo[i].second)) - BBs.push_back(cast(PI->second[BlockInfo[i].second])); + ValueSymbolTable &ST = BlockInfo[i].first->getValueSymbolTable(); + Value* V = ST.lookup(BlockInfo[i].second); + if (V && V->getType() == Type::LabelTy) + BBs.push_back(cast(V)); } return true; } Index: llvm/tools/bugpoint/ExtractFunction.cpp diff -u llvm/tools/bugpoint/ExtractFunction.cpp:1.57 llvm/tools/bugpoint/ExtractFunction.cpp:1.58 --- llvm/tools/bugpoint/ExtractFunction.cpp:1.57 Tue Jan 30 14:08:38 2007 +++ llvm/tools/bugpoint/ExtractFunction.cpp Mon Feb 5 14:47:21 2007 @@ -110,7 +110,6 @@ I->setLinkage(GlobalValue::ExternalLinkage); std::vector CleanupPasses; - CleanupPasses.push_back(getPI(createFunctionResolvingPass())); CleanupPasses.push_back(getPI(createGlobalDCEPass())); CleanupPasses.push_back(getPI(createDeadTypeEliminationPass())); @@ -221,7 +220,7 @@ M1Tors.push_back(std::make_pair(F, Priority)); else { // Map to M2's version of the function. - F = M2->getFunction(F->getName(), F->getFunctionType()); + F = M2->getFunction(F->getName()); M2Tors.push_back(std::make_pair(F, Priority)); } } @@ -272,9 +271,10 @@ std::set > TestFunctions; for (unsigned i = 0, e = F.size(); i != e; ++i) { TestFunctions.insert(std::make_pair(F[i]->getName(), F[i]->getType())); - Function *TNOF = M->getFunction(F[i]->getName(), F[i]->getFunctionType()); - DEBUG(std::cerr << "Removing function " << F[i]->getName() << "\n"); + Function *TNOF = M->getFunction(F[i]->getName()); assert(TNOF && "Function doesn't exist in module!"); + assert(TNOF->getFunctionType() == F[i]->getFunctionType() && "wrong type?"); + DEBUG(std::cerr << "Removing function " << F[i]->getName() << "\n"); DeleteFunctionBody(TNOF); // Function is now external in this module! } @@ -317,7 +317,7 @@ Function *F = BB->getParent(); // Map the corresponding function in this module. - Function *MF = M.getFunction(F->getName(), F->getFunctionType()); + Function *MF = M.getFunction(F->getName()); // Figure out which index the basic block is in its function. Function::iterator BBI = MF->begin(); Index: llvm/tools/bugpoint/Miscompilation.cpp diff -u llvm/tools/bugpoint/Miscompilation.cpp:1.85 llvm/tools/bugpoint/Miscompilation.cpp:1.86 --- llvm/tools/bugpoint/Miscompilation.cpp:1.85 Tue Jan 30 14:08:38 2007 +++ llvm/tools/bugpoint/Miscompilation.cpp Mon Feb 5 14:47:21 2007 @@ -341,9 +341,11 @@ // optimized and loop extracted module. MiscompiledFunctions.clear(); for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { - Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first, - MisCompFunctions[i].second); + Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first); + assert(NewF && "Function not found??"); + assert(NewF->getFunctionType() == MisCompFunctions[i].second && + "found wrong function type?"); MiscompiledFunctions.push_back(NewF); } @@ -479,9 +481,10 @@ MiscompiledFunctions.clear(); for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { - Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first, - MisCompFunctions[i].second); + Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first); assert(NewF && "Function not found??"); + assert(NewF->getFunctionType() == MisCompFunctions[i].second && + "Function has wrong type??"); MiscompiledFunctions.push_back(NewF); } From reid at x10sys.com Mon Feb 5 14:48:32 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:32 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-extract/llvm-extract.cpp Message-ID: <200702052048.l15KmW53001257@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-extract: llvm-extract.cpp updated: 1.34 -> 1.35 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -1) llvm-extract.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/tools/llvm-extract/llvm-extract.cpp diff -u llvm/tools/llvm-extract/llvm-extract.cpp:1.34 llvm/tools/llvm-extract/llvm-extract.cpp:1.35 --- llvm/tools/llvm-extract/llvm-extract.cpp:1.34 Sun Jan 28 07:31:35 2007 +++ llvm/tools/llvm-extract/llvm-extract.cpp Mon Feb 5 14:47:21 2007 @@ -79,7 +79,6 @@ Passes.add(createFunctionExtractionPass(F, DeleteFn, Relink)); if (!DeleteFn) Passes.add(createGlobalDCEPass()); // Delete unreachable globals - Passes.add(createFunctionResolvingPass()); // Delete prototypes Passes.add(createDeadTypeEliminationPass()); // Remove dead types... std::ostream *Out = 0; From reid at x10sys.com Mon Feb 5 14:48:32 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:32 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm2cpp/CppWriter.cpp Message-ID: <200702052048.l15KmWF6001259@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm2cpp: CppWriter.cpp updated: 1.36 -> 1.37 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -1) CppWriter.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/tools/llvm2cpp/CppWriter.cpp diff -u llvm/tools/llvm2cpp/CppWriter.cpp:1.36 llvm/tools/llvm2cpp/CppWriter.cpp:1.37 --- llvm/tools/llvm2cpp/CppWriter.cpp:1.36 Tue Jan 30 14:08:39 2007 +++ llvm/tools/llvm2cpp/CppWriter.cpp Mon Feb 5 14:47:21 2007 @@ -19,7 +19,6 @@ #include "llvm/Instruction.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/STLExtras.h" From reid at x10sys.com Mon Feb 5 14:48:33 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:33 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Function.h LinkAllPasses.h Module.h Value.h ValueSymbolTable.h SymbolTable.h Message-ID: <200702052048.l15KmXZI001276@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Function.h updated: 1.71 -> 1.72 LinkAllPasses.h updated: 1.8 -> 1.9 Module.h updated: 1.81 -> 1.82 Value.h updated: 1.90 -> 1.91 ValueSymbolTable.h updated: 1.3 -> 1.4 SymbolTable.h (r1.54) removed --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+27 -19) Function.h | 6 +++--- LinkAllPasses.h | 1 - Module.h | 24 +++++++++++++----------- Value.h | 3 ++- ValueSymbolTable.h | 12 +++++++++--- 5 files changed, 27 insertions(+), 19 deletions(-) Index: llvm/include/llvm/Function.h diff -u llvm/include/llvm/Function.h:1.71 llvm/include/llvm/Function.h:1.72 --- llvm/include/llvm/Function.h:1.71 Tue Jan 30 14:08:38 2007 +++ llvm/include/llvm/Function.h Mon Feb 5 14:47:19 2007 @@ -63,7 +63,7 @@ BasicBlockListType BasicBlocks; // The basic blocks ArgumentListType ArgumentList; // The formal arguments - SymbolTable *SymTab; + ValueSymbolTable *SymTab; unsigned CallingConvention; friend class SymbolTableListTraits; @@ -156,8 +156,8 @@ /// getSymbolTable() - Return the symbol table... /// - inline SymbolTable &getValueSymbolTable() { return *SymTab; } - inline const SymbolTable &getValueSymbolTable() const { return *SymTab; } + inline ValueSymbolTable &getValueSymbolTable() { return *SymTab; } + inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; } //===--------------------------------------------------------------------===// Index: llvm/include/llvm/LinkAllPasses.h diff -u llvm/include/llvm/LinkAllPasses.h:1.8 llvm/include/llvm/LinkAllPasses.h:1.9 --- llvm/include/llvm/LinkAllPasses.h:1.8 Sat Feb 3 17:15:56 2007 +++ llvm/include/llvm/LinkAllPasses.h Mon Feb 5 14:47:19 2007 @@ -64,7 +64,6 @@ (void) llvm::createEmitFunctionTablePass(); (void) llvm::createFunctionInliningPass(); (void) llvm::createFunctionProfilerPass(); - (void) llvm::createFunctionResolvingPass(); (void) llvm::createGCSEPass(); (void) llvm::createGlobalDCEPass(); (void) llvm::createGlobalOptimizerPass(); Index: llvm/include/llvm/Module.h diff -u llvm/include/llvm/Module.h:1.81 llvm/include/llvm/Module.h:1.82 --- llvm/include/llvm/Module.h:1.81 Sat Feb 3 18:40:41 2007 +++ llvm/include/llvm/Module.h Mon Feb 5 14:47:19 2007 @@ -23,8 +23,6 @@ class GlobalVariable; class GlobalValueRefMap; // Used by ConstantVals.cpp class FunctionType; -class SymbolTable; -class TypeSymbolTable; template<> struct ilist_traits : public SymbolTableListTraits { @@ -91,7 +89,7 @@ FunctionListType FunctionList; ///< The Functions in the module LibraryListType LibraryList; ///< The Libraries needed by the module std::string GlobalScopeAsm; ///< Inline Asm at global scope. - SymbolTable *ValSymTab; ///< Symbol table for values + ValueSymbolTable *ValSymTab; ///< Symbol table for values TypeSymbolTable *TypeSymTab; ///< Symbol table for types std::string ModuleID; ///< Human readable identifier for the module std::string TargetTriple; ///< Platform target triple Module compiled on @@ -178,17 +176,19 @@ /// getFunction - Look up the specified function in the module symbol table. /// If it does not exist, return null. - Function *getFunction(const std::string &Name, const FunctionType *Ty); + Function *getFunction(const std::string &Name) const; /// getMainFunction - This function looks up main efficiently. This is such a /// common case, that it is a method in Module. If main cannot be found, a /// null pointer is returned. - Function *getMainFunction(); + Function *getMainFunction() { return getFunction("main"); } /// getNamedFunction - Return the first function in the module with the /// specified name, of arbitrary type. This method returns null if a function /// with the specified name is not found. - Function *getNamedFunction(const std::string &Name) const; + Function *getNamedFunction(const std::string &Name) const { + return getFunction(Name); + } /// @} /// @name Global Variable Accessors @@ -200,13 +200,15 @@ /// the top-level PointerType, which represents the address of the global. /// If AllowInternal is set to true, this function will return types that /// have InternalLinkage. By default, these types are not returned. - GlobalVariable *getGlobalVariable(const std::string &Name, const Type *Ty, - bool AllowInternal = false); + GlobalVariable *getGlobalVariable(const std::string &Name, + bool AllowInternal = false) const; /// getNamedGlobal - Return the first global variable in the module with the /// specified name, of arbitrary type. This method returns null if a global /// with the specified name is not found. - GlobalVariable *getNamedGlobal(const std::string &Name) const; + GlobalVariable *getNamedGlobal(const std::string &Name) const { + return getGlobalVariable(Name, true); + } /// @} /// @name Type Accessors @@ -238,9 +240,9 @@ /// Get the Module's list of functions. FunctionListType &getFunctionList() { return FunctionList; } /// Get the symbol table of global variable and function identifiers - const SymbolTable &getValueSymbolTable() const { return *ValSymTab; } + const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; } /// Get the Module's symbol table of global variable and function identifiers. - SymbolTable &getValueSymbolTable() { return *ValSymTab; } + ValueSymbolTable &getValueSymbolTable() { return *ValSymTab; } /// Get the symbol table of types const TypeSymbolTable &getTypeSymbolTable() const { return *TypeSymTab; } /// Get the Module's symbol table of types Index: llvm/include/llvm/Value.h diff -u llvm/include/llvm/Value.h:1.90 llvm/include/llvm/Value.h:1.91 --- llvm/include/llvm/Value.h:1.90 Thu Jan 11 06:24:13 2007 +++ llvm/include/llvm/Value.h Mon Feb 5 14:47:19 2007 @@ -31,7 +31,8 @@ class Function; class GlobalVariable; class InlineAsm; -class SymbolTable; +class ValueSymbolTable; +class TypeSymbolTable; //===----------------------------------------------------------------------===// // Value Class Index: llvm/include/llvm/ValueSymbolTable.h diff -u llvm/include/llvm/ValueSymbolTable.h:1.3 llvm/include/llvm/ValueSymbolTable.h:1.4 --- llvm/include/llvm/ValueSymbolTable.h:1.3 Wed May 31 15:40:31 2006 +++ llvm/include/llvm/ValueSymbolTable.h Mon Feb 5 14:47:19 2007 @@ -72,6 +72,12 @@ /// @brief Get a name unique to this symbol table std::string getUniqueName(const std::string &BaseName) const; + /// @return 1 if the name is in the symbol table, 0 otherwise + /// @brief Determine if a name is in the symbol table + ValueMap::size_type count(const std::string &name) const { + return vmap.count(name); + } + /// This function can be used from the debugger to display the /// content of the symbol table while debugging. /// @brief Print out symbol table on stderr @@ -111,10 +117,10 @@ /// This method removes a value from the symbol table. The name of the /// Value is extracted from \p Val and used to lookup the Value in the /// symbol table. If the Value is not in the symbol table, this method - /// returns false. - /// @returns true if \p Val was successfully erased, false otherwise + /// returns false. \p Val is not deleted, just removed from the symbol table. + /// @returns true if \p Val was successfully removed, false otherwise /// @brief Remove a value from the symbol table. - bool erase(Value* Val); + bool remove(Value* Val); /// Given a value with a non-empty name, remove its existing /// entry from the symbol table and insert a new one for Name. This is From reid at x10sys.com Mon Feb 5 14:48:34 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:34 -0600 Subject: [llvm-commits] CVS: llvm/test/Linker/redefinition.ll Message-ID: <200702052048.l15KmYaZ001281@zion.cs.uiuc.edu> Changes in directory llvm/test/Linker: redefinition.ll added (r1.1) --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+10 -0) redefinition.ll | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/test/Linker/redefinition.ll diff -c /dev/null llvm/test/Linker/redefinition.ll:1.1 *** /dev/null Mon Feb 5 14:47:31 2007 --- llvm/test/Linker/redefinition.ll Mon Feb 5 14:47:21 2007 *************** *** 0 **** --- 1,10 ---- + ; Test linking two functions with different prototypes and two globals + ; in different modules. + ; RUN: llvm-as %s -o %t.foo1.bc -f + ; RUN: llvm-as %s -o %t.foo2.bc -f + ; RUN: echo "define void @foo(i32 %x) { ret void }" | llvm-as -o %t.foo3.bc -f + ; RUN: llvm-link %t.foo1.bc %t.foo2.bc -o %t.bc 2>&1 | \ + ; RUN: grep "Function is already defined" + ; RUN: llvm-link %t.foo1.bc %t.foo3.bc -o %t.bc 2>&1 | \ + ; RUN: grep "Function 'foo' defined as both" + define void @foo() { ret void } From reid at x10sys.com Mon Feb 5 14:48:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:35 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-ld/Optimize.cpp Message-ID: <200702052048.l15KmZeC001294@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-ld: Optimize.cpp updated: 1.15 -> 1.16 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -6) Optimize.cpp | 6 ------ 1 files changed, 6 deletions(-) Index: llvm/tools/llvm-ld/Optimize.cpp diff -u llvm/tools/llvm-ld/Optimize.cpp:1.15 llvm/tools/llvm-ld/Optimize.cpp:1.16 --- llvm/tools/llvm-ld/Optimize.cpp:1.15 Fri Dec 1 15:59:37 2006 +++ llvm/tools/llvm-ld/Optimize.cpp Mon Feb 5 14:47:21 2007 @@ -108,12 +108,6 @@ // Add an appropriate TargetData instance for this module... addPass(Passes, new TargetData(M)); - // Often if the programmer does not specify proper prototypes for the - // functions they are calling, they end up calling a vararg version of the - // function that does not get a body filled in (the real function has typed - // arguments). This pass merges the two functions. - addPass(Passes, createFunctionResolvingPass()); - if (!DisableOptimizations) { // Now that composite has been compiled, scan through the module, looking // for a main function. If main is defined, mark all other functions From reid at x10sys.com Mon Feb 5 14:48:36 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp Constants.cpp Function.cpp Globals.cpp Instruction.cpp Module.cpp SymbolTableListTraitsImpl.h Type.cpp Value.cpp ValueSymbolTable.cpp Verifier.cpp SymbolTable.cpp Message-ID: <200702052048.l15KmapG001337@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AsmWriter.cpp updated: 1.259 -> 1.260 Constants.cpp updated: 1.207 -> 1.208 Function.cpp updated: 1.110 -> 1.111 Globals.cpp updated: 1.14 -> 1.15 Instruction.cpp updated: 1.62 -> 1.63 Module.cpp updated: 1.75 -> 1.76 SymbolTableListTraitsImpl.h updated: 1.8 -> 1.9 Type.cpp updated: 1.167 -> 1.168 Value.cpp updated: 1.60 -> 1.61 ValueSymbolTable.cpp updated: 1.3 -> 1.4 Verifier.cpp updated: 1.189 -> 1.190 SymbolTable.cpp (r1.66) removed --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+57 -144) AsmWriter.cpp | 2 Constants.cpp | 2 Function.cpp | 6 -- Globals.cpp | 1 Instruction.cpp | 1 Module.cpp | 112 +++++++------------------------------------- SymbolTableListTraitsImpl.h | 6 +- Type.cpp | 1 Value.cpp | 15 +++-- ValueSymbolTable.cpp | 27 +++------- Verifier.cpp | 28 +++++------ 11 files changed, 57 insertions(+), 144 deletions(-) Index: llvm/lib/VMCore/AsmWriter.cpp diff -u llvm/lib/VMCore/AsmWriter.cpp:1.259 llvm/lib/VMCore/AsmWriter.cpp:1.260 --- llvm/lib/VMCore/AsmWriter.cpp:1.259 Fri Feb 2 07:54:55 2007 +++ llvm/lib/VMCore/AsmWriter.cpp Mon Feb 5 14:47:20 2007 @@ -24,7 +24,7 @@ #include "llvm/Instruction.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/STLExtras.h" Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.207 llvm/lib/VMCore/Constants.cpp:1.208 --- llvm/lib/VMCore/Constants.cpp:1.207 Thu Feb 1 20:16:22 2007 +++ llvm/lib/VMCore/Constants.cpp Mon Feb 5 14:47:20 2007 @@ -16,7 +16,6 @@ #include "llvm/DerivedTypes.h" #include "llvm/GlobalValue.h" #include "llvm/Instructions.h" -#include "llvm/SymbolTable.h" #include "llvm/Module.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Compiler.h" @@ -24,6 +23,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MathExtras.h" #include +#include using namespace llvm; //===----------------------------------------------------------------------===// Index: llvm/lib/VMCore/Function.cpp diff -u llvm/lib/VMCore/Function.cpp:1.110 llvm/lib/VMCore/Function.cpp:1.111 --- llvm/lib/VMCore/Function.cpp:1.110 Fri Jan 26 02:01:30 2007 +++ llvm/lib/VMCore/Function.cpp Mon Feb 5 14:47:20 2007 @@ -7,8 +7,7 @@ // //===----------------------------------------------------------------------===// // -// This file implements the Function & GlobalVariable classes for the VMCore -// library. +// This file implements the Function class for the VMCore library. // //===----------------------------------------------------------------------===// @@ -82,7 +81,7 @@ BasicBlocks.setParent(this); ArgumentList.setItemParent(this); ArgumentList.setParent(this); - SymTab = new SymbolTable(); + SymTab = new ValueSymbolTable(); assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy) && "LLVM functions cannot return aggregate values!"); @@ -138,7 +137,6 @@ getParent()->getFunctionList().erase(this); } - // dropAllReferences() - This function causes all the subinstructions to "let // go" of all references that they are maintaining. This allows one to // 'delete' a whole class at a time, even though there may be circular Index: llvm/lib/VMCore/Globals.cpp diff -u llvm/lib/VMCore/Globals.cpp:1.14 llvm/lib/VMCore/Globals.cpp:1.15 --- llvm/lib/VMCore/Globals.cpp:1.14 Sat Sep 30 16:31:26 2006 +++ llvm/lib/VMCore/Globals.cpp Mon Feb 5 14:47:20 2007 @@ -15,7 +15,6 @@ #include "llvm/GlobalVariable.h" #include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" #include "llvm/Support/LeakDetector.h" using namespace llvm; Index: llvm/lib/VMCore/Instruction.cpp diff -u llvm/lib/VMCore/Instruction.cpp:1.62 llvm/lib/VMCore/Instruction.cpp:1.63 --- llvm/lib/VMCore/Instruction.cpp:1.62 Wed Jan 3 20:15:37 2007 +++ llvm/lib/VMCore/Instruction.cpp Mon Feb 5 14:47:20 2007 @@ -14,7 +14,6 @@ #include "llvm/Type.h" #include "llvm/Instructions.h" #include "llvm/Function.h" -#include "llvm/SymbolTable.h" #include "llvm/Support/LeakDetector.h" using namespace llvm; Index: llvm/lib/VMCore/Module.cpp diff -u llvm/lib/VMCore/Module.cpp:1.75 llvm/lib/VMCore/Module.cpp:1.76 --- llvm/lib/VMCore/Module.cpp:1.75 Sat Feb 3 18:40:42 2007 +++ llvm/lib/VMCore/Module.cpp Mon Feb 5 14:47:20 2007 @@ -69,7 +69,7 @@ FunctionList.setParent(this); GlobalList.setItemParent(this); GlobalList.setParent(this); - ValSymTab = new SymbolTable(); + ValSymTab = new ValueSymbolTable(); TypeSymTab = new TypeSymbolTable(); } @@ -132,15 +132,19 @@ // Methods for easy access to the functions in the module. // +// getOrInsertFunction - Look up the specified function in the module symbol +// table. If it does not exist, add a prototype for the function and return +// it. This is nice because it allows most passes to get away with not handling +// the symbol table directly for this common task. +// Constant *Module::getOrInsertFunction(const std::string &Name, const FunctionType *Ty) { - SymbolTable &SymTab = getValueSymbolTable(); + ValueSymbolTable &SymTab = getValueSymbolTable(); - // See if we have a definitions for the specified function already. - Function *F = - dyn_cast_or_null(SymTab.lookup(PointerType::get(Ty), Name)); + // See if we have a definition for the specified function already. + Function *F = dyn_cast_or_null(SymTab.lookup(Name)); if (F == 0) { - // Nope, add it. + // Nope, add it Function *New = new Function(Ty, GlobalVariable::ExternalLinkage, Name); FunctionList.push_back(New); return New; // Return the new prototype. @@ -149,7 +153,7 @@ // Okay, the function exists. Does it have externally visible linkage? if (F->hasInternalLinkage()) { // Rename the function. - F->setName(SymTab.getUniqueName(F->getType(), F->getName())); + F->setName(SymTab.getUniqueName(F->getName())); // Retry, now there won't be a conflict. return getOrInsertFunction(Name, Ty); } @@ -188,73 +192,9 @@ // getFunction - Look up the specified function in the module symbol table. // If it does not exist, return null. // -Function *Module::getFunction(const std::string &Name, const FunctionType *Ty) { - SymbolTable &SymTab = getValueSymbolTable(); - return cast_or_null(SymTab.lookup(PointerType::get(Ty), Name)); -} - - -/// getMainFunction - This function looks up main efficiently. This is such a -/// common case, that it is a method in Module. If main cannot be found, a -/// null pointer is returned. -/// -Function *Module::getMainFunction() { - std::vector Params; - - // int main(void)... - if (Function *F = getFunction("main", FunctionType::get(Type::Int32Ty, - Params, false))) - return F; - - // void main(void)... - if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, - Params, false))) - return F; - - Params.push_back(Type::Int32Ty); - - // int main(int argc)... - if (Function *F = getFunction("main", FunctionType::get(Type::Int32Ty, - Params, false))) - return F; - - // void main(int argc)... - if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, - Params, false))) - return F; - - for (unsigned i = 0; i != 2; ++i) { // Check argv and envp - Params.push_back(PointerType::get(PointerType::get(Type::Int8Ty))); - - // int main(int argc, char **argv)... - if (Function *F = getFunction("main", FunctionType::get(Type::Int32Ty, - Params, false))) - return F; - - // void main(int argc, char **argv)... - if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, - Params, false))) - return F; - } - - // Ok, try to find main the hard way... - return getNamedFunction("main"); -} - -/// getNamedFunction - Return the first function in the module with the -/// specified name, of arbitrary type. This method returns null if a function -/// with the specified name is not found. -/// -Function *Module::getNamedFunction(const std::string &Name) const { - // Loop over all of the functions, looking for the function desired - const Function *Found = 0; - for (const_iterator I = begin(), E = end(); I != E; ++I) - if (I->getName() == Name) - if (I->isDeclaration()) - Found = I; - else - return const_cast(&(*I)); - return const_cast(Found); // Non-external function not found... +Function *Module::getFunction(const std::string &Name) const { + const ValueSymbolTable &SymTab = getValueSymbolTable(); + return dyn_cast_or_null(SymTab.lookup(Name)); } //===----------------------------------------------------------------------===// @@ -269,31 +209,15 @@ /// have InternalLinkage. By default, these types are not returned. /// GlobalVariable *Module::getGlobalVariable(const std::string &Name, - const Type *Ty, bool AllowInternal) { - if (Value *V = getValueSymbolTable().lookup(PointerType::get(Ty), Name)) { - GlobalVariable *Result = cast(V); - if (AllowInternal || !Result->hasInternalLinkage()) + bool AllowInternal) const { + if (Value *V = ValSymTab->lookup(Name)) { + GlobalVariable *Result = dyn_cast(V); + if (Result && (AllowInternal || !Result->hasInternalLinkage())) return Result; } return 0; } -/// getNamedGlobal - Return the first global variable in the module with the -/// specified name, of arbitrary type. This method returns null if a global -/// with the specified name is not found. -/// -GlobalVariable *Module::getNamedGlobal(const std::string &Name) const { - // FIXME: This would be much faster with a symbol table that doesn't - // discriminate based on type! - for (const_global_iterator I = global_begin(), E = global_end(); - I != E; ++I) - if (I->getName() == Name) - return const_cast(&(*I)); - return 0; -} - - - //===----------------------------------------------------------------------===// // Methods for easy access to the types in the module. // Index: llvm/lib/VMCore/SymbolTableListTraitsImpl.h diff -u llvm/lib/VMCore/SymbolTableListTraitsImpl.h:1.8 llvm/lib/VMCore/SymbolTableListTraitsImpl.h:1.9 --- llvm/lib/VMCore/SymbolTableListTraitsImpl.h:1.8 Sat Jan 6 01:24:44 2007 +++ llvm/lib/VMCore/SymbolTableListTraitsImpl.h Mon Feb 5 14:47:20 2007 @@ -17,7 +17,7 @@ #define LLVM_SYMBOLTABLELISTTRAITS_IMPL_H #include "llvm/SymbolTableListTraits.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" namespace llvm { @@ -29,7 +29,7 @@ // Remove all of the items from the old symtab.. if (SymTabObject && !List.empty()) { - SymbolTable &SymTab = SymTabObject->getValueSymbolTable(); + ValueSymbolTable &SymTab = SymTabObject->getValueSymbolTable(); for (typename iplist::iterator I = List.begin(); I != List.end(); ++I) if (I->hasName()) SymTab.remove(I); @@ -39,7 +39,7 @@ // Add all of the items to the new symtab... if (SymTabObject && !List.empty()) { - SymbolTable &SymTab = SymTabObject->getValueSymbolTable(); + ValueSymbolTable &SymTab = SymTabObject->getValueSymbolTable(); for (typename iplist::iterator I = List.begin(); I != List.end(); ++I) if (I->hasName()) SymTab.insert(I); Index: llvm/lib/VMCore/Type.cpp diff -u llvm/lib/VMCore/Type.cpp:1.167 llvm/lib/VMCore/Type.cpp:1.168 --- llvm/lib/VMCore/Type.cpp:1.167 Sun Jan 28 07:31:35 2007 +++ llvm/lib/VMCore/Type.cpp Mon Feb 5 14:47:20 2007 @@ -13,7 +13,6 @@ #include "llvm/AbstractTypeUser.h" #include "llvm/DerivedTypes.h" -#include "llvm/SymbolTable.h" #include "llvm/Constants.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/StringExtras.h" Index: llvm/lib/VMCore/Value.cpp diff -u llvm/lib/VMCore/Value.cpp:1.60 llvm/lib/VMCore/Value.cpp:1.61 --- llvm/lib/VMCore/Value.cpp:1.60 Sat Jan 6 01:24:44 2007 +++ llvm/lib/VMCore/Value.cpp Mon Feb 5 14:47:20 2007 @@ -15,7 +15,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/InstrTypes.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/Debug.h" #include "llvm/Support/LeakDetector.h" #include @@ -97,17 +97,20 @@ if (Name == name) return; // Name is already set. // Get the symbol table to update for this object. - SymbolTable *ST = 0; + ValueSymbolTable *ST = 0; if (Instruction *I = dyn_cast(this)) { if (BasicBlock *P = I->getParent()) if (Function *PP = P->getParent()) ST = &PP->getValueSymbolTable(); } else if (BasicBlock *BB = dyn_cast(this)) { - if (Function *P = BB->getParent()) ST = &P->getValueSymbolTable(); + if (Function *P = BB->getParent()) + ST = &P->getValueSymbolTable(); } else if (GlobalValue *GV = dyn_cast(this)) { - if (Module *P = GV->getParent()) ST = &P->getValueSymbolTable(); + if (Module *P = GV->getParent()) + ST = &P->getValueSymbolTable(); } else if (Argument *A = dyn_cast(this)) { - if (Function *P = A->getParent()) ST = &P->getValueSymbolTable(); + if (Function *P = A->getParent()) + ST = &P->getValueSymbolTable(); } else { assert(isa(this) && "Unknown value type!"); return; // no name is setable for this. @@ -117,7 +120,7 @@ Name = name; else if (hasName()) { if (!name.empty()) { // Replacing name. - ST->changeName(this, name); + ST->rename(this, name); } else { // Transitioning from hasName -> noname. ST->remove(this); Name.clear(); Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.3 llvm/lib/VMCore/ValueSymbolTable.cpp:1.4 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.3 Fri Nov 17 02:03:48 2006 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Mon Feb 5 14:47:20 2007 @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "valuesymtab" #include "llvm/GlobalValue.h" #include "llvm/Type.h" #include "llvm/ValueSymbolTable.h" @@ -19,18 +20,15 @@ #include using namespace llvm; -#define DEBUG_SYMBOL_TABLE 0 -#define DEBUG_ABSTYPE 0 - // Class destructor ValueSymbolTable::~ValueSymbolTable() { #ifndef NDEBUG // Only do this in -g mode... bool LeftoverValues = true; for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ++VI) if (!isa(VI->second) ) { - DOUT << "Value still in symbol table! Type = '" + DEBUG(DOUT << "Value still in symbol table! Type = '" << VI->second->getType()->getDescription() << "' Name = '" - << VI->first << "'\n"; + << VI->first << "'\n"); LeftoverValues = false; } assert(LeftoverValues && "Values remain in symbol table!"); @@ -83,29 +81,24 @@ assert(V && "Can't insert null Value into symbol table!"); assert(V->hasName() && "Can't insert nameless Value into symbol table"); - // Check to see if there is a naming conflict. If so, rename this type! + // Check to see if there is a naming conflict. If so, rename this value std::string UniqueName = getUniqueName(V->getName()); -#if DEBUG_SYMBOL_TABLE - dump(); - DOUT << " Inserting value: " << UniqueName << ": " << V->dump() << "\n"; -#endif + DEBUG(DOUT << " Inserting value: " << UniqueName << ": " << *V << "\n"); // Insert the vmap entry - vmap.insert(make_pair(UniqueName, V)); + V->Name = UniqueName; + vmap.insert(make_pair(V->Name, V)); } // Remove a value -bool ValueSymbolTable::erase(Value *V) { +bool ValueSymbolTable::remove(Value *V) { assert(V->hasName() && "Value doesn't have name!"); iterator Entry = vmap.find(V->getName()); if (Entry == vmap.end()) return false; -#if DEBUG_SYMBOL_TABLE - dump(); - DOUT << " Removing Value: " << Entry->second->getName() << "\n"; -#endif + DEBUG(DOUT << " Removing Value: " << Entry->second->getName() << "\n"); // Remove the value from the plane... vmap.erase(Entry); @@ -143,7 +136,7 @@ vmap.insert(make_pair(V->Name, V)); } else { V->Name = name; - vmap.insert(VI, make_pair(name, V)); + vmap.insert(VI, make_pair(V->Name, V)); } return true; Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.189 llvm/lib/VMCore/Verifier.cpp:1.190 --- llvm/lib/VMCore/Verifier.cpp:1.189 Thu Feb 1 20:16:22 2007 +++ llvm/lib/VMCore/Verifier.cpp Mon Feb 5 14:47:20 2007 @@ -51,7 +51,7 @@ #include "llvm/Instructions.h" #include "llvm/Intrinsics.h" #include "llvm/PassManager.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Support/CFG.h" #include "llvm/Support/InstVisitor.h" @@ -175,7 +175,7 @@ // Verification methods... void verifyTypeSymbolTable(TypeSymbolTable &ST); - void verifyValueSymbolTable(SymbolTable &ST); + void verifyValueSymbolTable(ValueSymbolTable &ST); void visitGlobalValue(GlobalValue &GV); void visitGlobalVariable(GlobalVariable &GV); void visitFunction(Function &F); @@ -307,20 +307,18 @@ // verifySymbolTable - Verify that a function or module symbol table is ok // -void Verifier::verifyValueSymbolTable(SymbolTable &ST) { +void Verifier::verifyValueSymbolTable(ValueSymbolTable &ST) { - // Loop over all of the values in all type planes in the symbol table. - for (SymbolTable::plane_const_iterator PI = ST.plane_begin(), - PE = ST.plane_end(); PI != PE; ++PI) - for (SymbolTable::value_const_iterator VI = PI->second.begin(), - VE = PI->second.end(); VI != VE; ++VI) { - Value *V = VI->second; - // Check that there are no void typed values in the symbol table. Values - // with a void type cannot be put into symbol tables because they cannot - // have names! - Assert1(V->getType() != Type::VoidTy, - "Values with void type are not allowed to have names!", V); - } + // Loop over all of the values in the symbol table. + for (ValueSymbolTable::const_iterator VI = ST.begin(), VE = ST.end(); + VI != VE; ++VI) { + Value *V = VI->second; + // Check that there are no void typed values in the symbol table. Values + // with a void type cannot be put into symbol tables because they cannot + // have names! + Assert1(V->getType() != Type::VoidTy, + "Values with void type are not allowed to have names!", V); + } } // visitFunction - Verify that a function is ok. From reid at x10sys.com Mon Feb 5 14:48:31 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/CloneModule.cpp Message-ID: <200702052048.l15KmVM5001252@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: CloneModule.cpp updated: 1.22 -> 1.23 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -1) CloneModule.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/lib/Transforms/Utils/CloneModule.cpp diff -u llvm/lib/Transforms/Utils/CloneModule.cpp:1.22 llvm/lib/Transforms/Utils/CloneModule.cpp:1.23 --- llvm/lib/Transforms/Utils/CloneModule.cpp:1.22 Fri Feb 2 18:08:31 2007 +++ llvm/lib/Transforms/Utils/CloneModule.cpp Mon Feb 5 14:47:20 2007 @@ -15,7 +15,6 @@ #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Module.h" #include "llvm/DerivedTypes.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/Constant.h" #include "ValueMapper.h" From reid at x10sys.com Mon Feb 5 14:48:37 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/LinkModules.cpp Message-ID: <200702052048.l15KmbtA001367@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: LinkModules.cpp updated: 1.135 -> 1.136 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+99 -87) LinkModules.cpp | 186 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 99 insertions(+), 87 deletions(-) Index: llvm/lib/Linker/LinkModules.cpp diff -u llvm/lib/Linker/LinkModules.cpp:1.135 llvm/lib/Linker/LinkModules.cpp:1.136 --- llvm/lib/Linker/LinkModules.cpp:1.135 Sat Feb 3 22:43:17 2007 +++ llvm/lib/Linker/LinkModules.cpp Mon Feb 5 14:47:20 2007 @@ -20,8 +20,8 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Instructions.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/Streams.h" @@ -273,7 +273,8 @@ static Value *RemapOperand(const Value *In, std::map &ValueMap) { std::map::const_iterator I = ValueMap.find(In); - if (I != ValueMap.end()) return I->second; + if (I != ValueMap.end()) + return I->second; // Check to see if it's a constant that we are interested in transforming. Value *Result = 0; @@ -333,20 +334,34 @@ /// through the trouble to force this back. static void ForceRenaming(GlobalValue *GV, const std::string &Name) { assert(GV->getName() != Name && "Can't force rename to self"); - SymbolTable &ST = GV->getParent()->getValueSymbolTable(); + ValueSymbolTable &ST = GV->getParent()->getValueSymbolTable(); // If there is a conflict, rename the conflict. - Value *ConflictVal = ST.lookup(GV->getType(), Name); - assert(ConflictVal&&"Why do we have to force rename if there is no conflic?"); - GlobalValue *ConflictGV = cast(ConflictVal); - assert(ConflictGV->hasInternalLinkage() && - "Not conflicting with a static global, should link instead!"); - - ConflictGV->setName(""); // Eliminate the conflict - GV->setName(Name); // Force the name back - ConflictGV->setName(Name); // This will cause ConflictGV to get renamed - assert(GV->getName() == Name && ConflictGV->getName() != Name && - "ForceRenaming didn't work"); + GlobalValue *ConflictGV = cast_or_null(ST.lookup(Name)); + if (ConflictGV) { + assert(ConflictGV->hasInternalLinkage() && + "Not conflicting with a static global, should link instead!"); + ConflictGV->setName(""); // Eliminate the conflict + } + GV->setName(Name); // Force the name back + if (ConflictGV) { + ConflictGV->setName(Name); // This will cause ConflictGV to get renamed + assert(ConflictGV->getName() != Name && "ForceRenaming didn't work"); + } + assert(GV->getName() == Name && "ForceRenaming didn't work"); +} + +/// CopyGVAttributes - copy additional attributes (those not needed to construct +/// a GlobalValue) from the SrcGV to the DestGV. +static void CopyGVAttributes(GlobalValue *DestGV, const GlobalValue *SrcGV) { + // Propagate alignment, visibility and section info. + DestGV->setAlignment(std::max(DestGV->getAlignment(), SrcGV->getAlignment())); + DestGV->setSection(SrcGV->getSection()); + DestGV->setVisibility(SrcGV->getVisibility()); + if (const Function *SrcF = dyn_cast(SrcGV)) { + Function *DestF = cast(DestGV); + DestF->setCallingConv(SrcF->getCallingConv()); + } } /// GetLinkageResult - This analyzes the two global values and determines what @@ -431,29 +446,20 @@ static bool LinkGlobals(Module *Dest, Module *Src, std::map &ValueMap, std::multimap &AppendingVars, - std::map &GlobalsByName, std::string *Err) { - // We will need a module level symbol table if the src module has a module - // level symbol table... - TypeSymbolTable *TST = &Dest->getTypeSymbolTable(); - // Loop over all of the globals in the src module, mapping them over as we go for (Module::global_iterator I = Src->global_begin(), E = Src->global_end(); I != E; ++I) { GlobalVariable *SGV = I; GlobalVariable *DGV = 0; // Check to see if may have to link the global. - if (SGV->hasName() && !SGV->hasInternalLinkage()) - if (!(DGV = Dest->getGlobalVariable(SGV->getName(), - SGV->getType()->getElementType()))) { - std::map::iterator EGV = - GlobalsByName.find(SGV->getName()); - if (EGV != GlobalsByName.end()) - DGV = dyn_cast(EGV->second); - if (DGV) - // If types don't agree due to opaque types, try to resolve them. - RecursiveResolveTypes(SGV->getType(), DGV->getType(), TST, ""); - } + if (SGV->hasName() && !SGV->hasInternalLinkage()) { + DGV = Dest->getGlobalVariable(SGV->getName()); + if (DGV && DGV->getType() != SGV->getType()) + // If types don't agree due to opaque types, try to resolve them. + RecursiveResolveTypes(SGV->getType(), DGV->getType(), + &Dest->getTypeSymbolTable(), ""); + } if (DGV && DGV->hasInternalLinkage()) DGV = 0; @@ -476,9 +482,7 @@ SGV->isConstant(), SGV->getLinkage(), /*init*/0, SGV->getName(), Dest); // Propagate alignment, visibility and section info. - NewDGV->setAlignment(SGV->getAlignment()); - NewDGV->setSection(SGV->getSection()); - NewDGV->setVisibility(SGV->getVisibility()); + CopyGVAttributes(NewDGV, SGV); // If the LLVM runtime renamed the global, but it is an externally visible // symbol, DGV must be an existing global with internal linkage. Rename @@ -502,9 +506,8 @@ "", Dest); // Propagate alignment, section and visibility info. - NewDGV->setAlignment(std::max(DGV->getAlignment(), SGV->getAlignment())); - NewDGV->setSection(SGV->getSection()); - NewDGV->setVisibility(SGV->getVisibility()); + NewDGV->setAlignment(DGV->getAlignment()); + CopyGVAttributes(NewDGV, SGV); // Make sure to remember this mapping... ValueMap.insert(std::make_pair(SGV, NewDGV)); @@ -513,9 +516,7 @@ AppendingVars.insert(std::make_pair(SGV->getName(), NewDGV)); } else { // Propagate alignment, section, and visibility info. - DGV->setAlignment(std::max(DGV->getAlignment(), SGV->getAlignment())); - DGV->setSection(SGV->getSection()); - DGV->setVisibility(SGV->getVisibility()); + CopyGVAttributes(DGV, SGV); // Otherwise, perform the mapping as instructed by GetLinkageResult. If // the types don't match, and if we are to link from the source, nuke DGV @@ -524,9 +525,7 @@ GlobalVariable *NewDGV = new GlobalVariable(SGV->getType()->getElementType(), DGV->isConstant(), DGV->getLinkage()); - NewDGV->setAlignment(DGV->getAlignment()); - NewDGV->setSection(DGV->getSection()); - NewDGV->setVisibility(DGV->getVisibility()); + CopyGVAttributes(NewDGV, DGV); Dest->getGlobalList().insert(DGV, NewDGV); DGV->replaceAllUsesWith( ConstantExpr::getBitCast(NewDGV, DGV->getType())); @@ -607,33 +606,64 @@ // static bool LinkFunctionProtos(Module *Dest, const Module *Src, std::map &ValueMap, - std::map &GlobalsByName, std::string *Err) { - TypeSymbolTable *TST = &Dest->getTypeSymbolTable(); - // Loop over all of the functions in the src module, mapping them over for (Module::const_iterator I = Src->begin(), E = Src->end(); I != E; ++I) { const Function *SF = I; // SrcFunction Function *DF = 0; if (SF->hasName() && !SF->hasInternalLinkage()) { // Check to see if may have to link the function. - if (!(DF = Dest->getFunction(SF->getName(), SF->getFunctionType()))) { - std::map::iterator EF = - GlobalsByName.find(SF->getName()); - if (EF != GlobalsByName.end()) - DF = dyn_cast(EF->second); - if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), TST, "")) - DF = 0; // FIXME: gross. + DF = Dest->getFunction(SF->getName()); + if (DF && SF->getType() != DF->getType()) + // If types don't agree because of opaque, try to resolve them + RecursiveResolveTypes(SF->getType(), DF->getType(), + &Dest->getTypeSymbolTable(), ""); + } + + if (DF && DF->getType() != SF->getType()) { + if (DF->isDeclaration() && !SF->isDeclaration()) { + // We have a definition of the same name but different type in the + // source module. Copy the prototype to the destination and replace + // uses of the destination's prototype with the new prototype. + Function *NewDF = new Function(SF->getFunctionType(), SF->getLinkage(), + SF->getName(), Dest); + CopyGVAttributes(NewDF, SF); + + // Any uses of DF need to change to NewDF, with cast + DF->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF, DF->getType())); + + // DF will conflict with NewDF because they both had the same. We must + // erase this now so ForceRenaming doesn't assert because DF might + // not have internal linkage. + DF->eraseFromParent(); + + // If the symbol table renamed the function, but it is an externally + // visible symbol, DF must be an existing function with internal + // linkage. Rename it. + if (NewDF->getName() != SF->getName() && !NewDF->hasInternalLinkage()) + ForceRenaming(NewDF, SF->getName()); + + // Remember this mapping so uses in the source module get remapped + // later by RemapOperand. + ValueMap[SF] = NewDF; + } else if (SF->isDeclaration()) { + // We have two functions of the same name but different type and the + // source is a declaration while the destination is not. Any use of + // the source must be mapped to the destination, with a cast. + ValueMap[SF] = ConstantExpr::getBitCast(DF, SF->getType()); + } else { + // We have two functions of the same name but different types and they + // are both definitions. This is an error. + return Error(Err, "Function '" + DF->getName() + "' defined as both '" + + ToStr(SF->getFunctionType(), Src) + "' and '" + + ToStr(DF->getFunctionType(), Dest) + "'"); } - } - - if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) { + } else if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) { // Function does not already exist, simply insert an function signature // identical to SF into the dest module... Function *NewDF = new Function(SF->getFunctionType(), SF->getLinkage(), SF->getName(), Dest); - NewDF->setCallingConv(SF->getCallingConv()); + CopyGVAttributes(NewDF, SF); // If the LLVM runtime renamed the function, but it is an externally // visible symbol, DF must be an existing function with internal linkage. @@ -644,8 +674,8 @@ // ... and remember this mapping... ValueMap.insert(std::make_pair(SF, NewDF)); } else if (SF->isDeclaration()) { - // If SF is external or if both SF & DF are external.. Just link the - // external functions, we aren't adding anything. + // If SF is a declaration or if both SF & DF are declarations, just link + // the declarations, we aren't adding anything. if (SF->hasDLLImportLinkage()) { if (DF->isDeclaration()) { ValueMap.insert(std::make_pair(SF, DF)); @@ -668,8 +698,6 @@ if ((DF->hasLinkOnceLinkage() && SF->hasWeakLinkage()) || DF->hasExternalWeakLinkage()) DF->setLinkage(SF->getLinkage()); - - } else if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage()) { // At this point we know that SF has LinkOnce or External* linkage. ValueMap.insert(std::make_pair(SF, DF)); @@ -677,10 +705,10 @@ // Don't inherit linkonce & external weak linkage DF->setLinkage(SF->getLinkage()); } else if (SF->getLinkage() != DF->getLinkage()) { - return Error(Err, "Functions named '" + SF->getName() + - "' have different linkage specifiers!"); + return Error(Err, "Functions named '" + SF->getName() + + "' have different linkage specifiers!"); } else if (SF->hasExternalLinkage()) { - // The function is defined in both modules!! + // The function is defined identically in both modules!! return Error(Err, "Function '" + ToStr(SF->getFunctionType(), Src) + "':\"" + SF->getName() + "\" - Function is already defined!"); @@ -695,7 +723,7 @@ // fix up references to values. At this point we know that Dest is an external // function, and that Src is not. static bool LinkFunctionBody(Function *Dest, Function *Src, - std::map &GlobalMap, + std::map &ValueMap, std::string *Err) { assert(Src && Dest && Dest->isDeclaration() && !Src->isDeclaration()); @@ -706,7 +734,7 @@ DI->setName(I->getName()); // Copy the name information over... // Add a mapping to our local map - GlobalMap.insert(std::make_pair(I, DI)); + ValueMap.insert(std::make_pair(I, DI)); } // Splice the body of the source function into the dest function. @@ -722,12 +750,12 @@ for (Instruction::op_iterator OI = I->op_begin(), OE = I->op_end(); OI != OE; ++OI) if (!isa(*OI) && !isa(*OI)) - *OI = RemapOperand(*OI, GlobalMap); + *OI = RemapOperand(*OI, ValueMap); // There is no need to map the arguments anymore. for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); I != E; ++I) - GlobalMap.erase(I); + ValueMap.erase(I); return false; } @@ -747,11 +775,10 @@ Function *DF = cast(ValueMap[SF]); // Destination function // DF not external SF external? - if (DF->isDeclaration()) { + if (DF->isDeclaration()) // Only provide the function body if there isn't one already. if (LinkFunctionBody(DF, SF, ValueMap, Err)) return true; - } } } return false; @@ -919,32 +946,17 @@ // with appending linkage. After the module is linked together, they are // appended and the module is rewritten. std::multimap AppendingVars; - - // GlobalsByName - The LLVM SymbolTable class fights our best efforts at - // linking by separating globals by type. Until PR411 is fixed, we replicate - // it's functionality here. - std::map GlobalsByName; - for (Module::global_iterator I = Dest->global_begin(), E = Dest->global_end(); I != E; ++I) { // Add all of the appending globals already in the Dest module to // AppendingVars. if (I->hasAppendingLinkage()) AppendingVars.insert(std::make_pair(I->getName(), I)); - - // Keep track of all globals by name. - if (!I->hasInternalLinkage() && I->hasName()) - GlobalsByName[I->getName()] = I; } - // Keep track of all globals by name. - for (Module::iterator I = Dest->begin(), E = Dest->end(); I != E; ++I) - if (!I->hasInternalLinkage() && I->hasName()) - GlobalsByName[I->getName()] = I; - // Insert all of the globals in src into the Dest module... without linking // initializers (which could refer to functions not yet mapped over). - if (LinkGlobals(Dest, Src, ValueMap, AppendingVars, GlobalsByName, ErrorMsg)) + if (LinkGlobals(Dest, Src, ValueMap, AppendingVars, ErrorMsg)) return true; // Link the functions together between the two modules, without doing function @@ -952,7 +964,7 @@ // function... We do this so that when we begin processing function bodies, // all of the global values that may be referenced are available in our // ValueMap. - if (LinkFunctionProtos(Dest, Src, ValueMap, GlobalsByName, ErrorMsg)) + if (LinkFunctionProtos(Dest, Src, ValueMap, ErrorMsg)) return true; // Update the initializers in the Dest module now that all globals that may From reid at x10sys.com Mon Feb 5 14:48:37 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/Lexer.cpp.cvs llvmAsmParser.cpp.cvs llvmAsmParser.h.cvs llvmAsmParser.y llvmAsmParser.y.cvs Message-ID: <200702052048.l15KmbYp001355@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: Lexer.cpp.cvs updated: 1.30 -> 1.31 llvmAsmParser.cpp.cvs updated: 1.64 -> 1.65 llvmAsmParser.h.cvs updated: 1.50 -> 1.51 llvmAsmParser.y updated: 1.319 -> 1.320 llvmAsmParser.y.cvs updated: 1.65 -> 1.66 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+609 -553) Lexer.cpp.cvs | 280 ++++++++++----------- llvmAsmParser.cpp.cvs | 650 +++++++++++++++++++++++++------------------------- llvmAsmParser.h.cvs | 2 llvmAsmParser.y | 115 +++++--- llvmAsmParser.y.cvs | 115 +++++--- 5 files changed, 609 insertions(+), 553 deletions(-) Index: llvm/lib/AsmParser/Lexer.cpp.cvs diff -u llvm/lib/AsmParser/Lexer.cpp.cvs:1.30 llvm/lib/AsmParser/Lexer.cpp.cvs:1.31 --- llvm/lib/AsmParser/Lexer.cpp.cvs:1.30 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/Lexer.cpp.cvs Mon Feb 5 14:47:19 2007 @@ -20,7 +20,7 @@ /* A lexical scanner generated by flex*/ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/lib/AsmParser/Lexer.cpp.cvs,v 1.30 2007/02/02 02:16:22 reid Exp $ + * $Header: /var/cvs/llvm/llvm/lib/AsmParser/Lexer.cpp.cvs,v 1.31 2007/02/05 20:47:19 reid Exp $ */ #define FLEX_SCANNER @@ -869,7 +869,7 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 1 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" #define INITIAL 0 /*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// // @@ -884,7 +884,7 @@ // //===----------------------------------------------------------------------===*/ #define YY_NEVER_INTERACTIVE 1 -#line 28 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 28 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" #include "ParserInternals.h" #include "llvm/Module.h" #include @@ -1168,7 +1168,7 @@ register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; -#line 189 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 189 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" #line 1175 "Lexer.cpp" @@ -1264,252 +1264,252 @@ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 191 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 191 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Ignore comments for now */ } YY_BREAK case 2: YY_RULE_SETUP -#line 193 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 193 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return BEGINTOK; } YY_BREAK case 3: YY_RULE_SETUP -#line 194 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 194 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ENDTOK; } YY_BREAK case 4: YY_RULE_SETUP -#line 195 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 195 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TRUETOK; } YY_BREAK case 5: YY_RULE_SETUP -#line 196 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 196 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return FALSETOK; } YY_BREAK case 6: YY_RULE_SETUP -#line 197 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 197 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DECLARE; } YY_BREAK case 7: YY_RULE_SETUP -#line 198 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 198 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DEFINE; } YY_BREAK case 8: YY_RULE_SETUP -#line 199 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 199 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return GLOBAL; } YY_BREAK case 9: YY_RULE_SETUP -#line 200 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 200 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CONSTANT; } YY_BREAK case 10: YY_RULE_SETUP -#line 201 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 201 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return INTERNAL; } YY_BREAK case 11: YY_RULE_SETUP -#line 202 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 202 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return LINKONCE; } YY_BREAK case 12: YY_RULE_SETUP -#line 203 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 203 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return WEAK; } YY_BREAK case 13: YY_RULE_SETUP -#line 204 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 204 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return APPENDING; } YY_BREAK case 14: YY_RULE_SETUP -#line 205 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 205 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DLLIMPORT; } YY_BREAK case 15: YY_RULE_SETUP -#line 206 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 206 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DLLEXPORT; } YY_BREAK case 16: YY_RULE_SETUP -#line 207 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 207 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return HIDDEN; } YY_BREAK case 17: YY_RULE_SETUP -#line 208 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 208 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EXTERN_WEAK; } YY_BREAK case 18: YY_RULE_SETUP -#line 209 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 209 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EXTERNAL; } YY_BREAK case 19: YY_RULE_SETUP -#line 210 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 210 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return IMPLEMENTATION; } YY_BREAK case 20: YY_RULE_SETUP -#line 211 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 211 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ZEROINITIALIZER; } YY_BREAK case 21: YY_RULE_SETUP -#line 212 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 212 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DOTDOTDOT; } YY_BREAK case 22: YY_RULE_SETUP -#line 213 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 213 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNDEF; } YY_BREAK case 23: YY_RULE_SETUP -#line 214 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 214 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return NULL_TOK; } YY_BREAK case 24: YY_RULE_SETUP -#line 215 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 215 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TO; } YY_BREAK case 25: YY_RULE_SETUP -#line 216 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 216 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TAIL; } YY_BREAK case 26: YY_RULE_SETUP -#line 217 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 217 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TARGET; } YY_BREAK case 27: YY_RULE_SETUP -#line 218 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 218 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TRIPLE; } YY_BREAK case 28: YY_RULE_SETUP -#line 219 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 219 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DEPLIBS; } YY_BREAK case 29: YY_RULE_SETUP -#line 220 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 220 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DATALAYOUT; } YY_BREAK case 30: YY_RULE_SETUP -#line 221 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 221 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return VOLATILE; } YY_BREAK case 31: YY_RULE_SETUP -#line 222 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 222 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ALIGN; } YY_BREAK case 32: YY_RULE_SETUP -#line 223 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 223 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SECTION; } YY_BREAK case 33: YY_RULE_SETUP -#line 224 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 224 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return MODULE; } YY_BREAK case 34: YY_RULE_SETUP -#line 225 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 225 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ASM_TOK; } YY_BREAK case 35: YY_RULE_SETUP -#line 226 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 226 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SIDEEFFECT; } YY_BREAK case 36: YY_RULE_SETUP -#line 228 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 228 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CC_TOK; } YY_BREAK case 37: YY_RULE_SETUP -#line 229 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 229 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CCC_TOK; } YY_BREAK case 38: YY_RULE_SETUP -#line 230 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 230 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return FASTCC_TOK; } YY_BREAK case 39: YY_RULE_SETUP -#line 231 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 231 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return COLDCC_TOK; } YY_BREAK case 40: YY_RULE_SETUP -#line 232 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 232 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return X86_STDCALLCC_TOK; } YY_BREAK case 41: YY_RULE_SETUP -#line 233 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 233 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return X86_FASTCALLCC_TOK; } YY_BREAK case 42: YY_RULE_SETUP -#line 235 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 235 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return INREG; } YY_BREAK case 43: YY_RULE_SETUP -#line 236 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 236 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SRET; } YY_BREAK case 44: YY_RULE_SETUP -#line 238 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 238 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::VoidTy, VOID); } YY_BREAK case 45: YY_RULE_SETUP -#line 239 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 239 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::FloatTy, FLOAT); } YY_BREAK case 46: YY_RULE_SETUP -#line 240 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 240 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::DoubleTy,DOUBLE);} YY_BREAK case 47: YY_RULE_SETUP -#line 241 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 241 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::LabelTy, LABEL); } YY_BREAK case 48: YY_RULE_SETUP -#line 242 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 242 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TYPE; } YY_BREAK case 49: YY_RULE_SETUP -#line 243 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 243 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OPAQUE; } YY_BREAK case 50: YY_RULE_SETUP -#line 244 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 244 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t NumBits = atoull(yytext+1); if (NumBits < IntegerType::MIN_INT_BITS || NumBits > IntegerType::MAX_INT_BITS) @@ -1520,347 +1520,347 @@ YY_BREAK case 51: YY_RULE_SETUP -#line 252 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 252 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Add, ADD); } YY_BREAK case 52: YY_RULE_SETUP -#line 253 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 253 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Sub, SUB); } YY_BREAK case 53: YY_RULE_SETUP -#line 254 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 254 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Mul, MUL); } YY_BREAK case 54: YY_RULE_SETUP -#line 255 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 255 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, UDiv, UDIV); } YY_BREAK case 55: YY_RULE_SETUP -#line 256 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 256 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SDiv, SDIV); } YY_BREAK case 56: YY_RULE_SETUP -#line 257 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 257 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FDiv, FDIV); } YY_BREAK case 57: YY_RULE_SETUP -#line 258 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 258 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, URem, UREM); } YY_BREAK case 58: YY_RULE_SETUP -#line 259 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 259 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SRem, SREM); } YY_BREAK case 59: YY_RULE_SETUP -#line 260 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 260 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FRem, FREM); } YY_BREAK case 60: YY_RULE_SETUP -#line 261 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 261 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Shl, SHL); } YY_BREAK case 61: YY_RULE_SETUP -#line 262 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 262 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, LShr, LSHR); } YY_BREAK case 62: YY_RULE_SETUP -#line 263 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 263 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, AShr, ASHR); } YY_BREAK case 63: YY_RULE_SETUP -#line 264 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 264 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, And, AND); } YY_BREAK case 64: YY_RULE_SETUP -#line 265 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 265 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Or , OR ); } YY_BREAK case 65: YY_RULE_SETUP -#line 266 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 266 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Xor, XOR); } YY_BREAK case 66: YY_RULE_SETUP -#line 267 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 267 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ICmp, ICMP); } YY_BREAK case 67: YY_RULE_SETUP -#line 268 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 268 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, FCmp, FCMP); } YY_BREAK case 68: YY_RULE_SETUP -#line 270 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 270 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EQ; } YY_BREAK case 69: YY_RULE_SETUP -#line 271 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 271 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return NE; } YY_BREAK case 70: YY_RULE_SETUP -#line 272 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 272 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SLT; } YY_BREAK case 71: YY_RULE_SETUP -#line 273 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 273 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SGT; } YY_BREAK case 72: YY_RULE_SETUP -#line 274 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 274 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SLE; } YY_BREAK case 73: YY_RULE_SETUP -#line 275 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 275 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SGE; } YY_BREAK case 74: YY_RULE_SETUP -#line 276 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 276 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ULT; } YY_BREAK case 75: YY_RULE_SETUP -#line 277 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 277 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UGT; } YY_BREAK case 76: YY_RULE_SETUP -#line 278 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 278 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ULE; } YY_BREAK case 77: YY_RULE_SETUP -#line 279 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 279 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UGE; } YY_BREAK case 78: YY_RULE_SETUP -#line 280 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 280 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OEQ; } YY_BREAK case 79: YY_RULE_SETUP -#line 281 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 281 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ONE; } YY_BREAK case 80: YY_RULE_SETUP -#line 282 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 282 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OLT; } YY_BREAK case 81: YY_RULE_SETUP -#line 283 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 283 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OGT; } YY_BREAK case 82: YY_RULE_SETUP -#line 284 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 284 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OLE; } YY_BREAK case 83: YY_RULE_SETUP -#line 285 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 285 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OGE; } YY_BREAK case 84: YY_RULE_SETUP -#line 286 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 286 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ORD; } YY_BREAK case 85: YY_RULE_SETUP -#line 287 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 287 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNO; } YY_BREAK case 86: YY_RULE_SETUP -#line 288 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 288 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UEQ; } YY_BREAK case 87: YY_RULE_SETUP -#line 289 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 289 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNE; } YY_BREAK case 88: YY_RULE_SETUP -#line 291 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 291 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, PHI, PHI_TOK); } YY_BREAK case 89: YY_RULE_SETUP -#line 292 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 292 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Call, CALL); } YY_BREAK case 90: YY_RULE_SETUP -#line 293 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 293 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, Trunc, TRUNC); } YY_BREAK case 91: YY_RULE_SETUP -#line 294 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 294 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, ZExt, ZEXT); } YY_BREAK case 92: YY_RULE_SETUP -#line 295 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 295 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SExt, SEXT); } YY_BREAK case 93: YY_RULE_SETUP -#line 296 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 296 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPTrunc, FPTRUNC); } YY_BREAK case 94: YY_RULE_SETUP -#line 297 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 297 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPExt, FPEXT); } YY_BREAK case 95: YY_RULE_SETUP -#line 298 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 298 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, UIToFP, UITOFP); } YY_BREAK case 96: YY_RULE_SETUP -#line 299 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 299 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SIToFP, SITOFP); } YY_BREAK case 97: YY_RULE_SETUP -#line 300 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 300 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToUI, FPTOUI); } YY_BREAK case 98: YY_RULE_SETUP -#line 301 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 301 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToSI, FPTOSI); } YY_BREAK case 99: YY_RULE_SETUP -#line 302 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 302 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, IntToPtr, INTTOPTR); } YY_BREAK case 100: YY_RULE_SETUP -#line 303 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 303 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, PtrToInt, PTRTOINT); } YY_BREAK case 101: YY_RULE_SETUP -#line 304 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 304 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, BitCast, BITCAST); } YY_BREAK case 102: YY_RULE_SETUP -#line 305 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 305 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Select, SELECT); } YY_BREAK case 103: YY_RULE_SETUP -#line 306 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 306 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, VAArg , VAARG); } YY_BREAK case 104: YY_RULE_SETUP -#line 307 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 307 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Ret, RET); } YY_BREAK case 105: YY_RULE_SETUP -#line 308 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 308 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Br, BR); } YY_BREAK case 106: YY_RULE_SETUP -#line 309 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 309 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Switch, SWITCH); } YY_BREAK case 107: YY_RULE_SETUP -#line 310 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 310 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Invoke, INVOKE); } YY_BREAK case 108: YY_RULE_SETUP -#line 311 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 311 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unwind, UNWIND); } YY_BREAK case 109: YY_RULE_SETUP -#line 312 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 312 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unreachable, UNREACHABLE); } YY_BREAK case 110: YY_RULE_SETUP -#line 314 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 314 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Malloc, MALLOC); } YY_BREAK case 111: YY_RULE_SETUP -#line 315 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 315 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Alloca, ALLOCA); } YY_BREAK case 112: YY_RULE_SETUP -#line 316 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 316 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Free, FREE); } YY_BREAK case 113: YY_RULE_SETUP -#line 317 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 317 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Load, LOAD); } YY_BREAK case 114: YY_RULE_SETUP -#line 318 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 318 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Store, STORE); } YY_BREAK case 115: YY_RULE_SETUP -#line 319 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 319 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, GetElementPtr, GETELEMENTPTR); } YY_BREAK case 116: YY_RULE_SETUP -#line 321 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 321 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ExtractElement, EXTRACTELEMENT); } YY_BREAK case 117: YY_RULE_SETUP -#line 322 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 322 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, InsertElement, INSERTELEMENT); } YY_BREAK case 118: YY_RULE_SETUP -#line 323 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 323 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ShuffleVector, SHUFFLEVECTOR); } YY_BREAK case 119: YY_RULE_SETUP -#line 326 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 326 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { UnEscapeLexed(yytext+1); llvmAsmlval.StrVal = strdup(yytext+1); // Skip % @@ -1869,7 +1869,7 @@ YY_BREAK case 120: YY_RULE_SETUP -#line 331 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 331 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { UnEscapeLexed(yytext+1); llvmAsmlval.StrVal = strdup(yytext+1); // Skip @ @@ -1878,7 +1878,7 @@ YY_BREAK case 121: YY_RULE_SETUP -#line 336 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 336 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-1] = 0; // nuke colon UnEscapeLexed(yytext); @@ -1888,7 +1888,7 @@ YY_BREAK case 122: YY_RULE_SETUP -#line 342 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 342 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-2] = 0; // nuke colon, end quote UnEscapeLexed(yytext+1); @@ -1898,7 +1898,7 @@ YY_BREAK case 123: YY_RULE_SETUP -#line 349 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 349 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { // Note that we cannot unescape a string constant here! The // string constant might contain a \00 which would not be // understood by the string stuff. It is valid to make a @@ -1911,7 +1911,7 @@ YY_BREAK case 124: YY_RULE_SETUP -#line 358 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 358 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-1] = 0; // nuke end quote llvmAsmlval.StrVal = strdup(yytext+2); // Nuke @, quote @@ -1920,12 +1920,12 @@ YY_BREAK case 125: YY_RULE_SETUP -#line 366 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 366 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } YY_BREAK case 126: YY_RULE_SETUP -#line 367 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 367 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); // +1: we have bigger negative range @@ -1937,7 +1937,7 @@ YY_BREAK case 127: YY_RULE_SETUP -#line 375 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 375 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; @@ -1945,7 +1945,7 @@ YY_BREAK case 128: YY_RULE_SETUP -#line 380 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 380 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -1956,7 +1956,7 @@ YY_BREAK case 129: YY_RULE_SETUP -#line 387 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 387 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -1967,16 +1967,16 @@ YY_BREAK case 130: YY_RULE_SETUP -#line 395 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 395 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = atof(yytext); return FPVAL; } YY_BREAK case 131: YY_RULE_SETUP -#line 396 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 396 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = HexToFP(yytext); return FPVAL; } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 398 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 398 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Make sure to free the internal buffers for flex when we are * done reading our input! @@ -1987,17 +1987,17 @@ YY_BREAK case 132: YY_RULE_SETUP -#line 406 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 406 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Ignore whitespace */ } YY_BREAK case 133: YY_RULE_SETUP -#line 407 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 407 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return yytext[0]; } YY_BREAK case 134: YY_RULE_SETUP -#line 409 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 409 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK #line 2004 "Lexer.cpp" @@ -2878,5 +2878,5 @@ return 0; } #endif -#line 409 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 409 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.64 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.65 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.64 Mon Feb 5 11:04:00 2007 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Mon Feb 5 14:47:19 2007 @@ -330,14 +330,14 @@ /* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 14 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/CommandLine.h" #include "llvm/ADT/SmallVector.h" @@ -529,7 +529,7 @@ std::map Values; // Keep track of #'d definitions std::map LateResolveValues; - bool isDeclare; // Is this function a forward declararation? + bool isDeclare; // Is this function a forward declararation? GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration. GlobalValue::VisibilityTypes Visibility; @@ -661,24 +661,33 @@ // Module constants occupy the lowest numbered slots... std::map::iterator VI = CurModule.Values.find(Ty); - if (VI == CurModule.Values.end()) return 0; - if (D.Num >= VI->second.size()) return 0; + if (VI == CurModule.Values.end()) + return 0; + if (D.Num >= VI->second.size()) + return 0; return VI->second[Num]; } case ValID::LocalName: { // Is it a named definition? - if (!inFunctionScope()) return 0; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + if (!inFunctionScope()) + return 0; + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; } case ValID::GlobalName: { // Is it a named definition? - SymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; @@ -819,8 +828,8 @@ break; case ValID::LocalName: // Is it a named definition? Name = ID.Name; - if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) + Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name); + if (N && N->getType()->getTypeID() == Type::LabelTyID) BB = cast(N); break; } @@ -960,8 +969,8 @@ } assert(inFunctionScope() && "Must be in function scope!"); - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - if (ST.lookup(V->getType(), Name)) { + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + if (ST.lookup(Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + V->getType()->getDescription() + "'"); return; @@ -1015,16 +1024,21 @@ return GV; } - // If this global has a name, check to see if there is already a definition - // of this global in the module. If so, it is an error. + // If this global has a name if (!Name.empty()) { - // We are a simple redefinition of a value, check to see if it is defined - // the same as the old one. - if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { - GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'"); - return 0; - } + // if the global we're parsing has an initializer (is a definition) and + // has external linkage. + if (Initializer && Linkage != GlobalValue::InternalLinkage) + // If there is already a global with external linkage with this name + if (CurModule.CurrentModule->getGlobalVariable(Name, false)) { + // If we allow this GVar to get created, it will be renamed in the + // symbol table because it conflicts with an existing GVar. We can't + // allow redefinition of GVars whose linking indicates that their name + // must stay the same. Issue the error. + GenerateError("Redefinition of global variable named '" + Name + + "' of type '" + Ty->getDescription() + "'"); + return 0; + } } // Otherwise there is no existing GV to use, create one now. @@ -1222,7 +1236,7 @@ #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 886 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 900 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; @@ -1269,7 +1283,7 @@ llvm::FCmpInst::Predicate FPredicate; } YYSTYPE; /* Line 196 of yacc.c. */ -#line 1273 "llvmAsmParser.tab.c" +#line 1287 "llvmAsmParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -1281,7 +1295,7 @@ /* Line 219 of yacc.c. */ -#line 1285 "llvmAsmParser.tab.c" +#line 1299 "llvmAsmParser.tab.c" #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ @@ -1629,35 +1643,35 @@ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, - 1033, 1034, 1034, 1034, 1034, 1034, 1034, 1035, 1035, 1035, - 1035, 1035, 1035, 1036, 1036, 1036, 1036, 1036, 1036, 1039, - 1039, 1040, 1040, 1041, 1041, 1042, 1042, 1043, 1043, 1047, - 1047, 1048, 1048, 1049, 1049, 1050, 1050, 1051, 1051, 1052, - 1052, 1053, 1053, 1054, 1055, 1060, 1061, 1061, 1063, 1063, - 1064, 1064, 1068, 1072, 1077, 1077, 1079, 1083, 1089, 1090, - 1091, 1092, 1093, 1097, 1098, 1099, 1103, 1104, 1108, 1109, - 1110, 1114, 1115, 1116, 1117, 1118, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1134, 1135, 1136, 1137, 1140, 1141, 1146, - 1147, 1150, 1151, 1158, 1159, 1165, 1166, 1174, 1182, 1183, - 1188, 1189, 1190, 1195, 1208, 1208, 1208, 1208, 1211, 1215, - 1219, 1226, 1231, 1239, 1257, 1275, 1280, 1292, 1302, 1306, - 1316, 1323, 1330, 1337, 1342, 1347, 1354, 1355, 1362, 1369, - 1377, 1382, 1393, 1421, 1437, 1466, 1494, 1519, 1538, 1563, - 1582, 1594, 1601, 1667, 1677, 1687, 1693, 1699, 1704, 1709, - 1717, 1729, 1750, 1758, 1764, 1775, 1780, 1785, 1791, 1797, - 1806, 1810, 1818, 1818, 1829, 1834, 1842, 1843, 1847, 1847, - 1851, 1851, 1854, 1857, 1869, 1893, 1904, 1904, 1914, 1914, - 1922, 1922, 1932, 1935, 1941, 1954, 1958, 1963, 1965, 1970, - 1975, 1984, 1994, 2005, 2009, 2018, 2027, 2032, 2138, 2138, - 2140, 2149, 2149, 2151, 2156, 2168, 2172, 2177, 2181, 2185, - 2189, 2193, 2197, 2201, 2205, 2209, 2234, 2238, 2252, 2256, - 2260, 2264, 2270, 2270, 2276, 2285, 2289, 2298, 2309, 2318, - 2330, 2343, 2347, 2351, 2356, 2366, 2385, 2394, 2461, 2465, - 2472, 2483, 2496, 2505, 2516, 2526, 2534, 2542, 2545, 2546, - 2553, 2557, 2562, 2583, 2600, 2613, 2626, 2638, 2646, 2653, - 2659, 2665, 2671, 2686, 2750, 2755, 2759, 2766, 2773, 2781, - 2788, 2796, 2804, 2818, 2835 + 0, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, + 1047, 1048, 1048, 1048, 1048, 1048, 1048, 1049, 1049, 1049, + 1049, 1049, 1049, 1050, 1050, 1050, 1050, 1050, 1050, 1053, + 1053, 1054, 1054, 1055, 1055, 1056, 1056, 1057, 1057, 1061, + 1061, 1062, 1062, 1063, 1063, 1064, 1064, 1065, 1065, 1066, + 1066, 1067, 1067, 1068, 1069, 1074, 1075, 1075, 1077, 1077, + 1078, 1078, 1082, 1086, 1091, 1091, 1093, 1097, 1103, 1104, + 1105, 1106, 1107, 1111, 1112, 1113, 1117, 1118, 1122, 1123, + 1124, 1128, 1129, 1130, 1131, 1132, 1135, 1136, 1137, 1138, + 1139, 1140, 1141, 1148, 1149, 1150, 1151, 1154, 1155, 1160, + 1161, 1164, 1165, 1172, 1173, 1179, 1180, 1188, 1196, 1197, + 1202, 1203, 1204, 1209, 1222, 1222, 1222, 1222, 1225, 1229, + 1233, 1240, 1245, 1253, 1271, 1289, 1294, 1306, 1316, 1320, + 1330, 1337, 1344, 1351, 1356, 1361, 1368, 1369, 1376, 1383, + 1391, 1396, 1407, 1435, 1451, 1480, 1508, 1533, 1552, 1577, + 1596, 1608, 1615, 1681, 1691, 1701, 1707, 1713, 1718, 1723, + 1731, 1743, 1764, 1772, 1778, 1789, 1794, 1799, 1805, 1811, + 1820, 1824, 1832, 1832, 1843, 1848, 1856, 1857, 1861, 1861, + 1865, 1865, 1868, 1871, 1883, 1907, 1918, 1918, 1928, 1928, + 1936, 1936, 1946, 1949, 1955, 1968, 1972, 1977, 1979, 1984, + 1989, 1998, 2008, 2019, 2023, 2032, 2041, 2046, 2158, 2158, + 2160, 2169, 2169, 2171, 2176, 2188, 2192, 2197, 2201, 2205, + 2209, 2213, 2217, 2221, 2225, 2229, 2254, 2258, 2272, 2276, + 2280, 2284, 2290, 2290, 2296, 2305, 2309, 2318, 2328, 2337, + 2349, 2362, 2366, 2370, 2375, 2385, 2404, 2413, 2480, 2484, + 2491, 2502, 2515, 2525, 2536, 2546, 2554, 2562, 2565, 2566, + 2573, 2577, 2582, 2603, 2620, 2633, 2646, 2658, 2666, 2673, + 2679, 2685, 2691, 2706, 2770, 2775, 2779, 2786, 2793, 2801, + 2808, 2816, 2824, 2838, 2855 }; #endif @@ -2981,142 +2995,142 @@ switch (yyn) { case 29: -#line 1039 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1053 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;} break; case 30: -#line 1039 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1053 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;} break; case 31: -#line 1040 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1054 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;} break; case 32: -#line 1040 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1054 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;} break; case 33: -#line 1041 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1055 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;} break; case 34: -#line 1041 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1055 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;} break; case 35: -#line 1042 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1056 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;} break; case 36: -#line 1042 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1056 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;} break; case 37: -#line 1043 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1057 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;} break; case 38: -#line 1043 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1057 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;} break; case 39: -#line 1047 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1061 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;} break; case 40: -#line 1047 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1061 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;} break; case 41: -#line 1048 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1062 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;} break; case 42: -#line 1048 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1062 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;} break; case 43: -#line 1049 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1063 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;} break; case 44: -#line 1049 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1063 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;} break; case 45: -#line 1050 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1064 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;} break; case 46: -#line 1050 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1064 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;} break; case 47: -#line 1051 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1065 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;} break; case 48: -#line 1051 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1065 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;} break; case 49: -#line 1052 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1066 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;} break; case 50: -#line 1052 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1066 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;} break; case 51: -#line 1053 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1067 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;} break; case 52: -#line 1053 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1067 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;} break; case 53: -#line 1054 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1068 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;} break; case 54: -#line 1055 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1069 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;} break; case 61: -#line 1064 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1078 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = 0; ;} break; case 62: -#line 1068 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1082 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = (yyvsp[-1].StrVal); CHECK_FOR_ERROR @@ -3124,7 +3138,7 @@ break; case 63: -#line 1072 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1086 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = 0; CHECK_FOR_ERROR @@ -3132,7 +3146,7 @@ break; case 66: -#line 1079 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1093 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = (yyvsp[-1].StrVal); CHECK_FOR_ERROR @@ -3140,7 +3154,7 @@ break; case 67: -#line 1083 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1097 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = 0; CHECK_FOR_ERROR @@ -3148,127 +3162,127 @@ break; case 68: -#line 1089 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1103 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} break; case 69: -#line 1090 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1104 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} break; case 70: -#line 1091 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1105 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} break; case 71: -#line 1092 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1106 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} break; case 72: -#line 1093 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1107 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} break; case 73: -#line 1097 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1111 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} break; case 74: -#line 1098 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1112 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} break; case 75: -#line 1099 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1113 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} break; case 76: -#line 1103 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1117 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Visibility) = GlobalValue::DefaultVisibility; ;} break; case 77: -#line 1104 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1118 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Visibility) = GlobalValue::HiddenVisibility; ;} break; case 78: -#line 1108 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1122 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} break; case 79: -#line 1109 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1123 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} break; case 80: -#line 1110 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1124 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} break; case 81: -#line 1114 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1128 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} break; case 82: -#line 1115 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1129 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} break; case 83: -#line 1116 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1130 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} break; case 84: -#line 1117 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1131 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} break; case 85: -#line 1118 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1132 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} break; case 86: -#line 1121 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1135 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::C; ;} break; case 87: -#line 1122 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1136 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::C; ;} break; case 88: -#line 1123 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1137 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::Fast; ;} break; case 89: -#line 1124 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1138 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::Cold; ;} break; case 90: -#line 1125 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1139 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::X86_StdCall; ;} break; case 91: -#line 1126 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1140 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = CallingConv::X86_FastCall; ;} break; case 92: -#line 1127 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1141 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) GEN_ERROR("Calling conv too large"); @@ -3278,61 +3292,61 @@ break; case 93: -#line 1134 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1148 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::ZExtAttribute; ;} break; case 94: -#line 1135 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1149 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::SExtAttribute; ;} break; case 95: -#line 1136 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1150 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::InRegAttribute; ;} break; case 96: -#line 1137 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1151 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::StructRetAttribute; ;} break; case 97: -#line 1140 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1154 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::NoAttributeSet; ;} break; case 98: -#line 1141 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1155 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::ParameterAttributes((yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs)); ;} break; case 99: -#line 1146 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1160 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::NoReturnAttribute; ;} break; case 101: -#line 1150 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1164 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::NoAttributeSet; ;} break; case 102: -#line 1151 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1165 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ParamAttrs) = FunctionType::ParameterAttributes((yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs)); ;} break; case 103: -#line 1158 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1172 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = 0; ;} break; case 104: -#line 1159 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1173 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) @@ -3342,12 +3356,12 @@ break; case 105: -#line 1165 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1179 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = 0; ;} break; case 106: -#line 1166 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1180 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) @@ -3357,7 +3371,7 @@ break; case 107: -#line 1174 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1188 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') @@ -3368,27 +3382,27 @@ break; case 108: -#line 1182 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1196 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = 0; ;} break; case 109: -#line 1183 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1197 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.StrVal) = (yyvsp[0].StrVal); ;} break; case 110: -#line 1188 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1202 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" {;} break; case 111: -#line 1189 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1203 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" {;} break; case 112: -#line 1190 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1204 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV->setSection((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -3397,7 +3411,7 @@ break; case 113: -#line 1195 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1209 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) GEN_ERROR("Alignment must be a power of two"); @@ -3407,7 +3421,7 @@ break; case 118: -#line 1211 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1225 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeVal) = new PATypeHolder(OpaqueType::get()); CHECK_FOR_ERROR @@ -3415,7 +3429,7 @@ break; case 119: -#line 1215 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1229 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); CHECK_FOR_ERROR @@ -3423,7 +3437,7 @@ break; case 120: -#line 1219 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1233 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Pointer type? if (*(yyvsp[-1].TypeVal) == Type::LabelTy) GEN_ERROR("Cannot form a pointer to a basic block"); @@ -3434,7 +3448,7 @@ break; case 121: -#line 1226 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1240 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Named types are also simple types... const Type* tmp = getTypeVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR @@ -3443,7 +3457,7 @@ break; case 122: -#line 1231 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1245 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Type UpReference if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder @@ -3455,7 +3469,7 @@ break; case 123: -#line 1239 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1253 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { std::vector Params; std::vector Attrs; @@ -3477,7 +3491,7 @@ break; case 124: -#line 1257 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1271 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { std::vector Params; std::vector Attrs; @@ -3498,7 +3512,7 @@ break; case 125: -#line 1275 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1289 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Sized array type? (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); delete (yyvsp[-1].TypeVal); @@ -3507,7 +3521,7 @@ break; case 126: -#line 1280 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1294 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Packed array type? const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get(); if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) @@ -3523,7 +3537,7 @@ break; case 127: -#line 1292 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1306 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Structure type? std::vector Elements; for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), @@ -3537,7 +3551,7 @@ break; case 128: -#line 1302 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1316 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Empty structure type? (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector())); CHECK_FOR_ERROR @@ -3545,7 +3559,7 @@ break; case 129: -#line 1306 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1320 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { std::vector Elements; for (std::list::iterator I = (yyvsp[-2].TypeList)->begin(), @@ -3559,7 +3573,7 @@ break; case 130: -#line 1316 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1330 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Empty structure type? (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector(), true)); CHECK_FOR_ERROR @@ -3567,7 +3581,7 @@ break; case 131: -#line 1323 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1337 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeWithAttrs).Ty = (yyvsp[-1].TypeVal); (yyval.TypeWithAttrs).Attrs = (yyvsp[0].ParamAttrs); @@ -3575,7 +3589,7 @@ break; case 132: -#line 1330 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1344 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); @@ -3586,14 +3600,14 @@ break; case 133: -#line 1337 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1351 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeVal) = new PATypeHolder(Type::VoidTy); ;} break; case 134: -#line 1342 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1356 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeWithAttrsList) = new TypeWithAttrsList(); (yyval.TypeWithAttrsList)->push_back((yyvsp[0].TypeWithAttrs)); @@ -3602,7 +3616,7 @@ break; case 135: -#line 1347 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1361 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { ((yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList))->push_back((yyvsp[0].TypeWithAttrs)); CHECK_FOR_ERROR @@ -3610,7 +3624,7 @@ break; case 137: -#line 1355 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1369 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList); TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet; @@ -3621,7 +3635,7 @@ break; case 138: -#line 1362 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1376 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeWithAttrsList) = new TypeWithAttrsList; TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet; @@ -3632,7 +3646,7 @@ break; case 139: -#line 1369 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1383 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeWithAttrsList) = new TypeWithAttrsList(); CHECK_FOR_ERROR @@ -3640,7 +3654,7 @@ break; case 140: -#line 1377 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1391 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeList) = new std::list(); (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); @@ -3649,7 +3663,7 @@ break; case 141: -#line 1382 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1396 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR @@ -3657,7 +3671,7 @@ break; case 142: -#line 1393 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1407 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -3689,7 +3703,7 @@ break; case 143: -#line 1421 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1435 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -3709,7 +3723,7 @@ break; case 144: -#line 1437 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1451 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -3742,7 +3756,7 @@ break; case 145: -#line 1466 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1480 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -3774,7 +3788,7 @@ break; case 146: -#line 1494 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1508 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (STy == 0) @@ -3803,7 +3817,7 @@ break; case 147: -#line 1519 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1533 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -3826,7 +3840,7 @@ break; case 148: -#line 1538 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1552 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const StructType *STy = dyn_cast((yyvsp[-5].TypeVal)->get()); if (STy == 0) @@ -3855,7 +3869,7 @@ break; case 149: -#line 1563 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1577 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); @@ -3878,7 +3892,7 @@ break; case 150: -#line 1582 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1596 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -3894,7 +3908,7 @@ break; case 151: -#line 1594 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1608 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -3905,7 +3919,7 @@ break; case 152: -#line 1601 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1615 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -3975,7 +3989,7 @@ break; case 153: -#line 1667 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1681 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -3989,7 +4003,7 @@ break; case 154: -#line 1677 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1691 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -4003,7 +4017,7 @@ break; case 155: -#line 1687 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1701 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) GEN_ERROR("Constant value doesn't fit in type"); @@ -4013,7 +4027,7 @@ break; case 156: -#line 1693 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1707 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) GEN_ERROR("Constant value doesn't fit in type"); @@ -4023,7 +4037,7 @@ break; case 157: -#line 1699 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1713 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Boolean constants assert(cast((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?"); (yyval.ConstVal) = ConstantInt::getTrue(); @@ -4032,7 +4046,7 @@ break; case 158: -#line 1704 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1718 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Boolean constants assert(cast((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?"); (yyval.ConstVal) = ConstantInt::getFalse(); @@ -4041,7 +4055,7 @@ break; case 159: -#line 1709 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1723 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Float & Double constants if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) GEN_ERROR("Floating point constant invalid for type"); @@ -4051,7 +4065,7 @@ break; case 160: -#line 1717 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1731 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -4067,7 +4081,7 @@ break; case 161: -#line 1729 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1743 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!isa((yyvsp[-2].ConstVal)->getType())) GEN_ERROR("GetElementPtr requires a pointer operand"); @@ -4092,7 +4106,7 @@ break; case 162: -#line 1750 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1764 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-5].ConstVal)->getType() != Type::Int1Ty) GEN_ERROR("Select condition must be of boolean type"); @@ -4104,7 +4118,7 @@ break; case 163: -#line 1758 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1772 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Binary operator types must match"); @@ -4114,7 +4128,7 @@ break; case 164: -#line 1764 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1778 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Logical operator types must match"); @@ -4129,7 +4143,7 @@ break; case 165: -#line 1775 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1789 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("icmp operand types must match"); @@ -4138,7 +4152,7 @@ break; case 166: -#line 1780 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1794 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("fcmp operand types must match"); @@ -4147,7 +4161,7 @@ break; case 167: -#line 1785 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1799 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid extractelement operands"); @@ -4157,7 +4171,7 @@ break; case 168: -#line 1791 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1805 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid insertelement operands"); @@ -4167,7 +4181,7 @@ break; case 169: -#line 1797 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1811 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid shufflevector operands"); @@ -4177,7 +4191,7 @@ break; case 170: -#line 1806 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1820 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR @@ -4185,7 +4199,7 @@ break; case 171: -#line 1810 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1824 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ConstVector) = new std::vector(); (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); @@ -4194,17 +4208,17 @@ break; case 172: -#line 1818 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1832 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = false; ;} break; case 173: -#line 1818 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1832 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = true; ;} break; case 174: -#line 1829 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1843 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule; CurModule.ModuleDone(); @@ -4213,7 +4227,7 @@ break; case 175: -#line 1834 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1848 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule; CurModule.ModuleDone(); @@ -4222,12 +4236,12 @@ break; case 178: -#line 1847 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1861 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.isDeclare = false; ;} break; case 179: -#line 1847 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1861 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.FunctionDone(); CHECK_FOR_ERROR @@ -4235,26 +4249,26 @@ break; case 180: -#line 1851 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1865 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.isDeclare = true; ;} break; case 181: -#line 1851 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1865 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; case 182: -#line 1854 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1868 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; case 183: -#line 1857 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1871 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { @@ -4270,7 +4284,7 @@ break; case 184: -#line 1869 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1883 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); @@ -4298,7 +4312,7 @@ break; case 185: -#line 1893 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1907 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { ResolveTypeTo((yyvsp[-2].StrVal), (yyvsp[0].PrimType)); @@ -4313,7 +4327,7 @@ break; case 186: -#line 1904 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1918 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { /* "Externally Visible" Linkage */ if ((yyvsp[0].ConstVal) == 0) @@ -4325,14 +4339,14 @@ break; case 187: -#line 1911 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1925 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ;} break; case 188: -#line 1914 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1928 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[0].ConstVal) == 0) GEN_ERROR("Global value initializer is not a constant"); @@ -4342,14 +4356,14 @@ break; case 189: -#line 1919 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1933 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ;} break; case 190: -#line 1922 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1936 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); @@ -4360,7 +4374,7 @@ break; case 191: -#line 1928 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1942 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; CHECK_FOR_ERROR @@ -4368,21 +4382,21 @@ break; case 192: -#line 1932 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1946 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; case 193: -#line 1935 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1949 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; case 194: -#line 1941 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1955 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm(); char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); @@ -4398,7 +4412,7 @@ break; case 195: -#line 1954 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1968 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4406,7 +4420,7 @@ break; case 196: -#line 1958 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1972 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4414,7 +4428,7 @@ break; case 198: -#line 1965 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1979 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4423,7 +4437,7 @@ break; case 199: -#line 1970 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1984 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4432,14 +4446,14 @@ break; case 200: -#line 1975 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1989 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; case 201: -#line 1984 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 1998 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -4453,7 +4467,7 @@ break; case 202: -#line 1994 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2008 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -4467,7 +4481,7 @@ break; case 203: -#line 2005 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2019 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ArgList) = (yyvsp[0].ArgList); CHECK_FOR_ERROR @@ -4475,7 +4489,7 @@ break; case 204: -#line 2009 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2023 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ArgList) = (yyvsp[-2].ArgList); struct ArgListEntry E; @@ -4488,7 +4502,7 @@ break; case 205: -#line 2018 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2032 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ArgList) = new ArgListType; struct ArgListEntry E; @@ -4501,7 +4515,7 @@ break; case 206: -#line 2027 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2041 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ArgList) = 0; CHECK_FOR_ERROR @@ -4509,7 +4523,7 @@ break; case 207: -#line 2033 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2047 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { UnEscapeLexed((yyvsp[-6].StrVal)); std::string FunctionName((yyvsp[-6].StrVal)); @@ -4558,17 +4572,21 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. This is an overload + // error. + GEN_ERROR("Overload of function '" + FunctionName + "' not permitted."); + } else if (!CurFun.isDeclare && !Fn->isDeclaration()) { + // Neither the existing or the current function is a declaration and they + // have the same name and same type. Clearly this is a redefinition. GEN_ERROR("Redefinition of function '" + FunctionName + "'"); - - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) + } if (Fn->isDeclaration()) { + // Make sure to strip off any argument names so we can't get conflicts. for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); AI != AE; ++AI) AI->setName(""); + } } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -4595,16 +4613,18 @@ // Add all of the arguments we parsed to the function... if ((yyvsp[-4].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0&& + assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0 && "Not a varargs marker!"); delete (yyvsp[-4].ArgList)->back().Ty; (yyvsp[-4].ArgList)->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); + Function::arg_iterator ArgEnd = Fn->arg_end(); unsigned Idx = 1; - for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); I != (yyvsp[-4].ArgList)->end(); ++I, ++ArgIt) { + for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); + I != (yyvsp[-4].ArgList)->end() && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->Ty; // Delete the typeholder... - setValueName(ArgIt, I->Name); // Insert arg into symtab... + setValueName(ArgIt, I->Name); // Insert arg into symtab... CHECK_FOR_ERROR InsertValue(ArgIt); Idx++; @@ -4617,7 +4637,7 @@ break; case 210: -#line 2140 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2160 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FunctionVal) = CurFun.CurrentFunction; @@ -4629,7 +4649,7 @@ break; case 213: -#line 2151 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2171 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR @@ -4637,7 +4657,7 @@ break; case 214: -#line 2156 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2176 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.CurrentFunction->setLinkage((yyvsp[-2].Linkage)); CurFun.CurrentFunction->setVisibility((yyvsp[-1].Visibility)); @@ -4648,7 +4668,7 @@ break; case 215: -#line 2168 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2188 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = false; CHECK_FOR_ERROR @@ -4656,7 +4676,7 @@ break; case 216: -#line 2172 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2192 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = true; CHECK_FOR_ERROR @@ -4664,7 +4684,7 @@ break; case 217: -#line 2177 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2197 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // A reference to a direct constant (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); CHECK_FOR_ERROR @@ -4672,7 +4692,7 @@ break; case 218: -#line 2181 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2201 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR @@ -4680,7 +4700,7 @@ break; case 219: -#line 2185 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2205 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Perhaps it's an FP constant? (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); CHECK_FOR_ERROR @@ -4688,7 +4708,7 @@ break; case 220: -#line 2189 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2209 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::getTrue()); CHECK_FOR_ERROR @@ -4696,7 +4716,7 @@ break; case 221: -#line 2193 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2213 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::getFalse()); CHECK_FOR_ERROR @@ -4704,7 +4724,7 @@ break; case 222: -#line 2197 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2217 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::createNull(); CHECK_FOR_ERROR @@ -4712,7 +4732,7 @@ break; case 223: -#line 2201 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2221 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::createUndef(); CHECK_FOR_ERROR @@ -4720,7 +4740,7 @@ break; case 224: -#line 2205 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2225 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // A vector zero constant. (yyval.ValIDVal) = ValID::createZeroInit(); CHECK_FOR_ERROR @@ -4728,7 +4748,7 @@ break; case 225: -#line 2209 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2229 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized packed vector const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType(); int NumElements = (yyvsp[-1].ConstVector)->size(); @@ -4757,7 +4777,7 @@ break; case 226: -#line 2234 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2254 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal)); CHECK_FOR_ERROR @@ -4765,7 +4785,7 @@ break; case 227: -#line 2238 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2258 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); std::string AsmStr = std::string((yyvsp[-2].StrVal), End); @@ -4779,7 +4799,7 @@ break; case 228: -#line 2252 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2272 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is it an integer reference...? (yyval.ValIDVal) = ValID::createLocalID((yyvsp[0].UIntVal)); CHECK_FOR_ERROR @@ -4787,7 +4807,7 @@ break; case 229: -#line 2256 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2276 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValIDVal) = ValID::createGlobalID((yyvsp[0].UIntVal)); CHECK_FOR_ERROR @@ -4795,7 +4815,7 @@ break; case 230: -#line 2260 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2280 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is it a named reference...? (yyval.ValIDVal) = ValID::createLocalName((yyvsp[0].StrVal)); CHECK_FOR_ERROR @@ -4803,7 +4823,7 @@ break; case 231: -#line 2264 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2284 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is it a named reference...? (yyval.ValIDVal) = ValID::createGlobalName((yyvsp[0].StrVal)); CHECK_FOR_ERROR @@ -4811,7 +4831,7 @@ break; case 234: -#line 2276 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2296 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -4822,7 +4842,7 @@ break; case 235: -#line 2285 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2305 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR @@ -4830,7 +4850,7 @@ break; case 236: -#line 2289 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2309 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Do not allow functions with 0 basic blocks (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR @@ -4838,12 +4858,11 @@ break; case 237: -#line 2298 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2318 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR InsertValue((yyvsp[0].TermInstVal)); - (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal)); InsertValue((yyvsp[-2].BasicBlockVal)); (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal); @@ -4852,7 +4871,7 @@ break; case 238: -#line 2309 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2328 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (CastInst *CI1 = dyn_cast((yyvsp[0].InstVal))) if (CastInst *CI2 = dyn_cast(CI1->getOperand(0))) @@ -4865,7 +4884,7 @@ break; case 239: -#line 2318 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2337 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BasicBlockVal) = getBBVal(ValID::createLocalID(CurFun.NextBBNum++), true); CHECK_FOR_ERROR @@ -4881,7 +4900,7 @@ break; case 240: -#line 2330 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2349 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BasicBlockVal) = getBBVal(ValID::createLocalName((yyvsp[0].StrVal)), true); CHECK_FOR_ERROR @@ -4897,7 +4916,7 @@ break; case 241: -#line 2343 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2362 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Return with a result... (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR @@ -4905,7 +4924,7 @@ break; case 242: -#line 2347 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2366 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Return with no result... (yyval.TermInstVal) = new ReturnInst(); CHECK_FOR_ERROR @@ -4913,7 +4932,7 @@ break; case 243: -#line 2351 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2370 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Unconditional Branch... BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR @@ -4922,7 +4941,7 @@ break; case 244: -#line 2356 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2375 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { assert(cast((yyvsp[-7].PrimType))->getBitWidth() == 1 && "Not Bool?"); BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); @@ -4936,7 +4955,7 @@ break; case 245: -#line 2366 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2385 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal)); CHECK_FOR_ERROR @@ -4959,7 +4978,7 @@ break; case 246: -#line 2385 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2404 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal)); CHECK_FOR_ERROR @@ -4972,7 +4991,7 @@ break; case 247: -#line 2395 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2414 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Handle the short syntax @@ -5042,7 +5061,7 @@ break; case 248: -#line 2461 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2480 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TermInstVal) = new UnwindInst(); CHECK_FOR_ERROR @@ -5050,7 +5069,7 @@ break; case 249: -#line 2465 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2484 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.TermInstVal) = new UnreachableInst(); CHECK_FOR_ERROR @@ -5058,7 +5077,7 @@ break; case 250: -#line 2472 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2491 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.JumpTable) = (yyvsp[-5].JumpTable); Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); @@ -5073,7 +5092,7 @@ break; case 251: -#line 2483 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2502 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.JumpTable) = new std::vector >(); Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); @@ -5089,19 +5108,19 @@ break; case 252: -#line 2496 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2515 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - // Is this definition named?? if so, assign the name... - setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); - CHECK_FOR_ERROR - InsertValue((yyvsp[0].InstVal)); - (yyval.InstVal) = (yyvsp[0].InstVal); - CHECK_FOR_ERROR -;} + // Is this definition named?? if so, assign the name... + setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); + CHECK_FOR_ERROR + InsertValue((yyvsp[0].InstVal)); + (yyval.InstVal) = (yyvsp[0].InstVal); + CHECK_FOR_ERROR + ;} break; case 253: -#line 2505 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2525 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Used for PHI nodes if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-5].TypeVal))->getDescription()); @@ -5116,7 +5135,7 @@ break; case 254: -#line 2516 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2536 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.PHIList) = (yyvsp[-6].PHIList); Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal)); @@ -5128,7 +5147,7 @@ break; case 255: -#line 2526 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2546 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -5140,7 +5159,7 @@ break; case 256: -#line 2534 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2554 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -5152,17 +5171,17 @@ break; case 257: -#line 2542 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2562 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValueRefList) = new ValueRefList(); ;} break; case 258: -#line 2545 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2565 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValueList) = new std::vector(); ;} break; case 259: -#line 2546 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2566 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.ValueList) = (yyvsp[-2].ValueList); (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); @@ -5171,7 +5190,7 @@ break; case 260: -#line 2553 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2573 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = true; CHECK_FOR_ERROR @@ -5179,7 +5198,7 @@ break; case 261: -#line 2557 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2577 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = false; CHECK_FOR_ERROR @@ -5187,7 +5206,7 @@ break; case 262: -#line 2562 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2582 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -5199,7 +5218,7 @@ ((yyvsp[-4].BinaryOpVal) == Instruction::URem || (yyvsp[-4].BinaryOpVal) == Instruction::SRem || (yyvsp[-4].BinaryOpVal) == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types"); + GEN_ERROR("Remainder not supported on packed types"); Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); @@ -5212,7 +5231,7 @@ break; case 263: -#line 2583 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2603 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -5233,7 +5252,7 @@ break; case 264: -#line 2600 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2620 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -5250,7 +5269,7 @@ break; case 265: -#line 2613 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2633 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); @@ -5267,7 +5286,7 @@ break; case 266: -#line 2626 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2646 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); @@ -5283,7 +5302,7 @@ break; case 267: -#line 2638 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2658 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if ((yyvsp[-4].ValueVal)->getType() != Type::Int1Ty) GEN_ERROR("select condition must be boolean"); @@ -5295,7 +5314,7 @@ break; case 268: -#line 2646 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2666 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); @@ -5306,7 +5325,7 @@ break; case 269: -#line 2653 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2673 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid extractelement operands"); @@ -5316,7 +5335,7 @@ break; case 270: -#line 2659 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2679 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid insertelement operands"); @@ -5326,7 +5345,7 @@ break; case 271: -#line 2665 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2685 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid shufflevector operands"); @@ -5336,7 +5355,7 @@ break; case 272: -#line 2671 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2691 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); if (!Ty->isFirstClassType()) @@ -5355,7 +5374,7 @@ break; case 273: -#line 2687 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2707 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Handle the short syntax @@ -5422,7 +5441,7 @@ break; case 274: -#line 2750 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2770 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR @@ -5430,7 +5449,7 @@ break; case 275: -#line 2755 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2775 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = true; CHECK_FOR_ERROR @@ -5438,7 +5457,7 @@ break; case 276: -#line 2759 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2779 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { (yyval.BoolVal) = false; CHECK_FOR_ERROR @@ -5446,7 +5465,7 @@ break; case 277: -#line 2766 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2786 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -5457,7 +5476,7 @@ break; case 278: -#line 2773 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2793 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); @@ -5469,7 +5488,7 @@ break; case 279: -#line 2781 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2801 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -5480,7 +5499,7 @@ break; case 280: -#line 2788 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2808 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); @@ -5492,7 +5511,7 @@ break; case 281: -#line 2796 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2816 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!isa((yyvsp[0].ValueVal)->getType())) GEN_ERROR("Trying to free nonpointer type " + @@ -5503,7 +5522,7 @@ break; case 282: -#line 2804 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2824 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -5521,7 +5540,7 @@ break; case 283: -#line 2818 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2838 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); @@ -5542,7 +5561,7 @@ break; case 284: -#line 2835 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2855 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); @@ -5565,7 +5584,7 @@ } /* Line 1126 of yacc.c. */ -#line 5569 "llvmAsmParser.tab.c" +#line 5588 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -5833,7 +5852,7 @@ } -#line 2852 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 2872 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" // common code from the two 'RunVMAsmParser' functions @@ -5875,11 +5894,10 @@ std::string where = std::string((CurFilename == "-") ? std::string("") : CurFilename) + ":" + utostr((unsigned) llvmAsmlineno) + ": "; - std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading "; - if (yychar == YYEMPTY || yychar == 0) - errMsg += "end-of-file."; - else - errMsg += "token: '" + std::string(llvmAsmtext, llvmAsmleng) + "'"; + std::string errMsg = where + "error: " + std::string(ErrorMsg); + if (yychar != YYEMPTY && yychar != 0) + errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+ + "'"; GenerateError(errMsg); return 0; } Index: llvm/lib/AsmParser/llvmAsmParser.h.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.50 llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.51 --- llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.50 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/llvmAsmParser.h.cvs Mon Feb 5 14:47:19 2007 @@ -295,7 +295,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 886 "/proj/llvm/llvm-4/lib/AsmParser/llvmAsmParser.y" +#line 900 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.319 llvm/lib/AsmParser/llvmAsmParser.y:1.320 --- llvm/lib/AsmParser/llvmAsmParser.y:1.319 Mon Feb 5 11:01:20 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Feb 5 14:47:20 2007 @@ -17,7 +17,7 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/CommandLine.h" #include "llvm/ADT/SmallVector.h" @@ -209,7 +209,7 @@ std::map Values; // Keep track of #'d definitions std::map LateResolveValues; - bool isDeclare; // Is this function a forward declararation? + bool isDeclare; // Is this function a forward declararation? GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration. GlobalValue::VisibilityTypes Visibility; @@ -341,24 +341,33 @@ // Module constants occupy the lowest numbered slots... std::map::iterator VI = CurModule.Values.find(Ty); - if (VI == CurModule.Values.end()) return 0; - if (D.Num >= VI->second.size()) return 0; + if (VI == CurModule.Values.end()) + return 0; + if (D.Num >= VI->second.size()) + return 0; return VI->second[Num]; } case ValID::LocalName: { // Is it a named definition? - if (!inFunctionScope()) return 0; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + if (!inFunctionScope()) + return 0; + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; } case ValID::GlobalName: { // Is it a named definition? - SymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; @@ -499,8 +508,8 @@ break; case ValID::LocalName: // Is it a named definition? Name = ID.Name; - if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) + Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name); + if (N && N->getType()->getTypeID() == Type::LabelTyID) BB = cast(N); break; } @@ -640,8 +649,8 @@ } assert(inFunctionScope() && "Must be in function scope!"); - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - if (ST.lookup(V->getType(), Name)) { + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + if (ST.lookup(Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + V->getType()->getDescription() + "'"); return; @@ -695,16 +704,21 @@ return GV; } - // If this global has a name, check to see if there is already a definition - // of this global in the module. If so, it is an error. + // If this global has a name if (!Name.empty()) { - // We are a simple redefinition of a value, check to see if it is defined - // the same as the old one. - if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { - GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'"); - return 0; - } + // if the global we're parsing has an initializer (is a definition) and + // has external linkage. + if (Initializer && Linkage != GlobalValue::InternalLinkage) + // If there is already a global with external linkage with this name + if (CurModule.CurrentModule->getGlobalVariable(Name, false)) { + // If we allow this GVar to get created, it will be renamed in the + // symbol table because it conflicts with an existing GVar. We can't + // allow redefinition of GVars whose linking indicates that their name + // must stay the same. Issue the error. + GenerateError("Redefinition of global variable named '" + Name + + "' of type '" + Ty->getDescription() + "'"); + return 0; + } } // Otherwise there is no existing GV to use, create one now. @@ -2078,17 +2092,21 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. This is an overload + // error. + GEN_ERROR("Overload of function '" + FunctionName + "' not permitted."); + } else if (!CurFun.isDeclare && !Fn->isDeclaration()) { + // Neither the existing or the current function is a declaration and they + // have the same name and same type. Clearly this is a redefinition. GEN_ERROR("Redefinition of function '" + FunctionName + "'"); - - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) + } if (Fn->isDeclaration()) { + // Make sure to strip off any argument names so we can't get conflicts. for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); AI != AE; ++AI) AI->setName(""); + } } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -2115,16 +2133,18 @@ // Add all of the arguments we parsed to the function... if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& + assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0 && "Not a varargs marker!"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); + Function::arg_iterator ArgEnd = Fn->arg_end(); unsigned Idx = 1; - for (ArgListType::iterator I = $5->begin(); I != $5->end(); ++I, ++ArgIt) { + for (ArgListType::iterator I = $5->begin(); + I != $5->end() && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->Ty; // Delete the typeholder... - setValueName(ArgIt, I->Name); // Insert arg into symtab... + setValueName(ArgIt, I->Name); // Insert arg into symtab... CHECK_FOR_ERROR InsertValue(ArgIt); Idx++; @@ -2299,7 +2319,6 @@ setValueName($3, $2); CHECK_FOR_ERROR InsertValue($3); - $1->getInstList().push_back($3); InsertValue($1); $$ = $1; @@ -2494,13 +2513,14 @@ }; Inst : OptLocalAssign InstVal { - // Is this definition named?? if so, assign the name... - setValueName($2, $1); - CHECK_FOR_ERROR - InsertValue($2); - $$ = $2; - CHECK_FOR_ERROR -}; + // Is this definition named?? if so, assign the name... + setValueName($2, $1); + CHECK_FOR_ERROR + InsertValue($2); + $$ = $2; + CHECK_FOR_ERROR + }; + PHIList : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes if (!UpRefs.empty()) @@ -2570,7 +2590,7 @@ ($1 == Instruction::URem || $1 == Instruction::SRem || $1 == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types"); + GEN_ERROR("Remainder not supported on packed types"); Value* val1 = getVal(*$2, $3); CHECK_FOR_ERROR Value* val2 = getVal(*$2, $5); @@ -2890,11 +2910,10 @@ std::string where = std::string((CurFilename == "-") ? std::string("") : CurFilename) + ":" + utostr((unsigned) llvmAsmlineno) + ": "; - std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading "; - if (yychar == YYEMPTY || yychar == 0) - errMsg += "end-of-file."; - else - errMsg += "token: '" + std::string(llvmAsmtext, llvmAsmleng) + "'"; + std::string errMsg = where + "error: " + std::string(ErrorMsg); + if (yychar != YYEMPTY && yychar != 0) + errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+ + "'"; GenerateError(errMsg); return 0; } Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.65 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.66 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.65 Mon Feb 5 11:04:00 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Mon Feb 5 14:47:20 2007 @@ -17,7 +17,7 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/CommandLine.h" #include "llvm/ADT/SmallVector.h" @@ -209,7 +209,7 @@ std::map Values; // Keep track of #'d definitions std::map LateResolveValues; - bool isDeclare; // Is this function a forward declararation? + bool isDeclare; // Is this function a forward declararation? GlobalValue::LinkageTypes Linkage; // Linkage for forward declaration. GlobalValue::VisibilityTypes Visibility; @@ -341,24 +341,33 @@ // Module constants occupy the lowest numbered slots... std::map::iterator VI = CurModule.Values.find(Ty); - if (VI == CurModule.Values.end()) return 0; - if (D.Num >= VI->second.size()) return 0; + if (VI == CurModule.Values.end()) + return 0; + if (D.Num >= VI->second.size()) + return 0; return VI->second[Num]; } case ValID::LocalName: { // Is it a named definition? - if (!inFunctionScope()) return 0; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + if (!inFunctionScope()) + return 0; + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; } case ValID::GlobalName: { // Is it a named definition? - SymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); - Value *N = SymTab.lookup(Ty, D.Name); - if (N == 0) return 0; + ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable(); + Value *N = SymTab.lookup(D.Name); + if (N == 0) + return 0; + if (N->getType() != Ty) + return 0; D.destroy(); // Free old strdup'd memory... return N; @@ -499,8 +508,8 @@ break; case ValID::LocalName: // Is it a named definition? Name = ID.Name; - if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) + Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name); + if (N && N->getType()->getTypeID() == Type::LabelTyID) BB = cast(N); break; } @@ -640,8 +649,8 @@ } assert(inFunctionScope() && "Must be in function scope!"); - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - if (ST.lookup(V->getType(), Name)) { + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + if (ST.lookup(Name)) { GenerateError("Redefinition of value '" + Name + "' of type '" + V->getType()->getDescription() + "'"); return; @@ -695,16 +704,21 @@ return GV; } - // If this global has a name, check to see if there is already a definition - // of this global in the module. If so, it is an error. + // If this global has a name if (!Name.empty()) { - // We are a simple redefinition of a value, check to see if it is defined - // the same as the old one. - if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { - GenerateError("Redefinition of global variable named '" + Name + - "' of type '" + Ty->getDescription() + "'"); - return 0; - } + // if the global we're parsing has an initializer (is a definition) and + // has external linkage. + if (Initializer && Linkage != GlobalValue::InternalLinkage) + // If there is already a global with external linkage with this name + if (CurModule.CurrentModule->getGlobalVariable(Name, false)) { + // If we allow this GVar to get created, it will be renamed in the + // symbol table because it conflicts with an existing GVar. We can't + // allow redefinition of GVars whose linking indicates that their name + // must stay the same. Issue the error. + GenerateError("Redefinition of global variable named '" + Name + + "' of type '" + Ty->getDescription() + "'"); + return 0; + } } // Otherwise there is no existing GV to use, create one now. @@ -2078,17 +2092,21 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. This is an overload + // error. + GEN_ERROR("Overload of function '" + FunctionName + "' not permitted."); + } else if (!CurFun.isDeclare && !Fn->isDeclaration()) { + // Neither the existing or the current function is a declaration and they + // have the same name and same type. Clearly this is a redefinition. GEN_ERROR("Redefinition of function '" + FunctionName + "'"); - - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) + } if (Fn->isDeclaration()) { + // Make sure to strip off any argument names so we can't get conflicts. for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); AI != AE; ++AI) AI->setName(""); + } } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -2115,16 +2133,18 @@ // Add all of the arguments we parsed to the function... if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& + assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0 && "Not a varargs marker!"); delete $5->back().Ty; $5->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); + Function::arg_iterator ArgEnd = Fn->arg_end(); unsigned Idx = 1; - for (ArgListType::iterator I = $5->begin(); I != $5->end(); ++I, ++ArgIt) { + for (ArgListType::iterator I = $5->begin(); + I != $5->end() && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->Ty; // Delete the typeholder... - setValueName(ArgIt, I->Name); // Insert arg into symtab... + setValueName(ArgIt, I->Name); // Insert arg into symtab... CHECK_FOR_ERROR InsertValue(ArgIt); Idx++; @@ -2299,7 +2319,6 @@ setValueName($3, $2); CHECK_FOR_ERROR InsertValue($3); - $1->getInstList().push_back($3); InsertValue($1); $$ = $1; @@ -2494,13 +2513,14 @@ }; Inst : OptLocalAssign InstVal { - // Is this definition named?? if so, assign the name... - setValueName($2, $1); - CHECK_FOR_ERROR - InsertValue($2); - $$ = $2; - CHECK_FOR_ERROR -}; + // Is this definition named?? if so, assign the name... + setValueName($2, $1); + CHECK_FOR_ERROR + InsertValue($2); + $$ = $2; + CHECK_FOR_ERROR + }; + PHIList : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes if (!UpRefs.empty()) @@ -2570,7 +2590,7 @@ ($1 == Instruction::URem || $1 == Instruction::SRem || $1 == Instruction::FRem)) - GEN_ERROR("U/S/FRem not supported on packed types"); + GEN_ERROR("Remainder not supported on packed types"); Value* val1 = getVal(*$2, $3); CHECK_FOR_ERROR Value* val2 = getVal(*$2, $5); @@ -2890,11 +2910,10 @@ std::string where = std::string((CurFilename == "-") ? std::string("") : CurFilename) + ":" + utostr((unsigned) llvmAsmlineno) + ": "; - std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading "; - if (yychar == YYEMPTY || yychar == 0) - errMsg += "end-of-file."; - else - errMsg += "token: '" + std::string(llvmAsmtext, llvmAsmleng) + "'"; + std::string errMsg = where + "error: " + std::string(ErrorMsg); + if (yychar != YYEMPTY && yychar != 0) + errMsg += " while reading token: '" + std::string(llvmAsmtext, llvmAsmleng)+ + "'"; GenerateError(errMsg); return 0; } From reid at x10sys.com Mon Feb 5 14:48:37 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:37 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs UpgradeParser.cpp.cvs UpgradeParser.h.cvs UpgradeParser.y UpgradeParser.y.cvs Message-ID: <200702052048.l15Kmb0W001372@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeLexer.cpp.cvs updated: 1.19 -> 1.20 UpgradeParser.cpp.cvs updated: 1.55 -> 1.56 UpgradeParser.h.cvs updated: 1.41 -> 1.42 UpgradeParser.y updated: 1.56 -> 1.57 UpgradeParser.y.cvs updated: 1.54 -> 1.55 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+595 -544) UpgradeLexer.cpp.cvs | 324 +++++++++++++------------- UpgradeParser.cpp.cvs | 623 +++++++++++++++++++++++++------------------------- UpgradeParser.h.cvs | 2 UpgradeParser.y | 95 ++++--- UpgradeParser.y.cvs | 95 ++++--- 5 files changed, 595 insertions(+), 544 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs diff -u llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.19 llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.20 --- llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.19 Thu Feb 1 20:16:22 2007 +++ llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs Mon Feb 5 14:47:21 2007 @@ -20,7 +20,7 @@ /* A lexical scanner generated by flex*/ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.19 2007/02/02 02:16:22 reid Exp $ + * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.20 2007/02/05 20:47:21 reid Exp $ */ #define FLEX_SCANNER @@ -925,7 +925,7 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 1 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" #define INITIAL 0 /*===-- UpgradeLexer.l - Scanner for 1.9 assembly files --------*- C++ -*--===// // @@ -940,7 +940,7 @@ // //===----------------------------------------------------------------------===*/ #define YY_NEVER_INTERACTIVE 1 -#line 28 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 28 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" #include "UpgradeInternals.h" #include "llvm/Module.h" #include @@ -1227,7 +1227,7 @@ register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; -#line 189 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 189 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" #line 1234 "UpgradeLexer.cpp" @@ -1323,717 +1323,717 @@ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 191 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 191 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { /* Ignore comments for now */ } YY_BREAK case 2: YY_RULE_SETUP -#line 193 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 193 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return BEGINTOK; } YY_BREAK case 3: YY_RULE_SETUP -#line 194 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 194 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ENDTOK; } YY_BREAK case 4: YY_RULE_SETUP -#line 195 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 195 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TRUETOK; } YY_BREAK case 5: YY_RULE_SETUP -#line 196 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 196 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return FALSETOK; } YY_BREAK case 6: YY_RULE_SETUP -#line 197 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 197 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DECLARE; } YY_BREAK case 7: YY_RULE_SETUP -#line 198 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 198 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return GLOBAL; } YY_BREAK case 8: YY_RULE_SETUP -#line 199 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 199 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return CONSTANT; } YY_BREAK case 9: YY_RULE_SETUP -#line 200 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 200 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return INTERNAL; } YY_BREAK case 10: YY_RULE_SETUP -#line 201 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 201 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return LINKONCE; } YY_BREAK case 11: YY_RULE_SETUP -#line 202 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 202 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return WEAK; } YY_BREAK case 12: YY_RULE_SETUP -#line 203 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 203 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return APPENDING; } YY_BREAK case 13: YY_RULE_SETUP -#line 204 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 204 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DLLIMPORT; } YY_BREAK case 14: YY_RULE_SETUP -#line 205 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 205 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DLLEXPORT; } YY_BREAK case 15: YY_RULE_SETUP -#line 206 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 206 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return EXTERN_WEAK; } YY_BREAK case 16: YY_RULE_SETUP -#line 207 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 207 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return EXTERNAL; } /* Deprecated, turn into external */ YY_BREAK case 17: YY_RULE_SETUP -#line 208 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 208 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return EXTERNAL; } YY_BREAK case 18: YY_RULE_SETUP -#line 209 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 209 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return IMPLEMENTATION; } YY_BREAK case 19: YY_RULE_SETUP -#line 210 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 210 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ZEROINITIALIZER; } YY_BREAK case 20: YY_RULE_SETUP -#line 211 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 211 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DOTDOTDOT; } YY_BREAK case 21: YY_RULE_SETUP -#line 212 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 212 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UNDEF; } YY_BREAK case 22: YY_RULE_SETUP -#line 213 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 213 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return NULL_TOK; } YY_BREAK case 23: YY_RULE_SETUP -#line 214 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 214 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TO; } YY_BREAK case 24: YY_RULE_SETUP -#line 215 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 215 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return EXCEPT; } YY_BREAK case 25: YY_RULE_SETUP -#line 216 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 216 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return NOT; } /* Deprecated, turned into XOR */ YY_BREAK case 26: YY_RULE_SETUP -#line 217 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 217 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TAIL; } YY_BREAK case 27: YY_RULE_SETUP -#line 218 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 218 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TARGET; } YY_BREAK case 28: YY_RULE_SETUP -#line 219 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 219 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TRIPLE; } YY_BREAK case 29: YY_RULE_SETUP -#line 220 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 220 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DEPLIBS; } YY_BREAK case 30: YY_RULE_SETUP -#line 221 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 221 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ENDIAN; } YY_BREAK case 31: YY_RULE_SETUP -#line 222 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 222 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return POINTERSIZE; } YY_BREAK case 32: YY_RULE_SETUP -#line 223 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 223 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return DATALAYOUT; } YY_BREAK case 33: YY_RULE_SETUP -#line 224 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 224 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return LITTLE; } YY_BREAK case 34: YY_RULE_SETUP -#line 225 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 225 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return BIG; } YY_BREAK case 35: YY_RULE_SETUP -#line 226 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 226 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return VOLATILE; } YY_BREAK case 36: YY_RULE_SETUP -#line 227 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 227 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ALIGN; } YY_BREAK case 37: YY_RULE_SETUP -#line 228 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 228 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SECTION; } YY_BREAK case 38: YY_RULE_SETUP -#line 229 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 229 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return MODULE; } YY_BREAK case 39: YY_RULE_SETUP -#line 230 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 230 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ASM_TOK; } YY_BREAK case 40: YY_RULE_SETUP -#line 231 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 231 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SIDEEFFECT; } YY_BREAK case 41: YY_RULE_SETUP -#line 233 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 233 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return CC_TOK; } YY_BREAK case 42: YY_RULE_SETUP -#line 234 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 234 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return CCC_TOK; } YY_BREAK case 43: YY_RULE_SETUP -#line 235 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 235 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return CSRETCC_TOK; } YY_BREAK case 44: YY_RULE_SETUP -#line 236 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 236 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return FASTCC_TOK; } YY_BREAK case 45: YY_RULE_SETUP -#line 237 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 237 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return COLDCC_TOK; } YY_BREAK case 46: YY_RULE_SETUP -#line 238 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 238 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return X86_STDCALLCC_TOK; } YY_BREAK case 47: YY_RULE_SETUP -#line 239 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 239 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return X86_FASTCALLCC_TOK; } YY_BREAK case 48: YY_RULE_SETUP -#line 241 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 241 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(SBYTE, Type::Int8Ty, Signed); } YY_BREAK case 49: YY_RULE_SETUP -#line 242 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 242 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(UBYTE, Type::Int8Ty, Unsigned); } YY_BREAK case 50: YY_RULE_SETUP -#line 243 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 243 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(SHORT, Type::Int16Ty, Signed); } YY_BREAK case 51: YY_RULE_SETUP -#line 244 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 244 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(USHORT, Type::Int16Ty, Unsigned); } YY_BREAK case 52: YY_RULE_SETUP -#line 245 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 245 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(INT, Type::Int32Ty, Signed); } YY_BREAK case 53: YY_RULE_SETUP -#line 246 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 246 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(UINT, Type::Int32Ty, Unsigned); } YY_BREAK case 54: YY_RULE_SETUP -#line 247 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 247 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(LONG, Type::Int64Ty, Signed); } YY_BREAK case 55: YY_RULE_SETUP -#line 248 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 248 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(ULONG, Type::Int64Ty, Unsigned); } YY_BREAK case 56: YY_RULE_SETUP -#line 249 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 249 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(VOID, Type::VoidTy, Signless ); } YY_BREAK case 57: YY_RULE_SETUP -#line 250 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 250 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(BOOL, Type::Int1Ty, Unsigned ); } YY_BREAK case 58: YY_RULE_SETUP -#line 251 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 251 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(FLOAT, Type::FloatTy, Signless ); } YY_BREAK case 59: YY_RULE_SETUP -#line 252 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 252 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(DOUBLE, Type::DoubleTy,Signless); } YY_BREAK case 60: YY_RULE_SETUP -#line 253 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 253 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TY(LABEL, Type::LabelTy, Signless ); } YY_BREAK case 61: YY_RULE_SETUP -#line 254 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 254 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return TYPE; } YY_BREAK case 62: YY_RULE_SETUP -#line 255 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 255 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OPAQUE; } YY_BREAK case 63: YY_RULE_SETUP -#line 257 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 257 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, AddOp, ADD); } YY_BREAK case 64: YY_RULE_SETUP -#line 258 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SubOp, SUB); } YY_BREAK case 65: YY_RULE_SETUP -#line 259 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 259 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, MulOp, MUL); } YY_BREAK case 66: YY_RULE_SETUP -#line 260 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 260 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, DivOp, DIV); } YY_BREAK case 67: YY_RULE_SETUP -#line 261 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 261 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, UDivOp, UDIV); } YY_BREAK case 68: YY_RULE_SETUP -#line 262 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 262 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SDivOp, SDIV); } YY_BREAK case 69: YY_RULE_SETUP -#line 263 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 263 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, FDivOp, FDIV); } YY_BREAK case 70: YY_RULE_SETUP -#line 264 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 264 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, RemOp, REM); } YY_BREAK case 71: YY_RULE_SETUP -#line 265 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 265 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, URemOp, UREM); } YY_BREAK case 72: YY_RULE_SETUP -#line 266 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 266 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SRemOp, SREM); } YY_BREAK case 73: YY_RULE_SETUP -#line 267 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 267 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, FRemOp, FREM); } YY_BREAK case 74: YY_RULE_SETUP -#line 268 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 268 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, AndOp, AND); } YY_BREAK case 75: YY_RULE_SETUP -#line 269 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 269 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, OrOp , OR ); } YY_BREAK case 76: YY_RULE_SETUP -#line 270 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 270 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, XorOp, XOR); } YY_BREAK case 77: YY_RULE_SETUP -#line 271 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 271 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetNE, SETNE); } YY_BREAK case 78: YY_RULE_SETUP -#line 272 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 272 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetEQ, SETEQ); } YY_BREAK case 79: YY_RULE_SETUP -#line 273 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 273 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetLT, SETLT); } YY_BREAK case 80: YY_RULE_SETUP -#line 274 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 274 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetGT, SETGT); } YY_BREAK case 81: YY_RULE_SETUP -#line 275 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetLE, SETLE); } YY_BREAK case 82: YY_RULE_SETUP -#line 276 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 276 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, SetGE, SETGE); } YY_BREAK case 83: YY_RULE_SETUP -#line 277 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 277 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, ShlOp, SHL); } YY_BREAK case 84: YY_RULE_SETUP -#line 278 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 278 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, ShrOp, SHR); } YY_BREAK case 85: YY_RULE_SETUP -#line 279 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 279 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, LShrOp, LSHR); } YY_BREAK case 86: YY_RULE_SETUP -#line 280 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 280 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(BinaryOpVal, AShrOp, ASHR); } YY_BREAK case 87: YY_RULE_SETUP -#line 282 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 282 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, ICmpOp, ICMP); } YY_BREAK case 88: YY_RULE_SETUP -#line 283 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 283 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, FCmpOp, FCMP); } YY_BREAK case 89: YY_RULE_SETUP -#line 285 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 285 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return EQ; } YY_BREAK case 90: YY_RULE_SETUP -#line 286 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 286 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return NE; } YY_BREAK case 91: YY_RULE_SETUP -#line 287 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 287 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SLT; } YY_BREAK case 92: YY_RULE_SETUP -#line 288 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 288 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SGT; } YY_BREAK case 93: YY_RULE_SETUP -#line 289 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 289 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SLE; } YY_BREAK case 94: YY_RULE_SETUP -#line 290 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 290 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return SGE; } YY_BREAK case 95: YY_RULE_SETUP -#line 291 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 291 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ULT; } YY_BREAK case 96: YY_RULE_SETUP -#line 292 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 292 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UGT; } YY_BREAK case 97: YY_RULE_SETUP -#line 293 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 293 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ULE; } YY_BREAK case 98: YY_RULE_SETUP -#line 294 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 294 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UGE; } YY_BREAK case 99: YY_RULE_SETUP -#line 295 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 295 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OEQ; } YY_BREAK case 100: YY_RULE_SETUP -#line 296 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 296 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ONE; } YY_BREAK case 101: YY_RULE_SETUP -#line 297 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 297 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OLT; } YY_BREAK case 102: YY_RULE_SETUP -#line 298 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 298 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OGT; } YY_BREAK case 103: YY_RULE_SETUP -#line 299 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 299 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OLE; } YY_BREAK case 104: YY_RULE_SETUP -#line 300 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 300 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return OGE; } YY_BREAK case 105: YY_RULE_SETUP -#line 301 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 301 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return ORD; } YY_BREAK case 106: YY_RULE_SETUP -#line 302 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 302 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UNO; } YY_BREAK case 107: YY_RULE_SETUP -#line 303 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 303 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UEQ; } YY_BREAK case 108: YY_RULE_SETUP -#line 304 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 304 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UNE; } YY_BREAK case 109: YY_RULE_SETUP -#line 306 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 306 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, PHIOp, PHI_TOK); } YY_BREAK case 110: YY_RULE_SETUP -#line 307 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 307 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, CallOp, CALL); } YY_BREAK case 111: YY_RULE_SETUP -#line 308 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 308 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, CastOp, CAST); } YY_BREAK case 112: YY_RULE_SETUP -#line 309 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 309 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, TruncOp, TRUNC); } YY_BREAK case 113: YY_RULE_SETUP -#line 310 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 310 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, ZExtOp , ZEXT); } YY_BREAK case 114: YY_RULE_SETUP -#line 311 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 311 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, SExtOp, SEXT); } YY_BREAK case 115: YY_RULE_SETUP -#line 312 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 312 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); } YY_BREAK case 116: YY_RULE_SETUP -#line 313 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 313 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, FPExtOp, FPEXT); } YY_BREAK case 117: YY_RULE_SETUP -#line 314 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 314 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, FPToUIOp, FPTOUI); } YY_BREAK case 118: YY_RULE_SETUP -#line 315 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 315 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, FPToSIOp, FPTOSI); } YY_BREAK case 119: YY_RULE_SETUP -#line 316 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 316 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, UIToFPOp, UITOFP); } YY_BREAK case 120: YY_RULE_SETUP -#line 317 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 317 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, SIToFPOp, SITOFP); } YY_BREAK case 121: YY_RULE_SETUP -#line 318 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 318 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); } YY_BREAK case 122: YY_RULE_SETUP -#line 319 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 319 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); } YY_BREAK case 123: YY_RULE_SETUP -#line 320 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 320 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(CastOpVal, BitCastOp, BITCAST); } YY_BREAK case 124: YY_RULE_SETUP -#line 321 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 321 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, SelectOp, SELECT); } YY_BREAK case 125: YY_RULE_SETUP -#line 322 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 322 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return VANEXT_old; } YY_BREAK case 126: YY_RULE_SETUP -#line 323 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 323 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return VAARG_old; } YY_BREAK case 127: YY_RULE_SETUP -#line 324 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 324 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, VAArg , VAARG); } YY_BREAK case 128: YY_RULE_SETUP -#line 325 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 325 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(TermOpVal, RetOp, RET); } YY_BREAK case 129: YY_RULE_SETUP -#line 326 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 326 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(TermOpVal, BrOp, BR); } YY_BREAK case 130: YY_RULE_SETUP -#line 327 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 327 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(TermOpVal, SwitchOp, SWITCH); } YY_BREAK case 131: YY_RULE_SETUP -#line 328 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 328 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(TermOpVal, InvokeOp, INVOKE); } YY_BREAK case 132: YY_RULE_SETUP -#line 329 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 329 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return UNWIND; } YY_BREAK case 133: YY_RULE_SETUP -#line 330 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 330 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); } YY_BREAK case 134: YY_RULE_SETUP -#line 332 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 332 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, MallocOp, MALLOC); } YY_BREAK case 135: YY_RULE_SETUP -#line 333 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 333 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, AllocaOp, ALLOCA); } YY_BREAK case 136: YY_RULE_SETUP -#line 334 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 334 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, FreeOp, FREE); } YY_BREAK case 137: YY_RULE_SETUP -#line 335 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 335 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, LoadOp, LOAD); } YY_BREAK case 138: YY_RULE_SETUP -#line 336 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 336 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, StoreOp, STORE); } YY_BREAK case 139: YY_RULE_SETUP -#line 337 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 337 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); } YY_BREAK case 140: YY_RULE_SETUP -#line 339 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); } YY_BREAK case 141: YY_RULE_SETUP -#line 340 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 340 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); } YY_BREAK case 142: YY_RULE_SETUP -#line 341 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 341 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); } YY_BREAK case 143: YY_RULE_SETUP -#line 344 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 344 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { UnEscapeLexed(yytext+1); Upgradelval.StrVal = strdup(yytext+1); // Skip % @@ -2042,7 +2042,7 @@ YY_BREAK case 144: YY_RULE_SETUP -#line 349 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 349 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { yytext[strlen(yytext)-1] = 0; // nuke colon UnEscapeLexed(yytext); @@ -2052,7 +2052,7 @@ YY_BREAK case 145: YY_RULE_SETUP -#line 355 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 355 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { yytext[strlen(yytext)-2] = 0; // nuke colon, end quote UnEscapeLexed(yytext+1); @@ -2062,7 +2062,7 @@ YY_BREAK case 146: YY_RULE_SETUP -#line 362 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 362 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { // Note that we cannot unescape a string constant here! The // string constant might contain a \00 which would not be // understood by the string stuff. It is valid to make a @@ -2075,12 +2075,12 @@ YY_BREAK case 147: YY_RULE_SETUP -#line 373 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 373 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; } YY_BREAK case 148: YY_RULE_SETUP -#line 374 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 374 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+1); // +1: we have bigger negative range @@ -2092,7 +2092,7 @@ YY_BREAK case 149: YY_RULE_SETUP -#line 382 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 382 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.UInt64Val = HexIntToVal(yytext+3); return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; @@ -2100,7 +2100,7 @@ YY_BREAK case 150: YY_RULE_SETUP -#line 387 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 387 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -2111,7 +2111,7 @@ YY_BREAK case 151: YY_RULE_SETUP -#line 394 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 394 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+2); // +1: we have bigger negative range @@ -2123,16 +2123,16 @@ YY_BREAK case 152: YY_RULE_SETUP -#line 403 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 403 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.FPVal = atof(yytext); return FPVAL; } YY_BREAK case 153: YY_RULE_SETUP -#line 404 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 404 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.FPVal = HexToFP(yytext); return FPVAL; } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 406 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 406 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { /* Make sure to free the internal buffers for flex when we are * done reading our input! @@ -2143,17 +2143,17 @@ YY_BREAK case 154: YY_RULE_SETUP -#line 414 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 414 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { /* Ignore whitespace */ } YY_BREAK case 155: YY_RULE_SETUP -#line 415 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 415 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return yytext[0]; } YY_BREAK case 156: YY_RULE_SETUP -#line 417 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 417 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK #line 2160 "UpgradeLexer.cpp" @@ -3034,5 +3034,5 @@ return 0; } #endif -#line 417 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeLexer.l" +#line 417 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" Index: llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.55 llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.56 --- llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.55 Sat Feb 3 19:12:11 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs Mon Feb 5 14:47:21 2007 @@ -370,14 +370,14 @@ /* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 14 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" #include "UpgradeInternals.h" #include "llvm/CallingConv.h" #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" @@ -672,8 +672,10 @@ LookupName = I->second; else LookupName = Name; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - V = SymTab.lookup(Ty, LookupName); + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + V = SymTab.lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } if (!V) { RenameMapType::const_iterator I = CurModule.RenameMap.find(Key); @@ -682,9 +684,11 @@ LookupName = I->second; else LookupName = Name; - V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName); + V = CurModule.CurrentModule->getValueSymbolTable().lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } - if (V == 0) + if (!V) return 0; D.destroy(); // Free old strdup'd memory... @@ -776,7 +780,7 @@ // Remember where this forward reference came from. FIXME, shouldn't we try // to recycle these things?? CurModule.PlaceHolderInfo.insert( - std::make_pair(V, std::make_pair(ID, Upgradelineno-1))); + std::make_pair(V, std::make_pair(ID, Upgradelineno))); if (inFunctionScope()) InsertValue(V, CurFun.LateResolveValues); @@ -808,7 +812,7 @@ case ValID::NameVal: // Is it a named definition? Name = ID.Name; if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) { + getValueSymbolTable().lookup(Name)) { if (N->getType() != Type::LabelTy) error("Name '" + Name + "' does not refer to a BasicBlock"); BB = cast(N); @@ -1042,16 +1046,8 @@ assert(inFunctionScope() && "Must be in function scope"); // Search the function's symbol table for an existing value of this name - Value* Existing = 0; - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end(); - for ( ; PI != PE; ++PI) { - SymbolTable::value_const_iterator VI = PI->second.find(Name); - if (VI != PI->second.end()) { - Existing = VI->second; - break; - } - } + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + Value* Existing = ST.lookup(Name); 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. @@ -1811,7 +1807,7 @@ #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 1435 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1431 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; @@ -1854,7 +1850,7 @@ llvm::Module::Endianness Endianness; } YYSTYPE; /* Line 196 of yacc.c. */ -#line 1858 "UpgradeParser.tab.c" +#line 1854 "UpgradeParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -1866,7 +1862,7 @@ /* Line 219 of yacc.c. */ -#line 1870 "UpgradeParser.tab.c" +#line 1866 "UpgradeParser.tab.c" #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ @@ -2224,37 +2220,37 @@ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 1575, 1575, 1576, 1584, 1585, 1595, 1595, 1595, 1595, - 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1599, 1599, 1599, - 1603, 1603, 1603, 1603, 1603, 1603, 1607, 1607, 1608, 1608, - 1609, 1609, 1610, 1610, 1611, 1611, 1615, 1615, 1616, 1616, - 1617, 1617, 1618, 1618, 1619, 1619, 1620, 1620, 1621, 1621, - 1622, 1623, 1626, 1626, 1626, 1626, 1630, 1630, 1630, 1630, - 1630, 1630, 1630, 1631, 1631, 1631, 1631, 1631, 1631, 1637, - 1637, 1637, 1637, 1641, 1641, 1641, 1641, 1645, 1645, 1649, - 1649, 1654, 1657, 1662, 1663, 1664, 1665, 1666, 1667, 1668, - 1669, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1690, - 1691, 1699, 1700, 1708, 1717, 1718, 1725, 1726, 1730, 1734, - 1750, 1751, 1758, 1759, 1766, 1774, 1774, 1774, 1774, 1774, - 1774, 1774, 1775, 1775, 1775, 1775, 1775, 1780, 1784, 1788, - 1793, 1802, 1822, 1828, 1841, 1850, 1854, 1865, 1869, 1882, - 1886, 1893, 1894, 1900, 1907, 1919, 1949, 1962, 1985, 2013, - 2035, 2046, 2068, 2079, 2088, 2093, 2151, 2158, 2166, 2173, - 2180, 2184, 2188, 2197, 2212, 2225, 2234, 2262, 2275, 2284, - 2290, 2296, 2307, 2313, 2319, 2330, 2331, 2340, 2341, 2353, - 2362, 2363, 2364, 2365, 2366, 2382, 2402, 2404, 2406, 2406, - 2413, 2413, 2420, 2420, 2427, 2427, 2435, 2437, 2439, 2444, - 2458, 2459, 2463, 2466, 2474, 2478, 2485, 2489, 2493, 2497, - 2505, 2505, 2509, 2510, 2514, 2522, 2527, 2535, 2536, 2543, - 2550, 2554, 2669, 2669, 2673, 2683, 2683, 2687, 2691, 2693, - 2694, 2698, 2698, 2710, 2711, 2716, 2717, 2718, 2719, 2720, - 2721, 2722, 2723, 2724, 2745, 2748, 2763, 2764, 2769, 2769, - 2777, 2786, 2789, 2798, 2808, 2813, 2822, 2833, 2833, 2836, - 2839, 2842, 2846, 2852, 2867, 2873, 2929, 2932, 2938, 2948, - 2961, 2990, 2998, 3006, 3010, 3017, 3018, 3022, 3025, 3031, - 3048, 3064, 3078, 3090, 3102, 3113, 3131, 3140, 3149, 3156, - 3177, 3201, 3207, 3213, 3219, 3235, 3313, 3321, 3322, 3326, - 3327, 3331, 3337, 3343, 3349, 3355, 3362, 3374, 3388 + 0, 1571, 1571, 1572, 1580, 1581, 1591, 1591, 1591, 1591, + 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1595, 1595, 1595, + 1599, 1599, 1599, 1599, 1599, 1599, 1603, 1603, 1604, 1604, + 1605, 1605, 1606, 1606, 1607, 1607, 1611, 1611, 1612, 1612, + 1613, 1613, 1614, 1614, 1615, 1615, 1616, 1616, 1617, 1617, + 1618, 1619, 1622, 1622, 1622, 1622, 1626, 1626, 1626, 1626, + 1626, 1626, 1626, 1627, 1627, 1627, 1627, 1627, 1627, 1633, + 1633, 1633, 1633, 1637, 1637, 1637, 1637, 1641, 1641, 1645, + 1645, 1650, 1653, 1658, 1659, 1660, 1661, 1662, 1663, 1664, + 1665, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1686, + 1687, 1695, 1696, 1704, 1713, 1714, 1721, 1722, 1726, 1730, + 1746, 1747, 1754, 1755, 1762, 1770, 1770, 1770, 1770, 1770, + 1770, 1770, 1771, 1771, 1771, 1771, 1771, 1776, 1780, 1784, + 1789, 1798, 1818, 1824, 1837, 1846, 1850, 1861, 1865, 1878, + 1882, 1889, 1890, 1896, 1903, 1915, 1945, 1958, 1981, 2009, + 2031, 2042, 2064, 2075, 2084, 2089, 2147, 2154, 2162, 2169, + 2176, 2180, 2184, 2193, 2208, 2221, 2230, 2258, 2271, 2280, + 2286, 2292, 2303, 2309, 2315, 2326, 2327, 2336, 2337, 2349, + 2358, 2359, 2360, 2361, 2362, 2378, 2398, 2400, 2402, 2402, + 2409, 2409, 2416, 2416, 2423, 2423, 2431, 2433, 2435, 2440, + 2454, 2455, 2459, 2462, 2470, 2474, 2481, 2485, 2489, 2493, + 2501, 2501, 2505, 2506, 2510, 2518, 2523, 2531, 2532, 2539, + 2546, 2550, 2686, 2686, 2690, 2700, 2700, 2704, 2708, 2710, + 2711, 2715, 2715, 2727, 2728, 2733, 2734, 2735, 2736, 2737, + 2738, 2739, 2740, 2741, 2762, 2765, 2780, 2781, 2786, 2786, + 2794, 2803, 2806, 2815, 2825, 2830, 2839, 2850, 2850, 2853, + 2856, 2859, 2863, 2869, 2884, 2890, 2946, 2949, 2955, 2965, + 2978, 3007, 3015, 3023, 3027, 3034, 3035, 3039, 3042, 3048, + 3065, 3081, 3095, 3107, 3119, 3130, 3148, 3157, 3166, 3173, + 3194, 3218, 3224, 3230, 3236, 3252, 3330, 3338, 3339, 3343, + 3344, 3348, 3354, 3360, 3366, 3372, 3379, 3391, 3405 }; #endif @@ -3660,7 +3656,7 @@ switch (yyn) { case 3: -#line 1576 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1572 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX) // Outside of my range! error("Value too large for type"); @@ -3669,7 +3665,7 @@ break; case 5: -#line 1585 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1581 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX) // Outside of my range! error("Value too large for type"); @@ -3678,226 +3674,226 @@ break; case 26: -#line 1607 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1603 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_EQ; ;} break; case 27: -#line 1607 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1603 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_NE; ;} break; case 28: -#line 1608 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1604 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_SLT; ;} break; case 29: -#line 1608 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1604 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_SGT; ;} break; case 30: -#line 1609 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1605 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_SLE; ;} break; case 31: -#line 1609 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1605 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_SGE; ;} break; case 32: -#line 1610 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1606 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_ULT; ;} break; case 33: -#line 1610 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1606 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_UGT; ;} break; case 34: -#line 1611 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1607 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_ULE; ;} break; case 35: -#line 1611 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1607 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.IPred) = ICmpInst::ICMP_UGE; ;} break; case 36: -#line 1615 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1611 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_OEQ; ;} break; case 37: -#line 1615 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1611 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_ONE; ;} break; case 38: -#line 1616 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1612 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_OLT; ;} break; case 39: -#line 1616 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1612 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_OGT; ;} break; case 40: -#line 1617 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1613 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_OLE; ;} break; case 41: -#line 1617 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1613 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_OGE; ;} break; case 42: -#line 1618 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1614 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_ORD; ;} break; case 43: -#line 1618 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1614 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_UNO; ;} break; case 44: -#line 1619 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1615 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_UEQ; ;} break; case 45: -#line 1619 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1615 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_UNE; ;} break; case 46: -#line 1620 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1616 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_ULT; ;} break; case 47: -#line 1620 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1616 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_UGT; ;} break; case 48: -#line 1621 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1617 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_ULE; ;} break; case 49: -#line 1621 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1617 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_UGE; ;} break; case 50: -#line 1622 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1618 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_TRUE; ;} break; case 51: -#line 1623 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1619 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FPred) = FCmpInst::FCMP_FALSE; ;} break; case 81: -#line 1654 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1650 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = (yyvsp[-1].StrVal); ;} break; case 82: -#line 1657 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1653 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = 0; ;} break; case 83: -#line 1662 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1658 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} break; case 84: -#line 1663 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1659 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} break; case 85: -#line 1664 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1660 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} break; case 86: -#line 1665 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1661 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} break; case 87: -#line 1666 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1662 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} break; case 88: -#line 1667 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1663 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} break; case 89: -#line 1668 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1664 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} break; case 90: -#line 1669 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1665 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} break; case 91: -#line 1673 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1669 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::C; ;} break; case 92: -#line 1674 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1670 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::C; ;} break; case 93: -#line 1675 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1671 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::CSRet; ;} break; case 94: -#line 1676 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1672 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::Fast; ;} break; case 95: -#line 1677 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1673 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::Cold; ;} break; case 96: -#line 1678 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1674 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::X86_StdCall; ;} break; case 97: -#line 1679 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1675 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.LastCC = (yyval.UIntVal) = OldCallingConv::X86_FastCall; ;} break; case 98: -#line 1680 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1676 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) error("Calling conv too large"); @@ -3906,12 +3902,12 @@ break; case 99: -#line 1690 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1686 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.UIntVal) = 0; ;} break; case 100: -#line 1691 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1687 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) @@ -3920,12 +3916,12 @@ break; case 101: -#line 1699 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1695 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.UIntVal) = 0; ;} break; case 102: -#line 1700 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1696 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.UIntVal) = (yyvsp[0].UInt64Val); if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) @@ -3934,7 +3930,7 @@ break; case 103: -#line 1708 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1704 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') @@ -3944,27 +3940,27 @@ break; case 104: -#line 1717 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1713 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = 0; ;} break; case 105: -#line 1718 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1714 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = (yyvsp[0].StrVal); ;} break; case 106: -#line 1725 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1721 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" {;} break; case 107: -#line 1726 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1722 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" {;} break; case 108: -#line 1730 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1726 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurGV->setSection((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -3972,7 +3968,7 @@ break; case 109: -#line 1734 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1730 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) error("Alignment must be a power of two"); @@ -3982,7 +3978,7 @@ break; case 111: -#line 1751 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1747 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); (yyval.TypeVal).S = Signless; @@ -3990,7 +3986,7 @@ break; case 113: -#line 1759 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1755 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); (yyval.TypeVal).S = Signless; @@ -3998,7 +3994,7 @@ break; case 114: -#line 1766 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1762 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!UpRefs.empty()) error("Invalid upreference in type: " + (*(yyvsp[0].TypeVal).T)->getDescription()); @@ -4007,7 +4003,7 @@ break; case 127: -#line 1780 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1776 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); (yyval.TypeVal).S = (yyvsp[0].PrimType).S; @@ -4015,7 +4011,7 @@ break; case 128: -#line 1784 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1780 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeVal).T = new PATypeHolder(OpaqueType::get()); (yyval.TypeVal).S = Signless; @@ -4023,7 +4019,7 @@ break; case 129: -#line 1788 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1784 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Named types are also simple types... const Type* tmp = getType((yyvsp[0].ValIDVal)); (yyval.TypeVal).T = new PATypeHolder(tmp); @@ -4032,7 +4028,7 @@ break; case 130: -#line 1793 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1789 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Type UpReference if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) error("Value out of range"); @@ -4045,7 +4041,7 @@ break; case 131: -#line 1802 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1798 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function derived type? std::vector Params; for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), @@ -4069,7 +4065,7 @@ break; case 132: -#line 1822 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1818 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Sized array type? (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(ArrayType::get((yyvsp[-1].TypeVal).T->get(), (unsigned)(yyvsp[-3].UInt64Val)))); @@ -4079,7 +4075,7 @@ break; case 133: -#line 1828 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1824 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Packed array type? const llvm::Type* ElemTy = (yyvsp[-1].TypeVal).T->get(); if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) @@ -4096,7 +4092,7 @@ break; case 134: -#line 1841 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1837 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Structure type? std::vector Elements; for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), @@ -4109,7 +4105,7 @@ break; case 135: -#line 1850 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1846 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Empty structure type? (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector())); (yyval.TypeVal).S = Signless; @@ -4117,7 +4113,7 @@ break; case 136: -#line 1854 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1850 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Packed Structure type? std::vector Elements; for (std::list::iterator I = (yyvsp[-2].TypeList)->begin(), @@ -4132,7 +4128,7 @@ break; case 137: -#line 1865 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1861 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Empty packed structure type? (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector(),true)); (yyval.TypeVal).S = Signless; @@ -4140,7 +4136,7 @@ break; case 138: -#line 1869 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1865 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Pointer type? if ((yyvsp[-1].TypeVal).T->get() == Type::LabelTy) error("Cannot form a pointer to a basic block"); @@ -4151,7 +4147,7 @@ break; case 139: -#line 1882 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1878 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeList) = new std::list(); (yyval.TypeList)->push_back((yyvsp[0].TypeVal)); @@ -4159,14 +4155,14 @@ break; case 140: -#line 1886 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1882 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back((yyvsp[0].TypeVal)); ;} break; case 142: -#line 1894 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1890 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { PATypeInfo VoidTI; VoidTI.T = new PATypeHolder(Type::VoidTy); @@ -4176,7 +4172,7 @@ break; case 143: -#line 1900 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1896 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeList) = new std::list(); PATypeInfo VoidTI; @@ -4187,14 +4183,14 @@ break; case 144: -#line 1907 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1903 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TypeList) = new std::list(); ;} break; case 145: -#line 1919 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1915 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal).T->get()); if (ATy == 0) @@ -4228,7 +4224,7 @@ break; case 146: -#line 1949 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1945 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal).T->get()); if (ATy == 0) @@ -4245,7 +4241,7 @@ break; case 147: -#line 1962 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1958 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal).T->get()); if (ATy == 0) @@ -4272,7 +4268,7 @@ break; case 148: -#line 1985 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1981 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr const PackedType *PTy = dyn_cast((yyvsp[-3].TypeVal).T->get()); if (PTy == 0) @@ -4304,7 +4300,7 @@ break; case 149: -#line 2013 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2009 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const StructType *STy = dyn_cast((yyvsp[-3].TypeVal).T->get()); if (STy == 0) @@ -4330,7 +4326,7 @@ break; case 150: -#line 2035 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2031 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const StructType *STy = dyn_cast((yyvsp[-2].TypeVal).T->get()); if (STy == 0) @@ -4345,7 +4341,7 @@ break; case 151: -#line 2046 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2042 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const StructType *STy = dyn_cast((yyvsp[-5].TypeVal).T->get()); if (STy == 0) @@ -4371,7 +4367,7 @@ break; case 152: -#line 2068 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2064 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const StructType *STy = dyn_cast((yyvsp[-4].TypeVal).T->get()); if (STy == 0) @@ -4386,7 +4382,7 @@ break; case 153: -#line 2079 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2075 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal).T->get()); if (PTy == 0) @@ -4399,7 +4395,7 @@ break; case 154: -#line 2088 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2084 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ConstVal).C = UndefValue::get((yyvsp[-1].TypeVal).T->get()); (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S; @@ -4408,7 +4404,7 @@ break; case 155: -#line 2093 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2089 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal).T->get()); if (Ty == 0) @@ -4470,7 +4466,7 @@ break; case 156: -#line 2151 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2147 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-1].TypeVal).T->get() != (yyvsp[0].ConstVal).C->getType()) error("Mismatched types for constant expression"); @@ -4481,7 +4477,7 @@ break; case 157: -#line 2158 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2154 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) @@ -4493,7 +4489,7 @@ break; case 158: -#line 2166 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2162 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants const Type *Ty = (yyvsp[-1].PrimType).T; if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].SInt64Val))) @@ -4504,7 +4500,7 @@ break; case 159: -#line 2173 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2169 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants const Type *Ty = (yyvsp[-1].PrimType).T; if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].UInt64Val))) @@ -4515,7 +4511,7 @@ break; case 160: -#line 2180 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2176 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, true); (yyval.ConstVal).S = Unsigned; @@ -4523,7 +4519,7 @@ break; case 161: -#line 2184 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2180 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, false); (yyval.ConstVal).S = Unsigned; @@ -4531,7 +4527,7 @@ break; case 162: -#line 2188 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2184 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Float & Double constants if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal))) error("Floating point constant invalid for type"); @@ -4541,7 +4537,7 @@ break; case 163: -#line 2197 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2193 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* SrcTy = (yyvsp[-3].ConstVal).C->getType(); const Type* DstTy = (yyvsp[-1].TypeVal).T->get(); @@ -4560,7 +4556,7 @@ break; case 164: -#line 2212 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2208 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-2].ConstVal).C->getType(); if (!isa(Ty)) @@ -4577,7 +4573,7 @@ break; case 165: -#line 2225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2221 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-5].ConstVal).C->getType()->isInteger() || cast((yyvsp[-5].ConstVal).C->getType())->getBitWidth() != 1) @@ -4590,7 +4586,7 @@ break; case 166: -#line 2234 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2230 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].ConstVal).C->getType(); if (Ty != (yyvsp[-1].ConstVal).C->getType()) @@ -4622,7 +4618,7 @@ break; case 167: -#line 2262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].ConstVal).C->getType(); if (Ty != (yyvsp[-1].ConstVal).C->getType()) @@ -4639,7 +4635,7 @@ break; case 168: -#line 2275 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2271 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].ConstVal).C->getType(); if (Ty != (yyvsp[-1].ConstVal).C->getType()) @@ -4652,7 +4648,7 @@ break; case 169: -#line 2284 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2280 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) error("icmp operand types must match"); @@ -4662,7 +4658,7 @@ break; case 170: -#line 2290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2286 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) error("fcmp operand types must match"); @@ -4672,7 +4668,7 @@ break; case 171: -#line 2296 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2292 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-1].ConstVal).C->getType()->isInteger() || cast((yyvsp[-1].ConstVal).C->getType())->getBitWidth() != 8) @@ -4687,7 +4683,7 @@ break; case 172: -#line 2307 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2303 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C)) error("Invalid extractelement operands"); @@ -4697,7 +4693,7 @@ break; case 173: -#line 2313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2309 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C)) error("Invalid insertelement operands"); @@ -4707,7 +4703,7 @@ break; case 174: -#line 2319 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2315 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C)) error("Invalid shufflevector operands"); @@ -4717,12 +4713,12 @@ break; case 175: -#line 2330 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2326 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); ;} break; case 176: -#line 2331 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2327 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ConstVector) = new std::vector(); (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); @@ -4730,17 +4726,17 @@ break; case 177: -#line 2340 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2336 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 178: -#line 2341 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2337 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 179: -#line 2353 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2349 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal); CurModule.ModuleDone(); @@ -4748,27 +4744,27 @@ break; case 180: -#line 2362 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2358 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); ;} break; case 181: -#line 2363 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2359 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;} break; case 182: -#line 2364 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2360 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); ;} break; case 183: -#line 2365 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2361 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;} break; case 184: -#line 2366 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2362 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ModuleVal) = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. @@ -4784,7 +4780,7 @@ break; case 185: -#line 2382 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2378 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: @@ -4808,19 +4804,19 @@ break; case 186: -#line 2402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2398 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function prototypes can be in const pool ;} break; case 187: -#line 2404 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2400 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Asm blocks can be in the const pool ;} break; case 188: -#line 2406 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2402 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].ConstVal).C == 0) error("Global value initializer is not a constant"); @@ -4829,14 +4825,14 @@ break; case 189: -#line 2410 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2406 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurGV = 0; ;} break; case 190: -#line 2413 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2409 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].TypeVal).T->get(); CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), Ty, 0); @@ -4845,14 +4841,14 @@ break; case 191: -#line 2417 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2413 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurGV = 0; ;} break; case 192: -#line 2420 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2416 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].TypeVal).T->get(); CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), Ty, 0); @@ -4861,14 +4857,14 @@ break; case 193: -#line 2424 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2420 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurGV = 0; ;} break; case 194: -#line 2427 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2423 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].TypeVal).T->get(); CurGV = @@ -4878,32 +4874,32 @@ break; case 195: -#line 2432 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2428 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurGV = 0; ;} break; case 196: -#line 2435 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2431 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 197: -#line 2437 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2433 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 198: -#line 2439 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2435 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 199: -#line 2444 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2440 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm(); char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); @@ -4918,24 +4914,24 @@ break; case 200: -#line 2458 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2454 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Endianness) = Module::BigEndian; ;} break; case 201: -#line 2459 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2455 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Endianness) = Module::LittleEndian; ;} break; case 202: -#line 2463 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2459 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurModule.setEndianness((yyvsp[0].Endianness)); ;} break; case 203: -#line 2466 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2462 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].UInt64Val) == 32) CurModule.setPointerSize(Module::Pointer32); @@ -4947,7 +4943,7 @@ break; case 204: -#line 2474 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2470 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4955,7 +4951,7 @@ break; case 205: -#line 2478 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2474 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4963,7 +4959,7 @@ break; case 207: -#line 2489 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2485 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4971,7 +4967,7 @@ break; case 208: -#line 2493 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2489 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); free((yyvsp[0].StrVal)); @@ -4979,17 +4975,17 @@ break; case 209: -#line 2497 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2493 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 213: -#line 2510 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2506 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = 0; ;} break; case 214: -#line 2514 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2510 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-1].TypeVal).T->get() == Type::VoidTy) error("void typed arguments are invalid"); @@ -4998,7 +4994,7 @@ break; case 215: -#line 2522 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2518 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[-2].ArgList); (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); @@ -5007,7 +5003,7 @@ break; case 216: -#line 2527 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2523 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = new std::vector >(); (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); @@ -5016,12 +5012,12 @@ break; case 217: -#line 2535 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2531 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[0].ArgList); ;} break; case 218: -#line 2536 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2532 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[-2].ArgList); PATypeInfo VoidTI; @@ -5032,7 +5028,7 @@ break; case 219: -#line 2543 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2539 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = new std::vector >(); PATypeInfo VoidTI; @@ -5043,12 +5039,12 @@ break; case 220: -#line 2550 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2546 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = 0; ;} break; case 221: -#line 2554 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2550 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { UnEscapeLexed((yyvsp[-5].StrVal)); std::string FunctionName((yyvsp[-5].StrVal)); @@ -5059,27 +5055,27 @@ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy) error("LLVM functions cannot return aggregate types"); - std::vector ParamTypeList; + std::vector ParamTyList; // In LLVM 2.0 the signatures of three varargs intrinsics changed to take // i8*. We check here for those names and override the parameter list // types to ensure the prototype is correct. if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if (FunctionName == "llvm.va_copy") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if ((yyvsp[-3].ArgList)) { // If there are arguments... for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I) { const Type *Ty = I->first.T->get(); - ParamTypeList.push_back(Ty); + ParamTyList.push_back(Ty); } } - bool isVarArg = - ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; - if (isVarArg) ParamTypeList.pop_back(); + bool isVarArg = ParamTyList.size() && ParamTyList.back() == Type::VoidTy; + if (isVarArg) + ParamTyList.pop_back(); // Convert the CSRet calling convention into the corresponding parameter // attribute. @@ -5089,7 +5085,7 @@ ParamAttrs.push_back(FunctionType::StructRetAttribute); // first arg } - const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg, + const FunctionType *FT = FunctionType::get(RetTy, ParamTyList, isVarArg, ParamAttrs); const PointerType *PFT = PointerType::get(FT); delete (yyvsp[-6].TypeVal).T; @@ -5110,18 +5106,37 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) - error("Redefinition of function '" + FunctionName + "'"); + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. Previously this was + // permitted because the symbol tables had "type planes" and names were + // distinct within a type plane. After PR411 was fixed, this is no + // longer the case. To resolve this we must rename this function. + // However, renaming it can cause problems if its linkage is external + // because it could cause a link failure. We warn about this. + std::string NewName = makeNameUnique(FunctionName); + warning("Renaming function '" + FunctionName + "' as '" + NewName + + "' may cause linkage errors"); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; + } else { + // The types are the same. Either the existing or the current function + // needs to be a forward declaration. If not, they're attempting to + // redefine a function. + if (!CurFun.isDeclare && !Fn->isDeclaration()) + error("Redefinition of function '" + FunctionName + "'"); - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) - for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); - AI != AE; ++AI) - AI->setName(""); - } else { // Not already defined? + // Make sure to strip off any argument names so we can't get conflicts. + if (Fn->isDeclaration()) + for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); + AI != AE; ++AI) + AI->setName(""); + } + } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -5152,8 +5167,10 @@ (yyvsp[-3].ArgList)->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator - I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I, ++ArgIt) { + Function::arg_iterator ArgEnd = Fn->arg_end(); + std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); + std::vector >::iterator E = (yyvsp[-3].ArgList)->end(); + for ( ; I != E && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->first.T; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... InsertValue(ArgIt); @@ -5164,7 +5181,7 @@ break; case 224: -#line 2673 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2690 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = CurFun.CurrentFunction; @@ -5175,29 +5192,29 @@ break; case 227: -#line 2687 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2704 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 229: -#line 2693 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2710 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;} break; case 230: -#line 2694 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2711 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;} break; case 231: -#line 2698 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.isDeclare = true; ;} break; case 232: -#line 2698 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = CurFun.CurrentFunction; CurFun.FunctionDone(); @@ -5206,57 +5223,57 @@ break; case 233: -#line 2710 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2727 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 234: -#line 2711 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2728 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 235: -#line 2716 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2733 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;} break; case 236: -#line 2717 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2734 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); ;} break; case 237: -#line 2718 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2735 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); ;} break; case 238: -#line 2719 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2736 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, true)); ;} break; case 239: -#line 2720 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2737 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, false)); ;} break; case 240: -#line 2721 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2738 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createNull(); ;} break; case 241: -#line 2722 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2739 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createUndef(); ;} break; case 242: -#line 2723 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createZeroInit(); ;} break; case 243: -#line 2724 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2741 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized packed vector const Type *ETy = (*(yyvsp[-1].ConstVector))[0].C->getType(); int NumElements = (yyvsp[-1].ConstVector)->size(); @@ -5281,14 +5298,14 @@ break; case 244: -#line 2745 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2762 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal).C); ;} break; case 245: -#line 2748 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2765 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); std::string AsmStr = std::string((yyvsp[-2].StrVal), End); @@ -5301,17 +5318,17 @@ break; case 246: -#line 2763 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2780 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); ;} break; case 247: -#line 2764 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2781 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); ;} break; case 250: -#line 2777 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2794 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.ValueVal).S = (yyvsp[-1].TypeVal).S; @@ -5321,21 +5338,21 @@ break; case 251: -#line 2786 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2803 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 252: -#line 2789 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2806 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Do not allow functions with 0 basic blocks (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 253: -#line 2798 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2815 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); InsertValue((yyvsp[0].TermInstVal)); @@ -5346,7 +5363,7 @@ break; case 254: -#line 2808 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2825 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].InstVal).I) (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal).I); @@ -5355,7 +5372,7 @@ break; case 255: -#line 2813 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2830 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); // Make sure to move the basic block to the correct location in the @@ -5368,7 +5385,7 @@ break; case 256: -#line 2822 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2839 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true); // Make sure to move the basic block to the correct location in the @@ -5381,21 +5398,21 @@ break; case 259: -#line 2836 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2853 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with a result... (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal).V); ;} break; case 260: -#line 2839 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2856 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with no result... (yyval.TermInstVal) = new ReturnInst(); ;} break; case 261: -#line 2842 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2859 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Unconditional Branch... BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); (yyval.TermInstVal) = new BranchInst(tmpBB); @@ -5403,7 +5420,7 @@ break; case 262: -#line 2846 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2863 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); @@ -5413,7 +5430,7 @@ break; case 263: -#line 2852 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2869 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { Value* tmpVal = getVal((yyvsp[-7].PrimType).T, (yyvsp[-6].ValIDVal)); BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); @@ -5432,7 +5449,7 @@ break; case 264: -#line 2867 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2884 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { Value* tmpVal = getVal((yyvsp[-6].PrimType).T, (yyvsp[-5].ValIDVal)); BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); @@ -5442,7 +5459,7 @@ break; case 265: -#line 2874 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2891 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -5501,21 +5518,21 @@ break; case 266: -#line 2929 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2946 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TermInstVal) = new UnwindInst(); ;} break; case 267: -#line 2932 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2949 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TermInstVal) = new UnreachableInst(); ;} break; case 268: -#line 2938 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2955 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.JumpTable) = (yyvsp[-5].JumpTable); Constant *V = cast(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal))); @@ -5529,7 +5546,7 @@ break; case 269: -#line 2948 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2965 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.JumpTable) = new std::vector >(); Constant *V = cast(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal))); @@ -5543,7 +5560,7 @@ break; case 270: -#line 2961 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 2978 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { bool omit = false; if ((yyvsp[-1].StrVal)) @@ -5575,7 +5592,7 @@ break; case 271: -#line 2990 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3007 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for PHI nodes (yyval.PHIList).P = new std::list >(); (yyval.PHIList).S = (yyvsp[-5].TypeVal).S; @@ -5587,7 +5604,7 @@ break; case 272: -#line 2998 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3015 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.PHIList) = (yyvsp[-6].PHIList); Value* tmpVal = getVal((yyvsp[-6].PHIList).P->front().first->getType(), (yyvsp[-3].ValIDVal)); @@ -5597,7 +5614,7 @@ break; case 273: -#line 3006 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3023 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for call statements, and memory insts... (yyval.ValueList) = new std::vector(); (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); @@ -5605,7 +5622,7 @@ break; case 274: -#line 3010 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3027 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = (yyvsp[-2].ValueList); (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal)); @@ -5613,26 +5630,26 @@ break; case 276: -#line 3018 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3035 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = 0; ;} break; case 277: -#line 3022 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3039 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 278: -#line 3025 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3042 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 279: -#line 3031 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3048 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].TypeVal).T->get(); if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa(Ty)) @@ -5653,7 +5670,7 @@ break; case 280: -#line 3048 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3065 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (!Ty->isInteger()) { @@ -5673,7 +5690,7 @@ break; case 281: -#line 3064 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3081 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].TypeVal).T->get(); if(isa(Ty)) @@ -5691,7 +5708,7 @@ break; case 282: -#line 3078 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3095 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (isa(Ty)) @@ -5707,7 +5724,7 @@ break; case 283: -#line 3090 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3107 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (isa(Ty)) @@ -5723,7 +5740,7 @@ break; case 284: -#line 3102 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3119 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { warning("Use of obsolete 'not' instruction: Replacing with 'xor"); const Type *Ty = (yyvsp[0].ValueVal).V->getType(); @@ -5738,7 +5755,7 @@ break; case 285: -#line 3113 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3130 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[0].ValueVal).V->getType()->isInteger() || cast((yyvsp[0].ValueVal).V->getType())->getBitWidth() != 8) @@ -5760,7 +5777,7 @@ break; case 286: -#line 3131 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3148 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *DstTy = (yyvsp[0].TypeVal).T->get(); if (!DstTy->isFirstClassType()) @@ -5773,7 +5790,7 @@ break; case 287: -#line 3140 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3157 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].ValueVal).V->getType()->isInteger() || cast((yyvsp[-4].ValueVal).V->getType())->getBitWidth() != 1) @@ -5786,7 +5803,7 @@ break; case 288: -#line 3149 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3166 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].TypeVal).T->get(); NewVarArgs = true; @@ -5797,7 +5814,7 @@ break; case 289: -#line 3156 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3173 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType(); const Type* DstTy = (yyvsp[0].TypeVal).T->get(); @@ -5822,7 +5839,7 @@ break; case 290: -#line 3177 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3194 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType(); const Type* DstTy = (yyvsp[0].TypeVal).T->get(); @@ -5850,7 +5867,7 @@ break; case 291: -#line 3201 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3218 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid extractelement operands"); @@ -5860,7 +5877,7 @@ break; case 292: -#line 3207 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3224 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid insertelement operands"); @@ -5870,7 +5887,7 @@ break; case 293: -#line 3213 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3230 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid shufflevector operands"); @@ -5880,7 +5897,7 @@ break; case 294: -#line 3219 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3236 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].PHIList).P->front().first->getType(); if (!Ty->isFirstClassType()) @@ -5900,7 +5917,7 @@ break; case 295: -#line 3235 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3252 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Handle the short call syntax @@ -5982,34 +5999,34 @@ break; case 296: -#line 3313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3330 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.InstVal) = (yyvsp[0].InstVal); ;} break; case 297: -#line 3321 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3338 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = (yyvsp[0].ValueList); ;} break; case 298: -#line 3322 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = new std::vector(); ;} break; case 299: -#line 3326 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3343 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 300: -#line 3327 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3344 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 301: -#line 3331 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3348 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6019,7 +6036,7 @@ break; case 302: -#line 3337 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3354 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-4].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-4].TypeVal).S; @@ -6029,7 +6046,7 @@ break; case 303: -#line 3343 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3360 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6039,7 +6056,7 @@ break; case 304: -#line 3349 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3366 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-4].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-4].TypeVal).S; @@ -6049,7 +6066,7 @@ break; case 305: -#line 3355 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3372 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *PTy = (yyvsp[0].ValueVal).V->getType(); if (!isa(PTy)) @@ -6060,7 +6077,7 @@ break; case 306: -#line 3362 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3379 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6076,7 +6093,7 @@ break; case 307: -#line 3374 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3391 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal).T->get()); if (!PTy) @@ -6094,7 +6111,7 @@ break; case 308: -#line 3388 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3405 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-2].TypeVal).T->get(); if (!isa(Ty)) @@ -6116,7 +6133,7 @@ } /* Line 1126 of yacc.c. */ -#line 6120 "UpgradeParser.tab.c" +#line 6137 "UpgradeParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -6384,7 +6401,7 @@ } -#line 3404 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 3421 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" int yyerror(const char *ErrorMsg) { Index: llvm/tools/llvm-upgrade/UpgradeParser.h.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.41 llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.42 --- llvm/tools/llvm-upgrade/UpgradeParser.h.cvs:1.41 Sat Feb 3 19:12:11 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.h.cvs Mon Feb 5 14:47:21 2007 @@ -335,7 +335,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 1435 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1431 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; Index: llvm/tools/llvm-upgrade/UpgradeParser.y diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.56 llvm/tools/llvm-upgrade/UpgradeParser.y:1.57 --- llvm/tools/llvm-upgrade/UpgradeParser.y:1.56 Sat Feb 3 19:05:23 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y Mon Feb 5 14:47:21 2007 @@ -17,7 +17,7 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" @@ -312,8 +312,10 @@ LookupName = I->second; else LookupName = Name; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - V = SymTab.lookup(Ty, LookupName); + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + V = SymTab.lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } if (!V) { RenameMapType::const_iterator I = CurModule.RenameMap.find(Key); @@ -322,9 +324,11 @@ LookupName = I->second; else LookupName = Name; - V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName); + V = CurModule.CurrentModule->getValueSymbolTable().lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } - if (V == 0) + if (!V) return 0; D.destroy(); // Free old strdup'd memory... @@ -416,7 +420,7 @@ // Remember where this forward reference came from. FIXME, shouldn't we try // to recycle these things?? CurModule.PlaceHolderInfo.insert( - std::make_pair(V, std::make_pair(ID, Upgradelineno-1))); + std::make_pair(V, std::make_pair(ID, Upgradelineno))); if (inFunctionScope()) InsertValue(V, CurFun.LateResolveValues); @@ -448,7 +452,7 @@ case ValID::NameVal: // Is it a named definition? Name = ID.Name; if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) { + getValueSymbolTable().lookup(Name)) { if (N->getType() != Type::LabelTy) error("Name '" + Name + "' does not refer to a BasicBlock"); BB = cast(N); @@ -682,16 +686,8 @@ assert(inFunctionScope() && "Must be in function scope"); // Search the function's symbol table for an existing value of this name - Value* Existing = 0; - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end(); - for ( ; PI != PE; ++PI) { - SymbolTable::value_const_iterator VI = PI->second.find(Name); - if (VI != PI->second.end()) { - Existing = VI->second; - break; - } - } + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + Value* Existing = ST.lookup(Name); 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. @@ -2561,27 +2557,27 @@ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy) error("LLVM functions cannot return aggregate types"); - std::vector ParamTypeList; + std::vector ParamTyList; // In LLVM 2.0 the signatures of three varargs intrinsics changed to take // i8*. We check here for those names and override the parameter list // types to ensure the prototype is correct. if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if (FunctionName == "llvm.va_copy") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if ($5) { // If there are arguments... for (std::vector >::iterator I = $5->begin(), E = $5->end(); I != E; ++I) { const Type *Ty = I->first.T->get(); - ParamTypeList.push_back(Ty); + ParamTyList.push_back(Ty); } } - bool isVarArg = - ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; - if (isVarArg) ParamTypeList.pop_back(); + bool isVarArg = ParamTyList.size() && ParamTyList.back() == Type::VoidTy; + if (isVarArg) + ParamTyList.pop_back(); // Convert the CSRet calling convention into the corresponding parameter // attribute. @@ -2591,7 +2587,7 @@ ParamAttrs.push_back(FunctionType::StructRetAttribute); // first arg } - const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg, + const FunctionType *FT = FunctionType::get(RetTy, ParamTyList, isVarArg, ParamAttrs); const PointerType *PFT = PointerType::get(FT); delete $2.T; @@ -2612,18 +2608,37 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) - error("Redefinition of function '" + FunctionName + "'"); + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. Previously this was + // permitted because the symbol tables had "type planes" and names were + // distinct within a type plane. After PR411 was fixed, this is no + // longer the case. To resolve this we must rename this function. + // However, renaming it can cause problems if its linkage is external + // because it could cause a link failure. We warn about this. + std::string NewName = makeNameUnique(FunctionName); + warning("Renaming function '" + FunctionName + "' as '" + NewName + + "' may cause linkage errors"); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; + } else { + // The types are the same. Either the existing or the current function + // needs to be a forward declaration. If not, they're attempting to + // redefine a function. + if (!CurFun.isDeclare && !Fn->isDeclaration()) + error("Redefinition of function '" + FunctionName + "'"); - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) - for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); - AI != AE; ++AI) - AI->setName(""); - } else { // Not already defined? + // Make sure to strip off any argument names so we can't get conflicts. + if (Fn->isDeclaration()) + for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); + AI != AE; ++AI) + AI->setName(""); + } + } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -2654,8 +2669,10 @@ $5->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator - I = $5->begin(), E = $5->end(); I != E; ++I, ++ArgIt) { + Function::arg_iterator ArgEnd = Fn->arg_end(); + std::vector >::iterator I = $5->begin(); + std::vector >::iterator E = $5->end(); + for ( ; I != E && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->first.T; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... InsertValue(ArgIt); Index: llvm/tools/llvm-upgrade/UpgradeParser.y.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.54 llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.55 --- llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.54 Sat Feb 3 19:12:11 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y.cvs Mon Feb 5 14:47:21 2007 @@ -17,7 +17,7 @@ #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" #include "llvm/Module.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" @@ -312,8 +312,10 @@ LookupName = I->second; else LookupName = Name; - SymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); - V = SymTab.lookup(Ty, LookupName); + ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); + V = SymTab.lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } if (!V) { RenameMapType::const_iterator I = CurModule.RenameMap.find(Key); @@ -322,9 +324,11 @@ LookupName = I->second; else LookupName = Name; - V = CurModule.CurrentModule->getValueSymbolTable().lookup(Ty, LookupName); + V = CurModule.CurrentModule->getValueSymbolTable().lookup(LookupName); + if (V && V->getType() != Ty) + V = 0; } - if (V == 0) + if (!V) return 0; D.destroy(); // Free old strdup'd memory... @@ -416,7 +420,7 @@ // Remember where this forward reference came from. FIXME, shouldn't we try // to recycle these things?? CurModule.PlaceHolderInfo.insert( - std::make_pair(V, std::make_pair(ID, Upgradelineno-1))); + std::make_pair(V, std::make_pair(ID, Upgradelineno))); if (inFunctionScope()) InsertValue(V, CurFun.LateResolveValues); @@ -448,7 +452,7 @@ case ValID::NameVal: // Is it a named definition? Name = ID.Name; if (Value *N = CurFun.CurrentFunction-> - getValueSymbolTable().lookup(Type::LabelTy, Name)) { + getValueSymbolTable().lookup(Name)) { if (N->getType() != Type::LabelTy) error("Name '" + Name + "' does not refer to a BasicBlock"); BB = cast(N); @@ -682,16 +686,8 @@ assert(inFunctionScope() && "Must be in function scope"); // Search the function's symbol table for an existing value of this name - Value* Existing = 0; - SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); - SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE =ST.plane_end(); - for ( ; PI != PE; ++PI) { - SymbolTable::value_const_iterator VI = PI->second.find(Name); - if (VI != PI->second.end()) { - Existing = VI->second; - break; - } - } + ValueSymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); + Value* Existing = ST.lookup(Name); 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. @@ -2561,27 +2557,27 @@ if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy) error("LLVM functions cannot return aggregate types"); - std::vector ParamTypeList; + std::vector ParamTyList; // In LLVM 2.0 the signatures of three varargs intrinsics changed to take // i8*. We check here for those names and override the parameter list // types to ensure the prototype is correct. if (FunctionName == "llvm.va_start" || FunctionName == "llvm.va_end") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if (FunctionName == "llvm.va_copy") { - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); - ParamTypeList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); + ParamTyList.push_back(PointerType::get(Type::Int8Ty)); } else if ($5) { // If there are arguments... for (std::vector >::iterator I = $5->begin(), E = $5->end(); I != E; ++I) { const Type *Ty = I->first.T->get(); - ParamTypeList.push_back(Ty); + ParamTyList.push_back(Ty); } } - bool isVarArg = - ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; - if (isVarArg) ParamTypeList.pop_back(); + bool isVarArg = ParamTyList.size() && ParamTyList.back() == Type::VoidTy; + if (isVarArg) + ParamTyList.pop_back(); // Convert the CSRet calling convention into the corresponding parameter // attribute. @@ -2591,7 +2587,7 @@ ParamAttrs.push_back(FunctionType::StructRetAttribute); // first arg } - const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg, + const FunctionType *FT = FunctionType::get(RetTy, ParamTyList, isVarArg, ParamAttrs); const PointerType *PFT = PointerType::get(FT); delete $2.T; @@ -2612,18 +2608,37 @@ CurModule.CurrentModule->getFunctionList().remove(Fn); CurModule.CurrentModule->getFunctionList().push_back(Fn); } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { - // If this is the case, either we need to be a forward decl, or it needs - // to be. - if (!CurFun.isDeclare && !Fn->isDeclaration()) - error("Redefinition of function '" + FunctionName + "'"); + (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { + if (Fn->getFunctionType() != FT ) { + // The existing function doesn't have the same type. Previously this was + // permitted because the symbol tables had "type planes" and names were + // distinct within a type plane. After PR411 was fixed, this is no + // longer the case. To resolve this we must rename this function. + // However, renaming it can cause problems if its linkage is external + // because it could cause a link failure. We warn about this. + std::string NewName = makeNameUnique(FunctionName); + warning("Renaming function '" + FunctionName + "' as '" + NewName + + "' may cause linkage errors"); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; + } else { + // The types are the same. Either the existing or the current function + // needs to be a forward declaration. If not, they're attempting to + // redefine a function. + if (!CurFun.isDeclare && !Fn->isDeclaration()) + error("Redefinition of function '" + FunctionName + "'"); - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) - for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); - AI != AE; ++AI) - AI->setName(""); - } else { // Not already defined? + // Make sure to strip off any argument names so we can't get conflicts. + if (Fn->isDeclaration()) + for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); + AI != AE; ++AI) + AI->setName(""); + } + } else { // Not already defined? Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, CurModule.CurrentModule); @@ -2654,8 +2669,10 @@ $5->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator - I = $5->begin(), E = $5->end(); I != E; ++I, ++ArgIt) { + Function::arg_iterator ArgEnd = Fn->arg_end(); + std::vector >::iterator I = $5->begin(); + std::vector >::iterator E = $5->end(); + for ( ; I != E && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->first.T; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... InsertValue(ArgIt); From reid at x10sys.com Mon Feb 5 14:48:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:35 -0600 Subject: [llvm-commits] CVS: llvm/tools/opt/opt.cpp Message-ID: <200702052048.l15KmZj6001307@zion.cs.uiuc.edu> Changes in directory llvm/tools/opt: opt.cpp updated: 1.129 -> 1.130 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -1) opt.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/tools/opt/opt.cpp diff -u llvm/tools/opt/opt.cpp:1.129 llvm/tools/opt/opt.cpp:1.130 --- llvm/tools/opt/opt.cpp:1.129 Sat Feb 3 17:15:56 2007 +++ llvm/tools/opt/opt.cpp Mon Feb 5 14:47:22 2007 @@ -178,7 +178,6 @@ PM.add(createVerifierPass()); // Verify that input is correct addPass(PM, createLowerSetJmpPass()); // Lower llvm.setjmp/.longjmp - addPass(PM, createFunctionResolvingPass()); // Resolve (...) functions // If the -strip-debug command line option was specified, do it. if (StripDebug) From reid at x10sys.com Mon Feb 5 14:48:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:35 -0600 Subject: [llvm-commits] CVS: llvm/test/Integer/calltest_bt.ll Message-ID: <200702052048.l15KmZLp001302@zion.cs.uiuc.edu> Changes in directory llvm/test/Integer: calltest_bt.ll updated: 1.2 -> 1.3 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+4 -5) calltest_bt.ll | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) Index: llvm/test/Integer/calltest_bt.ll diff -u llvm/test/Integer/calltest_bt.ll:1.2 llvm/test/Integer/calltest_bt.ll:1.3 --- llvm/test/Integer/calltest_bt.ll:1.2 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/calltest_bt.ll Mon Feb 5 14:47:21 2007 @@ -5,7 +5,6 @@ %FunTy = type i28(i28) declare i28 @"test"(...) ; Test differences of prototype -declare i28 @"test"() ; Differ only by vararg implementation @@ -17,18 +16,18 @@ define i28 @"main"(i28 %argc) ; TODO: , sbyte **argv, sbyte **envp) begin - %retval = call i28 (i28) *@test(i28 %argc) + %retval = call i28 (i28) *@test2(i28 %argc) %two = add i28 %retval, %retval - %retval2 = invoke i28 @test(i28 %argc) + %retval2 = invoke i28 @test2(i28 %argc) to label %Next unwind label %Error Next: %two2 = add i28 %two, %retval2 - call void @invoke (%FunTy* @test) + call void @invoke (%FunTy* @test2) ret i28 %two2 Error: ret i28 -1 end -define i28 @"test"(i28 %i0) { +define i28 @"test2"(i28 %i0) { ret i28 %i0 } From reid at x10sys.com Mon Feb 5 14:48:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/CBackend.cpp Message-ID: <200702052048.l15KmZxp001312@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: CBackend.cpp updated: 1.324 -> 1.325 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -1) CBackend.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/lib/Target/CBackend/CBackend.cpp diff -u llvm/lib/Target/CBackend/CBackend.cpp:1.324 llvm/lib/Target/CBackend/CBackend.cpp:1.325 --- llvm/lib/Target/CBackend/CBackend.cpp:1.324 Thu Feb 1 20:16:22 2007 +++ llvm/lib/Target/CBackend/CBackend.cpp Mon Feb 5 14:47:20 2007 @@ -20,7 +20,6 @@ #include "llvm/Instructions.h" #include "llvm/Pass.h" #include "llvm/PassManager.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/Intrinsics.h" #include "llvm/IntrinsicInst.h" From reid at x10sys.com Mon Feb 5 14:48:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:35 -0600 Subject: [llvm-commits] CVS: llvm-stacker/lib/compiler/StackerParser.cpp.cvs StackerParser.h.cvs StackerParser.y StackerParser.y.cvs Message-ID: <200702052048.l15KmZmw001292@zion.cs.uiuc.edu> Changes in directory llvm-stacker/lib/compiler: StackerParser.cpp.cvs updated: 1.1 -> 1.2 StackerParser.h.cvs updated: 1.1 -> 1.2 StackerParser.y updated: 1.7 -> 1.8 StackerParser.y.cvs updated: 1.1 -> 1.2 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+508 -354) StackerParser.cpp.cvs | 845 +++++++++++++++++++++++++++++--------------------- StackerParser.h.cvs | 15 StackerParser.y | 1 StackerParser.y.cvs | 1 4 files changed, 508 insertions(+), 354 deletions(-) Index: llvm-stacker/lib/compiler/StackerParser.cpp.cvs diff -u llvm-stacker/lib/compiler/StackerParser.cpp.cvs:1.1 llvm-stacker/lib/compiler/StackerParser.cpp.cvs:1.2 --- llvm-stacker/lib/compiler/StackerParser.cpp.cvs:1.1 Wed Feb 15 01:26:07 2006 +++ llvm-stacker/lib/compiler/StackerParser.cpp.cvs Mon Feb 5 14:47:20 2007 @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 1.875c. */ +/* A Bison parser, made by GNU Bison 2.1. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. @@ -36,6 +36,9 @@ /* Identify Bison output. */ #define YYBISON 1 +/* Bison version. */ +#define YYBISON_VERSION "2.1" + /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -45,8 +48,7 @@ /* Using locations. */ #define YYLSP_NEEDED 0 -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ +/* Substitute the variable and function names. */ #define yyparse Stackerparse #define yylex Stackerlex #define yyerror Stackererror @@ -137,6 +139,7 @@ OUT_CHAR = 330 }; #endif +/* Tokens. */ #define INTEGER 258 #define STRING 259 #define IDENTIFIER 260 @@ -215,10 +218,9 @@ /* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" +#line 14 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" #include "StackerCompiler.h" -#include "llvm/SymbolTable.h" #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/ADT/STLExtras.h" @@ -249,8 +251,13 @@ # define YYERROR_VERBOSE 0 #endif +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 35 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" +#line 34 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" typedef union YYSTYPE { llvm::Module* ModuleVal; llvm::Function* FunctionVal; @@ -258,8 +265,8 @@ int64_t IntegerVal; char* StringVal; } YYSTYPE; -/* Line 191 of yacc.c. */ -#line 263 "StackerParser.tab.c" +/* Line 196 of yacc.c. */ +#line 270 "StackerParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -270,30 +277,49 @@ /* Copy the second part of user declarations. */ -/* Line 214 of yacc.c. */ -#line 275 "StackerParser.tab.c" +/* Line 219 of yacc.c. */ +#line 282 "StackerParser.tab.c" -#if ! defined (yyoverflow) || YYERROR_VERBOSE +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif -# ifndef YYFREE -# define YYFREE free +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif # endif -# ifndef YYMALLOC -# define YYMALLOC malloc +# ifndef YY_ +# define YY_(msgid) msgid # endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# endif -# else -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif # endif # endif # endif @@ -301,13 +327,39 @@ # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ # endif +# else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif # endif #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ @@ -319,7 +371,7 @@ /* A type that is properly aligned for any stack member. */ union yyalloc { - short yyss; + short int yyss; YYSTYPE yyvs; }; @@ -329,7 +381,7 @@ /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do @@ -342,7 +394,7 @@ # define YYCOPY(To, From, Count) \ do \ { \ - register YYSIZE_T yyi; \ + YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ @@ -371,7 +423,7 @@ #if defined (__STDC__) || defined (__cplusplus) typedef signed char yysigned_char; #else - typedef short yysigned_char; + typedef short int yysigned_char; #endif /* YYFINAL -- State number of the termination state. */ @@ -392,7 +444,7 @@ #define YYUNDEFTOK 2 #define YYMAXUTOK 330 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ @@ -476,20 +528,20 @@ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned char yyrline[] = { - 0, 70, 70, 70, 74, 75, 78, 79, 80, 83, - 86, 89, 92, 93, 99, 100, 101, 104, 105, 106, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169 + 0, 69, 69, 69, 73, 74, 77, 78, 79, 82, + 85, 88, 91, 92, 98, 99, 100, 103, 104, 105, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168 }; #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { @@ -511,7 +563,7 @@ # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ -static const unsigned short yytoknum[] = +static const unsigned short int yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, @@ -578,7 +630,7 @@ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -4 -static const short yypact[] = +static const short int yypact[] = { -4, 4, -4, -4, -2, 141, 52, -4, -4, -4, -4, -4, -4, 54, -3, 70, -4, -4, -4, -4, @@ -593,7 +645,7 @@ }; /* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = +static const short int yypgoto[] = { -4, -4, -4, -4, -4, -4, -4, -4, 135, -4 }; @@ -659,22 +711,6 @@ 63, 5, 61 }; -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -#endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int -#endif - #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) @@ -704,26 +740,59 @@ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up");\ + { \ + yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) + #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - ((Current).first_line = (Rhs)[1].first_line, \ - (Current).first_column = (Rhs)[1].first_column, \ - (Current).last_line = (Rhs)[N].last_line, \ - (Current).last_column = (Rhs)[N].last_column) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) #endif + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM @@ -746,19 +815,13 @@ YYFPRINTF Args; \ } while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) - -# define YYDSYMPRINTF(Title, Token, Value, Location) \ +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ - yysymprint (stderr, \ - Token, Value); \ + yysymprint (stderr, \ + Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) @@ -770,12 +833,12 @@ #if defined (__STDC__) || defined (__cplusplus) static void -yy_stack_print (short *bottom, short *top) +yy_stack_print (short int *bottom, short int *top) #else static void yy_stack_print (bottom, top) - short *bottom; - short *top; + short int *bottom; + short int *top; #endif { YYFPRINTF (stderr, "Stack now"); @@ -805,13 +868,13 @@ #endif { int yyi; - unsigned int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) - YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); - YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); } # define YY_REDUCE_PRINT(Rule) \ @@ -825,8 +888,7 @@ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ @@ -841,13 +903,9 @@ if the built-in stack extension method is used). Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ -#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif - #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif @@ -869,7 +927,7 @@ const char *yystr; # endif { - register const char *yys = yystr; + const char *yys = yystr; while (*yys++ != '\0') continue; @@ -894,8 +952,8 @@ const char *yysrc; # endif { - register char *yyd = yydest; - register const char *yys = yysrc; + char *yyd = yydest; + const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; @@ -905,7 +963,55 @@ # endif # endif -#endif /* !YYERROR_VERBOSE */ +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ @@ -929,15 +1035,15 @@ (void) yyvaluep; if (yytype < YYNTOKENS) - { - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - } + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif switch (yytype) { default: @@ -953,10 +1059,11 @@ #if defined (__STDC__) || defined (__cplusplus) static void -yydestruct (int yytype, YYSTYPE *yyvaluep) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void -yydestruct (yytype, yyvaluep) +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif @@ -964,6 +1071,10 @@ /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + switch (yytype) { @@ -991,10 +1102,10 @@ -/* The lookahead symbol. */ +/* The look-ahead symbol. */ int yychar; -/* The semantic value of the lookahead symbol. */ +/* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ @@ -1025,12 +1136,12 @@ #endif { - register int yystate; - register int yyn; + int yystate; + int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ + /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; /* Three stacks and their tools: @@ -1042,14 +1153,14 @@ to reallocate them elsewhere. */ /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; - register short *yyssp; + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; - register YYSTYPE *yyvsp; + YYSTYPE *yyvsp; @@ -1106,14 +1217,14 @@ these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; + short int *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", + yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), @@ -1124,21 +1235,21 @@ } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE - goto yyoverflowlab; + goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyoverflowlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { - short *yyss1 = yyss; + short int *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) - goto yyoverflowlab; + goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); @@ -1170,18 +1281,18 @@ yybackup: /* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ +/* Read a look-ahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to lookahead token. */ + /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; - /* Not known => get a lookahead token if don't already have one. */ + /* Not known => get a look-ahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); @@ -1196,7 +1307,7 @@ else { yytoken = YYTRANSLATE (yychar); - YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to @@ -1216,8 +1327,8 @@ if (yyn == YYFINAL) YYACCEPT; - /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) @@ -1267,405 +1378,406 @@ switch (yyn) { case 2: -#line 70 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" +#line 69 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" { SCI->handle_module_start( ); ;} break; case 3: -#line 71 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.ModuleVal = SCI->handle_module_end( yyvsp[0].ModuleVal ); ;} +#line 70 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.ModuleVal) = SCI->handle_module_end( (yyvsp[0].ModuleVal) ); ;} break; case 4: -#line 74 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.ModuleVal = SCI->handle_definition_list_end( yyvsp[-1].ModuleVal, yyvsp[0].FunctionVal ); ;} +#line 73 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.ModuleVal) = SCI->handle_definition_list_end( (yyvsp[-1].ModuleVal), (yyvsp[0].FunctionVal) ); ;} break; case 5: -#line 75 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.ModuleVal = SCI->handle_definition_list_start(); ;} +#line 74 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.ModuleVal) = SCI->handle_definition_list_start(); ;} break; case 6: -#line 78 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} +#line 77 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = (yyvsp[0].FunctionVal); ;} break; case 7: -#line 79 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} +#line 78 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = (yyvsp[0].FunctionVal); ;} break; case 8: -#line 80 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} +#line 79 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = (yyvsp[0].FunctionVal); ;} break; case 9: -#line 83 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = SCI->handle_forward( yyvsp[-1].StringVal ); ;} +#line 82 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = SCI->handle_forward( (yyvsp[-1].StringVal) ); ;} break; case 10: -#line 86 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = SCI->handle_main_definition(yyvsp[-1].FunctionVal); ;} +#line 85 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = SCI->handle_main_definition((yyvsp[-1].FunctionVal)); ;} break; case 11: -#line 89 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = SCI->handle_definition( yyvsp[-2].StringVal, yyvsp[-1].FunctionVal ); ;} +#line 88 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = SCI->handle_definition( (yyvsp[-2].StringVal), (yyvsp[-1].FunctionVal) ); ;} break; case 12: -#line 92 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = SCI->handle_word_list_end( yyvsp[-1].FunctionVal, yyvsp[0].BasicBlockVal ); ;} +#line 91 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = SCI->handle_word_list_end( (yyvsp[-1].FunctionVal), (yyvsp[0].BasicBlockVal) ); ;} break; case 13: -#line 93 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.FunctionVal = SCI->handle_word_list_start(); ;} +#line 92 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.FunctionVal) = SCI->handle_word_list_start(); ;} break; case 14: -#line 99 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_if( yyvsp[-3].StringVal, yyvsp[-1].StringVal ); ;} +#line 98 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_if( (yyvsp[-3].StringVal), (yyvsp[-1].StringVal) ); ;} break; case 15: -#line 100 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_if( yyvsp[-1].StringVal ); ;} +#line 99 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_if( (yyvsp[-1].StringVal) ); ;} break; case 16: -#line 101 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_while( yyvsp[-1].StringVal ); ;} +#line 100 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_while( (yyvsp[-1].StringVal) ); ;} break; case 17: -#line 104 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_identifier( yyvsp[0].StringVal ); ;} +#line 103 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_identifier( (yyvsp[0].StringVal) ); ;} break; case 18: -#line 105 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_string( yyvsp[0].StringVal ); ;} +#line 104 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_string( (yyvsp[0].StringVal) ); ;} break; case 19: -#line 106 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_integer( yyvsp[0].IntegerVal ); ;} +#line 105 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_integer( (yyvsp[0].IntegerVal) ); ;} break; case 20: -#line 109 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( TRUETOK ); ;} +#line 108 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( TRUETOK ); ;} break; case 21: -#line 110 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( FALSETOK ); ;} +#line 109 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( FALSETOK ); ;} break; case 22: -#line 111 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( LESS ); ;} +#line 110 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( LESS ); ;} break; case 23: -#line 112 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MORE ); ;} +#line 111 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MORE ); ;} break; case 24: -#line 113 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( LESS_EQUAL ); ;} +#line 112 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( LESS_EQUAL ); ;} break; case 25: -#line 114 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MORE_EQUAL ); ;} +#line 113 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MORE_EQUAL ); ;} break; case 26: -#line 115 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( NOT_EQUAL ); ;} +#line 114 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( NOT_EQUAL ); ;} break; case 27: -#line 116 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( EQUAL ); ;} +#line 115 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( EQUAL ); ;} break; case 28: -#line 117 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( PLUS ); ;} +#line 116 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( PLUS ); ;} break; case 29: -#line 118 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MINUS ); ;} +#line 117 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MINUS ); ;} break; case 30: -#line 119 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( INCR ); ;} +#line 118 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( INCR ); ;} break; case 31: -#line 120 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DECR ); ;} +#line 119 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DECR ); ;} break; case 32: -#line 121 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MULT ); ;} +#line 120 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MULT ); ;} break; case 33: -#line 122 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DIV ); ;} +#line 121 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DIV ); ;} break; case 34: -#line 123 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MODULUS ); ;} +#line 122 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MODULUS ); ;} break; case 35: -#line 124 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( NEGATE ); ;} +#line 123 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( NEGATE ); ;} break; case 36: -#line 125 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( ABS ); ;} +#line 124 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( ABS ); ;} break; case 37: -#line 126 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MIN ); ;} +#line 125 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MIN ); ;} break; case 38: -#line 127 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MAX ); ;} +#line 126 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MAX ); ;} break; case 39: -#line 128 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( STAR_SLASH ); ;} +#line 127 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( STAR_SLASH ); ;} break; case 40: -#line 129 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( AND ); ;} +#line 128 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( AND ); ;} break; case 41: -#line 130 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OR ); ;} +#line 129 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OR ); ;} break; case 42: -#line 131 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( XOR ); ;} +#line 130 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( XOR ); ;} break; case 43: -#line 132 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( LSHIFT ); ;} +#line 131 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( LSHIFT ); ;} break; case 44: -#line 133 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( RSHIFT ); ;} +#line 132 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( RSHIFT ); ;} break; case 45: -#line 134 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DROP ); ;} +#line 133 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DROP ); ;} break; case 46: -#line 135 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DROP2 ); ;} +#line 134 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DROP2 ); ;} break; case 47: -#line 136 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( NIP ); ;} +#line 135 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( NIP ); ;} break; case 48: -#line 137 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( NIP2 ); ;} +#line 136 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( NIP2 ); ;} break; case 49: -#line 138 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DUP ); ;} +#line 137 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DUP ); ;} break; case 50: -#line 139 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DUP2 ); ;} +#line 138 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DUP2 ); ;} break; case 51: -#line 140 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( SWAP ); ;} +#line 139 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( SWAP ); ;} break; case 52: -#line 141 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( SWAP2 ); ;} +#line 140 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( SWAP2 ); ;} break; case 53: -#line 142 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OVER ); ;} +#line 141 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OVER ); ;} break; case 54: -#line 143 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OVER2 ); ;} +#line 142 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OVER2 ); ;} break; case 55: -#line 144 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( ROT ); ;} +#line 143 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( ROT ); ;} break; case 56: -#line 145 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( ROT2 ); ;} +#line 144 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( ROT2 ); ;} break; case 57: -#line 146 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( RROT ); ;} +#line 145 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( RROT ); ;} break; case 58: -#line 147 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( RROT2 ); ;} +#line 146 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( RROT2 ); ;} break; case 59: -#line 148 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( TUCK ); ;} +#line 147 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( TUCK ); ;} break; case 60: -#line 149 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( TUCK2 ); ;} +#line 148 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( TUCK2 ); ;} break; case 61: -#line 150 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( ROLL ); ;} +#line 149 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( ROLL ); ;} break; case 62: -#line 151 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( PICK ); ;} +#line 150 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( PICK ); ;} break; case 63: -#line 152 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( SELECT ); ;} +#line 151 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( SELECT ); ;} break; case 64: -#line 153 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( MALLOC ); ;} +#line 152 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( MALLOC ); ;} break; case 65: -#line 154 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( FREE ); ;} +#line 153 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( FREE ); ;} break; case 66: -#line 155 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( GET ); ;} +#line 154 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( GET ); ;} break; case 67: -#line 156 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( PUT ); ;} +#line 155 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( PUT ); ;} break; case 68: -#line 157 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( RECURSE ); ;} +#line 156 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( RECURSE ); ;} break; case 69: -#line 158 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( RETURN ); ;} +#line 157 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( RETURN ); ;} break; case 70: -#line 159 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( EXIT ); ;} +#line 158 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( EXIT ); ;} break; case 71: -#line 160 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( TAB ); ;} +#line 159 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( TAB ); ;} break; case 72: -#line 161 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( SPACE ); ;} +#line 160 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( SPACE ); ;} break; case 73: -#line 162 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( CR ); ;} +#line 161 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( CR ); ;} break; case 74: -#line 163 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( IN_STR ); ;} +#line 162 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( IN_STR ); ;} break; case 75: -#line 164 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( IN_NUM ); ;} +#line 163 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( IN_NUM ); ;} break; case 76: -#line 165 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( IN_CHAR ); ;} +#line 164 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( IN_CHAR ); ;} break; case 77: -#line 166 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OUT_STR ); ;} +#line 165 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OUT_STR ); ;} break; case 78: -#line 167 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OUT_NUM ); ;} +#line 166 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OUT_NUM ); ;} break; case 79: -#line 168 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( OUT_CHAR ); ;} +#line 167 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( OUT_CHAR ); ;} break; case 80: -#line 169 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" - { yyval.BasicBlockVal = SCI->handle_word( DUMP ); ;} +#line 168 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" + { (yyval.BasicBlockVal) = SCI->handle_word( DUMP ); ;} break; + default: break; } -/* Line 1000 of yacc.c. */ -#line 1669 "StackerParser.tab.c" +/* Line 1126 of yacc.c. */ +#line 1781 "StackerParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -1704,12 +1816,36 @@ if (YYPACT_NINF < yyn && yyn < YYLAST) { - YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); - const char* yyprefix; - char *yymsg; + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; @@ -1717,81 +1853,91 @@ /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 0; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); - yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); - yycount += 1; - if (yycount == 5) + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { - yysize = 0; + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; break; } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; } - yysize += (sizeof ("syntax error, unexpected ") - + yystrlen (yytname[yytype])); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) - { - char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); - if (yycount < 5) + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) { - yyprefix = ", expecting "; - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - yyp = yystpcpy (yyp, yyprefix); - yyp = yystpcpy (yyp, yytname[yyx]); - yyprefix = " or "; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else - yyerror ("syntax error; also virtual memory exhausted"); + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } } else #endif /* YYERROR_VERBOSE */ - yyerror ("syntax error"); + yyerror (YY_("syntax error")); } if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an + /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { - /* If at end of input, pop the error token, - then the rest of the stack, then return failure. */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - for (;;) - { - YYPOPSTACK; - if (yyssp == yyss) - YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[*yyssp], yyvsp); - } + YYABORT; } else { - YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); - yydestruct (yytoken, &yylval); + yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; - } } - /* Else will try to reuse lookahead token after shifting the error + /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; @@ -1801,14 +1947,13 @@ `---------------------------------------------------*/ yyerrorlab: -#ifdef __GNUC__ - /* Pacify GCC when the user code never invokes YYERROR and the label - yyerrorlab therefore never appears in user code. */ + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ if (0) goto yyerrorlab; -#endif - yyvsp -= yylen; +yyvsp -= yylen; yyssp -= yylen; yystate = *yyssp; goto yyerrlab1; @@ -1838,8 +1983,8 @@ if (yyssp == yyss) YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[yystate], yyvsp); + + yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK; yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -1848,11 +1993,12 @@ if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); - *++yyvsp = yylval; + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yystate = yyn; goto yynewstate; @@ -1872,16 +2018,25 @@ goto yyreturn; #ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); @@ -1890,7 +2045,7 @@ } -#line 171 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" +#line 170 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" /* Handle messages a little more nicely than the default yyerror */ Index: llvm-stacker/lib/compiler/StackerParser.h.cvs diff -u llvm-stacker/lib/compiler/StackerParser.h.cvs:1.1 llvm-stacker/lib/compiler/StackerParser.h.cvs:1.2 --- llvm-stacker/lib/compiler/StackerParser.h.cvs:1.1 Wed Feb 15 01:26:07 2006 +++ llvm-stacker/lib/compiler/StackerParser.h.cvs Mon Feb 5 14:47:20 2007 @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 1.875c. */ +/* A Bison parser, made by GNU Bison 2.1. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. @@ -104,6 +104,7 @@ OUT_CHAR = 330 }; #endif +/* Tokens. */ #define INTEGER 258 #define STRING 259 #define IDENTIFIER 260 @@ -182,7 +183,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 35 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" +#line 34 "/proj/llvm/llvm-3/projects/llvm-stacker/lib/compiler/StackerParser.y" typedef union YYSTYPE { llvm::Module* ModuleVal; llvm::Function* FunctionVal; @@ -190,8 +191,8 @@ int64_t IntegerVal; char* StringVal; } YYSTYPE; -/* Line 1275 of yacc.c. */ -#line 195 "StackerParser.tab.h" +/* Line 1447 of yacc.c. */ +#line 196 "StackerParser.tab.h" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 Index: llvm-stacker/lib/compiler/StackerParser.y diff -u llvm-stacker/lib/compiler/StackerParser.y:1.7 llvm-stacker/lib/compiler/StackerParser.y:1.8 --- llvm-stacker/lib/compiler/StackerParser.y:1.7 Wed Sep 1 17:55:37 2004 +++ llvm-stacker/lib/compiler/StackerParser.y Mon Feb 5 14:47:20 2007 @@ -13,7 +13,6 @@ %{ #include "StackerCompiler.h" -#include "llvm/SymbolTable.h" #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/ADT/STLExtras.h" Index: llvm-stacker/lib/compiler/StackerParser.y.cvs diff -u llvm-stacker/lib/compiler/StackerParser.y.cvs:1.1 llvm-stacker/lib/compiler/StackerParser.y.cvs:1.2 --- llvm-stacker/lib/compiler/StackerParser.y.cvs:1.1 Wed Feb 15 01:26:07 2006 +++ llvm-stacker/lib/compiler/StackerParser.y.cvs Mon Feb 5 14:47:20 2007 @@ -13,7 +13,6 @@ %{ #include "StackerCompiler.h" -#include "llvm/SymbolTable.h" #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/ADT/STLExtras.h" From reid at x10sys.com Mon Feb 5 14:48:36 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 14:48:36 -0600 Subject: [llvm-commits] CVS: llvm/tools/gccld/GenerateCode.cpp Message-ID: <200702052048.l15KmavM001342@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: GenerateCode.cpp updated: 1.69 -> 1.70 --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -6) GenerateCode.cpp | 6 ------ 1 files changed, 6 deletions(-) Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.69 llvm/tools/gccld/GenerateCode.cpp:1.70 --- llvm/tools/gccld/GenerateCode.cpp:1.69 Sat Feb 3 17:06:03 2007 +++ llvm/tools/gccld/GenerateCode.cpp Mon Feb 5 14:47:21 2007 @@ -212,12 +212,6 @@ // Add an appropriate TargetData instance for this module... addPass(Passes, new TargetData(M)); - // Often if the programmer does not specify proper prototypes for the - // functions they are calling, they end up calling a vararg version of the - // function that does not get a body filled in (the real function has typed - // arguments). This pass merges the two functions. - addPass(Passes, createFunctionResolvingPass()); - if (!DisableOptimizations) { // Now that composite has been compiled, scan through the module, looking // for a main function. If main is defined, mark all other functions From llvm at cs.uiuc.edu Mon Feb 5 14:51:24 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Mon, 5 Feb 2007 14:51:24 -0600 Subject: [llvm-commits] CVS: llvm/test/Transforms/FunctionResolve/.cvsignore 2002-08-19-ResolveGlobalVars.ll 2002-08-19-ResolveGlobalVarsEasier.ll 2002-11-07-RetMismatch.ll 2002-11-09-ExternFn.ll 2003-04-18-ForwardDeclGlobal.ll 2003-05-21-MissingArguments.ll 2003-05-31-AllInternalDecls.ll 2003-05-31-FuncPointerResolve.ll 2003-05-31-InternalDecl.ll 2003-06-18-TypePromotion.ll 2003-07-23-CPR-Reference.ll 2003-08-23-ArgumentWarning.ll 2003-10-21-GlobalResolveHack.ll 2003-11-20-BogusResolveWarning.ll basictest.ll dg.exp retmismatch1.ll retmismatch2.ll retmismatch3.ll Message-ID: <200702052051.l15KpOhR001459@zion.cs.uiuc.edu> Changes in directory llvm/test/Transforms/FunctionResolve: .cvsignore (r1.1) removed 2002-08-19-ResolveGlobalVars.ll (r1.8) removed 2002-08-19-ResolveGlobalVarsEasier.ll (r1.6) removed 2002-11-07-RetMismatch.ll (r1.5) removed 2002-11-09-ExternFn.ll (r1.6) removed 2003-04-18-ForwardDeclGlobal.ll (r1.5) removed 2003-05-21-MissingArguments.ll (r1.3) removed 2003-05-31-AllInternalDecls.ll (r1.2) removed 2003-05-31-FuncPointerResolve.ll (r1.5) removed 2003-05-31-InternalDecl.ll (r1.5) removed 2003-06-18-TypePromotion.ll (r1.2) removed 2003-07-23-CPR-Reference.ll (r1.3) removed 2003-08-23-ArgumentWarning.ll (r1.5) removed 2003-10-21-GlobalResolveHack.ll (r1.4) removed 2003-11-20-BogusResolveWarning.ll (r1.2) removed basictest.ll (r1.5) removed dg.exp (r1.3) removed retmismatch1.ll (r1.6) removed retmismatch2.ll (r1.6) removed retmismatch3.ll (r1.4) removed --- Log message: For PR411: http://llvm.org/PR411 : This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. --- Diffs of the changes: (+0 -0) 0 files changed From llvm at cs.uiuc.edu Mon Feb 5 15:00:01 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Mon, 5 Feb 2007 15:00:01 -0600 Subject: [llvm-commits] CVS: llvm/test/Integer/calltest_bt.ll Message-ID: <200702052100.l15L01TU001620@zion.cs.uiuc.edu> Changes in directory llvm/test/Integer: calltest_bt.ll (r1.3) removed --- Log message: For PR411: http://llvm.org/PR411 : This test is not particularly useful without type planes. --- Diffs of the changes: (+0 -0) 0 files changed From clattner at apple.com Mon Feb 5 15:12:01 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 5 Feb 2007 13:12:01 -0800 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp In-Reply-To: <200702052024.l15KOoSu000515@zion.cs.uiuc.edu> References: <200702052024.l15KOoSu000515@zion.cs.uiuc.edu> Message-ID: > Create a pass to strip dead function declarations (prototypes). > This is > for use by llvm-extract and bugpoint. Nice, thanks! > + namespace { > + > + /// @brief Pass to remove unused function declarations. > + class StripDeadPrototypesPass : public ModulePass { Please use the horrible VISIBILITY_HIDDEN annotation thing. > + public: > + StripDeadPrototypesPass() { } > + virtual bool runOnModule(Module &M); > + }; > + RegisterPass X("strip-dead-prototypes", > + "Strip Unused Function > Prototypes"); > + > + bool StripDeadPrototypesPass::runOnModule(Module &M) { Pedantic: Please end the anonymous namespace before the out of line method. It doesn't need to be nested in the namespace, and this reduces the lexical size of the namespace. Thanks Reid! -Chris > + // Collect all the functions we want to erase > + std::vector FuncsToErase; > + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) > + if (I->isDeclaration() && // Function must be only a > prototype > + I->use_empty()) { // Function must not be used > + FuncsToErase.push_back(&(*I)); > + } > + > + // Erase the functions > + for (std::vector::iterator I = FuncsToErase.begin(), > + E = FuncsToErase.end(); I != E; ++I ) > + (*I)->eraseFromParent(); > + > + // Increment the statistic > + NumDeadPrototypes += FuncsToErase.size(); > + > + // Return an indication of whether we changed anything or not. > + return !FuncsToErase.empty(); > + } > + > + } // end anonymous namespace > + > + ModulePass *llvm::createStripDeadPrototypesPass() { > + return new StripDeadPrototypesPass(); > + } > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From baldrick at free.fr Mon Feb 5 15:17:13 2007 From: baldrick at free.fr (Duncan Sands) Date: Mon, 5 Feb 2007 22:17:13 +0100 Subject: [llvm-commits] llvm-gcc4: nested function support (w/o trampolines) Message-ID: <200702052217.14334.baldrick@free.fr> This patch adds support for nested subroutines, but not for trampolines (used for taking pointers to nested subroutines; implementing support for trampolines is more tricky since it needs help from the code generators). There are no changes to LLVM itself. The patch is quite simple because gcc already does the heavy lifting - all that's needed is to emit the static chains when converting to LLVM. The static chain is passed in a register as an additional parameter. For example, consider int nest(int n) { int a; void z(void) { a = 1; } z(); return a; } gcc turns z into void z(struct frame* chain) { chain->a = 1; } and nest into int nest(int n) { struct frame FRAME; int a; z(&FRAME); return FRAME.a; } where struct frame is a record with one integer field called "a". gcc introduces struct frame to hold all the local variables in the parent "nest" that are accessed by the child "z". It rewrites all references to these variables to refer to the corresponding FRAME fields instead, in both the parent and child. It leaves the old variable declarations on the stack (which is why "int a;" is still present), but since they are no longer used, the optimizers will remove them. This patch only touches emission of nested function bodies and calls to nested functions. It emits z as define internal void @z(%struct.frame* inreg %chain) {...} and the call becomes call void @z( %struct.frame* %FRAME inreg ) It doesn't try to teach ConvertType to correctly emit local function types, since gcc doesn't put enough information in the function type to do this, and it's not needed anyway since llvm-convert has enough "fix up dud prototypes" code to handle this situation too. There are a bunch of gcc testcases for nested functions. They all worked as expected [1], except for those involving variable sized objects (which blew up LLVM), and some twisted examples which blew up the gcc nested function code (i.e. long before reaching llvm-convert and this patch). The variable sized object problems don't seem to have anything to do with nested functions. Enjoy! Duncan. [1] For example, the tests using trampolines and/or non-local gotos failed: they are not yet supported. -------------- next part -------------- A non-text attachment was scrubbed... Name: nested.diff Type: text/x-diff Size: 9559 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070205/4781dc54/attachment.bin -------------- next part -------------- A non-text attachment was scrubbed... Name: testcase.diff Type: text/x-diff Size: 826 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070205/4781dc54/attachment-0001.bin From reid at x10sys.com Mon Feb 5 15:17:22 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:17:22 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Module.h Message-ID: <200702052117.l15LHMJX002091@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Module.h updated: 1.82 -> 1.83 --- Log message: For PR411: http://llvm.org/PR411 : Clean up the Module::getFunction interface. getMainFunction and getNamedFunction are now gone. Just use getFunction instead. --- Diffs of the changes: (+5 -14) Module.h | 19 +++++-------------- 1 files changed, 5 insertions(+), 14 deletions(-) Index: llvm/include/llvm/Module.h diff -u llvm/include/llvm/Module.h:1.82 llvm/include/llvm/Module.h:1.83 --- llvm/include/llvm/Module.h:1.82 Mon Feb 5 14:47:19 2007 +++ llvm/include/llvm/Module.h Mon Feb 5 15:17:06 2007 @@ -169,8 +169,11 @@ /// getOrInsertFunction - Look up the specified function in the module symbol /// table. If it does not exist, add a prototype for the function and return - /// it. This version of the method takes a null terminated list of function - /// arguments, which makes it easier for clients to use. + /// it. This function guarantees to return a constant of pointer to the + /// specified function type or a ConstantExpr BitCast of that type if the + /// named /// function has a different type. This version of the method + /// takes a null terminated list of function arguments, which makes it + /// easier for clients to use. Constant *getOrInsertFunction(const std::string &Name, const Type *RetTy,...) END_WITH_NULL; @@ -178,18 +181,6 @@ /// If it does not exist, return null. Function *getFunction(const std::string &Name) const; - /// getMainFunction - This function looks up main efficiently. This is such a - /// common case, that it is a method in Module. If main cannot be found, a - /// null pointer is returned. - Function *getMainFunction() { return getFunction("main"); } - - /// getNamedFunction - Return the first function in the module with the - /// specified name, of arbitrary type. This method returns null if a function - /// with the specified name is not found. - Function *getNamedFunction(const std::string &Name) const { - return getFunction(Name); - } - /// @} /// @name Global Variable Accessors /// @{ From reid at x10sys.com Mon Feb 5 15:18:09 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:18:09 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-extract/llvm-extract.cpp Message-ID: <200702052118.l15LI9V9002116@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-extract: llvm-extract.cpp updated: 1.35 -> 1.36 --- Log message: For PR411: http://llvm.org/PR411 : Change getNamedFunction -> getFunction Make llvm-extract run the StripDeadPrototypes pass. --- Diffs of the changes: (+2 -1) llvm-extract.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-extract/llvm-extract.cpp diff -u llvm/tools/llvm-extract/llvm-extract.cpp:1.35 llvm/tools/llvm-extract/llvm-extract.cpp:1.36 --- llvm/tools/llvm-extract/llvm-extract.cpp:1.35 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm-extract/llvm-extract.cpp Mon Feb 5 15:17:53 2007 @@ -64,7 +64,7 @@ } // Figure out which function we should extract - Function *F = M.get()->getNamedFunction(ExtractFunc); + Function *F = M.get()->getFunction(ExtractFunc); if (F == 0) { cerr << argv[0] << ": program doesn't contain function named '" << ExtractFunc << "'!\n"; @@ -80,6 +80,7 @@ if (!DeleteFn) Passes.add(createGlobalDCEPass()); // Delete unreachable globals Passes.add(createDeadTypeEliminationPass()); // Remove dead types... + Passes.add(createStripDeadPrototypesPass()); // Remove dead func decls std::ostream *Out = 0; From reid at x10sys.com Mon Feb 5 15:19:51 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:51 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm2cpp/CppWriter.cpp Message-ID: <200702052119.l15LJpRn002214@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm2cpp: CppWriter.cpp updated: 1.37 -> 1.38 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+2 -2) CppWriter.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/tools/llvm2cpp/CppWriter.cpp diff -u llvm/tools/llvm2cpp/CppWriter.cpp:1.37 llvm/tools/llvm2cpp/CppWriter.cpp:1.38 --- llvm/tools/llvm2cpp/CppWriter.cpp:1.37 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm2cpp/CppWriter.cpp Mon Feb 5 15:19:13 2007 @@ -1544,7 +1544,7 @@ } void CppWriter::printInline(const std::string& fname, const std::string& func) { - const Function* F = TheModule->getNamedFunction(func); + const Function* F = TheModule->getFunction(func); if (!F) { error(std::string("Function '") + func + "' not found in input module"); return; @@ -1719,7 +1719,7 @@ const std::string& fname, // Name of generated function const std::string& funcName // Name of function to generate ) { - const Function* F = TheModule->getNamedFunction(funcName); + const Function* F = TheModule->getFunction(funcName); if (!F) { error(std::string("Function '") + funcName + "' not found in input module"); return; From reid at x10sys.com Mon Feb 5 15:19:51 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Module.cpp Message-ID: <200702052119.l15LJpMN002219@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Module.cpp updated: 1.76 -> 1.77 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+2 -2) Module.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/Module.cpp diff -u llvm/lib/VMCore/Module.cpp:1.76 llvm/lib/VMCore/Module.cpp:1.77 --- llvm/lib/VMCore/Module.cpp:1.76 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/Module.cpp Mon Feb 5 15:19:13 2007 @@ -142,7 +142,7 @@ ValueSymbolTable &SymTab = getValueSymbolTable(); // See if we have a definition for the specified function already. - Function *F = dyn_cast_or_null(SymTab.lookup(Name)); + GlobalValue *F = dyn_cast_or_null(SymTab.lookup(Name)); if (F == 0) { // Nope, add it Function *New = new Function(Ty, GlobalVariable::ExternalLinkage, Name); @@ -160,7 +160,7 @@ // If the function exists but has the wrong type, return a bitcast to the // right type. - if (F->getFunctionType() != Ty) + if (F->getType() != PointerType::get(Ty)) return ConstantExpr::getBitCast(F, PointerType::get(Ty)); // Otherwise, we just found the existing function or a prototype. From reid at x10sys.com Mon Feb 5 15:19:52 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:52 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs UpgradeParser.y UpgradeParser.y.cvs Message-ID: <200702052119.l15LJqrX002228@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeParser.cpp.cvs updated: 1.56 -> 1.57 UpgradeParser.y updated: 1.57 -> 1.58 UpgradeParser.y.cvs updated: 1.55 -> 1.56 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+18 -18) UpgradeParser.cpp.cvs | 12 ++++++------ UpgradeParser.y | 12 ++++++------ UpgradeParser.y.cvs | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.56 llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.57 --- llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.56 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs Mon Feb 5 15:19:13 2007 @@ -929,7 +929,7 @@ if (const FunctionType *FTy = dyn_cast(PTy->getElementType())) if (Function *OtherF = - CurModule.CurrentModule->getNamedFunction(DID.getName())) + CurModule.CurrentModule->getFunction(DID.getName())) if (FuncTysDifferOnlyBySRet(FTy,OtherF->getFunctionType())) { V->replaceAllUsesWith(ConstantExpr::getBitCast(OtherF, PTy)); fixed = true; @@ -1677,10 +1677,10 @@ //Not all functions use vaarg, so make a second check for ObsoleteVarArgs { Function* F; - if ((F = Result->getNamedFunction("llvm.va_start")) + if ((F = Result->getFunction("llvm.va_start")) && F->getFunctionType()->getNumParams() == 0) ObsoleteVarArgs = true; - if((F = Result->getNamedFunction("llvm.va_copy")) + if((F = Result->getFunction("llvm.va_copy")) && F->getFunctionType()->getNumParams() == 1) ObsoleteVarArgs = true; } @@ -1691,7 +1691,7 @@ } if(ObsoleteVarArgs) { - if(Function* F = Result->getNamedFunction("llvm.va_start")) { + if(Function* F = Result->getFunction("llvm.va_start")) { if (F->arg_size() != 0) { error("Obsolete va_start takes 0 argument"); return 0; @@ -1720,7 +1720,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_end")) { + if(Function* F = Result->getFunction("llvm.va_end")) { if(F->arg_size() != 1) { error("Obsolete va_end takes 1 argument"); return 0; @@ -1746,7 +1746,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_copy")) { + if(Function* F = Result->getFunction("llvm.va_copy")) { if(F->arg_size() != 1) { error("Obsolete va_copy takes 1 argument"); return 0; Index: llvm/tools/llvm-upgrade/UpgradeParser.y diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.57 llvm/tools/llvm-upgrade/UpgradeParser.y:1.58 --- llvm/tools/llvm-upgrade/UpgradeParser.y:1.57 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y Mon Feb 5 15:19:13 2007 @@ -569,7 +569,7 @@ if (const FunctionType *FTy = dyn_cast(PTy->getElementType())) if (Function *OtherF = - CurModule.CurrentModule->getNamedFunction(DID.getName())) + CurModule.CurrentModule->getFunction(DID.getName())) if (FuncTysDifferOnlyBySRet(FTy,OtherF->getFunctionType())) { V->replaceAllUsesWith(ConstantExpr::getBitCast(OtherF, PTy)); fixed = true; @@ -1317,10 +1317,10 @@ //Not all functions use vaarg, so make a second check for ObsoleteVarArgs { Function* F; - if ((F = Result->getNamedFunction("llvm.va_start")) + if ((F = Result->getFunction("llvm.va_start")) && F->getFunctionType()->getNumParams() == 0) ObsoleteVarArgs = true; - if((F = Result->getNamedFunction("llvm.va_copy")) + if((F = Result->getFunction("llvm.va_copy")) && F->getFunctionType()->getNumParams() == 1) ObsoleteVarArgs = true; } @@ -1331,7 +1331,7 @@ } if(ObsoleteVarArgs) { - if(Function* F = Result->getNamedFunction("llvm.va_start")) { + if(Function* F = Result->getFunction("llvm.va_start")) { if (F->arg_size() != 0) { error("Obsolete va_start takes 0 argument"); return 0; @@ -1360,7 +1360,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_end")) { + if(Function* F = Result->getFunction("llvm.va_end")) { if(F->arg_size() != 1) { error("Obsolete va_end takes 1 argument"); return 0; @@ -1386,7 +1386,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_copy")) { + if(Function* F = Result->getFunction("llvm.va_copy")) { if(F->arg_size() != 1) { error("Obsolete va_copy takes 1 argument"); return 0; Index: llvm/tools/llvm-upgrade/UpgradeParser.y.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.55 llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.56 --- llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.55 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y.cvs Mon Feb 5 15:19:13 2007 @@ -569,7 +569,7 @@ if (const FunctionType *FTy = dyn_cast(PTy->getElementType())) if (Function *OtherF = - CurModule.CurrentModule->getNamedFunction(DID.getName())) + CurModule.CurrentModule->getFunction(DID.getName())) if (FuncTysDifferOnlyBySRet(FTy,OtherF->getFunctionType())) { V->replaceAllUsesWith(ConstantExpr::getBitCast(OtherF, PTy)); fixed = true; @@ -1317,10 +1317,10 @@ //Not all functions use vaarg, so make a second check for ObsoleteVarArgs { Function* F; - if ((F = Result->getNamedFunction("llvm.va_start")) + if ((F = Result->getFunction("llvm.va_start")) && F->getFunctionType()->getNumParams() == 0) ObsoleteVarArgs = true; - if((F = Result->getNamedFunction("llvm.va_copy")) + if((F = Result->getFunction("llvm.va_copy")) && F->getFunctionType()->getNumParams() == 1) ObsoleteVarArgs = true; } @@ -1331,7 +1331,7 @@ } if(ObsoleteVarArgs) { - if(Function* F = Result->getNamedFunction("llvm.va_start")) { + if(Function* F = Result->getFunction("llvm.va_start")) { if (F->arg_size() != 0) { error("Obsolete va_start takes 0 argument"); return 0; @@ -1360,7 +1360,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_end")) { + if(Function* F = Result->getFunction("llvm.va_end")) { if(F->arg_size() != 1) { error("Obsolete va_end takes 1 argument"); return 0; @@ -1386,7 +1386,7 @@ Result->getFunctionList().erase(F); } - if(Function* F = Result->getNamedFunction("llvm.va_copy")) { + if(Function* F = Result->getFunction("llvm.va_copy")) { if(F->arg_size() != 1) { error("Obsolete va_copy takes 1 argument"); return 0; From reid at x10sys.com Mon Feb 5 15:19:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/LinkArchives.cpp Message-ID: <200702052119.l15LJrDJ002233@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: LinkArchives.cpp updated: 1.55 -> 1.56 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+1 -1) LinkArchives.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Linker/LinkArchives.cpp diff -u llvm/lib/Linker/LinkArchives.cpp:1.55 llvm/lib/Linker/LinkArchives.cpp:1.56 --- llvm/lib/Linker/LinkArchives.cpp:1.55 Tue Jan 30 14:08:37 2007 +++ llvm/lib/Linker/LinkArchives.cpp Mon Feb 5 15:19:13 2007 @@ -43,7 +43,7 @@ // If the program doesn't define a main, try pulling one in from a .a file. // This is needed for programs where the main function is defined in an // archive, such f2c'd programs. - Function *Main = M->getMainFunction(); + Function *Main = M->getFunction("main"); if (Main == 0 || Main->isDeclaration()) UndefinedSymbols.insert("main"); From reid at x10sys.com Mon Feb 5 15:19:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/ExecutionEngine.cpp Message-ID: <200702052119.l15LJr5t002238@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine: ExecutionEngine.cpp updated: 1.102 -> 1.103 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+1 -1) ExecutionEngine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/ExecutionEngine/ExecutionEngine.cpp diff -u llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.102 llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.103 --- llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.102 Tue Jan 30 14:08:37 2007 +++ llvm/lib/ExecutionEngine/ExecutionEngine.cpp Mon Feb 5 15:19:13 2007 @@ -54,7 +54,7 @@ /// general code. Function *ExecutionEngine::FindFunctionNamed(const char *FnName) { for (unsigned i = 0, e = Modules.size(); i != e; ++i) { - if (Function *F = Modules[i]->getModule()->getNamedFunction(FnName)) + if (Function *F = Modules[i]->getModule()->getFunction(FnName)) return F; } return 0; From reid at x10sys.com Mon Feb 5 15:19:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/ExtractFunction.cpp IndMemRemoval.cpp Internalize.cpp LowerSetJmp.cpp StripSymbols.cpp Message-ID: <200702052119.l15LJrvg002257@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: ExtractFunction.cpp updated: 1.17 -> 1.18 IndMemRemoval.cpp updated: 1.12 -> 1.13 Internalize.cpp updated: 1.42 -> 1.43 LowerSetJmp.cpp updated: 1.37 -> 1.38 StripSymbols.cpp updated: 1.11 -> 1.12 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+11 -11) ExtractFunction.cpp | 2 +- IndMemRemoval.cpp | 4 ++-- Internalize.cpp | 2 +- LowerSetJmp.cpp | 4 ++-- StripSymbols.cpp | 10 +++++----- 5 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/lib/Transforms/IPO/ExtractFunction.cpp diff -u llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.17 llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.18 --- llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.17 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/ExtractFunction.cpp Mon Feb 5 15:19:13 2007 @@ -33,7 +33,7 @@ bool runOnModule(Module &M) { if (Named == 0) { - Named = M.getMainFunction(); + Named = M.getFunction("main"); if (Named == 0) return false; // No function to extract } Index: llvm/lib/Transforms/IPO/IndMemRemoval.cpp diff -u llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.12 llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.13 --- llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.12 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/IndMemRemoval.cpp Mon Feb 5 15:19:13 2007 @@ -44,7 +44,7 @@ //functions, ensuring that all malloc and free that might happen //happen through intrinsics. bool changed = false; - if (Function* F = M.getNamedFunction("free")) { + if (Function* F = M.getFunction("free")) { assert(F->isDeclaration() && "free not external?"); if (!F->use_empty()) { Function* FN = new Function(F->getFunctionType(), @@ -59,7 +59,7 @@ changed = true; } } - if (Function* F = M.getNamedFunction("malloc")) { + if (Function* F = M.getFunction("malloc")) { assert(F->isDeclaration() && "malloc not external?"); if (!F->use_empty()) { Function* FN = new Function(F->getFunctionType(), Index: llvm/lib/Transforms/IPO/Internalize.cpp diff -u llvm/lib/Transforms/IPO/Internalize.cpp:1.42 llvm/lib/Transforms/IPO/Internalize.cpp:1.43 --- llvm/lib/Transforms/IPO/Internalize.cpp:1.42 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/Internalize.cpp Mon Feb 5 15:19:13 2007 @@ -95,7 +95,7 @@ // internalize the module, it must be a library or something. // if (ExternalNames.empty()) { - Function *MainFunc = M.getMainFunction(); + Function *MainFunc = M.getFunction("main"); if (MainFunc == 0 || MainFunc->isDeclaration()) return false; // No main found, must be a library... Index: llvm/lib/Transforms/IPO/LowerSetJmp.cpp diff -u llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.37 llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.38 --- llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.37 Thu Jan 11 12:21:29 2007 +++ llvm/lib/Transforms/IPO/LowerSetJmp.cpp Mon Feb 5 15:19:13 2007 @@ -127,8 +127,8 @@ bool Changed = false; // These are what the functions are called. - Function* SetJmp = M.getNamedFunction("llvm.setjmp"); - Function* LongJmp = M.getNamedFunction("llvm.longjmp"); + Function* SetJmp = M.getFunction("llvm.setjmp"); + Function* LongJmp = M.getFunction("llvm.longjmp"); // This program doesn't have longjmp and setjmp calls. if ((!LongJmp || LongJmp->use_empty()) && Index: llvm/lib/Transforms/IPO/StripSymbols.cpp diff -u llvm/lib/Transforms/IPO/StripSymbols.cpp:1.11 llvm/lib/Transforms/IPO/StripSymbols.cpp:1.12 --- llvm/lib/Transforms/IPO/StripSymbols.cpp:1.11 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Transforms/IPO/StripSymbols.cpp Mon Feb 5 15:19:13 2007 @@ -94,11 +94,11 @@ // Strip debug info in the module if it exists. To do this, we remove // llvm.dbg.func.start, llvm.dbg.stoppoint, and llvm.dbg.region.end calls, and // any globals they point to if now dead. - Function *FuncStart = M.getNamedFunction("llvm.dbg.func.start"); - Function *StopPoint = M.getNamedFunction("llvm.dbg.stoppoint"); - Function *RegionStart = M.getNamedFunction("llvm.dbg.region.start"); - Function *RegionEnd = M.getNamedFunction("llvm.dbg.region.end"); - Function *Declare = M.getNamedFunction("llvm.dbg.declare"); + Function *FuncStart = M.getFunction("llvm.dbg.func.start"); + Function *StopPoint = M.getFunction("llvm.dbg.stoppoint"); + Function *RegionStart = M.getFunction("llvm.dbg.region.start"); + Function *RegionEnd = M.getFunction("llvm.dbg.region.end"); + Function *Declare = M.getFunction("llvm.dbg.declare"); if (!FuncStart && !StopPoint && !RegionStart && !RegionEnd && !Declare) return true; From reid at x10sys.com Mon Feb 5 15:19:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LowerGC.cpp Message-ID: <200702052119.l15LJr5L002241@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LowerGC.cpp updated: 1.20 -> 1.21 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+3 -3) LowerGC.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Scalar/LowerGC.cpp diff -u llvm/lib/Transforms/Scalar/LowerGC.cpp:1.20 llvm/lib/Transforms/Scalar/LowerGC.cpp:1.21 --- llvm/lib/Transforms/Scalar/LowerGC.cpp:1.20 Wed Jan 31 14:08:52 2007 +++ llvm/lib/Transforms/Scalar/LowerGC.cpp Mon Feb 5 15:19:13 2007 @@ -98,9 +98,9 @@ /// doInitialization - If this module uses the GC intrinsics, find them now. If /// not, this pass does not do anything. bool LowerGC::doInitialization(Module &M) { - GCRootInt = M.getNamedFunction("llvm.gcroot"); - GCReadInt = M.getNamedFunction("llvm.gcread"); - GCWriteInt = M.getNamedFunction("llvm.gcwrite"); + GCRootInt = M.getFunction("llvm.gcroot"); + GCReadInt = M.getFunction("llvm.gcread"); + GCWriteInt = M.getFunction("llvm.gcwrite"); if (!GCRootInt && !GCReadInt && !GCWriteInt) return false; PointerType *VoidPtr = PointerType::get(Type::Int8Ty); From reid at x10sys.com Mon Feb 5 15:19:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/lli/lli.cpp Message-ID: <200702052119.l15LJraZ002262@zion.cs.uiuc.edu> Changes in directory llvm/tools/lli: lli.cpp updated: 1.65 -> 1.66 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+1 -1) lli.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/lli/lli.cpp diff -u llvm/tools/lli/lli.cpp:1.65 llvm/tools/lli/lli.cpp:1.66 --- llvm/tools/lli/lli.cpp:1.65 Mon Jan 8 01:36:34 2007 +++ llvm/tools/lli/lli.cpp Mon Feb 5 15:19:13 2007 @@ -103,7 +103,7 @@ // using the contents of Args to determine argc & argv, and the contents of // EnvVars to determine envp. // - Function *Fn = MP->getModule()->getMainFunction(); + Function *Fn = MP->getModule()->getFunction("main"); if (!Fn) { std::cerr << "'main' function not found in module.\n"; return -1; From reid at x10sys.com Mon Feb 5 15:19:54 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:54 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/CrashDebugger.cpp Miscompilation.cpp Message-ID: <200702052119.l15LJsfM002267@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: CrashDebugger.cpp updated: 1.56 -> 1.57 Miscompilation.cpp updated: 1.86 -> 1.87 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+3 -3) CrashDebugger.cpp | 2 +- Miscompilation.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/tools/bugpoint/CrashDebugger.cpp diff -u llvm/tools/bugpoint/CrashDebugger.cpp:1.56 llvm/tools/bugpoint/CrashDebugger.cpp:1.57 --- llvm/tools/bugpoint/CrashDebugger.cpp:1.56 Mon Feb 5 14:47:21 2007 +++ llvm/tools/bugpoint/CrashDebugger.cpp Mon Feb 5 15:19:13 2007 @@ -194,7 +194,7 @@ //if main isn't present, claim there is no problem if (KeepMain && find(Funcs.begin(), Funcs.end(), - BD.getProgram()->getMainFunction()) == Funcs.end()) + BD.getProgram()->getFunction("main")) == Funcs.end()) return false; // Clone the program to try hacking it apart... Index: llvm/tools/bugpoint/Miscompilation.cpp diff -u llvm/tools/bugpoint/Miscompilation.cpp:1.86 llvm/tools/bugpoint/Miscompilation.cpp:1.87 --- llvm/tools/bugpoint/Miscompilation.cpp:1.86 Mon Feb 5 14:47:21 2007 +++ llvm/tools/bugpoint/Miscompilation.cpp Mon Feb 5 15:19:13 2007 @@ -639,7 +639,7 @@ // First, if the main function is in the Safe module, we must add a stub to // the Test module to call into it. Thus, we create a new function `main' // which just calls the old one. - if (Function *oldMain = Safe->getNamedFunction("main")) + if (Function *oldMain = Safe->getFunction("main")) if (!oldMain->isDeclaration()) { // Rename it oldMain->setName("llvm_bugpoint_old_main"); @@ -685,7 +685,7 @@ for (Module::iterator F = Safe->begin(), E = Safe->end(); F != E; ++F) { if (F->isDeclaration() && !F->use_empty() && &*F != resolverFunc && F->getIntrinsicID() == 0 /* ignore intrinsics */) { - Function *TestFn = Test->getNamedFunction(F->getName()); + Function *TestFn = Test->getFunction(F->getName()); // Don't forward functions which are external in the test module too. if (TestFn && !TestFn->isDeclaration()) { From reid at x10sys.com Mon Feb 5 15:19:54 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:19:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp EdgeProfiling.cpp TraceBasicBlocks.cpp Message-ID: <200702052119.l15LJshg002276@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Instrumentation: BlockProfiling.cpp updated: 1.20 -> 1.21 EdgeProfiling.cpp updated: 1.10 -> 1.11 TraceBasicBlocks.cpp updated: 1.21 -> 1.22 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to changes in Module interface: getMainFunction() -> getFunction("main") getNamedFunction(X) -> getFunction(X) --- Diffs of the changes: (+4 -4) BlockProfiling.cpp | 4 ++-- EdgeProfiling.cpp | 2 +- TraceBasicBlocks.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.20 llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.21 --- llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.20 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp Mon Feb 5 15:19:13 2007 @@ -45,7 +45,7 @@ } bool FunctionProfiler::runOnModule(Module &M) { - Function *Main = M.getMainFunction(); + Function *Main = M.getFunction("main"); if (Main == 0) { cerr << "WARNING: cannot insert function profiling into a module" << " with no main function!\n"; @@ -88,7 +88,7 @@ ModulePass *llvm::createBlockProfilerPass() { return new BlockProfiler(); } bool BlockProfiler::runOnModule(Module &M) { - Function *Main = M.getMainFunction(); + Function *Main = M.getFunction("main"); if (Main == 0) { cerr << "WARNING: cannot insert block profiling into a module" << " with no main function!\n"; Index: llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.10 llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.11 --- llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.10 Sat Dec 30 23:48:39 2006 +++ llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp Mon Feb 5 15:19:13 2007 @@ -40,7 +40,7 @@ ModulePass *llvm::createEdgeProfilerPass() { return new EdgeProfiler(); } bool EdgeProfiler::runOnModule(Module &M) { - Function *Main = M.getMainFunction(); + Function *Main = M.getFunction("main"); if (Main == 0) { cerr << "WARNING: cannot insert edge profiling into a module" << " with no main function!\n"; Index: llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp diff -u llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.21 llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.22 --- llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.21 Sun Jan 7 01:22:20 2007 +++ llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp Mon Feb 5 15:19:13 2007 @@ -58,7 +58,7 @@ } bool TraceBasicBlocks::runOnModule(Module &M) { - Function *Main = M.getMainFunction(); + Function *Main = M.getFunction("main"); if (Main == 0) { cerr << "WARNING: cannot insert basic-block trace instrumentation" << " into a module with no main function!\n"; From reid at x10sys.com Mon Feb 5 15:21:02 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:21:02 -0600 Subject: [llvm-commits] CVS: llvm-stacker/lib/compiler/StackerCompiler.cpp Message-ID: <200702052121.l15LL2bn002321@zion.cs.uiuc.edu> Changes in directory llvm-stacker/lib/compiler: StackerCompiler.cpp updated: 1.32 -> 1.33 --- Log message: For PR411: http://llvm.org/PR411 : Adjust to new Module interface for getFunction. --- Diffs of the changes: (+5 -5) StackerCompiler.cpp | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) Index: llvm-stacker/lib/compiler/StackerCompiler.cpp diff -u llvm-stacker/lib/compiler/StackerCompiler.cpp:1.32 llvm-stacker/lib/compiler/StackerCompiler.cpp:1.33 --- llvm-stacker/lib/compiler/StackerCompiler.cpp:1.32 Thu Feb 1 20:16:22 2007 +++ llvm-stacker/lib/compiler/StackerCompiler.cpp Mon Feb 5 15:20:45 2007 @@ -678,7 +678,7 @@ // Look up the function name in the module to see if it was forward // declared. #if 0 - Function* existing_function = TheModule->getNamedFunction( name ); + Function* existing_function = TheModule->getFunction( name ); // If the function already exists... if ( existing_function ) @@ -742,7 +742,7 @@ // Fill the true block std::vector args; - if ( Function* true_func = TheModule->getNamedFunction(ifTrue) ) + if ( Function* true_func = TheModule->getFunction(ifTrue) ) { true_bb->getInstList().push_back( new CallInst( true_func, args ) ); @@ -760,7 +760,7 @@ // Fill the false block if ( false_bb ) { - if ( Function* false_func = TheModule->getNamedFunction(ifFalse) ) + if ( Function* false_func = TheModule->getFunction(ifFalse) ) { false_bb->getInstList().push_back( new CallInst( false_func, args ) ); @@ -815,7 +815,7 @@ // Fill in the body std::vector args; - if ( Function* body_func = TheModule->getNamedFunction(todo) ) + if ( Function* body_func = TheModule->getFunction(todo) ) { body->getInstList().push_back( new CallInst( body_func, args ) ); body->getInstList().push_back( new BranchInst( test ) ); @@ -839,7 +839,7 @@ BasicBlock* StackerCompiler::handle_identifier( char * name ) { - Function* func = TheModule->getNamedFunction( name ); + Function* func = TheModule->getFunction( name ); BasicBlock* bb = new BasicBlock((echo?"call":"")); if ( func ) { From sabre at nondot.org Mon Feb 5 15:24:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 15:24:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200702052124.l15LO8Wx002494@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.144 -> 1.145 --- Log message: Fix PR1178: http://llvm.org/PR1178 --- Diffs of the changes: (+11 -1) AsmPrinter.cpp | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.144 llvm/lib/CodeGen/AsmPrinter.cpp:1.145 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.144 Sun Feb 4 17:27:42 2007 +++ llvm/lib/CodeGen/AsmPrinter.cpp Mon Feb 5 15:23:52 2007 @@ -839,9 +839,19 @@ } else if (!strcmp(Code, "uid")) { // Assign a unique ID to this machine instruction. static const MachineInstr *LastMI = 0; + static const Function *F = 0; static unsigned Counter = 0U-1; + + // Comparing the address of MI isn't sufficient, because machineinstrs may + // be allocated to the same address across functions. + const Function *ThisF = MI->getParent()->getParent()->getFunction(); + // If this is a new machine instruction, bump the counter. - if (LastMI != MI) { ++Counter; LastMI = MI; } + if (LastMI != MI || F != ThisF) { + ++Counter; + LastMI = MI; + ThisF = F; + } O << Counter; } else { cerr << "Unknown special formatter '" << Code From reid at x10sys.com Mon Feb 5 15:45:28 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:45:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Message-ID: <200702052145.l15LjS4V003038@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: StripDeadPrototypes.cpp updated: 1.1 -> 1.2 --- Log message: Make the class VISIBILITY_HIDDEN. Reduce lexical size of the anonymous namespace. --- Diffs of the changes: (+3 -3) StripDeadPrototypes.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp diff -u llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.1 llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.2 --- llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.1 Mon Feb 5 14:24:25 2007 +++ llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Mon Feb 5 15:45:12 2007 @@ -25,7 +25,7 @@ namespace { /// @brief Pass to remove unused function declarations. -class StripDeadPrototypesPass : public ModulePass { +class VISIBILITY_HIDDEN StripDeadPrototypesPass : public ModulePass { public: StripDeadPrototypesPass() { } virtual bool runOnModule(Module &M); @@ -33,6 +33,8 @@ RegisterPass X("strip-dead-prototypes", "Strip Unused Function Prototypes"); +} // end anonymous namespace + bool StripDeadPrototypesPass::runOnModule(Module &M) { // Collect all the functions we want to erase std::vector FuncsToErase; @@ -54,8 +56,6 @@ return !FuncsToErase.empty(); } -} // end anonymous namespace - ModulePass *llvm::createStripDeadPrototypesPass() { return new StripDeadPrototypesPass(); } From reid at x10sys.com Mon Feb 5 15:47:55 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 15:47:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Message-ID: <200702052147.l15Llt8u003109@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: StripDeadPrototypes.cpp updated: 1.2 -> 1.3 --- Log message: Add missing and needed #include. --- Diffs of the changes: (+1 -0) StripDeadPrototypes.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp diff -u llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.2 llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.3 --- llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp:1.2 Mon Feb 5 15:45:12 2007 +++ llvm/lib/Transforms/IPO/StripDeadPrototypes.cpp Mon Feb 5 15:47:39 2007 @@ -17,6 +17,7 @@ #include "llvm/Module.h" #include "llvm/ADT/Statistic.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; From sabre at nondot.org Mon Feb 5 15:59:04 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 15:59:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052159.l15Lx4fi003371@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.85 -> 1.86 --- Log message: eliminate some malloc traffic, this speeds up mem2reg by 3.4%. --- Diffs of the changes: (+8 -5) PromoteMemoryToRegister.cpp | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.85 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.86 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.85 Sun Aug 27 07:54:02 2006 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 15:58:48 2007 @@ -23,6 +23,7 @@ #include "llvm/Instructions.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/AliasSetTracker.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CFG.h" #include "llvm/Support/StableBasicBlockNumbering.h" @@ -57,7 +58,7 @@ /// Allocas - The alloca instructions being promoted. /// std::vector Allocas; - std::vector &RetryList; + SmallVector &RetryList; DominatorTree &DT; DominanceFrontier &DF; const TargetData &TD; @@ -90,7 +91,7 @@ public: PromoteMem2Reg(const std::vector &A, - std::vector &Retry, DominatorTree &dt, + SmallVector &Retry, DominatorTree &dt, DominanceFrontier &df, const TargetData &td, AliasSetTracker *ast) : Allocas(A), RetryList(Retry), DT(dt), DF(df), TD(td), AST(ast) {} @@ -736,11 +737,12 @@ // If there is nothing to do, bail out... if (Allocas.empty()) return; - std::vector RetryList; + SmallVector RetryList; PromoteMem2Reg(Allocas, RetryList, DT, DF, TD, AST).run(); // PromoteMem2Reg may not have been able to promote all of the allocas in one // pass, run it again if needed. + std::vector NewAllocas; while (!RetryList.empty()) { // If we need to retry some allocas, this is due to there being no store // before a read in a local block. To counteract this, insert a store of @@ -752,8 +754,9 @@ RetryList[i], ++BBI); } - std::vector NewAllocas; - std::swap(NewAllocas, RetryList); + NewAllocas.assign(RetryList.begin(), RetryList.end()); + RetryList.clear(); PromoteMem2Reg(NewAllocas, RetryList, DT, DF, TD, AST).run(); + NewAllocas.clear(); } } From sabre at nondot.org Mon Feb 5 16:13:29 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 16:13:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052213.l15MDTME003698@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.86 -> 1.87 --- Log message: switch an std::set over to SmallPtrSet, speeding up mem2reg 3.4% on 176.gcc. --- Diffs of the changes: (+13 -16) PromoteMemoryToRegister.cpp | 29 +++++++++++++---------------- 1 files changed, 13 insertions(+), 16 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.86 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.87 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.86 Mon Feb 5 15:58:48 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 16:13:11 2007 @@ -23,6 +23,7 @@ #include "llvm/Instructions.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/AliasSetTracker.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CFG.h" @@ -114,7 +115,7 @@ private: void MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - std::set &DeadPHINodes); + SmallPtrSet &DeadPHINodes); bool PromoteLocallyUsedAlloca(BasicBlock *BB, AllocaInst *AI); void PromoteLocallyUsedAllocas(BasicBlock *BB, const std::vector &AIs); @@ -122,7 +123,7 @@ void RenamePass(BasicBlock *BB, BasicBlock *Pred, std::vector &IncVals); bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version, - std::set &InsertedPHINodes); + SmallPtrSet &InsertedPHINodes); }; } // end of anonymous namespace @@ -270,7 +271,7 @@ // dominance frontier of EACH basic-block we have a write in. // unsigned CurrentVersion = 0; - std::set InsertedPHINodes; + SmallPtrSet InsertedPHINodes; std::vector DFBlocks; while (!DefiningBlocks.empty()) { BasicBlock *BB = DefiningBlocks.back(); @@ -314,7 +315,7 @@ UsingBlocks.clear(); // If there are any PHI nodes which are now known to be dead, remove them! - for (std::set::iterator I = InsertedPHINodes.begin(), + for (SmallPtrSet::iterator I = InsertedPHINodes.begin(), E = InsertedPHINodes.end(); I != E; ++I) { PHINode *PN = *I; std::vector &BBPNs = NewPhiNodes[PN->getParent()]; @@ -408,7 +409,7 @@ for (unsigned i = 0, e = PNs.size(); i != e; ++i) { if (!PNs[i]) continue; - // If this PHI node merges one value and/or undefs, get the value. + // If this PHI node merges one value and/or undefs, get the value. if (Value *V = PNs[i]->hasConstantValue(true)) { if (!isa(V) || properlyDominates(cast(V), PNs[i])) { @@ -426,8 +427,8 @@ } // At this point, the renamer has added entries to PHI nodes for all reachable - // code. Unfortunately, there may be blocks which are not reachable, which - // the renamer hasn't traversed. If this is the case, the PHI nodes may not + // code. Unfortunately, there may be unreachable blocks which the renamer + // hasn't traversed. If this is the case, the PHI nodes may not // have incoming values for all predecessors. Loop over all PHI nodes we have // created, inserting undef values if they are missing any incoming values. // @@ -488,7 +489,7 @@ // DeadPHINodes set are removed. // void PromoteMem2Reg::MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - std::set &DeadPHINodes) { + SmallPtrSet &DeadPHINodes) { // Scan the immediate dominators of this block looking for a block which has a // PHI node for Alloca num. If we find it, mark the PHI node as being alive! for (DominatorTree::Node *N = DT[BB]; N; N = N->getIDom()) { @@ -499,13 +500,9 @@ // Ok, we found an inserted PHI node which dominates this value. PHINode *DominatingPHI = I->second[AllocaNum]; - // Find out if we previously thought it was dead. - std::set::iterator DPNI = DeadPHINodes.find(DominatingPHI); - if (DPNI != DeadPHINodes.end()) { - // Ok, until now, we thought this PHI node was dead. Mark it as being - // alive/needed. - DeadPHINodes.erase(DPNI); - + // Find out if we previously thought it was dead. If so, mark it as being + // live by removing it from the DeadPHINodes set. + if (DeadPHINodes.erase(DominatingPHI)) { // Now that we have marked the PHI node alive, also mark any PHI nodes // which it might use as being alive as well. for (pred_iterator PI = pred_begin(DomBB), PE = pred_end(DomBB); @@ -633,7 +630,7 @@ // bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo, unsigned &Version, - std::set &InsertedPHINodes) { + SmallPtrSet &InsertedPHINodes) { // Look up the basic-block in question. std::vector &BBPNs = NewPhiNodes[BB]; if (BBPNs.empty()) BBPNs.resize(Allocas.size()); From sabre at nondot.org Mon Feb 5 16:15:37 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 16:15:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052215.l15MFbhH003788@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.87 -> 1.88 --- Log message: switch an std::set over to a SmallPtrSet, speeding up mem2reg 6% on 176.gcc. --- Diffs of the changes: (+1 -1) PromoteMemoryToRegister.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.87 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.88 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.87 Mon Feb 5 16:13:11 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 16:15:21 2007 @@ -84,7 +84,7 @@ /// Visited - The set of basic blocks the renamer has already visited. /// - std::set Visited; + SmallPtrSet Visited; /// BBNumbers - Contains a stable numbering of basic blocks to avoid /// non-determinstic behavior. From sabre at nondot.org Mon Feb 5 16:29:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 16:29:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052229.l15MT8d7004282@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.88 -> 1.89 --- Log message: switch a SmallPtrSet back to an std::set for now, this caused problems. --- Diffs of the changes: (+6 -6) PromoteMemoryToRegister.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.88 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.89 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.88 Mon Feb 5 16:15:21 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 16:28:52 2007 @@ -115,7 +115,7 @@ private: void MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - SmallPtrSet &DeadPHINodes); + std::set &DeadPHINodes); bool PromoteLocallyUsedAlloca(BasicBlock *BB, AllocaInst *AI); void PromoteLocallyUsedAllocas(BasicBlock *BB, const std::vector &AIs); @@ -123,7 +123,7 @@ void RenamePass(BasicBlock *BB, BasicBlock *Pred, std::vector &IncVals); bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version, - SmallPtrSet &InsertedPHINodes); + std::set &InsertedPHINodes); }; } // end of anonymous namespace @@ -271,7 +271,7 @@ // dominance frontier of EACH basic-block we have a write in. // unsigned CurrentVersion = 0; - SmallPtrSet InsertedPHINodes; + std::set InsertedPHINodes; std::vector DFBlocks; while (!DefiningBlocks.empty()) { BasicBlock *BB = DefiningBlocks.back(); @@ -315,7 +315,7 @@ UsingBlocks.clear(); // If there are any PHI nodes which are now known to be dead, remove them! - for (SmallPtrSet::iterator I = InsertedPHINodes.begin(), + for (std::set::iterator I = InsertedPHINodes.begin(), E = InsertedPHINodes.end(); I != E; ++I) { PHINode *PN = *I; std::vector &BBPNs = NewPhiNodes[PN->getParent()]; @@ -489,7 +489,7 @@ // DeadPHINodes set are removed. // void PromoteMem2Reg::MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - SmallPtrSet &DeadPHINodes) { + std::set &DeadPHINodes) { // Scan the immediate dominators of this block looking for a block which has a // PHI node for Alloca num. If we find it, mark the PHI node as being alive! for (DominatorTree::Node *N = DT[BB]; N; N = N->getIDom()) { @@ -630,7 +630,7 @@ // bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo, unsigned &Version, - SmallPtrSet &InsertedPHINodes) { + std::set &InsertedPHINodes) { // Look up the basic-block in question. std::vector &BBPNs = NewPhiNodes[BB]; if (BBPNs.empty()) BBPNs.resize(Allocas.size()); From sabre at nondot.org Mon Feb 5 17:10:57 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:10:57 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp Message-ID: <200702052310.l15NAvfp005331@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: SmallPtrSet.cpp updated: 1.3 -> 1.4 --- Log message: Fix a bug in smallptrset::erase: in the small case, return true if the element was in the set. --- Diffs of the changes: (+1 -1) SmallPtrSet.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Support/SmallPtrSet.cpp diff -u llvm/lib/Support/SmallPtrSet.cpp:1.3 llvm/lib/Support/SmallPtrSet.cpp:1.4 --- llvm/lib/Support/SmallPtrSet.cpp:1.3 Sat Jan 27 01:59:10 2007 +++ llvm/lib/Support/SmallPtrSet.cpp Mon Feb 5 17:10:31 2007 @@ -56,7 +56,7 @@ // Clear the end element. E[-1] = getEmptyMarker(); --NumElements; - return false; + return true; } return false; From sabre at nondot.org Mon Feb 5 17:11:56 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:11:56 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052311.l15NBu8X005398@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.89 -> 1.90 --- Log message: Switch InsertedPHINodes back to SmallPtrSet now that the SmallPtrSet::erase bug is fixed. --- Diffs of the changes: (+6 -6) PromoteMemoryToRegister.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.89 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.90 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.89 Mon Feb 5 16:28:52 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 17:11:37 2007 @@ -115,7 +115,7 @@ private: void MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - std::set &DeadPHINodes); + SmallPtrSet &DeadPHINodes); bool PromoteLocallyUsedAlloca(BasicBlock *BB, AllocaInst *AI); void PromoteLocallyUsedAllocas(BasicBlock *BB, const std::vector &AIs); @@ -123,7 +123,7 @@ void RenamePass(BasicBlock *BB, BasicBlock *Pred, std::vector &IncVals); bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version, - std::set &InsertedPHINodes); + SmallPtrSet &InsertedPHINodes); }; } // end of anonymous namespace @@ -271,7 +271,7 @@ // dominance frontier of EACH basic-block we have a write in. // unsigned CurrentVersion = 0; - std::set InsertedPHINodes; + SmallPtrSet InsertedPHINodes; std::vector DFBlocks; while (!DefiningBlocks.empty()) { BasicBlock *BB = DefiningBlocks.back(); @@ -315,7 +315,7 @@ UsingBlocks.clear(); // If there are any PHI nodes which are now known to be dead, remove them! - for (std::set::iterator I = InsertedPHINodes.begin(), + for (SmallPtrSet::iterator I = InsertedPHINodes.begin(), E = InsertedPHINodes.end(); I != E; ++I) { PHINode *PN = *I; std::vector &BBPNs = NewPhiNodes[PN->getParent()]; @@ -489,7 +489,7 @@ // DeadPHINodes set are removed. // void PromoteMem2Reg::MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, - std::set &DeadPHINodes) { + SmallPtrSet &DeadPHINodes) { // Scan the immediate dominators of this block looking for a block which has a // PHI node for Alloca num. If we find it, mark the PHI node as being alive! for (DominatorTree::Node *N = DT[BB]; N; N = N->getIDom()) { @@ -630,7 +630,7 @@ // bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo, unsigned &Version, - std::set &InsertedPHINodes) { + SmallPtrSet &InsertedPHINodes) { // Look up the basic-block in question. std::vector &BBPNs = NewPhiNodes[BB]; if (BBPNs.empty()) BBPNs.resize(Allocas.size()); From sabre at nondot.org Mon Feb 5 17:18:48 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:18:48 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200702052318.l15NImKD005617@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.6 -> 1.7 --- Log message: Const method must use const_iterator. --- Diffs of the changes: (+1 -2) UniqueVector.h | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.6 llvm/include/llvm/ADT/UniqueVector.h:1.7 --- llvm/include/llvm/ADT/UniqueVector.h:1.6 Thu Jan 26 14:30:51 2006 +++ llvm/include/llvm/ADT/UniqueVector.h Mon Feb 5 17:18:32 2007 @@ -1,4 +1,3 @@ - //===-- llvm/ADT/UniqueVector.h ---------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure @@ -56,7 +55,7 @@ /// not found. unsigned idFor(const T &Entry) const { // Search for entry in the map. - typename std::map::iterator MI = Map.find(Entry); + typename std::map::const_iterator MI = Map.find(Entry); // See if entry exists, if so return ID. if (MI != Map.end()) return MI->second; From reid at x10sys.com Mon Feb 5 17:19:17 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:19:17 -0600 Subject: [llvm-commits] CVS: llvm/Makefile Message-ID: <200702052319.l15NJHj4005675@zion.cs.uiuc.edu> Changes in directory llvm: Makefile updated: 1.68 -> 1.69 --- Log message: Add a show-footprint target to run du a few times to show how much disk space a build tree's objects are consuming. --- Diffs of the changes: (+6 -0) Makefile | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/Makefile diff -u llvm/Makefile:1.68 llvm/Makefile:1.69 --- llvm/Makefile:1.68 Mon Feb 5 03:43:17 2007 +++ llvm/Makefile Mon Feb 5 17:18:58 2007 @@ -110,4 +110,10 @@ rpm: $(LLVM_OBJ_ROOT)/llvm.spec rpmbuild -bb --target $(TARGET_TRIPLE) $(LLVM_OBJ_ROOT)/llvm.spec +show-footprint: + $(Verb) du -sk $(LibDir) + $(Verb) du -sk $(ToolDir) + $(Verb) du -sk $(ExmplDir) + $(Verb) du -sk $(ObjDir) + .PHONY: srpm rpm From sabre at nondot.org Mon Feb 5 17:19:42 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:19:42 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/StableBasicBlockNumbering.h Message-ID: <200702052319.l15NJgob005692@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: StableBasicBlockNumbering.h updated: 1.2 -> 1.3 --- Log message: StableBasicBlockNumbering is conceptually just a wrapper around UniqueVector, so we should actually use a UniqueVector to implement it. --- Diffs of the changes: (+11 -22) StableBasicBlockNumbering.h | 33 +++++++++++---------------------- 1 files changed, 11 insertions(+), 22 deletions(-) Index: llvm/include/llvm/Support/StableBasicBlockNumbering.h diff -u llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.2 llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.3 --- llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.2 Thu Apr 21 15:44:59 2005 +++ llvm/include/llvm/Support/StableBasicBlockNumbering.h Mon Feb 5 17:19:24 2007 @@ -18,18 +18,13 @@ #define LLVM_SUPPORT_STABLEBASICBLOCKNUMBERING_H #include "llvm/Function.h" -#include +#include "llvm/ADT/UniqueVector.h" namespace llvm { class StableBasicBlockNumbering { - // BasicBlockNumbering - Holds a numbering of the basic blocks in the - // function in a stable order that does not depend on their address. - std::map BasicBlockNumbering; - - // NumberedBasicBlock - Holds the inverse mapping of BasicBlockNumbering. - std::vector NumberedBasicBlock; + // BBNumbering - Holds the numbering. + UniqueVector BBNumbering; public: - StableBasicBlockNumbering(Function *F = 0) { if (F) compute(*F); } @@ -37,33 +32,27 @@ /// compute - If we have not computed a numbering for the function yet, do /// so. void compute(Function &F) { - if (NumberedBasicBlock.empty()) { - unsigned n = 0; - for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I, ++n) { - NumberedBasicBlock.push_back(I); - BasicBlockNumbering[I] = n; - } + if (BBNumbering.empty()) { + for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) + BBNumbering.insert(I); } } /// getNumber - Return the ID number for the specified BasicBlock. /// unsigned getNumber(BasicBlock *BB) const { - std::map::const_iterator I = - BasicBlockNumbering.find(BB); - assert(I != BasicBlockNumbering.end() && - "Invalid basic block or numbering not computed!"); - return I->second; + unsigned Idx = BBNumbering.idFor(BB); + assert(Idx && "Invalid basic block or numbering not computed!"); + return Idx-1; } /// getBlock - Return the BasicBlock corresponding to a particular ID. /// BasicBlock *getBlock(unsigned N) const { - assert(N < NumberedBasicBlock.size() && + assert(N < BBNumbering.size() && "Block ID out of range or numbering not computed!"); - return NumberedBasicBlock[N]; + return BBNumbering[N+1]; } - }; } From sabre at nondot.org Mon Feb 5 17:25:04 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:25:04 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200702052325.l15NP4bw005838@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.7 -> 1.8 --- Log message: Simplify this a bit, add an assertion --- Diffs of the changes: (+10 -11) UniqueVector.h | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.7 llvm/include/llvm/ADT/UniqueVector.h:1.8 --- llvm/include/llvm/ADT/UniqueVector.h:1.7 Mon Feb 5 17:18:32 2007 +++ llvm/include/llvm/ADT/UniqueVector.h Mon Feb 5 17:24:48 2007 @@ -27,28 +27,24 @@ // Vector - ID ordered vector of entries. Entries can be indexed by ID - 1. // - std::vector Vector; + std::vector Vector; public: /// insert - Append entry to the vector if it doesn't already exist. Returns /// the entry's index + 1 to be used as a unique ID. unsigned insert(const T &Entry) { // Check if the entry is already in the map. - typename std::map::iterator MI = Map.lower_bound(Entry); + unsigned &Val = Map[Entry]; // See if entry exists, if so return prior ID. - if (MI != Map.end() && MI->first == Entry) return MI->second; + if (Val) return Val; // Compute ID for entry. - unsigned ID = Vector.size() + 1; - - // Insert in map. - MI = Map.insert(MI, std::make_pair(Entry, ID)); + Val = Vector.size() + 1; // Insert in vector. - Vector.push_back(&MI->first); - - return ID; + Vector.push_back(Entry); + return Val; } /// idFor - return the ID for an existing entry. Returns 0 if the entry is @@ -66,7 +62,10 @@ /// operator[] - Returns a reference to the entry with the specified ID. /// - const T &operator[](unsigned ID) const { return *Vector[ID - 1]; } + const T &operator[](unsigned ID) const { + assert(ID-1 < size() && "ID is 0 or out of range!"); + return Vector[ID - 1]; + } /// size - Returns the number of entries in the vector. /// From llvm at cs.uiuc.edu Mon Feb 5 17:27:18 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Mon, 5 Feb 2007 17:27:18 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/TransformInternals.h Message-ID: <200702052327.l15NRIgc005882@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms: TransformInternals.h (r1.28) removed --- Log message: This file should have been removed when -raise was removed. It isn't used any more. --- Diffs of the changes: (+0 -0) 0 files changed From sabre at nondot.org Mon Feb 5 17:31:42 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:31:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052331.l15NVgYA006009@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.90 -> 1.91 --- Log message: Simplify use of DFBlocks, this makes no noticable performance difference, but paves the way to eliminate BBNumbers. --- Diffs of the changes: (+3 -3) PromoteMemoryToRegister.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.90 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.91 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.90 Mon Feb 5 17:11:37 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 17:31:26 2007 @@ -272,7 +272,7 @@ // unsigned CurrentVersion = 0; SmallPtrSet InsertedPHINodes; - std::vector DFBlocks; + std::vector > DFBlocks; while (!DefiningBlocks.empty()) { BasicBlock *BB = DefiningBlocks.back(); DefiningBlocks.pop_back(); @@ -289,13 +289,13 @@ // processing blocks in order of the occurance in the function. for (DominanceFrontier::DomSetType::const_iterator P = S.begin(), PE = S.end(); P != PE; ++P) - DFBlocks.push_back(BBNumbers.getNumber(*P)); + DFBlocks.push_back(std::make_pair(BBNumbers.getNumber(*P), *P)); // Sort by which the block ordering in the function. std::sort(DFBlocks.begin(), DFBlocks.end()); for (unsigned i = 0, e = DFBlocks.size(); i != e; ++i) { - BasicBlock *BB = BBNumbers.getBlock(DFBlocks[i]); + BasicBlock *BB = DFBlocks[i].second; if (QueuePhiNode(BB, AllocaNum, CurrentVersion, InsertedPHINodes)) DefiningBlocks.push_back(BB); } From reid at x10sys.com Mon Feb 5 17:32:24 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:32:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/ADCE.cpp BasicBlockPlacement.cpp CondPropagate.cpp ConstantProp.cpp CorrelatedExprs.cpp DCE.cpp DeadStoreElimination.cpp GCSE.cpp IndVarSimplify.cpp LICM.cpp LoopStrengthReduce.cpp LoopUnroll.cpp LoopUnswitch.cpp LowerPacked.cpp Reassociate.cpp Reg2Mem.cpp SCCP.cpp SimplifyCFG.cpp TailDuplication.cpp TailRecursionElimination.cpp Message-ID: <200702052332.l15NWOcT006081@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: ADCE.cpp updated: 1.101 -> 1.102 BasicBlockPlacement.cpp updated: 1.8 -> 1.9 CondPropagate.cpp updated: 1.15 -> 1.16 ConstantProp.cpp updated: 1.55 -> 1.56 CorrelatedExprs.cpp updated: 1.51 -> 1.52 DCE.cpp updated: 1.62 -> 1.63 DeadStoreElimination.cpp updated: 1.16 -> 1.17 GCSE.cpp updated: 1.51 -> 1.52 IndVarSimplify.cpp updated: 1.108 -> 1.109 LICM.cpp updated: 1.86 -> 1.87 LoopStrengthReduce.cpp updated: 1.107 -> 1.108 LoopUnroll.cpp updated: 1.35 -> 1.36 LoopUnswitch.cpp updated: 1.60 -> 1.61 LowerPacked.cpp updated: 1.15 -> 1.16 Reassociate.cpp updated: 1.73 -> 1.74 Reg2Mem.cpp updated: 1.10 -> 1.11 SCCP.cpp updated: 1.161 -> 1.162 SimplifyCFG.cpp updated: 1.18 -> 1.19 TailDuplication.cpp updated: 1.36 -> 1.37 TailRecursionElimination.cpp updated: 1.27 -> 1.28 --- Log message: Apply the VISIBILITY_HIDDEN field to the remaining anonymous classes in the Transforms library. This reduces debug library size by 132 KB, debug binary size by 376 KB, and reduces link time for llvm tools slightly. --- Diffs of the changes: (+52 -32) ADCE.cpp | 3 ++- BasicBlockPlacement.cpp | 3 ++- CondPropagate.cpp | 3 ++- ConstantProp.cpp | 3 ++- CorrelatedExprs.cpp | 11 ++++++----- DCE.cpp | 3 ++- DeadStoreElimination.cpp | 3 ++- GCSE.cpp | 3 ++- IndVarSimplify.cpp | 3 ++- LICM.cpp | 5 +++-- LoopStrengthReduce.cpp | 8 ++++---- LoopUnroll.cpp | 3 ++- LoopUnswitch.cpp | 5 +++-- LowerPacked.cpp | 4 +++- Reassociate.cpp | 5 +++-- Reg2Mem.cpp | 3 ++- SCCP.cpp | 7 ++++--- SimplifyCFG.cpp | 3 ++- TailDuplication.cpp | 3 ++- TailRecursionElimination.cpp | 3 ++- 20 files changed, 52 insertions(+), 32 deletions(-) Index: llvm/lib/Transforms/Scalar/ADCE.cpp diff -u llvm/lib/Transforms/Scalar/ADCE.cpp:1.101 llvm/lib/Transforms/Scalar/ADCE.cpp:1.102 --- llvm/lib/Transforms/Scalar/ADCE.cpp:1.101 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/ADCE.cpp Mon Feb 5 17:32:05 2007 @@ -27,6 +27,7 @@ #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -41,7 +42,7 @@ // This class does all of the work of Aggressive Dead Code Elimination. // It's public interface consists of a constructor and a doADCE() method. // -class ADCE : public FunctionPass { +class VISIBILITY_HIDDEN ADCE : public FunctionPass { Function *Func; // The function that we are working on std::vector WorkList; // Instructions that just became live std::set LiveSet; // The set of live instructions Index: llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp diff -u llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp:1.8 llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp:1.9 --- llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp:1.8 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp Mon Feb 5 17:32:05 2007 @@ -31,6 +31,7 @@ #include "llvm/Function.h" #include "llvm/Pass.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/ADT/Statistic.h" #include "llvm/Transforms/Scalar.h" #include @@ -39,7 +40,7 @@ STATISTIC(NumMoved, "Number of basic blocks moved"); namespace { - struct BlockPlacement : public FunctionPass { + struct VISIBILITY_HIDDEN BlockPlacement : public FunctionPass { virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { Index: llvm/lib/Transforms/Scalar/CondPropagate.cpp diff -u llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.15 llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.16 --- llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.15 Fri Jan 12 12:35:11 2007 +++ llvm/lib/Transforms/Scalar/CondPropagate.cpp Mon Feb 5 17:32:05 2007 @@ -22,6 +22,7 @@ #include "llvm/Type.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" using namespace llvm; @@ -29,7 +30,7 @@ STATISTIC(NumSwThread, "Number of CFG edges threaded through switches"); namespace { - struct CondProp : public FunctionPass { + struct VISIBILITY_HIDDEN CondProp : public FunctionPass { virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { Index: llvm/lib/Transforms/Scalar/ConstantProp.cpp diff -u llvm/lib/Transforms/Scalar/ConstantProp.cpp:1.55 llvm/lib/Transforms/Scalar/ConstantProp.cpp:1.56 --- llvm/lib/Transforms/Scalar/ConstantProp.cpp:1.55 Tue Jan 30 17:46:24 2007 +++ llvm/lib/Transforms/Scalar/ConstantProp.cpp Mon Feb 5 17:32:05 2007 @@ -24,6 +24,7 @@ #include "llvm/Constant.h" #include "llvm/Instruction.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstIterator.h" #include "llvm/ADT/Statistic.h" #include @@ -32,7 +33,7 @@ STATISTIC(NumInstKilled, "Number of instructions killed"); namespace { - struct ConstantPropagation : public FunctionPass { + struct VISIBILITY_HIDDEN ConstantPropagation : public FunctionPass { bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { Index: llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp diff -u llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp:1.51 llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp:1.52 --- llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp:1.51 Tue Jan 30 17:46:24 2007 +++ llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp Mon Feb 5 17:32:05 2007 @@ -38,8 +38,9 @@ #include "llvm/Analysis/Dominators.h" #include "llvm/Assembly/Writer.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" -#include "llvm/Support/ConstantRange.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/ConstantRange.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/Statistic.h" @@ -52,7 +53,7 @@ namespace { class ValueInfo; - class Relation { + class VISIBILITY_HIDDEN Relation { Value *Val; // Relation to what value? unsigned Rel; // SetCC or ICmp relation, or Add if no information public: @@ -96,7 +97,7 @@ // relationships to other values in the program (specified with Relation) that // are known to be valid in a region. // - class ValueInfo { + class VISIBILITY_HIDDEN ValueInfo { // RelationShips - this value is know to have the specified relationships to // other values. There can only be one entry per value, and this list is // kept sorted by the Val field. @@ -167,7 +168,7 @@ // the RegionInfo for their dominator, because anything known in a dominator // is known to be true in a dominated block as well. // - class RegionInfo { + class VISIBILITY_HIDDEN RegionInfo { BasicBlock *BB; // ValueMap - Tracks the ValueInformation known for this region @@ -218,7 +219,7 @@ }; /// CEE - Correlated Expression Elimination - class CEE : public FunctionPass { + class VISIBILITY_HIDDEN CEE : public FunctionPass { std::map RankMap; std::map RegionInfoMap; ETForest *EF; Index: llvm/lib/Transforms/Scalar/DCE.cpp diff -u llvm/lib/Transforms/Scalar/DCE.cpp:1.62 llvm/lib/Transforms/Scalar/DCE.cpp:1.63 --- llvm/lib/Transforms/Scalar/DCE.cpp:1.62 Thu Jan 25 17:23:25 2007 +++ llvm/lib/Transforms/Scalar/DCE.cpp Mon Feb 5 17:32:05 2007 @@ -21,6 +21,7 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Instruction.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstIterator.h" #include "llvm/ADT/Statistic.h" #include @@ -33,7 +34,7 @@ //===--------------------------------------------------------------------===// // DeadInstElimination pass implementation // - struct DeadInstElimination : public BasicBlockPass { + struct VISIBILITY_HIDDEN DeadInstElimination : public BasicBlockPass { virtual bool runOnBasicBlock(BasicBlock &BB) { bool Changed = false; for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) Index: llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp diff -u llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp:1.16 llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp:1.17 --- llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp:1.16 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Feb 5 17:32:05 2007 @@ -26,13 +26,14 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" using namespace llvm; STATISTIC(NumStores, "Number of stores deleted"); STATISTIC(NumOther , "Number of other instrs removed"); namespace { - struct DSE : public FunctionPass { + struct VISIBILITY_HIDDEN DSE : public FunctionPass { virtual bool runOnFunction(Function &F) { bool Changed = false; Index: llvm/lib/Transforms/Scalar/GCSE.cpp diff -u llvm/lib/Transforms/Scalar/GCSE.cpp:1.51 llvm/lib/Transforms/Scalar/GCSE.cpp:1.52 --- llvm/lib/Transforms/Scalar/GCSE.cpp:1.51 Tue Jan 30 17:46:24 2007 +++ llvm/lib/Transforms/Scalar/GCSE.cpp Mon Feb 5 17:32:05 2007 @@ -24,6 +24,7 @@ #include "llvm/Analysis/ValueNumbering.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -35,7 +36,7 @@ STATISTIC(NumArgsRepl , "Number of function arguments replaced " "with constant values"); namespace { - struct GCSE : public FunctionPass { + struct VISIBILITY_HIDDEN GCSE : public FunctionPass { virtual bool runOnFunction(Function &F); private: Index: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp diff -u llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.108 llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.109 --- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.108 Wed Jan 31 14:08:52 2007 +++ llvm/lib/Transforms/Scalar/IndVarSimplify.cpp Mon Feb 5 17:32:05 2007 @@ -46,6 +46,7 @@ #include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Transforms/Utils/Local.h" @@ -61,7 +62,7 @@ STATISTIC(NumLFTR , "Number of loop exit tests replaced"); namespace { - class IndVarSimplify : public FunctionPass { + class VISIBILITY_HIDDEN IndVarSimplify : public FunctionPass { LoopInfo *LI; ScalarEvolution *SE; bool Changed; Index: llvm/lib/Transforms/Scalar/LICM.cpp diff -u llvm/lib/Transforms/Scalar/LICM.cpp:1.86 llvm/lib/Transforms/Scalar/LICM.cpp:1.87 --- llvm/lib/Transforms/Scalar/LICM.cpp:1.86 Thu Feb 1 20:16:22 2007 +++ llvm/lib/Transforms/Scalar/LICM.cpp Mon Feb 5 17:32:05 2007 @@ -41,8 +41,9 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AliasSetTracker.h" #include "llvm/Analysis/Dominators.h" -#include "llvm/Support/CFG.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" +#include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" @@ -60,7 +61,7 @@ DisablePromotion("disable-licm-promotion", cl::Hidden, cl::desc("Disable memory promotion in LICM pass")); - struct LICM : public FunctionPass { + struct VISIBILITY_HIDDEN LICM : public FunctionPass { virtual bool runOnFunction(Function &F); /// This transformation requires natural loop information & requires that Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.107 llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.108 --- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.107 Sun Jan 14 20:27:26 2007 +++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Feb 5 17:32:05 2007 @@ -46,7 +46,7 @@ /// the stride is stored externally. The Offset member keeps track of the /// offset from the IV, User is the actual user of the operand, and 'Operand' /// is the operand # of the User that is the use. - struct IVStrideUse { + struct VISIBILITY_HIDDEN IVStrideUse { SCEVHandle Offset; Instruction *User; Value *OperandValToReplace; @@ -66,7 +66,7 @@ /// have an operand that is based on the trip count multiplied by some stride. /// The stride for all of these users is common and kept external to this /// structure. - struct IVUsersOfOneStride { + struct VISIBILITY_HIDDEN IVUsersOfOneStride { /// Users - Keep track of all of the users of this stride as well as the /// initial value and the operand that uses the IV. std::vector Users; @@ -79,7 +79,7 @@ /// IVInfo - This structure keeps track of one IV expression inserted during /// StrengthReduceStridedIVUsers. It contains the stride, the common base, as /// well as the PHI node and increment value created for rewrite. - struct IVExpr { + struct VISIBILITY_HIDDEN IVExpr { SCEVHandle Stride; SCEVHandle Base; PHINode *PHI; @@ -95,7 +95,7 @@ /// IVsOfOneStride - This structure keeps track of all IV expression inserted /// during StrengthReduceStridedIVUsers for a particular stride of the IV. - struct IVsOfOneStride { + struct VISIBILITY_HIDDEN IVsOfOneStride { std::vector IVs; void addIV(const SCEVHandle &Stride, const SCEVHandle &Base, PHINode *PHI, Index: llvm/lib/Transforms/Scalar/LoopUnroll.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.35 llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.36 --- llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.35 Fri Feb 2 18:08:31 2007 +++ llvm/lib/Transforms/Scalar/LoopUnroll.cpp Mon Feb 5 17:32:05 2007 @@ -27,6 +27,7 @@ #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" @@ -44,7 +45,7 @@ UnrollThreshold("unroll-threshold", cl::init(100), cl::Hidden, cl::desc("The cut-off point for loop unrolling")); - class LoopUnroll : public FunctionPass { + class VISIBILITY_HIDDEN LoopUnroll : public FunctionPass { LoopInfo *LI; // The current loop information public: virtual bool runOnFunction(Function &F); Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.60 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.61 --- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.60 Fri Feb 2 18:08:31 2007 +++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Feb 5 17:32:05 2007 @@ -39,8 +39,9 @@ #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/PostOrderIterator.h" -#include "llvm/Support/Debug.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" #include #include using namespace llvm; @@ -56,7 +57,7 @@ Threshold("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"), cl::init(10), cl::Hidden); - class LoopUnswitch : public FunctionPass { + class VISIBILITY_HIDDEN LoopUnswitch : public FunctionPass { LoopInfo *LI; // Loop information // LoopProcessWorklist - List of loops we need to process. Index: llvm/lib/Transforms/Scalar/LowerPacked.cpp diff -u llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.15 llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.16 --- llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.15 Sat Dec 30 23:48:39 2006 +++ llvm/lib/Transforms/Scalar/LowerPacked.cpp Mon Feb 5 17:32:05 2007 @@ -19,6 +19,7 @@ #include "llvm/Function.h" #include "llvm/Instructions.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/Streams.h" #include "llvm/ADT/StringExtras.h" @@ -36,7 +37,8 @@ /// /// @brief Transforms packed instructions to simpler instructions. /// -class LowerPacked : public FunctionPass, public InstVisitor { +class VISIBILITY_HIDDEN LowerPacked + : public FunctionPass, public InstVisitor { public: /// @brief Lowers packed operations to scalar operations. /// @param F The fuction to process Index: llvm/lib/Transforms/Scalar/Reassociate.cpp diff -u llvm/lib/Transforms/Scalar/Reassociate.cpp:1.73 llvm/lib/Transforms/Scalar/Reassociate.cpp:1.74 --- llvm/lib/Transforms/Scalar/Reassociate.cpp:1.73 Sat Jan 20 18:29:25 2007 +++ llvm/lib/Transforms/Scalar/Reassociate.cpp Mon Feb 5 17:32:05 2007 @@ -29,6 +29,7 @@ #include "llvm/Pass.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/Statistic.h" @@ -41,7 +42,7 @@ STATISTIC(NumFactor , "Number of multiplies factored"); namespace { - struct ValueEntry { + struct VISIBILITY_HIDDEN ValueEntry { unsigned Rank; Value *Op; ValueEntry(unsigned R, Value *O) : Rank(R), Op(O) {} @@ -63,7 +64,7 @@ } namespace { - class Reassociate : public FunctionPass { + class VISIBILITY_HIDDEN Reassociate : public FunctionPass { std::map RankMap; std::map ValueRankMap; bool MadeChange; Index: llvm/lib/Transforms/Scalar/Reg2Mem.cpp diff -u llvm/lib/Transforms/Scalar/Reg2Mem.cpp:1.10 llvm/lib/Transforms/Scalar/Reg2Mem.cpp:1.11 --- llvm/lib/Transforms/Scalar/Reg2Mem.cpp:1.10 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/Scalar/Reg2Mem.cpp Mon Feb 5 17:32:05 2007 @@ -25,13 +25,14 @@ #include "llvm/BasicBlock.h" #include "llvm/Instructions.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; STATISTIC(NumDemoted, "Number of registers demoted"); namespace { - struct RegToMem : public FunctionPass { + struct VISIBILITY_HIDDEN RegToMem : public FunctionPass { virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequiredID(BreakCriticalEdgesID); Index: llvm/lib/Transforms/Scalar/SCCP.cpp diff -u llvm/lib/Transforms/Scalar/SCCP.cpp:1.161 llvm/lib/Transforms/Scalar/SCCP.cpp:1.162 --- llvm/lib/Transforms/Scalar/SCCP.cpp:1.161 Fri Feb 2 16:36:16 2007 +++ llvm/lib/Transforms/Scalar/SCCP.cpp Mon Feb 5 17:32:05 2007 @@ -31,6 +31,7 @@ #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/InstVisitor.h" #include "llvm/ADT/DenseMap.h" @@ -53,7 +54,7 @@ /// LatticeVal class - This class represents the different lattice values that /// an LLVM value may occupy. It is a simple class with value semantics. /// -class LatticeVal { +class VISIBILITY_HIDDEN LatticeVal { enum { /// undefined - This LLVM Value has no known value yet. undefined, @@ -1332,7 +1333,7 @@ /// SCCP Class - This class uses the SCCPSolver to implement a per-function /// Sparse Conditional Constant Propagator. /// - struct SCCP : public FunctionPass { + struct VISIBILITY_HIDDEN SCCP : public FunctionPass { // runOnFunction - Run the Sparse Conditional Constant Propagation // algorithm, and return true if the function was modified. // @@ -1440,7 +1441,7 @@ /// IPSCCP Class - This class implements interprocedural Sparse Conditional /// Constant Propagation. /// - struct IPSCCP : public ModulePass { + struct VISIBILITY_HIDDEN IPSCCP : public ModulePass { bool runOnModule(Module &M); }; Index: llvm/lib/Transforms/Scalar/SimplifyCFG.cpp diff -u llvm/lib/Transforms/Scalar/SimplifyCFG.cpp:1.18 llvm/lib/Transforms/Scalar/SimplifyCFG.cpp:1.19 --- llvm/lib/Transforms/Scalar/SimplifyCFG.cpp:1.18 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/SimplifyCFG.cpp Mon Feb 5 17:32:05 2007 @@ -25,6 +25,7 @@ #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Pass.h" #include "llvm/ADT/Statistic.h" #include @@ -33,7 +34,7 @@ STATISTIC(NumSimpl, "Number of blocks simplified"); namespace { - struct CFGSimplifyPass : public FunctionPass { + struct VISIBILITY_HIDDEN CFGSimplifyPass : public FunctionPass { virtual bool runOnFunction(Function &F); }; RegisterPass X("simplifycfg", "Simplify the CFG"); Index: llvm/lib/Transforms/Scalar/TailDuplication.cpp diff -u llvm/lib/Transforms/Scalar/TailDuplication.cpp:1.36 llvm/lib/Transforms/Scalar/TailDuplication.cpp:1.37 --- llvm/lib/Transforms/Scalar/TailDuplication.cpp:1.36 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/TailDuplication.cpp Mon Feb 5 17:32:05 2007 @@ -29,6 +29,7 @@ #include "llvm/Support/CFG.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" using namespace llvm; @@ -39,7 +40,7 @@ cl::opt Threshold("taildup-threshold", cl::desc("Max block size to tail duplicate"), cl::init(6), cl::Hidden); - class TailDup : public FunctionPass { + class VISIBILITY_HIDDEN TailDup : public FunctionPass { bool runOnFunction(Function &F); private: inline bool shouldEliminateUnconditionalBranch(TerminatorInst *TI); Index: llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp diff -u llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp:1.27 llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp:1.28 --- llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp:1.27 Tue Dec 19 15:40:18 2006 +++ llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp Mon Feb 5 17:32:05 2007 @@ -59,13 +59,14 @@ #include "llvm/Pass.h" #include "llvm/Support/CFG.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" using namespace llvm; STATISTIC(NumEliminated, "Number of tail calls removed"); STATISTIC(NumAccumAdded, "Number of accumulators introduced"); namespace { - struct TailCallElim : public FunctionPass { + struct VISIBILITY_HIDDEN TailCallElim : public FunctionPass { virtual bool runOnFunction(Function &F); private: From reid at x10sys.com Mon Feb 5 17:32:26 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:32:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/ArgumentPromotion.cpp ConstantMerge.cpp DeadArgumentElimination.cpp DeadTypeElimination.cpp ExtractFunction.cpp GlobalDCE.cpp GlobalOpt.cpp IPConstantPropagation.cpp IndMemRemoval.cpp InlineSimple.cpp Internalize.cpp LoopExtractor.cpp LowerSetJmp.cpp PruneEH.cpp RaiseAllocations.cpp SimplifyLibCalls.cpp StripSymbols.cpp Message-ID: <200702052332.l15NWQBg006118@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: ArgumentPromotion.cpp updated: 1.34 -> 1.35 ConstantMerge.cpp updated: 1.34 -> 1.35 DeadArgumentElimination.cpp updated: 1.36 -> 1.37 DeadTypeElimination.cpp updated: 1.61 -> 1.62 ExtractFunction.cpp updated: 1.18 -> 1.19 GlobalDCE.cpp updated: 1.41 -> 1.42 GlobalOpt.cpp updated: 1.94 -> 1.95 IPConstantPropagation.cpp updated: 1.22 -> 1.23 IndMemRemoval.cpp updated: 1.13 -> 1.14 InlineSimple.cpp updated: 1.77 -> 1.78 Internalize.cpp updated: 1.43 -> 1.44 LoopExtractor.cpp updated: 1.22 -> 1.23 LowerSetJmp.cpp updated: 1.38 -> 1.39 PruneEH.cpp updated: 1.28 -> 1.29 RaiseAllocations.cpp updated: 1.37 -> 1.38 SimplifyLibCalls.cpp updated: 1.91 -> 1.92 StripSymbols.cpp updated: 1.12 -> 1.13 --- Log message: Apply the VISIBILITY_HIDDEN field to the remaining anonymous classes in the Transforms library. This reduces debug library size by 132 KB, debug binary size by 376 KB, and reduces link time for llvm tools slightly. --- Diffs of the changes: (+71 -51) ArgumentPromotion.cpp | 3 + ConstantMerge.cpp | 3 + DeadArgumentElimination.cpp | 3 + DeadTypeElimination.cpp | 3 + ExtractFunction.cpp | 4 +- GlobalDCE.cpp | 3 + GlobalOpt.cpp | 5 +-- IPConstantPropagation.cpp | 3 + IndMemRemoval.cpp | 3 + InlineSimple.cpp | 7 ++-- Internalize.cpp | 3 + LoopExtractor.cpp | 3 + LowerSetJmp.cpp | 3 + PruneEH.cpp | 3 + RaiseAllocations.cpp | 3 + SimplifyLibCalls.cpp | 67 ++++++++++++++++++++++---------------------- StripSymbols.cpp | 3 + 17 files changed, 71 insertions(+), 51 deletions(-) Index: llvm/lib/Transforms/IPO/ArgumentPromotion.cpp diff -u llvm/lib/Transforms/IPO/ArgumentPromotion.cpp:1.34 llvm/lib/Transforms/IPO/ArgumentPromotion.cpp:1.35 --- llvm/lib/Transforms/IPO/ArgumentPromotion.cpp:1.34 Thu Jan 25 18:47:38 2007 +++ llvm/lib/Transforms/IPO/ArgumentPromotion.cpp Mon Feb 5 17:32:05 2007 @@ -44,6 +44,7 @@ #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -54,7 +55,7 @@ namespace { /// ArgPromotion - The 'by reference' to 'by value' argument promotion pass. /// - struct ArgPromotion : public CallGraphSCCPass { + struct VISIBILITY_HIDDEN ArgPromotion : public CallGraphSCCPass { virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addRequired(); Index: llvm/lib/Transforms/IPO/ConstantMerge.cpp diff -u llvm/lib/Transforms/IPO/ConstantMerge.cpp:1.34 llvm/lib/Transforms/IPO/ConstantMerge.cpp:1.35 --- llvm/lib/Transforms/IPO/ConstantMerge.cpp:1.34 Tue Dec 19 16:09:18 2006 +++ llvm/lib/Transforms/IPO/ConstantMerge.cpp Mon Feb 5 17:32:05 2007 @@ -22,12 +22,13 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" using namespace llvm; STATISTIC(NumMerged, "Number of global constants merged"); namespace { - struct ConstantMerge : public ModulePass { + struct VISIBILITY_HIDDEN ConstantMerge : public ModulePass { // run - For this pass, process all of the globals in the module, // eliminating duplicate constants. // Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp diff -u llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.36 llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.37 --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.36 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp Mon Feb 5 17:32:05 2007 @@ -29,6 +29,7 @@ #include "llvm/Support/CallSite.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -38,7 +39,7 @@ namespace { /// DAE - The dead argument elimination pass. /// - class DAE : public ModulePass { + class VISIBILITY_HIDDEN DAE : public ModulePass { /// Liveness enum - During our initial pass over the program, we determine /// that things are either definately alive, definately dead, or in need of /// interprocedural analysis (MaybeLive). Index: llvm/lib/Transforms/IPO/DeadTypeElimination.cpp diff -u llvm/lib/Transforms/IPO/DeadTypeElimination.cpp:1.61 llvm/lib/Transforms/IPO/DeadTypeElimination.cpp:1.62 --- llvm/lib/Transforms/IPO/DeadTypeElimination.cpp:1.61 Sun Jan 14 20:27:26 2007 +++ llvm/lib/Transforms/IPO/DeadTypeElimination.cpp Mon Feb 5 17:32:05 2007 @@ -19,12 +19,13 @@ #include "llvm/TypeSymbolTable.h" #include "llvm/DerivedTypes.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" using namespace llvm; STATISTIC(NumKilled, "Number of unused typenames removed from symtab"); namespace { - struct DTE : public ModulePass { + struct VISIBILITY_HIDDEN DTE : public ModulePass { // doPassInitialization - For this pass, it removes global symbol table // entries for primitive types. These are never used for linking in GCC and // they make the output uglier to look at, so we nuke them. Index: llvm/lib/Transforms/IPO/ExtractFunction.cpp diff -u llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.18 llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.19 --- llvm/lib/Transforms/IPO/ExtractFunction.cpp:1.18 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/IPO/ExtractFunction.cpp Mon Feb 5 17:32:05 2007 @@ -15,10 +15,12 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Transforms/IPO.h" +#include "llvm/Support/Compiler.h" using namespace llvm; namespace { - class FunctionExtractorPass : public ModulePass { + /// @brief A pass to extract specific functions and their dependencies. + class VISIBILITY_HIDDEN FunctionExtractorPass : public ModulePass { Function *Named; bool deleteFunc; bool reLink; Index: llvm/lib/Transforms/IPO/GlobalDCE.cpp diff -u llvm/lib/Transforms/IPO/GlobalDCE.cpp:1.41 llvm/lib/Transforms/IPO/GlobalDCE.cpp:1.42 --- llvm/lib/Transforms/IPO/GlobalDCE.cpp:1.41 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/GlobalDCE.cpp Mon Feb 5 17:32:05 2007 @@ -21,6 +21,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -28,7 +29,7 @@ STATISTIC(NumVariables, "Number of global variables removed"); namespace { - struct GlobalDCE : public ModulePass { + struct VISIBILITY_HIDDEN GlobalDCE : public ModulePass { // run - Do the GlobalDCE pass on the specified module, optionally updating // the specified callgraph to reflect the changes. // Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp diff -u llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.94 llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.95 --- llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.94 Thu Feb 1 20:16:22 2007 +++ llvm/lib/Transforms/IPO/GlobalOpt.cpp Mon Feb 5 17:32:05 2007 @@ -24,6 +24,7 @@ #include "llvm/Pass.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Target/TargetData.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" @@ -45,7 +46,7 @@ STATISTIC(NumCtorsEvaluated, "Number of static ctors evaluated"); namespace { - struct GlobalOpt : public ModulePass { + struct VISIBILITY_HIDDEN GlobalOpt : public ModulePass { virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); } @@ -68,7 +69,7 @@ /// GlobalStatus - As we analyze each global, keep track of some information /// about it. If we find out that the address of the global is taken, none of /// this info will be accurate. -struct GlobalStatus { +struct VISIBILITY_HIDDEN GlobalStatus { /// isLoaded - True if the global is ever loaded. If the global isn't ever /// loaded it can be deleted. bool isLoaded; Index: llvm/lib/Transforms/IPO/IPConstantPropagation.cpp diff -u llvm/lib/Transforms/IPO/IPConstantPropagation.cpp:1.22 llvm/lib/Transforms/IPO/IPConstantPropagation.cpp:1.23 --- llvm/lib/Transforms/IPO/IPConstantPropagation.cpp:1.22 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/IPConstantPropagation.cpp Mon Feb 5 17:32:05 2007 @@ -22,6 +22,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" #include "llvm/ADT/Statistic.h" using namespace llvm; @@ -31,7 +32,7 @@ namespace { /// IPCP - The interprocedural constant propagation pass /// - struct IPCP : public ModulePass { + struct VISIBILITY_HIDDEN IPCP : public ModulePass { bool runOnModule(Module &M); private: bool PropagateConstantsIntoArguments(Function &F); Index: llvm/lib/Transforms/IPO/IndMemRemoval.cpp diff -u llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.13 llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.14 --- llvm/lib/Transforms/IPO/IndMemRemoval.cpp:1.13 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/IPO/IndMemRemoval.cpp Mon Feb 5 17:32:05 2007 @@ -23,13 +23,14 @@ #include "llvm/Type.h" #include "llvm/DerivedTypes.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Compiler.h" using namespace llvm; STATISTIC(NumBounceSites, "Number of sites modified"); STATISTIC(NumBounce , "Number of bounce functions created"); namespace { - class IndMemRemPass : public ModulePass { + class VISIBILITY_HIDDEN IndMemRemPass : public ModulePass { public: virtual bool runOnModule(Module &M); }; Index: llvm/lib/Transforms/IPO/InlineSimple.cpp diff -u llvm/lib/Transforms/IPO/InlineSimple.cpp:1.77 llvm/lib/Transforms/IPO/InlineSimple.cpp:1.78 --- llvm/lib/Transforms/IPO/InlineSimple.cpp:1.77 Thu Jan 25 18:47:38 2007 +++ llvm/lib/Transforms/IPO/InlineSimple.cpp Mon Feb 5 17:32:05 2007 @@ -18,11 +18,12 @@ #include "llvm/Function.h" #include "llvm/Type.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" #include "llvm/Transforms/IPO.h" using namespace llvm; namespace { - struct ArgInfo { + struct VISIBILITY_HIDDEN ArgInfo { unsigned ConstantWeight; unsigned AllocaWeight; @@ -32,7 +33,7 @@ // FunctionInfo - For each function, calculate the size of it in blocks and // instructions. - struct FunctionInfo { + struct VISIBILITY_HIDDEN FunctionInfo { // NumInsts, NumBlocks - Keep track of how large each function is, which is // used to estimate the code size cost of inlining it. unsigned NumInsts, NumBlocks; @@ -50,7 +51,7 @@ void analyzeFunction(Function *F); }; - class SimpleInliner : public Inliner { + class VISIBILITY_HIDDEN SimpleInliner : public Inliner { std::map CachedFunctionInfo; public: int getInlineCost(CallSite CS); Index: llvm/lib/Transforms/IPO/Internalize.cpp diff -u llvm/lib/Transforms/IPO/Internalize.cpp:1.43 llvm/lib/Transforms/IPO/Internalize.cpp:1.44 --- llvm/lib/Transforms/IPO/Internalize.cpp:1.43 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/IPO/Internalize.cpp Mon Feb 5 17:32:05 2007 @@ -18,6 +18,7 @@ #include "llvm/Pass.h" #include "llvm/Module.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" #include @@ -41,7 +42,7 @@ cl::desc("A list of symbol names to preserve"), cl::CommaSeparated); - class InternalizePass : public ModulePass { + class VISIBILITY_HIDDEN InternalizePass : public ModulePass { std::set ExternalNames; bool DontInternalize; public: Index: llvm/lib/Transforms/IPO/LoopExtractor.cpp diff -u llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.22 llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.23 --- llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.22 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Transforms/IPO/LoopExtractor.cpp Mon Feb 5 17:32:05 2007 @@ -21,6 +21,7 @@ #include "llvm/Pass.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Support/Compiler.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/FunctionUtils.h" #include "llvm/ADT/Statistic.h" @@ -32,7 +33,7 @@ // FIXME: This is not a function pass, but the PassManager doesn't allow // Module passes to require FunctionPasses, so we can't get loop info if we're // not a function pass. - struct LoopExtractor : public FunctionPass { + struct VISIBILITY_HIDDEN LoopExtractor : public FunctionPass { unsigned NumLoops; LoopExtractor(unsigned numLoops = ~0) : NumLoops(numLoops) {} Index: llvm/lib/Transforms/IPO/LowerSetJmp.cpp diff -u llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.38 llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.39 --- llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.38 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/IPO/LowerSetJmp.cpp Mon Feb 5 17:32:05 2007 @@ -42,6 +42,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/ADT/DepthFirstIterator.h" @@ -58,7 +59,7 @@ namespace { //===--------------------------------------------------------------------===// // LowerSetJmp pass implementation. - class LowerSetJmp : public ModulePass, + class VISIBILITY_HIDDEN LowerSetJmp : public ModulePass, public InstVisitor { // LLVM library functions... Constant *InitSJMap; // __llvm_sjljeh_init_setjmpmap Index: llvm/lib/Transforms/IPO/PruneEH.cpp diff -u llvm/lib/Transforms/IPO/PruneEH.cpp:1.28 llvm/lib/Transforms/IPO/PruneEH.cpp:1.29 --- llvm/lib/Transforms/IPO/PruneEH.cpp:1.28 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/IPO/PruneEH.cpp Mon Feb 5 17:32:05 2007 @@ -24,6 +24,7 @@ #include "llvm/Analysis/CallGraph.h" #include "llvm/ADT/Statistic.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include #include using namespace llvm; @@ -32,7 +33,7 @@ STATISTIC(NumUnreach, "Number of noreturn calls optimized"); namespace { - struct PruneEH : public CallGraphSCCPass { + struct VISIBILITY_HIDDEN PruneEH : public CallGraphSCCPass { /// DoesNotUnwind - This set contains all of the functions which we have /// determined cannot unwind. std::set DoesNotUnwind; Index: llvm/lib/Transforms/IPO/RaiseAllocations.cpp diff -u llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.37 llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.38 --- llvm/lib/Transforms/IPO/RaiseAllocations.cpp:1.37 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Transforms/IPO/RaiseAllocations.cpp Mon Feb 5 17:32:05 2007 @@ -20,6 +20,7 @@ #include "llvm/Instructions.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" #include "llvm/ADT/Statistic.h" using namespace llvm; @@ -29,7 +30,7 @@ // RaiseAllocations - Turn %malloc and %free calls into the appropriate // instruction. // - class RaiseAllocations : public ModulePass { + class VISIBILITY_HIDDEN RaiseAllocations : public ModulePass { Function *MallocFunc; // Functions in the module we are processing Function *FreeFunc; // Initialized by doPassInitializationVirt public: Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.91 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.92 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.91 Wed Jan 31 13:59:55 2007 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Mon Feb 5 17:32:05 2007 @@ -26,6 +26,7 @@ #include "llvm/ADT/hash_map" #include "llvm/ADT/Statistic.h" #include "llvm/Config/config.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Target/TargetData.h" #include "llvm/Transforms/IPO.h" @@ -62,7 +63,7 @@ /// generally short-circuit actually calling the function if there's a simpler /// way (e.g. strlen(X) can be reduced to a constant if X is a constant global). /// @brief Base class for library call optimizations -class LibCallOptimization { +class VISIBILITY_HIDDEN LibCallOptimization { LibCallOptimization **Prev, *Next; const char *FunctionName; ///< Name of the library call we optimize #ifndef NDEBUG @@ -142,7 +143,7 @@ /// validate the call (ValidateLibraryCall). If it is validated, then /// the OptimizeCall method is also called. /// @brief A ModulePass for optimizing well-known function calls. -class SimplifyLibCalls : public ModulePass { +class VISIBILITY_HIDDEN SimplifyLibCalls : public ModulePass { public: /// We need some target data for accurate signature details that are /// target dependent. So we require target data in our AnalysisUsage. @@ -383,15 +384,16 @@ namespace { // Forward declare utility functions. -bool getConstantStringLength(Value* V, uint64_t& len, ConstantArray** A = 0 ); -Value *CastToCStr(Value *V, Instruction &IP); +static bool getConstantStringLength(Value* V, uint64_t& len, + ConstantArray** A = 0 ); +static Value *CastToCStr(Value *V, Instruction &IP); /// This LibCallOptimization will find instances of a call to "exit" that occurs /// within the "main" function and change it to a simple "ret" instruction with /// the same value passed to the exit function. When this is done, it splits the /// basic block at the exit(3) call and deletes the call instruction. /// @brief Replace calls to exit in main with a simple return -struct ExitInMainOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN ExitInMainOptimization : public LibCallOptimization { ExitInMainOptimization() : LibCallOptimization("exit", "Number of 'exit' calls simplified") {} @@ -447,7 +449,7 @@ /// of the constant string. Both of these calls are further reduced, if possible /// on subsequent passes. /// @brief Simplify the strcat library function. -struct StrCatOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrCatOptimization : public LibCallOptimization { public: /// @brief Default constructor StrCatOptimization() : LibCallOptimization("strcat", @@ -530,7 +532,7 @@ /// function. It optimizes out cases where the arguments are both constant /// and the result can be determined statically. /// @brief Simplify the strcmp library function. -struct StrChrOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrChrOptimization : public LibCallOptimization { public: StrChrOptimization() : LibCallOptimization("strchr", "Number of 'strchr' calls simplified") {} @@ -611,7 +613,7 @@ /// function. It optimizes out cases where one or both arguments are constant /// and the result can be determined statically. /// @brief Simplify the strcmp library function. -struct StrCmpOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrCmpOptimization : public LibCallOptimization { public: StrCmpOptimization() : LibCallOptimization("strcmp", "Number of 'strcmp' calls simplified") {} @@ -688,7 +690,7 @@ /// function. It optimizes out cases where one or both arguments are constant /// and the result can be determined statically. /// @brief Simplify the strncmp library function. -struct StrNCmpOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrNCmpOptimization : public LibCallOptimization { public: StrNCmpOptimization() : LibCallOptimization("strncmp", "Number of 'strncmp' calls simplified") {} @@ -781,7 +783,7 @@ /// (1) If src and dest are the same and not volatile, just return dest /// (2) If the src is a constant then we can convert to llvm.memmove /// @brief Simplify the strcpy library function. -struct StrCpyOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrCpyOptimization : public LibCallOptimization { public: StrCpyOptimization() : LibCallOptimization("strcpy", "Number of 'strcpy' calls simplified") {} @@ -859,7 +861,7 @@ /// function by replacing it with a constant value if the string provided to /// it is a constant array. /// @brief Simplify the strlen library function. -struct StrLenOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN StrLenOptimization : public LibCallOptimization { StrLenOptimization() : LibCallOptimization("strlen", "Number of 'strlen' calls simplified") {} @@ -947,7 +949,7 @@ /// This memcmpOptimization will simplify a call to the memcmp library /// function. -struct memcmpOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN memcmpOptimization : public LibCallOptimization { /// @brief Default Constructor memcmpOptimization() : LibCallOptimization("memcmp", "Number of 'memcmp' calls simplified") {} @@ -1052,7 +1054,7 @@ /// bytes depending on the length of the string and the alignment. Additional /// optimizations are possible in code generation (sequence of immediate store) /// @brief Simplify the memcpy library function. -struct LLVMMemCpyMoveOptzn : public LibCallOptimization { +struct VISIBILITY_HIDDEN LLVMMemCpyMoveOptzn : public LibCallOptimization { LLVMMemCpyMoveOptzn(const char* fname, const char* desc) : LibCallOptimization(fname, desc) {} @@ -1129,7 +1131,7 @@ /// This LibCallOptimization will simplify a call to the memset library /// function by expanding it out to a single store of size 0, 1, 2, 4, or 8 /// bytes depending on the length argument. -struct LLVMMemSetOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN LLVMMemSetOptimization : public LibCallOptimization { /// @brief Default Constructor LLVMMemSetOptimization(const char *Name) : LibCallOptimization(Name, "Number of 'llvm.memset' calls simplified") {} @@ -1232,7 +1234,7 @@ /// function. It looks for cases where the result of pow is well known and /// substitutes the appropriate value. /// @brief Simplify the pow library function. -struct PowOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN PowOptimization : public LibCallOptimization { public: /// @brief Default Constructor PowOptimization() : LibCallOptimization("pow", @@ -1293,7 +1295,7 @@ /// function. It looks for cases where the result of printf is not used and the /// operation can be reduced to something simpler. /// @brief Simplify the printf library function. -struct PrintfOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN PrintfOptimization : public LibCallOptimization { public: /// @brief Default Constructor PrintfOptimization() : LibCallOptimization("printf", @@ -1371,7 +1373,7 @@ /// function. It looks for cases where the result of fprintf is not used and the /// operation can be reduced to something simpler. /// @brief Simplify the fprintf library function. -struct FPrintFOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN FPrintFOptimization : public LibCallOptimization { public: /// @brief Default Constructor FPrintFOptimization() : LibCallOptimization("fprintf", @@ -1491,7 +1493,7 @@ /// function. It looks for cases where the result of sprintf is not used and the /// operation can be reduced to something simpler. /// @brief Simplify the sprintf library function. -struct SPrintFOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN SPrintFOptimization : public LibCallOptimization { public: /// @brief Default Constructor SPrintFOptimization() : LibCallOptimization("sprintf", @@ -1614,7 +1616,7 @@ /// function. It looks for cases where the result of fputs is not used and the /// operation can be reduced to something simpler. /// @brief Simplify the puts library function. -struct PutsOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN PutsOptimization : public LibCallOptimization { public: /// @brief Default Constructor PutsOptimization() : LibCallOptimization("fputs", @@ -1675,7 +1677,7 @@ /// This LibCallOptimization will simplify calls to the "isdigit" library /// function. It simply does range checks the parameter explicitly. /// @brief Simplify the isdigit library function. -struct isdigitOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN isdigitOptimization : public LibCallOptimization { public: isdigitOptimization() : LibCallOptimization("isdigit", "Number of 'isdigit' calls simplified") {} @@ -1716,7 +1718,7 @@ } } isdigitOptimizer; -struct isasciiOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN isasciiOptimization : public LibCallOptimization { public: isasciiOptimization() : LibCallOptimization("isascii", "Number of 'isascii' calls simplified") {} @@ -1746,7 +1748,7 @@ /// function. It simply does the corresponding and operation to restrict the /// range of values to the ASCII character set (0-127). /// @brief Simplify the toascii library function. -struct ToAsciiOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN ToAsciiOptimization : public LibCallOptimization { public: /// @brief Default Constructor ToAsciiOptimization() : LibCallOptimization("toascii", @@ -1775,7 +1777,7 @@ /// optimization is to compute the result at compile time if the argument is /// a constant. /// @brief Simplify the ffs library function. -struct FFSOptimization : public LibCallOptimization { +struct VISIBILITY_HIDDEN FFSOptimization : public LibCallOptimization { protected: /// @brief Subclass Constructor FFSOptimization(const char* funcName, const char* description) @@ -1855,7 +1857,7 @@ /// calls. It simply uses FFSOptimization for which the transformation is /// identical. /// @brief Simplify the ffsl library function. -struct FFSLOptimization : public FFSOptimization { +struct VISIBILITY_HIDDEN FFSLOptimization : public FFSOptimization { public: /// @brief Default Constructor FFSLOptimization() : FFSOptimization("ffsl", @@ -1867,7 +1869,7 @@ /// calls. It simply uses FFSOptimization for which the transformation is /// identical. /// @brief Simplify the ffsl library function. -struct FFSLLOptimization : public FFSOptimization { +struct VISIBILITY_HIDDEN FFSLLOptimization : public FFSOptimization { public: /// @brief Default Constructor FFSLLOptimization() : FFSOptimization("ffsll", @@ -1909,7 +1911,7 @@ }; -struct FloorOptimization : public UnaryDoubleFPOptimizer { +struct VISIBILITY_HIDDEN FloorOptimization : public UnaryDoubleFPOptimizer { FloorOptimization() : UnaryDoubleFPOptimizer("floor", "Number of 'floor' calls simplified") {} @@ -1923,7 +1925,7 @@ } } FloorOptimizer; -struct CeilOptimization : public UnaryDoubleFPOptimizer { +struct VISIBILITY_HIDDEN CeilOptimization : public UnaryDoubleFPOptimizer { CeilOptimization() : UnaryDoubleFPOptimizer("ceil", "Number of 'ceil' calls simplified") {} @@ -1937,7 +1939,7 @@ } } CeilOptimizer; -struct RoundOptimization : public UnaryDoubleFPOptimizer { +struct VISIBILITY_HIDDEN RoundOptimization : public UnaryDoubleFPOptimizer { RoundOptimization() : UnaryDoubleFPOptimizer("round", "Number of 'round' calls simplified") {} @@ -1951,7 +1953,7 @@ } } RoundOptimizer; -struct RintOptimization : public UnaryDoubleFPOptimizer { +struct VISIBILITY_HIDDEN RintOptimization : public UnaryDoubleFPOptimizer { RintOptimization() : UnaryDoubleFPOptimizer("rint", "Number of 'rint' calls simplified") {} @@ -1965,7 +1967,7 @@ } } RintOptimizer; -struct NearByIntOptimization : public UnaryDoubleFPOptimizer { +struct VISIBILITY_HIDDEN NearByIntOptimization : public UnaryDoubleFPOptimizer { NearByIntOptimization() : UnaryDoubleFPOptimizer("nearbyint", "Number of 'nearbyint' calls simplified") {} @@ -1990,7 +1992,8 @@ /// of the null-terminated string. If false is returned, the conditions were /// not met and len is set to 0. /// @brief Get the length of a constant string (null-terminated array). -bool getConstantStringLength(Value *V, uint64_t &len, ConstantArray **CA) { +static bool getConstantStringLength(Value *V, uint64_t &len, ConstantArray **CA) +{ assert(V != 0 && "Invalid args to getConstantStringLength"); len = 0; // make sure we initialize this User* GEP = 0; @@ -2079,7 +2082,7 @@ /// CastToCStr - Return V if it is an sbyte*, otherwise cast it to sbyte*, /// inserting the cast before IP, and return the cast. /// @brief Cast a value to a "C" string. -Value *CastToCStr(Value *V, Instruction &IP) { +static Value *CastToCStr(Value *V, Instruction &IP) { assert(isa(V->getType()) && "Can't cast non-pointer type to C string type"); const Type *SBPTy = PointerType::get(Type::Int8Ty); Index: llvm/lib/Transforms/IPO/StripSymbols.cpp diff -u llvm/lib/Transforms/IPO/StripSymbols.cpp:1.12 llvm/lib/Transforms/IPO/StripSymbols.cpp:1.13 --- llvm/lib/Transforms/IPO/StripSymbols.cpp:1.12 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/IPO/StripSymbols.cpp Mon Feb 5 17:32:05 2007 @@ -30,10 +30,11 @@ #include "llvm/Pass.h" #include "llvm/ValueSymbolTable.h" #include "llvm/TypeSymbolTable.h" +#include "llvm/Support/Compiler.h" using namespace llvm; namespace { - class StripSymbols : public ModulePass { + class VISIBILITY_HIDDEN StripSymbols : public ModulePass { bool OnlyDebugInfo; public: StripSymbols(bool ODI = false) : OnlyDebugInfo(ODI) {} From reid at x10sys.com Mon Feb 5 17:32:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:32:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp EdgeProfiling.cpp EmitFunctions.cpp RSProfiling.cpp TraceBasicBlocks.cpp Message-ID: <200702052332.l15NWTa5006132@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Instrumentation: BlockProfiling.cpp updated: 1.21 -> 1.22 EdgeProfiling.cpp updated: 1.11 -> 1.12 EmitFunctions.cpp updated: 1.28 -> 1.29 RSProfiling.cpp updated: 1.18 -> 1.19 TraceBasicBlocks.cpp updated: 1.22 -> 1.23 --- Log message: Apply the VISIBILITY_HIDDEN field to the remaining anonymous classes in the Transforms library. This reduces debug library size by 132 KB, debug binary size by 376 KB, and reduces link time for llvm tools slightly. --- Diffs of the changes: (+15 -10) BlockProfiling.cpp | 3 ++- EdgeProfiling.cpp | 3 ++- EmitFunctions.cpp | 3 ++- RSProfiling.cpp | 13 +++++++------ TraceBasicBlocks.cpp | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) Index: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.21 llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.22 --- llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.21 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp Mon Feb 5 17:32:05 2007 @@ -23,6 +23,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/Module.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" #include "llvm/Transforms/Instrumentation.h" #include "RSProfiling.h" @@ -30,7 +31,7 @@ using namespace llvm; namespace { - class FunctionProfiler : public RSProfilers_std { + class VISIBILITY_HIDDEN FunctionProfiler : public RSProfilers_std { bool runOnModule(Module &M); }; Index: llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.11 llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.12 --- llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp:1.11 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp Mon Feb 5 17:32:05 2007 @@ -22,6 +22,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/Module.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Instrumentation.h" @@ -29,7 +30,7 @@ using namespace llvm; namespace { - class EdgeProfiler : public ModulePass { + class VISIBILITY_HIDDEN EdgeProfiler : public ModulePass { bool runOnModule(Module &M); }; Index: llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp diff -u llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.28 llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.29 --- llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.28 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp Mon Feb 5 17:32:05 2007 @@ -24,6 +24,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Transforms/Instrumentation.h" using namespace llvm; @@ -36,7 +37,7 @@ BLACK }; - struct EmitFunctionTable : public ModulePass { + struct VISIBILITY_HIDDEN EmitFunctionTable : public ModulePass { bool runOnModule(Module &M); }; Index: llvm/lib/Transforms/Instrumentation/RSProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.18 llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.19 --- llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.18 Tue Jan 30 14:08:38 2007 +++ llvm/lib/Transforms/Instrumentation/RSProfiling.cpp Mon Feb 5 17:32:05 2007 @@ -40,6 +40,7 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Instrumentation.h" #include "RSProfiling.h" @@ -66,7 +67,7 @@ /// NullProfilerRS - The basic profiler that does nothing. It is the default /// profiler and thus terminates RSProfiler chains. It is useful for /// measuring framework overhead - class NullProfilerRS : public RSProfilers { + class VISIBILITY_HIDDEN NullProfilerRS : public RSProfilers { public: bool isProfiling(Value* v) { return false; @@ -85,7 +86,7 @@ static RegisterAnalysisGroup NPT(NP); /// Chooser - Something that chooses when to make a sample of the profiled code - class Chooser { + class VISIBILITY_HIDDEN Chooser { public: /// ProcessChoicePoint - is called for each basic block inserted to choose /// between normal and sample code @@ -99,7 +100,7 @@ //Things that implement sampling policies //A global value that is read-mod-stored to choose when to sample. //A sample is taken when the global counter hits 0 - class GlobalRandomCounter : public Chooser { + class VISIBILITY_HIDDEN GlobalRandomCounter : public Chooser { GlobalVariable* Counter; Value* ResetValue; const Type* T; @@ -111,7 +112,7 @@ }; //Same is GRC, but allow register allocation of the global counter - class GlobalRandomCounterOpt : public Chooser { + class VISIBILITY_HIDDEN GlobalRandomCounterOpt : public Chooser { GlobalVariable* Counter; Value* ResetValue; AllocaInst* AI; @@ -125,7 +126,7 @@ //Use the cycle counter intrinsic as a source of pseudo randomness when //deciding when to sample. - class CycleCounter : public Chooser { + class VISIBILITY_HIDDEN CycleCounter : public Chooser { uint64_t rm; Constant *F; public: @@ -136,7 +137,7 @@ }; /// ProfilerRS - Insert the random sampling framework - struct ProfilerRS : public FunctionPass { + struct VISIBILITY_HIDDEN ProfilerRS : public FunctionPass { std::map TransCache; std::set ChoicePoints; Chooser* c; Index: llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp diff -u llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.22 llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.23 --- llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp:1.22 Mon Feb 5 15:19:13 2007 +++ llvm/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp Mon Feb 5 17:32:05 2007 @@ -21,12 +21,13 @@ #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Instrumentation.h" #include "llvm/Instructions.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include using namespace llvm; namespace { - class TraceBasicBlocks : public ModulePass { + class VISIBILITY_HIDDEN TraceBasicBlocks : public ModulePass { bool runOnModule(Module &M); }; From reid at x10sys.com Mon Feb 5 17:32:29 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:32:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/CloneFunction.cpp CodeExtractor.cpp LCSSA.cpp LowerSelect.cpp Message-ID: <200702052332.l15NWTk8006143@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: CloneFunction.cpp updated: 1.41 -> 1.42 CodeExtractor.cpp updated: 1.48 -> 1.49 LCSSA.cpp updated: 1.34 -> 1.35 LowerSelect.cpp updated: 1.9 -> 1.10 --- Log message: Apply the VISIBILITY_HIDDEN field to the remaining anonymous classes in the Transforms library. This reduces debug library size by 132 KB, debug binary size by 376 KB, and reduces link time for llvm tools slightly. --- Diffs of the changes: (+8 -4) CloneFunction.cpp | 3 ++- CodeExtractor.cpp | 3 ++- LCSSA.cpp | 3 ++- LowerSelect.cpp | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Utils/CloneFunction.cpp diff -u llvm/lib/Transforms/Utils/CloneFunction.cpp:1.41 llvm/lib/Transforms/Utils/CloneFunction.cpp:1.42 --- llvm/lib/Transforms/Utils/CloneFunction.cpp:1.41 Fri Feb 2 18:08:31 2007 +++ llvm/lib/Transforms/Utils/CloneFunction.cpp Mon Feb 5 17:32:05 2007 @@ -19,6 +19,7 @@ #include "llvm/Instructions.h" #include "llvm/Function.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "ValueMapper.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/ADT/SmallVector.h" @@ -152,7 +153,7 @@ namespace { /// PruningFunctionCloner - This class is a private class used to implement /// the CloneAndPruneFunctionInto method. - struct PruningFunctionCloner { + struct VISIBILITY_HIDDEN PruningFunctionCloner { Function *NewFunc; const Function *OldFunc; DenseMap &ValueMap; Index: llvm/lib/Transforms/Utils/CodeExtractor.cpp diff -u llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.48 llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.49 --- llvm/lib/Transforms/Utils/CodeExtractor.cpp:1.48 Wed Jan 31 14:07:32 2007 +++ llvm/lib/Transforms/Utils/CodeExtractor.cpp Mon Feb 5 17:32:05 2007 @@ -25,6 +25,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/StringExtras.h" #include @@ -40,7 +41,7 @@ cl::desc("Aggregate arguments to code-extracted functions")); namespace { - class CodeExtractor { + class VISIBILITY_HIDDEN CodeExtractor { typedef std::vector Values; std::set BlocksToExtract; DominatorSet *DS; Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.34 llvm/lib/Transforms/Utils/LCSSA.cpp:1.35 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.34 Sun Feb 4 23:23:32 2007 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Mon Feb 5 17:32:05 2007 @@ -38,6 +38,7 @@ #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include #include using namespace llvm; @@ -45,7 +46,7 @@ STATISTIC(NumLCSSA, "Number of live out of a loop variables"); namespace { - struct LCSSA : public FunctionPass { + struct VISIBILITY_HIDDEN LCSSA : public FunctionPass { // Cached analysis information for the current function. LoopInfo *LI; DominatorTree *DT; Index: llvm/lib/Transforms/Utils/LowerSelect.cpp diff -u llvm/lib/Transforms/Utils/LowerSelect.cpp:1.9 llvm/lib/Transforms/Utils/LowerSelect.cpp:1.10 --- llvm/lib/Transforms/Utils/LowerSelect.cpp:1.9 Tue Dec 19 16:17:40 2006 +++ llvm/lib/Transforms/Utils/LowerSelect.cpp Mon Feb 5 17:32:05 2007 @@ -24,12 +24,13 @@ #include "llvm/Instructions.h" #include "llvm/Pass.h" #include "llvm/Type.h" +#include "llvm/Support/Compiler.h" using namespace llvm; namespace { /// LowerSelect - Turn select instructions into conditional branches. /// - class LowerSelect : public FunctionPass { + class VISIBILITY_HIDDEN LowerSelect : public FunctionPass { bool OnlyFP; // Only lower FP select instructions? public: LowerSelect(bool onlyfp = false) : OnlyFP(onlyfp) {} From sabre at nondot.org Mon Feb 5 17:37:37 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 17:37:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702052337.l15NbbcM008300@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.91 -> 1.92 --- Log message: With the last change, we no longer need both directions of mapping from BBNumbers. Instead of using a bi-directional mapping, just use a single densemap. This speeds up mem2reg on 176.gcc by 8%, from 1.3489 to 1.2485s. --- Diffs of the changes: (+8 -4) PromoteMemoryToRegister.cpp | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.91 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.92 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.91 Mon Feb 5 17:31:26 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Mon Feb 5 17:37:20 2007 @@ -23,11 +23,11 @@ #include "llvm/Instructions.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/AliasSetTracker.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CFG.h" -#include "llvm/Support/StableBasicBlockNumbering.h" #include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -88,7 +88,7 @@ /// BBNumbers - Contains a stable numbering of basic blocks to avoid /// non-determinstic behavior. - StableBasicBlockNumbering BBNumbers; + DenseMap BBNumbers; public: PromoteMem2Reg(const std::vector &A, @@ -265,7 +265,11 @@ // If we haven't computed a numbering for the BB's in the function, do so // now. - BBNumbers.compute(F); + if (BBNumbers.empty()) { + unsigned ID = 0; + for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) + BBNumbers[I] = ID++; + } // Compute the locations where PhiNodes need to be inserted. Look at the // dominance frontier of EACH basic-block we have a write in. @@ -289,7 +293,7 @@ // processing blocks in order of the occurance in the function. for (DominanceFrontier::DomSetType::const_iterator P = S.begin(), PE = S.end(); P != PE; ++P) - DFBlocks.push_back(std::make_pair(BBNumbers.getNumber(*P), *P)); + DFBlocks.push_back(std::make_pair(BBNumbers[*P], *P)); // Sort by which the block ordering in the function. std::sort(DFBlocks.begin(), DFBlocks.end()); From reid at x10sys.com Mon Feb 5 17:42:44 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:42:44 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/IPA/Andersens.cpp CallGraph.cpp GlobalsModRef.cpp Message-ID: <200702052342.l15Ngi7n009450@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/IPA: Andersens.cpp updated: 1.44 -> 1.45 CallGraph.cpp updated: 1.64 -> 1.65 GlobalsModRef.cpp updated: 1.28 -> 1.29 --- Log message: Make classes in anonymous namespaces use VISIBILITY_HIDDEN to help reduce LLVM's footprint and speed up linking. --- Diffs of the changes: (+10 -6) Andersens.cpp | 5 +++-- CallGraph.cpp | 3 ++- GlobalsModRef.cpp | 8 +++++--- 3 files changed, 10 insertions(+), 6 deletions(-) Index: llvm/lib/Analysis/IPA/Andersens.cpp diff -u llvm/lib/Analysis/IPA/Andersens.cpp:1.44 llvm/lib/Analysis/IPA/Andersens.cpp:1.45 --- llvm/lib/Analysis/IPA/Andersens.cpp:1.44 Thu Feb 1 20:16:22 2007 +++ llvm/lib/Analysis/IPA/Andersens.cpp Mon Feb 5 17:42:17 2007 @@ -55,6 +55,7 @@ #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Analysis/AliasAnalysis.h" @@ -71,8 +72,8 @@ STATISTIC(NumIndirectCallees , "Number of indirect callees found"); namespace { - class Andersens : public ModulePass, public AliasAnalysis, - private InstVisitor { + class VISIBILITY_HIDDEN Andersens : public ModulePass, public AliasAnalysis, + private InstVisitor { /// Node class - This class is used to represent a memory object in the /// program, and is the primitive used to build the points-to graph. class Node { Index: llvm/lib/Analysis/IPA/CallGraph.cpp diff -u llvm/lib/Analysis/IPA/CallGraph.cpp:1.64 llvm/lib/Analysis/IPA/CallGraph.cpp:1.65 --- llvm/lib/Analysis/IPA/CallGraph.cpp:1.64 Tue Jan 30 14:08:37 2007 +++ llvm/lib/Analysis/IPA/CallGraph.cpp Mon Feb 5 17:42:17 2007 @@ -16,6 +16,7 @@ #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" #include using namespace llvm; @@ -35,7 +36,7 @@ //===----------------------------------------------------------------------===// // BasicCallGraph class definition // -class BasicCallGraph : public CallGraph, public ModulePass { +class VISIBILITY_HIDDEN BasicCallGraph : public CallGraph, public ModulePass { // Root is root of the call graph, or the external node if a 'main' function // couldn't be found. // Index: llvm/lib/Analysis/IPA/GlobalsModRef.cpp diff -u llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.28 llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.29 --- llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.28 Tue Jan 30 14:08:37 2007 +++ llvm/lib/Analysis/IPA/GlobalsModRef.cpp Mon Feb 5 17:42:17 2007 @@ -23,8 +23,9 @@ #include "llvm/DerivedTypes.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/CallGraph.h" -#include "llvm/Support/InstIterator.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/InstIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/SCCIterator.h" #include @@ -42,7 +43,7 @@ /// function in the program. Later, the entries for these functions are /// removed if the function is found to call an external function (in which /// case we know nothing about it. - struct FunctionRecord { + struct VISIBILITY_HIDDEN FunctionRecord { /// GlobalInfo - Maintain mod/ref info for all of the globals without /// addresses taken that are read or written (transitively) by this /// function. @@ -63,7 +64,8 @@ }; /// GlobalsModRef - The actual analysis pass. - class GlobalsModRef : public ModulePass, public AliasAnalysis { + class VISIBILITY_HIDDEN GlobalsModRef + : public ModulePass, public AliasAnalysis { /// NonAddressTakenGlobals - The globals that do not have their addresses /// taken. std::set NonAddressTakenGlobals; From reid at x10sys.com Mon Feb 5 17:42:44 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:42:44 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/AliasAnalysisCounter.cpp AliasAnalysisEvaluator.cpp AliasDebugger.cpp AliasSetTracker.cpp BasicAliasAnalysis.cpp CFGPrinter.cpp InstCount.cpp LoadValueNumbering.cpp ProfileInfo.cpp ProfileInfoLoaderPass.cpp ValueNumbering.cpp Message-ID: <200702052342.l15Ngino009478@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: AliasAnalysisCounter.cpp updated: 1.19 -> 1.20 AliasAnalysisEvaluator.cpp updated: 1.32 -> 1.33 AliasDebugger.cpp updated: 1.2 -> 1.3 AliasSetTracker.cpp updated: 1.45 -> 1.46 BasicAliasAnalysis.cpp updated: 1.102 -> 1.103 CFGPrinter.cpp updated: 1.21 -> 1.22 InstCount.cpp updated: 1.19 -> 1.20 LoadValueNumbering.cpp updated: 1.36 -> 1.37 ProfileInfo.cpp updated: 1.9 -> 1.10 ProfileInfoLoaderPass.cpp updated: 1.17 -> 1.18 ValueNumbering.cpp updated: 1.24 -> 1.25 --- Log message: Make classes in anonymous namespaces use VISIBILITY_HIDDEN to help reduce LLVM's footprint and speed up linking. --- Diffs of the changes: (+28 -13) AliasAnalysisCounter.cpp | 4 +++- AliasAnalysisEvaluator.cpp | 3 ++- AliasDebugger.cpp | 4 +++- AliasSetTracker.cpp | 3 ++- BasicAliasAnalysis.cpp | 2 +- CFGPrinter.cpp | 5 +++-- InstCount.cpp | 4 +++- LoadValueNumbering.cpp | 3 ++- ProfileInfo.cpp | 4 +++- ProfileInfoLoaderPass.cpp | 3 ++- ValueNumbering.cpp | 6 ++++-- 11 files changed, 28 insertions(+), 13 deletions(-) Index: llvm/lib/Analysis/AliasAnalysisCounter.cpp diff -u llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.19 llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.20 --- llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.19 Thu Dec 7 14:28:15 2006 +++ llvm/lib/Analysis/AliasAnalysisCounter.cpp Mon Feb 5 17:42:17 2007 @@ -17,6 +17,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" using namespace llvm; @@ -26,7 +27,8 @@ cl::opt PrintAllFailures("count-aa-print-all-failed-queries", cl::ReallyHidden); - class AliasAnalysisCounter : public ModulePass, public AliasAnalysis { + class VISIBILITY_HIDDEN AliasAnalysisCounter + : public ModulePass, public AliasAnalysis { unsigned No, May, Must; unsigned NoMR, JustRef, JustMod, MR; const char *Name; Index: llvm/lib/Analysis/AliasAnalysisEvaluator.cpp diff -u llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.32 llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.33 --- llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.32 Thu Dec 7 14:28:15 2006 +++ llvm/lib/Analysis/AliasAnalysisEvaluator.cpp Mon Feb 5 17:42:17 2007 @@ -28,6 +28,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Support/InstIterator.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" #include using namespace llvm; @@ -44,7 +45,7 @@ cl::opt PrintRef("print-ref", cl::ReallyHidden); cl::opt PrintModRef("print-modref", cl::ReallyHidden); - class AAEval : public FunctionPass { + class VISIBILITY_HIDDEN AAEval : public FunctionPass { unsigned NoAlias, MayAlias, MustAlias; unsigned NoModRef, Mod, Ref, ModRef; Index: llvm/lib/Analysis/AliasDebugger.cpp diff -u llvm/lib/Analysis/AliasDebugger.cpp:1.2 llvm/lib/Analysis/AliasDebugger.cpp:1.3 --- llvm/lib/Analysis/AliasDebugger.cpp:1.2 Tue Jan 30 14:08:36 2007 +++ llvm/lib/Analysis/AliasDebugger.cpp Mon Feb 5 17:42:17 2007 @@ -23,12 +23,14 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; namespace { - class AliasDebugger : public ModulePass, public AliasAnalysis { + class VISIBILITY_HIDDEN AliasDebugger + : public ModulePass, public AliasAnalysis { //What we do is simple. Keep track of every value the AA could //know about, and verify that queries are one of those. Index: llvm/lib/Analysis/AliasSetTracker.cpp diff -u llvm/lib/Analysis/AliasSetTracker.cpp:1.45 llvm/lib/Analysis/AliasSetTracker.cpp:1.46 --- llvm/lib/Analysis/AliasSetTracker.cpp:1.45 Wed Dec 6 19:30:31 2006 +++ llvm/lib/Analysis/AliasSetTracker.cpp Mon Feb 5 17:42:17 2007 @@ -18,6 +18,7 @@ #include "llvm/Type.h" #include "llvm/Target/TargetData.h" #include "llvm/Assembly/Writer.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstIterator.h" #include "llvm/Support/Streams.h" using namespace llvm; @@ -551,7 +552,7 @@ //===----------------------------------------------------------------------===// namespace { - class AliasSetPrinter : public FunctionPass { + class VISIBILITY_HIDDEN AliasSetPrinter : public FunctionPass { AliasSetTracker *Tracker; public: virtual void getAnalysisUsage(AnalysisUsage &AU) const { Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.102 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.103 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.102 Tue Jan 30 14:08:36 2007 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Mon Feb 5 17:42:17 2007 @@ -745,7 +745,7 @@ } namespace { - struct StringCompare { + struct VISIBILITY_HIDDEN StringCompare { bool operator()(const char *LHS, const char *RHS) { return strcmp(LHS, RHS) < 0; } Index: llvm/lib/Analysis/CFGPrinter.cpp diff -u llvm/lib/Analysis/CFGPrinter.cpp:1.21 llvm/lib/Analysis/CFGPrinter.cpp:1.22 --- llvm/lib/Analysis/CFGPrinter.cpp:1.21 Wed Dec 6 19:30:31 2006 +++ llvm/lib/Analysis/CFGPrinter.cpp Mon Feb 5 17:42:17 2007 @@ -23,6 +23,7 @@ #include "llvm/Analysis/CFGPrinter.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/GraphWriter.h" #include "llvm/Config/config.h" #include @@ -89,7 +90,7 @@ } namespace { - struct CFGPrinter : public FunctionPass { + struct VISIBILITY_HIDDEN CFGPrinter : public FunctionPass { virtual bool runOnFunction(Function &F) { std::string Filename = "cfg." + F.getName() + ".dot"; cerr << "Writing '" << Filename << "'..."; @@ -113,7 +114,7 @@ RegisterPass P1("print-cfg", "Print CFG of function to 'dot' file"); - struct CFGOnlyPrinter : public CFGPrinter { + struct VISIBILITY_HIDDEN CFGOnlyPrinter : public CFGPrinter { virtual bool runOnFunction(Function &F) { bool OldCFGOnly = CFGOnly; CFGOnly = true; Index: llvm/lib/Analysis/InstCount.cpp diff -u llvm/lib/Analysis/InstCount.cpp:1.19 llvm/lib/Analysis/InstCount.cpp:1.20 --- llvm/lib/Analysis/InstCount.cpp:1.19 Tue Dec 19 16:30:33 2006 +++ llvm/lib/Analysis/InstCount.cpp Mon Feb 5 17:42:17 2007 @@ -15,6 +15,7 @@ #include "llvm/Analysis/Passes.h" #include "llvm/Pass.h" #include "llvm/Function.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/Streams.h" #include "llvm/ADT/Statistic.h" @@ -33,7 +34,8 @@ namespace { - class InstCount : public FunctionPass, public InstVisitor { + class VISIBILITY_HIDDEN InstCount + : public FunctionPass, public InstVisitor { friend class InstVisitor; void visitFunction (Function &F) { ++TotalFuncs; } Index: llvm/lib/Analysis/LoadValueNumbering.cpp diff -u llvm/lib/Analysis/LoadValueNumbering.cpp:1.36 llvm/lib/Analysis/LoadValueNumbering.cpp:1.37 --- llvm/lib/Analysis/LoadValueNumbering.cpp:1.36 Sun Aug 27 19:42:29 2006 +++ llvm/lib/Analysis/LoadValueNumbering.cpp Mon Feb 5 17:42:17 2007 @@ -31,6 +31,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include "llvm/Target/TargetData.h" #include #include @@ -38,7 +39,7 @@ namespace { // FIXME: This should not be a FunctionPass. - struct LoadVN : public FunctionPass, public ValueNumbering { + struct VISIBILITY_HIDDEN LoadVN : public FunctionPass, public ValueNumbering { /// Pass Implementation stuff. This doesn't do any analysis. /// Index: llvm/lib/Analysis/ProfileInfo.cpp diff -u llvm/lib/Analysis/ProfileInfo.cpp:1.9 llvm/lib/Analysis/ProfileInfo.cpp:1.10 --- llvm/lib/Analysis/ProfileInfo.cpp:1.9 Sun Aug 27 19:42:29 2006 +++ llvm/lib/Analysis/ProfileInfo.cpp Mon Feb 5 17:42:17 2007 @@ -16,6 +16,7 @@ #include "llvm/Analysis/ProfileInfo.h" #include "llvm/Pass.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/Compiler.h" #include using namespace llvm; @@ -82,7 +83,8 @@ // namespace { - struct NoProfileInfo : public ImmutablePass, public ProfileInfo {}; + struct VISIBILITY_HIDDEN NoProfileInfo + : public ImmutablePass, public ProfileInfo {}; // Register this pass... RegisterPass Index: llvm/lib/Analysis/ProfileInfoLoaderPass.cpp diff -u llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.17 llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.18 --- llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.17 Wed Dec 6 19:30:31 2006 +++ llvm/lib/Analysis/ProfileInfoLoaderPass.cpp Mon Feb 5 17:42:17 2007 @@ -19,6 +19,7 @@ #include "llvm/Analysis/ProfileInfo.h" #include "llvm/Analysis/ProfileInfoLoader.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" using namespace llvm; @@ -28,7 +29,7 @@ cl::value_desc("filename"), cl::desc("Profile file loaded by -profile-loader")); - class LoaderPass : public ModulePass, public ProfileInfo { + class VISIBILITY_HIDDEN LoaderPass : public ModulePass, public ProfileInfo { std::string Filename; public: LoaderPass(const std::string &filename = "") Index: llvm/lib/Analysis/ValueNumbering.cpp diff -u llvm/lib/Analysis/ValueNumbering.cpp:1.24 llvm/lib/Analysis/ValueNumbering.cpp:1.25 --- llvm/lib/Analysis/ValueNumbering.cpp:1.24 Sat Dec 23 00:05:40 2006 +++ llvm/lib/Analysis/ValueNumbering.cpp Mon Feb 5 17:42:17 2007 @@ -19,6 +19,7 @@ #include "llvm/Instructions.h" #include "llvm/Pass.h" #include "llvm/Type.h" +#include "llvm/Support/Compiler.h" using namespace llvm; // Register the ValueNumbering interface, providing a nice name to refer to. @@ -48,7 +49,8 @@ /// lexically identical expressions. This does not require any ahead of time /// analysis, so it is a very fast default implementation. /// - struct BasicVN : public ImmutablePass, public ValueNumbering { + struct VISIBILITY_HIDDEN BasicVN + : public ImmutablePass, public ValueNumbering { /// getEqualNumberNodes - Return nodes with the same value number as the /// specified Value. This fills in the argument vector with any equal /// values. @@ -69,7 +71,7 @@ /// BVNImpl - Implement BasicVN in terms of a visitor class that /// handles the different types of instructions as appropriate. /// - struct BVNImpl : public InstVisitor { + struct VISIBILITY_HIDDEN BVNImpl : public InstVisitor { std::vector &RetVals; BVNImpl(std::vector &RV) : RetVals(RV) {} From reid at x10sys.com Mon Feb 5 17:48:15 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:48:15 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200702052348.l15NmFkU010005@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.208 -> 1.209 --- Log message: A value of 64 or fewer bits is valid if the ConstantInt has more then 64 bits. --- Diffs of the changes: (+2 -4) Constants.cpp | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.208 llvm/lib/VMCore/Constants.cpp:1.209 --- llvm/lib/VMCore/Constants.cpp:1.208 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/Constants.cpp Mon Feb 5 17:47:56 2007 @@ -554,10 +554,9 @@ bool ConstantInt::isValueValidForType(const Type *Ty, uint64_t Val) { unsigned NumBits = cast(Ty)->getBitWidth(); // assert okay - assert(NumBits <= 64 && "Not implemented: integers > 64-bits"); if (Ty == Type::Int1Ty) return Val == 0 || Val == 1; - if (NumBits == 64) + if (NumBits >= 64) return true; // always true, has to fit in largest type uint64_t Max = (1ll << NumBits) - 1; return Val <= Max; @@ -565,10 +564,9 @@ bool ConstantInt::isValueValidForType(const Type *Ty, int64_t Val) { unsigned NumBits = cast(Ty)->getBitWidth(); // assert okay - assert(NumBits <= 64 && "Not implemented: integers > 64-bits"); if (Ty == Type::Int1Ty) return Val == 0 || Val == 1 || Val == -1; - if (NumBits == 64) + if (NumBits >= 64) return true; // always true, has to fit in largest type int64_t Min = -(1ll << (NumBits-1)); int64_t Max = (1ll << (NumBits-1)) - 1; From reid at x10sys.com Mon Feb 5 17:52:04 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 17:52:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetData.cpp Message-ID: <200702052352.l15Nq4Jj010812@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetData.cpp updated: 1.84 -> 1.85 --- Log message: Although targets are not required to support integers > 64bits, TargetData must in order for backends that do want to support large integer types to be able to function. Consequently, don't assert if the bitwidth > 64 bits when computing the size and alignment. Instead, compute the size by rounding up to the next even number of bytes for the size. Compute the alignment as the same as the LongABIAlignment. These provide reasonable defaults that the target can override. --- Diffs of the changes: (+4 -2) TargetData.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/Target/TargetData.cpp diff -u llvm/lib/Target/TargetData.cpp:1.84 llvm/lib/Target/TargetData.cpp:1.85 --- llvm/lib/Target/TargetData.cpp:1.84 Wed Jan 31 15:31:25 2007 +++ llvm/lib/Target/TargetData.cpp Mon Feb 5 17:51:43 2007 @@ -295,8 +295,10 @@ Size = 4; Alignment = TD->getIntABIAlignment(); } else if (BitWidth <= 64) { Size = 8; Alignment = TD->getLongABIAlignment(); - } else - assert(0 && "Integer types > 64 bits not supported."); + } else { + Size = ((BitWidth + 7) / 8) & ~1; + Alignment = TD->getLongABIAlignment(); + } return; } case Type::VoidTyID: Size = 1; Alignment = TD->getByteABIAlignment(); return; From evan.cheng at apple.com Mon Feb 5 18:22:33 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 5 Feb 2007 18:22:33 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200702060022.l160MXTr014799@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.104 -> 1.105 --- Log message: - Store val, [sp, c] must be selected to tSTRsp. - If c does not fit in the offset field, materialize sp + c into a register using tADDhirr. --- Diffs of the changes: (+34 -4) ARMISelDAGToDAG.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 files changed, 34 insertions(+), 4 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.104 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.105 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.104 Mon Jan 29 20:35:32 2007 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Feb 5 18:22:06 2007 @@ -392,6 +392,17 @@ return true; } + // Thumb does not have [sp, r] address mode. + RegisterSDNode *LHSR = dyn_cast(N.getOperand(0)); + RegisterSDNode *RHSR = dyn_cast(N.getOperand(1)); + if ((LHSR && LHSR->getReg() == ARM::SP) || + (RHSR && RHSR->getReg() == ARM::SP)) { + Base = N; + Offset = CurDAG->getRegister(0, MVT::i32); + OffImm = CurDAG->getTargetConstant(0, MVT::i32); + return true; + } + // If the RHS is + imm5 * scale, fold into addr mode. if (ConstantSDNode *RHS = dyn_cast(N.getOperand(1))) { int RHSC = (int)RHS->getValue(); @@ -439,16 +450,18 @@ return true; } - if (N.getOpcode() == ISD::ADD && - N.getOperand(0).getOpcode() == ISD::FrameIndex) { + if (N.getOpcode() != ISD::ADD) + return false; + + RegisterSDNode *LHSR = dyn_cast(N.getOperand(0)); + if (LHSR && LHSR->getReg() == ARM::SP) { // If the RHS is + imm8 * scale, fold into addr mode. if (ConstantSDNode *RHS = dyn_cast(N.getOperand(1))) { int RHSC = (int)RHS->getValue(); if ((RHSC & 3) == 0) { // The constant is implicitly multiplied. RHSC >>= 2; if (RHSC >= 0 && RHSC < 256) { - int FI = cast(N.getOperand(0))->getIndex(); - Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); + Base = N.getOperand(0); OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); return true; } @@ -537,6 +550,23 @@ return CurDAG->SelectNodeTo(N, Opc, MVT::i32, TFI, CurDAG->getTargetConstant(0, MVT::i32)); } + case ISD::ADD: { + // Select add sp, c to tADDhirr. + SDOperand N0 = Op.getOperand(0); + SDOperand N1 = Op.getOperand(1); + RegisterSDNode *LHSR = dyn_cast(Op.getOperand(0)); + RegisterSDNode *RHSR = dyn_cast(Op.getOperand(1)); + if (LHSR && LHSR->getReg() == ARM::SP) { + std::swap(N0, N1); + std::swap(LHSR, RHSR); + } + if (RHSR && RHSR->getReg() == ARM::SP) { + AddToISelQueue(N0); + AddToISelQueue(N1); + return CurDAG->SelectNodeTo(N, ARM::tADDhirr, Op.getValueType(), N0, N1); + } + break; + } case ISD::MUL: if (Subtarget->isThumb()) break; From evan.cheng at apple.com Mon Feb 5 18:23:52 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 5 Feb 2007 18:23:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702060023.l160Nq6r014843@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.56 -> 1.57 --- Log message: eliminateFrameIndex() bug when frame pointer is used as base register. --- Diffs of the changes: (+27 -23) ARMRegisterInfo.cpp | 50 +++++++++++++++++++++++++++----------------------- 1 files changed, 27 insertions(+), 23 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.56 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.56 Fri Feb 2 17:08:40 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Mon Feb 5 18:23:31 2007 @@ -386,6 +386,8 @@ const MachineInstrBuilder MIB = BuildMI(MBB, MBBI, TII.get(Opc), DestReg); if (DestReg == ARM::SP) MIB.addReg(BaseReg).addReg(LdReg); + else if (isSub) + MIB.addReg(BaseReg).addReg(LdReg); else MIB.addReg(LdReg).addReg(BaseReg); if (DestReg == ARM::SP) @@ -647,7 +649,7 @@ // MI would expand into a large number of instructions. Don't try to // simplify the immediate. if (NumMIs > 2) { - emitThumbRegPlusImmediate(MBB, II, DestReg, ARM::SP, Offset, TII); + emitThumbRegPlusImmediate(MBB, II, DestReg, FrameReg, Offset, TII); MBB.erase(II); return; } @@ -705,7 +707,7 @@ case ARMII::AddrModeTs: { ImmIdx = i+1; InstrOffs = MI.getOperand(ImmIdx).getImm(); - NumBits = 8; + NumBits = (FrameReg == ARM::SP) ? 8 : 5; Scale = 4; break; } @@ -722,31 +724,33 @@ isSub = true; } - MachineOperand &ImmOp = MI.getOperand(ImmIdx); - int ImmedOffset = Offset / Scale; - unsigned Mask = (1 << NumBits) - 1; - if ((unsigned)Offset <= Mask * Scale) { - // Replace the FrameIndex with sp - MI.getOperand(i).ChangeToRegister(FrameReg, false); + if (!isSub || !isThumb) { + MachineOperand &ImmOp = MI.getOperand(ImmIdx); + int ImmedOffset = Offset / Scale; + unsigned Mask = (1 << NumBits) - 1; + if ((unsigned)Offset <= Mask * Scale) { + // Replace the FrameIndex with sp + MI.getOperand(i).ChangeToRegister(FrameReg, false); + if (isSub) + ImmedOffset |= 1 << NumBits; + ImmOp.ChangeToImmediate(ImmedOffset); + return; + } + + // Otherwise, it didn't fit. Pull in what we can to simplify the immed. + if (AddrMode == ARMII::AddrModeTs) { + // Thumb tLDRspi, tSTRspi. These will change to instructions that use + // a different base register. + NumBits = 5; + Mask = (1 << NumBits) - 1; + } + + ImmedOffset = ImmedOffset & Mask; if (isSub) ImmedOffset |= 1 << NumBits; ImmOp.ChangeToImmediate(ImmedOffset); - return; + Offset &= ~(Mask*Scale); } - - // Otherwise, it didn't fit. Pull in what we can to simplify the immediate. - if (AddrMode == ARMII::AddrModeTs) { - // Thumb tLDRspi, tSTRspi. These will change to instructions that use a - // different base register. - NumBits = 5; - Mask = (1 << NumBits) - 1; - } - - ImmedOffset = ImmedOffset & Mask; - if (isSub) - ImmedOffset |= 1 << NumBits; - ImmOp.ChangeToImmediate(ImmedOffset); - Offset &= ~(Mask*Scale); } // If we get here, the immediate doesn't fit into the instruction. We folded From sabre at nondot.org Mon Feb 5 19:56:57 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 19:56:57 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200702060156.l161uv47016393@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.145 -> 1.146 --- Log message: Oops, swap this. This fixes a regression I introduced in the ARM backend. --- Diffs of the changes: (+1 -1) AsmPrinter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.145 llvm/lib/CodeGen/AsmPrinter.cpp:1.146 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.145 Mon Feb 5 15:23:52 2007 +++ llvm/lib/CodeGen/AsmPrinter.cpp Mon Feb 5 19:56:31 2007 @@ -850,7 +850,7 @@ if (LastMI != MI || F != ThisF) { ++Counter; LastMI = MI; - ThisF = F; + F = ThisF; } O << Counter; } else { From sabre at nondot.org Mon Feb 5 20:22:58 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 20:22:58 -0600 Subject: [llvm-commits] CVS: llvm/test/Transforms/ConstProp/2007-02-05-BitCast.ll Message-ID: <200702060222.l162Mw58016908@zion.cs.uiuc.edu> Changes in directory llvm/test/Transforms/ConstProp: 2007-02-05-BitCast.ll added (r1.1) --- Log message: Testcase for miscompilation --- Diffs of the changes: (+7 -0) 2007-02-05-BitCast.ll | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/test/Transforms/ConstProp/2007-02-05-BitCast.ll diff -c /dev/null llvm/test/Transforms/ConstProp/2007-02-05-BitCast.ll:1.1 *** /dev/null Mon Feb 5 20:22:47 2007 --- llvm/test/Transforms/ConstProp/2007-02-05-BitCast.ll Mon Feb 5 20:22:37 2007 *************** *** 0 **** --- 1,7 ---- + ; RUN: llvm-as < %s | opt -constprop | llvm-dis | grep 1065353216 + + define i32 @test() { + %A = bitcast float 1.000000e+00 to i32 ; [#uses=1] + ret i32 %A + } + From sabre at nondot.org Mon Feb 5 20:23:12 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 20:23:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFolding.cpp Message-ID: <200702060223.l162NC7t016919@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFolding.cpp updated: 1.134 -> 1.135 --- Log message: Fix Transforms/ConstProp/2007-02-05-BitCast.ll --- Diffs of the changes: (+5 -1) ConstantFolding.cpp | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/lib/VMCore/ConstantFolding.cpp diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.134 llvm/lib/VMCore/ConstantFolding.cpp:1.135 --- llvm/lib/VMCore/ConstantFolding.cpp:1.134 Tue Jan 30 22:40:28 2007 +++ llvm/lib/VMCore/ConstantFolding.cpp Mon Feb 5 20:22:56 2007 @@ -296,8 +296,12 @@ // Handle ConstantFP input. if (const ConstantFP *FP = dyn_cast(V)) { // FP -> Integral. - if (DestTy->isInteger()) + if (DestTy == Type::Int32Ty) { + return ConstantInt::get(DestTy, FloatToBits(FP->getValue())); + } else { + assert(DestTy == Type::Int64Ty && "only support f32/f64 for now!"); return ConstantInt::get(DestTy, DoubleToBits(FP->getValue())); + } } return 0; default: From reid at x10sys.com Mon Feb 5 20:54:26 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 20:54:26 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/Makefile Message-ID: <200702060254.l162sQMg017488@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer: Makefile updated: 1.5 -> 1.6 --- Log message: Allow the test suite to optional select large integer tests (>64 bits) --- Diffs of the changes: (+6 -0) Makefile | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm-test/SingleSource/UnitTests/Integer/Makefile diff -u llvm-test/SingleSource/UnitTests/Integer/Makefile:1.5 llvm-test/SingleSource/UnitTests/Integer/Makefile:1.6 --- llvm-test/SingleSource/UnitTests/Integer/Makefile:1.5 Thu Jan 18 20:22:46 2007 +++ llvm-test/SingleSource/UnitTests/Integer/Makefile Mon Feb 5 20:54:07 2007 @@ -10,6 +10,9 @@ # the same results regardless of whether you make clean or not. RUN_OPTIONS := 31415926 +# Define this to 1 to test larger integer (>64 bits) types. +ENABLE_LARGE_INTEGERS := 0 + # None of these test cases can use a native code generator because # those targets are not set up to deal with arbitrary precision # integer types. Consequently, we must disable the LLI, LLC, @@ -31,3 +34,6 @@ include $(LEVEL)/SingleSource/Makefile.singlesrc LDFLAGS += -lstdc++ +ifeq (1,$(ENABLE_LARGE_INTEGERS)) +CPPFLAGS += -DENABLE_LARGE_INTEGERS +endif From reid at x10sys.com Mon Feb 5 20:58:22 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 5 Feb 2007 20:58:22 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/bit_select.c bit_select.reference_output Message-ID: <200702060258.l162wM4N017576@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer: bit_select.c added (r1.1) bit_select.reference_output added (r1.1) --- Log message: Test for the bit_select builtin function. --- Diffs of the changes: (+47 -0) bit_select.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ bit_select.reference_output | 2 + 2 files changed, 47 insertions(+) Index: llvm-test/SingleSource/UnitTests/Integer/bit_select.c diff -c /dev/null llvm-test/SingleSource/UnitTests/Integer/bit_select.c:1.1 *** /dev/null Mon Feb 5 20:58:05 2007 --- llvm-test/SingleSource/UnitTests/Integer/bit_select.c Mon Feb 5 20:57:54 2007 *************** *** 0 **** --- 1,45 ---- + //===--- bit_select.c --- Test The bit_select builtin ---------------------===// + // + // This file was developed by Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This test case tests the __builtin_bit_select builtin function llvm-gcc. + // bit_select selects one bit out of a larger + // + //===----------------------------------------------------------------------===// + + #include + + #ifdef ENABLE_LARGE_INTEGERS + typedef int __attribute__((bitwidth(250))) BitType; + const BitType X = 0xAAAAAAAAULL; + int numbits = 250; + #else + typedef int __attribute__((bitwidth(47))) BitType; + const BitType X = 0xAAAAAAAAULL; + int numbits = 47; + #endif + + int main(int argc, char** argv) + { + + #ifdef ENABLE_LARGE_INTEGERS + BitType Y = X * X; + #else + BitType Y = X; + #endif + + int i; + + for (i = numbits-1; i >= 0; --i) { + if (__builtin_bit_select(Y, i)) + printf("1"); + else + printf("0"); + } + + printf("\n"); + return 0; + } Index: llvm-test/SingleSource/UnitTests/Integer/bit_select.reference_output diff -c /dev/null llvm-test/SingleSource/UnitTests/Integer/bit_select.reference_output:1.1 *** /dev/null Mon Feb 5 20:58:22 2007 --- llvm-test/SingleSource/UnitTests/Integer/bit_select.reference_output Mon Feb 5 20:57:54 2007 *************** *** 0 **** --- 1,2 ---- + 01010101010101010101010101010101010101010101010 + exit 0 From zhousheng00 at gmail.com Mon Feb 5 21:00:37 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Mon, 5 Feb 2007 21:00:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702060300.l1630bKl017623@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp added (r1.1) --- Log message: Add a class APInt to represent arbitrary precision constant integral values. It is a functional replacement for common case integer type like "unsigned", "uint64_t", but also allows non-byte-width integer type and large integer value types such as 3-bits, 15-bits, or more than 64-bits of precision. For more details, see pr1043: http://llvm.org/PR1043 . --- Diffs of the changes: (+1113 -0) APInt.cpp | 1113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1113 insertions(+) Index: llvm/lib/Support/APInt.cpp diff -c /dev/null llvm/lib/Support/APInt.cpp:1.1 *** /dev/null Mon Feb 5 21:00:27 2007 --- llvm/lib/Support/APInt.cpp Mon Feb 5 21:00:16 2007 *************** *** 0 **** --- 1,1113 ---- + //===-- APInt.cpp - Implement APInt class ---------------------------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Sheng Zhou and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements a class to represent arbitrary precision integral + // constant values. + // + //===----------------------------------------------------------------------===// + + #include "llvm/ADT/APInt.h" + #include "llvm/DerivedTypes.h" + #include "llvm/Support/MathExtras.h" + #include + #include + #include + #include + #include + using namespace llvm; + + APInt::APInt(uint64_t val, unsigned numBits, bool sign) + : bitsnum(numBits), isSigned(sign) { + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + if (isSingleWord()) + VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + bzero(pVal, numWords() * 8); + pVal[0] = val; + } + } + + APInt::APInt(unsigned numBits, uint64_t bigVal[], bool sign) + : bitsnum(numBits), isSigned(sign) { + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + assert(bigVal && "Null pointer detected!"); + if (isSingleWord()) + VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + // Calculate the actual length of bigVal[]. + unsigned n = sizeof(*bigVal) / sizeof(bigVal[0]); + unsigned maxN = std::max(n, numWords()); + unsigned minN = std::min(n, numWords()); + memcpy(pVal, bigVal, (minN - 1) * 8); + pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - bitsnum % 64)); + if (maxN == numWords()) + bzero(pVal+n, (numWords() - n) * 8); + } + } + + APInt::APInt(std::string& Val, uint8_t radix, bool sign) + : isSigned(sign) { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(!Val.empty() && "String empty?"); + unsigned slen = Val.size(); + unsigned size = 0; + // If the radix is a power of 2, read the input + // from most significant to least significant. + if ((radix & (radix - 1)) == 0) { + unsigned nextBitPos = 0, bits_per_digit = radix / 8 + 2; + uint64_t resDigit = 0; + bitsnum = slen * bits_per_digit; + if (numWords() > 1) + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + for (int i = slen - 1; i >= 0; --i) { + uint64_t digit = Val[i] - 48; // '0' == 48. + resDigit |= digit << nextBitPos; + nextBitPos += bits_per_digit; + if (nextBitPos >= 64) { + if (isSingleWord()) { + VAL = resDigit; + break; + } + pVal[size++] = resDigit; + nextBitPos -= 64; + resDigit = digit >> (bits_per_digit - nextBitPos); + } + } + if (!isSingleWord() && size <= numWords()) + pVal[size] = resDigit; + } else { // General case. The radix is not a power of 2. + // For 10-radix, the max value of 64-bit integer is 18446744073709551615, + // and its digits number is 14. + const unsigned chars_per_word = 20; + if (slen < chars_per_word || + (Val <= "18446744073709551615" && + slen == chars_per_word)) { // In case Val <= 2^64 - 1 + bitsnum = 64; + VAL = strtoull(Val.c_str(), 0, 10); + } else { // In case Val > 2^64 - 1 + bitsnum = (slen / chars_per_word + 1) * 64; + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + bzero(pVal, numWords() * 8); + unsigned str_pos = 0; + while (str_pos < slen) { + unsigned chunk = slen - str_pos; + if (chunk > chars_per_word - 1) + chunk = chars_per_word - 1; + uint64_t resDigit = Val[str_pos++] - 48; // 48 == '0'. + uint64_t big_base = radix; + while (--chunk > 0) { + resDigit = resDigit * radix + Val[str_pos++] - 48; + big_base *= radix; + } + + uint64_t carry; + if (!size) + carry = resDigit; + else { + carry = mul_1(pVal, pVal, size, big_base); + carry += add_1(pVal, pVal, size, resDigit); + } + + if (carry) pVal[size++] = carry; + } + } + } + } + + APInt::APInt(const APInt& APIVal) + : bitsnum(APIVal.bitsnum), isSigned(APIVal.isSigned) { + if (isSingleWord()) VAL = APIVal.VAL; + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + memcpy(pVal, APIVal.pVal, numWords() * 8); + } + } + + APInt::~APInt() { + if (!isSingleWord() && pVal) delete[] pVal; + } + + /// whichByte - This function returns the word position + /// for the specified bit position. + inline unsigned APInt::whichByte(unsigned bitPosition) + { return (bitPosition % APINT_BITS_PER_WORD) / 8; } + + /// getWord - returns the corresponding word for the specified bit position. + inline uint64_t& APInt::getWord(unsigned bitPosition) + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } + + /// getWord - returns the corresponding word for the specified bit position. + /// This is a constant version. + inline uint64_t APInt::getWord(unsigned bitPosition) const + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } + + /// mul_1 - This function multiplies the integer array x[] by a integer y and + /// returns the carry. + uint64_t APInt::mul_1(uint64_t dest[], uint64_t x[], + unsigned len, uint64_t y) { + // Split y into high 32-bit part and low 32-bit part. + uint64_t ly = y & 0xffffffffULL, hy = y >> 32; + uint64_t carry = 0, lx, hx; + for (unsigned i = 0; i < len; ++i) { + lx = x[i] & 0xffffffffULL; + hx = x[i] >> 32; + // hasCarry - A flag to indicate if has carry. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + dest[i] = carry + lx * ly; + // Determine if the add above introduces carry. + hasCarry = (dest[i] < carry) ? 1 : 0; + carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0); + // The upper limit of carry can be (2^32 - 1)(2^32 - 1) + + // (2^32 - 1) + 2^32 = 2^64. + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + + carry += (lx * hy) & 0xffffffffULL; + dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL); + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) + + (carry >> 32) + ((lx * hy) >> 32) + hx * hy; + } + + return carry; + } + + /// mul - This function multiplies integer array x[] by integer array y[] and + /// stores the result into integer array dest[]. + /// Note the array dest[]'s size should no less than xlen + ylen. + void APInt::mul(uint64_t dest[], uint64_t x[], unsigned xlen, + uint64_t y[], unsigned ylen) { + dest[xlen] = mul_1(dest, x, xlen, y[0]); + + for (unsigned i = 1; i < ylen; ++i) { + uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32; + uint64_t carry = 0, lx, hx; + for (unsigned j = 0; j < xlen; ++j) { + lx = x[j] & 0xffffffffULL; + hx = x[j] >> 32; + // hasCarry - A flag to indicate if has carry. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + uint64_t resul = carry + lx * ly; + hasCarry = (resul < carry) ? 1 : 0; + carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32); + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + + carry += (lx * hy) & 0xffffffffULL; + resul = (carry << 32) | (resul & 0xffffffffULL); + dest[i+j] += resul; + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+ + (carry >> 32) + (dest[i+j] < resul ? 1 : 0) + + ((lx * hy) >> 32) + hx * hy; + } + dest[i+xlen] = carry; + } + } + + /// add_1 - This function adds the integer array x[] by integer y and + /// returns the carry. + uint64_t APInt::add_1(uint64_t dest[], uint64_t x[], + unsigned len, uint64_t y) { + uint64_t carry = y; + + for (unsigned i = 0; i < len; ++i) { + dest[i] = carry + x[i]; + carry = (dest[i] < carry) ? 1 : 0; + } + return carry; + } + + /// add - This function adds the integer array x[] by integer array + /// y[] and returns the carry. + uint64_t APInt::add(uint64_t dest[], uint64_t x[], + uint64_t y[], unsigned len) { + unsigned carry = 0; + + for (unsigned i = 0; i< len; ++i) { + carry += x[i]; + dest[i] = carry + y[i]; + carry = carry < x[i] ? 1 : (dest[i] < carry ? 1 : 0); + } + return carry; + } + + /// sub_1 - This function subtracts the integer array x[] by + /// integer y and returns the borrow-out carry. + uint64_t APInt::sub_1(uint64_t x[], unsigned len, uint64_t y) { + uint64_t cy = y; + + for (unsigned i = 0; i < len; ++i) { + uint64_t X = x[i]; + x[i] -= cy; + if (cy > X) + cy = 1; + else { + cy = 0; + break; + } + } + + return cy; + } + + /// sub - This function subtracts the integer array x[] by + /// integer array y[], and returns the borrow-out carry. + uint64_t APInt::sub(uint64_t dest[], uint64_t x[], + uint64_t y[], unsigned len) { + // Carry indicator. + uint64_t cy = 0; + + for (unsigned i = 0; i < len; ++i) { + uint64_t Y = y[i], X = x[i]; + Y += cy; + + cy = Y < cy ? 1 : 0; + Y = X - Y; + cy += Y > X ? 1 : 0; + dest[i] = Y; + } + return cy; + } + + /// UnitDiv - This function divides N by D, + /// and returns (remainder << 32) | quotient. + /// Assumes (N >> 32) < D. + uint64_t APInt::unitDiv(uint64_t N, unsigned D) { + uint64_t q, r; // q: quotient, r: remainder. + uint64_t a1 = N >> 32; // a1: high 32-bit part of N. + uint64_t a0 = N & 0xffffffffL; // a0: low 32-bit part of N + if (a1 < ((D - a1 - (a0 >> 31)) & 0xffffffffL)) { + q = N / D; + r = N % D; + } + else { + // Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d + uint64_t c = N - ((uint64_t) D << 31); + // Divide (c1*2^32 + c0) by d + q = c / D; + r = c % D; + // Add 2^31 to quotient + q += 1 << 31; + } + + return (r << 32) | (q & 0xFFFFFFFFl); + } + + /// subMul - This function substracts x[len-1:0] * y from + /// dest[offset+len-1:offset], and returns the most significant + /// word of the product, minus the borrow-out from the subtraction. + unsigned APInt::subMul(unsigned dest[], unsigned offset, + unsigned x[], unsigned len, unsigned y) { + uint64_t yl = (uint64_t) y & 0xffffffffL; + unsigned carry = 0; + unsigned j = 0; + do { + uint64_t prod = ((uint64_t) x[j] & 0xffffffffL) * yl; + unsigned prod_low = (unsigned) prod; + unsigned prod_high = (unsigned) (prod >> 32); + prod_low += carry; + carry = (prod_low < carry ? 1 : 0) + prod_high; + unsigned x_j = dest[offset+j]; + prod_low = x_j - prod_low; + if (prod_low > x_j) ++carry; + dest[offset+j] = prod_low; + } while (++j < len); + return carry; + } + + /// div - This is basically Knuth's formulation of the classical algorithm. + /// Correspondance with Knuth's notation: + /// Knuth's u[0:m+n] == zds[nx:0]. + /// Knuth's v[1:n] == y[ny-1:0] + /// Knuth's n == ny. + /// Knuth's m == nx-ny. + /// Our nx == Knuth's m+n. + /// Could be re-implemented using gmp's mpn_divrem: + /// zds[nx] = mpn_divrem (&zds[ny], 0, zds, nx, y, ny). + void APInt::div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny) { + unsigned j = nx; + do { // loop over digits of quotient + // Knuth's j == our nx-j. + // Knuth's u[j:j+n] == our zds[j:j-ny]. + unsigned qhat; // treated as unsigned + if (zds[j] == y[ny-1]) qhat = -1U; // 0xffffffff + else { + uint64_t w = (((uint64_t)(zds[j])) << 32) + + ((uint64_t)zds[j-1] & 0xffffffffL); + qhat = (unsigned) unitDiv(w, y[ny-1]); + } + if (qhat) { + unsigned borrow = subMul(zds, j - ny, y, ny, qhat); + unsigned save = zds[j]; + uint64_t num = ((uint64_t)save&0xffffffffL) - + ((uint64_t)borrow&0xffffffffL); + while (num) { + qhat--; + uint64_t carry = 0; + for (unsigned i = 0; i < ny; i++) { + carry += ((uint64_t) zds[j-ny+i] & 0xffffffffL) + + ((uint64_t) y[i] & 0xffffffffL); + zds[j-ny+i] = (unsigned) carry; + carry >>= 32; + } + zds[j] += carry; + num = carry - 1; + } + } + zds[j] = qhat; + } while (--j >= ny); + } + + /// lshift - This function shift x[0:len-1] left by shiftAmt bits, and + /// store the len least significant words of the result in + /// dest[d_offset:d_offset+len-1]. It returns the bits shifted out from + /// the most significant digit. + uint64_t APInt::lshift(uint64_t dest[], unsigned d_offset, + uint64_t x[], unsigned len, unsigned shiftAmt) { + unsigned count = 64 - shiftAmt; + int i = len - 1; + uint64_t high_word = x[i], retVal = high_word >> count; + ++d_offset; + while (--i >= 0) { + uint64_t low_word = x[i]; + dest[d_offset+i] = (high_word << shiftAmt) | (low_word >> count); + high_word = low_word; + } + dest[d_offset+i] = high_word << shiftAmt; + return retVal; + } + + /// @brief Copy assignment operator. Create a new object from the given + /// APInt one by initialization. + APInt& APInt::operator=(const APInt& RHS) { + if (isSingleWord()) VAL = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + unsigned minN = std::min(numWords(), RHS.numWords()); + memcpy(pVal, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, minN * 8); + if (numWords() != minN) + bzero(pVal + minN, (numWords() - minN) * 8); + } + return *this; + } + + /// @brief Assignment operator. Assigns a common case integer value to + /// the APInt. + APInt& APInt::operator=(uint64_t RHS) { + if (isSingleWord()) VAL = RHS; + else { + pVal[0] = RHS; + bzero(pVal, (numWords() - 1) * 8); + } + return *this; + } + + /// @brief Postfix increment operator. Increments the APInt by one. + const APInt APInt::operator++(int) { + APInt API(*this); + if (isSingleWord()) ++VAL; + else + add_1(pVal, pVal, numWords(), 1); + API.TruncToBits(); + return API; + } + + /// @brief Prefix increment operator. Increments the APInt by one. + APInt& APInt::operator++() { + if (isSingleWord()) ++VAL; + else + add_1(pVal, pVal, numWords(), 1); + TruncToBits(); + return *this; + } + + /// @brief Postfix decrement operator. Decrements the APInt by one. + const APInt APInt::operator--(int) { + APInt API(*this); + if (isSingleWord()) --VAL; + else + sub_1(API.pVal, API.numWords(), 1); + API.TruncToBits(); + return API; + } + + /// @brief Prefix decrement operator. Decrements the APInt by one. + APInt& APInt::operator--() { + if (isSingleWord()) --VAL; + else + sub_1(pVal, numWords(), 1); + TruncToBits(); + return *this; + } + + /// @brief Addition assignment operator. Adds this APInt by the given APInt& + /// RHS and assigns the result to this APInt. + APInt& APInt::operator+=(const APInt& RHS) { + if (isSingleWord()) VAL += RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + if (RHS.isSingleWord()) add_1(pVal, pVal, numWords(), RHS.VAL); + else { + if (numWords() <= RHS.numWords()) + add(pVal, pVal, RHS.pVal, numWords()); + else { + uint64_t carry = add(pVal, pVal, RHS.pVal, RHS.numWords()); + add_1(pVal + RHS.numWords(), pVal + RHS.numWords(), + numWords() - RHS.numWords(), carry); + } + } + } + TruncToBits(); + return *this; + } + + /// @brief Subtraction assignment operator. Subtracts this APInt by the given + /// APInt &RHS and assigns the result to this APInt. + APInt& APInt::operator-=(const APInt& RHS) { + if (isSingleWord()) + VAL -= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + if (RHS.isSingleWord()) + sub_1(pVal, numWords(), RHS.VAL); + else { + if (RHS.numWords() < numWords()) { + uint64_t carry = sub(pVal, pVal, RHS.pVal, RHS.numWords()); + sub_1(pVal + RHS.numWords(), numWords() - RHS.numWords(), carry); + } + else + sub(pVal, pVal, RHS.pVal, numWords()); + } + } + TruncToBits(); + return *this; + } + + /// @brief Multiplication assignment operator. Multiplies this APInt by the + /// given APInt& RHS and assigns the result to this APInt. + APInt& APInt::operator*=(const APInt& RHS) { + if (isSingleWord()) VAL *= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + // one-based first non-zero bit position. + unsigned first = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned xlen = !first ? 0 : whichWord(first - 1) + 1; + if (!xlen) + return *this; + else if (RHS.isSingleWord()) + mul_1(pVal, pVal, xlen, RHS.VAL); + else { + first = RHS.numWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; + if (!ylen) { + bzero(pVal, numWords() * 8); + return *this; + } + uint64_t *dest = new uint64_t[xlen+ylen]; + assert(dest && "Memory Allocation Failed!"); + mul(dest, pVal, xlen, RHS.pVal, ylen); + memcpy(pVal, dest, ((xlen + ylen >= numWords()) ? numWords() : xlen + ylen) * 8); + delete[] dest; + } + } + TruncToBits(); + return *this; + } + + /// @brief Division assignment operator. Divides this APInt by the given APInt + /// &RHS and assigns the result to this APInt. + APInt& APInt::operator/=(const APInt& RHS) { + unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - + RHS.CountLeadingZeros(); + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; + assert(ylen && "Divided by zero???"); + if (isSingleWord()) { + if (isSigned && RHS.isSigned) + VAL = RHS.isSingleWord() ? (int64_t(VAL) / int64_t(RHS.VAL)) : + (ylen > 1 ? 0 : int64_t(VAL) / int64_t(RHS.pVal[0])); + else + VAL = RHS.isSingleWord() ? (VAL / RHS.VAL) : + (ylen > 1 ? 0 : VAL / RHS.pVal[0]); + } else { + unsigned first2 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; + if (!xlen) + return *this; + else if ((*this) < RHS) + bzero(pVal, numWords() * 8); + else if ((*this) == RHS) { + bzero(pVal, numWords() * 8); + pVal[0] = 1; + } else if (xlen == 1) + pVal[0] /= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + uint64_t *xwords = new uint64_t[xlen+1], *ywords = new uint64_t[ylen]; + assert(xwords && ywords && "Memory Allocation Failed!"); + memcpy(xwords, pVal, xlen * 8); + xwords[xlen] = 0; + memcpy(ywords, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, ylen * 8); + if (unsigned nshift = 63 - (first - 1) % 64) { + lshift(ywords, 0, ywords, ylen, nshift); + unsigned xlentmp = xlen; + xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); + } + div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); + bzero(pVal, numWords() * 8); + memcpy(pVal, xwords + ylen, (xlen - ylen) * 8); + delete[] xwords; + delete[] ywords; + } + } + return *this; + } + + /// @brief Remainder assignment operator. Yields the remainder from the + /// division of this APInt by the given APInt& RHS and assigns the remainder + /// to this APInt. + APInt& APInt::operator%=(const APInt& RHS) { + unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - + RHS.CountLeadingZeros(); + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; + assert(ylen && "Performing remainder operation by zero ???"); + if (isSingleWord()) { + if (isSigned && RHS.isSigned) + VAL = RHS.isSingleWord() ? (int64_t(VAL) % int64_t(RHS.VAL)) : + (ylen > 1 ? VAL : int64_t(VAL) % int64_t(RHS.pVal[0])); + else + VAL = RHS.isSingleWord() ? (VAL % RHS.VAL) : + (ylen > 1 ? VAL : VAL % RHS.pVal[0]); + } else { + unsigned first2 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; + if (!xlen || (*this) < RHS) + return *this; + else if ((*this) == RHS) + bzero(pVal, numWords() * 8); + else if (xlen == 1) + pVal[0] %= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; + else { + uint64_t *xwords = new uint64_t[xlen+1], *ywords = new uint64_t[ylen]; + assert(xwords && ywords && "Memory Allocation Failed!"); + memcpy(xwords, pVal, xlen * 8); + xwords[xlen] = 0; + memcpy(ywords, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, ylen * 8); + unsigned nshift = 63 - (first - 1) % 64; + if (nshift) { + lshift(ywords, 0, ywords, ylen, nshift); + unsigned xlentmp = xlen; + xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); + } + div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); + bzero(pVal, numWords() * 8); + for (unsigned i = 0; i < ylen-1; ++i) + pVal[i] = (xwords[i] >> nshift) | (xwords[i+1] << (64 - nshift)); + pVal[ylen-1] = xwords[ylen-1] >> nshift; + delete[] xwords; + delete[] ywords; + } + } + return *this; + } + + /// @brief Bitwise AND assignment operator. Performs bitwise AND operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& APInt::operator&=(const APInt& RHS) { + if (isSingleWord()) { + if (RHS.isSingleWord()) VAL &= RHS.VAL; + else VAL &= RHS.pVal[0]; + } else { + if (RHS.isSingleWord()) { + bzero(pVal, (numWords() - 1) * 8); + pVal[0] &= RHS.VAL; + } else { + unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + for (unsigned i = 0; i < minwords; ++i) + pVal[i] &= RHS.pVal[i]; + if (numWords() > minwords) bzero(pVal+minwords, (numWords() - minwords) * 8); + } + } + return *this; + } + + /// @brief Bitwise OR assignment operator. Performs bitwise OR operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& APInt::operator|=(const APInt& RHS) { + if (isSingleWord()) { + if (RHS.isSingleWord()) VAL |= RHS.VAL; + else VAL |= RHS.pVal[0]; + } else { + if (RHS.isSingleWord()) { + pVal[0] |= RHS.VAL; + } else { + unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + for (unsigned i = 0; i < minwords; ++i) + pVal[i] |= RHS.pVal[i]; + } + } + TruncToBits(); + return *this; + } + + /// @brief Bitwise XOR assignment operator. Performs bitwise XOR operation on + /// this APInt and the given APInt& RHS, assigns the result to this APInt. + APInt& APInt::operator^=(const APInt& RHS) { + if (isSingleWord()) { + if (RHS.isSingleWord()) VAL ^= RHS.VAL; + else VAL ^= RHS.pVal[0]; + } else { + if (RHS.isSingleWord()) { + for (unsigned i = 0; i < numWords(); ++i) + pVal[i] ^= RHS.VAL; + } else { + unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + for (unsigned i = 0; i < minwords; ++i) + pVal[i] ^= RHS.pVal[i]; + if (numWords() > minwords) + for (unsigned i = minwords; i < numWords(); ++i) + pVal[i] ^= 0; + } + } + TruncToBits(); + return *this; + } + + /// @brief Bitwise AND operator. Performs bitwise AND operation on this APInt + /// and the given APInt& RHS. + APInt APInt::operator&(const APInt& RHS) const { + APInt API(RHS); + return API &= *this; + } + + /// @brief Bitwise OR operator. Performs bitwise OR operation on this APInt + /// and the given APInt& RHS. + APInt APInt::operator|(const APInt& RHS) const { + APInt API(RHS); + API |= *this; + API.TruncToBits(); + return API; + } + + /// @brief Bitwise XOR operator. Performs bitwise XOR operation on this APInt + /// and the given APInt& RHS. + APInt APInt::operator^(const APInt& RHS) const { + APInt API(RHS); + API ^= *this; + API.TruncToBits(); + return API; + } + + /// @brief Logical AND operator. Performs logical AND operation on this APInt + /// and the given APInt& RHS. + bool APInt::operator&&(const APInt& RHS) const { + if (isSingleWord()) + return RHS.isSingleWord() ? VAL && RHS.VAL : VAL && RHS.pVal[0]; + else if (RHS.isSingleWord()) + return RHS.VAL && pVal[0]; + else { + unsigned minN = std::min(numWords(), RHS.numWords()); + for (unsigned i = 0; i < minN; ++i) + if (pVal[i] && RHS.pVal[i]) + return true; + } + return false; + } + + /// @brief Logical OR operator. Performs logical OR operation on this APInt + /// and the given APInt& RHS. + bool APInt::operator||(const APInt& RHS) const { + if (isSingleWord()) + return RHS.isSingleWord() ? VAL || RHS.VAL : VAL || RHS.pVal[0]; + else if (RHS.isSingleWord()) + return RHS.VAL || pVal[0]; + else { + unsigned minN = std::min(numWords(), RHS.numWords()); + for (unsigned i = 0; i < minN; ++i) + if (pVal[i] || RHS.pVal[i]) + return true; + } + return false; + } + + /// @brief Logical negation operator. Performs logical negation operation on + /// this APInt. + bool APInt::operator !() const { + if (isSingleWord()) + return !VAL; + else + for (unsigned i = 0; i < numWords(); ++i) + if (pVal[i]) + return false; + return true; + } + + /// @brief Multiplication operator. Multiplies this APInt by the given APInt& + /// RHS. + APInt APInt::operator*(const APInt& RHS) const { + APInt API(RHS); + API *= *this; + API.TruncToBits(); + return API; + } + + /// @brief Division operator. Divides this APInt by the given APInt& RHS. + APInt APInt::operator/(const APInt& RHS) const { + APInt API(*this); + return API /= RHS; + } + + /// @brief Remainder operator. Yields the remainder from the division of this + /// APInt and the given APInt& RHS. + APInt APInt::operator%(const APInt& RHS) const { + APInt API(*this); + return API %= RHS; + } + + /// @brief Addition operator. Adds this APInt by the given APInt& RHS. + APInt APInt::operator+(const APInt& RHS) const { + APInt API(*this); + API += RHS; + API.TruncToBits(); + return API; + } + + /// @brief Subtraction operator. Subtracts this APInt by the given APInt& RHS + APInt APInt::operator-(const APInt& RHS) const { + APInt API(*this); + API -= RHS; + API.TruncToBits(); + return API; + } + + /// @brief Array-indexing support. + bool APInt::operator[](unsigned bitPosition) const { + return maskBit(bitPosition) & (isSingleWord() ? + VAL : pVal[whichWord(bitPosition)]) != 0; + } + + /// @brief Equality operator. Compare this APInt with the given APInt& RHS + /// for the validity of the equality relationship. + bool APInt::operator==(const APInt& RHS) const { + unsigned n1 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(), + n2 = RHS.numWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); + if (n1 != n2) return false; + else if (isSingleWord()) + return VAL == (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); + else { + if (n1 <= 64) + return pVal[0] == (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); + for (int i = whichWord(n1 - 1); i >= 0; --i) + if (pVal[i] != RHS.pVal[i]) return false; + } + return true; + } + + /// @brief Inequality operator. Compare this APInt with the given APInt& RHS + /// for the validity of the inequality relationship. + bool APInt::operator!=(const APInt& RHS) const { + return !((*this) == RHS); + } + + /// @brief Less-than operator. Compare this APInt with the given APInt& RHS + /// for the validity of the less-than relationship. + bool APInt::operator <(const APInt& RHS) const { + if (isSigned && RHS.isSigned) { + if ((*this)[bitsnum-1] > RHS[RHS.bitsnum-1]) + return false; + else if ((*this)[bitsnum-1] < RHS[RHS.bitsnum-1]) + return true; + } + unsigned n1 = numWords() * 64 - CountLeadingZeros(), + n2 = RHS.numWords() * 64 - RHS.CountLeadingZeros(); + if (n1 < n2) return true; + else if (n1 > n2) return false; + else if (isSingleWord()) + return VAL < (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); + else { + if (n1 <= 64) + return pVal[0] < (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); + for (int i = whichWord(n1 - 1); i >= 0; --i) { + if (pVal[i] > RHS.pVal[i]) return false; + else if (pVal[i] < RHS.pVal[i]) return true; + } + } + return false; + } + + /// @brief Less-than-or-equal operator. Compare this APInt with the given + /// APInt& RHS for the validity of the less-than-or-equal relationship. + bool APInt::operator<=(const APInt& RHS) const { + return (*this) == RHS || (*this) < RHS; + } + + /// @brief Greater-than operator. Compare this APInt with the given APInt& RHS + /// for the validity of the greater-than relationship. + bool APInt::operator >(const APInt& RHS) const { + return !((*this) <= RHS); + } + + /// @brief Greater-than-or-equal operator. Compare this APInt with the given + /// APInt& RHS for the validity of the greater-than-or-equal relationship. + bool APInt::operator>=(const APInt& RHS) const { + return !((*this) < RHS); + } + + /// Set the given bit to 1 whose poition is given as "bitPosition". + /// @brief Set a given bit to 1. + APInt& APInt::set(unsigned bitPosition) { + if (isSingleWord()) VAL |= maskBit(bitPosition); + else pVal[whichWord(bitPosition)] |= maskBit(bitPosition); + return *this; + } + + /// @brief Set every bit to 1. + APInt& APInt::set() { + if (isSingleWord()) VAL = -1ULL; + else + for (unsigned i = 0; i < numWords(); ++i) + pVal[i] = -1ULL; + return *this; + } + + /// Set the given bit to 0 whose position is given as "bitPosition". + /// @brief Set a given bit to 0. + APInt& APInt::clear(unsigned bitPosition) { + if (isSingleWord()) VAL &= ~maskBit(bitPosition); + else pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition); + return *this; + } + + /// @brief Set every bit to 0. + APInt& APInt::clear() { + if (isSingleWord()) VAL = 0; + else bzero(pVal, numWords() * 8); + return *this; + } + + /// @brief Left-shift assignment operator. Left-shift the APInt by shiftAmt + /// and assigns the result to this APInt. + APInt& APInt::operator<<=(unsigned shiftAmt) { + if (shiftAmt >= bitsnum) { + if (isSingleWord()) VAL = 0; + else bzero(pVal, numWords() * 8); + } else { + for (unsigned i = 0; i < shiftAmt; ++i) clear(i); + for (unsigned i = shiftAmt; i < bitsnum; ++i) { + if ((*this)[i-shiftAmt]) set(i); + else clear(i); + } + } + return *this; + } + + /// @brief Left-shift operator. Left-shift the APInt by shiftAmt. + APInt APInt::operator<<(unsigned shiftAmt) const { + APInt API(*this); + API <<= shiftAmt; + return API; + } + + /// @brief Right-shift assignment operator. Right-shift the APInt by shiftAmt + /// and assigns the result to this APInt. + APInt& APInt::operator>>=(unsigned shiftAmt) { + bool isAShr = isSigned && (*this)[bitsnum-1]; + if (isSingleWord()) + VAL = isAShr ? (int64_t(VAL) >> shiftAmt) : (VAL >> shiftAmt); + else { + unsigned i = 0; + for (i = 0; i < bitsnum - shiftAmt; ++i) + if ((*this)[i+shiftAmt]) set(i); + else clear(i); + for (; i < bitsnum; ++i) + isAShr ? set(i) : clear(i); + } + return *this; + } + + /// @brief Right-shift operator. Right-shift the APInt by shiftAmt. + APInt APInt::operator>>(unsigned shiftAmt) const { + APInt API(*this); + API >>= shiftAmt; + return API; + } + + /// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on + /// this APInt. + APInt APInt::operator~() const { + APInt API(*this); + API.flip(); + return API; + } + + /// @brief Toggle every bit to its opposite value. + APInt& APInt::flip() { + if (isSingleWord()) VAL = (~(VAL << (64 - bitsnum))) >> (64 - bitsnum); + else { + unsigned i = 0; + for (; i < numWords() - 1; ++i) + pVal[i] = ~pVal[i]; + unsigned offset = 64 - (bitsnum - 64 * (i - 1)); + pVal[i] = (~(pVal[i] << offset)) >> offset; + } + return *this; + } + + /// Toggle a given bit to its opposite value whose position is given + /// as "bitPosition". + /// @brief Toggles a given bit to its opposite value. + APInt& APInt::flip(unsigned bitPosition) { + assert(bitPosition < bitsnum && "Out of the bit-width range!"); + if ((*this)[bitPosition]) clear(bitPosition); + else set(bitPosition); + return *this; + } + + /// to_string - This function translates the APInt into a string. + std::string APInt::to_string(uint8_t radix) const { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + std::ostringstream buf; + buf << std::setbase(radix); + // If the radix is a power of 2, set the format of ostringstream, + // and output the value into buf. + if ((radix & (radix - 1)) == 0) { + if (isSingleWord()) buf << VAL; + else { + buf << pVal[numWords()-1]; + buf << std::setw(64 / (radix / 8 + 2)) << std::setfill('0'); + for (int i = numWords() - 2; i >= 0; --i) + buf << pVal[i]; + } + } + else { // If the radix = 10, need to translate the value into a + // string. + if (isSingleWord()) buf << VAL; + else { + // FIXME: To be supported. + } + } + return buf.str(); + } + + /// getMaxValue - This function returns the largest value + /// for an APInt of the specified bit-width and if isSign == true, + /// it should be largest signed value, otherwise unsigned value. + APInt APInt::getMaxValue(unsigned numBits, bool isSign) { + APInt APIVal(numBits, 1); + APIVal.set(); + return isSign ? APIVal.clear(numBits) : APIVal; + } + + /// getMinValue - This function returns the smallest value for + /// an APInt of the given bit-width and if isSign == true, + /// it should be smallest signed value, otherwise zero. + APInt APInt::getMinValue(unsigned numBits, bool isSign) { + APInt APIVal(0, numBits); + return isSign ? APIVal : APIVal.set(numBits); + } + + /// getAllOnesValue - This function returns an all-ones value for + /// an APInt of the specified bit-width. + APInt APInt::getAllOnesValue(unsigned numBits) { + return getMaxValue(numBits, false); + } + + /// getNullValue - This function creates an '0' value for an + /// APInt of the specified bit-width. + APInt APInt::getNullValue(unsigned numBits) { + return getMinValue(numBits, true); + } + + /// HiBits - This function returns the high "numBits" bits of this APInt. + APInt APInt::HiBits(unsigned numBits) const { + return (*this) >> (bitsnum - numBits); + } + + /// LoBits - This function returns the low "numBits" bits of this APInt. + APInt APInt::LoBits(unsigned numBits) const { + return ((*this) << (bitsnum - numBits)) >> (bitsnum - numBits); + } + + /// CountLeadingZeros - This function is a APInt version corresponding to + /// llvm/include/llvm/Support/MathExtras.h's function + /// CountLeadingZeros_{32, 64}. It performs platform optimal form of counting + /// the number of zeros from the most significant bit to the first one bit. + /// @returns numWord() * 64 if the value is zero. + unsigned APInt::CountLeadingZeros() const { + if (isSingleWord()) + return CountLeadingZeros_64(VAL); + unsigned Count = 0; + for (int i = numWords() - 1; i >= 0; --i) { + unsigned tmp = CountLeadingZeros_64(pVal[i]); + Count += tmp; + if (tmp != 64) + break; + } + return Count; + } + + /// CountTrailingZero - This function is a APInt version corresponding to + /// llvm/include/llvm/Support/MathExtras.h's function + /// CountTrailingZeros_{32, 64}. It performs platform optimal form of counting + /// the number of zeros from the least significant bit to the first one bit. + /// @returns numWord() * 64 if the value is zero. + unsigned APInt::CountTrailingZeros() const { + if (isSingleWord()) + return CountTrailingZeros_64(~VAL & (VAL - 1)); + APInt Tmp = ~(*this) & ((*this) - 1); + return numWords() * 64 - Tmp.CountLeadingZeros(); + } + + /// CountPopulation - This function is a APInt version corresponding to + /// llvm/include/llvm/Support/MathExtras.h's function + /// CountPopulation_{32, 64}. It counts the number of set bits in a value. + /// @returns 0 if the value is zero. + unsigned APInt::CountPopulation() const { + if (isSingleWord()) + return CountPopulation_64(VAL); + unsigned Count = 0; + for (unsigned i = 0; i < numWords(); ++i) + Count += CountPopulation_64(pVal[i]); + return Count; + } + + + /// ByteSwap - This function returns a byte-swapped representation of the + /// APInt argument, APIVal. + APInt llvm::ByteSwap(const APInt& APIVal) { + if (APIVal.bitsnum <= 32) + return APInt(APIVal.bitsnum, ByteSwap_32(unsigned(APIVal.VAL))); + else if (APIVal.bitsnum <= 64) + return APInt(APIVal.bitsnum, ByteSwap_64(APIVal.VAL)); + else + return APIVal; + } + + /// GreatestCommonDivisor - This function returns the greatest common + /// divisor of the two APInt values using Enclid's algorithm. + APInt llvm::GreatestCommonDivisor(const APInt& API1, const APInt& API2) { + APInt A = API1, B = API2; + while (!!B) { + APInt T = B; + B = A % B; + A = T; + } + return A; + } From zhousheng00 at gmail.com Mon Feb 5 21:02:31 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Mon, 5 Feb 2007 21:02:31 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp bigint.cpp bitlogic.cpp sign.cpp Message-ID: <200702060302.l1632Vcf017678@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt: arith.cpp updated: 1.1 -> 1.2 bigint.cpp updated: 1.1 -> 1.2 bitlogic.cpp updated: 1.1 -> 1.2 sign.cpp updated: 1.1 -> 1.2 --- Log message: Modify these test cases as APInt changed. --- Diffs of the changes: (+41 -40) arith.cpp | 36 ++++++++++++++++++------------------ bigint.cpp | 16 ++++++++-------- bitlogic.cpp | 10 +++++----- sign.cpp | 19 ++++++++++--------- 4 files changed, 41 insertions(+), 40 deletions(-) Index: llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.1 llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.2 --- llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.1 Mon Jan 29 17:07:32 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp Mon Feb 5 21:02:16 2007 @@ -14,61 +14,61 @@ using namespace llvm; -APInt x(21,0x1fffff); +APInt x(0x1fffff, 21); -APInt y(21,0x0fffff); +APInt y(0x0fffff, 21); int my_test() { - APInt i(10,uint64_t(0)); - APInt j(10); - APInt k(10); - APInt l(10); - APInt result(21); + APInt i(uint64_t(0), 10); + APInt j(0, 10); + APInt k(0, 10); + APInt l(0, 10); + APInt result(0, 21); short temp; int i_temp; unsigned int ui_x; unsigned int ui_y; j = i; j -= 1; - temp = (short)j; + temp = (short)j.getValue(); printf( "temp = %hd\n", temp); k = i; k += 1; - temp = k; + temp = k.getValue(); printf( "temp = %hd\n", temp); k = j * k; - temp = k; + temp = k.getValue(); printf( "temp = %hd\n", temp); j *= 120; l = j / k; - temp = l; + temp = l.getValue(); printf( "temp = %hd\n", temp); j *= (-176); // after truncation, the value should be -384 l = j / k; - temp = l; + temp = l.getValue(); printf( "temp = %hd\n", temp); l = 120; l = (j * l); l %= 4; - temp = l; + temp = l.getValue(); printf( "temp = %hd\n", temp); l = -217; l = (j * l); l = l / (++i); - temp = l; + temp = l.getValue(); printf( "temp = %hd\n", temp); result = ++x; - i_temp = result; + i_temp = result.getValue(); printf( "i_temp = %x\n", i_temp); x--; result = x + y; - i_temp = result; + i_temp = result.getValue(); printf("i_temp = %x\n", i_temp); - ui_x = x; - ui_y = y; + ui_x = x.getValue(); + ui_y = y.getValue(); i_temp = ui_x - ui_y; printf("i_temp = %x\n", i_temp); Index: llvm-test/SingleSource/UnitTests/Integer/APInt/bigint.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/bigint.cpp:1.1 llvm-test/SingleSource/UnitTests/Integer/APInt/bigint.cpp:1.2 --- llvm-test/SingleSource/UnitTests/Integer/APInt/bigint.cpp:1.1 Mon Jan 29 17:07:32 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/bigint.cpp Mon Feb 5 21:02:16 2007 @@ -13,17 +13,17 @@ using namespace llvm; -const APInt bnd(10,1023); +const APInt bnd(1023, 10); -APInt x(169, 0xffffffffULL); -APInt y(169, -0xabcdefdeULL); +APInt x(0xffffffffULL, 169); +APInt y(-0xabcdefdeULL, 169); int my_test() { - APInt i(10,uint64_t(0)); - APInt result(169); - APInt l_result(32); + APInt i(uint64_t(0), 10); + APInt result(0, 169); + APInt l_result(0, 32); long long rem; long long rem2; { @@ -41,11 +41,11 @@ } result = x*y; l_result = result % 0x37015; - rem = l_result; + rem = l_result.getValue(); printf("rem = %lld\n", rem); l_result = result % -198721; - rem2 = l_result; + rem2 = l_result.getValue(); printf("rem2 = %lld\n", rem2); return 0; } Index: llvm-test/SingleSource/UnitTests/Integer/APInt/bitlogic.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/bitlogic.cpp:1.1 llvm-test/SingleSource/UnitTests/Integer/APInt/bitlogic.cpp:1.2 --- llvm-test/SingleSource/UnitTests/Integer/APInt/bitlogic.cpp:1.1 Mon Jan 29 19:10:43 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/bitlogic.cpp Mon Feb 5 21:02:16 2007 @@ -16,11 +16,11 @@ int my_test() { - APInt x(1,0x1); - APInt y(1); - APInt z(9,0x1ff); - APInt uz(9,0x1ff); - APInt temp(9); + APInt x(0x1, 1); + APInt y(0, 1); + APInt z(0x1ff, 9); + APInt uz(0x1ff, 9); + APInt temp(0, 9); y = x; y -= 1; if (!y) Index: llvm-test/SingleSource/UnitTests/Integer/APInt/sign.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/sign.cpp:1.1 llvm-test/SingleSource/UnitTests/Integer/APInt/sign.cpp:1.2 --- llvm-test/SingleSource/UnitTests/Integer/APInt/sign.cpp:1.1 Mon Jan 29 19:08:52 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/sign.cpp Mon Feb 5 21:02:16 2007 @@ -19,8 +19,8 @@ main ( int argc, char** argv) { int num, r; - APInt x(24), y(24), z(24); - APInt ux(24), uy(24), uz(24); + APInt x(0, 24, true), y(0, 24, true), z(0, 24, true); + APInt ux(0, 24), uy(0, 24), uz(0, 24); r = rand(); r = r - 1804289384; // -1 @@ -36,28 +36,29 @@ x = num; ux = num; - printf("x = %d, ux = %u, y=%d, uy = %u\n", int(x), (unsigned int)ux, - int(y), (unsigned int)uy); + printf("x = %d, ux = %u, y=%d, uy = %u\n", int(x.getValue()), + (unsigned int)ux.getValue(), int(y.getValue()), + (unsigned int)uy.getValue()); z = x * y; // 0x1000001 * (-1) uz = ux * uy; - printf("z=%d, uz=%u\n", int(z), (unsigned int)uz); + printf("z=%d, uz=%u\n", int(z.getValue()), (unsigned int)uz.getValue()); z = x % 314; uz = ux % 314; - printf("z=%d, uz=%u\n", int(z), (unsigned int)uz); + printf("z=%d, uz=%u\n", int(z.getValue()), (unsigned int)uz.getValue()); z = x / 314; uz = ux / 314; - printf("z=%d, uz=%u\n", int(z), (unsigned int)uz); + printf("z=%d, uz=%u\n", int(z.getValue()), (unsigned int)uz.getValue()); z = (x+0xf28) / 314; uz = (ux + 0xf28) / 314; - printf("z=%d, uz=%u\n", int(z), (unsigned int)uz); + printf("z=%d, uz=%u\n", int(z.getValue()), (unsigned int)uz.getValue()); z = (x - 580) / 314; uz = (((ux - 580)) / 314); - printf("z=%d, uz=%u\n", int(z), (unsigned int)uz); + printf("z=%d, uz=%u\n", int(z.getValue()), (unsigned int)uz.getValue()); return 0; } From sabre at nondot.org Mon Feb 5 23:39:04 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 5 Feb 2007 23:39:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702060539.l165d4GR020476@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.1 -> 1.2 --- Log message: Disable this for now. --- Diffs of the changes: (+5 -0) APInt.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.1 llvm/lib/Support/APInt.cpp:1.2 --- llvm/lib/Support/APInt.cpp:1.1 Mon Feb 5 21:00:16 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 5 23:38:37 2007 @@ -13,6 +13,8 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/APInt.h" + +#if 0 #include "llvm/DerivedTypes.h" #include "llvm/Support/MathExtras.h" #include @@ -1111,3 +1113,6 @@ } return A; } + +#endif + From clattner at apple.com Mon Feb 5 23:40:51 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 5 Feb 2007 21:40:51 -0800 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp In-Reply-To: <200702060300.l1630bKl017623@zion.cs.uiuc.edu> References: <200702060300.l1630bKl017623@zion.cs.uiuc.edu> Message-ID: > + #include "llvm/ADT/APInt.h" > + #include "llvm/DerivedTypes.h" > + #include "llvm/Support/MathExtras.h" > + #include strings.h is not portable. Please use , and memcpy/memset/ etc instead of bzero and friends. I've #ifdef'd this file out temporarily until this is resolved. > + #include You are not allowed to include this header: http://llvm.org/docs/CodingStandards.html#ll_iostream > + #include > + #include Please eliminate your single use of ostringstream. It is definitely overkill for what you're using it for. Thanks, -Chris > + #include > + using namespace llvm; > + > + APInt::APInt(uint64_t val, unsigned numBits, bool sign) > + : bitsnum(numBits), isSigned(sign) { > + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too > small"); > + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too > large"); > + if (isSingleWord()) > + VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - > bitsnum)); > + else { > + // Memory allocation and check if successful. > + assert((pVal = new uint64_t[numWords()]) && > + "APInt memory allocation fails!"); > + bzero(pVal, numWords() * 8); > + pVal[0] = val; > + } > + } > + > + APInt::APInt(unsigned numBits, uint64_t bigVal[], bool sign) > + : bitsnum(numBits), isSigned(sign) { > + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too > small"); > + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too > large"); > + assert(bigVal && "Null pointer detected!"); > + if (isSingleWord()) > + VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - > bitsnum)); > + else { > + // Memory allocation and check if successful. > + assert((pVal = new uint64_t[numWords()]) && > + "APInt memory allocation fails!"); > + // Calculate the actual length of bigVal[]. > + unsigned n = sizeof(*bigVal) / sizeof(bigVal[0]); > + unsigned maxN = std::max(n, numWords()); > + unsigned minN = std::min(n, numWords()); > + memcpy(pVal, bigVal, (minN - 1) * 8); > + pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - > bitsnum % 64)); > + if (maxN == numWords()) > + bzero(pVal+n, (numWords() - n) * 8); > + } > + } > + > + APInt::APInt(std::string& Val, uint8_t radix, bool sign) > + : isSigned(sign) { > + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && > + "Radix should be 2, 8, 10, or 16!"); > + assert(!Val.empty() && "String empty?"); > + unsigned slen = Val.size(); > + unsigned size = 0; > + // If the radix is a power of 2, read the input > + // from most significant to least significant. > + if ((radix & (radix - 1)) == 0) { > + unsigned nextBitPos = 0, bits_per_digit = radix / 8 + 2; > + uint64_t resDigit = 0; > + bitsnum = slen * bits_per_digit; > + if (numWords() > 1) > + assert((pVal = new uint64_t[numWords()]) && > + "APInt memory allocation fails!"); > + for (int i = slen - 1; i >= 0; --i) { > + uint64_t digit = Val[i] - 48; // '0' == 48. > + resDigit |= digit << nextBitPos; > + nextBitPos += bits_per_digit; > + if (nextBitPos >= 64) { > + if (isSingleWord()) { > + VAL = resDigit; > + break; > + } > + pVal[size++] = resDigit; > + nextBitPos -= 64; > + resDigit = digit >> (bits_per_digit - nextBitPos); > + } > + } > + if (!isSingleWord() && size <= numWords()) > + pVal[size] = resDigit; > + } else { // General case. The radix is not a power of 2. > + // For 10-radix, the max value of 64-bit integer is > 18446744073709551615, > + // and its digits number is 14. > + const unsigned chars_per_word = 20; > + if (slen < chars_per_word || > + (Val <= "18446744073709551615" && > + slen == chars_per_word)) { // In case Val <= 2^64 - 1 > + bitsnum = 64; > + VAL = strtoull(Val.c_str(), 0, 10); > + } else { // In case Val > 2^64 - 1 > + bitsnum = (slen / chars_per_word + 1) * 64; > + assert((pVal = new uint64_t[numWords()]) && > + "APInt memory allocation fails!"); > + bzero(pVal, numWords() * 8); > + unsigned str_pos = 0; > + while (str_pos < slen) { > + unsigned chunk = slen - str_pos; > + if (chunk > chars_per_word - 1) > + chunk = chars_per_word - 1; > + uint64_t resDigit = Val[str_pos++] - 48; // 48 == '0'. > + uint64_t big_base = radix; > + while (--chunk > 0) { > + resDigit = resDigit * radix + Val[str_pos++] - 48; > + big_base *= radix; > + } > + > + uint64_t carry; > + if (!size) > + carry = resDigit; > + else { > + carry = mul_1(pVal, pVal, size, big_base); > + carry += add_1(pVal, pVal, size, resDigit); > + } > + > + if (carry) pVal[size++] = carry; > + } > + } > + } > + } > + > + APInt::APInt(const APInt& APIVal) > + : bitsnum(APIVal.bitsnum), isSigned(APIVal.isSigned) { > + if (isSingleWord()) VAL = APIVal.VAL; > + else { > + // Memory allocation and check if successful. > + assert((pVal = new uint64_t[numWords()]) && > + "APInt memory allocation fails!"); > + memcpy(pVal, APIVal.pVal, numWords() * 8); > + } > + } > + > + APInt::~APInt() { > + if (!isSingleWord() && pVal) delete[] pVal; > + } > + > + /// whichByte - This function returns the word position > + /// for the specified bit position. > + inline unsigned APInt::whichByte(unsigned bitPosition) > + { return (bitPosition % APINT_BITS_PER_WORD) / 8; } > + > + /// getWord - returns the corresponding word for the specified > bit position. > + inline uint64_t& APInt::getWord(unsigned bitPosition) > + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } > + > + /// getWord - returns the corresponding word for the specified > bit position. > + /// This is a constant version. > + inline uint64_t APInt::getWord(unsigned bitPosition) const > + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } > + > + /// mul_1 - This function multiplies the integer array x[] by a > integer y and > + /// returns the carry. > + uint64_t APInt::mul_1(uint64_t dest[], uint64_t x[], > + unsigned len, uint64_t y) { > + // Split y into high 32-bit part and low 32-bit part. > + uint64_t ly = y & 0xffffffffULL, hy = y >> 32; > + uint64_t carry = 0, lx, hx; > + for (unsigned i = 0; i < len; ++i) { > + lx = x[i] & 0xffffffffULL; > + hx = x[i] >> 32; > + // hasCarry - A flag to indicate if has carry. > + // hasCarry == 0, no carry > + // hasCarry == 1, has carry > + // hasCarry == 2, no carry and the calculation result == 0. > + uint8_t hasCarry = 0; > + dest[i] = carry + lx * ly; > + // Determine if the add above introduces carry. > + hasCarry = (dest[i] < carry) ? 1 : 0; > + carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << > 32) : 0); > + // The upper limit of carry can be (2^32 - 1)(2^32 - 1) + > + // (2^32 - 1) + 2^32 = 2^64. > + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); > + > + carry += (lx * hy) & 0xffffffffULL; > + dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL); > + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL > << 32) : 0) + > + (carry >> 32) + ((lx * hy) >> 32) + hx * hy; > + } > + > + return carry; > + } > + > + /// mul - This function multiplies integer array x[] by integer > array y[] and > + /// stores the result into integer array dest[]. > + /// Note the array dest[]'s size should no less than xlen + ylen. > + void APInt::mul(uint64_t dest[], uint64_t x[], unsigned xlen, > + uint64_t y[], unsigned ylen) { > + dest[xlen] = mul_1(dest, x, xlen, y[0]); > + > + for (unsigned i = 1; i < ylen; ++i) { > + uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32; > + uint64_t carry = 0, lx, hx; > + for (unsigned j = 0; j < xlen; ++j) { > + lx = x[j] & 0xffffffffULL; > + hx = x[j] >> 32; > + // hasCarry - A flag to indicate if has carry. > + // hasCarry == 0, no carry > + // hasCarry == 1, has carry > + // hasCarry == 2, no carry and the calculation result == 0. > + uint8_t hasCarry = 0; > + uint64_t resul = carry + lx * ly; > + hasCarry = (resul < carry) ? 1 : 0; > + carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> > 32); > + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); > + > + carry += (lx * hy) & 0xffffffffULL; > + resul = (carry << 32) | (resul & 0xffffffffULL); > + dest[i+j] += resul; > + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? > (1ULL << 32) : 0)+ > + (carry >> 32) + (dest[i+j] < resul ? 1 : 0) + > + ((lx * hy) >> 32) + hx * hy; > + } > + dest[i+xlen] = carry; > + } > + } > + > + /// add_1 - This function adds the integer array x[] by integer y > and > + /// returns the carry. > + uint64_t APInt::add_1(uint64_t dest[], uint64_t x[], > + unsigned len, uint64_t y) { > + uint64_t carry = y; > + > + for (unsigned i = 0; i < len; ++i) { > + dest[i] = carry + x[i]; > + carry = (dest[i] < carry) ? 1 : 0; > + } > + return carry; > + } > + > + /// add - This function adds the integer array x[] by integer array > + /// y[] and returns the carry. > + uint64_t APInt::add(uint64_t dest[], uint64_t x[], > + uint64_t y[], unsigned len) { > + unsigned carry = 0; > + > + for (unsigned i = 0; i< len; ++i) { > + carry += x[i]; > + dest[i] = carry + y[i]; > + carry = carry < x[i] ? 1 : (dest[i] < carry ? 1 : 0); > + } > + return carry; > + } > + > + /// sub_1 - This function subtracts the integer array x[] by > + /// integer y and returns the borrow-out carry. > + uint64_t APInt::sub_1(uint64_t x[], unsigned len, uint64_t y) { > + uint64_t cy = y; > + > + for (unsigned i = 0; i < len; ++i) { > + uint64_t X = x[i]; > + x[i] -= cy; > + if (cy > X) > + cy = 1; > + else { > + cy = 0; > + break; > + } > + } > + > + return cy; > + } > + > + /// sub - This function subtracts the integer array x[] by > + /// integer array y[], and returns the borrow-out carry. > + uint64_t APInt::sub(uint64_t dest[], uint64_t x[], > + uint64_t y[], unsigned len) { > + // Carry indicator. > + uint64_t cy = 0; > + > + for (unsigned i = 0; i < len; ++i) { > + uint64_t Y = y[i], X = x[i]; > + Y += cy; > + > + cy = Y < cy ? 1 : 0; > + Y = X - Y; > + cy += Y > X ? 1 : 0; > + dest[i] = Y; > + } > + return cy; > + } > + > + /// UnitDiv - This function divides N by D, > + /// and returns (remainder << 32) | quotient. > + /// Assumes (N >> 32) < D. > + uint64_t APInt::unitDiv(uint64_t N, unsigned D) { > + uint64_t q, r; // q: quotient, r: remainder. > + uint64_t a1 = N >> 32; // a1: high 32-bit part of N. > + uint64_t a0 = N & 0xffffffffL; // a0: low 32-bit part of N > + if (a1 < ((D - a1 - (a0 >> 31)) & 0xffffffffL)) { > + q = N / D; > + r = N % D; > + } > + else { > + // Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d > + uint64_t c = N - ((uint64_t) D << 31); > + // Divide (c1*2^32 + c0) by d > + q = c / D; > + r = c % D; > + // Add 2^31 to quotient > + q += 1 << 31; > + } > + > + return (r << 32) | (q & 0xFFFFFFFFl); > + } > + > + /// subMul - This function substracts x[len-1:0] * y from > + /// dest[offset+len-1:offset], and returns the most significant > + /// word of the product, minus the borrow-out from the subtraction. > + unsigned APInt::subMul(unsigned dest[], unsigned offset, > + unsigned x[], unsigned len, unsigned y) { > + uint64_t yl = (uint64_t) y & 0xffffffffL; > + unsigned carry = 0; > + unsigned j = 0; > + do { > + uint64_t prod = ((uint64_t) x[j] & 0xffffffffL) * yl; > + unsigned prod_low = (unsigned) prod; > + unsigned prod_high = (unsigned) (prod >> 32); > + prod_low += carry; > + carry = (prod_low < carry ? 1 : 0) + prod_high; > + unsigned x_j = dest[offset+j]; > + prod_low = x_j - prod_low; > + if (prod_low > x_j) ++carry; > + dest[offset+j] = prod_low; > + } while (++j < len); > + return carry; > + } > + > + /// div - This is basically Knuth's formulation of the classical > algorithm. > + /// Correspondance with Knuth's notation: > + /// Knuth's u[0:m+n] == zds[nx:0]. > + /// Knuth's v[1:n] == y[ny-1:0] > + /// Knuth's n == ny. > + /// Knuth's m == nx-ny. > + /// Our nx == Knuth's m+n. > + /// Could be re-implemented using gmp's mpn_divrem: > + /// zds[nx] = mpn_divrem (&zds[ny], 0, zds, nx, y, ny). > + void APInt::div(unsigned zds[], unsigned nx, unsigned y[], > unsigned ny) { > + unsigned j = nx; > + do { // loop over digits of quotient > + // Knuth's j == our nx-j. > + // Knuth's u[j:j+n] == our zds[j:j-ny]. > + unsigned qhat; // treated as unsigned > + if (zds[j] == y[ny-1]) qhat = -1U; // 0xffffffff > + else { > + uint64_t w = (((uint64_t)(zds[j])) << 32) + > + ((uint64_t)zds[j-1] & 0xffffffffL); > + qhat = (unsigned) unitDiv(w, y[ny-1]); > + } > + if (qhat) { > + unsigned borrow = subMul(zds, j - ny, y, ny, qhat); > + unsigned save = zds[j]; > + uint64_t num = ((uint64_t)save&0xffffffffL) - > + ((uint64_t)borrow&0xffffffffL); > + while (num) { > + qhat--; > + uint64_t carry = 0; > + for (unsigned i = 0; i < ny; i++) { > + carry += ((uint64_t) zds[j-ny+i] & 0xffffffffL) > + + ((uint64_t) y[i] & 0xffffffffL); > + zds[j-ny+i] = (unsigned) carry; > + carry >>= 32; > + } > + zds[j] += carry; > + num = carry - 1; > + } > + } > + zds[j] = qhat; > + } while (--j >= ny); > + } > + > + /// lshift - This function shift x[0:len-1] left by shiftAmt > bits, and > + /// store the len least significant words of the result in > + /// dest[d_offset:d_offset+len-1]. It returns the bits shifted > out from > + /// the most significant digit. > + uint64_t APInt::lshift(uint64_t dest[], unsigned d_offset, > + uint64_t x[], unsigned len, unsigned > shiftAmt) { > + unsigned count = 64 - shiftAmt; > + int i = len - 1; > + uint64_t high_word = x[i], retVal = high_word >> count; > + ++d_offset; > + while (--i >= 0) { > + uint64_t low_word = x[i]; > + dest[d_offset+i] = (high_word << shiftAmt) | (low_word >> > count); > + high_word = low_word; > + } > + dest[d_offset+i] = high_word << shiftAmt; > + return retVal; > + } > + > + /// @brief Copy assignment operator. Create a new object from the > given > + /// APInt one by initialization. > + APInt& APInt::operator=(const APInt& RHS) { > + if (isSingleWord()) VAL = RHS.isSingleWord() ? RHS.VAL : > RHS.pVal[0]; > + else { > + unsigned minN = std::min(numWords(), RHS.numWords()); > + memcpy(pVal, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, minN * > 8); > + if (numWords() != minN) > + bzero(pVal + minN, (numWords() - minN) * 8); > + } > + return *this; > + } > + > + /// @brief Assignment operator. Assigns a common case integer > value to > + /// the APInt. > + APInt& APInt::operator=(uint64_t RHS) { > + if (isSingleWord()) VAL = RHS; > + else { > + pVal[0] = RHS; > + bzero(pVal, (numWords() - 1) * 8); > + } > + return *this; > + } > + > + /// @brief Postfix increment operator. Increments the APInt by one. > + const APInt APInt::operator++(int) { > + APInt API(*this); > + if (isSingleWord()) ++VAL; > + else > + add_1(pVal, pVal, numWords(), 1); > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Prefix increment operator. Increments the APInt by one. > + APInt& APInt::operator++() { > + if (isSingleWord()) ++VAL; > + else > + add_1(pVal, pVal, numWords(), 1); > + TruncToBits(); > + return *this; > + } > + > + /// @brief Postfix decrement operator. Decrements the APInt by one. > + const APInt APInt::operator--(int) { > + APInt API(*this); > + if (isSingleWord()) --VAL; > + else > + sub_1(API.pVal, API.numWords(), 1); > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Prefix decrement operator. Decrements the APInt by one. > + APInt& APInt::operator--() { > + if (isSingleWord()) --VAL; > + else > + sub_1(pVal, numWords(), 1); > + TruncToBits(); > + return *this; > + } > + > + /// @brief Addition assignment operator. Adds this APInt by the > given APInt& > + /// RHS and assigns the result to this APInt. > + APInt& APInt::operator+=(const APInt& RHS) { > + if (isSingleWord()) VAL += RHS.isSingleWord() ? RHS.VAL : > RHS.pVal[0]; > + else { > + if (RHS.isSingleWord()) add_1(pVal, pVal, numWords(), RHS.VAL); > + else { > + if (numWords() <= RHS.numWords()) > + add(pVal, pVal, RHS.pVal, numWords()); > + else { > + uint64_t carry = add(pVal, pVal, RHS.pVal, RHS.numWords()); > + add_1(pVal + RHS.numWords(), pVal + RHS.numWords(), > + numWords() - RHS.numWords(), carry); > + } > + } > + } > + TruncToBits(); > + return *this; > + } > + > + /// @brief Subtraction assignment operator. Subtracts this APInt > by the given > + /// APInt &RHS and assigns the result to this APInt. > + APInt& APInt::operator-=(const APInt& RHS) { > + if (isSingleWord()) > + VAL -= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; > + else { > + if (RHS.isSingleWord()) > + sub_1(pVal, numWords(), RHS.VAL); > + else { > + if (RHS.numWords() < numWords()) { > + uint64_t carry = sub(pVal, pVal, RHS.pVal, RHS.numWords()); > + sub_1(pVal + RHS.numWords(), numWords() - RHS.numWords(), > carry); > + } > + else > + sub(pVal, pVal, RHS.pVal, numWords()); > + } > + } > + TruncToBits(); > + return *this; > + } > + > + /// @brief Multiplication assignment operator. Multiplies this > APInt by the > + /// given APInt& RHS and assigns the result to this APInt. > + APInt& APInt::operator*=(const APInt& RHS) { > + if (isSingleWord()) VAL *= RHS.isSingleWord() ? RHS.VAL : > RHS.pVal[0]; > + else { > + // one-based first non-zero bit position. > + unsigned first = numWords() * APINT_BITS_PER_WORD - > CountLeadingZeros(); > + unsigned xlen = !first ? 0 : whichWord(first - 1) + 1; > + if (!xlen) > + return *this; > + else if (RHS.isSingleWord()) > + mul_1(pVal, pVal, xlen, RHS.VAL); > + else { > + first = RHS.numWords() * APINT_BITS_PER_WORD - > RHS.CountLeadingZeros(); > + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; > + if (!ylen) { > + bzero(pVal, numWords() * 8); > + return *this; > + } > + uint64_t *dest = new uint64_t[xlen+ylen]; > + assert(dest && "Memory Allocation Failed!"); > + mul(dest, pVal, xlen, RHS.pVal, ylen); > + memcpy(pVal, dest, ((xlen + ylen >= numWords()) ? numWords > () : xlen + ylen) * 8); > + delete[] dest; > + } > + } > + TruncToBits(); > + return *this; > + } > + > + /// @brief Division assignment operator. Divides this APInt by > the given APInt > + /// &RHS and assigns the result to this APInt. > + APInt& APInt::operator/=(const APInt& RHS) { > + unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - > + RHS.CountLeadingZeros(); > + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; > + assert(ylen && "Divided by zero???"); > + if (isSingleWord()) { > + if (isSigned && RHS.isSigned) > + VAL = RHS.isSingleWord() ? (int64_t(VAL) / int64_t(RHS.VAL)) : > + (ylen > 1 ? 0 : int64_t(VAL) / int64_t(RHS.pVal[0])); > + else > + VAL = RHS.isSingleWord() ? (VAL / RHS.VAL) : > + (ylen > 1 ? 0 : VAL / RHS.pVal[0]); > + } else { > + unsigned first2 = numWords() * APINT_BITS_PER_WORD - > CountLeadingZeros(); > + unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; > + if (!xlen) > + return *this; > + else if ((*this) < RHS) > + bzero(pVal, numWords() * 8); > + else if ((*this) == RHS) { > + bzero(pVal, numWords() * 8); > + pVal[0] = 1; > + } else if (xlen == 1) > + pVal[0] /= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; > + else { > + uint64_t *xwords = new uint64_t[xlen+1], *ywords = new > uint64_t[ylen]; > + assert(xwords && ywords && "Memory Allocation Failed!"); > + memcpy(xwords, pVal, xlen * 8); > + xwords[xlen] = 0; > + memcpy(ywords, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, > ylen * 8); > + if (unsigned nshift = 63 - (first - 1) % 64) { > + lshift(ywords, 0, ywords, ylen, nshift); > + unsigned xlentmp = xlen; > + xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); > + } > + div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); > + bzero(pVal, numWords() * 8); > + memcpy(pVal, xwords + ylen, (xlen - ylen) * 8); > + delete[] xwords; > + delete[] ywords; > + } > + } > + return *this; > + } > + > + /// @brief Remainder assignment operator. Yields the remainder > from the > + /// division of this APInt by the given APInt& RHS and assigns > the remainder > + /// to this APInt. > + APInt& APInt::operator%=(const APInt& RHS) { > + unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - > + RHS.CountLeadingZeros(); > + unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; > + assert(ylen && "Performing remainder operation by zero ???"); > + if (isSingleWord()) { > + if (isSigned && RHS.isSigned) > + VAL = RHS.isSingleWord() ? (int64_t(VAL) % int64_t(RHS.VAL)) : > + (ylen > 1 ? VAL : int64_t(VAL) % int64_t(RHS.pVal[0])); > + else > + VAL = RHS.isSingleWord() ? (VAL % RHS.VAL) : > + (ylen > 1 ? VAL : VAL % RHS.pVal[0]); > + } else { > + unsigned first2 = numWords() * APINT_BITS_PER_WORD - > CountLeadingZeros(); > + unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; > + if (!xlen || (*this) < RHS) > + return *this; > + else if ((*this) == RHS) > + bzero(pVal, numWords() * 8); > + else if (xlen == 1) > + pVal[0] %= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; > + else { > + uint64_t *xwords = new uint64_t[xlen+1], *ywords = new > uint64_t[ylen]; > + assert(xwords && ywords && "Memory Allocation Failed!"); > + memcpy(xwords, pVal, xlen * 8); > + xwords[xlen] = 0; > + memcpy(ywords, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, > ylen * 8); > + unsigned nshift = 63 - (first - 1) % 64; > + if (nshift) { > + lshift(ywords, 0, ywords, ylen, nshift); > + unsigned xlentmp = xlen; > + xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); > + } > + div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); > + bzero(pVal, numWords() * 8); > + for (unsigned i = 0; i < ylen-1; ++i) > + pVal[i] = (xwords[i] >> nshift) | (xwords[i+1] << (64 - > nshift)); > + pVal[ylen-1] = xwords[ylen-1] >> nshift; > + delete[] xwords; > + delete[] ywords; > + } > + } > + return *this; > + } > + > + /// @brief Bitwise AND assignment operator. Performs bitwise AND > operation on > + /// this APInt and the given APInt& RHS, assigns the result to > this APInt. > + APInt& APInt::operator&=(const APInt& RHS) { > + if (isSingleWord()) { > + if (RHS.isSingleWord()) VAL &= RHS.VAL; > + else VAL &= RHS.pVal[0]; > + } else { > + if (RHS.isSingleWord()) { > + bzero(pVal, (numWords() - 1) * 8); > + pVal[0] &= RHS.VAL; > + } else { > + unsigned minwords = numWords() < RHS.numWords() ? numWords > () : RHS.numWords(); > + for (unsigned i = 0; i < minwords; ++i) > + pVal[i] &= RHS.pVal[i]; > + if (numWords() > minwords) bzero(pVal+minwords, (numWords() > - minwords) * 8); > + } > + } > + return *this; > + } > + > + /// @brief Bitwise OR assignment operator. Performs bitwise OR > operation on > + /// this APInt and the given APInt& RHS, assigns the result to > this APInt. > + APInt& APInt::operator|=(const APInt& RHS) { > + if (isSingleWord()) { > + if (RHS.isSingleWord()) VAL |= RHS.VAL; > + else VAL |= RHS.pVal[0]; > + } else { > + if (RHS.isSingleWord()) { > + pVal[0] |= RHS.VAL; > + } else { > + unsigned minwords = numWords() < RHS.numWords() ? numWords > () : RHS.numWords(); > + for (unsigned i = 0; i < minwords; ++i) > + pVal[i] |= RHS.pVal[i]; > + } > + } > + TruncToBits(); > + return *this; > + } > + > + /// @brief Bitwise XOR assignment operator. Performs bitwise XOR > operation on > + /// this APInt and the given APInt& RHS, assigns the result to > this APInt. > + APInt& APInt::operator^=(const APInt& RHS) { > + if (isSingleWord()) { > + if (RHS.isSingleWord()) VAL ^= RHS.VAL; > + else VAL ^= RHS.pVal[0]; > + } else { > + if (RHS.isSingleWord()) { > + for (unsigned i = 0; i < numWords(); ++i) > + pVal[i] ^= RHS.VAL; > + } else { > + unsigned minwords = numWords() < RHS.numWords() ? numWords > () : RHS.numWords(); > + for (unsigned i = 0; i < minwords; ++i) > + pVal[i] ^= RHS.pVal[i]; > + if (numWords() > minwords) > + for (unsigned i = minwords; i < numWords(); ++i) > + pVal[i] ^= 0; > + } > + } > + TruncToBits(); > + return *this; > + } > + > + /// @brief Bitwise AND operator. Performs bitwise AND operation > on this APInt > + /// and the given APInt& RHS. > + APInt APInt::operator&(const APInt& RHS) const { > + APInt API(RHS); > + return API &= *this; > + } > + > + /// @brief Bitwise OR operator. Performs bitwise OR operation on > this APInt > + /// and the given APInt& RHS. > + APInt APInt::operator|(const APInt& RHS) const { > + APInt API(RHS); > + API |= *this; > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Bitwise XOR operator. Performs bitwise XOR operation > on this APInt > + /// and the given APInt& RHS. > + APInt APInt::operator^(const APInt& RHS) const { > + APInt API(RHS); > + API ^= *this; > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Logical AND operator. Performs logical AND operation > on this APInt > + /// and the given APInt& RHS. > + bool APInt::operator&&(const APInt& RHS) const { > + if (isSingleWord()) > + return RHS.isSingleWord() ? VAL && RHS.VAL : VAL && RHS.pVal[0]; > + else if (RHS.isSingleWord()) > + return RHS.VAL && pVal[0]; > + else { > + unsigned minN = std::min(numWords(), RHS.numWords()); > + for (unsigned i = 0; i < minN; ++i) > + if (pVal[i] && RHS.pVal[i]) > + return true; > + } > + return false; > + } > + > + /// @brief Logical OR operator. Performs logical OR operation on > this APInt > + /// and the given APInt& RHS. > + bool APInt::operator||(const APInt& RHS) const { > + if (isSingleWord()) > + return RHS.isSingleWord() ? VAL || RHS.VAL : VAL || RHS.pVal[0]; > + else if (RHS.isSingleWord()) > + return RHS.VAL || pVal[0]; > + else { > + unsigned minN = std::min(numWords(), RHS.numWords()); > + for (unsigned i = 0; i < minN; ++i) > + if (pVal[i] || RHS.pVal[i]) > + return true; > + } > + return false; > + } > + > + /// @brief Logical negation operator. Performs logical negation > operation on > + /// this APInt. > + bool APInt::operator !() const { > + if (isSingleWord()) > + return !VAL; > + else > + for (unsigned i = 0; i < numWords(); ++i) > + if (pVal[i]) > + return false; > + return true; > + } > + > + /// @brief Multiplication operator. Multiplies this APInt by the > given APInt& > + /// RHS. > + APInt APInt::operator*(const APInt& RHS) const { > + APInt API(RHS); > + API *= *this; > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Division operator. Divides this APInt by the given > APInt& RHS. > + APInt APInt::operator/(const APInt& RHS) const { > + APInt API(*this); > + return API /= RHS; > + } > + > + /// @brief Remainder operator. Yields the remainder from the > division of this > + /// APInt and the given APInt& RHS. > + APInt APInt::operator%(const APInt& RHS) const { > + APInt API(*this); > + return API %= RHS; > + } > + > + /// @brief Addition operator. Adds this APInt by the given APInt& > RHS. > + APInt APInt::operator+(const APInt& RHS) const { > + APInt API(*this); > + API += RHS; > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Subtraction operator. Subtracts this APInt by the > given APInt& RHS > + APInt APInt::operator-(const APInt& RHS) const { > + APInt API(*this); > + API -= RHS; > + API.TruncToBits(); > + return API; > + } > + > + /// @brief Array-indexing support. > + bool APInt::operator[](unsigned bitPosition) const { > + return maskBit(bitPosition) & (isSingleWord() ? > + VAL : pVal[whichWord(bitPosition)]) != 0; > + } > + > + /// @brief Equality operator. Compare this APInt with the given > APInt& RHS > + /// for the validity of the equality relationship. > + bool APInt::operator==(const APInt& RHS) const { > + unsigned n1 = numWords() * APINT_BITS_PER_WORD - > CountLeadingZeros(), > + n2 = RHS.numWords() * APINT_BITS_PER_WORD - > RHS.CountLeadingZeros(); > + if (n1 != n2) return false; > + else if (isSingleWord()) > + return VAL == (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); > + else { > + if (n1 <= 64) > + return pVal[0] == (RHS.isSingleWord() ? RHS.VAL : RHS.pVal > [0]); > + for (int i = whichWord(n1 - 1); i >= 0; --i) > + if (pVal[i] != RHS.pVal[i]) return false; > + } > + return true; > + } > + > + /// @brief Inequality operator. Compare this APInt with the given > APInt& RHS > + /// for the validity of the inequality relationship. > + bool APInt::operator!=(const APInt& RHS) const { > + return !((*this) == RHS); > + } > + > + /// @brief Less-than operator. Compare this APInt with the given > APInt& RHS > + /// for the validity of the less-than relationship. > + bool APInt::operator <(const APInt& RHS) const { > + if (isSigned && RHS.isSigned) { > + if ((*this)[bitsnum-1] > RHS[RHS.bitsnum-1]) > + return false; > + else if ((*this)[bitsnum-1] < RHS[RHS.bitsnum-1]) > + return true; > + } > + unsigned n1 = numWords() * 64 - CountLeadingZeros(), > + n2 = RHS.numWords() * 64 - RHS.CountLeadingZeros(); > + if (n1 < n2) return true; > + else if (n1 > n2) return false; > + else if (isSingleWord()) > + return VAL < (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); > + else { > + if (n1 <= 64) > + return pVal[0] < (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); > + for (int i = whichWord(n1 - 1); i >= 0; --i) { > + if (pVal[i] > RHS.pVal[i]) return false; > + else if (pVal[i] < RHS.pVal[i]) return true; > + } > + } > + return false; > + } > + > + /// @brief Less-than-or-equal operator. Compare this APInt with > the given > + /// APInt& RHS for the validity of the less-than-or-equal > relationship. > + bool APInt::operator<=(const APInt& RHS) const { > + return (*this) == RHS || (*this) < RHS; > + } > + > + /// @brief Greater-than operator. Compare this APInt with the > given APInt& RHS > + /// for the validity of the greater-than relationship. > + bool APInt::operator >(const APInt& RHS) const { > + return !((*this) <= RHS); > + } > + > + /// @brief Greater-than-or-equal operator. Compare this APInt > with the given > + /// APInt& RHS for the validity of the greater-than-or-equal > relationship. > + bool APInt::operator>=(const APInt& RHS) const { > + return !((*this) < RHS); > + } > + > + /// Set the given bit to 1 whose poition is given as "bitPosition". > + /// @brief Set a given bit to 1. > + APInt& APInt::set(unsigned bitPosition) { > + if (isSingleWord()) VAL |= maskBit(bitPosition); > + else pVal[whichWord(bitPosition)] |= maskBit(bitPosition); > + return *this; > + } > + > + /// @brief Set every bit to 1. > + APInt& APInt::set() { > + if (isSingleWord()) VAL = -1ULL; > + else > + for (unsigned i = 0; i < numWords(); ++i) > + pVal[i] = -1ULL; > + return *this; > + } > + > + /// Set the given bit to 0 whose position is given as "bitPosition". > + /// @brief Set a given bit to 0. > + APInt& APInt::clear(unsigned bitPosition) { > + if (isSingleWord()) VAL &= ~maskBit(bitPosition); > + else pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition); > + return *this; > + } > + > + /// @brief Set every bit to 0. > + APInt& APInt::clear() { > + if (isSingleWord()) VAL = 0; > + else bzero(pVal, numWords() * 8); > + return *this; > + } > + > + /// @brief Left-shift assignment operator. Left-shift the APInt > by shiftAmt > + /// and assigns the result to this APInt. > + APInt& APInt::operator<<=(unsigned shiftAmt) { > + if (shiftAmt >= bitsnum) { > + if (isSingleWord()) VAL = 0; > + else bzero(pVal, numWords() * 8); > + } else { > + for (unsigned i = 0; i < shiftAmt; ++i) clear(i); > + for (unsigned i = shiftAmt; i < bitsnum; ++i) { > + if ((*this)[i-shiftAmt]) set(i); > + else clear(i); > + } > + } > + return *this; > + } > + > + /// @brief Left-shift operator. Left-shift the APInt by shiftAmt. > + APInt APInt::operator<<(unsigned shiftAmt) const { > + APInt API(*this); > + API <<= shiftAmt; > + return API; > + } > + > + /// @brief Right-shift assignment operator. Right-shift the APInt > by shiftAmt > + /// and assigns the result to this APInt. > + APInt& APInt::operator>>=(unsigned shiftAmt) { > + bool isAShr = isSigned && (*this)[bitsnum-1]; > + if (isSingleWord()) > + VAL = isAShr ? (int64_t(VAL) >> shiftAmt) : (VAL >> shiftAmt); > + else { > + unsigned i = 0; > + for (i = 0; i < bitsnum - shiftAmt; ++i) > + if ((*this)[i+shiftAmt]) set(i); > + else clear(i); > + for (; i < bitsnum; ++i) > + isAShr ? set(i) : clear(i); > + } > + return *this; > + } > + > + /// @brief Right-shift operator. Right-shift the APInt by shiftAmt. > + APInt APInt::operator>>(unsigned shiftAmt) const { > + APInt API(*this); > + API >>= shiftAmt; > + return API; > + } > + > + /// @brief Bitwise NOT operator. Performs a bitwise logical NOT > operation on > + /// this APInt. > + APInt APInt::operator~() const { > + APInt API(*this); > + API.flip(); > + return API; > + } > + > + /// @brief Toggle every bit to its opposite value. > + APInt& APInt::flip() { > + if (isSingleWord()) VAL = (~(VAL << (64 - bitsnum))) >> (64 - > bitsnum); > + else { > + unsigned i = 0; > + for (; i < numWords() - 1; ++i) > + pVal[i] = ~pVal[i]; > + unsigned offset = 64 - (bitsnum - 64 * (i - 1)); > + pVal[i] = (~(pVal[i] << offset)) >> offset; > + } > + return *this; > + } > + > + /// Toggle a given bit to its opposite value whose position is given > + /// as "bitPosition". > + /// @brief Toggles a given bit to its opposite value. > + APInt& APInt::flip(unsigned bitPosition) { > + assert(bitPosition < bitsnum && "Out of the bit-width range!"); > + if ((*this)[bitPosition]) clear(bitPosition); > + else set(bitPosition); > + return *this; > + } > + > + /// to_string - This function translates the APInt into a string. > + std::string APInt::to_string(uint8_t radix) const { > + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && > + "Radix should be 2, 8, 10, or 16!"); > + std::ostringstream buf; > + buf << std::setbase(radix); > + // If the radix is a power of 2, set the format of ostringstream, > + // and output the value into buf. > + if ((radix & (radix - 1)) == 0) { > + if (isSingleWord()) buf << VAL; > + else { > + buf << pVal[numWords()-1]; > + buf << std::setw(64 / (radix / 8 + 2)) << std::setfill('0'); > + for (int i = numWords() - 2; i >= 0; --i) > + buf << pVal[i]; > + } > + } > + else { // If the radix = 10, need to translate the value into a > + // string. > + if (isSingleWord()) buf << VAL; > + else { > + // FIXME: To be supported. > + } > + } > + return buf.str(); > + } > + > + /// getMaxValue - This function returns the largest value > + /// for an APInt of the specified bit-width and if isSign == true, > + /// it should be largest signed value, otherwise unsigned value. > + APInt APInt::getMaxValue(unsigned numBits, bool isSign) { > + APInt APIVal(numBits, 1); > + APIVal.set(); > + return isSign ? APIVal.clear(numBits) : APIVal; > + } > + > + /// getMinValue - This function returns the smallest value for > + /// an APInt of the given bit-width and if isSign == true, > + /// it should be smallest signed value, otherwise zero. > + APInt APInt::getMinValue(unsigned numBits, bool isSign) { > + APInt APIVal(0, numBits); > + return isSign ? APIVal : APIVal.set(numBits); > + } > + > + /// getAllOnesValue - This function returns an all-ones value for > + /// an APInt of the specified bit-width. > + APInt APInt::getAllOnesValue(unsigned numBits) { > + return getMaxValue(numBits, false); > + } > + > + /// getNullValue - This function creates an '0' value for an > + /// APInt of the specified bit-width. > + APInt APInt::getNullValue(unsigned numBits) { > + return getMinValue(numBits, true); > + } > + > + /// HiBits - This function returns the high "numBits" bits of > this APInt. > + APInt APInt::HiBits(unsigned numBits) const { > + return (*this) >> (bitsnum - numBits); > + } > + > + /// LoBits - This function returns the low "numBits" bits of this > APInt. > + APInt APInt::LoBits(unsigned numBits) const { > + return ((*this) << (bitsnum - numBits)) >> (bitsnum - numBits); > + } > + > + /// CountLeadingZeros - This function is a APInt version > corresponding to > + /// llvm/include/llvm/Support/MathExtras.h's function > + /// CountLeadingZeros_{32, 64}. It performs platform optimal form > of counting > + /// the number of zeros from the most significant bit to the > first one bit. > + /// @returns numWord() * 64 if the value is zero. > + unsigned APInt::CountLeadingZeros() const { > + if (isSingleWord()) > + return CountLeadingZeros_64(VAL); > + unsigned Count = 0; > + for (int i = numWords() - 1; i >= 0; --i) { > + unsigned tmp = CountLeadingZeros_64(pVal[i]); > + Count += tmp; > + if (tmp != 64) > + break; > + } > + return Count; > + } > + > + /// CountTrailingZero - This function is a APInt version > corresponding to > + /// llvm/include/llvm/Support/MathExtras.h's function > + /// CountTrailingZeros_{32, 64}. It performs platform optimal > form of counting > + /// the number of zeros from the least significant bit to the > first one bit. > + /// @returns numWord() * 64 if the value is zero. > + unsigned APInt::CountTrailingZeros() const { > + if (isSingleWord()) > + return CountTrailingZeros_64(~VAL & (VAL - 1)); > + APInt Tmp = ~(*this) & ((*this) - 1); > + return numWords() * 64 - Tmp.CountLeadingZeros(); > + } > + > + /// CountPopulation - This function is a APInt version > corresponding to > + /// llvm/include/llvm/Support/MathExtras.h's function > + /// CountPopulation_{32, 64}. It counts the number of set bits in > a value. > + /// @returns 0 if the value is zero. > + unsigned APInt::CountPopulation() const { > + if (isSingleWord()) > + return CountPopulation_64(VAL); > + unsigned Count = 0; > + for (unsigned i = 0; i < numWords(); ++i) > + Count += CountPopulation_64(pVal[i]); > + return Count; > + } > + > + > + /// ByteSwap - This function returns a byte-swapped > representation of the > + /// APInt argument, APIVal. > + APInt llvm::ByteSwap(const APInt& APIVal) { > + if (APIVal.bitsnum <= 32) > + return APInt(APIVal.bitsnum, ByteSwap_32(unsigned(APIVal.VAL))); > + else if (APIVal.bitsnum <= 64) > + return APInt(APIVal.bitsnum, ByteSwap_64(APIVal.VAL)); > + else > + return APIVal; > + } > + > + /// GreatestCommonDivisor - This function returns the greatest > common > + /// divisor of the two APInt values using Enclid's algorithm. > + APInt llvm::GreatestCommonDivisor(const APInt& API1, const APInt& > API2) { > + APInt A = API1, B = API2; > + while (!!B) { > + APInt T = B; > + B = A % B; > + A = T; > + } > + return A; > + } > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From zhousheng00 at gmail.com Tue Feb 6 00:00:03 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Tue, 6 Feb 2007 00:00:03 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702060600.l16603cr020875@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.1 -> 1.2 --- Log message: As Reid suggested, fixed some problems. --- Diffs of the changes: (+110 -182) APInt.h | 292 ++++++++++++++++++++++++---------------------------------------- 1 files changed, 110 insertions(+), 182 deletions(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.1 llvm/include/llvm/ADT/APInt.h:1.2 --- llvm/include/llvm/ADT/APInt.h:1.1 Mon Feb 5 11:29:16 2007 +++ llvm/include/llvm/ADT/APInt.h Mon Feb 5 23:59:47 2007 @@ -34,8 +34,10 @@ /// /// @brief Class for arbitrary precision integers. /// +/// Note: In this class, all bit/byte/word positions are zero-based. +/// class APInt { - /// Friend Functions of APInt Declared here. For detailed comments, + /// Friend Functions of APInt declared here. For detailed comments, /// see bottom of this file. friend bool isIntN(unsigned N, const APInt& APIVal); friend APInt ByteSwap(const APInt& APIVal); @@ -47,21 +49,21 @@ bool isSigned; ///< The sign flag for this APInt. /// This union is used to store the integer value. When the - /// integer bit-width <= 64, it is used as an uint64_t; - /// otherwise it uses an uint64_t array. + /// integer bit-width <= 64, it uses VAL; + /// otherwise it uses the pVal. union { uint64_t VAL; ///< Used to store the <= 64 bits integer value. uint64_t *pVal; ///< Used to store the >64 bits integer value. }; - /// This enum is just used to hold constant we needed for APInt. + /// This enum is just used to hold a constant we needed for APInt. enum { APINT_BITS_PER_WORD = sizeof(uint64_t) * 8 }; - /// @returns the number of words to hold the integer value of this APInt. /// Here one word's bitwidth equals to that of uint64_t. - /// @brief Get the number of the words. + /// @returns the number of words to hold the integer value of this APInt. + /// @brief Get the number of words. inline unsigned numWords() const { return bitsnum < 1 ? 0 : (bitsnum + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD; @@ -73,23 +75,19 @@ { return bitsnum <= APINT_BITS_PER_WORD; } /// @returns the word position for the specified bit position. - /// Note: the bitPosition and the return value are zero-based. static inline unsigned whichWord(unsigned bitPosition) { return bitPosition / APINT_BITS_PER_WORD; } /// @returns the byte position for the specified bit position. - /// Note: the bitPosition and the return value are zero-based. static inline unsigned whichByte(unsigned bitPosition); /// @returns the bit position in a word for the specified bit position /// in APInt. - /// Note: the bitPosition and the return value are zero-based. static inline unsigned whichBit(unsigned bitPosition) { return bitPosition % APINT_BITS_PER_WORD; } /// @returns a uint64_t type integer with just bit position at /// "whichBit(bitPosition)" setting, others zero. - /// Note: the bitPosition and the return value are zero-based. static inline uint64_t maskBit(unsigned bitPosition) { return (static_cast(1)) << whichBit(bitPosition); } @@ -102,223 +100,193 @@ } /// @returns the corresponding word for the specified bit position. - /// Note: the bitPosition is zero-based. - inline uint64_t& getWord(unsigned bitPosition); + inline uint64_t& getWord(unsigned bitPosition) + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } /// @returns the corresponding word for the specified bit position. /// This is a constant version. - /// Note: the bitPosition is zero-based. - inline uint64_t getWord(unsigned bitPosition) const; - - /// mul_1 - This function performs the multiplication operation on a - /// large integer (represented as a integer array) and a uint64_t integer. - /// @returns the carry of the multiplication. - static uint64_t mul_1(uint64_t dest[], uint64_t x[], - unsigned len, uint64_t y); - - /// mul - This function performs the multiplication operation on two large - /// integers (represented as integer arrays). - static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, - uint64_t y[], unsigned ylen); - - /// add_1 - This function performs the addition operation on a large integer - /// and a uint64_t integer. - /// @returns the carry of the addtion. - static uint64_t add_1(uint64_t dest[], uint64_t x[], - unsigned len, uint64_t y); - - /// add - This function performs the addtion operation on two large integers. - static uint64_t add(uint64_t dest[], uint64_t x[], - uint64_t y[], unsigned len); - - /// sub_1 - This function performs the subtraction operation on a large - /// integer and a uint64_t integer. - static uint64_t sub_1(uint64_t x[], unsigned len, uint64_t y); - - /// sub - This function performs the subtraction operation on two large - /// integers. - static uint64_t sub(uint64_t dest[], uint64_t x[], - uint64_t y[], unsigned len); - - /// unitDiv - This function divides uint64_t N by unsigned D. - /// @returns (remainder << 32) + quotient. - /// @assumes (N >> 32) < D. - static uint64_t unitDiv(uint64_t N, unsigned D); - - /// subMul - This function subtract x[len-1 : 0] * y from - /// dest[offset+len-1 : offset]. - /// @returns the most significant word of the product, minus borrow-out from - /// the subtraction. - static unsigned subMul(unsigned dest[], unsigned offset, - unsigned x[], unsigned len, unsigned y); - - /// div - This function divides the large integer zds[] by y[]. - /// The remainder ends up in zds[ny-1 : 0]. - /// The quotient ends up in zds[ny : nx]. - /// @assumes nx > ny and (int)y[ny-1] < 0. - static void div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny); - - /// lshift - This function shifts x[len-1 : 0] by shiftAmt, and store the - /// "len" least significant words of the result in - /// dest[d_offset+len-1 : d_offset]. - /// @returns the bits shifted out from the most significant digit. - static uint64_t lshift(uint64_t dest[], unsigned d_offset, - uint64_t x[], unsigned len, unsigned shiftAmt); + inline uint64_t getWord(unsigned bitPosition) const + { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } public: - /// Create a new APInt of numBits bit-width, and initalized as val. + /// @brief Create a new APInt of numBits bit-width, and initialized as val. APInt(uint64_t val = 0, unsigned numBits = APINT_BITS_PER_WORD, bool sign = false); - /// Create a new APInt of numBits bit-width, and initalized as bigVal[]. + /// @brief Create a new APInt of numBits bit-width, and initialized as + /// bigVal[]. APInt(unsigned numBits, uint64_t bigVal[], bool sign = false); - /// Create a new APInt by translating the string represented integer value. + /// @brief Create a new APInt by translating the string represented + /// integer value. APInt(std::string& Val, uint8_t radix = 10, bool sign = false); - /// Copy Constructor. + /// @brief Copy Constructor. APInt(const APInt& API); - /// Destructor. + /// @brief Destructor. ~APInt(); - /// @brief Copy assignment operator. Create a new object from the given - /// APInt one by initialization. + /// @brief Copy assignment operator. APInt& operator=(const APInt& RHS); - /// @brief Assignment operator. Assigns a common case integer value to - /// the APInt. + /// Assigns an integer value to the APInt. + /// @brief Assignment operator. APInt& operator=(uint64_t RHS); - /// @brief Postfix increment operator. Increments the APInt by one. + /// Increments the APInt by one. + /// @brief Postfix increment operator. const APInt operator++(int); - /// @brief Prefix increment operator. Increments the APInt by one. + /// Increments the APInt by one. + /// @brief Prefix increment operator. APInt& operator++(); - /// @brief Postfix decrement operator. Decrements the APInt by one. + /// Decrements the APInt by one. + /// @brief Postfix decrement operator. const APInt operator--(int); - /// @brief Prefix decrement operator. Decrements the APInt by one. + /// Decrements the APInt by one. + /// @brief Prefix decrement operator. APInt& operator--(); - /// @brief Bitwise AND assignment operator. Performs bitwise AND operation on - /// this APInt and the given APInt& RHS, assigns the result to this APInt. + /// Performs bitwise AND operation on this APInt and the given APInt& RHS, + /// assigns the result to this APInt. + /// @brief Bitwise AND assignment operator. APInt& operator&=(const APInt& RHS); - /// @brief Bitwise OR assignment operator. Performs bitwise OR operation on - /// this APInt and the given APInt& RHS, assigns the result to this APInt. + /// Performs bitwise OR operation on this APInt and the given APInt& RHS, + /// assigns the result to this APInt. + /// @brief Bitwise OR assignment operator. APInt& operator|=(const APInt& RHS); - /// @brief Bitwise XOR assignment operator. Performs bitwise XOR operation on - /// this APInt and the given APInt& RHS, assigns the result to this APInt. + /// Performs bitwise XOR operation on this APInt and the given APInt& RHS, + /// assigns the result to this APInt. + /// @brief Bitwise XOR assignment operator. APInt& operator^=(const APInt& RHS); - /// @brief Left-shift assignment operator. Left-shift the APInt by shiftAmt - /// and assigns the result to this APInt. + /// Left-shift the APInt by shiftAmt and assigns the result to this APInt. + /// @brief Left-shift assignment operator. APInt& operator<<=(unsigned shiftAmt); - /// @brief Right-shift assignment operator. Right-shift the APInt by shiftAmt - /// and assigns the result to this APInt. + /// Right-shift the APInt by shiftAmt and assigns the result to this APInt. + /// @brief Right-shift assignment operator. APInt& operator>>=(unsigned shiftAmt); - /// @brief Bitwise complement operator. Performs a bitwise complement - /// operation on this APInt. + /// Performs a bitwise complement operation on this APInt. + /// @brief Bitwise complement operator. APInt operator~() const; - /// @brief Multiplication assignment operator. Multiplies this APInt by the - /// given APInt& RHS and assigns the result to this APInt. + /// Multiplies this APInt by the given APInt& RHS and + /// assigns the result to this APInt. + /// @brief Multiplication assignment operator. APInt& operator*=(const APInt& RHS); - /// @brief Division assignment operator. Divides this APInt by the given APInt - /// &RHS and assigns the result to this APInt. + /// Divides this APInt by the given APInt &RHS and + /// assigns the result to this APInt. + /// @brief Division assignment operator. APInt& operator/=(const APInt& RHS); - /// @brief Addition assignment operator. Adds this APInt by the given APInt& - /// RHS and assigns the result to this APInt. + /// Adds this APInt by the given APInt& RHS and + /// assigns the result to this APInt. + /// @brief Addition assignment operator. APInt& operator+=(const APInt& RHS); - /// @brief Subtraction assignment operator. Subtracts this APInt by the given - /// APInt &RHS and assigns the result to this APInt. + /// Subtracts this APInt by the given APInt &RHS and + /// assigns the result to this APInt. + /// @brief Subtraction assignment operator. APInt& operator-=(const APInt& RHS); - /// @brief Remainder assignment operator. Yields the remainder from the - /// division of this APInt by the given APInt& RHS and assigns the remainder - /// to this APInt. + /// Yields the remainder from the division of this APInt by + /// the given APInt& RHS and assigns the remainder to this APInt. + /// @brief Remainder assignment operator. APInt& operator%=(const APInt& RHS); - /// @brief Bitwise AND operator. Performs bitwise AND operation on this APInt - /// and the given APInt& RHS. + /// Performs bitwise AND operation on this APInt and + /// the given APInt& RHS. + /// @brief Bitwise AND operator. APInt operator&(const APInt& RHS) const; - /// @brief Bitwise OR operator. Performs bitwise OR operation on this APInt - /// and the given APInt& RHS. + /// Performs bitwise OR operation on this APInt and the given APInt& RHS. + /// @brief Bitwise OR operator. APInt operator|(const APInt& RHS) const; - /// @brief Bitwise XOR operator. Performs bitwise XOR operation on this APInt - /// and the given APInt& RHS. + /// Performs bitwise XOR operation on this APInt and the given APInt& RHS. + /// @brief Bitwise XOR operator. APInt operator^(const APInt& RHS) const; - /// @brief Logical AND operator. Performs logical AND operation on this APInt - /// and the given APInt& RHS. + /// Performs logical AND operation on this APInt and the given APInt& RHS. + /// @brief Logical AND operator. bool operator&&(const APInt& RHS) const; - /// @brief Logical OR operator. Performs logical OR operation on this APInt - /// and the given APInt& RHS. + /// Performs logical OR operation on this APInt and the given APInt& RHS. + /// @brief Logical OR operator. bool operator||(const APInt& RHS) const; - /// @brief Logical negation operator. Performs logical negation operation on - /// this APInt. + /// Performs logical negation operation on this APInt. + /// @brief Logical negation operator. bool operator !() const; - /// @brief Multiplication operator. Multiplies this APInt by the given APInt& - /// RHS. + /// Multiplies this APInt by the given APInt& RHS. + /// @brief Multiplication operator. APInt operator*(const APInt& RHS) const; - /// @brief Division operator. Divides this APInt by the given APInt& RHS. + /// Divides this APInt by the given APInt& RHS. + /// @brief Division operator. APInt operator/(const APInt& RHS) const; - /// @brief Remainder operator. Yields the remainder from the division of this - /// APInt and the given APInt& RHS. + /// Yields the remainder from the division of + /// this APInt and the given APInt& RHS. + /// @brief Remainder operator. APInt operator%(const APInt& RHS) const; - /// @brief Addition operator. Adds this APInt by the given APInt& RHS. + /// Adds this APInt by the given APInt& RHS. + /// @brief Addition operator. APInt operator+(const APInt& RHS) const; - /// @brief Subtraction operator. Subtracts this APInt by the given APInt& RHS + /// Subtracts this APInt by the given APInt& RHS + /// @brief Subtraction operator. APInt operator-(const APInt& RHS) const; - /// @brief Left-shift operator. Left-shift the APInt by shiftAmt. + /// Left-shift the APInt by shiftAmt. + /// @brief Left-shift operator. APInt operator<<(unsigned shiftAmt) const; - /// @brief Right-shift operator. Right-shift the APInt by shiftAmt. + /// Right-shift the APInt by shiftAmt. + /// @brief Right-shift operator. APInt operator>>(unsigned shiftAmt) const; /// @brief Array-indexing support. bool operator[](unsigned bitPosition) const; - /// @brief Equality operator. Compare this APInt with the given APInt& RHS + /// Compare this APInt with the given APInt& RHS /// for the validity of the equality relationship. + /// @brief Equality operator. bool operator==(const APInt& RHS) const; - /// @brief Inequality operator. Compare this APInt with the given APInt& RHS + /// Compare this APInt with the given APInt& RHS /// for the validity of the inequality relationship. + /// @brief Inequality operator. bool operator!=(const APInt& RHS) const; - /// @brief Less-than operator. Compare this APInt with the given APInt& RHS - /// for the validity of the less-than relationship. + /// Compare this APInt with the given APInt& RHS for + /// the validity of the less-than relationship. + /// @brief Less-than operator. bool operator <(const APInt& RHS) const; - /// @brief Less-than-or-equal operator. Compare this APInt with the given - /// APInt& RHS for the validity of the less-than-or-equal relationship. + /// Compare this APInt with the given APInt& RHS for the validity + /// of the less-than-or-equal relationship. + /// @brief Less-than-or-equal operator. bool operator<=(const APInt& RHS) const; - /// @brief Greater-than operator. Compare this APInt with the given APInt& RHS - /// for the validity of the greater-than relationship. + /// Compare this APInt with the given APInt& RHS for the validity + /// of the greater-than relationship. + /// @brief Greater-than operator. bool operator> (const APInt& RHS) const; - /// @brief Greater-than-or-equal operator. Compare this APInt with the given - /// APInt& RHS for the validity of the greater-than-or-equal relationship. + /// @brief Greater-than-or-equal operator. + /// Compare this APInt with the given APInt& RHS for the validity + /// of the greater-than-or-equal relationship. bool operator>=(const APInt& RHS) const; /// @returns a uint64_t value from this APInt. If this APInt contains a single @@ -350,7 +318,7 @@ /// @brief Set every bit to 1. APInt& set(); - /// Set the given bit to 1 whose poition is given as "bitPosition". + /// Set the given bit to 1 whose position is given as "bitPosition". /// @brief Set a given bit to 1. APInt& set(unsigned bitPosition); @@ -376,15 +344,19 @@ /// @returns a character interpretation of the APInt. std::string to_string(uint8_t radix = 10) const; + /// Get an APInt with the same bitsnum as this APInt, just zero mask + /// the low bits and right shift to the least significant bit. /// @returns the high "numBits" bits of this APInt. APInt HiBits(unsigned numBits) const; + /// Get an APInt with the same bitsnum as this APInt, just zero mask + /// the high bits. /// @returns the low "numBits" bits of this APInt. APInt LoBits(unsigned numBits) const; /// @returns true if the argument APInt value is a power of two > 0. inline const bool isPowerOf2() const { - return *this && !(*this & (*this - 1)); + return (!!*this) && !(*this & (*this - 1)); } /// @returns the number of zeros from the most significant bit to the first @@ -440,50 +412,6 @@ /// using Euclid's algorithm. APInt GreatestCommonDivisor(const APInt& API1, const APInt& API2); -/// @returns the bit equivalent double. -/// If the APInt numBits > 64, truncated first and then convert to double. -inline double APIntToDouble(const APInt& APIVal) { - uint64_t value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; - union { - uint64_t I; - double D; - } T; - T.I = value; - return T.D; -} - -/// @returns the bit equivalent float. -/// If the APInt numBits > 32, truncated first and then convert to double. -inline float APIntToFloat(const APInt& APIVal) { - unsigned value = APIVal.isSingleWord() ? APIVal.VAL : APIVal.pVal[0]; - union { - unsigned I; - float F; - } T; - T.I = value; - return T.F; -} - -/// @returns the bit equivalent APInt. -inline APInt DoubleToAPInt(double Double) { - union { - uint64_t L; - double D; - } T; - T.D = Double; - return APInt(T.L); -} - -/// @returns the bit equivalent APInt. -inline APInt FloatToAPInt(float Float) { - union { - uint32_t I; - float F; - } T; - T.F = Float; - return APInt(uint64_t(T.I)); -} - } // End of llvm namespace #endif From zhousheng00 at gmail.com Tue Feb 6 00:05:09 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Tue, 6 Feb 2007 00:05:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702060605.l166592s020991@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.2 -> 1.3 --- Log message: As Reid suggested, fixed some problems. --- Diffs of the changes: (+143 -150) APInt.cpp | 293 ++++++++++++++++++++++++++++++-------------------------------- 1 files changed, 143 insertions(+), 150 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.2 llvm/lib/Support/APInt.cpp:1.3 --- llvm/lib/Support/APInt.cpp:1.2 Mon Feb 5 23:38:37 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 6 00:04:53 2007 @@ -24,147 +24,10 @@ #include using namespace llvm; -APInt::APInt(uint64_t val, unsigned numBits, bool sign) - : bitsnum(numBits), isSigned(sign) { - assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); - assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); - if (isSingleWord()) - VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); - else { - // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && - "APInt memory allocation fails!"); - bzero(pVal, numWords() * 8); - pVal[0] = val; - } -} - -APInt::APInt(unsigned numBits, uint64_t bigVal[], bool sign) - : bitsnum(numBits), isSigned(sign) { - assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); - assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); - assert(bigVal && "Null pointer detected!"); - if (isSingleWord()) - VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); - else { - // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && - "APInt memory allocation fails!"); - // Calculate the actual length of bigVal[]. - unsigned n = sizeof(*bigVal) / sizeof(bigVal[0]); - unsigned maxN = std::max(n, numWords()); - unsigned minN = std::min(n, numWords()); - memcpy(pVal, bigVal, (minN - 1) * 8); - pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - bitsnum % 64)); - if (maxN == numWords()) - bzero(pVal+n, (numWords() - n) * 8); - } -} - -APInt::APInt(std::string& Val, uint8_t radix, bool sign) - : isSigned(sign) { - assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && - "Radix should be 2, 8, 10, or 16!"); - assert(!Val.empty() && "String empty?"); - unsigned slen = Val.size(); - unsigned size = 0; - // If the radix is a power of 2, read the input - // from most significant to least significant. - if ((radix & (radix - 1)) == 0) { - unsigned nextBitPos = 0, bits_per_digit = radix / 8 + 2; - uint64_t resDigit = 0; - bitsnum = slen * bits_per_digit; - if (numWords() > 1) - assert((pVal = new uint64_t[numWords()]) && - "APInt memory allocation fails!"); - for (int i = slen - 1; i >= 0; --i) { - uint64_t digit = Val[i] - 48; // '0' == 48. - resDigit |= digit << nextBitPos; - nextBitPos += bits_per_digit; - if (nextBitPos >= 64) { - if (isSingleWord()) { - VAL = resDigit; - break; - } - pVal[size++] = resDigit; - nextBitPos -= 64; - resDigit = digit >> (bits_per_digit - nextBitPos); - } - } - if (!isSingleWord() && size <= numWords()) - pVal[size] = resDigit; - } else { // General case. The radix is not a power of 2. - // For 10-radix, the max value of 64-bit integer is 18446744073709551615, - // and its digits number is 14. - const unsigned chars_per_word = 20; - if (slen < chars_per_word || - (Val <= "18446744073709551615" && - slen == chars_per_word)) { // In case Val <= 2^64 - 1 - bitsnum = 64; - VAL = strtoull(Val.c_str(), 0, 10); - } else { // In case Val > 2^64 - 1 - bitsnum = (slen / chars_per_word + 1) * 64; - assert((pVal = new uint64_t[numWords()]) && - "APInt memory allocation fails!"); - bzero(pVal, numWords() * 8); - unsigned str_pos = 0; - while (str_pos < slen) { - unsigned chunk = slen - str_pos; - if (chunk > chars_per_word - 1) - chunk = chars_per_word - 1; - uint64_t resDigit = Val[str_pos++] - 48; // 48 == '0'. - uint64_t big_base = radix; - while (--chunk > 0) { - resDigit = resDigit * radix + Val[str_pos++] - 48; - big_base *= radix; - } - - uint64_t carry; - if (!size) - carry = resDigit; - else { - carry = mul_1(pVal, pVal, size, big_base); - carry += add_1(pVal, pVal, size, resDigit); - } - - if (carry) pVal[size++] = carry; - } - } - } -} - -APInt::APInt(const APInt& APIVal) - : bitsnum(APIVal.bitsnum), isSigned(APIVal.isSigned) { - if (isSingleWord()) VAL = APIVal.VAL; - else { - // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && - "APInt memory allocation fails!"); - memcpy(pVal, APIVal.pVal, numWords() * 8); - } -} - -APInt::~APInt() { - if (!isSingleWord() && pVal) delete[] pVal; -} - -/// whichByte - This function returns the word position -/// for the specified bit position. -inline unsigned APInt::whichByte(unsigned bitPosition) -{ return (bitPosition % APINT_BITS_PER_WORD) / 8; } - -/// getWord - returns the corresponding word for the specified bit position. -inline uint64_t& APInt::getWord(unsigned bitPosition) -{ return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } - -/// getWord - returns the corresponding word for the specified bit position. -/// This is a constant version. -inline uint64_t APInt::getWord(unsigned bitPosition) const -{ return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } - -/// mul_1 - This function multiplies the integer array x[] by a integer y and -/// returns the carry. -uint64_t APInt::mul_1(uint64_t dest[], uint64_t x[], +/// mul_1 - This function performs the multiplication operation on a +/// large integer (represented as an integer array) and a uint64_t integer. +/// @returns the carry of the multiplication. +static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) { // Split y into high 32-bit part and low 32-bit part. uint64_t ly = y & 0xffffffffULL, hy = y >> 32; @@ -197,7 +60,7 @@ /// mul - This function multiplies integer array x[] by integer array y[] and /// stores the result into integer array dest[]. /// Note the array dest[]'s size should no less than xlen + ylen. -void APInt::mul(uint64_t dest[], uint64_t x[], unsigned xlen, +static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[], unsigned ylen) { dest[xlen] = mul_1(dest, x, xlen, y[0]); @@ -230,7 +93,8 @@ /// add_1 - This function adds the integer array x[] by integer y and /// returns the carry. -uint64_t APInt::add_1(uint64_t dest[], uint64_t x[], +/// @returns the carry of the addition. +static uint64_t add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) { uint64_t carry = y; @@ -243,7 +107,7 @@ /// add - This function adds the integer array x[] by integer array /// y[] and returns the carry. -uint64_t APInt::add(uint64_t dest[], uint64_t x[], +static uint64_t add(uint64_t dest[], uint64_t x[], uint64_t y[], unsigned len) { unsigned carry = 0; @@ -257,7 +121,7 @@ /// sub_1 - This function subtracts the integer array x[] by /// integer y and returns the borrow-out carry. -uint64_t APInt::sub_1(uint64_t x[], unsigned len, uint64_t y) { +static uint64_t sub_1(uint64_t x[], unsigned len, uint64_t y) { uint64_t cy = y; for (unsigned i = 0; i < len; ++i) { @@ -276,7 +140,7 @@ /// sub - This function subtracts the integer array x[] by /// integer array y[], and returns the borrow-out carry. -uint64_t APInt::sub(uint64_t dest[], uint64_t x[], +static uint64_t sub(uint64_t dest[], uint64_t x[], uint64_t y[], unsigned len) { // Carry indicator. uint64_t cy = 0; @@ -296,7 +160,7 @@ /// UnitDiv - This function divides N by D, /// and returns (remainder << 32) | quotient. /// Assumes (N >> 32) < D. -uint64_t APInt::unitDiv(uint64_t N, unsigned D) { +static uint64_t unitDiv(uint64_t N, unsigned D) { uint64_t q, r; // q: quotient, r: remainder. uint64_t a1 = N >> 32; // a1: high 32-bit part of N. uint64_t a0 = N & 0xffffffffL; // a0: low 32-bit part of N @@ -320,7 +184,7 @@ /// subMul - This function substracts x[len-1:0] * y from /// dest[offset+len-1:offset], and returns the most significant /// word of the product, minus the borrow-out from the subtraction. -unsigned APInt::subMul(unsigned dest[], unsigned offset, +static unsigned subMul(unsigned dest[], unsigned offset, unsigned x[], unsigned len, unsigned y) { uint64_t yl = (uint64_t) y & 0xffffffffL; unsigned carry = 0; @@ -348,7 +212,7 @@ /// Our nx == Knuth's m+n. /// Could be re-implemented using gmp's mpn_divrem: /// zds[nx] = mpn_divrem (&zds[ny], 0, zds, nx, y, ny). -void APInt::div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny) { +static void div(unsigned zds[], unsigned nx, unsigned y[], unsigned ny) { unsigned j = nx; do { // loop over digits of quotient // Knuth's j == our nx-j. @@ -386,7 +250,7 @@ /// store the len least significant words of the result in /// dest[d_offset:d_offset+len-1]. It returns the bits shifted out from /// the most significant digit. -uint64_t APInt::lshift(uint64_t dest[], unsigned d_offset, +static uint64_t lshift(uint64_t dest[], unsigned d_offset, uint64_t x[], unsigned len, unsigned shiftAmt) { unsigned count = 64 - shiftAmt; int i = len - 1; @@ -401,6 +265,135 @@ return retVal; } +APInt::APInt(uint64_t val, unsigned numBits, bool sign) + : bitsnum(numBits), isSigned(sign) { + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + if (isSingleWord()) + VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + bzero(pVal, numWords() * 8); + pVal[0] = val; + } +} + +APInt::APInt(unsigned numBits, uint64_t bigVal[], bool sign) + : bitsnum(numBits), isSigned(sign) { + assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + assert(bigVal && "Null pointer detected!"); + if (isSingleWord()) + VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + // Calculate the actual length of bigVal[]. + unsigned n = sizeof(*bigVal) / sizeof(bigVal[0]); + unsigned maxN = std::max(n, numWords()); + unsigned minN = std::min(n, numWords()); + memcpy(pVal, bigVal, (minN - 1) * 8); + pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - bitsnum % 64)); + if (maxN == numWords()) + bzero(pVal+n, (numWords() - n) * 8); + } +} + +APInt::APInt(std::string& Val, uint8_t radix, bool sign) + : isSigned(sign) { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(!Val.empty() && "String empty?"); + unsigned slen = Val.size(); + unsigned size = 0; + // If the radix is a power of 2, read the input + // from most significant to least significant. + if ((radix & (radix - 1)) == 0) { + unsigned nextBitPos = 0, bits_per_digit = radix / 8 + 2; + uint64_t resDigit = 0; + bitsnum = slen * bits_per_digit; + if (numWords() > 1) + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + for (int i = slen - 1; i >= 0; --i) { + uint64_t digit = Val[i] - 48; // '0' == 48. + resDigit |= digit << nextBitPos; + nextBitPos += bits_per_digit; + if (nextBitPos >= 64) { + if (isSingleWord()) { + VAL = resDigit; + break; + } + pVal[size++] = resDigit; + nextBitPos -= 64; + resDigit = digit >> (bits_per_digit - nextBitPos); + } + } + if (!isSingleWord() && size <= numWords()) + pVal[size] = resDigit; + } else { // General case. The radix is not a power of 2. + // For 10-radix, the max value of 64-bit integer is 18446744073709551615, + // and its digits number is 14. + const unsigned chars_per_word = 20; + if (slen < chars_per_word || + (Val <= "18446744073709551615" && + slen == chars_per_word)) { // In case Val <= 2^64 - 1 + bitsnum = 64; + VAL = strtoull(Val.c_str(), 0, 10); + } else { // In case Val > 2^64 - 1 + bitsnum = (slen / chars_per_word + 1) * 64; + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + bzero(pVal, numWords() * 8); + unsigned str_pos = 0; + while (str_pos < slen) { + unsigned chunk = slen - str_pos; + if (chunk > chars_per_word - 1) + chunk = chars_per_word - 1; + uint64_t resDigit = Val[str_pos++] - 48; // 48 == '0'. + uint64_t big_base = radix; + while (--chunk > 0) { + resDigit = resDigit * radix + Val[str_pos++] - 48; + big_base *= radix; + } + + uint64_t carry; + if (!size) + carry = resDigit; + else { + carry = mul_1(pVal, pVal, size, big_base); + carry += add_1(pVal, pVal, size, resDigit); + } + + if (carry) pVal[size++] = carry; + } + } + } +} + +APInt::APInt(const APInt& APIVal) + : bitsnum(APIVal.bitsnum), isSigned(APIVal.isSigned) { + if (isSingleWord()) VAL = APIVal.VAL; + else { + // Memory allocation and check if successful. + assert((pVal = new uint64_t[numWords()]) && + "APInt memory allocation fails!"); + memcpy(pVal, APIVal.pVal, numWords() * 8); + } +} + +APInt::~APInt() { + if (!isSingleWord() && pVal) delete[] pVal; +} + +/// whichByte - This function returns the word position +/// for the specified bit position. +inline unsigned APInt::whichByte(unsigned bitPosition) +{ return (bitPosition % APINT_BITS_PER_WORD) / 8; } + /// @brief Copy assignment operator. Create a new object from the given /// APInt one by initialization. APInt& APInt::operator=(const APInt& RHS) { From sabre at nondot.org Tue Feb 6 00:07:50 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 00:07:50 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/CBackend/2007-02-05-memset.ll Message-ID: <200702060607.l1667oVw021116@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/CBackend: 2007-02-05-memset.ll added (r1.1) --- Log message: testcase for pr1181: http://llvm.org/PR1181 --- Diffs of the changes: (+14 -0) 2007-02-05-memset.ll | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/test/CodeGen/CBackend/2007-02-05-memset.ll diff -c /dev/null llvm/test/CodeGen/CBackend/2007-02-05-memset.ll:1.1 *** /dev/null Tue Feb 6 00:07:44 2007 --- llvm/test/CodeGen/CBackend/2007-02-05-memset.ll Tue Feb 6 00:07:34 2007 *************** *** 0 **** --- 1,14 ---- + ; RUN: llvm-as < %s | llc -march=c + ; PR1181 + target datalayout = "e-p:64:64" + target triple = "x86_64-apple-darwin8" + + implementation ; Functions: + + declare void @llvm.memset.i64(i8*, i8, i64, i32) + + define fastcc void @InitUser_data_unregistered() { + entry: + tail call void @llvm.memset.i64( i8* null, i8 0, i64 65496, i32 1 ) + ret void + } From sabre at nondot.org Tue Feb 6 00:08:07 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 00:08:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp Message-ID: <200702060608.l16687ex021143@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: IntrinsicLowering.cpp updated: 1.64 -> 1.65 --- Log message: Fix PR1181: http://llvm.org/PR1181 and CodeGen/CBackend/2007-02-05-memset.ll --- Diffs of the changes: (+16 -6) IntrinsicLowering.cpp | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/IntrinsicLowering.cpp diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.64 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.65 --- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.64 Fri Feb 2 08:09:34 2007 +++ llvm/lib/CodeGen/IntrinsicLowering.cpp Tue Feb 6 00:07:51 2007 @@ -394,17 +394,27 @@ } case Intrinsic::memset_i32: { static Constant *MemsetFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new ZExtInst(Size, TD.getIntPtrType())); + Value *Size = cast(CI->op_end()-1); + const Type *IntPtr = TD.getIntPtrType(); + if (Size->getType()->getPrimitiveSizeInBits() < + IntPtr->getPrimitiveSizeInBits()) + Size = new ZExtInst(Size, IntPtr, "", CI); + else if (Size->getType()->getPrimitiveSizeInBits() > + IntPtr->getPrimitiveSizeInBits()) + Size = new TruncInst(Size, IntPtr, "", CI); ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1, (*(CI->op_begin()+1))->getType(), MemsetFCache); } case Intrinsic::memset_i64: { static Constant *MemsetFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new TruncInst(Size, TD.getIntPtrType())); + Value *Size = cast(CI->op_end()-1); + const Type *IntPtr = TD.getIntPtrType(); + if (Size->getType()->getPrimitiveSizeInBits() < + IntPtr->getPrimitiveSizeInBits()) + Size = new ZExtInst(Size, IntPtr, "", CI); + else if (Size->getType()->getPrimitiveSizeInBits() > + IntPtr->getPrimitiveSizeInBits()) + Size = new TruncInst(Size, IntPtr, "", CI); ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1, (*(CI->op_begin()+1))->getType(), MemsetFCache); break; From evan.cheng at apple.com Tue Feb 6 00:13:45 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 6 Feb 2007 00:13:45 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702060613.l166DjML021279@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.57 -> 1.58 --- Log message: foldMemoryOperand() cannot fold tMOVrr sp into load / store in thumb mode. tLDRspi / tSTRspi cannot target / store high registers. --- Diffs of the changes: (+19 -13) ARMRegisterInfo.cpp | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.58 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 Mon Feb 5 18:23:31 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 6 00:13:29 2007 @@ -185,6 +185,19 @@ abort(); } +/// isLowRegister - Returns true if the register is low register r0-r7. +/// +static bool isLowRegister(unsigned Reg) { + using namespace ARM; + switch (Reg) { + case R0: case R1: case R2: case R3: + case R4: case R5: case R6: case R7: + return true; + default: + return false; + } +} + MachineInstr *ARMRegisterInfo::foldMemoryOperand(MachineInstr *MI, unsigned OpNum, int FI) const { unsigned Opc = MI->getOpcode(); @@ -206,10 +219,16 @@ case ARM::tMOVrr: { if (OpNum == 0) { // move -> store unsigned SrcReg = MI->getOperand(1).getReg(); + if (!isLowRegister(SrcReg)) + // tSTRspi cannot take a high register operand. + break; NewMI = BuildMI(TII.get(ARM::tSTRspi)).addReg(SrcReg).addFrameIndex(FI) .addImm(0); } else { // move -> load unsigned DstReg = MI->getOperand(0).getReg(); + if (!isLowRegister(DstReg)) + // tLDRspi cannot target a high register operand. + break; NewMI = BuildMI(TII.get(ARM::tLDRspi), DstReg).addFrameIndex(FI) .addImm(0); } @@ -316,19 +335,6 @@ } } -/// isLowRegister - Returns true if the register is low register r0-r7. -/// -static bool isLowRegister(unsigned Reg) { - using namespace ARM; - switch (Reg) { - case R0: case R1: case R2: case R3: - case R4: case R5: case R6: case R7: - return true; - default: - return false; - } -} - /// calcNumMI - Returns the number of instructions required to materialize /// the specific add / sub r, c instruction. static unsigned calcNumMI(int Opc, int ExtraOpc, unsigned Bytes, From evan.cheng at apple.com Tue Feb 6 01:18:43 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 6 Feb 2007 01:18:43 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/ARM/dyn-stackalloc.ll Message-ID: <200702060718.l167IhDx022384@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/ARM: dyn-stackalloc.ll added (r1.1) --- Log message: Add a DYNAMIC_STACKALLOC test case. --- Diffs of the changes: (+30 -0) dyn-stackalloc.ll | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+) Index: llvm/test/CodeGen/ARM/dyn-stackalloc.ll diff -c /dev/null llvm/test/CodeGen/ARM/dyn-stackalloc.ll:1.1 *** /dev/null Tue Feb 6 01:18:37 2007 --- llvm/test/CodeGen/ARM/dyn-stackalloc.ll Tue Feb 6 01:18:27 2007 *************** *** 0 **** --- 1,30 ---- + ; RUN: llvm-as < %s | llc -march=arm && + ; RUN: llvm-as < %s | llc -march=arm -enable-thumb && + ; RUN: llvm-as < %s | llc -march=arm -enable-thumb | not grep "ldr sp" + + %struct.state = type { i32, %struct.info*, float**, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, i8* } + %struct.info = type { i32, i32, i32, i32, i32, i32, i32, i8* } + + define void @f1(%struct.state* %v) { + %tmp6 = load i32* null + %tmp8 = alloca float, i32 %tmp6 + store i32 1, i32* null + br i1 false, label %bb123.preheader, label %return + + bb123.preheader: + br i1 false, label %bb43, label %return + + bb43: + call fastcc void @f2( float* %tmp8, float* null, i32 0 ) + %tmp70 = load i32* null + %tmp85 = getelementptr float* %tmp8, i32 0 + call fastcc void @f3( float* null, float* null, float* %tmp85, i32 %tmp70 ) + ret void + + return: + ret void + } + + declare fastcc void @f2(float*, float*, i32) + + declare fastcc void @f3(float*, float*, float*, i32) From evan.cheng at apple.com Tue Feb 6 03:11:36 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 6 Feb 2007 03:11:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200702060911.l169Ba5c000583@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.105 -> 1.106 --- Log message: Select add FI, c correctly. --- Diffs of the changes: (+6 -1) ARMISelDAGToDAG.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.105 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.106 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.105 Mon Feb 5 18:22:06 2007 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Feb 6 03:11:20 2007 @@ -454,7 +454,8 @@ return false; RegisterSDNode *LHSR = dyn_cast(N.getOperand(0)); - if (LHSR && LHSR->getReg() == ARM::SP) { + if (N.getOperand(0).getOpcode() == ISD::FrameIndex || + (LHSR && LHSR->getReg() == ARM::SP)) { // If the RHS is + imm8 * scale, fold into addr mode. if (ConstantSDNode *RHS = dyn_cast(N.getOperand(1))) { int RHSC = (int)RHS->getValue(); @@ -462,6 +463,10 @@ RHSC >>= 2; if (RHSC >= 0 && RHSC < 256) { Base = N.getOperand(0); + if (Base.getOpcode() == ISD::FrameIndex) { + int FI = cast(Base)->getIndex(); + Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); + } OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); return true; } From baldrick at free.fr Tue Feb 6 03:18:24 2007 From: baldrick at free.fr (Duncan Sands) Date: Tue, 6 Feb 2007 10:18:24 +0100 Subject: [llvm-commits] llvm-gcc4: nested function support (w/o trampolines) In-Reply-To: <200702052217.14334.baldrick@free.fr> References: <200702052217.14334.baldrick@free.fr> Message-ID: <200702061018.25429.baldrick@free.fr> A better testcase. This doesn't mean it's good, just better :) The gcc testsuite contains more comprehensive tests. I thought of importing some of them into the LLVM testsuite, but I've decided to wait until there is some kind of consensus as to what should be done about the gcc testsuite in general - import the relevant bits into LLVM? Turn off the irrelevant bits in gcc? Ciao, Duncan. -------------- next part -------------- A non-text attachment was scrubbed... Name: testcase.diff Type: text/x-diff Size: 918 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/8c27b7a3/attachment.bin From lauro.venancio at gmail.com Tue Feb 6 09:00:09 2007 From: lauro.venancio at gmail.com (Lauro Ramos Venancio) Date: Tue, 6 Feb 2007 09:00:09 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200702061500.l16F09nj014048@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.8 -> 1.9 --- Log message: Fix build error. UniqueVector.h:66: error: ???assert??? was not declared in this scope --- Diffs of the changes: (+1 -0) UniqueVector.h | 1 + 1 files changed, 1 insertion(+) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.8 llvm/include/llvm/ADT/UniqueVector.h:1.9 --- llvm/include/llvm/ADT/UniqueVector.h:1.8 Mon Feb 5 17:24:48 2007 +++ llvm/include/llvm/ADT/UniqueVector.h Tue Feb 6 08:59:28 2007 @@ -10,6 +10,7 @@ #ifndef LLVM_ADT_UNIQUEVECTOR_H #define LLVM_ADT_UNIQUEVECTOR_H +#include #include #include From lauro.venancio at gmail.com Tue Feb 6 10:51:29 2007 From: lauro.venancio at gmail.com (Lauro Ramos Venancio) Date: Tue, 6 Feb 2007 13:51:29 -0300 Subject: [llvm-commits] [patch] Intruction Constraint DestReg!=SrcReg (for review) In-Reply-To: <921821FF-A916-45EA-9ECD-F1120DF20EFD@apple.com> References: <9c10c9f0701251354h301eb289ia694c8c13ab8f8ff@mail.gmail.com> <361E3BFE-3731-4265-80BC-AF188AD64221@apple.com> <9c10c9f0701260609k187731bbk43861f093f7a0a5d@mail.gmail.com> <9CDB5C80-39C7-43E8-82E3-FEA6DF0E81A3@apple.com> <9c10c9f0701261307h62e7c5edu70edcab0d83e36a6@mail.gmail.com> <921821FF-A916-45EA-9ECD-F1120DF20EFD@apple.com> Message-ID: <9c10c9f0702060851l390774c8r41c1d0aaee4ab022@mail.gmail.com> READ_LATENCY patch for review. Sample of use: class RegConstraint { string Constraints = C; } // AI_orr - Defines a (op r, r) pattern. class AI_orr : AI<(ops GPR:$dst, GPR:$a, GPR:$b), !strconcat(opc, " $dst, $a, $b"), [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>, RegConstraint<"$a lat 2">; Lauro 2007/1/26, Evan Cheng : > > On Jan 26, 2007, at 1:07 PM, Lauro Ramos Venancio wrote: > > >> The facility does that have to be that general. There are 4 cycles > >> between every two instructions. See LiveIntervalAnalysis: > >> > >> struct InstrSlots { > >> enum { > >> LOAD = 0, > >> USE = 1, > >> DEF = 2, > >> STORE = 3, > >> NUM = 4 > >> }; > >> }; > >> > >> We can restrict the constraint range to 1 - 3. This ensures the last > >> use is always the kill while retaining its flexibility. > >> > >> Evan > > > > I will try to implement this. Do you have any suggestion for > > constraint name and syntax? > > I don't have any great ideas. Perhaps READ_LATENCY for constraint and > something like > > $src +lat 2 > > for syntax? > > Feel free to choose something else if you have better ideas. > > Thanks, > > Evan > > > > > Lauro > > -------------- next part -------------- A non-text attachment was scrubbed... Name: read_latency.patch Type: text/x-patch Size: 11577 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/0682d209/attachment.bin From rspencer at reidspencer.com Tue Feb 6 11:03:02 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 06 Feb 2007 09:03:02 -0800 Subject: [llvm-commits] llvm-gcc4: nested function support (w/o trampolines) In-Reply-To: <200702061018.25429.baldrick@free.fr> References: <200702052217.14334.baldrick@free.fr> <200702061018.25429.baldrick@free.fr> Message-ID: <1170781382.27507.5.camel@bashful.x10sys.com> Hi Duncan, On Tue, 2007-02-06 at 10:18 +0100, Duncan Sands wrote: > A better testcase. This doesn't mean it's good, just better :) > The gcc testsuite contains more comprehensive tests. I thought > of importing some of them into the LLVM testsuite, but I've decided > to wait until there is some kind of consensus as to what should be > done about the gcc testsuite in general - import the relevant bits > into LLVM? Turn off the irrelevant bits in gcc? We discussed this a bit on IRC as Anton reported 10 or so failures in the gcc.c-torture/compile test suite. llvm-gcc should be able to pass the test suite, of course. However, we don't want to replicate the entire gcc test suite in LLVM. What we decided is that if the failure/assertion/crash occurs in LLVM code while llvm-gcc is running then we should reduce that test case to the problem and add it in the appropriate llvm/test sub-directory. In some cases that will be the C code in CFrontend, in others we can reduce to llvm assembly. The point is, we only want to add regressions from regular gcc and only those that are LLVM's fault. If the failure occurs in llvm-gcc code then we shouldn't add it to the llvm test suite. > > Ciao, > > Duncan. > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From jlaskey at apple.com Tue Feb 6 12:03:17 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:03:17 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l IntrinsicEmitter.cpp Message-ID: <200702061803.l16I3Hcd026785@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.l updated: 1.33 -> 1.34 IntrinsicEmitter.cpp updated: 1.22 -> 1.23 --- Log message: Support var arg intrinsics. --- Diffs of the changes: (+6 -1) FileLexer.l | 2 +- IntrinsicEmitter.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/utils/TableGen/FileLexer.l diff -u llvm/utils/TableGen/FileLexer.l:1.33 llvm/utils/TableGen/FileLexer.l:1.34 --- llvm/utils/TableGen/FileLexer.l:1.33 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/FileLexer.l Tue Feb 6 12:02:54 2007 @@ -176,7 +176,7 @@ Comment \/\/.* -Identifier [a-zA-Z_][0-9a-zA-Z_]* +Identifier [a-zA-Z_][0-9a-zA-Z_]*|\.\.\. Integer [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+ CodeFragment \[\{([^}]+|\}[^\]])*\}\] StringVal \"[^"]*\" Index: llvm/utils/TableGen/IntrinsicEmitter.cpp diff -u llvm/utils/TableGen/IntrinsicEmitter.cpp:1.22 llvm/utils/TableGen/IntrinsicEmitter.cpp:1.23 --- llvm/utils/TableGen/IntrinsicEmitter.cpp:1.22 Fri Jan 12 01:05:14 2007 +++ llvm/utils/TableGen/IntrinsicEmitter.cpp Tue Feb 6 12:02:54 2007 @@ -109,6 +109,11 @@ } static void EmitTypeVerify(std::ostream &OS, Record *ArgType) { + if (ArgType->getValueAsString("TypeVal") == "...") { + OS << "-2, "; + return; + } + OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", "; // If this is an integer type, check the width is correct. if (ArgType->isSubClassOf("LLVMIntegerType")) From jlaskey at apple.com Tue Feb 6 12:03:17 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:03:17 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Intrinsics.td Message-ID: <200702061803.l16I3HGJ026783@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Intrinsics.td updated: 1.41 -> 1.42 --- Log message: Support var arg intrinsics. --- Diffs of the changes: (+7 -0) Intrinsics.td | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/include/llvm/Intrinsics.td diff -u llvm/include/llvm/Intrinsics.td:1.41 llvm/include/llvm/Intrinsics.td:1.42 --- llvm/include/llvm/Intrinsics.td:1.41 Wed Jan 17 17:33:20 2007 +++ llvm/include/llvm/Intrinsics.td Tue Feb 6 12:02:54 2007 @@ -88,6 +88,8 @@ def llvm_v4f32_ty : LLVMPackedType; // 4 x float def llvm_v2f64_ty : LLVMPackedType;// 2 x double +def ... : LLVMType; // vararg + //===----------------------------------------------------------------------===// // Intrinsic Definitions. //===----------------------------------------------------------------------===// @@ -217,6 +219,11 @@ def int_dbg_declare : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_descriptor_ty]>; +//===------------------ Exception Handling Intrinsics----------------------===// +// +def int_eh_exception : Intrinsic<[llvm_ptr_ty]>; +def int_eh_handlers : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, ...]>; + //===----------------------------------------------------------------------===// // Target-specific intrinsics //===----------------------------------------------------------------------===// From jlaskey at apple.com Tue Feb 6 12:03:17 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:03:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Verifier.cpp Message-ID: <200702061803.l16I3Hid026784@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Verifier.cpp updated: 1.190 -> 1.191 --- Log message: Support var arg intrinsics. --- Diffs of the changes: (+4 -0) Verifier.cpp | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.190 llvm/lib/VMCore/Verifier.cpp:1.191 --- llvm/lib/VMCore/Verifier.cpp:1.190 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/Verifier.cpp Tue Feb 6 12:02:54 2007 @@ -987,6 +987,10 @@ for (unsigned ArgNo = 0; 1; ++ArgNo) { int TypeID = va_arg(VA, int); + if (TypeID == -2) { + break; + } + if (TypeID == -1) { if (ArgNo != FTy->getNumParams()+1) CheckFailed("Intrinsic prototype has too many arguments!", F); From jlaskey at apple.com Tue Feb 6 12:03:52 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:03:52 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l.cvs FileLexer.cpp.cvs Message-ID: <200702061803.l16I3qcD027488@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.l.cvs updated: 1.8 -> 1.9 FileLexer.cpp.cvs updated: 1.9 -> 1.10 --- Log message: Regenerate. --- Diffs of the changes: (+184 -179) FileLexer.cpp.cvs | 361 +++++++++++++++++++++++++++--------------------------- FileLexer.l.cvs | 2 2 files changed, 184 insertions(+), 179 deletions(-) Index: llvm/utils/TableGen/FileLexer.l.cvs diff -u llvm/utils/TableGen/FileLexer.l.cvs:1.8 llvm/utils/TableGen/FileLexer.l.cvs:1.9 --- llvm/utils/TableGen/FileLexer.l.cvs:1.8 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/FileLexer.l.cvs Tue Feb 6 12:03:31 2007 @@ -176,7 +176,7 @@ Comment \/\/.* -Identifier [a-zA-Z_][0-9a-zA-Z_]* +Identifier [a-zA-Z_][0-9a-zA-Z_]*|\.\.\. Integer [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+ CodeFragment \[\{([^}]+|\}[^\]])*\}\] StringVal \"[^"]*\" Index: llvm/utils/TableGen/FileLexer.cpp.cvs diff -u llvm/utils/TableGen/FileLexer.cpp.cvs:1.9 llvm/utils/TableGen/FileLexer.cpp.cvs:1.10 --- llvm/utils/TableGen/FileLexer.cpp.cvs:1.9 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/FileLexer.cpp.cvs Tue Feb 6 12:03:31 2007 @@ -21,7 +21,7 @@ /* A lexical scanner generated by flex */ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/utils/TableGen/FileLexer.cpp.cvs,v 1.9 2006/12/07 22:21:48 void Exp $ + * $Header: /var/cvs/llvm/llvm/utils/TableGen/FileLexer.cpp.cvs,v 1.10 2007/02/06 18:03:31 jlaskey Exp $ */ #define FLEX_SCANNER @@ -308,41 +308,42 @@ #define YY_NUM_RULES 34 #define YY_END_OF_BUFFER 35 -static yyconst short int yy_acclist[145] = +static yyconst short int yy_acclist[149] = { 0, 28, 28, 35, 33, 34, 26, 33, 34, 26, 34, 33, 34, 33, 34, 33, 34, 33, 34, 33, 34, - 25, 33, 34, 25, 33, 34, 22, 33, 34, 33, - 34, 22, 33, 34, 22, 33, 34, 22, 33, 34, - 22, 33, 34, 22, 33, 34, 22, 33, 34, 22, - 33, 34, 22, 33, 34, 28, 34, 29, 34, 31, - 34, 26, 24, 23, 25, 27, 1, 22, 22, 22, - 22, 22, 22, 22, 17, 22, 22, 22, 22, 22, - 28, 29, 29, 32, 31, 30, 31, 23, 1, 25, - 25, 5, 22, 22, 22, 10, 22, 12, 22, 22, - - 22, 4, 22, 16, 22, 22, 22, 22, 20, 18, - 19, 3, 6, 22, 22, 9, 22, 13, 22, 22, - 22, 8, 22, 22, 22, 11, 22, 15, 22, 22, - 22, 22, 22, 22, 7, 22, 22, 22, 22, 22, - 21, 2, 14, 22 + 33, 34, 25, 33, 34, 25, 33, 34, 22, 33, + 34, 33, 34, 22, 33, 34, 22, 33, 34, 22, + 33, 34, 22, 33, 34, 22, 33, 34, 22, 33, + 34, 22, 33, 34, 22, 33, 34, 28, 34, 29, + 34, 31, 34, 26, 24, 23, 25, 27, 1, 22, + 22, 22, 22, 22, 22, 22, 17, 22, 22, 22, + 22, 22, 28, 29, 29, 32, 31, 30, 31, 23, + 22, 1, 25, 25, 5, 22, 22, 22, 10, 22, + + 12, 22, 22, 22, 4, 22, 16, 22, 22, 22, + 22, 20, 18, 19, 23, 3, 6, 22, 22, 9, + 22, 13, 22, 22, 22, 8, 22, 22, 22, 11, + 22, 15, 22, 22, 22, 22, 22, 22, 7, 22, + 22, 22, 22, 22, 21, 2, 14, 22 } ; -static yyconst short int yy_accept[120] = +static yyconst short int yy_accept[126] = { 0, 1, 1, 1, 2, 3, 4, 6, 9, 11, 13, - 15, 17, 19, 21, 24, 27, 30, 32, 35, 38, - 41, 44, 47, 50, 53, 56, 58, 60, 62, 63, - 63, 63, 64, 65, 66, 67, 68, 68, 68, 69, - 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 88, - 88, 88, 89, 90, 91, 92, 92, 92, 94, 95, - 96, 98, 100, 101, 102, 104, 106, 107, 108, 109, - 110, 111, 112, 112, 112, 113, 115, 116, 118, 120, - 121, 122, 124, 125, 126, 126, 128, 130, 131, 132, - - 133, 133, 134, 135, 137, 137, 138, 139, 139, 139, - 140, 140, 140, 141, 142, 142, 143, 145, 145 + 15, 17, 19, 21, 23, 26, 29, 32, 34, 37, + 40, 43, 46, 49, 52, 55, 58, 60, 62, 64, + 65, 65, 65, 66, 66, 67, 68, 68, 69, 70, + 70, 70, 71, 71, 72, 73, 74, 75, 76, 77, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 90, 90, 90, 90, 91, 92, 93, 94, + 95, 95, 95, 97, 98, 99, 101, 103, 104, 105, + 107, 109, 110, 111, 112, 113, 114, 115, 115, 116, + 116, 117, 119, 120, 122, 124, 125, 126, 128, 129, + + 130, 130, 132, 134, 135, 136, 137, 137, 138, 139, + 141, 141, 142, 143, 143, 143, 144, 144, 144, 145, + 146, 146, 147, 149, 149 } ; static yyconst int yy_ec[256] = @@ -351,16 +352,16 @@ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 1, 7, 1, 1, 1, 1, - 1, 8, 9, 1, 9, 1, 10, 11, 12, 13, - 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, - 1, 1, 1, 1, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 16, 1, 17, 1, 15, 1, 18, 19, 20, 21, - - 22, 23, 24, 25, 26, 15, 15, 27, 28, 29, - 30, 15, 15, 31, 32, 33, 34, 15, 15, 35, - 15, 15, 36, 1, 37, 1, 1, 1, 1, 1, + 1, 8, 9, 1, 9, 10, 11, 12, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 1, 1, 1, + 1, 1, 1, 1, 15, 15, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 1, 18, 1, 16, 1, 19, 20, 21, 22, + + 23, 24, 25, 26, 27, 16, 16, 28, 29, 30, + 31, 16, 16, 32, 33, 34, 35, 16, 16, 36, + 16, 16, 37, 1, 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -377,114 +378,118 @@ 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[38] = +static yyconst int yy_meta[39] = { 0, - 1, 1, 2, 1, 1, 1, 1, 3, 1, 3, - 4, 4, 4, 5, 6, 1, 1, 5, 5, 5, - 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 1, 1 + 1, 1, 2, 1, 1, 1, 1, 3, 1, 4, + 3, 5, 5, 5, 6, 7, 1, 1, 6, 6, + 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 1, 1 } ; -static yyconst short int yy_base[132] = +static yyconst short int yy_base[138] = { 0, - 0, 0, 30, 31, 218, 219, 40, 43, 185, 210, - 0, 37, 43, 43, 46, 0, 179, 188, 33, 43, - 187, 183, 42, 177, 177, 0, 59, 62, 71, 46, - 203, 219, 0, 69, 219, 0, 72, 0, 0, 171, - 174, 188, 184, 180, 180, 180, 56, 168, 168, 172, - 167, 0, 77, 78, 219, 82, 219, 83, 170, 76, - 165, 0, 0, 84, 0, 158, 177, 161, 160, 169, - 0, 162, 162, 161, 0, 0, 154, 153, 159, 219, - 219, 219, 164, 146, 219, 0, 150, 0, 0, 160, - 146, 0, 153, 149, 147, 0, 0, 155, 155, 150, - - 144, 150, 144, 0, 150, 95, 151, 126, 98, 92, - 69, 93, 34, 219, 46, 219, 0, 219, 104, 110, - 112, 115, 121, 127, 133, 136, 142, 145, 150, 156, - 162 + 0, 0, 31, 32, 234, 235, 42, 45, 200, 226, + 221, 38, 220, 45, 45, 48, 0, 192, 201, 35, + 45, 200, 196, 44, 190, 190, 0, 61, 62, 72, + 51, 217, 235, 212, 0, 66, 211, 235, 0, 42, + 0, 0, 182, 185, 199, 195, 191, 191, 191, 61, + 179, 179, 183, 178, 0, 76, 78, 235, 80, 235, + 82, 181, 73, 176, 197, 0, 235, 0, 84, 0, + 168, 187, 171, 170, 179, 0, 172, 172, 171, 0, + 0, 164, 163, 169, 235, 235, 235, 174, 235, 156, + 235, 0, 160, 0, 0, 170, 156, 0, 163, 159, + + 157, 0, 0, 165, 165, 160, 154, 160, 154, 0, + 132, 96, 111, 103, 100, 72, 70, 94, 61, 235, + 35, 235, 0, 235, 106, 113, 117, 120, 127, 134, + 141, 144, 151, 154, 160, 167, 174 } ; -static yyconst short int yy_def[132] = +static yyconst short int yy_def[138] = { 0, - 118, 1, 119, 119, 118, 118, 118, 118, 118, 120, - 121, 118, 118, 118, 118, 122, 118, 122, 122, 122, - 122, 122, 122, 122, 122, 123, 124, 125, 118, 118, - 120, 118, 126, 118, 118, 127, 118, 128, 122, 129, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 123, 124, 124, 118, 125, 118, 125, 118, 118, - 118, 126, 127, 118, 128, 129, 130, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 118, - 118, 118, 118, 129, 118, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 118, 122, 122, 122, 122, 122, - - 118, 122, 122, 122, 118, 122, 122, 118, 118, 122, - 118, 131, 122, 118, 131, 118, 122, 0, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118 + 124, 1, 125, 125, 124, 124, 124, 124, 124, 126, + 127, 124, 124, 124, 124, 124, 128, 124, 128, 128, + 128, 128, 128, 128, 128, 128, 129, 130, 131, 124, + 124, 126, 124, 124, 132, 124, 124, 124, 133, 124, + 134, 128, 135, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 129, 130, 130, 124, 131, 124, + 131, 124, 124, 124, 124, 132, 124, 133, 124, 134, + 135, 136, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 124, 124, 124, 124, 124, 135, + 124, 128, 128, 128, 128, 128, 128, 128, 128, 128, + + 124, 128, 128, 128, 128, 128, 124, 128, 128, 128, + 124, 128, 128, 124, 124, 128, 124, 137, 128, 124, + 137, 124, 128, 0, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124 } ; -static yyconst short int yy_nxt[257] = +static yyconst short int yy_nxt[274] = { 0, 6, 7, 8, 7, 9, 10, 11, 6, 12, 13, - 14, 15, 15, 16, 16, 17, 6, 16, 18, 19, - 20, 16, 21, 16, 16, 22, 23, 24, 16, 16, - 16, 25, 16, 16, 16, 6, 6, 27, 27, 28, - 28, 29, 29, 29, 29, 29, 29, 34, 34, 34, - 35, 116, 36, 34, 34, 34, 34, 34, 34, 42, - 44, 37, 43, 48, 45, 117, 54, 49, 55, 57, - 59, 58, 29, 29, 29, 74, 60, 38, 61, 34, - 34, 34, 64, 64, 118, 54, 118, 55, 75, 118, - 118, 118, 58, 81, 64, 64, 109, 109, 116, 109, - - 109, 114, 82, 112, 26, 26, 26, 26, 26, 26, - 31, 31, 31, 31, 31, 31, 33, 33, 39, 39, - 39, 52, 52, 113, 52, 52, 52, 53, 53, 53, - 53, 53, 53, 56, 56, 56, 56, 56, 56, 62, - 62, 62, 63, 111, 63, 63, 63, 63, 65, 65, - 66, 66, 66, 66, 66, 66, 84, 84, 84, 84, - 84, 84, 115, 115, 115, 115, 115, 115, 110, 108, - 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, - 97, 96, 67, 95, 94, 93, 92, 91, 90, 89, - 88, 87, 86, 85, 67, 83, 80, 79, 78, 77, - - 76, 73, 72, 71, 70, 69, 68, 67, 32, 51, - 50, 47, 46, 41, 40, 32, 30, 118, 5, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118 + 14, 15, 16, 16, 17, 17, 18, 6, 17, 19, + 20, 21, 17, 22, 17, 17, 23, 24, 25, 17, + 17, 17, 26, 17, 17, 17, 6, 6, 28, 28, + 122, 29, 29, 30, 30, 30, 30, 30, 30, 36, + 36, 36, 38, 69, 69, 39, 36, 36, 36, 36, + 36, 36, 45, 47, 40, 46, 51, 48, 57, 60, + 52, 58, 61, 30, 30, 30, 62, 36, 36, 36, + 41, 79, 63, 124, 64, 57, 124, 124, 58, 124, + 124, 86, 61, 123, 80, 69, 69, 115, 115, 122, + + 87, 115, 115, 120, 119, 118, 27, 27, 27, 27, + 27, 27, 27, 32, 32, 32, 32, 32, 32, 32, + 35, 117, 35, 35, 42, 42, 42, 55, 55, 116, + 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, + 56, 59, 59, 59, 59, 59, 59, 59, 66, 66, + 66, 68, 114, 68, 68, 68, 68, 68, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 90, 90, 90, + 90, 90, 90, 90, 121, 121, 121, 121, 121, 121, + 121, 113, 112, 111, 110, 109, 108, 107, 106, 105, + 104, 103, 102, 72, 101, 100, 99, 98, 97, 96, + + 95, 94, 93, 92, 91, 72, 89, 88, 85, 84, + 83, 82, 81, 78, 77, 76, 75, 74, 73, 72, + 67, 65, 33, 54, 53, 50, 49, 44, 43, 37, + 34, 33, 31, 124, 5, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124 } ; -static yyconst short int yy_chk[257] = +static yyconst short int yy_chk[274] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 4, 3, - 4, 7, 7, 7, 8, 8, 8, 12, 12, 12, - 13, 115, 13, 14, 14, 14, 15, 15, 15, 19, - 20, 14, 19, 23, 20, 113, 27, 23, 27, 28, - 30, 28, 29, 29, 29, 47, 30, 14, 30, 34, - 34, 34, 37, 37, 53, 54, 53, 54, 47, 56, - 58, 56, 58, 60, 64, 64, 106, 106, 112, 109, - - 109, 111, 60, 109, 119, 119, 119, 119, 119, 119, - 120, 120, 120, 120, 120, 120, 121, 121, 122, 122, - 122, 123, 123, 110, 123, 123, 123, 124, 124, 124, - 124, 124, 124, 125, 125, 125, 125, 125, 125, 126, - 126, 126, 127, 108, 127, 127, 127, 127, 128, 128, - 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, - 130, 130, 131, 131, 131, 131, 131, 131, 107, 105, - 103, 102, 101, 100, 99, 98, 95, 94, 93, 91, - 90, 87, 84, 83, 79, 78, 77, 74, 73, 72, - 70, 69, 68, 67, 66, 61, 59, 51, 50, 49, - - 48, 46, 45, 44, 43, 42, 41, 40, 31, 25, - 24, 22, 21, 18, 17, 10, 9, 5, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118 + 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, + 121, 3, 4, 7, 7, 7, 8, 8, 8, 12, + 12, 12, 14, 40, 40, 14, 15, 15, 15, 16, + 16, 16, 20, 21, 15, 20, 24, 21, 28, 29, + 24, 28, 29, 30, 30, 30, 31, 36, 36, 36, + 15, 50, 31, 56, 31, 57, 56, 59, 57, 61, + 59, 63, 61, 119, 50, 69, 69, 112, 112, 118, + + 63, 115, 115, 117, 116, 115, 125, 125, 125, 125, + 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, + 127, 114, 127, 127, 128, 128, 128, 129, 129, 113, + 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, + 130, 131, 131, 131, 131, 131, 131, 131, 132, 132, + 132, 133, 111, 133, 133, 133, 133, 133, 134, 134, + 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, + 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, + 137, 109, 108, 107, 106, 105, 104, 101, 100, 99, + 97, 96, 93, 90, 88, 84, 83, 82, 79, 78, + + 77, 75, 74, 73, 72, 71, 65, 64, 62, 54, + 53, 52, 51, 49, 48, 47, 46, 45, 44, 43, + 37, 34, 32, 26, 25, 23, 22, 19, 18, 13, + 11, 10, 9, 5, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -501,7 +506,7 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 1 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" #define INITIAL 0 /*===-- FileLexer.l - Scanner for TableGen Files ----------------*- C++ -*-===// // @@ -519,7 +524,7 @@ #define YY_NEVER_INTERACTIVE 1 #define comment 1 -#line 30 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 30 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" #include "llvm/Config/config.h" #include "llvm/Support/Streams.h" #include "Record.h" @@ -665,7 +670,7 @@ using namespace llvm; -#line 669 "Lexer.cpp" +#line 674 "Lexer.cpp" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -816,10 +821,10 @@ register char *yy_cp, *yy_bp; register int yy_act; -#line 185 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 185 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" -#line 823 "Lexer.cpp" +#line 828 "Lexer.cpp" if ( yy_init ) { @@ -867,14 +872,14 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 119 ) + if ( yy_current_state >= 125 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 118 ); + while ( yy_current_state != 124 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -912,183 +917,183 @@ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 187 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 187 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { /* Ignore comments */ } YY_BREAK case 2: YY_RULE_SETUP -#line 189 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 189 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { HandleInclude(yytext); } YY_BREAK case 3: YY_RULE_SETUP -#line 190 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 190 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2); return CODEFRAGMENT; } YY_BREAK case 4: YY_RULE_SETUP -#line 193 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 193 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return INT; } YY_BREAK case 5: YY_RULE_SETUP -#line 194 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 194 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return BIT; } YY_BREAK case 6: YY_RULE_SETUP -#line 195 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 195 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return BITS; } YY_BREAK case 7: YY_RULE_SETUP -#line 196 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 196 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return STRING; } YY_BREAK case 8: YY_RULE_SETUP -#line 197 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 197 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return LIST; } YY_BREAK case 9: YY_RULE_SETUP -#line 198 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 198 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return CODE; } YY_BREAK case 10: YY_RULE_SETUP -#line 199 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 199 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return DAG; } YY_BREAK case 11: YY_RULE_SETUP -#line 201 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 201 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return CLASS; } YY_BREAK case 12: YY_RULE_SETUP -#line 202 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 202 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return DEF; } YY_BREAK case 13: YY_RULE_SETUP -#line 203 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 203 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return DEFM; } YY_BREAK case 14: YY_RULE_SETUP -#line 204 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 204 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return MULTICLASS; } YY_BREAK case 15: YY_RULE_SETUP -#line 205 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 205 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return FIELD; } YY_BREAK case 16: YY_RULE_SETUP -#line 206 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 206 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return LET; } YY_BREAK case 17: YY_RULE_SETUP -#line 207 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 207 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return IN; } YY_BREAK case 18: YY_RULE_SETUP -#line 209 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 209 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return SRATOK; } YY_BREAK case 19: YY_RULE_SETUP -#line 210 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 210 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return SRLTOK; } YY_BREAK case 20: YY_RULE_SETUP -#line 211 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 211 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return SHLTOK; } YY_BREAK case 21: YY_RULE_SETUP -#line 212 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 212 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return STRCONCATTOK; } YY_BREAK case 22: YY_RULE_SETUP -#line 215 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 215 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext, yytext+yyleng); return ID; } YY_BREAK case 23: YY_RULE_SETUP -#line 217 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 217 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); return VARNAME; } YY_BREAK case 24: YY_RULE_SETUP -#line 220 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 220 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng-1); return STRVAL; } YY_BREAK case 25: YY_RULE_SETUP -#line 223 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 223 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { Filelval.IntVal = ParseInt(Filetext); return INTVAL; } YY_BREAK case 26: YY_RULE_SETUP -#line 225 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 225 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { /* Ignore whitespace */ } YY_BREAK case 27: YY_RULE_SETUP -#line 228 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 228 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { BEGIN(comment); CommentDepth++; } YY_BREAK case 28: YY_RULE_SETUP -#line 229 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 229 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" {} /* eat anything that's not a '*' or '/' */ YY_BREAK case 29: YY_RULE_SETUP -#line 230 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 230 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" {} /* eat up '*'s not followed by '/'s */ YY_BREAK case 30: YY_RULE_SETUP -#line 231 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 231 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { ++CommentDepth; } YY_BREAK case 31: YY_RULE_SETUP -#line 232 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 232 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" {} /* eat up /'s not followed by *'s */ YY_BREAK case 32: YY_RULE_SETUP -#line 233 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 233 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { if (!--CommentDepth) { BEGIN(INITIAL); } } YY_BREAK case YY_STATE_EOF(comment): -#line 234 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 234 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { err() << "Unterminated comment!\n"; exit(1); } YY_BREAK case 33: YY_RULE_SETUP -#line 236 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 236 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" { return Filetext[0]; } YY_BREAK case 34: YY_RULE_SETUP -#line 238 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 238 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 1092 "Lexer.cpp" +#line 1097 "Lexer.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1377,7 +1382,7 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 119 ) + if ( yy_current_state >= 125 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1407,11 +1412,11 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 119 ) + if ( yy_current_state >= 125 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 118); + yy_is_jam = (yy_current_state == 124); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -1512,7 +1517,7 @@ case EOB_ACT_END_OF_FILE: { if ( yywrap() ) - return 0; + return EOF; if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; @@ -1972,6 +1977,6 @@ return 0; } #endif -#line 238 "/Volumes/Gir/devel/llvm/llvm.src/utils/TableGen/FileLexer.l" +#line 238 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" From jlaskey at apple.com Tue Feb 6 12:20:01 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:20:01 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l Message-ID: <200702061820.l16IK1Jn030004@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.l updated: 1.34 -> 1.35 --- Log message: Deemed too cute to live. --- Diffs of the changes: (+1 -1) FileLexer.l | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/FileLexer.l diff -u llvm/utils/TableGen/FileLexer.l:1.34 llvm/utils/TableGen/FileLexer.l:1.35 --- llvm/utils/TableGen/FileLexer.l:1.34 Tue Feb 6 12:02:54 2007 +++ llvm/utils/TableGen/FileLexer.l Tue Feb 6 12:19:44 2007 @@ -176,7 +176,7 @@ Comment \/\/.* -Identifier [a-zA-Z_][0-9a-zA-Z_]*|\.\.\. +Identifier [a-zA-Z_][0-9a-zA-Z_]* Integer [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+ CodeFragment \[\{([^}]+|\}[^\]])*\}\] StringVal \"[^"]*\" From jlaskey at apple.com Tue Feb 6 12:20:02 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:20:02 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Intrinsics.td Message-ID: <200702061820.l16IK2Wn030015@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Intrinsics.td updated: 1.42 -> 1.43 --- Log message: Deemed too cute to live. --- Diffs of the changes: (+2 -2) Intrinsics.td | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/include/llvm/Intrinsics.td diff -u llvm/include/llvm/Intrinsics.td:1.42 llvm/include/llvm/Intrinsics.td:1.43 --- llvm/include/llvm/Intrinsics.td:1.42 Tue Feb 6 12:02:54 2007 +++ llvm/include/llvm/Intrinsics.td Tue Feb 6 12:19:44 2007 @@ -88,7 +88,7 @@ def llvm_v4f32_ty : LLVMPackedType; // 4 x float def llvm_v2f64_ty : LLVMPackedType;// 2 x double -def ... : LLVMType; // vararg +def llvm_vararg_ty : LLVMType; // vararg //===----------------------------------------------------------------------===// // Intrinsic Definitions. @@ -222,7 +222,7 @@ //===------------------ Exception Handling Intrinsics----------------------===// // def int_eh_exception : Intrinsic<[llvm_ptr_ty]>; -def int_eh_handlers : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, ...]>; +def int_eh_handlers : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, llvm_vararg_ty]>; //===----------------------------------------------------------------------===// // Target-specific intrinsics From jlaskey at apple.com Tue Feb 6 12:20:23 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:20:23 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l.cvs FileLexer.cpp.cvs Message-ID: <200702061820.l16IKNI0030034@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.l.cvs updated: 1.9 -> 1.10 FileLexer.cpp.cvs updated: 1.10 -> 1.11 --- Log message: Regenerate. --- Diffs of the changes: (+139 -144) FileLexer.cpp.cvs | 281 ++++++++++++++++++++++++++---------------------------- FileLexer.l.cvs | 2 2 files changed, 139 insertions(+), 144 deletions(-) Index: llvm/utils/TableGen/FileLexer.l.cvs diff -u llvm/utils/TableGen/FileLexer.l.cvs:1.9 llvm/utils/TableGen/FileLexer.l.cvs:1.10 --- llvm/utils/TableGen/FileLexer.l.cvs:1.9 Tue Feb 6 12:03:31 2007 +++ llvm/utils/TableGen/FileLexer.l.cvs Tue Feb 6 12:20:07 2007 @@ -176,7 +176,7 @@ Comment \/\/.* -Identifier [a-zA-Z_][0-9a-zA-Z_]*|\.\.\. +Identifier [a-zA-Z_][0-9a-zA-Z_]* Integer [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+ CodeFragment \[\{([^}]+|\}[^\]])*\}\] StringVal \"[^"]*\" Index: llvm/utils/TableGen/FileLexer.cpp.cvs diff -u llvm/utils/TableGen/FileLexer.cpp.cvs:1.10 llvm/utils/TableGen/FileLexer.cpp.cvs:1.11 --- llvm/utils/TableGen/FileLexer.cpp.cvs:1.10 Tue Feb 6 12:03:31 2007 +++ llvm/utils/TableGen/FileLexer.cpp.cvs Tue Feb 6 12:20:07 2007 @@ -21,7 +21,7 @@ /* A lexical scanner generated by flex */ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/utils/TableGen/FileLexer.cpp.cvs,v 1.10 2007/02/06 18:03:31 jlaskey Exp $ + * $Header: /var/cvs/llvm/llvm/utils/TableGen/FileLexer.cpp.cvs,v 1.11 2007/02/06 18:20:07 jlaskey Exp $ */ #define FLEX_SCANNER @@ -308,42 +308,41 @@ #define YY_NUM_RULES 34 #define YY_END_OF_BUFFER 35 -static yyconst short int yy_acclist[149] = +static yyconst short int yy_acclist[145] = { 0, 28, 28, 35, 33, 34, 26, 33, 34, 26, 34, 33, 34, 33, 34, 33, 34, 33, 34, 33, 34, - 33, 34, 25, 33, 34, 25, 33, 34, 22, 33, - 34, 33, 34, 22, 33, 34, 22, 33, 34, 22, - 33, 34, 22, 33, 34, 22, 33, 34, 22, 33, - 34, 22, 33, 34, 22, 33, 34, 28, 34, 29, - 34, 31, 34, 26, 24, 23, 25, 27, 1, 22, - 22, 22, 22, 22, 22, 22, 17, 22, 22, 22, - 22, 22, 28, 29, 29, 32, 31, 30, 31, 23, - 22, 1, 25, 25, 5, 22, 22, 22, 10, 22, - - 12, 22, 22, 22, 4, 22, 16, 22, 22, 22, - 22, 20, 18, 19, 23, 3, 6, 22, 22, 9, - 22, 13, 22, 22, 22, 8, 22, 22, 22, 11, - 22, 15, 22, 22, 22, 22, 22, 22, 7, 22, - 22, 22, 22, 22, 21, 2, 14, 22 + 25, 33, 34, 25, 33, 34, 22, 33, 34, 33, + 34, 22, 33, 34, 22, 33, 34, 22, 33, 34, + 22, 33, 34, 22, 33, 34, 22, 33, 34, 22, + 33, 34, 22, 33, 34, 28, 34, 29, 34, 31, + 34, 26, 24, 23, 25, 27, 1, 22, 22, 22, + 22, 22, 22, 22, 17, 22, 22, 22, 22, 22, + 28, 29, 29, 32, 31, 30, 31, 23, 1, 25, + 25, 5, 22, 22, 22, 10, 22, 12, 22, 22, + + 22, 4, 22, 16, 22, 22, 22, 22, 20, 18, + 19, 3, 6, 22, 22, 9, 22, 13, 22, 22, + 22, 8, 22, 22, 22, 11, 22, 15, 22, 22, + 22, 22, 22, 22, 7, 22, 22, 22, 22, 22, + 21, 2, 14, 22 } ; -static yyconst short int yy_accept[126] = +static yyconst short int yy_accept[120] = { 0, 1, 1, 1, 2, 3, 4, 6, 9, 11, 13, - 15, 17, 19, 21, 23, 26, 29, 32, 34, 37, - 40, 43, 46, 49, 52, 55, 58, 60, 62, 64, - 65, 65, 65, 66, 66, 67, 68, 68, 69, 70, - 70, 70, 71, 71, 72, 73, 74, 75, 76, 77, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 90, 90, 90, 90, 91, 92, 93, 94, - 95, 95, 95, 97, 98, 99, 101, 103, 104, 105, - 107, 109, 110, 111, 112, 113, 114, 115, 115, 116, - 116, 117, 119, 120, 122, 124, 125, 126, 128, 129, - - 130, 130, 132, 134, 135, 136, 137, 137, 138, 139, - 141, 141, 142, 143, 143, 143, 144, 144, 144, 145, - 146, 146, 147, 149, 149 + 15, 17, 19, 21, 24, 27, 30, 32, 35, 38, + 41, 44, 47, 50, 53, 56, 58, 60, 62, 63, + 63, 63, 64, 65, 66, 67, 68, 68, 68, 69, + 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 88, + 88, 88, 89, 90, 91, 92, 92, 92, 94, 95, + 96, 98, 100, 101, 102, 104, 106, 107, 108, 109, + 110, 111, 112, 112, 112, 113, 115, 116, 118, 120, + 121, 122, 124, 125, 126, 126, 128, 130, 131, 132, + + 133, 133, 134, 135, 137, 137, 138, 139, 139, 139, + 140, 140, 140, 141, 142, 142, 143, 145, 145 } ; static yyconst int yy_ec[256] = @@ -352,16 +351,16 @@ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 1, 7, 1, 1, 1, 1, - 1, 8, 9, 1, 9, 10, 11, 12, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 1, 1, 1, - 1, 1, 1, 1, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 1, 18, 1, 16, 1, 19, 20, 21, 22, - - 23, 24, 25, 26, 27, 16, 16, 28, 29, 30, - 31, 16, 16, 32, 33, 34, 35, 16, 16, 36, - 16, 16, 37, 1, 38, 1, 1, 1, 1, 1, + 1, 8, 9, 1, 9, 1, 10, 11, 12, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 1, 1, 1, 1, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 16, 1, 17, 1, 15, 1, 18, 19, 20, 21, + + 22, 23, 24, 25, 26, 15, 15, 27, 28, 29, + 30, 15, 15, 31, 32, 33, 34, 15, 15, 35, + 15, 15, 36, 1, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -378,118 +377,114 @@ 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[39] = +static yyconst int yy_meta[38] = { 0, - 1, 1, 2, 1, 1, 1, 1, 3, 1, 4, - 3, 5, 5, 5, 6, 7, 1, 1, 6, 6, - 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 1, 1 + 1, 1, 2, 1, 1, 1, 1, 3, 1, 3, + 4, 4, 4, 5, 6, 1, 1, 5, 5, 5, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 1, 1 } ; -static yyconst short int yy_base[138] = +static yyconst short int yy_base[132] = { 0, - 0, 0, 31, 32, 234, 235, 42, 45, 200, 226, - 221, 38, 220, 45, 45, 48, 0, 192, 201, 35, - 45, 200, 196, 44, 190, 190, 0, 61, 62, 72, - 51, 217, 235, 212, 0, 66, 211, 235, 0, 42, - 0, 0, 182, 185, 199, 195, 191, 191, 191, 61, - 179, 179, 183, 178, 0, 76, 78, 235, 80, 235, - 82, 181, 73, 176, 197, 0, 235, 0, 84, 0, - 168, 187, 171, 170, 179, 0, 172, 172, 171, 0, - 0, 164, 163, 169, 235, 235, 235, 174, 235, 156, - 235, 0, 160, 0, 0, 170, 156, 0, 163, 159, - - 157, 0, 0, 165, 165, 160, 154, 160, 154, 0, - 132, 96, 111, 103, 100, 72, 70, 94, 61, 235, - 35, 235, 0, 235, 106, 113, 117, 120, 127, 134, - 141, 144, 151, 154, 160, 167, 174 + 0, 0, 30, 31, 218, 219, 40, 43, 185, 210, + 0, 37, 43, 43, 46, 0, 179, 188, 33, 43, + 187, 183, 42, 177, 177, 0, 59, 62, 71, 46, + 203, 219, 0, 69, 219, 0, 72, 0, 0, 171, + 174, 188, 184, 180, 180, 180, 56, 168, 168, 172, + 167, 0, 77, 78, 219, 82, 219, 83, 170, 76, + 165, 0, 0, 84, 0, 158, 177, 161, 160, 169, + 0, 162, 162, 161, 0, 0, 154, 153, 159, 219, + 219, 219, 164, 146, 219, 0, 150, 0, 0, 160, + 146, 0, 153, 149, 147, 0, 0, 155, 155, 150, + + 144, 150, 144, 0, 150, 95, 151, 126, 98, 92, + 69, 93, 34, 219, 46, 219, 0, 219, 104, 110, + 112, 115, 121, 127, 133, 136, 142, 145, 150, 156, + 162 } ; -static yyconst short int yy_def[138] = +static yyconst short int yy_def[132] = { 0, - 124, 1, 125, 125, 124, 124, 124, 124, 124, 126, - 127, 124, 124, 124, 124, 124, 128, 124, 128, 128, - 128, 128, 128, 128, 128, 128, 129, 130, 131, 124, - 124, 126, 124, 124, 132, 124, 124, 124, 133, 124, - 134, 128, 135, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 129, 130, 130, 124, 131, 124, - 131, 124, 124, 124, 124, 132, 124, 133, 124, 134, - 135, 136, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 124, 124, 124, 124, 124, 135, - 124, 128, 128, 128, 128, 128, 128, 128, 128, 128, - - 124, 128, 128, 128, 128, 128, 124, 128, 128, 128, - 124, 128, 128, 124, 124, 128, 124, 137, 128, 124, - 137, 124, 128, 0, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124 + 118, 1, 119, 119, 118, 118, 118, 118, 118, 120, + 121, 118, 118, 118, 118, 122, 118, 122, 122, 122, + 122, 122, 122, 122, 122, 123, 124, 125, 118, 118, + 120, 118, 126, 118, 118, 127, 118, 128, 122, 129, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 124, 124, 118, 125, 118, 125, 118, 118, + 118, 126, 127, 118, 128, 129, 130, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 118, + 118, 118, 118, 129, 118, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 118, 122, 122, 122, 122, 122, + + 118, 122, 122, 122, 118, 122, 122, 118, 118, 122, + 118, 131, 122, 118, 131, 118, 122, 0, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118 } ; -static yyconst short int yy_nxt[274] = +static yyconst short int yy_nxt[257] = { 0, 6, 7, 8, 7, 9, 10, 11, 6, 12, 13, - 14, 15, 16, 16, 17, 17, 18, 6, 17, 19, - 20, 21, 17, 22, 17, 17, 23, 24, 25, 17, - 17, 17, 26, 17, 17, 17, 6, 6, 28, 28, - 122, 29, 29, 30, 30, 30, 30, 30, 30, 36, - 36, 36, 38, 69, 69, 39, 36, 36, 36, 36, - 36, 36, 45, 47, 40, 46, 51, 48, 57, 60, - 52, 58, 61, 30, 30, 30, 62, 36, 36, 36, - 41, 79, 63, 124, 64, 57, 124, 124, 58, 124, - 124, 86, 61, 123, 80, 69, 69, 115, 115, 122, - - 87, 115, 115, 120, 119, 118, 27, 27, 27, 27, - 27, 27, 27, 32, 32, 32, 32, 32, 32, 32, - 35, 117, 35, 35, 42, 42, 42, 55, 55, 116, - 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, - 56, 59, 59, 59, 59, 59, 59, 59, 66, 66, - 66, 68, 114, 68, 68, 68, 68, 68, 70, 70, - 71, 71, 71, 71, 71, 71, 71, 90, 90, 90, - 90, 90, 90, 90, 121, 121, 121, 121, 121, 121, - 121, 113, 112, 111, 110, 109, 108, 107, 106, 105, - 104, 103, 102, 72, 101, 100, 99, 98, 97, 96, - - 95, 94, 93, 92, 91, 72, 89, 88, 85, 84, - 83, 82, 81, 78, 77, 76, 75, 74, 73, 72, - 67, 65, 33, 54, 53, 50, 49, 44, 43, 37, - 34, 33, 31, 124, 5, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124 + 14, 15, 15, 16, 16, 17, 6, 16, 18, 19, + 20, 16, 21, 16, 16, 22, 23, 24, 16, 16, + 16, 25, 16, 16, 16, 6, 6, 27, 27, 28, + 28, 29, 29, 29, 29, 29, 29, 34, 34, 34, + 35, 116, 36, 34, 34, 34, 34, 34, 34, 42, + 44, 37, 43, 48, 45, 117, 54, 49, 55, 57, + 59, 58, 29, 29, 29, 74, 60, 38, 61, 34, + 34, 34, 64, 64, 118, 54, 118, 55, 75, 118, + 118, 118, 58, 81, 64, 64, 109, 109, 116, 109, + + 109, 114, 82, 112, 26, 26, 26, 26, 26, 26, + 31, 31, 31, 31, 31, 31, 33, 33, 39, 39, + 39, 52, 52, 113, 52, 52, 52, 53, 53, 53, + 53, 53, 53, 56, 56, 56, 56, 56, 56, 62, + 62, 62, 63, 111, 63, 63, 63, 63, 65, 65, + 66, 66, 66, 66, 66, 66, 84, 84, 84, 84, + 84, 84, 115, 115, 115, 115, 115, 115, 110, 108, + 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, + 97, 96, 67, 95, 94, 93, 92, 91, 90, 89, + 88, 87, 86, 85, 67, 83, 80, 79, 78, 77, + + 76, 73, 72, 71, 70, 69, 68, 67, 32, 51, + 50, 47, 46, 41, 40, 32, 30, 118, 5, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118 } ; -static yyconst short int yy_chk[274] = +static yyconst short int yy_chk[257] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, - 121, 3, 4, 7, 7, 7, 8, 8, 8, 12, - 12, 12, 14, 40, 40, 14, 15, 15, 15, 16, - 16, 16, 20, 21, 15, 20, 24, 21, 28, 29, - 24, 28, 29, 30, 30, 30, 31, 36, 36, 36, - 15, 50, 31, 56, 31, 57, 56, 59, 57, 61, - 59, 63, 61, 119, 50, 69, 69, 112, 112, 118, - - 63, 115, 115, 117, 116, 115, 125, 125, 125, 125, - 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, - 127, 114, 127, 127, 128, 128, 128, 129, 129, 113, - 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, - 130, 131, 131, 131, 131, 131, 131, 131, 132, 132, - 132, 133, 111, 133, 133, 133, 133, 133, 134, 134, - 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, - 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, - 137, 109, 108, 107, 106, 105, 104, 101, 100, 99, - 97, 96, 93, 90, 88, 84, 83, 82, 79, 78, - - 77, 75, 74, 73, 72, 71, 65, 64, 62, 54, - 53, 52, 51, 49, 48, 47, 46, 45, 44, 43, - 37, 34, 32, 26, 25, 23, 22, 19, 18, 13, - 11, 10, 9, 5, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124 + 1, 1, 1, 1, 1, 1, 1, 3, 4, 3, + 4, 7, 7, 7, 8, 8, 8, 12, 12, 12, + 13, 115, 13, 14, 14, 14, 15, 15, 15, 19, + 20, 14, 19, 23, 20, 113, 27, 23, 27, 28, + 30, 28, 29, 29, 29, 47, 30, 14, 30, 34, + 34, 34, 37, 37, 53, 54, 53, 54, 47, 56, + 58, 56, 58, 60, 64, 64, 106, 106, 112, 109, + + 109, 111, 60, 109, 119, 119, 119, 119, 119, 119, + 120, 120, 120, 120, 120, 120, 121, 121, 122, 122, + 122, 123, 123, 110, 123, 123, 123, 124, 124, 124, + 124, 124, 124, 125, 125, 125, 125, 125, 125, 126, + 126, 126, 127, 108, 127, 127, 127, 127, 128, 128, + 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, + 130, 130, 131, 131, 131, 131, 131, 131, 107, 105, + 103, 102, 101, 100, 99, 98, 95, 94, 93, 91, + 90, 87, 84, 83, 79, 78, 77, 74, 73, 72, + 70, 69, 68, 67, 66, 61, 59, 51, 50, 49, + + 48, 46, 45, 44, 43, 42, 41, 40, 31, 25, + 24, 22, 21, 18, 17, 10, 9, 5, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -670,7 +665,7 @@ using namespace llvm; -#line 674 "Lexer.cpp" +#line 669 "Lexer.cpp" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -824,7 +819,7 @@ #line 185 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" -#line 828 "Lexer.cpp" +#line 823 "Lexer.cpp" if ( yy_init ) { @@ -872,14 +867,14 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 125 ) + if ( yy_current_state >= 119 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 124 ); + while ( yy_current_state != 118 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -1093,7 +1088,7 @@ #line 238 "/Volumes/Big2/llvm/llvm/utils/TableGen/FileLexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 1097 "Lexer.cpp" +#line 1092 "Lexer.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1382,7 +1377,7 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 125 ) + if ( yy_current_state >= 119 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1412,11 +1407,11 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 125 ) + if ( yy_current_state >= 119 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 124); + yy_is_jam = (yy_current_state == 118); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; From jlaskey at apple.com Tue Feb 6 12:31:14 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 6 Feb 2007 12:31:14 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/IntrinsicEmitter.cpp Message-ID: <200702061831.l16IVEFC030281@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: IntrinsicEmitter.cpp updated: 1.23 -> 1.24 --- Log message: Error check and eliminate unnecessary value. --- Diffs of the changes: (+15 -8) IntrinsicEmitter.cpp | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/IntrinsicEmitter.cpp diff -u llvm/utils/TableGen/IntrinsicEmitter.cpp:1.23 llvm/utils/TableGen/IntrinsicEmitter.cpp:1.24 --- llvm/utils/TableGen/IntrinsicEmitter.cpp:1.23 Tue Feb 6 12:02:54 2007 +++ llvm/utils/TableGen/IntrinsicEmitter.cpp Tue Feb 6 12:30:58 2007 @@ -108,11 +108,8 @@ OS << "#endif\n\n"; } -static void EmitTypeVerify(std::ostream &OS, Record *ArgType) { - if (ArgType->getValueAsString("TypeVal") == "...") { - OS << "-2, "; - return; - } +static bool EmitTypeVerify(std::ostream &OS, Record *ArgType) { + if (ArgType->getValueAsString("TypeVal") == "...") return true; OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", "; // If this is an integer type, check the width is correct. @@ -124,6 +121,8 @@ EmitTypeVerify(OS, ArgType->getValueAsDef("ElTy")); OS << ArgType->getValueAsInt("NumElts") << ", "; } + + return false; } /// RecordListComparator - Provide a determinstic comparator for lists of @@ -172,9 +171,17 @@ const std::vector &ArgTypes = I->first; OS << " VerifyIntrinsicPrototype(IF, "; - for (unsigned j = 0; j != ArgTypes.size(); ++j) - EmitTypeVerify(OS, ArgTypes[j]); - OS << "-1);\n"; + bool VarArg = false; + for (unsigned j = 0; j != ArgTypes.size(); ++j) { + VarArg = EmitTypeVerify(OS, ArgTypes[j]); + if (VarArg) { + if ((j+1) != ArgTypes.size()) + throw "Var arg type not last argument"; + break; + } + } + + OS << (VarArg ? "-2);\n" : "-1);\n"); OS << " break;\n"; } OS << " }\n"; From scottm at aero.org Tue Feb 6 12:33:17 2007 From: scottm at aero.org (Scott Michel) Date: Tue, 6 Feb 2007 10:33:17 -0800 Subject: [llvm-commits] Updated TargetData patch. References: <200702052005.l15K5YIJ011658@relay4.cso.uiuc.edu> Message-ID: Found a minor bug in the previous patch (bit<->byte conversion), fixed 80col violations (hopefully), got rid of tabs. -scooter -------------- next part -------------- A non-text attachment was scrubbed... Name: TargetData.diff Type: text/x-diff Size: 51100 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/76e28091/attachment.bin -------------- next part -------------- A non-text attachment was scrubbed... Name: llvm-cfrontend.diff Type: text/x-diff Size: 2359 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/76e28091/attachment-0001.bin -------------- next part -------------- From reid at x10sys.com Tue Feb 6 12:51:52 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 12:51:52 -0600 Subject: [llvm-commits] CVS: llvm/utils/fpcmp/Makefile Message-ID: <200702061851.l16Ipqn4030796@zion.cs.uiuc.edu> Changes in directory llvm/utils/fpcmp: Makefile updated: 1.3 -> 1.4 --- Log message: Set the new NO_INSTALL flag for build-only tools. --- Diffs of the changes: (+1 -0) Makefile | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/fpcmp/Makefile diff -u llvm/utils/fpcmp/Makefile:1.3 llvm/utils/fpcmp/Makefile:1.4 --- llvm/utils/fpcmp/Makefile:1.3 Mon Dec 13 11:02:08 2004 +++ llvm/utils/fpcmp/Makefile Tue Feb 6 12:51:28 2007 @@ -10,6 +10,7 @@ LEVEL = ../.. TOOLNAME = fpcmp USEDLIBS = LLVMSupport.a LLVMSystem.a +NO_INSTALL = 1 include $(LEVEL)/Makefile.common From reid at x10sys.com Tue Feb 6 12:51:52 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 12:51:52 -0600 Subject: [llvm-commits] CVS: llvm/utils/PerfectShuffle/Makefile Message-ID: <200702061851.l16IpqxI030801@zion.cs.uiuc.edu> Changes in directory llvm/utils/PerfectShuffle: Makefile updated: 1.2 -> 1.3 --- Log message: Set the new NO_INSTALL flag for build-only tools. --- Diffs of the changes: (+1 -0) Makefile | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/PerfectShuffle/Makefile diff -u llvm/utils/PerfectShuffle/Makefile:1.2 llvm/utils/PerfectShuffle/Makefile:1.3 --- llvm/utils/PerfectShuffle/Makefile:1.2 Sun Apr 16 19:35:34 2006 +++ llvm/utils/PerfectShuffle/Makefile Tue Feb 6 12:51:28 2007 @@ -9,5 +9,6 @@ LEVEL = ../.. TOOLNAME = llvm-PerfectShuffle +NO_INSTALL = 1 include $(LEVEL)/Makefile.common From reid at x10sys.com Tue Feb 6 12:51:48 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 12:51:48 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/Makefile Message-ID: <200702061851.l16Ipm8J030782@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: Makefile updated: 1.19 -> 1.20 --- Log message: Set the new NO_INSTALL flag for build-only tools. --- Diffs of the changes: (+1 -0) Makefile | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/TableGen/Makefile diff -u llvm/utils/TableGen/Makefile:1.19 llvm/utils/TableGen/Makefile:1.20 --- llvm/utils/TableGen/Makefile:1.19 Thu Jul 6 19:21:17 2006 +++ llvm/utils/TableGen/Makefile Tue Feb 6 12:51:28 2007 @@ -9,6 +9,7 @@ LEVEL = ../.. TOOLNAME = tblgen +NO_INSTALL = 1; USEDLIBS = LLVMSupport.a LLVMSystem.a EXTRA_DIST = FileLexer.cpp.cvs FileLexer.l.cvs \ FileParser.cpp.cvs FileParser.h.cvs FileParser.y.cvs From reid at x10sys.com Tue Feb 6 12:51:49 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 12:51:49 -0600 Subject: [llvm-commits] CVS: llvm/utils/Makefile Message-ID: <200702061851.l16IpnGQ030790@zion.cs.uiuc.edu> Changes in directory llvm/utils: Makefile updated: 1.15 -> 1.16 --- Log message: Set the new NO_INSTALL flag for build-only tools. --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/Makefile diff -u llvm/utils/Makefile:1.15 llvm/utils/Makefile:1.16 --- llvm/utils/Makefile:1.15 Thu Apr 20 16:15:41 2006 +++ llvm/utils/Makefile Tue Feb 6 12:51:28 2007 @@ -8,7 +8,7 @@ ##===----------------------------------------------------------------------===## LEVEL = .. -DIRS = TableGen fpcmp PerfectShuffle +PARALLEL_DIRS := TableGen fpcmp PerfectShuffle EXTRA_DIST := cgiplotNLT.pl check-each-file codegen-diff countloc.sh cvsupdate \ DSAclean.py DSAextract.py emacs findsym.pl GenLibDeps.pl \ From reid at x10sys.com Tue Feb 6 12:53:30 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 12:53:30 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200702061853.l16IrU23030845@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.421 -> 1.422 --- Log message: Implement the NO_INSTALL feature. Setting this variable to any value in a directory's Makefile will prevent the build products from that directory from being installed. This is useful for tools and libraries that are only useful as part of the build process. --- Diffs of the changes: (+56 -6) Makefile.rules | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 56 insertions(+), 6 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.421 llvm/Makefile.rules:1.422 --- llvm/Makefile.rules:1.421 Sun Feb 4 16:12:25 2007 +++ llvm/Makefile.rules Tue Feb 6 12:53:14 2007 @@ -625,6 +625,12 @@ #--------------------------------------------------------- ifdef CONFIG_FILES +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) UnInstall circumvented with NO_INSTALL +else install-local:: $(PROJ_etcdir) $(CONFIG_FILES) $(Echo) Installing Configuration Files To $(PROJ_etcdir) $(Verb)for file in $(CONFIG_FILES); do \ @@ -642,6 +648,7 @@ $(Verb)for file in $(CONFIG_FILES); do \ $(RM) -f $(PROJ_etcdir)/$${file} ; \ done +endif endif @@ -729,6 +736,12 @@ ModuleDestDir := $(PROJ_libdir) endif +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else DestModule := $(ModuleDestDir)/$(MODULE_NAME).bc install-module:: $(DestModule) @@ -741,6 +754,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) Bytecode Module $(DestModule) -$(Verb) $(RM) -f $(DestModule) +endif endif endif @@ -793,6 +807,12 @@ -$(Verb) $(RM) -f $(LibName.LA) endif +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else DestSharedLib = $(PROJ_libdir)/lib$(LIBRARYNAME)$(SHLIBEXT) install-local:: $(DestSharedLib) @@ -805,7 +825,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) Shared Library $(DestSharedLib) -$(Verb) $(RM) -f $(PROJ_libdir)/lib$(LIBRARYNAME).* - +endif endif #--------------------------------------------------------- @@ -856,6 +876,12 @@ install-bytecode-local:: $(DestBytecodeLib) +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else install-local:: $(DestBytecodeLib) $(DestBytecodeLib): $(BytecodeDestDir) $(LibName.BCA) @@ -865,7 +891,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) Bytecode Archive $(DestBytecodeLib) -$(Verb) $(RM) -f $(DestBytecodeLib) - +endif endif endif @@ -895,6 +921,12 @@ -$(Verb) $(RM) -f $(LibName.O) endif +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else DestRelinkedLib = $(PROJ_libdir)/$(LIBRARYNAME).o install-local:: $(DestRelinkedLib) @@ -906,7 +938,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) Object Library $(DestRelinkedLib) -$(Verb) $(RM) -f $(DestRelinkedLib) - +endif endif #--------------------------------------------------------- @@ -929,6 +961,12 @@ -$(Verb) $(RM) -f $(LibName.A) endif +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else DestArchiveLib := $(PROJ_libdir)/lib$(LIBRARYNAME).a install-local:: $(DestArchiveLib) @@ -941,7 +979,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) Archive Library $(DestArchiveLib) -$(Verb) $(RM) -f $(DestArchiveLib) - +endif endif # endif LIBRARYNAME @@ -985,6 +1023,12 @@ $(Echo) ======= Finished Linking $(BuildMode) Executable $(TOOLNAME) \ $(StripWarnMsg) +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else DestTool = $(PROJ_bindir)/$(TOOLNAME) install-local:: $(DestTool) @@ -996,7 +1040,7 @@ uninstall-local:: $(Echo) Uninstalling $(BuildMode) $(DestTool) -$(Verb) $(RM) -f $(DestTool) - +endif endif ############################################################################### @@ -1631,6 +1675,12 @@ #------------------------------------------------------------------------ # Install support for the project's include files: #------------------------------------------------------------------------ +ifdef NO_INSTALL +install-local:: + $(Echo) Install circumvented with NO_INSTALL +uninstall-local:: + $(Echo) Uninstall circumvented with NO_INSTALL +else install-local:: $(Echo) Installing include files $(Verb) $(MKDIR) $(PROJ_includedir) @@ -1667,7 +1717,7 @@ $(RM) -f `find . -path '*/Internal' -prune -o '(' -type f -name '*.in' \ -print ')' | sed 's#\.in$$##;s#^#$(PROJ_includedir)/#'` ; \ fi - +endif endif #------------------------------------------------------------------------ From reid at x10sys.com Tue Feb 6 13:00:59 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 13:00:59 -0600 Subject: [llvm-commits] CVS: llvm/docs/MakefileGuide.html Message-ID: <200702061900.l16J0x1C031055@zion.cs.uiuc.edu> Changes in directory llvm/docs: MakefileGuide.html updated: 1.38 -> 1.39 --- Log message: Document the LINK_COMPONENTS and NO_INSTALL variables. --- Diffs of the changes: (+16 -1) MakefileGuide.html | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletion(-) Index: llvm/docs/MakefileGuide.html diff -u llvm/docs/MakefileGuide.html:1.38 llvm/docs/MakefileGuide.html:1.39 --- llvm/docs/MakefileGuide.html:1.38 Mon Sep 4 01:12:14 2006 +++ llvm/docs/MakefileGuide.html Tue Feb 6 13:00:40 2007 @@ -683,6 +683,15 @@
LIBRARYNAME
Specify the name of the library to be built. (Required For Libraries)
+
LINK_COMPONENTS
+
When specified for building a tool, the value of this variable will be + passed to the llvm-config tool to generate a link line for the + tool. Unlike USEDLIBS and LLVMLIBS, not all libraries need + to be specified. The llvm-config tool will figure out the library + dependencies and add any libraries that are needed. The USEDLIBS + variable can still be used in conjunction with LINK_COMPONENTS so + that additional project-specific libraries can be linked with the LLVM + libraries specified by LINK_COMPONENTS
LINK_LIBS_IN_SHARED
By default, shared library linking will ignore any libraries specified with the LLVMLIBS or USEDLIBS. @@ -704,6 +713,12 @@ module can be specified in conjunction with other kinds of library builds or by itself. It constructs from the sources a single linked bytecode file.
+
NO_INSTALL
+
Specifies that the build products of the directory should not be + installed but should be built even if the install target is given. + This is handy for directories that build libraries or tools that are only + used as part of the build process, such as code generators (e.g. + tblgen).
OPTIONAL_DIRS
Specify a set of directories that may be built, if they exist, but its not an error for them not to exist.
@@ -1025,7 +1040,7 @@ Reid Spencer
The LLVM Compiler Infrastructure
- Last modified: $Date: 2006/09/04 06:12:14 $ + Last modified: $Date: 2007/02/06 19:00:40 $ From sabre at nondot.org Tue Feb 6 13:06:54 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 13:06:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp Message-ID: <200702061906.l16J6spo031290@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: IntrinsicLowering.cpp updated: 1.65 -> 1.66 --- Log message: Two fixes: 1. Memset takes an i32 for the value to set, not i8. This was causing GCC to ICE all over the place (PR1183: http://llvm.org/PR1183 ). 2. memcpy/memmove were not properly zext/trunc'ing the size in some cases. --- Diffs of the changes: (+33 -38) IntrinsicLowering.cpp | 71 +++++++++++++++++++++++--------------------------- 1 files changed, 33 insertions(+), 38 deletions(-) Index: llvm/lib/CodeGen/IntrinsicLowering.cpp diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.65 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.66 --- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.65 Tue Feb 6 00:07:51 2007 +++ llvm/lib/CodeGen/IntrinsicLowering.cpp Tue Feb 6 13:06:38 2007 @@ -356,45 +356,29 @@ case Intrinsic::dbg_declare: break; // Simply strip out debugging intrinsics - case Intrinsic::memcpy_i32: { - static Constant *MemcpyFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new ZExtInst(Size, TD.getIntPtrType())); - ReplaceCallWith("memcpy", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemcpyFCache); - break; - } + case Intrinsic::memcpy_i32: case Intrinsic::memcpy_i64: { static Constant *MemcpyFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new TruncInst(Size, TD.getIntPtrType())); - ReplaceCallWith("memcpy", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemcpyFCache); - break; - } - case Intrinsic::memmove_i32: { - static Constant *MemmoveFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new ZExtInst(Size, TD.getIntPtrType())); - ReplaceCallWith("memmove", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemmoveFCache); + Value *Size = CI->getOperand(3); + const Type *IntPtr = TD.getIntPtrType(); + if (Size->getType()->getPrimitiveSizeInBits() < + IntPtr->getPrimitiveSizeInBits()) + Size = new ZExtInst(Size, IntPtr, "", CI); + else if (Size->getType()->getPrimitiveSizeInBits() > + IntPtr->getPrimitiveSizeInBits()) + Size = new TruncInst(Size, IntPtr, "", CI); + Value *Ops[3]; + Ops[0] = CI->getOperand(1); + Ops[1] = CI->getOperand(2); + Ops[2] = Size; + ReplaceCallWith("memcpy", CI, Ops, Ops+3, CI->getOperand(1)->getType(), + MemcpyFCache); break; } + case Intrinsic::memmove_i32: case Intrinsic::memmove_i64: { static Constant *MemmoveFCache = 0; - Value * Size = cast(CI->op_end()-1); - if (Size->getType() != TD.getIntPtrType()) - Size->replaceAllUsesWith(new TruncInst(Size, TD.getIntPtrType())); - ReplaceCallWith("memmove", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemmoveFCache); - break; - } - case Intrinsic::memset_i32: { - static Constant *MemsetFCache = 0; - Value *Size = cast(CI->op_end()-1); + Value *Size = CI->getOperand(3); const Type *IntPtr = TD.getIntPtrType(); if (Size->getType()->getPrimitiveSizeInBits() < IntPtr->getPrimitiveSizeInBits()) @@ -402,12 +386,18 @@ else if (Size->getType()->getPrimitiveSizeInBits() > IntPtr->getPrimitiveSizeInBits()) Size = new TruncInst(Size, IntPtr, "", CI); - ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemsetFCache); + Value *Ops[3]; + Ops[0] = CI->getOperand(1); + Ops[1] = CI->getOperand(2); + Ops[2] = Size; + ReplaceCallWith("memmove", CI, Ops, Ops+3, CI->getOperand(1)->getType(), + MemmoveFCache); + break; } + case Intrinsic::memset_i32: case Intrinsic::memset_i64: { static Constant *MemsetFCache = 0; - Value *Size = cast(CI->op_end()-1); + Value *Size = CI->getOperand(3); const Type *IntPtr = TD.getIntPtrType(); if (Size->getType()->getPrimitiveSizeInBits() < IntPtr->getPrimitiveSizeInBits()) @@ -415,8 +405,13 @@ else if (Size->getType()->getPrimitiveSizeInBits() > IntPtr->getPrimitiveSizeInBits()) Size = new TruncInst(Size, IntPtr, "", CI); - ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1, - (*(CI->op_begin()+1))->getType(), MemsetFCache); + Value *Ops[3]; + Ops[0] = CI->getOperand(1); + // Extend the amount to i32. + Ops[1] = new ZExtInst(CI->getOperand(2), Type::Int32Ty, "", CI); + Ops[2] = Size; + ReplaceCallWith("memset", CI, Ops, Ops+3, CI->getOperand(1)->getType(), + MemsetFCache); break; } case Intrinsic::sqrt_f32: { From clattner at apple.com Tue Feb 6 13:09:55 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 6 Feb 2007 11:09:55 -0800 Subject: [llvm-commits] CVS: llvm/utils/TableGen/Makefile In-Reply-To: <200702061851.l16Ipm8J030782@zion.cs.uiuc.edu> References: <200702061851.l16Ipm8J030782@zion.cs.uiuc.edu> Message-ID: <729CD0FE-ED82-4BD1-9415-304AA8C635B4@apple.com> On Feb 6, 2007, at 10:51 AM, Reid Spencer wrote: > > > Changes in directory llvm/utils/TableGen: > > Makefile updated: 1.19 -> 1.20 > --- > Log message: > > Set the new NO_INSTALL flag for build-only tools. Nice, thanks Reid! -Chris From rspencer at reidspencer.com Tue Feb 6 14:42:58 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 06 Feb 2007 12:42:58 -0800 Subject: [llvm-commits] [llvm-gcc] USELESS-BITCASTS.patch (please apply) Message-ID: <1170794578.27507.73.camel@bashful.x10sys.com> Here's a small patch to llvm-convert.cpp that prevents llvm-gcc from creating useless bit casts. It just checks to make sure that the types are different before inserting a cast. This saves a bit of memory and gives InstCombine less work to do as these useless casts were being inserted in numerous places only to be stripped out again later. Reid. -------------- next part -------------- A non-text attachment was scrubbed... Name: USELESS-BITCAST.patch Type: text/x-patch Size: 2969 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/986ada8c/attachment.bin From lauro.venancio at gmail.com Tue Feb 6 17:04:14 2007 From: lauro.venancio at gmail.com (Lauro Ramos Venancio) Date: Tue, 6 Feb 2007 20:04:14 -0300 Subject: [llvm-commits] [patch] Intruction Constraint DestReg!=SrcReg (for review) In-Reply-To: <9c10c9f0702060851l390774c8r41c1d0aaee4ab022@mail.gmail.com> References: <9c10c9f0701251354h301eb289ia694c8c13ab8f8ff@mail.gmail.com> <361E3BFE-3731-4265-80BC-AF188AD64221@apple.com> <9c10c9f0701260609k187731bbk43861f093f7a0a5d@mail.gmail.com> <9CDB5C80-39C7-43E8-82E3-FEA6DF0E81A3@apple.com> <9c10c9f0701261307h62e7c5edu70edcab0d83e36a6@mail.gmail.com> <921821FF-A916-45EA-9ECD-F1120DF20EFD@apple.com> <9c10c9f0702060851l390774c8r41c1d0aaee4ab022@mail.gmail.com> Message-ID: <9c10c9f0702061504r431e4444qb942111d3c99fd25@mail.gmail.com> The read_latency.patch is incomplete. I forgot to deal with spill live intervals. Lauro 2007/2/6, Lauro Ramos Venancio : > READ_LATENCY patch for review. > > Sample of use: > class RegConstraint { > string Constraints = C; > } > > // AI_orr - Defines a (op r, r) pattern. > class AI_orr > : AI<(ops GPR:$dst, GPR:$a, GPR:$b), > !strconcat(opc, " $dst, $a, $b"), > [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>, > RegConstraint<"$a lat 2">; > > > Lauro > > 2007/1/26, Evan Cheng : > > > > On Jan 26, 2007, at 1:07 PM, Lauro Ramos Venancio wrote: > > > > >> The facility does that have to be that general. There are 4 cycles > > >> between every two instructions. See LiveIntervalAnalysis: > > >> > > >> struct InstrSlots { > > >> enum { > > >> LOAD = 0, > > >> USE = 1, > > >> DEF = 2, > > >> STORE = 3, > > >> NUM = 4 > > >> }; > > >> }; > > >> > > >> We can restrict the constraint range to 1 - 3. This ensures the last > > >> use is always the kill while retaining its flexibility. > > >> > > >> Evan > > > > > > I will try to implement this. Do you have any suggestion for > > > constraint name and syntax? > > > > I don't have any great ideas. Perhaps READ_LATENCY for constraint and > > something like > > > > $src +lat 2 > > > > for syntax? > > > > Feel free to choose something else if you have better ideas. > > > > Thanks, > > > > Evan > > > > > > > > Lauro > > > > > > -------------- next part -------------- A non-text attachment was scrubbed... Name: read_latency2.patch Type: text/x-patch Size: 13820 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/b0edea93/attachment.bin From evan.cheng at apple.com Tue Feb 6 18:07:21 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 6 Feb 2007 18:07:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.cpp ARMInstrThumb.td ARMRegisterInfo.cpp README-Thumb.txt Message-ID: <200702070007.l1707LmL010497@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMInstrInfo.cpp updated: 1.15 -> 1.16 ARMInstrThumb.td updated: 1.13 -> 1.14 ARMRegisterInfo.cpp updated: 1.58 -> 1.59 README-Thumb.txt updated: 1.5 -> 1.6 --- Log message: Spill / restore should avoid modifying the condition register. --- Diffs of the changes: (+64 -36) ARMInstrInfo.cpp | 4 +-- ARMInstrThumb.td | 10 +++++++ ARMRegisterInfo.cpp | 69 ++++++++++++++++++++++++++-------------------------- README-Thumb.txt | 17 ++++++++++++ 4 files changed, 64 insertions(+), 36 deletions(-) Index: llvm/lib/Target/ARM/ARMInstrInfo.cpp diff -u llvm/lib/Target/ARM/ARMInstrInfo.cpp:1.15 llvm/lib/Target/ARM/ARMInstrInfo.cpp:1.16 --- llvm/lib/Target/ARM/ARMInstrInfo.cpp:1.15 Tue Jan 30 02:22:33 2007 +++ llvm/lib/Target/ARM/ARMInstrInfo.cpp Tue Feb 6 18:06:56 2007 @@ -83,7 +83,7 @@ return MI->getOperand(0).getReg(); } break; - case ARM::tLDRspi: + case ARM::tRestore: if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() && MI->getOperand(2).getImmedValue() == 0) { @@ -117,7 +117,7 @@ return MI->getOperand(0).getReg(); } break; - case ARM::tSTRspi: + case ARM::tSpill: if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() && MI->getOperand(2).getImmedValue() == 0) { Index: llvm/lib/Target/ARM/ARMInstrThumb.td diff -u llvm/lib/Target/ARM/ARMInstrThumb.td:1.13 llvm/lib/Target/ARM/ARMInstrThumb.td:1.14 --- llvm/lib/Target/ARM/ARMInstrThumb.td:1.13 Wed Jan 31 21:04:49 2007 +++ llvm/lib/Target/ARM/ARMInstrThumb.td Tue Feb 6 18:06:56 2007 @@ -239,6 +239,11 @@ "ldr $dst, $addr", [(set GPR:$dst, (load t_addrmode_sp:$addr))]>; +// Special instruction for restore. It cannot clobber condition register +// when it's expanded by eliminateCallFramePseudoInstr(). +def tRestore : TIs<(ops GPR:$dst, t_addrmode_sp:$addr), + "ldr $dst, $addr", []>; + // Load tconstpool def tLDRpci : TIs<(ops GPR:$dst, i32imm:$addr), "ldr $dst, $addr", @@ -261,6 +266,11 @@ def tSTRspi : TIs<(ops GPR:$src, t_addrmode_sp:$addr), "str $src, $addr", [(store GPR:$src, t_addrmode_sp:$addr)]>; + +// Special instruction for spill. It cannot clobber condition register +// when it's expanded by eliminateCallFramePseudoInstr(). +def tSpill : TIs<(ops GPR:$src, t_addrmode_sp:$addr), + "str $src, $addr", []>; } //===----------------------------------------------------------------------===// Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.58 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.59 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.58 Tue Feb 6 00:13:29 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 6 18:06:56 2007 @@ -130,7 +130,7 @@ MachineFunction &MF = *MBB.getParent(); ARMFunctionInfo *AFI = MF.getInfo(); if (AFI->isThumbFunction()) - BuildMI(MBB, I, TII.get(ARM::tSTRspi)).addReg(SrcReg) + BuildMI(MBB, I, TII.get(ARM::tSpill)).addReg(SrcReg) .addFrameIndex(FI).addImm(0); else BuildMI(MBB, I, TII.get(ARM::STR)).addReg(SrcReg) @@ -153,7 +153,7 @@ MachineFunction &MF = *MBB.getParent(); ARMFunctionInfo *AFI = MF.getInfo(); if (AFI->isThumbFunction()) - BuildMI(MBB, I, TII.get(ARM::tLDRspi), DestReg) + BuildMI(MBB, I, TII.get(ARM::tRestore), DestReg) .addFrameIndex(FI).addImm(0); else BuildMI(MBB, I, TII.get(ARM::LDR), DestReg) @@ -220,16 +220,16 @@ if (OpNum == 0) { // move -> store unsigned SrcReg = MI->getOperand(1).getReg(); if (!isLowRegister(SrcReg)) - // tSTRspi cannot take a high register operand. + // tSpill cannot take a high register operand. break; - NewMI = BuildMI(TII.get(ARM::tSTRspi)).addReg(SrcReg).addFrameIndex(FI) + NewMI = BuildMI(TII.get(ARM::tSpill)).addReg(SrcReg).addFrameIndex(FI) .addImm(0); } else { // move -> load unsigned DstReg = MI->getOperand(0).getReg(); if (!isLowRegister(DstReg)) - // tLDRspi cannot target a high register operand. + // tRestore cannot target a high register operand. break; - NewMI = BuildMI(TII.get(ARM::tLDRspi), DstReg).addFrameIndex(FI) + NewMI = BuildMI(TII.get(ARM::tRestore), DstReg).addFrameIndex(FI) .addImm(0); } break; @@ -412,7 +412,7 @@ if (isSub) Bytes = -NumBytes; bool isMul4 = (Bytes & 3) == 0; bool isTwoAddr = false; - bool DstNeBase = false; + bool DstNotEqBase = false; unsigned NumBits = 1; unsigned Scale = 1; int Opc = 0; @@ -441,14 +441,14 @@ // r1 = sub sp, c // r8 = sub sp, c if (DestReg != BaseReg) - DstNeBase = true; + DstNotEqBase = true; NumBits = 8; Opc = isSub ? ARM::tSUBi8 : ARM::tADDi8; isTwoAddr = true; } unsigned NumMIs = calcNumMI(Opc, ExtraOpc, Bytes, NumBits, Scale); - unsigned Threshold = (DestReg == ARM::SP) ? 4 : 3; + unsigned Threshold = (DestReg == ARM::SP) ? 3 : 2; if (NumMIs > Threshold) { // This will expand into too many instructions. Load the immediate from a // constpool entry. @@ -456,7 +456,7 @@ return; } - if (DstNeBase) { + if (DstNotEqBase) { if (isLowRegister(DestReg) && isLowRegister(BaseReg)) { // If both are low registers, emit DestReg = add BaseReg, max(Imm, 7) unsigned Chunk = (1 << 3) - 1; @@ -730,27 +730,20 @@ isSub = true; } - if (!isSub || !isThumb) { - MachineOperand &ImmOp = MI.getOperand(ImmIdx); - int ImmedOffset = Offset / Scale; - unsigned Mask = (1 << NumBits) - 1; - if ((unsigned)Offset <= Mask * Scale) { - // Replace the FrameIndex with sp - MI.getOperand(i).ChangeToRegister(FrameReg, false); - if (isSub) - ImmedOffset |= 1 << NumBits; - ImmOp.ChangeToImmediate(ImmedOffset); - return; - } + MachineOperand &ImmOp = MI.getOperand(ImmIdx); + int ImmedOffset = Offset / Scale; + unsigned Mask = (1 << NumBits) - 1; + if ((unsigned)Offset <= Mask * Scale) { + // Replace the FrameIndex with sp + MI.getOperand(i).ChangeToRegister(FrameReg, false); + if (isSub) + ImmedOffset |= 1 << NumBits; + ImmOp.ChangeToImmediate(ImmedOffset); + return; + } + if (!isThumb) { // Otherwise, it didn't fit. Pull in what we can to simplify the immed. - if (AddrMode == ARMII::AddrModeTs) { - // Thumb tLDRspi, tSTRspi. These will change to instructions that use - // a different base register. - NumBits = 5; - Mask = (1 << NumBits) - 1; - } - ImmedOffset = ImmedOffset & Mask; if (isSub) ImmedOffset |= 1 << NumBits; @@ -768,8 +761,12 @@ if (TII.isLoad(Opcode)) { // Use the destination register to materialize sp + offset. unsigned TmpReg = MI.getOperand(0).getReg(); - emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + if (Opcode == ARM::tRestore) + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, + isSub ? -Offset : Offset, TII); + else + emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, + isSub ? -Offset : Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tLDR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); MI.addRegOperand(0, false); // tLDR has an extra register operand. @@ -788,8 +785,12 @@ BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R2); TmpReg = ARM::R2; } - emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + if (Opcode == ARM::tSpill) + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, + isSub ? -Offset : Offset, TII); + else + emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, + isSub ? -Offset : Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tSTR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); MI.addRegOperand(0, false); // tSTR has an extra register operand. @@ -1098,7 +1099,7 @@ static bool isCSRestore(MachineInstr *MI, const unsigned *CSRegs) { return ((MI->getOpcode() == ARM::FLDD || MI->getOpcode() == ARM::LDR || - MI->getOpcode() == ARM::tLDRspi) && + MI->getOpcode() == ARM::tRestore) && MI->getOperand(1).isFrameIndex() && isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs)); } Index: llvm/lib/Target/ARM/README-Thumb.txt diff -u llvm/lib/Target/ARM/README-Thumb.txt:1.5 llvm/lib/Target/ARM/README-Thumb.txt:1.6 --- llvm/lib/Target/ARM/README-Thumb.txt:1.5 Wed Jan 31 20:46:20 2007 +++ llvm/lib/Target/ARM/README-Thumb.txt Tue Feb 6 18:06:56 2007 @@ -124,3 +124,20 @@ .align 2 L11: .long 642 + +//===---------------------------------------------------------------------===// + +When spilling in thumb mode and the sp offset is too large to fit in the ldr / +str offset field, we load the offset from a constpool entry and add it to sp: + +ldr r2, LCPI +add r2, sp +ldr r2, [r2] + +These instructions preserve the condition code which is important if the spill +is between a cmp and a bcc instruction. However, we can use the (potentially) +cheaper sequnce if we know it's ok to clobber the condition register. + +add r2, sp, #255 * 4 +add r2, #132 +ldr r2, [r2, #7 * 4] From sabre at nondot.org Tue Feb 6 18:56:15 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 18:56:15 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/DenseMap.h Message-ID: <200702070056.l170uFHs011323@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: DenseMap.h updated: 1.16 -> 1.17 --- Log message: Fix a really subtle bug where the entire hash table could fill with tombstones, causing subsequent insertions to infinitely loop. --- Diffs of the changes: (+23 -2) DenseMap.h | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-) Index: llvm/include/llvm/ADT/DenseMap.h diff -u llvm/include/llvm/ADT/DenseMap.h:1.16 llvm/include/llvm/ADT/DenseMap.h:1.17 --- llvm/include/llvm/ADT/DenseMap.h:1.16 Sat Feb 3 18:42:41 2007 +++ llvm/include/llvm/ADT/DenseMap.h Tue Feb 6 18:55:59 2007 @@ -28,6 +28,7 @@ //static bool isPod() }; +// Provide DenseMapKeyInfo for all pointers. template struct DenseMapKeyInfo { static inline T* getEmptyKey() { return (T*)-1; } @@ -51,6 +52,7 @@ BucketT *Buckets; unsigned NumEntries; + unsigned NumTombstones; DenseMap(const DenseMap &); // not implemented. public: explicit DenseMap(unsigned NumInitBuckets = 64) { @@ -96,6 +98,7 @@ } } assert(NumEntries == 0 && "Node count imbalance!"); + NumTombstones = 0; } /// count - Return true if the specified key is in the map. @@ -129,6 +132,7 @@ TheBucket->second.~ValueT(); TheBucket->first = getTombstoneKey(); --NumEntries; + ++NumTombstones; return true; } bool erase(iterator I) { @@ -136,6 +140,7 @@ TheBucket->second.~ValueT(); TheBucket->first = getTombstoneKey(); --NumEntries; + ++NumTombstones; return true; } @@ -150,12 +155,26 @@ private: BucketT *InsertIntoBucket(const KeyT &Key, const ValueT &Value, BucketT *TheBucket) { - // If the load of the hash table is more than 3/4, grow it. - if (NumEntries*4 >= NumBuckets*3) { + // If the load of the hash table is more than 3/4, or if fewer than 1/8 of + // the buckets are empty (meaning that many are filled with tombstones), + // grow the table. + // + // The later case is tricky. For example, if we had one empty bucket with + // tons of tombstones, failing lookups (e.g. for insertion) would have to + // probe almost the entire table until it found the empty bucket. If the + // table completely filled with tombstones, no lookup would ever succeed, + // causing infinite loops in lookup. + if (NumEntries*4 >= NumBuckets*3 || + NumBuckets-(NumEntries+NumTombstones) < NumBuckets/8) { this->grow(); LookupBucketFor(Key, TheBucket); } ++NumEntries; + + // If we are writing over a tombstone, remember this. + if (TheBucket->first != getEmptyKey()) + --NumTombstones; + TheBucket->first = Key; new (&TheBucket->second) ValueT(Value); return TheBucket; @@ -218,6 +237,7 @@ void init(unsigned InitBuckets) { NumEntries = 0; + NumTombstones = 0; NumBuckets = InitBuckets; assert(InitBuckets && (InitBuckets & InitBuckets-1) == 0 && "# initial buckets must be a power of two!"); @@ -234,6 +254,7 @@ // Double the number of buckets. NumBuckets <<= 1; + NumTombstones = 0; Buckets = (BucketT*)new char[sizeof(BucketT)*NumBuckets]; // Initialize all the keys to EmptyKey. From sabre at nondot.org Tue Feb 6 19:11:41 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 19:11:41 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/SmallPtrSet.h Message-ID: <200702070111.l171BfQ9011607@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: SmallPtrSet.h updated: 1.6 -> 1.7 --- Log message: do not let the table fill up with tombstones. --- Diffs of the changes: (+2 -0) SmallPtrSet.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/include/llvm/ADT/SmallPtrSet.h diff -u llvm/include/llvm/ADT/SmallPtrSet.h:1.6 llvm/include/llvm/ADT/SmallPtrSet.h:1.7 --- llvm/include/llvm/ADT/SmallPtrSet.h:1.6 Sat Jan 27 17:52:33 2007 +++ llvm/include/llvm/ADT/SmallPtrSet.h Tue Feb 6 19:11:24 2007 @@ -51,6 +51,7 @@ // If small, this is # elts allocated consequtively unsigned NumElements; + unsigned NumTombstones; void *SmallArray[1]; // Must be last ivar. public: SmallPtrSetImpl(unsigned SmallSize) { @@ -82,6 +83,7 @@ // Fill the array with empty markers. memset(CurArray, -1, CurArraySize*sizeof(void*)); NumElements = 0; + NumTombstones = 0; } /// insert - This returns true if the pointer was new to the set, false if it From sabre at nondot.org Tue Feb 6 19:11:42 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 19:11:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp Message-ID: <200702070111.l171Bgiu011613@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: SmallPtrSet.cpp updated: 1.4 -> 1.5 --- Log message: do not let the table fill up with tombstones. --- Diffs of the changes: (+5 -1) SmallPtrSet.cpp | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/lib/Support/SmallPtrSet.cpp diff -u llvm/lib/Support/SmallPtrSet.cpp:1.4 llvm/lib/Support/SmallPtrSet.cpp:1.5 --- llvm/lib/Support/SmallPtrSet.cpp:1.4 Mon Feb 5 17:10:31 2007 +++ llvm/lib/Support/SmallPtrSet.cpp Tue Feb 6 19:11:25 2007 @@ -32,7 +32,8 @@ } // If more than 3/4 of the array is full, grow. - if (NumElements*4 >= CurArraySize*3) + if (NumElements*4 >= CurArraySize*3 || + CurArraySize-(NumElements+NumTombstones) < CurArraySize/8) Grow(); // Okay, we know we have space. Find a hash bucket. @@ -40,6 +41,8 @@ if (*Bucket == Ptr) return false; // Already inserted, good. // Otherwise, insert it! + if (*Bucket == getTombstoneMarker()) + --NumTombstones; *Bucket = Ptr; ++NumElements; // Track density. return true; @@ -69,6 +72,7 @@ // Set this as a tombstone. *Bucket = getTombstoneMarker(); --NumElements; + ++NumTombstones; return true; } From sabre at nondot.org Tue Feb 6 19:15:20 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 19:15:20 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Message-ID: <200702070115.l171FK9C011717@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: PromoteMemoryToRegister.cpp updated: 1.92 -> 1.93 --- Log message: redesign the primary datastructure used by mem2reg to eliminate an std::map of std::vector's (ouch!). This speeds up mem2reg by 10% on 176.gcc. --- Diffs of the changes: (+157 -104) PromoteMemoryToRegister.cpp | 261 ++++++++++++++++++++++++++------------------ 1 files changed, 157 insertions(+), 104 deletions(-) Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.92 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.93 --- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.92 Mon Feb 5 17:37:20 2007 +++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Tue Feb 6 19:15:04 2007 @@ -32,6 +32,23 @@ #include using namespace llvm; +// Provide DenseMapKeyInfo for all pointers. +namespace llvm { +template<> +struct DenseMapKeyInfo > { + static inline std::pair getEmptyKey() { + return std::make_pair((BasicBlock*)-1, ~0U); + } + static inline std::pair getTombstoneKey() { + return std::make_pair((BasicBlock*)-2, 0U); + } + static unsigned getHashValue(const std::pair &Val) { + return DenseMapKeyInfo::getHashValue(Val.first) + Val.second*2; + } + static bool isPod() { return true; } +}; +} + /// isAllocaPromotable - Return true if this alloca is legal for promotion. /// This is true if there are only loads and stores to the alloca. /// @@ -74,8 +91,12 @@ /// NewPhiNodes - The PhiNodes we're adding. /// - std::map > NewPhiNodes; - + DenseMap, PHINode*> NewPhiNodes; + + /// PhiToAllocaMap - For each PHI node, keep track of which entry in Allocas + /// it corresponds to. + DenseMap PhiToAllocaMap; + /// PointerAllocaValues - If we are updating an AliasSetTracker, then for /// each alloca that is of pointer type, we keep track of what to copyValue /// to the inserted PHI nodes here. @@ -322,23 +343,14 @@ for (SmallPtrSet::iterator I = InsertedPHINodes.begin(), E = InsertedPHINodes.end(); I != E; ++I) { PHINode *PN = *I; - std::vector &BBPNs = NewPhiNodes[PN->getParent()]; - BBPNs[AllocaNum] = 0; - - // Check to see if we just removed the last inserted PHI node from this - // basic block. If so, remove the entry for the basic block. - bool HasOtherPHIs = false; - for (unsigned i = 0, e = BBPNs.size(); i != e; ++i) - if (BBPNs[i]) { - HasOtherPHIs = true; - break; - } - if (!HasOtherPHIs) - NewPhiNodes.erase(PN->getParent()); - + bool Erased=NewPhiNodes.erase(std::make_pair(PN->getParent(), AllocaNum)); + Erased=Erased; + assert(Erased && "PHI already removed?"); + if (AST && isa(PN->getType())) AST->deleteValue(PN); PN->eraseFromParent(); + PhiToAllocaMap.erase(PN); } // Keep the reverse mapping of the 'Allocas' array. @@ -407,26 +419,24 @@ while (EliminatedAPHI) { EliminatedAPHI = false; - for (std::map >::iterator I = - NewPhiNodes.begin(), E = NewPhiNodes.end(); I != E; ++I) { - std::vector &PNs = I->second; - for (unsigned i = 0, e = PNs.size(); i != e; ++i) { - if (!PNs[i]) continue; - - // If this PHI node merges one value and/or undefs, get the value. - if (Value *V = PNs[i]->hasConstantValue(true)) { - if (!isa(V) || - properlyDominates(cast(V), PNs[i])) { - if (AST && isa(PNs[i]->getType())) - AST->deleteValue(PNs[i]); - PNs[i]->replaceAllUsesWith(V); - PNs[i]->eraseFromParent(); - PNs[i] = 0; - EliminatedAPHI = true; - continue; - } + for (DenseMap, PHINode*>::iterator I = + NewPhiNodes.begin(), E = NewPhiNodes.end(); I != E;) { + PHINode *PN = I->second; + + // If this PHI node merges one value and/or undefs, get the value. + if (Value *V = PN->hasConstantValue(true)) { + if (!isa(V) || + properlyDominates(cast(V), PN)) { + if (AST && isa(PN->getType())) + AST->deleteValue(PN); + PN->replaceAllUsesWith(V); + PN->eraseFromParent(); + NewPhiNodes.erase(I++); + EliminatedAPHI = true; + continue; } } + ++I; } } @@ -436,52 +446,58 @@ // have incoming values for all predecessors. Loop over all PHI nodes we have // created, inserting undef values if they are missing any incoming values. // - for (std::map >::iterator I = + for (DenseMap, PHINode*>::iterator I = NewPhiNodes.begin(), E = NewPhiNodes.end(); I != E; ++I) { + // We want to do this once per basic block. As such, only process a block + // when we find the PHI that is the first entry in the block. + PHINode *SomePHI = I->second; + BasicBlock *BB = SomePHI->getParent(); + if (&BB->front() != SomePHI) + continue; - std::vector Preds(pred_begin(I->first), pred_end(I->first)); - std::vector &PNs = I->second; - assert(!PNs.empty() && "Empty PHI node list??"); - PHINode *SomePHI = 0; - for (unsigned i = 0, e = PNs.size(); i != e; ++i) - if (PNs[i]) { - SomePHI = PNs[i]; - break; - } + // Count the number of preds for BB. + SmallVector Preds(pred_begin(BB), pred_end(BB)); // Only do work here if there the PHI nodes are missing incoming values. We // know that all PHI nodes that were inserted in a block will have the same - // number of incoming values, so we can just check any PHI node. - if (SomePHI && Preds.size() != SomePHI->getNumIncomingValues()) { - // Ok, now we know that all of the PHI nodes are missing entries for some - // basic blocks. Start by sorting the incoming predecessors for efficient - // access. - std::sort(Preds.begin(), Preds.end()); - - // Now we loop through all BB's which have entries in SomePHI and remove - // them from the Preds list. - for (unsigned i = 0, e = SomePHI->getNumIncomingValues(); i != e; ++i) { - // Do a log(n) search of the Preds list for the entry we want. - std::vector::iterator EntIt = - std::lower_bound(Preds.begin(), Preds.end(), - SomePHI->getIncomingBlock(i)); - assert(EntIt != Preds.end() && *EntIt == SomePHI->getIncomingBlock(i)&& - "PHI node has entry for a block which is not a predecessor!"); - - // Remove the entry - Preds.erase(EntIt); - } - - // At this point, the blocks left in the preds list must have dummy - // entries inserted into every PHI nodes for the block. - for (unsigned i = 0, e = PNs.size(); i != e; ++i) - if (PHINode *PN = PNs[i]) { - Value *UndefVal = UndefValue::get(PN->getType()); - for (unsigned pred = 0, e = Preds.size(); pred != e; ++pred) - PN->addIncoming(UndefVal, Preds[pred]); - } + // number of incoming values, so we can just check any of them. + if (SomePHI->getNumIncomingValues() == Preds.size()) + continue; + + // Ok, now we know that all of the PHI nodes are missing entries for some + // basic blocks. Start by sorting the incoming predecessors for efficient + // access. + std::sort(Preds.begin(), Preds.end()); + + // Now we loop through all BB's which have entries in SomePHI and remove + // them from the Preds list. + for (unsigned i = 0, e = SomePHI->getNumIncomingValues(); i != e; ++i) { + // Do a log(n) search of the Preds list for the entry we want. + SmallVector::iterator EntIt = + std::lower_bound(Preds.begin(), Preds.end(), + SomePHI->getIncomingBlock(i)); + assert(EntIt != Preds.end() && *EntIt == SomePHI->getIncomingBlock(i)&& + "PHI node has entry for a block which is not a predecessor!"); + + // Remove the entry + Preds.erase(EntIt); + } + + // At this point, the blocks left in the preds list must have dummy + // entries inserted into every PHI nodes for the block. Update all the phi + // nodes in this block that we are inserting (there could be phis before + // mem2reg runs). + unsigned NumBadPreds = SomePHI->getNumIncomingValues(); + BasicBlock::iterator BBI = BB->begin(); + while ((SomePHI = dyn_cast(BBI++)) && + SomePHI->getNumIncomingValues() == NumBadPreds) { + Value *UndefVal = UndefValue::get(SomePHI->getType()); + for (unsigned pred = 0, e = Preds.size(); pred != e; ++pred) + SomePHI->addIncoming(UndefVal, Preds[pred]); } } + + NewPhiNodes.clear(); } // MarkDominatingPHILive - Mem2Reg wants to construct "pruned" SSA form, not @@ -498,11 +514,11 @@ // PHI node for Alloca num. If we find it, mark the PHI node as being alive! for (DominatorTree::Node *N = DT[BB]; N; N = N->getIDom()) { BasicBlock *DomBB = N->getBlock(); - std::map >::iterator - I = NewPhiNodes.find(DomBB); - if (I != NewPhiNodes.end() && I->second[AllocaNum]) { + DenseMap, PHINode*>::iterator + I = NewPhiNodes.find(std::make_pair(DomBB, AllocaNum)); + if (I != NewPhiNodes.end()) { // Ok, we found an inserted PHI node which dominates this value. - PHINode *DominatingPHI = I->second[AllocaNum]; + PHINode *DominatingPHI = I->second; // Find out if we previously thought it was dead. If so, mark it as being // live by removing it from the DeadPHINodes set. @@ -636,18 +652,18 @@ unsigned &Version, SmallPtrSet &InsertedPHINodes) { // Look up the basic-block in question. - std::vector &BBPNs = NewPhiNodes[BB]; - if (BBPNs.empty()) BBPNs.resize(Allocas.size()); + PHINode *&PN = NewPhiNodes[std::make_pair(BB, AllocaNo)]; // If the BB already has a phi node added for the i'th alloca then we're done! - if (BBPNs[AllocaNo]) return false; + if (PN) return false; // Create a PhiNode using the dereferenced type... and add the phi-node to the // BasicBlock. - PHINode *PN = new PHINode(Allocas[AllocaNo]->getAllocatedType(), - Allocas[AllocaNo]->getName() + "." + - utostr(Version++), BB->begin()); - BBPNs[AllocaNo] = PN; + PN = new PHINode(Allocas[AllocaNo]->getAllocatedType(), + Allocas[AllocaNo]->getName() + "." + + utostr(Version++), BB->begin()); + PhiToAllocaMap[PN] = AllocaNo; + InsertedPHINodes.insert(PN); if (AST && isa(PN->getType())) @@ -663,28 +679,65 @@ // void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred, std::vector &IncomingVals) { - - // If this BB needs a PHI node, update the PHI node for each variable we need - // PHI nodes for. - std::map >::iterator - BBPNI = NewPhiNodes.find(BB); - if (BBPNI != NewPhiNodes.end()) { - std::vector &BBPNs = BBPNI->second; - for (unsigned k = 0; k != BBPNs.size(); ++k) - if (PHINode *PN = BBPNs[k]) { - // Add this incoming value to the PHI node. - PN->addIncoming(IncomingVals[k], Pred); - - // The currently active variable for this block is now the PHI. - IncomingVals[k] = PN; + // If we are inserting any phi nodes into this BB, they will already be in the + // block. + if (PHINode *APN = dyn_cast(BB->begin())) { + // Pred may have multiple edges to BB. If so, we want to add N incoming + // values to each PHI we are inserting on the first time we see the edge. + // Check to see if APN already has incoming values from Pred. This also + // prevents us from modifying PHI nodes that are not currently being + // inserted. + bool HasPredEntries = false; + for (unsigned i = 0, e = APN->getNumIncomingValues(); i != e; ++i) { + if (APN->getIncomingBlock(i) == Pred) { + HasPredEntries = true; + break; } + } + + // If we have PHI nodes to update, compute the number of edges from Pred to + // BB. + if (!HasPredEntries) { + TerminatorInst *PredTerm = Pred->getTerminator(); + unsigned NumEdges = 0; + for (unsigned i = 0, e = PredTerm->getNumSuccessors(); i != e; ++i) { + if (PredTerm->getSuccessor(i) == BB) + ++NumEdges; + } + assert(NumEdges && "Must be at least one edge from Pred to BB!"); + + // Add entries for all the phis. + BasicBlock::iterator PNI = BB->begin(); + do { + unsigned AllocaNo = PhiToAllocaMap[APN]; + + // Add N incoming values to the PHI node. + for (unsigned i = 0; i != NumEdges; ++i) + APN->addIncoming(IncomingVals[AllocaNo], Pred); + + // The currently active variable for this block is now the PHI. + IncomingVals[AllocaNo] = APN; + + // Get the next phi node. + ++PNI; + APN = dyn_cast(PNI); + if (APN == 0) break; + + // Verify it doesn't already have entries for Pred. If it does, it is + // not being inserted by this mem2reg invocation. + HasPredEntries = false; + for (unsigned i = 0, e = APN->getNumIncomingValues(); i != e; ++i) { + if (APN->getIncomingBlock(i) == Pred) { + HasPredEntries = true; + break; + } + } + } while (!HasPredEntries); + } } - - // don't revisit nodes - if (Visited.count(BB)) return; - - // mark as visited - Visited.insert(BB); + + // Don't revisit blocks. + if (!Visited.insert(BB)) return; for (BasicBlock::iterator II = BB->begin(); !isa(II); ) { Instruction *I = II++; // get the instruction, increment iterator From evan.cheng at apple.com Tue Feb 6 20:44:38 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 6 Feb 2007 20:44:38 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702070244.l172icGS013396@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.59 -> 1.60 --- Log message: eliminateFrameIndex() is even more complicated if frame ptr is used instead of SP when there are dynamic alloca's. --- Diffs of the changes: (+34 -20) ARMRegisterInfo.cpp | 54 ++++++++++++++++++++++++++++++++-------------------- 1 files changed, 34 insertions(+), 20 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.59 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.60 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.59 Tue Feb 6 18:06:56 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 6 20:44:23 2007 @@ -366,27 +366,35 @@ void emitThumbRegPlusConstPool(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, unsigned DestReg, unsigned BaseReg, - int NumBytes, const TargetInstrInfo &TII) { + int NumBytes, bool CanChangeCC, + const TargetInstrInfo &TII) { MachineFunction &MF = *MBB.getParent(); MachineConstantPool *ConstantPool = MF.getConstantPool(); bool isHigh = !isLowRegister(DestReg) || !isLowRegister(BaseReg); bool isSub = false; // Subtract doesn't have high register version. Load the negative value - // if either base or dest register is a high register. - if (NumBytes < 0 && !isHigh) { + // if either base or dest register is a high register. Also, if do not + // issue sub as part of the sequence if condition register is to be + // preserved. + if (NumBytes < 0 && !isHigh && CanChangeCC) { isSub = true; NumBytes = -NumBytes; } - Constant *C = ConstantInt::get(Type::Int32Ty, NumBytes); - unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2); unsigned LdReg = DestReg; if (DestReg == ARM::SP) { assert(BaseReg == ARM::SP && "Unexpected!"); LdReg = ARM::R3; BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3); } - // Load the constant. - BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), LdReg).addConstantPoolIndex(Idx); + + if (NumBytes <= 255 && NumBytes >= 0) + BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); + else { + // Load the constant. + Constant *C = ConstantInt::get(Type::Int32Ty, NumBytes); + unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2); + BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), LdReg).addConstantPoolIndex(Idx); + } // Emit add / sub. int Opc = (isSub) ? ARM::tSUBrr : (isHigh ? ARM::tADDhirr : ARM::tADDrr); const MachineInstrBuilder MIB = BuildMI(MBB, MBBI, TII.get(Opc), DestReg); @@ -452,7 +460,7 @@ if (NumMIs > Threshold) { // This will expand into too many instructions. Load the immediate from a // constpool entry. - emitThumbRegPlusConstPool(MBB, MBBI, DestReg, BaseReg, NumBytes, TII); + emitThumbRegPlusConstPool(MBB, MBBI, DestReg, BaseReg, NumBytes, true, TII); return; } @@ -713,8 +721,8 @@ case ARMII::AddrModeTs: { ImmIdx = i+1; InstrOffs = MI.getOperand(ImmIdx).getImm(); - NumBits = (FrameReg == ARM::SP) ? 8 : 5; - Scale = 4; + NumBits = isSub ? 3 : ((FrameReg == ARM::SP) ? 8 : 5); + Scale = isSub ? 1 : 4; break; } default: @@ -725,11 +733,12 @@ Offset += InstrOffs * Scale; assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!"); - if (Offset < 0) { + if (Offset < 0 && !isThumb) { Offset = -Offset; isSub = true; } + // Common case: small offset, fits into instruction. MachineOperand &ImmOp = MI.getOperand(ImmIdx); int ImmedOffset = Offset / Scale; unsigned Mask = (1 << NumBits) - 1; @@ -742,7 +751,16 @@ return; } - if (!isThumb) { + // If this is a thumb spill / restore, we will be using a constpool load to + // materialize the offset. + bool isThumSpillRestore = Opcode == ARM::tRestore || Opcode == ARM::tSpill; + if (AddrMode == ARMII::AddrModeTs || !isThumSpillRestore) { + if (AddrMode == ARMII::AddrModeTs) { + // Thumb tLDRspi, tSTRspi. These will change to instructions that use + // a different base register. + NumBits = 5; + Mask = (1 << NumBits) - 1; + } // Otherwise, it didn't fit. Pull in what we can to simplify the immed. ImmedOffset = ImmedOffset & Mask; if (isSub) @@ -762,11 +780,9 @@ // Use the destination register to materialize sp + offset. unsigned TmpReg = MI.getOperand(0).getReg(); if (Opcode == ARM::tRestore) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, Offset, false, TII); else - emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tLDR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); MI.addRegOperand(0, false); // tLDR has an extra register operand. @@ -786,11 +802,9 @@ TmpReg = ARM::R2; } if (Opcode == ARM::tSpill) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, Offset, false, TII); else - emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, - isSub ? -Offset : Offset, TII); + emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tSTR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); MI.addRegOperand(0, false); // tSTR has an extra register operand. From reid at x10sys.com Tue Feb 6 21:29:45 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 6 Feb 2007 21:29:45 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200702070329.l173TjAj014152@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.422 -> 1.423 --- Log message: Remove a spurious ; --- Diffs of the changes: (+1 -1) Makefile.rules | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.422 llvm/Makefile.rules:1.423 --- llvm/Makefile.rules:1.422 Tue Feb 6 12:53:14 2007 +++ llvm/Makefile.rules Tue Feb 6 21:29:29 2007 @@ -590,7 +590,7 @@ $(MKDIR) $(@D); \ $(CP) $(PROJ_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \ fi; \ - $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) ; + $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) endif #--------------------------------------------------------- From sabre at nondot.org Tue Feb 6 22:39:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 22:39:51 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-dis/llvm-dis.cpp Message-ID: <200702070439.l174dpDb015468@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-dis: llvm-dis.cpp updated: 1.54 -> 1.55 --- Log message: add an option for timing bc file reading. --- Diffs of the changes: (+12 -5) llvm-dis.cpp | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-) Index: llvm/tools/llvm-dis/llvm-dis.cpp diff -u llvm/tools/llvm-dis/llvm-dis.cpp:1.54 llvm/tools/llvm-dis/llvm-dis.cpp:1.55 --- llvm/tools/llvm-dis/llvm-dis.cpp:1.54 Wed Dec 6 19:30:31 2006 +++ llvm/tools/llvm-dis/llvm-dis.cpp Tue Feb 6 22:39:35 2007 @@ -39,6 +39,9 @@ static cl::opt Force("f", cl::desc("Overwrite output files")); +static cl::opt +DontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden); + int main(int argc, char **argv) { llvm_shutdown_obj X; // Call llvm_shutdown() on exit. try { @@ -58,7 +61,9 @@ return 1; } - if (OutputFilename != "") { // Specified an output filename? + if (DontPrint) { + // Just use stdout. We won't actually print anything on it. + } else if (OutputFilename != "") { // Specified an output filename? if (OutputFilename != "-") { // Not stdout? if (!Force && std::ifstream(OutputFilename.c_str())) { // If force is not specified, make sure not to overwrite a file! @@ -102,10 +107,12 @@ } // All that llvm-dis does is write the assembly to a file. - PassManager Passes; - OStream L(*Out); - Passes.add(new PrintModulePass(&L)); - Passes.run(*M.get()); + if (!DontPrint) { + PassManager Passes; + OStream L(*Out); + Passes.add(new PrintModulePass(&L)); + Passes.run(*M.get()); + } if (Out != &std::cout) { ((std::ofstream*)Out)->close(); From sabre at nondot.org Tue Feb 6 23:08:55 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:08:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Reader.h Message-ID: <200702070508.l1758te0016295@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.31 -> 1.32 Reader.cpp updated: 1.230 -> 1.231 Reader.h updated: 1.44 -> 1.45 --- Log message: Eliminate std::vectors from the bcanalyzer interface. --- Diffs of the changes: (+45 -32) Analyzer.cpp | 28 ++++++++++++++-------------- Reader.cpp | 45 +++++++++++++++++++++++++++++---------------- Reader.h | 4 ++-- 3 files changed, 45 insertions(+), 32 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.31 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.32 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.31 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Tue Feb 6 23:08:39 2007 @@ -359,13 +359,13 @@ } virtual bool handleInstruction( unsigned Opcode, const Type* iType, - std::vector& Operands, + unsigned *Operands, unsigned NumOps, Instruction *Inst, unsigned Size){ if (os) { *os << " INST: OpCode=" << Instruction::getOpcodeName(Opcode); - for ( unsigned i = 0; i < Operands.size(); ++i ) + for (unsigned i = 0; i != NumOps; ++i) *os << " Op(" << Operands[i] << ")"; *os << *Inst; } @@ -374,15 +374,15 @@ bca.numValues++; bca.instructionSize += Size; if (Size > 4 ) bca.longInstructions++; - bca.numOperands += Operands.size(); - for (unsigned i = 0; i < Operands.size(); ++i ) + bca.numOperands += NumOps; + for (unsigned i = 0; i != NumOps; ++i) if (Operands[i] > bca.maxValueSlot) bca.maxValueSlot = Operands[i]; if ( currFunc ) { currFunc->numInstructions++; currFunc->instructionSize += Size; if (Size > 4 ) currFunc->longInstructions++; - if ( Opcode == Instruction::PHI ) currFunc->numPhis++; + if (Opcode == Instruction::PHI) currFunc->numPhis++; } return Instruction::isTerminator(Opcode); } @@ -397,11 +397,11 @@ *os << " BLOCK: GlobalConstants {\n"; } - virtual void handleConstantExpression( unsigned Opcode, - std::vector ArgVec, Constant* C ) { + virtual void handleConstantExpression(unsigned Opcode, + Constant**ArgVec, unsigned NumArgs, Constant* C) { if (os) { *os << " EXPR: " << Instruction::getOpcodeName(Opcode) << "\n"; - for ( unsigned i = 0; i < ArgVec.size(); ++i ) { + for ( unsigned i = 0; i != NumArgs; ++i ) { *os << " Arg#" << i << " "; ArgVec[i]->print(*os); *os << "\n"; } @@ -424,14 +424,14 @@ } virtual void handleConstantArray( const ArrayType* AT, - std::vector& Elements, + Constant**Elements, unsigned NumElts, unsigned TypeSlot, Constant* ArrayVal ) { if (os) { *os << " ARRAY: "; WriteTypeSymbolic(*os,AT,M); *os << " TypeSlot=" << TypeSlot << "\n"; - for ( unsigned i = 0; i < Elements.size(); ++i ) { + for (unsigned i = 0; i != NumElts; ++i) { *os << " #" << i; Elements[i]->print(*os); *os << "\n"; @@ -447,14 +447,14 @@ virtual void handleConstantStruct( const StructType* ST, - std::vector& Elements, + Constant**Elements, unsigned NumElts, Constant* StructVal) { if (os) { *os << " STRUC: "; WriteTypeSymbolic(*os,ST,M); *os << "\n"; - for ( unsigned i = 0; i < Elements.size(); ++i ) { + for ( unsigned i = 0; i != NumElts; ++i) { *os << " #" << i << " "; Elements[i]->print(*os); *os << "\n"; } @@ -468,7 +468,7 @@ virtual void handleConstantPacked( const PackedType* PT, - std::vector& Elements, + Constant**Elements, unsigned NumElts, unsigned TypeSlot, Constant* PackedVal) { @@ -476,7 +476,7 @@ *os << " PACKD: "; WriteTypeSymbolic(*os,PT,M); *os << " TypeSlot=" << TypeSlot << "\n"; - for ( unsigned i = 0; i < Elements.size(); ++i ) { + for ( unsigned i = 0; i != NumElts; ++i ) { *os << " #" << i; Elements[i]->print(*os); *os << "\n"; Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.230 llvm/lib/Bytecode/Reader/Reader.cpp:1.231 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.230 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Tue Feb 6 23:08:39 2007 @@ -366,7 +366,7 @@ /// This method parses a single instruction. The instruction is /// inserted at the end of the \p BB provided. The arguments of /// the instruction are provided in the \p Oprnds vector. -void BytecodeReader::ParseInstruction(std::vector &Oprnds, +void BytecodeReader::ParseInstruction(SmallVector &Oprnds, BasicBlock* BB) { BufPtr SaveAt = At; @@ -859,7 +859,8 @@ // We have enough info to inform the handler now. if (Handler) - Handler->handleInstruction(Opcode, InstTy, Oprnds, Result, At-SaveAt); + Handler->handleInstruction(Opcode, InstTy, &Oprnds[0], Oprnds.size(), + Result, At-SaveAt); insertValue(Result, TypeSlot, FunctionValues); } @@ -890,7 +891,7 @@ /// @returns the number of basic blocks encountered. unsigned BytecodeReader::ParseInstructionList(Function* F) { unsigned BlockNo = 0; - std::vector Args; + SmallVector Args; while (moreInBlock()) { if (Handler) Handler->handleBasicBlockBegin(BlockNo); @@ -941,7 +942,7 @@ if (Handler) Handler->handleValueSymbolTableBegin(CurrentFunction,VST); // Allow efficient basic block lookup by number. - std::vector BBMap; + SmallVector BBMap; if (CurrentFunction) for (Function::iterator I = CurrentFunction->begin(), E = CurrentFunction->end(); I != E; ++I) @@ -1166,26 +1167,30 @@ Constant *Result = ConstantExpr::getCast(Opcode, ArgVec[0], getType(TypeID)); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::GetElementPtr) { // GetElementPtr Constant *Result = ConstantExpr::getGetElementPtr(ArgVec[0], &ArgVec[1], ArgVec.size()-1); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::Select) { if (ArgVec.size() != 3) error("Select instruction must have three arguments."); Constant* Result = ConstantExpr::getSelect(ArgVec[0], ArgVec[1], ArgVec[2]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::ExtractElement) { if (ArgVec.size() != 2 || !ExtractElementInst::isValidOperands(ArgVec[0], ArgVec[1])) error("Invalid extractelement constand expr arguments"); Constant* Result = ConstantExpr::getExtractElement(ArgVec[0], ArgVec[1]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::InsertElement) { if (ArgVec.size() != 3 || @@ -1194,7 +1199,8 @@ Constant *Result = ConstantExpr::getInsertElement(ArgVec[0], ArgVec[1], ArgVec[2]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::ShuffleVector) { if (ArgVec.size() != 3 || @@ -1202,25 +1208,29 @@ error("Invalid shufflevector constant expr arguments."); Constant *Result = ConstantExpr::getShuffleVector(ArgVec[0], ArgVec[1], ArgVec[2]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::ICmp) { if (ArgVec.size() != 2) error("Invalid ICmp constant expr arguments."); unsigned predicate = read_vbr_uint(); Constant *Result = ConstantExpr::getICmp(predicate, ArgVec[0], ArgVec[1]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else if (Opcode == Instruction::FCmp) { if (ArgVec.size() != 2) error("Invalid FCmp constant expr arguments."); unsigned predicate = read_vbr_uint(); Constant *Result = ConstantExpr::getFCmp(predicate, ArgVec[0], ArgVec[1]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } else { // All other 2-operand expressions Constant* Result = ConstantExpr::get(Opcode, ArgVec[0], ArgVec[1]); - if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); + if (Handler) Handler->handleConstantExpression(Opcode, &ArgVec[0], + ArgVec.size(), Result); return Result; } } @@ -1273,7 +1283,8 @@ Elements.push_back(getConstantValue(TypeSlot, read_vbr_uint())); Result = ConstantArray::get(AT, Elements); - if (Handler) Handler->handleConstantArray(AT, Elements, TypeSlot, Result); + if (Handler) Handler->handleConstantArray(AT, &Elements[0], Elements.size(), + TypeSlot, Result); break; } @@ -1287,7 +1298,8 @@ read_vbr_uint())); Result = ConstantStruct::get(ST, Elements); - if (Handler) Handler->handleConstantStruct(ST, Elements, Result); + if (Handler) Handler->handleConstantStruct(ST, &Elements[0],Elements.size(), + Result); break; } @@ -1301,7 +1313,8 @@ Elements.push_back(getConstantValue(TypeSlot, read_vbr_uint())); Result = ConstantPacked::get(PT, Elements); - if (Handler) Handler->handleConstantPacked(PT, Elements, TypeSlot, Result); + if (Handler) Handler->handleConstantPacked(PT, &Elements[0],Elements.size(), + TypeSlot, Result); break; } Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.44 llvm/lib/Bytecode/Reader/Reader.h:1.45 --- llvm/lib/Bytecode/Reader/Reader.h:1.44 Mon Feb 5 14:47:20 2007 +++ llvm/lib/Bytecode/Reader/Reader.h Tue Feb 6 23:08:39 2007 @@ -22,8 +22,8 @@ #include "llvm/Function.h" #include "llvm/ModuleProvider.h" #include "llvm/Bytecode/Analyzer.h" +#include "llvm/ADT/SmallVector.h" #include -#include #include namespace llvm { @@ -228,7 +228,7 @@ /// @brief Parse a single instruction. void ParseInstruction( - std::vector& Args, ///< The arguments to be filled in + SmallVector & Args, ///< The arguments to be filled in BasicBlock* BB ///< The BB the instruction goes in ); From sabre at nondot.org Tue Feb 6 23:10:07 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:10:07 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/BytecodeHandler.h Message-ID: <200702070510.l175A7mw016373@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: BytecodeHandler.h updated: 1.12 -> 1.13 --- Log message: eliminate std::vector's from the bchandler interface --- Diffs of the changes: (+5 -5) BytecodeHandler.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) Index: llvm/include/llvm/Bytecode/BytecodeHandler.h diff -u llvm/include/llvm/Bytecode/BytecodeHandler.h:1.12 llvm/include/llvm/Bytecode/BytecodeHandler.h:1.13 --- llvm/include/llvm/Bytecode/BytecodeHandler.h:1.12 Mon Feb 5 14:47:19 2007 +++ llvm/include/llvm/Bytecode/BytecodeHandler.h Tue Feb 6 23:09:50 2007 @@ -233,7 +233,7 @@ virtual bool handleInstruction( unsigned Opcode, ///< Opcode of the instruction const Type* iType, ///< Instruction type - std::vector& Operands, ///< Vector of slot # operands + unsigned *Operands, unsigned NumOps, ///< Vector of slot # operands Instruction *Inst, ///< The resulting instruction unsigned Length ///< Length of instruction in bc bytes ) { return false; } @@ -249,14 +249,14 @@ /// @brief Handle a constant expression virtual void handleConstantExpression( unsigned Opcode, ///< Opcode of primary expression operator - std::vector ArgVec, ///< expression args + Constant**Args, unsigned NumArgs, ///< expression args Constant* C ///< The constant value ) {} /// @brief Handle a constant array virtual void handleConstantArray( const ArrayType* AT, ///< Type of the array - std::vector& ElementSlots,///< Slot nums for array values + Constant**ElementSlots, unsigned NumElts,///< Slot nums for array values unsigned TypeSlot, ///< Slot # of type Constant* Val ///< The constant value ) {} @@ -264,14 +264,14 @@ /// @brief Handle a constant structure virtual void handleConstantStruct( const StructType* ST, ///< Type of the struct - std::vector& ElementSlots,///< Slot nums for struct values + Constant**ElementSlots, unsigned NumElts,///< Slot nums for struct values Constant* Val ///< The constant value ) {} /// @brief Handle a constant packed virtual void handleConstantPacked( const PackedType* PT, ///< Type of the array - std::vector& ElementSlots,///< Slot nums for packed values + Constant**ElementSlots, unsigned NumElts,///< Slot nums for packed values unsigned TypeSlot, ///< Slot # of type Constant* Val ///< The constant value ) {} From sabre at nondot.org Tue Feb 6 23:15:45 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:15:45 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Message-ID: <200702070515.l175FjRi016528@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.231 -> 1.232 --- Log message: parse constantexpr arguments into a smallvector: 1.5% speedup reading 176.gcc --- Diffs of the changes: (+1 -1) Reader.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.231 llvm/lib/Bytecode/Reader/Reader.cpp:1.232 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.231 Tue Feb 6 23:08:39 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Tue Feb 6 23:15:28 2007 @@ -1147,7 +1147,7 @@ --isExprNumArgs; // FIXME: Encoding of constant exprs could be much more compact! - std::vector ArgVec; + SmallVector ArgVec; ArgVec.reserve(isExprNumArgs); unsigned Opcode = read_vbr_uint(); From sabre at nondot.org Tue Feb 6 23:23:05 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:23:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ValueSymbolTable.cpp Message-ID: <200702070523.l175N5XC016853@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ValueSymbolTable.cpp updated: 1.4 -> 1.5 --- Log message: Eliminate a bunch of work from ValueSymbolTable::insert for the common case where a symbol name doesn't conflict. This speeds up bc reading 16% on 176.gcc! --- Diffs of the changes: (+7 -1) ValueSymbolTable.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.4 llvm/lib/VMCore/ValueSymbolTable.cpp:1.5 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.4 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Tue Feb 6 23:22:49 2007 @@ -81,7 +81,13 @@ assert(V && "Can't insert null Value into symbol table!"); assert(V->hasName() && "Can't insert nameless Value into symbol table"); - // Check to see if there is a naming conflict. If so, rename this value + // Try inserting the name, assuming it won't conflict. + if (vmap.insert(make_pair(V->Name, V)).second) { + DOUT << " Inserted value: " << V->Name << ": " << *V << "\n"; + return; + } + + // Otherwise, there is a naming conflict. Rename this value. std::string UniqueName = getUniqueName(V->getName()); DEBUG(DOUT << " Inserting value: " << UniqueName << ": " << *V << "\n"); From sabre at nondot.org Tue Feb 6 23:29:50 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:29:50 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/TypeSymbolTable.h Message-ID: <200702070529.l175Toaa017055@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: TypeSymbolTable.h updated: 1.5 -> 1.6 --- Log message: TypeSymbolTable::rename is dead, remove it --- Diffs of the changes: (+0 -4) TypeSymbolTable.h | 4 ---- 1 files changed, 4 deletions(-) Index: llvm/include/llvm/TypeSymbolTable.h diff -u llvm/include/llvm/TypeSymbolTable.h:1.5 llvm/include/llvm/TypeSymbolTable.h:1.6 --- llvm/include/llvm/TypeSymbolTable.h:1.5 Sat Jan 6 01:24:43 2007 +++ llvm/include/llvm/TypeSymbolTable.h Tue Feb 6 23:29:34 2007 @@ -118,10 +118,6 @@ /// @returns true if the erase was successful (TI was found) bool remove(Type* TI); - /// Rename a type. This ain't fast, we have to linearly search for it first. - /// @returns true if the rename was successful (type was found) - bool rename(Type* T, const std::string& new_name); - /// @} /// @name AbstractTypeUser Methods /// @{ From sabre at nondot.org Tue Feb 6 23:29:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:29:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/TypeSymbolTable.cpp Message-ID: <200702070529.l175Tp2m017061@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: TypeSymbolTable.cpp updated: 1.6 -> 1.7 --- Log message: TypeSymbolTable::rename is dead, remove it --- Diffs of the changes: (+0 -18) TypeSymbolTable.cpp | 18 ------------------ 1 files changed, 18 deletions(-) Index: llvm/lib/VMCore/TypeSymbolTable.cpp diff -u llvm/lib/VMCore/TypeSymbolTable.cpp:1.6 llvm/lib/VMCore/TypeSymbolTable.cpp:1.7 --- llvm/lib/VMCore/TypeSymbolTable.cpp:1.6 Sat Jan 6 01:24:44 2007 +++ llvm/lib/VMCore/TypeSymbolTable.cpp Tue Feb 6 23:29:34 2007 @@ -122,24 +122,6 @@ return RemovedSymbol; } -/// rename - Given a value with a non-empty name, remove its existing entry -/// from the symbol table and insert a new one for Name. This is equivalent to -/// doing "remove(V), V->Name = Name, insert(V)", but is faster, and will not -/// temporarily remove the symbol table plane if V is the last value in the -/// symtab with that name (which could invalidate iterators to that plane). -bool TypeSymbolTable::rename(Type *T, const std::string &name) { - for (iterator TI = tmap.begin(), TE = tmap.end(); TI != TE; ++TI) { - if (TI->second == T) { - // Remove the old entry. - tmap.erase(TI); - // Add the new entry. - this->insert(name,T); - return true; - } - } - return false; -} - // This function is called when one of the types in the type plane are refined void TypeSymbolTable::refineAbstractType(const DerivedType *OldType, const Type *NewType) { From sabre at nondot.org Tue Feb 6 23:36:18 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:36:18 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/TypeSymbolTable.cpp Message-ID: <200702070536.l175aILG017259@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: TypeSymbolTable.cpp updated: 1.7 -> 1.8 --- Log message: Eliminate the O(n) version of TypeSymbolTable::remove, it is dead. When inserting a type into the type symbol table, only compute unique name if not in symtab already. --- Diffs of the changes: (+21 -21) TypeSymbolTable.cpp | 42 +++++++++++++++++++++--------------------- 1 files changed, 21 insertions(+), 21 deletions(-) Index: llvm/lib/VMCore/TypeSymbolTable.cpp diff -u llvm/lib/VMCore/TypeSymbolTable.cpp:1.7 llvm/lib/VMCore/TypeSymbolTable.cpp:1.8 --- llvm/lib/VMCore/TypeSymbolTable.cpp:1.7 Tue Feb 6 23:29:34 2007 +++ llvm/lib/VMCore/TypeSymbolTable.cpp Tue Feb 6 23:35:58 2007 @@ -47,17 +47,6 @@ return 0; } -// Erase a specific type from the symbol table -bool TypeSymbolTable::remove(Type *N) { - for (iterator TI = tmap.begin(), TE = tmap.end(); TI != TE; ++TI) { - if (TI->second == N) { - this->remove(TI); - return true; - } - } - return false; -} - // remove - Remove a type from the symbol table... Type* TypeSymbolTable::remove(iterator Entry) { assert(Entry != tmap.end() && "Invalid entry to remove!"); @@ -88,19 +77,30 @@ void TypeSymbolTable::insert(const std::string& Name, const Type* T) { assert(T && "Can't insert null type into symbol table!"); - // Check to see if there is a naming conflict. If so, rename this type! - std::string UniqueName = Name; - if (lookup(Name)) - UniqueName = getUniqueName(Name); - + if (tmap.insert(make_pair(Name, T)).second) { + // Type inserted fine with no conflict. + #if DEBUG_SYMBOL_TABLE - dump(); - cerr << " Inserting type: " << UniqueName << ": " - << T->getDescription() << "\n"; + dump(); + cerr << " Inserted type: " << Name << ": " << T->getDescription() << "\n"; +#endif + } else { + // If there is a name conflict... + + // Check to see if there is a naming conflict. If so, rename this type! + std::string UniqueName = Name; + if (lookup(Name)) + UniqueName = getUniqueName(Name); + +#if DEBUG_SYMBOL_TABLE + dump(); + cerr << " Inserting type: " << UniqueName << ": " + << T->getDescription() << "\n"; #endif - // Insert the tmap entry - tmap.insert(make_pair(UniqueName, T)); + // Insert the tmap entry + tmap.insert(make_pair(UniqueName, T)); + } // If we are adding an abstract type, add the symbol table to it's use list. if (T->isAbstract()) { From sabre at nondot.org Tue Feb 6 23:36:18 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:36:18 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/TypeSymbolTable.h Message-ID: <200702070536.l175aI30017256@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: TypeSymbolTable.h updated: 1.6 -> 1.7 --- Log message: Eliminate the O(n) version of TypeSymbolTable::remove, it is dead. When inserting a type into the type symbol table, only compute unique name if not in symtab already. --- Diffs of the changes: (+0 -5) TypeSymbolTable.h | 5 ----- 1 files changed, 5 deletions(-) Index: llvm/include/llvm/TypeSymbolTable.h diff -u llvm/include/llvm/TypeSymbolTable.h:1.6 llvm/include/llvm/TypeSymbolTable.h:1.7 --- llvm/include/llvm/TypeSymbolTable.h:1.6 Tue Feb 6 23:29:34 2007 +++ llvm/include/llvm/TypeSymbolTable.h Tue Feb 6 23:35:58 2007 @@ -113,11 +113,6 @@ /// @returns the Type that was erased from the symbol table. Type* remove(iterator TI); - /// Remove a specific Type from the symbol table. This isn't fast, linear - /// search, O(n), algorithm. - /// @returns true if the erase was successful (TI was found) - bool remove(Type* TI); - /// @} /// @name AbstractTypeUser Methods /// @{ From natebegeman at mac.com Tue Feb 6 23:47:32 2007 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 6 Feb 2007 23:47:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/MachOWriter.cpp Message-ID: <200702070547.l175lW8O017480@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: MachOWriter.cpp updated: 1.22 -> 1.23 --- Log message: Fix a fixme by correctly calculating preferred alignments for functions, based on the alignment of the symbol and the target data's preferred align for that type. Also, rename some arguments for consistency. --- Diffs of the changes: (+14 -11) MachOWriter.cpp | 25 ++++++++++++++----------- 1 files changed, 14 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/MachOWriter.cpp diff -u llvm/lib/CodeGen/MachOWriter.cpp:1.22 llvm/lib/CodeGen/MachOWriter.cpp:1.23 --- llvm/lib/CodeGen/MachOWriter.cpp:1.22 Fri Feb 2 20:39:40 2007 +++ llvm/lib/CodeGen/MachOWriter.cpp Tue Feb 6 23:47:16 2007 @@ -84,8 +84,8 @@ isLittleEndian = TM.getTargetData()->isLittleEndian(); } - virtual void startFunction(MachineFunction &F); - virtual bool finishFunction(MachineFunction &F); + virtual void startFunction(MachineFunction &MF); + virtual bool finishFunction(MachineFunction &MF); virtual void addRelocation(const MachineRelocation &MR) { Relocations.push_back(MR); @@ -130,12 +130,15 @@ /// startFunction - This callback is invoked when a new machine function is /// about to be emitted. -void MachOCodeEmitter::startFunction(MachineFunction &F) { +void MachOCodeEmitter::startFunction(MachineFunction &MF) { + const TargetData *TD = TM.getTargetData(); + const Function *F = MF.getFunction(); + // Align the output buffer to the appropriate alignment, power of 2. - // FIXME: MachineFunction or TargetData should probably carry an alignment - // field for functions that we can query here instead of hard coding 4 in both - // the object writer and asm printer. - unsigned Align = 4; + unsigned FnAlign = F->getAlignment(); + unsigned TDAlign = TD->getTypeAlignmentPref(F->getType()); + unsigned Align = Log2_32(std::max(FnAlign, TDAlign)); + assert(!(Align & (Align-1)) && "Alignment is not a power of two!"); // Get the Mach-O Section that this function belongs in. MachOWriter::MachOSection *MOS = MOW.getTextSection(); @@ -172,7 +175,7 @@ /// finishFunction - This callback is invoked after the function is completely /// finished. -bool MachOCodeEmitter::finishFunction(MachineFunction &F) { +bool MachOCodeEmitter::finishFunction(MachineFunction &MF) { // Get the Mach-O Section that this function belongs in. MachOWriter::MachOSection *MOS = MOW.getTextSection(); @@ -180,16 +183,16 @@ // FIXME: it seems like we should call something like AddSymbolToSection // in startFunction rather than changing the section size and symbol n_value // here. - const GlobalValue *FuncV = F.getFunction(); + const GlobalValue *FuncV = MF.getFunction(); MachOSym FnSym(FuncV, MOW.Mang->getValueName(FuncV), MOS->Index, TM); FnSym.n_value = MOS->size; MOS->size = CurBufferPtr - BufferBegin; // Emit constant pool to appropriate section(s) - emitConstantPool(F.getConstantPool()); + emitConstantPool(MF.getConstantPool()); // Emit jump tables to appropriate section - emitJumpTables(F.getJumpTableInfo()); + emitJumpTables(MF.getJumpTableInfo()); // If we have emitted any relocations to function-specific objects such as // basic blocks, constant pools entries, or jump tables, record their From sabre at nondot.org Tue Feb 6 23:53:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 6 Feb 2007 23:53:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ValueSymbolTable.cpp Message-ID: <200702070553.l175r8t1017678@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ValueSymbolTable.cpp updated: 1.5 -> 1.6 --- Log message: speed up conflict handling. --- Diffs of the changes: (+7 -2) ValueSymbolTable.cpp | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.5 llvm/lib/VMCore/ValueSymbolTable.cpp:1.6 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.5 Tue Feb 6 23:22:49 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Tue Feb 6 23:52:51 2007 @@ -88,13 +88,18 @@ } // Otherwise, there is a naming conflict. Rename this value. - std::string UniqueName = getUniqueName(V->getName()); + std::string UniqueName = V->getName(); + unsigned BaseSize = UniqueName.size(); + do { + // Trim any suffix off. + UniqueName.resize(BaseSize); + UniqueName += utostr(++LastUnique); + } while (!vmap.insert(make_pair(UniqueName, V)).second); DEBUG(DOUT << " Inserting value: " << UniqueName << ": " << *V << "\n"); // Insert the vmap entry V->Name = UniqueName; - vmap.insert(make_pair(V->Name, V)); } // Remove a value From zhousheng00 at gmail.com Tue Feb 6 23:58:54 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Tue, 6 Feb 2007 23:58:54 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702070558.l175wsqm017789@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.2 -> 1.3 --- Log message: As Chris suggested, fixed some problems. (This is the first part.) --- Diffs of the changes: (+47 -21) APInt.h | 68 ++++++++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 47 insertions(+), 21 deletions(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.2 llvm/include/llvm/ADT/APInt.h:1.3 --- llvm/include/llvm/ADT/APInt.h:1.2 Mon Feb 5 23:59:47 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 6 23:58:38 2007 @@ -45,7 +45,7 @@ friend double APIntToDouble(const APInt& APIVal); friend float APIntToFloat(const APInt& APIVal); - unsigned bitsnum; ///< The number of bits. + unsigned BitsNum; ///< The number of bits. bool isSigned; ///< The sign flag for this APInt. /// This union is used to store the integer value. When the @@ -64,22 +64,22 @@ /// Here one word's bitwidth equals to that of uint64_t. /// @returns the number of words to hold the integer value of this APInt. /// @brief Get the number of words. - inline unsigned numWords() const { - return bitsnum < 1 ? 0 : (bitsnum + APINT_BITS_PER_WORD - 1) / - APINT_BITS_PER_WORD; + inline unsigned getNumWords() const { + return (BitsNum + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD; } /// @returns true if the number of bits <= 64, false otherwise. /// @brief Determine if this APInt just has one word to store value. inline bool isSingleWord() const - { return bitsnum <= APINT_BITS_PER_WORD; } + { return BitsNum <= APINT_BITS_PER_WORD; } /// @returns the word position for the specified bit position. static inline unsigned whichWord(unsigned bitPosition) { return bitPosition / APINT_BITS_PER_WORD; } /// @returns the byte position for the specified bit position. - static inline unsigned whichByte(unsigned bitPosition); + static inline unsigned whichByte(unsigned bitPosition) + { return (bitPosition % APINT_BITS_PER_WORD) / 8; } /// @returns the bit position in a word for the specified bit position /// in APInt. @@ -93,10 +93,10 @@ inline void TruncToBits() { if (isSingleWord()) - VAL &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum); + VAL &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitsNum); else - pVal[numWords() - 1] &= ~uint64_t(0ULL) >> - (APINT_BITS_PER_WORD - (whichBit(bitsnum - 1) + 1)); + pVal[getNumWords() - 1] &= ~uint64_t(0ULL) >> + (APINT_BITS_PER_WORD - (whichBit(BitsNum - 1) + 1)); } /// @returns the corresponding word for the specified bit position. @@ -108,6 +108,9 @@ inline uint64_t getWord(unsigned bitPosition) const { return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; } + /// @brief Converts a char array into an integer. + void StrToAPInt(const char *StrStart, unsigned slen, uint8_t radix); + public: /// @brief Create a new APInt of numBits bit-width, and initialized as val. APInt(uint64_t val = 0, unsigned numBits = APINT_BITS_PER_WORD, @@ -119,7 +122,11 @@ /// @brief Create a new APInt by translating the string represented /// integer value. - APInt(std::string& Val, uint8_t radix = 10, bool sign = false); + APInt(const std::string& Val, uint8_t radix = 10, bool sign = false); + + /// @brief Create a new APInt by translating the char array represented + /// integer value. + APInt(const char StrStart[], unsigned slen, uint8_t radix, bool sign = false); /// @brief Copy Constructor. APInt(const APInt& API); @@ -136,7 +143,10 @@ /// Increments the APInt by one. /// @brief Postfix increment operator. - const APInt operator++(int); + inline const APInt operator++(int) { + APInt API(*this); + return ++API; + } /// Increments the APInt by one. /// @brief Prefix increment operator. @@ -144,7 +154,10 @@ /// Decrements the APInt by one. /// @brief Postfix decrement operator. - const APInt operator--(int); + inline const APInt operator--(int) { + APInt API(*this); + return --API; + } /// Decrements the APInt by one. /// @brief Prefix decrement operator. @@ -264,11 +277,25 @@ /// @brief Equality operator. bool operator==(const APInt& RHS) const; + /// Compare this APInt with the given uint64_t value + /// for the validity of the equality relationship. + /// @brief Equality operator. + bool operator==(uint64_t Val) const; + /// Compare this APInt with the given APInt& RHS /// for the validity of the inequality relationship. /// @brief Inequality operator. - bool operator!=(const APInt& RHS) const; + inline bool operator!=(const APInt& RHS) const { + return !((*this) == RHS); + } + /// Compare this APInt with the given uint64_t value + /// for the validity of the inequality relationship. + /// @brief Inequality operator. + inline bool operator!=(uint64_t Val) const { + return !((*this) == Val); + } + /// Compare this APInt with the given APInt& RHS for /// the validity of the less-than relationship. /// @brief Less-than operator. @@ -293,11 +320,10 @@ /// word, just returns VAL, otherwise pVal[0]. inline uint64_t getValue() { if (isSingleWord()) - return isSigned ? ((int64_t(VAL) << (APINT_BITS_PER_WORD - bitsnum)) >> - (APINT_BITS_PER_WORD - bitsnum)) : + return isSigned ? ((int64_t(VAL) << (APINT_BITS_PER_WORD - BitsNum)) >> + (APINT_BITS_PER_WORD - BitsNum)) : VAL; - else - return pVal[0]; + assert(0 && "This APInt's bitwidth > 64"); } /// @returns the largest value for an APInt of the specified bit-width and @@ -344,12 +370,12 @@ /// @returns a character interpretation of the APInt. std::string to_string(uint8_t radix = 10) const; - /// Get an APInt with the same bitsnum as this APInt, just zero mask + /// Get an APInt with the same BitsNum as this APInt, just zero mask /// the low bits and right shift to the least significant bit. /// @returns the high "numBits" bits of this APInt. APInt HiBits(unsigned numBits) const; - /// Get an APInt with the same bitsnum as this APInt, just zero mask + /// Get an APInt with the same BitsNum as this APInt, just zero mask /// the high bits. /// @returns the low "numBits" bits of this APInt. APInt LoBits(unsigned numBits) const; @@ -372,7 +398,7 @@ /// @returns the total number of bits. inline unsigned getNumBits() const - { return bitsnum; } + { return BitsNum; } }; @@ -404,7 +430,7 @@ /// @returns the floor log base 2 of the specified APInt value. inline APInt LogBase2(const APInt& APIVal) { - return APIVal.numWords() * APInt::APINT_BITS_PER_WORD - + return APIVal.getNumWords() * APInt::APINT_BITS_PER_WORD - APIVal.CountLeadingZeros(); } From rspencer at reidspencer.com Wed Feb 7 00:06:24 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 06 Feb 2007 22:06:24 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ValueSymbolTable.cpp In-Reply-To: <200702070553.l175r8t1017678@zion.cs.uiuc.edu> References: <200702070553.l175r8t1017678@zion.cs.uiuc.edu> Message-ID: <1170828384.27507.112.camel@bashful.x10sys.com> On Tue, 2007-02-06 at 23:53 -0600, Chris Lattner wrote: > > Changes in directory llvm/lib/VMCore: > > ValueSymbolTable.cpp updated: 1.5 -> 1.6 > > // Insert the vmap entry > V->Name = UniqueName; > - vmap.insert(make_pair(V->Name, V)); > } That comment needs to be updated. From sabre at nondot.org Wed Feb 7 00:06:40 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:06:40 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ValueSymbolTable.h Message-ID: <200702070606.l1766eEZ018008@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: ValueSymbolTable.h updated: 1.4 -> 1.5 --- Log message: Make SymbolTable::insert, SymbolTable::remove and SymbolTable::rename private. --- Diffs of the changes: (+21 -3) ValueSymbolTable.h | 24 +++++++++++++++++++++--- 1 files changed, 21 insertions(+), 3 deletions(-) Index: llvm/include/llvm/ValueSymbolTable.h diff -u llvm/include/llvm/ValueSymbolTable.h:1.4 llvm/include/llvm/ValueSymbolTable.h:1.5 --- llvm/include/llvm/ValueSymbolTable.h:1.4 Mon Feb 5 14:47:19 2007 +++ llvm/include/llvm/ValueSymbolTable.h Wed Feb 7 00:06:24 2007 @@ -20,13 +20,30 @@ #include namespace llvm { - + template + class SymbolTableListTraits; + template struct ilist_traits; + class BasicBlock; + class Function; + class Module; + /// This class provides a symbol table of name/value pairs. It is essentially /// a std::map but has a controlled interface provided by /// LLVM as well as ensuring uniqueness of names. /// class ValueSymbolTable { - + friend class Value; + friend class SymbolTableListTraits >; + friend class SymbolTableListTraits >; + friend class SymbolTableListTraits >; + friend class SymbolTableListTraits >; + friend class SymbolTableListTraits >; /// @name Types /// @{ public: @@ -108,7 +125,8 @@ /// This method will strip the symbol table of its names. /// @brief Strip the symbol table. bool strip(); - + +private: /// This method adds the provided value \p N to the symbol table. The Value /// must have a name which is used to place the value in the symbol table. /// @brief Add a named value to the symbol table From sabre at nondot.org Wed Feb 7 00:14:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:14:08 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ValueSymbolTable.h Message-ID: <200702070614.l176E8O8018220@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: ValueSymbolTable.h updated: 1.5 -> 1.6 --- Log message: eliminate ValueSymbolTable::rename, it has no advantage over using remove+insert. Make insert/remove assert if used incorrectly instead of returning a bool. --- Diffs of the changes: (+4 -13) ValueSymbolTable.h | 17 ++++------------- 1 files changed, 4 insertions(+), 13 deletions(-) Index: llvm/include/llvm/ValueSymbolTable.h diff -u llvm/include/llvm/ValueSymbolTable.h:1.5 llvm/include/llvm/ValueSymbolTable.h:1.6 --- llvm/include/llvm/ValueSymbolTable.h:1.5 Wed Feb 7 00:06:24 2007 +++ llvm/include/llvm/ValueSymbolTable.h Wed Feb 7 00:13:49 2007 @@ -91,7 +91,7 @@ /// @return 1 if the name is in the symbol table, 0 otherwise /// @brief Determine if a name is in the symbol table - ValueMap::size_type count(const std::string &name) const { + bool count(const std::string &name) const { return vmap.count(name); } @@ -134,18 +134,10 @@ /// This method removes a value from the symbol table. The name of the /// Value is extracted from \p Val and used to lookup the Value in the - /// symbol table. If the Value is not in the symbol table, this method - /// returns false. \p Val is not deleted, just removed from the symbol table. - /// @returns true if \p Val was successfully removed, false otherwise + /// symbol table. \p Val is not deleted, just removed from the symbol table. /// @brief Remove a value from the symbol table. - bool remove(Value* Val); - - /// Given a value with a non-empty name, remove its existing - /// entry from the symbol table and insert a new one for Name. This is - /// equivalent to doing "remove(V), V->Name = Name, insert(V)". - /// @brief Rename a value in the symbol table - bool rename(Value *V, const std::string &Name); - + void remove(Value* Val); + /// @} /// @name Internal Data /// @{ @@ -154,7 +146,6 @@ mutable uint32_t LastUnique; ///< Counter for tracking unique names /// @} - }; } // End llvm namespace From sabre at nondot.org Wed Feb 7 00:14:09 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:14:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Value.cpp ValueSymbolTable.cpp Message-ID: <200702070614.l176E9mc018227@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Value.cpp updated: 1.61 -> 1.62 ValueSymbolTable.cpp updated: 1.6 -> 1.7 --- Log message: eliminate ValueSymbolTable::rename, it has no advantage over using remove+insert. Make insert/remove assert if used incorrectly instead of returning a bool. --- Diffs of the changes: (+5 -42) Value.cpp | 4 +++- ValueSymbolTable.cpp | 43 ++----------------------------------------- 2 files changed, 5 insertions(+), 42 deletions(-) Index: llvm/lib/VMCore/Value.cpp diff -u llvm/lib/VMCore/Value.cpp:1.61 llvm/lib/VMCore/Value.cpp:1.62 --- llvm/lib/VMCore/Value.cpp:1.61 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/Value.cpp Wed Feb 7 00:13:49 2007 @@ -120,7 +120,9 @@ Name = name; else if (hasName()) { if (!name.empty()) { // Replacing name. - ST->rename(this, name); + ST->remove(this); + Name = name; + ST->insert(this); } else { // Transitioning from hasName -> noname. ST->remove(this); Name.clear(); Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.6 llvm/lib/VMCore/ValueSymbolTable.cpp:1.7 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.6 Tue Feb 6 23:52:51 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Wed Feb 7 00:13:49 2007 @@ -103,54 +103,15 @@ } // Remove a value -bool ValueSymbolTable::remove(Value *V) { +void ValueSymbolTable::remove(Value *V) { assert(V->hasName() && "Value doesn't have name!"); iterator Entry = vmap.find(V->getName()); - if (Entry == vmap.end()) - return false; + assert(Entry != vmap.end() && "Entry was not in the symtab!"); DEBUG(DOUT << " Removing Value: " << Entry->second->getName() << "\n"); // Remove the value from the plane... vmap.erase(Entry); - return true; -} - - -// rename - Given a value with a non-empty name, remove its existing entry -// from the symbol table and insert a new one for Name. This is equivalent to -// doing "remove(V), V->Name = Name, insert(V)", -// -bool ValueSymbolTable::rename(Value *V, const std::string &name) { - assert(V && "Can't rename a null Value"); - assert(V->hasName() && "Can't rename a nameless Value"); - assert(!V->getName().empty() && "Can't rename an Value with null name"); - assert(V->getName() != name && "Can't rename a Value with same name"); - assert(!name.empty() && "Can't rename a named Value with a null name"); - - // Find the name - iterator VI = vmap.find(V->getName()); - - // If we didn't find it, we're done - if (VI == vmap.end()) - return false; - - // Remove the old entry. - vmap.erase(VI); - - // See if we can insert the new name. - VI = vmap.lower_bound(name); - - // Is there a naming conflict? - if (VI != vmap.end() && VI->first == name) { - V->Name = getUniqueName( name); - vmap.insert(make_pair(V->Name, V)); - } else { - V->Name = name; - vmap.insert(VI, make_pair(V->Name, V)); - } - - return true; } // DumpVal - a std::for_each function for dumping a value From zhousheng00 at gmail.com Wed Feb 7 00:15:09 2007 From: zhousheng00 at gmail.com (Zhou Sheng) Date: Wed, 7 Feb 2007 00:15:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702070615.l176F9Pu018252@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.3 -> 1.4 --- Log message: As Chris suggested, fixed some problems. (This is the first part) --- Diffs of the changes: (+157 -147) APInt.cpp | 304 ++++++++++++++++++++++++++++++++------------------------------ 1 files changed, 157 insertions(+), 147 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.3 llvm/lib/Support/APInt.cpp:1.4 --- llvm/lib/Support/APInt.cpp:1.3 Tue Feb 6 00:04:53 2007 +++ llvm/lib/Support/APInt.cpp Wed Feb 7 00:14:53 2007 @@ -17,10 +17,7 @@ #if 0 #include "llvm/DerivedTypes.h" #include "llvm/Support/MathExtras.h" -#include -#include -#include -#include +#include #include using namespace llvm; @@ -266,60 +263,74 @@ } APInt::APInt(uint64_t val, unsigned numBits, bool sign) - : bitsnum(numBits), isSigned(sign) { - assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); - assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + : BitsNum(numBits), isSigned(sign) { + assert(BitsNum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(BitsNum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); if (isSingleWord()) - VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + VAL = val & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitsNum)); else { // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && + assert((pVal = new uint64_t[getNumWords()]) && "APInt memory allocation fails!"); - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); pVal[0] = val; } } APInt::APInt(unsigned numBits, uint64_t bigVal[], bool sign) - : bitsnum(numBits), isSigned(sign) { - assert(bitsnum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); - assert(bitsnum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); + : BitsNum(numBits), isSigned(sign) { + assert(BitsNum >= IntegerType::MIN_INT_BITS && "bitwidth too small"); + assert(BitsNum <= IntegerType::MAX_INT_BITS && "bitwidth too large"); assert(bigVal && "Null pointer detected!"); if (isSingleWord()) - VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - bitsnum)); + VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitsNum)); else { // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && + assert((pVal = new uint64_t[getNumWords()]) && "APInt memory allocation fails!"); // Calculate the actual length of bigVal[]. unsigned n = sizeof(*bigVal) / sizeof(bigVal[0]); - unsigned maxN = std::max(n, numWords()); - unsigned minN = std::min(n, numWords()); + unsigned maxN = std::max(n, getNumWords()); + unsigned minN = std::min(n, getNumWords()); memcpy(pVal, bigVal, (minN - 1) * 8); - pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - bitsnum % 64)); - if (maxN == numWords()) - bzero(pVal+n, (numWords() - n) * 8); + pVal[minN-1] = bigVal[minN-1] & (~uint64_t(0ULL) >> (64 - BitsNum % 64)); + if (maxN == getNumWords()) + memset(pVal+n, 0, (getNumWords() - n) * 8); } } -APInt::APInt(std::string& Val, uint8_t radix, bool sign) +/// @brief Create a new APInt by translating the char array represented +/// integer value. +APInt::APInt(const char StrStart[], unsigned slen, uint8_t radix, bool sign) : isSigned(sign) { + StrToAPInt(StrStart, slen, radix); +} + +/// @brief Create a new APInt by translating the string represented +/// integer value. +APInt::APInt(const std::string& Val, uint8_t radix, bool sign) + : isSigned(sign) { + assert(!Val.empty() && "String empty?"); + StrToAPInt(Val.c_str(), Val.size(), radix); +} + +/// @brief Converts a char array into an integer. +void APInt::StrToAPInt(const char *StrStart, unsigned slen, uint8_t radix) { assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && "Radix should be 2, 8, 10, or 16!"); - assert(!Val.empty() && "String empty?"); - unsigned slen = Val.size(); + assert(StrStart && "String empty?"); unsigned size = 0; // If the radix is a power of 2, read the input // from most significant to least significant. if ((radix & (radix - 1)) == 0) { unsigned nextBitPos = 0, bits_per_digit = radix / 8 + 2; uint64_t resDigit = 0; - bitsnum = slen * bits_per_digit; - if (numWords() > 1) - assert((pVal = new uint64_t[numWords()]) && + BitsNum = slen * bits_per_digit; + if (getNumWords() > 1) + assert((pVal = new uint64_t[getNumWords()]) && "APInt memory allocation fails!"); for (int i = slen - 1; i >= 0; --i) { - uint64_t digit = Val[i] - 48; // '0' == 48. + uint64_t digit = StrStart[i] - 48; // '0' == 48. resDigit |= digit << nextBitPos; nextBitPos += bits_per_digit; if (nextBitPos >= 64) { @@ -332,31 +343,31 @@ resDigit = digit >> (bits_per_digit - nextBitPos); } } - if (!isSingleWord() && size <= numWords()) + if (!isSingleWord() && size <= getNumWords()) pVal[size] = resDigit; } else { // General case. The radix is not a power of 2. // For 10-radix, the max value of 64-bit integer is 18446744073709551615, // and its digits number is 14. const unsigned chars_per_word = 20; if (slen < chars_per_word || - (Val <= "18446744073709551615" && - slen == chars_per_word)) { // In case Val <= 2^64 - 1 - bitsnum = 64; - VAL = strtoull(Val.c_str(), 0, 10); - } else { // In case Val > 2^64 - 1 - bitsnum = (slen / chars_per_word + 1) * 64; - assert((pVal = new uint64_t[numWords()]) && + (slen == chars_per_word && // In case the value <= 2^64 - 1 + strcmp(StrStart, "18446744073709551615") <= 0)) { + BitsNum = 64; + VAL = strtoull(StrStart, 0, 10); + } else { // In case the value > 2^64 - 1 + BitsNum = (slen / chars_per_word + 1) * 64; + assert((pVal = new uint64_t[getNumWords()]) && "APInt memory allocation fails!"); - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); unsigned str_pos = 0; while (str_pos < slen) { unsigned chunk = slen - str_pos; if (chunk > chars_per_word - 1) chunk = chars_per_word - 1; - uint64_t resDigit = Val[str_pos++] - 48; // 48 == '0'. + uint64_t resDigit = StrStart[str_pos++] - 48; // 48 == '0'. uint64_t big_base = radix; while (--chunk > 0) { - resDigit = resDigit * radix + Val[str_pos++] - 48; + resDigit = resDigit * radix + StrStart[str_pos++] - 48; big_base *= radix; } @@ -375,13 +386,13 @@ } APInt::APInt(const APInt& APIVal) - : bitsnum(APIVal.bitsnum), isSigned(APIVal.isSigned) { + : BitsNum(APIVal.BitsNum), isSigned(APIVal.isSigned) { if (isSingleWord()) VAL = APIVal.VAL; else { // Memory allocation and check if successful. - assert((pVal = new uint64_t[numWords()]) && + assert((pVal = new uint64_t[getNumWords()]) && "APInt memory allocation fails!"); - memcpy(pVal, APIVal.pVal, numWords() * 8); + memcpy(pVal, APIVal.pVal, getNumWords() * 8); } } @@ -389,20 +400,15 @@ if (!isSingleWord() && pVal) delete[] pVal; } -/// whichByte - This function returns the word position -/// for the specified bit position. -inline unsigned APInt::whichByte(unsigned bitPosition) -{ return (bitPosition % APINT_BITS_PER_WORD) / 8; } - /// @brief Copy assignment operator. Create a new object from the given /// APInt one by initialization. APInt& APInt::operator=(const APInt& RHS) { if (isSingleWord()) VAL = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; else { - unsigned minN = std::min(numWords(), RHS.numWords()); + unsigned minN = std::min(getNumWords(), RHS.getNumWords()); memcpy(pVal, RHS.isSingleWord() ? &RHS.VAL : RHS.pVal, minN * 8); - if (numWords() != minN) - bzero(pVal + minN, (numWords() - minN) * 8); + if (getNumWords() != minN) + memset(pVal + minN, 0, (getNumWords() - minN) * 8); } return *this; } @@ -413,45 +419,25 @@ if (isSingleWord()) VAL = RHS; else { pVal[0] = RHS; - bzero(pVal, (numWords() - 1) * 8); + memset(pVal, 0, (getNumWords() - 1) * 8); } return *this; } -/// @brief Postfix increment operator. Increments the APInt by one. -const APInt APInt::operator++(int) { - APInt API(*this); - if (isSingleWord()) ++VAL; - else - add_1(pVal, pVal, numWords(), 1); - API.TruncToBits(); - return API; -} - /// @brief Prefix increment operator. Increments the APInt by one. APInt& APInt::operator++() { if (isSingleWord()) ++VAL; else - add_1(pVal, pVal, numWords(), 1); + add_1(pVal, pVal, getNumWords(), 1); TruncToBits(); return *this; } -/// @brief Postfix decrement operator. Decrements the APInt by one. -const APInt APInt::operator--(int) { - APInt API(*this); - if (isSingleWord()) --VAL; - else - sub_1(API.pVal, API.numWords(), 1); - API.TruncToBits(); - return API; -} - /// @brief Prefix decrement operator. Decrements the APInt by one. APInt& APInt::operator--() { if (isSingleWord()) --VAL; else - sub_1(pVal, numWords(), 1); + sub_1(pVal, getNumWords(), 1); TruncToBits(); return *this; } @@ -461,14 +447,14 @@ APInt& APInt::operator+=(const APInt& RHS) { if (isSingleWord()) VAL += RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; else { - if (RHS.isSingleWord()) add_1(pVal, pVal, numWords(), RHS.VAL); + if (RHS.isSingleWord()) add_1(pVal, pVal, getNumWords(), RHS.VAL); else { - if (numWords() <= RHS.numWords()) - add(pVal, pVal, RHS.pVal, numWords()); + if (getNumWords() <= RHS.getNumWords()) + add(pVal, pVal, RHS.pVal, getNumWords()); else { - uint64_t carry = add(pVal, pVal, RHS.pVal, RHS.numWords()); - add_1(pVal + RHS.numWords(), pVal + RHS.numWords(), - numWords() - RHS.numWords(), carry); + uint64_t carry = add(pVal, pVal, RHS.pVal, RHS.getNumWords()); + add_1(pVal + RHS.getNumWords(), pVal + RHS.getNumWords(), + getNumWords() - RHS.getNumWords(), carry); } } } @@ -483,14 +469,14 @@ VAL -= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; else { if (RHS.isSingleWord()) - sub_1(pVal, numWords(), RHS.VAL); + sub_1(pVal, getNumWords(), RHS.VAL); else { - if (RHS.numWords() < numWords()) { - uint64_t carry = sub(pVal, pVal, RHS.pVal, RHS.numWords()); - sub_1(pVal + RHS.numWords(), numWords() - RHS.numWords(), carry); + if (RHS.getNumWords() < getNumWords()) { + uint64_t carry = sub(pVal, pVal, RHS.pVal, RHS.getNumWords()); + sub_1(pVal + RHS.getNumWords(), getNumWords() - RHS.getNumWords(), carry); } else - sub(pVal, pVal, RHS.pVal, numWords()); + sub(pVal, pVal, RHS.pVal, getNumWords()); } } TruncToBits(); @@ -503,23 +489,24 @@ if (isSingleWord()) VAL *= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; else { // one-based first non-zero bit position. - unsigned first = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned first = getNumWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); unsigned xlen = !first ? 0 : whichWord(first - 1) + 1; if (!xlen) return *this; else if (RHS.isSingleWord()) mul_1(pVal, pVal, xlen, RHS.VAL); else { - first = RHS.numWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); + first = RHS.getNumWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; if (!ylen) { - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); return *this; } uint64_t *dest = new uint64_t[xlen+ylen]; assert(dest && "Memory Allocation Failed!"); mul(dest, pVal, xlen, RHS.pVal, ylen); - memcpy(pVal, dest, ((xlen + ylen >= numWords()) ? numWords() : xlen + ylen) * 8); + memcpy(pVal, dest, ((xlen + ylen >= getNumWords()) ? + getNumWords() : xlen + ylen) * 8); delete[] dest; } } @@ -530,7 +517,7 @@ /// @brief Division assignment operator. Divides this APInt by the given APInt /// &RHS and assigns the result to this APInt. APInt& APInt::operator/=(const APInt& RHS) { - unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - + unsigned first = RHS.getNumWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; assert(ylen && "Divided by zero???"); @@ -542,14 +529,14 @@ VAL = RHS.isSingleWord() ? (VAL / RHS.VAL) : (ylen > 1 ? 0 : VAL / RHS.pVal[0]); } else { - unsigned first2 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned first2 = getNumWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; if (!xlen) return *this; else if ((*this) < RHS) - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); else if ((*this) == RHS) { - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); pVal[0] = 1; } else if (xlen == 1) pVal[0] /= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; @@ -565,7 +552,7 @@ xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); } div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); memcpy(pVal, xwords + ylen, (xlen - ylen) * 8); delete[] xwords; delete[] ywords; @@ -578,7 +565,7 @@ /// division of this APInt by the given APInt& RHS and assigns the remainder /// to this APInt. APInt& APInt::operator%=(const APInt& RHS) { - unsigned first = RHS.numWords() * APINT_BITS_PER_WORD - + unsigned first = RHS.getNumWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); unsigned ylen = !first ? 0 : whichWord(first - 1) + 1; assert(ylen && "Performing remainder operation by zero ???"); @@ -590,12 +577,12 @@ VAL = RHS.isSingleWord() ? (VAL % RHS.VAL) : (ylen > 1 ? VAL : VAL % RHS.pVal[0]); } else { - unsigned first2 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + unsigned first2 = getNumWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); unsigned xlen = !first2 ? 0 : whichWord(first2 - 1) + 1; if (!xlen || (*this) < RHS) return *this; else if ((*this) == RHS) - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); else if (xlen == 1) pVal[0] %= RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]; else { @@ -611,7 +598,7 @@ xwords[xlen++] = lshift(xwords, 0, xwords, xlentmp, nshift); } div((unsigned*)xwords, xlen*2-1, (unsigned*)ywords, ylen*2); - bzero(pVal, numWords() * 8); + memset(pVal, 0, getNumWords() * 8); for (unsigned i = 0; i < ylen-1; ++i) pVal[i] = (xwords[i] >> nshift) | (xwords[i+1] << (64 - nshift)); pVal[ylen-1] = xwords[ylen-1] >> nshift; @@ -630,13 +617,15 @@ else VAL &= RHS.pVal[0]; } else { if (RHS.isSingleWord()) { - bzero(pVal, (numWords() - 1) * 8); + memset(pVal, 0, (getNumWords() - 1) * 8); pVal[0] &= RHS.VAL; } else { - unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + unsigned minwords = getNumWords() < RHS.getNumWords() ? + getNumWords() : RHS.getNumWords(); for (unsigned i = 0; i < minwords; ++i) pVal[i] &= RHS.pVal[i]; - if (numWords() > minwords) bzero(pVal+minwords, (numWords() - minwords) * 8); + if (getNumWords() > minwords) + memset(pVal+minwords, 0, (getNumWords() - minwords) * 8); } } return *this; @@ -652,7 +641,8 @@ if (RHS.isSingleWord()) { pVal[0] |= RHS.VAL; } else { - unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + unsigned minwords = getNumWords() < RHS.getNumWords() ? + getNumWords() : RHS.getNumWords(); for (unsigned i = 0; i < minwords; ++i) pVal[i] |= RHS.pVal[i]; } @@ -669,14 +659,15 @@ else VAL ^= RHS.pVal[0]; } else { if (RHS.isSingleWord()) { - for (unsigned i = 0; i < numWords(); ++i) + for (unsigned i = 0; i < getNumWords(); ++i) pVal[i] ^= RHS.VAL; } else { - unsigned minwords = numWords() < RHS.numWords() ? numWords() : RHS.numWords(); + unsigned minwords = getNumWords() < RHS.getNumWords() ? + getNumWords() : RHS.getNumWords(); for (unsigned i = 0; i < minwords; ++i) pVal[i] ^= RHS.pVal[i]; - if (numWords() > minwords) - for (unsigned i = minwords; i < numWords(); ++i) + if (getNumWords() > minwords) + for (unsigned i = minwords; i < getNumWords(); ++i) pVal[i] ^= 0; } } @@ -717,7 +708,7 @@ else if (RHS.isSingleWord()) return RHS.VAL && pVal[0]; else { - unsigned minN = std::min(numWords(), RHS.numWords()); + unsigned minN = std::min(getNumWords(), RHS.getNumWords()); for (unsigned i = 0; i < minN; ++i) if (pVal[i] && RHS.pVal[i]) return true; @@ -733,7 +724,7 @@ else if (RHS.isSingleWord()) return RHS.VAL || pVal[0]; else { - unsigned minN = std::min(numWords(), RHS.numWords()); + unsigned minN = std::min(getNumWords(), RHS.getNumWords()); for (unsigned i = 0; i < minN; ++i) if (pVal[i] || RHS.pVal[i]) return true; @@ -747,7 +738,7 @@ if (isSingleWord()) return !VAL; else - for (unsigned i = 0; i < numWords(); ++i) + for (unsigned i = 0; i < getNumWords(); ++i) if (pVal[i]) return false; return true; @@ -800,8 +791,8 @@ /// @brief Equality operator. Compare this APInt with the given APInt& RHS /// for the validity of the equality relationship. bool APInt::operator==(const APInt& RHS) const { - unsigned n1 = numWords() * APINT_BITS_PER_WORD - CountLeadingZeros(), - n2 = RHS.numWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); + unsigned n1 = getNumWords() * APINT_BITS_PER_WORD - CountLeadingZeros(), + n2 = RHS.getNumWords() * APINT_BITS_PER_WORD - RHS.CountLeadingZeros(); if (n1 != n2) return false; else if (isSingleWord()) return VAL == (RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0]); @@ -814,23 +805,31 @@ return true; } -/// @brief Inequality operator. Compare this APInt with the given APInt& RHS -/// for the validity of the inequality relationship. -bool APInt::operator!=(const APInt& RHS) const { - return !((*this) == RHS); +/// @brief Equality operator. Compare this APInt with the given uint64_t value +/// for the validity of the equality relationship. +bool APInt::operator==(uint64_t Val) const { + if (isSingleWord()) + return VAL == Val; + else { + unsigned n = getNumWords() * APINT_BITS_PER_WORD - CountLeadingZeros(); + if (n <= 64) + return pVal[0] == Val; + else + return false; + } } /// @brief Less-than operator. Compare this APInt with the given APInt& RHS /// for the validity of the less-than relationship. bool APInt::operator <(const APInt& RHS) const { if (isSigned && RHS.isSigned) { - if ((*this)[bitsnum-1] > RHS[RHS.bitsnum-1]) + if ((*this)[BitsNum-1] > RHS[RHS.BitsNum-1]) return false; - else if ((*this)[bitsnum-1] < RHS[RHS.bitsnum-1]) + else if ((*this)[BitsNum-1] < RHS[RHS.BitsNum-1]) return true; } - unsigned n1 = numWords() * 64 - CountLeadingZeros(), - n2 = RHS.numWords() * 64 - RHS.CountLeadingZeros(); + unsigned n1 = getNumWords() * 64 - CountLeadingZeros(), + n2 = RHS.getNumWords() * 64 - RHS.CountLeadingZeros(); if (n1 < n2) return true; else if (n1 > n2) return false; else if (isSingleWord()) @@ -876,7 +875,7 @@ APInt& APInt::set() { if (isSingleWord()) VAL = -1ULL; else - for (unsigned i = 0; i < numWords(); ++i) + for (unsigned i = 0; i < getNumWords(); ++i) pVal[i] = -1ULL; return *this; } @@ -892,19 +891,21 @@ /// @brief Set every bit to 0. APInt& APInt::clear() { if (isSingleWord()) VAL = 0; - else bzero(pVal, numWords() * 8); + else + memset(pVal, 0, getNumWords() * 8); return *this; } /// @brief Left-shift assignment operator. Left-shift the APInt by shiftAmt /// and assigns the result to this APInt. APInt& APInt::operator<<=(unsigned shiftAmt) { - if (shiftAmt >= bitsnum) { + if (shiftAmt >= BitsNum) { if (isSingleWord()) VAL = 0; - else bzero(pVal, numWords() * 8); + else + memset(pVal, 0, getNumWords() * 8); } else { for (unsigned i = 0; i < shiftAmt; ++i) clear(i); - for (unsigned i = shiftAmt; i < bitsnum; ++i) { + for (unsigned i = shiftAmt; i < BitsNum; ++i) { if ((*this)[i-shiftAmt]) set(i); else clear(i); } @@ -922,15 +923,15 @@ /// @brief Right-shift assignment operator. Right-shift the APInt by shiftAmt /// and assigns the result to this APInt. APInt& APInt::operator>>=(unsigned shiftAmt) { - bool isAShr = isSigned && (*this)[bitsnum-1]; + bool isAShr = isSigned && (*this)[BitsNum-1]; if (isSingleWord()) VAL = isAShr ? (int64_t(VAL) >> shiftAmt) : (VAL >> shiftAmt); else { unsigned i = 0; - for (i = 0; i < bitsnum - shiftAmt; ++i) + for (i = 0; i < BitsNum - shiftAmt; ++i) if ((*this)[i+shiftAmt]) set(i); else clear(i); - for (; i < bitsnum; ++i) + for (; i < BitsNum; ++i) isAShr ? set(i) : clear(i); } return *this; @@ -953,12 +954,12 @@ /// @brief Toggle every bit to its opposite value. APInt& APInt::flip() { - if (isSingleWord()) VAL = (~(VAL << (64 - bitsnum))) >> (64 - bitsnum); + if (isSingleWord()) VAL = (~(VAL << (64 - BitsNum))) >> (64 - BitsNum); else { unsigned i = 0; - for (; i < numWords() - 1; ++i) + for (; i < getNumWords() - 1; ++i) pVal[i] = ~pVal[i]; - unsigned offset = 64 - (bitsnum - 64 * (i - 1)); + unsigned offset = 64 - (BitsNum - 64 * (i - 1)); pVal[i] = (~(pVal[i] << offset)) >> offset; } return *this; @@ -968,7 +969,7 @@ /// as "bitPosition". /// @brief Toggles a given bit to its opposite value. APInt& APInt::flip(unsigned bitPosition) { - assert(bitPosition < bitsnum && "Out of the bit-width range!"); + assert(bitPosition < BitsNum && "Out of the bit-width range!"); if ((*this)[bitPosition]) clear(bitPosition); else set(bitPosition); return *this; @@ -978,27 +979,36 @@ std::string APInt::to_string(uint8_t radix) const { assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && "Radix should be 2, 8, 10, or 16!"); - std::ostringstream buf; - buf << std::setbase(radix); + char *buf = 0; + unsigned n = getNumWords() * 64 - CountLeadingZeros(); + std::string format = radix == 8 ? + "%0*llo" : (radix == 10 ? "%0*llu" : "%0*llx"); // If the radix is a power of 2, set the format of ostringstream, // and output the value into buf. if ((radix & (radix - 1)) == 0) { - if (isSingleWord()) buf << VAL; + assert((buf = new char[n / Log2_32(radix) + 2]) && + "Memory allocation failed"); + if (isSingleWord()) + sprintf(buf, format.c_str(), 0, VAL); else { - buf << pVal[numWords()-1]; - buf << std::setw(64 / (radix / 8 + 2)) << std::setfill('0'); - for (int i = numWords() - 2; i >= 0; --i) - buf << pVal[i]; + unsigned offset = sprintf(buf, format.c_str(), 0, pVal[whichWord(n-1)]); + for (int i = whichWord(n-1) - 1; i >= 0; --i) + offset += sprintf(buf + offset, format.c_str(), + 64 / Log2_32(radix) + (64 % Log2_32(radix) ? 1 : 0), pVal[i]); } } else { // If the radix = 10, need to translate the value into a // string. - if (isSingleWord()) buf << VAL; + assert((buf = new char[(n / 64 + 1) * 20]) && "Memory allocation failed"); + if (isSingleWord()) + sprintf(buf, format.c_str(), 0, VAL); else { // FIXME: To be supported. } } - return buf.str(); + std::string retStr(buf); + delete[] buf; + return retStr; } /// getMaxValue - This function returns the largest value @@ -1032,12 +1042,12 @@ /// HiBits - This function returns the high "numBits" bits of this APInt. APInt APInt::HiBits(unsigned numBits) const { - return (*this) >> (bitsnum - numBits); + return (*this) >> (BitsNum - numBits); } /// LoBits - This function returns the low "numBits" bits of this APInt. APInt APInt::LoBits(unsigned numBits) const { - return ((*this) << (bitsnum - numBits)) >> (bitsnum - numBits); + return ((*this) << (BitsNum - numBits)) >> (BitsNum - numBits); } /// CountLeadingZeros - This function is a APInt version corresponding to @@ -1049,7 +1059,7 @@ if (isSingleWord()) return CountLeadingZeros_64(VAL); unsigned Count = 0; - for (int i = numWords() - 1; i >= 0; --i) { + for (int i = getNumWords() - 1; i >= 0; --i) { unsigned tmp = CountLeadingZeros_64(pVal[i]); Count += tmp; if (tmp != 64) @@ -1067,7 +1077,7 @@ if (isSingleWord()) return CountTrailingZeros_64(~VAL & (VAL - 1)); APInt Tmp = ~(*this) & ((*this) - 1); - return numWords() * 64 - Tmp.CountLeadingZeros(); + return getNumWords() * 64 - Tmp.CountLeadingZeros(); } /// CountPopulation - This function is a APInt version corresponding to @@ -1078,7 +1088,7 @@ if (isSingleWord()) return CountPopulation_64(VAL); unsigned Count = 0; - for (unsigned i = 0; i < numWords(); ++i) + for (unsigned i = 0; i < getNumWords(); ++i) Count += CountPopulation_64(pVal[i]); return Count; } @@ -1087,10 +1097,10 @@ /// ByteSwap - This function returns a byte-swapped representation of the /// APInt argument, APIVal. APInt llvm::ByteSwap(const APInt& APIVal) { - if (APIVal.bitsnum <= 32) - return APInt(APIVal.bitsnum, ByteSwap_32(unsigned(APIVal.VAL))); - else if (APIVal.bitsnum <= 64) - return APInt(APIVal.bitsnum, ByteSwap_64(APIVal.VAL)); + if (APIVal.BitsNum <= 32) + return APInt(APIVal.BitsNum, ByteSwap_32(unsigned(APIVal.VAL))); + else if (APIVal.BitsNum <= 64) + return APInt(APIVal.BitsNum, ByteSwap_64(APIVal.VAL)); else return APIVal; } From sabre at nondot.org Wed Feb 7 00:23:03 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:23:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/StripSymbols.cpp Message-ID: <200702070623.l176N3dJ018418@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: StripSymbols.cpp updated: 1.13 -> 1.14 --- Log message: shrink vmcore by moving symbol table stripping support out of VMCore into the one IPO pass that uses it. --- Diffs of the changes: (+23 -2) StripSymbols.cpp | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/IPO/StripSymbols.cpp diff -u llvm/lib/Transforms/IPO/StripSymbols.cpp:1.13 llvm/lib/Transforms/IPO/StripSymbols.cpp:1.14 --- llvm/lib/Transforms/IPO/StripSymbols.cpp:1.13 Mon Feb 5 17:32:05 2007 +++ llvm/lib/Transforms/IPO/StripSymbols.cpp Wed Feb 7 00:22:45 2007 @@ -73,6 +73,27 @@ } } +// Strip the symbol table of its names. +// +static void StripSymtab(ValueSymbolTable &ST) { + for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) { + Value *V = VI->second; + ++VI; + if (!isa(V) || cast(V)->hasInternalLinkage()) { + // Set name to "", removing from symbol table! + V->setName(""); + } + } +} + +// Strip the symbol table of its names. +static void StripTypeSymtab(TypeSymbolTable &ST) { + for (TypeSymbolTable::iterator TI = ST.begin(), E = ST.end(); TI != E; ) + ST.remove(TI++); +} + + + bool StripSymbols::runOnModule(Module &M) { // If we're not just stripping debug info, strip all symbols from the // functions and the names from any internal globals. @@ -85,11 +106,11 @@ for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { if (I->hasInternalLinkage()) I->setName(""); // Internal symbols can't participate in linkage - I->getValueSymbolTable().strip(); + StripSymtab(I->getValueSymbolTable()); } // Remove all names from types. - M.getTypeSymbolTable().strip(); + StripTypeSymtab(M.getTypeSymbolTable()); } // Strip debug info in the module if it exists. To do this, we remove From sabre at nondot.org Wed Feb 7 00:23:05 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:23:05 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/TypeSymbolTable.h ValueSymbolTable.h Message-ID: <200702070623.l176N5OR018430@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: TypeSymbolTable.h updated: 1.7 -> 1.8 ValueSymbolTable.h updated: 1.6 -> 1.7 --- Log message: shrink vmcore by moving symbol table stripping support out of VMCore into the one IPO pass that uses it. --- Diffs of the changes: (+0 -10) TypeSymbolTable.h | 4 ---- ValueSymbolTable.h | 6 ------ 2 files changed, 10 deletions(-) Index: llvm/include/llvm/TypeSymbolTable.h diff -u llvm/include/llvm/TypeSymbolTable.h:1.7 llvm/include/llvm/TypeSymbolTable.h:1.8 --- llvm/include/llvm/TypeSymbolTable.h:1.7 Tue Feb 6 23:35:58 2007 +++ llvm/include/llvm/TypeSymbolTable.h Wed Feb 7 00:22:45 2007 @@ -98,10 +98,6 @@ /// @{ public: - /// This method will strip the symbol table of its names - /// @brief Strip the symbol table. - bool strip(); - /// Inserts a type into the symbol table with the specified name. There can be /// a many-to-one mapping between names and types. This method allows a type /// with an existing entry in the symbol table to get a new name. Index: llvm/include/llvm/ValueSymbolTable.h diff -u llvm/include/llvm/ValueSymbolTable.h:1.6 llvm/include/llvm/ValueSymbolTable.h:1.7 --- llvm/include/llvm/ValueSymbolTable.h:1.6 Wed Feb 7 00:13:49 2007 +++ llvm/include/llvm/ValueSymbolTable.h Wed Feb 7 00:22:45 2007 @@ -120,12 +120,6 @@ /// @} /// @name Mutators /// @{ -public: - - /// This method will strip the symbol table of its names. - /// @brief Strip the symbol table. - bool strip(); - private: /// This method adds the provided value \p N to the symbol table. The Value /// must have a name which is used to place the value in the symbol table. From sabre at nondot.org Wed Feb 7 00:23:04 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:23:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/TypeSymbolTable.cpp ValueSymbolTable.cpp Message-ID: <200702070623.l176N4Mv018425@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: TypeSymbolTable.cpp updated: 1.8 -> 1.9 ValueSymbolTable.cpp updated: 1.7 -> 1.8 --- Log message: shrink vmcore by moving symbol table stripping support out of VMCore into the one IPO pass that uses it. --- Diffs of the changes: (+0 -27) TypeSymbolTable.cpp | 11 ----------- ValueSymbolTable.cpp | 16 ---------------- 2 files changed, 27 deletions(-) Index: llvm/lib/VMCore/TypeSymbolTable.cpp diff -u llvm/lib/VMCore/TypeSymbolTable.cpp:1.8 llvm/lib/VMCore/TypeSymbolTable.cpp:1.9 --- llvm/lib/VMCore/TypeSymbolTable.cpp:1.8 Tue Feb 6 23:35:58 2007 +++ llvm/lib/VMCore/TypeSymbolTable.cpp Wed Feb 7 00:22:45 2007 @@ -111,17 +111,6 @@ } } -// Strip the symbol table of its names. -bool TypeSymbolTable::strip() { - bool RemovedSymbol = false; - for (iterator TI = tmap.begin(); TI != tmap.end(); ) { - remove(TI++); - RemovedSymbol = true; - } - - return RemovedSymbol; -} - // This function is called when one of the types in the type plane are refined void TypeSymbolTable::refineAbstractType(const DerivedType *OldType, const Type *NewType) { Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.7 llvm/lib/VMCore/ValueSymbolTable.cpp:1.8 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.7 Wed Feb 7 00:13:49 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Wed Feb 7 00:22:45 2007 @@ -59,22 +59,6 @@ return 0; } -// Strip the symbol table of its names. -// -bool ValueSymbolTable::strip() { - bool RemovedSymbol = false; - for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ) { - Value *V = VI->second; - ++VI; - if (!isa(V) || cast(V)->hasInternalLinkage()) { - // Set name to "", removing from symbol table! - V->setName(""); - RemovedSymbol = true; - } - } - return RemovedSymbol; -} - // Insert a value into the symbol table with the specified name... // void ValueSymbolTable::insert(Value* V) { From sabre at nondot.org Wed Feb 7 00:24:33 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:24:33 -0600 Subject: [llvm-commits] CVS: llvm/docs/ProgrammersManual.html Message-ID: <200702070624.l176OXru018502@zion.cs.uiuc.edu> Changes in directory llvm/docs: ProgrammersManual.html updated: 1.121 -> 1.122 --- Log message: remove some obsolete SymbolTable methods. These docs need to be updated now that PR411: http://llvm.org/PR411 landed --- Diffs of the changes: (+1 -20) ProgrammersManual.html | 21 +-------------------- 1 files changed, 1 insertion(+), 20 deletions(-) Index: llvm/docs/ProgrammersManual.html diff -u llvm/docs/ProgrammersManual.html:1.121 llvm/docs/ProgrammersManual.html:1.122 --- llvm/docs/ProgrammersManual.html:1.121 Mon Feb 5 00:30:51 2007 +++ llvm/docs/ProgrammersManual.html Wed Feb 7 00:24:17 2007 @@ -2122,11 +2122,6 @@ have both a name and a type which are extracted and used to place the value in the correct type plane under the value's name. -
void insert(const std::string& Name, Value *Val):
-
Inserts a constant or type into the symbol table with the specified - name. There can be a many to one mapping between names and constants - or types.
-
void remove(Value* Val):
This method removes a named value from the symbol table. The type and name of the Value are extracted from \p N and used to @@ -2134,20 +2129,6 @@ not in the symbol table, this method silently ignores the request.
-
Value* remove(const std::string& Name, Value *Val):
-
Remove a constant or type with the specified name from the - symbol table.
- -
Value *remove(const value_iterator& It):
-
Removes a specific value from the symbol table. - Returns the removed value.
- -
bool strip():
-
This method will strip the symbol table of its names leaving - the type and values.
- -
void clear():
-
Empty the symbol table completely.

Iteration

@@ -3197,7 +3178,7 @@ Dinakar Dhurjati and Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2007/02/05 06:30:51 $ + Last modified: $Date: 2007/02/07 06:24:17 $ From sabre at nondot.org Wed Feb 7 00:25:52 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:25:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ValueSymbolTable.cpp Message-ID: <200702070625.l176PqKo018557@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ValueSymbolTable.cpp updated: 1.8 -> 1.9 --- Log message: update comment. --- Diffs of the changes: (+3 -3) ValueSymbolTable.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.8 llvm/lib/VMCore/ValueSymbolTable.cpp:1.9 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.8 Wed Feb 7 00:22:45 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Wed Feb 7 00:25:36 2007 @@ -78,12 +78,12 @@ // Trim any suffix off. UniqueName.resize(BaseSize); UniqueName += utostr(++LastUnique); + // Try insert the vmap entry with this suffix. } while (!vmap.insert(make_pair(UniqueName, V)).second); - DEBUG(DOUT << " Inserting value: " << UniqueName << ": " << *V << "\n"); - - // Insert the vmap entry V->Name = UniqueName; + + DEBUG(DOUT << " Inserted value: " << UniqueName << ": " << *V << "\n"); } // Remove a value From sabre at nondot.org Wed Feb 7 00:29:05 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:29:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ValueSymbolTable.cpp Message-ID: <200702070629.l176T5Wr018678@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ValueSymbolTable.cpp updated: 1.9 -> 1.10 --- Log message: constants can't be in the symtab anymore --- Diffs of the changes: (+4 -8) ValueSymbolTable.cpp | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) Index: llvm/lib/VMCore/ValueSymbolTable.cpp diff -u llvm/lib/VMCore/ValueSymbolTable.cpp:1.9 llvm/lib/VMCore/ValueSymbolTable.cpp:1.10 --- llvm/lib/VMCore/ValueSymbolTable.cpp:1.9 Wed Feb 7 00:25:36 2007 +++ llvm/lib/VMCore/ValueSymbolTable.cpp Wed Feb 7 00:28:48 2007 @@ -23,15 +23,11 @@ // Class destructor ValueSymbolTable::~ValueSymbolTable() { #ifndef NDEBUG // Only do this in -g mode... - bool LeftoverValues = true; for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ++VI) - if (!isa(VI->second) ) { - DEBUG(DOUT << "Value still in symbol table! Type = '" - << VI->second->getType()->getDescription() << "' Name = '" - << VI->first << "'\n"); - LeftoverValues = false; - } - assert(LeftoverValues && "Values remain in symbol table!"); + DEBUG(DOUT << "Value still in symbol table! Type = '" + << VI->second->getType()->getDescription() << "' Name = '" + << VI->first << "'\n"); + assert(vmap.empty() && "Values remain in symbol table!"); #endif } From sabre at nondot.org Wed Feb 7 00:53:21 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:53:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Message-ID: <200702070653.l176rLCT019272@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.32 -> 1.33 Reader.cpp updated: 1.232 -> 1.233 --- Log message: remove the handleVBR32/handleVBR64 callbacks. They are very fine-grained. --- Diffs of the changes: (+0 -26) Analyzer.cpp | 22 ---------------------- Reader.cpp | 4 ---- 2 files changed, 26 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.32 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.33 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.32 Tue Feb 6 23:08:39 2007 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Wed Feb 7 00:53:02 2007 @@ -26,7 +26,6 @@ #include #include #include - using namespace llvm; namespace { @@ -542,27 +541,6 @@ bca.BlockSizes[llvm::BytecodeFormat::Reserved_DoNotUse] += 4; } - virtual void handleVBR32(unsigned Size ) { - bca.vbrCount32++; - bca.vbrCompBytes += Size; - bca.vbrExpdBytes += sizeof(uint32_t); - if (currFunc) { - currFunc->vbrCount32++; - currFunc->vbrCompBytes += Size; - currFunc->vbrExpdBytes += sizeof(uint32_t); - } - } - - virtual void handleVBR64(unsigned Size ) { - bca.vbrCount64++; - bca.vbrCompBytes += Size; - bca.vbrExpdBytes += sizeof(uint64_t); - if ( currFunc ) { - currFunc->vbrCount64++; - currFunc->vbrCompBytes += Size; - currFunc->vbrExpdBytes += sizeof(uint64_t); - } - } }; Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.232 llvm/lib/Bytecode/Reader/Reader.cpp:1.233 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.232 Tue Feb 6 23:15:28 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Feb 7 00:53:02 2007 @@ -86,7 +86,6 @@ inline unsigned BytecodeReader::read_vbr_uint() { unsigned Shift = 0; unsigned Result = 0; - BufPtr Save = At; do { if (At == BlockEnd) @@ -94,7 +93,6 @@ Result |= (unsigned)((*At++) & 0x7F) << Shift; Shift += 7; } while (At[-1] & 0x80); - if (Handler) Handler->handleVBR32(At-Save); return Result; } @@ -102,7 +100,6 @@ inline uint64_t BytecodeReader::read_vbr_uint64() { unsigned Shift = 0; uint64_t Result = 0; - BufPtr Save = At; do { if (At == BlockEnd) @@ -110,7 +107,6 @@ Result |= (uint64_t)((*At++) & 0x7F) << Shift; Shift += 7; } while (At[-1] & 0x80); - if (Handler) Handler->handleVBR64(At-Save); return Result; } From sabre at nondot.org Wed Feb 7 00:53:21 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 00:53:21 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/BytecodeHandler.h Message-ID: <200702070653.l176rLOr019264@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: BytecodeHandler.h updated: 1.13 -> 1.14 --- Log message: remove the handleVBR32/handleVBR64 callbacks. They are very fine-grained. --- Diffs of the changes: (+0 -9) BytecodeHandler.h | 9 --------- 1 files changed, 9 deletions(-) Index: llvm/include/llvm/Bytecode/BytecodeHandler.h diff -u llvm/include/llvm/Bytecode/BytecodeHandler.h:1.13 llvm/include/llvm/Bytecode/BytecodeHandler.h:1.14 --- llvm/include/llvm/Bytecode/BytecodeHandler.h:1.13 Tue Feb 6 23:09:50 2007 +++ llvm/include/llvm/Bytecode/BytecodeHandler.h Wed Feb 7 00:53:02 2007 @@ -308,15 +308,6 @@ unsigned Size ///< The size of the block ) {} - /// @brief Handle a variable bit rate 32 bit unsigned - virtual void handleVBR32( - unsigned Size ///< Number of bytes the vbr_uint took up - ) {} - - /// @brief Handle a variable bit rate 64 bit unsigned - virtual void handleVBR64( - unsigned Size ///< Number of byte sthe vbr_uint64 took up - ) {} /// @} }; From rspencer at reidspencer.com Wed Feb 7 01:15:34 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 06 Feb 2007 23:15:34 -0800 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp In-Reply-To: <200702070653.l176rLCT019272@zion.cs.uiuc.edu> References: <200702070653.l176rLCT019272@zion.cs.uiuc.edu> Message-ID: <1170832534.27507.115.camel@bashful.x10sys.com> Chris, This patch isn't finished. You've prevented collection of any vbr data by llvm-bcanalyzer. Please update llvm-bcanalyzer to not print out "0" (or possibly divide by zero) for the vbr stats that use vbrCount32, vbrCompBytes, vbrExpdBytes and vbrCount64. Thanks, Reid. On Wed, 2007-02-07 at 00:53 -0600, Chris Lattner wrote: > > Changes in directory llvm/lib/Bytecode/Reader: > > Analyzer.cpp updated: 1.32 -> 1.33 > Reader.cpp updated: 1.232 -> 1.233 > --- > Log message: > > remove the handleVBR32/handleVBR64 callbacks. They are very fine-grained. > > > --- > Diffs of the changes: (+0 -26) > > Analyzer.cpp | 22 ---------------------- > Reader.cpp | 4 ---- > 2 files changed, 26 deletions(-) > > > Index: llvm/lib/Bytecode/Reader/Analyzer.cpp > diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.32 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.33 > --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.32 Tue Feb 6 23:08:39 2007 > +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Wed Feb 7 00:53:02 2007 > @@ -26,7 +26,6 @@ > #include > #include > #include > - > using namespace llvm; > > namespace { > @@ -542,27 +541,6 @@ > bca.BlockSizes[llvm::BytecodeFormat::Reserved_DoNotUse] += 4; > } > > - virtual void handleVBR32(unsigned Size ) { > - bca.vbrCount32++; > - bca.vbrCompBytes += Size; > - bca.vbrExpdBytes += sizeof(uint32_t); > - if (currFunc) { > - currFunc->vbrCount32++; > - currFunc->vbrCompBytes += Size; > - currFunc->vbrExpdBytes += sizeof(uint32_t); > - } > - } > - > - virtual void handleVBR64(unsigned Size ) { > - bca.vbrCount64++; > - bca.vbrCompBytes += Size; > - bca.vbrExpdBytes += sizeof(uint64_t); > - if ( currFunc ) { > - currFunc->vbrCount64++; > - currFunc->vbrCompBytes += Size; > - currFunc->vbrExpdBytes += sizeof(uint64_t); > - } > - } > }; > > > > > Index: llvm/lib/Bytecode/Reader/Reader.cpp > diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.232 llvm/lib/Bytecode/Reader/Reader.cpp:1.233 > --- llvm/lib/Bytecode/Reader/Reader.cpp:1.232 Tue Feb 6 23:15:28 2007 > +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Feb 7 00:53:02 2007 > @@ -86,7 +86,6 @@ > inline unsigned BytecodeReader::read_vbr_uint() { > unsigned Shift = 0; > unsigned Result = 0; > - BufPtr Save = At; > > do { > if (At == BlockEnd) > @@ -94,7 +93,6 @@ > Result |= (unsigned)((*At++) & 0x7F) << Shift; > Shift += 7; > } while (At[-1] & 0x80); > - if (Handler) Handler->handleVBR32(At-Save); > return Result; > } > > @@ -102,7 +100,6 @@ > inline uint64_t BytecodeReader::read_vbr_uint64() { > unsigned Shift = 0; > uint64_t Result = 0; > - BufPtr Save = At; > > do { > if (At == BlockEnd) > @@ -110,7 +107,6 @@ > Result |= (uint64_t)((*At++) & 0x7F) << Shift; > Shift += 7; > } while (At[-1] & 0x80); > - if (Handler) Handler->handleVBR64(At-Save); > return Result; > } > > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From sabre at nondot.org Wed Feb 7 01:19:35 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 01:19:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Message-ID: <200702070719.l177JZDM019882@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.33 -> 1.34 --- Log message: remove dead ivars, thanks to Reid for noticing this! --- Diffs of the changes: (+1 -22) Analyzer.cpp | 23 +---------------------- 1 files changed, 1 insertion(+), 22 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.33 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.34 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.33 Wed Feb 7 00:53:02 2007 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Wed Feb 7 01:19:19 2007 @@ -1,4 +1,4 @@ -//===-- Analyzer.cpp - Analysis and Dumping of Bytecode 000000---*- C++ -*-===// +//===-- Analyzer.cpp - Analysis and Dumping of Bytecode ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -86,10 +86,6 @@ bca.functionDensity = 0.0; bca.instructionSize = 0; bca.longInstructions = 0; - bca.vbrCount32 = 0; - bca.vbrCount64 = 0; - bca.vbrCompBytes = 0; - bca.vbrExpdBytes = 0; bca.FunctionInfo.clear(); bca.BlockSizes[BytecodeFormat::Reserved_DoNotUse] = 0; bca.BlockSizes[BytecodeFormat::ModuleBlockID] = theSize; @@ -329,10 +325,6 @@ currFunc->density = 0.0; currFunc->instructionSize = 0; currFunc->longInstructions = 0; - currFunc->vbrCount32 = 0; - currFunc->vbrCount64 = 0; - currFunc->vbrCompBytes = 0; - currFunc->vbrExpdBytes = 0; } @@ -648,13 +640,6 @@ print(Out, "Bytes Per Value ", bca.fileDensity); print(Out, "Bytes Per Global", bca.globalsDensity); print(Out, "Bytes Per Function", bca.functionDensity); - print(Out, "# of VBR 32-bit Integers", bca.vbrCount32); - print(Out, "# of VBR 64-bit Integers", bca.vbrCount64); - print(Out, "# of VBR Compressed Bytes", bca.vbrCompBytes); - print(Out, "# of VBR Expanded Bytes", bca.vbrExpdBytes); - print(Out, "Bytes Saved With VBR", - double(bca.vbrExpdBytes)-double(bca.vbrCompBytes), - double(bca.vbrExpdBytes)); if (bca.detailedResults) { Out << "\nDetailed Analysis Of " << bca.ModuleId << " Functions:\n"; @@ -679,12 +664,6 @@ print(Out, "Average Instruction Size", double(I->second.instructionSize) / I->second.numInstructions); print(Out, "Bytes Per Instruction", I->second.density); - print(Out, "# of VBR 32-bit Integers", I->second.vbrCount32); - print(Out, "# of VBR 64-bit Integers", I->second.vbrCount64); - print(Out, "# of VBR Compressed Bytes", I->second.vbrCompBytes); - print(Out, "# of VBR Expanded Bytes", I->second.vbrExpdBytes); - print(Out, "Bytes Saved With VBR", - double(I->second.vbrExpdBytes) - I->second.vbrCompBytes); } ++I; } From clattner at apple.com Wed Feb 7 01:30:16 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 6 Feb 2007 23:30:16 -0800 Subject: [llvm-commits] Updated TargetData patch. In-Reply-To: References: <200702052005.l15K5YIJ011658@relay4.cso.uiuc.edu> Message-ID: On Feb 6, 2007, at 10:33 AM, Scott Michel wrote: > Found a minor bug in the previous patch (bit<->byte conversion), > fixed 80col violations (hopefully), got rid of tabs. Some nits: #include +#include "llvm/ADT/SmallVector.h" Do you need anymore? If not, please remove the #include. +struct TargetAlignElem { + unsigned char AlignType; //< Alignment type (AlignTypeEnum) + unsigned char ABIAlign; //< ABI alignment for this type/bitw + unsigned char PrefAlign; //< Preferred alignment for this type/bitw + short TypeBitWidth; //< Type bit width + + /// Default constructor + TargetAlignElem(); + /// Full constructor + TargetAlignElem(AlignTypeEnum align_type, unsigned char abi_align, + unsigned char pref_align, short bit_width); + /// Copy constructor + TargetAlignElem(const TargetAlignElem &src); + /// Destructor + ~TargetAlignElem() { } + /// Assignment operator + TargetAlignElem &operator=(const TargetAlignElem &rhs); + /// Less-than predicate + bool operator<(const TargetAlignElem &rhs) const; + /// Equality predicate + bool operator==(const TargetAlignElem &rhs) const; + /// output stream operator + std::ostream &dump(std::ostream &os) const; +} This class really wants to be a POD. Please remove all the ctors and dtor, and instead use a single: +struct TargetAlignElem { + unsigned char AlignType; //< Alignment type (AlignTypeEnum) + unsigned char ABIAlign; //< ABI alignment for this type/bitw + unsigned char PrefAlign; //< Preferred alignment for this type/bitw + short TypeBitWidth; //< Type bit width static TargetAlignElem get(AlignTypeEnum align_type, unsigned char abi_align, unsigned char pref_align, short bit_width); method. This class not being a pod inhibits some compiler optimizations. operator< and operator== and dump can remain methods. +/// Target alignment container +/// +/// This is the container for most primitive types' alignment, i.e., integer, +/// floating point, vectors and aggregates. +class TargetAlign : public SmallVector { Never inherit from containers. Please make the smallvector be an instance var and add accessors as appropriate. See Effective C++ for justification. Is there any significant reason not to just 'inline' the TargetAlign class into the TargetData class? If it's just a SmallVector of TargetAlignElem's, why not just declare it as such and put the accessors on TargetData? Index: lib/CodeGen/MachineFunction.cpp =================================================================== --- lib/CodeGen/MachineFunction.cpp (.../trunk) (revision 522) +++ lib/CodeGen/MachineFunction.cpp (.../branches/llvm-spu) (revision 522) @@ -13,6 +13,8 @@ // // ===--------------------------------------------------------------------- -===// +#include "llvm/Type.h" +#include "llvm/DerivedTypes.h" DerivedTypes pulls in Type.h, so you can drop the first #include. @@ -123,7 +125,7 @@ const TargetData &TD = *TM.getTargetData(); bool IsPic = TM.getRelocationModel() == Reloc::PIC_; unsigned EntrySize = IsPic ? 4 : TD.getPointerSize(); - unsigned Alignment = IsPic ? TD.getIntABIAlignment() + unsigned Alignment = IsPic ? TD.getABITypeAlignment(Type::Int32Ty) : TD.getPointerABIAlignment(); Index: lib/Target/TargetData.cpp =================================================================== --- lib/Target/TargetData.cpp (.../trunk) (revision 522) +++ lib/Target/TargetData.cpp (.../branches/llvm-spu) (revision 522) @@ -23,6 +23,7 @@ #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/MathExtras.h" #include "llvm/ADT/StringExtras.h" +#include #include is verboten, please see the coding standards doc. Overall, the new design is nice. It is much less a bag of random bits! :) Please resubmit the patch with the changes, thanks! -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070206/5d976587/attachment.html From sabre at nondot.org Wed Feb 7 01:33:18 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 01:33:18 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Analyzer.h Message-ID: <200702070733.l177XIfB020170@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Analyzer.h updated: 1.13 -> 1.14 --- Log message: remove dead ivars. --- Diffs of the changes: (+0 -8) Analyzer.h | 8 -------- 1 files changed, 8 deletions(-) Index: llvm/include/llvm/Bytecode/Analyzer.h diff -u llvm/include/llvm/Bytecode/Analyzer.h:1.13 llvm/include/llvm/Bytecode/Analyzer.h:1.14 --- llvm/include/llvm/Bytecode/Analyzer.h:1.13 Tue Nov 28 16:21:29 2006 +++ llvm/include/llvm/Bytecode/Analyzer.h Wed Feb 7 01:33:02 2007 @@ -63,10 +63,6 @@ double functionDensity; ///< Average density of functions (bytes/function) unsigned instructionSize; ///< Size of instructions in bytes unsigned longInstructions;///< Number of instructions > 4 bytes - unsigned vbrCount32; ///< Number of 32-bit vbr values - unsigned vbrCount64; ///< Number of 64-bit vbr values - unsigned vbrCompBytes; ///< Number of vbr bytes (compressed) - unsigned vbrExpdBytes; ///< Number of vbr bytes (expanded) typedef std::map BlockSizeMap; @@ -85,10 +81,6 @@ double density; ///< Density of function unsigned instructionSize; ///< Size of instructions in bytes unsigned longInstructions;///< Number of instructions > 4 bytes - unsigned vbrCount32; ///< Number of 32-bit vbr values - unsigned vbrCount64; ///< Number of 64-bit vbr values - unsigned vbrCompBytes; ///< Number of vbr bytes (compressed) - unsigned vbrExpdBytes; ///< Number of vbr bytes (expanded) }; /// A mapping of function slot numbers to the collected information about From evan.cheng at apple.com Wed Feb 7 02:37:56 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 02:37:56 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702070837.l178buUn030607@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.60 -> 1.61 --- Log message: - If fp (r7) is used to reference stack objects, use [r, r] address mode. - If there is a dynamic alloca, in the epilogue, restore the value of sp using r7 - offset. - Other bug fixes. --- Diffs of the changes: (+67 -28) ARMRegisterInfo.cpp | 95 ++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 67 insertions(+), 28 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.60 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.61 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.60 Tue Feb 6 20:44:23 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 02:37:31 2007 @@ -359,6 +359,19 @@ return NumMIs; } +/// emitLoadConstPool - Emits a load from constpool to materialize NumBytes +/// immediate. +static void emitLoadConstPool(MachineBasicBlock &MBB, + MachineBasicBlock::iterator &MBBI, + unsigned DestReg, int NumBytes, + const TargetInstrInfo &TII) { + MachineFunction &MF = *MBB.getParent(); + MachineConstantPool *ConstantPool = MF.getConstantPool(); + Constant *C = ConstantInt::get(Type::Int32Ty, NumBytes); + unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2); + BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), DestReg).addConstantPoolIndex(Idx); +} + /// emitThumbRegPlusConstPool - Emits a series of instructions to materialize /// a destreg = basereg + immediate in Thumb code. Load the immediate from a /// constpool entry. @@ -368,9 +381,8 @@ unsigned DestReg, unsigned BaseReg, int NumBytes, bool CanChangeCC, const TargetInstrInfo &TII) { - MachineFunction &MF = *MBB.getParent(); - MachineConstantPool *ConstantPool = MF.getConstantPool(); - bool isHigh = !isLowRegister(DestReg) || !isLowRegister(BaseReg); + bool isHigh = !isLowRegister(DestReg) || + (BaseReg != 0 && !isLowRegister(BaseReg)); bool isSub = false; // Subtract doesn't have high register version. Load the negative value // if either base or dest register is a high register. Also, if do not @@ -389,12 +401,9 @@ if (NumBytes <= 255 && NumBytes >= 0) BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); - else { - // Load the constant. - Constant *C = ConstantInt::get(Type::Int32Ty, NumBytes); - unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2); - BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), LdReg).addConstantPoolIndex(Idx); - } + else + emitLoadConstPool(MBB, MBBI, LdReg, NumBytes, TII); + // Emit add / sub. int Opc = (isSub) ? ARM::tSUBrr : (isHigh ? ARM::tADDhirr : ARM::tADDrr); const MachineInstrBuilder MIB = BuildMI(MBB, MBBI, TII.get(Opc), DestReg); @@ -721,8 +730,8 @@ case ARMII::AddrModeTs: { ImmIdx = i+1; InstrOffs = MI.getOperand(ImmIdx).getImm(); - NumBits = isSub ? 3 : ((FrameReg == ARM::SP) ? 8 : 5); - Scale = isSub ? 1 : 4; + NumBits = (FrameReg == ARM::SP) ? 8 : 5; + Scale = 4; break; } default: @@ -754,7 +763,7 @@ // If this is a thumb spill / restore, we will be using a constpool load to // materialize the offset. bool isThumSpillRestore = Opcode == ARM::tRestore || Opcode == ARM::tSpill; - if (AddrMode == ARMII::AddrModeTs || !isThumSpillRestore) { + if (AddrMode == ARMII::AddrModeTs && !isThumSpillRestore) { if (AddrMode == ARMII::AddrModeTs) { // Thumb tLDRspi, tSTRspi. These will change to instructions that use // a different base register. @@ -779,12 +788,21 @@ if (TII.isLoad(Opcode)) { // Use the destination register to materialize sp + offset. unsigned TmpReg = MI.getOperand(0).getReg(); - if (Opcode == ARM::tRestore) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, Offset, false, TII); - else + bool UseRR = false; + if (Opcode == ARM::tRestore) { + if (FrameReg == ARM::SP) + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg,Offset,false,TII); + else { + emitLoadConstPool(MBB, II, TmpReg, Offset, TII); + UseRR = true; + } + } else emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tLDR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); + if (UseRR) + MI.addRegOperand(FrameReg, false); // Use [reg, reg] addrmode. + else MI.addRegOperand(0, false); // tLDR has an extra register operand. } else if (TII.isStore(Opcode)) { // FIXME! This is horrific!!! We need register scavenging. @@ -797,19 +815,30 @@ // r2 = r12 unsigned ValReg = MI.getOperand(0).getReg(); unsigned TmpReg = ARM::R3; + bool UseRR = false; if (ValReg == ARM::R3) { BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R2); TmpReg = ARM::R2; } - if (Opcode == ARM::tSpill) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg, Offset, false, TII); - else + if (Opcode == ARM::tSpill) { + if (FrameReg == ARM::SP) + emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg,Offset,false,TII); + else { + emitLoadConstPool(MBB, II, TmpReg, Offset, TII); + UseRR = true; + } + } else emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tSTR)); MI.getOperand(i).ChangeToRegister(TmpReg, false); - MI.addRegOperand(0, false); // tSTR has an extra register operand. - if (ValReg == ARM::R3) - BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R2).addReg(ARM::R12); + if (UseRR) + MI.addRegOperand(FrameReg, false); // Use [reg, reg] addrmode. + else + MI.addRegOperand(0, false); // tSTR has an extra register operand. + if (ValReg == ARM::R3) { + MachineBasicBlock::iterator NII = next(II); + BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R2).addReg(ARM::R12); + } } else assert(false && "Unexpected opcode!"); } else { @@ -1152,13 +1181,23 @@ AFI->getGPRCalleeSavedArea2Size() + AFI->getDPRCalleeSavedAreaSize()); if (isThumb) { - if (MBBI->getOpcode() == ARM::tBX_RET && - &MBB.front() != MBBI && - prior(MBBI)->getOpcode() == ARM::tPOP) { - MachineBasicBlock::iterator PMBBI = prior(MBBI); - emitSPUpdate(MBB, PMBBI, NumBytes, isThumb, TII); - } else - emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII); + if (hasFP(MF)) { + NumBytes = AFI->getFramePtrSpillOffset() - NumBytes; + // Reset SP based on frame pointer only if the stack frame extends beyond + // frame pointer stack slot or target is ELF and the function has FP. + if (NumBytes) + emitThumbRegPlusImmediate(MBB, MBBI, ARM::SP, FramePtr, -NumBytes, TII); + else + BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::SP).addReg(FramePtr); + } else { + if (MBBI->getOpcode() == ARM::tBX_RET && + &MBB.front() != MBBI && + prior(MBBI)->getOpcode() == ARM::tPOP) { + MachineBasicBlock::iterator PMBBI = prior(MBBI); + emitSPUpdate(MBB, PMBBI, NumBytes, isThumb, TII); + } else + emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII); + } } else { // Darwin ABI requires FP to point to the stack slot that contains the // previous FP. From evan.cheng at apple.com Wed Feb 7 02:38:13 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 02:38:13 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/README-Thumb.txt Message-ID: <200702070838.l178cDMX030625@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: README-Thumb.txt updated: 1.6 -> 1.7 --- Log message: Update --- Diffs of the changes: (+4 -0) README-Thumb.txt | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/Target/ARM/README-Thumb.txt diff -u llvm/lib/Target/ARM/README-Thumb.txt:1.6 llvm/lib/Target/ARM/README-Thumb.txt:1.7 --- llvm/lib/Target/ARM/README-Thumb.txt:1.6 Tue Feb 6 18:06:56 2007 +++ llvm/lib/Target/ARM/README-Thumb.txt Wed Feb 7 02:37:57 2007 @@ -141,3 +141,7 @@ add r2, sp, #255 * 4 add r2, #132 ldr r2, [r2, #7 * 4] + +This is especially bad when dynamic alloca is used. The all fixed size stack +objects are referenced off the frame pointer with negative offsets. See +oggenc for an example. From evan.cheng at apple.com Wed Feb 7 03:17:52 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 03:17:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMMachineFunctionInfo.h ARMRegisterInfo.cpp Message-ID: <200702070917.l179HqB7031329@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMMachineFunctionInfo.h updated: 1.5 -> 1.6 ARMRegisterInfo.cpp updated: 1.61 -> 1.62 --- Log message: In thumb mode, R3 is reserved, but it can be live in to the function. If that is the case, whenever we use it as a scratch register, save it to R12 first and then restore it after the use. This is a temporary and truly horrible workaround! --- Diffs of the changes: (+32 -7) ARMMachineFunctionInfo.h | 13 +++++++++++-- ARMRegisterInfo.cpp | 26 +++++++++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) Index: llvm/lib/Target/ARM/ARMMachineFunctionInfo.h diff -u llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.5 llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.6 --- llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.5 Mon Jan 29 19:18:38 2007 +++ llvm/lib/Target/ARM/ARMMachineFunctionInfo.h Wed Feb 7 03:17:36 2007 @@ -40,6 +40,10 @@ /// far jump. bool LRForceSpilled; + /// R3IsLiveIn - True if R3 is live in to this function. + /// + bool R3IsLiveIn; + /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer /// spill stack offset. unsigned FramePtrSpillOffset; @@ -75,13 +79,15 @@ public: ARMFunctionInfo() : isThumb(false), - VarArgsRegSaveSize(0), HasStackFrame(false), LRForceSpilled(false), + VarArgsRegSaveSize(0), HasStackFrame(false), + LRForceSpilled(false), R3IsLiveIn(false), FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0), GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), JumpTableUId(0) {} ARMFunctionInfo(MachineFunction &MF) : isThumb(MF.getTarget().getSubtarget().isThumb()), - VarArgsRegSaveSize(0), HasStackFrame(false), LRForceSpilled(false), + VarArgsRegSaveSize(0), HasStackFrame(false), + LRForceSpilled(false), R3IsLiveIn(false), FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0), GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), JumpTableUId(0) {} @@ -96,6 +102,9 @@ bool isLRForceSpilled() const { return LRForceSpilled; } void setLRIsForceSpilled(bool s) { LRForceSpilled = s; } + bool isR3IsLiveIn() const { return R3IsLiveIn; } + void setR3IsLiveIn(bool l) { R3IsLiveIn = l; } + unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; } void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; } Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.61 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.62 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.61 Wed Feb 7 02:37:31 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 03:17:36 2007 @@ -401,7 +401,10 @@ if (NumBytes <= 255 && NumBytes >= 0) BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); - else + else if (NumBytes < 0 && NumBytes >= -255) { + BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); + BuildMI(MBB, MBBI, TII.get(ARM::tNEG), LdReg).addReg(LdReg); + } else emitLoadConstPool(MBB, MBBI, LdReg, NumBytes, TII); // Emit add / sub. @@ -811,7 +814,7 @@ // being storing here. If that's the case, we do the following: // r12 = r2 // Use r2 to materialize sp + offset - // str r12, r2 + // str r3, r2 // r2 = r12 unsigned ValReg = MI.getOperand(0).getReg(); unsigned TmpReg = ARM::R3; @@ -820,6 +823,8 @@ BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R2); TmpReg = ARM::R2; } + if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn()) + BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3); if (Opcode == ARM::tSpill) { if (FrameReg == ARM::SP) emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg,Offset,false,TII); @@ -835,10 +840,12 @@ MI.addRegOperand(FrameReg, false); // Use [reg, reg] addrmode. else MI.addRegOperand(0, false); // tSTR has an extra register operand. - if (ValReg == ARM::R3) { - MachineBasicBlock::iterator NII = next(II); + + MachineBasicBlock::iterator NII = next(II); + if (ValReg == ARM::R3) BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R2).addReg(ARM::R12); - } + if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn()) + BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R3).addReg(ARM::R12); } else assert(false && "Unexpected opcode!"); } else { @@ -1032,6 +1039,15 @@ const std::vector &CSI = MFI->getCalleeSavedInfo(); if (isThumb) { + // Check if R3 is live in. It might have to be used as a scratch register. + for (MachineFunction::livein_iterator I=MF.livein_begin(),E=MF.livein_end(); + I != E; ++I) { + if ((*I).first == ARM::R3) { + AFI->setR3IsLiveIn(true); + break; + } + } + // Thumb add/sub sp, imm8 instructions implicitly multiply the offset by 4. NumBytes = (NumBytes + 3) & ~3; MFI->setStackSize(NumBytes); From evan.cheng at apple.com Wed Feb 7 03:22:31 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 03:22:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/README-Thumb.txt Message-ID: <200702070922.l179MVol031418@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: README-Thumb.txt updated: 1.7 -> 1.8 --- Log message: New entry. --- Diffs of the changes: (+9 -0) README-Thumb.txt | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/lib/Target/ARM/README-Thumb.txt diff -u llvm/lib/Target/ARM/README-Thumb.txt:1.7 llvm/lib/Target/ARM/README-Thumb.txt:1.8 --- llvm/lib/Target/ARM/README-Thumb.txt:1.7 Wed Feb 7 02:37:57 2007 +++ llvm/lib/Target/ARM/README-Thumb.txt Wed Feb 7 03:22:15 2007 @@ -145,3 +145,12 @@ This is especially bad when dynamic alloca is used. The all fixed size stack objects are referenced off the frame pointer with negative offsets. See oggenc for an example. + +//===---------------------------------------------------------------------===// + +We are reserving R3 as a scratch register under thumb mode. So if it is live in +to the function, we save / restore R3 to / from R12. Until register scavenging +is done, we should save R3 to a high callee saved reg at emitPrologue time +(when hasFP is true or stack size is large) and restore R3 from that register +instead. This allows us to at least get rid of the save to r12 everytime it is +used. From evan.cheng at apple.com Wed Feb 7 03:24:19 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 03:24:19 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/ARM/dyn-stackalloc.ll Message-ID: <200702070924.l179OJKS031465@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/ARM: dyn-stackalloc.ll updated: 1.1 -> 1.2 --- Log message: New test case. --- Diffs of the changes: (+36 -6) dyn-stackalloc.ll | 42 ++++++++++++++++++++++++++++++++++++------ 1 files changed, 36 insertions(+), 6 deletions(-) Index: llvm/test/CodeGen/ARM/dyn-stackalloc.ll diff -u llvm/test/CodeGen/ARM/dyn-stackalloc.ll:1.1 llvm/test/CodeGen/ARM/dyn-stackalloc.ll:1.2 --- llvm/test/CodeGen/ARM/dyn-stackalloc.ll:1.1 Tue Feb 6 01:18:27 2007 +++ llvm/test/CodeGen/ARM/dyn-stackalloc.ll Wed Feb 7 03:24:03 2007 @@ -1,11 +1,13 @@ ; RUN: llvm-as < %s | llc -march=arm && ; RUN: llvm-as < %s | llc -march=arm -enable-thumb && -; RUN: llvm-as < %s | llc -march=arm -enable-thumb | not grep "ldr sp" +; RUN: llvm-as < %s | llc -march=arm -enable-thumb | not grep "ldr sp" && +; RUN: llvm-as < %s | llc -march=arm -mtriple=arm-apple-darwin -enable-thumb | not grep "sub.*r7" && +; RUN: llvm-as < %s | llc -march=arm -enable-thumb | grep 4294967280 %struct.state = type { i32, %struct.info*, float**, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, i8* } %struct.info = type { i32, i32, i32, i32, i32, i32, i32, i8* } -define void @f1(%struct.state* %v) { +define void @t1(%struct.state* %v) { %tmp6 = load i32* null %tmp8 = alloca float, i32 %tmp6 store i32 1, i32* null @@ -15,16 +17,44 @@ br i1 false, label %bb43, label %return bb43: - call fastcc void @f2( float* %tmp8, float* null, i32 0 ) + call fastcc void @f1( float* %tmp8, float* null, i32 0 ) %tmp70 = load i32* null %tmp85 = getelementptr float* %tmp8, i32 0 - call fastcc void @f3( float* null, float* null, float* %tmp85, i32 %tmp70 ) + call fastcc void @f2( float* null, float* null, float* %tmp85, i32 %tmp70 ) ret void return: ret void } -declare fastcc void @f2(float*, float*, i32) +declare fastcc void @f1(float*, float*, i32) -declare fastcc void @f3(float*, float*, float*, i32) +declare fastcc void @f2(float*, float*, float*, i32) + + %struct.comment = type { i8**, i32*, i32, i8* } + at str215 = external global [2 x i8] + +define void @t2(%struct.comment* %vc, i8* %tag, i8* %contents) { + %tmp1 = call i32 @strlen( i8* %tag ) + %tmp3 = call i32 @strlen( i8* %contents ) + %tmp4 = add i32 %tmp1, 2 + %tmp5 = add i32 %tmp4, %tmp3 + %tmp6 = alloca i8, i32 %tmp5 + %tmp9 = call i8* @strcpy( i8* %tmp6, i8* %tag ) + %tmp6.len = call i32 @strlen( i8* %tmp6 ) + %tmp6.indexed = getelementptr i8* %tmp6, i32 %tmp6.len + call void @llvm.memcpy.i32( i8* %tmp6.indexed, i8* getelementptr ([2 x i8]* @str215, i32 0, i32 0), i32 2, i32 1 ) + %tmp15 = call i8* @strcat( i8* %tmp6, i8* %contents ) + call fastcc void @comment_add( %struct.comment* %vc, i8* %tmp6 ) + ret void +} + +declare i32 @strlen(i8*) + +declare i8* @strcat(i8*, i8*) + +declare fastcc void @comment_add(%struct.comment*, i8*) + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +declare i8* @strcpy(i8*, i8*) From lauro.venancio at gmail.com Wed Feb 7 10:59:37 2007 From: lauro.venancio at gmail.com (Lauro Ramos Venancio) Date: Wed, 7 Feb 2007 10:59:37 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702071659.l17Gxb5b007354@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.3 -> 1.4 --- Log message: Fix build error. include/llvm/ADT/APInt.h:326: error: ???assert??? was not declared in this scope --- Diffs of the changes: (+1 -0) APInt.h | 1 + 1 files changed, 1 insertion(+) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.3 llvm/include/llvm/ADT/APInt.h:1.4 --- llvm/include/llvm/ADT/APInt.h:1.3 Tue Feb 6 23:58:38 2007 +++ llvm/include/llvm/ADT/APInt.h Wed Feb 7 10:59:17 2007 @@ -16,6 +16,7 @@ #define LLVM_APINT_H #include "llvm/Support/DataTypes.h" +#include #include namespace llvm { From reid at x10sys.com Wed Feb 7 13:13:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 13:13:35 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200702071913.l17JDZHS014540@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.423 -> 1.424 --- Log message: Make the cleaning of BUILT_SOURCES be a "clean-all" target item, not a "clean" target item. This gets around having the built sources disappear when only one build mode wants to be cleaned. With the "clean-all" target, all build modes are cleaned so it also makes sense to clean out the built sources at that point. --- Diffs of the changes: (+1 -1) Makefile.rules | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.423 llvm/Makefile.rules:1.424 --- llvm/Makefile.rules:1.423 Tue Feb 6 21:29:29 2007 +++ llvm/Makefile.rules Wed Feb 7 13:13:19 2007 @@ -85,7 +85,7 @@ #------------------------------------------------------------------------ $(filter-out clean clean-local,$(UserTargets)):: $(BUILT_SOURCES) -clean-local:: +clean-all-local:: ifneq ($(strip $(BUILT_SOURCES)),) -$(Verb) $(RM) -f $(BUILT_SOURCES) endif From sabre at nondot.org Wed Feb 7 13:29:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 13:29:08 -0600 Subject: [llvm-commits] CVS: llvm/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll Message-ID: <200702071929.l17JT8dE015017@zion.cs.uiuc.edu> Changes in directory llvm/test/Transforms/DeadArgElim: 2007-02-07-FuncRename.ll added (r1.1) --- Log message: Testcase for a bug responsible for GCC bootstrap failure, fallout from PR411: http://llvm.org/PR411 . --- Diffs of the changes: (+11 -0) 2007-02-07-FuncRename.ll | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll diff -c /dev/null llvm/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll:1.1 *** /dev/null Wed Feb 7 13:29:02 2007 --- llvm/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll Wed Feb 7 13:28:52 2007 *************** *** 0 **** --- 1,11 ---- + ; RUN: llvm-as < %s | opt -deadargelim | llvm-dis | grep '@test(' && + ; RUN: llvm-as < %s | opt -deadargelim | llvm-dis | not grep dead + + define internal i32 @test(i32 %X, i32 %dead) { + ret i32 %X + } + + define i32 @caller() { + %A = call i32 @test(i32 123, i32 456) + ret i32 %A + } From sabre at nondot.org Wed Feb 7 13:31:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 13:31:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp Message-ID: <200702071931.l17JVpsm015150@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: DeadArgumentElimination.cpp updated: 1.37 -> 1.38 --- Log message: Fix Transforms/DeadArgElim/2007-02-07-FuncRename.ll, fallout from PR411: http://llvm.org/PR411 . This happened because deadargelim now causes VMCore to auto-rename every function that it hacks arguments out of. Because it hacks arguments out of functions in a non-deterministic order, this caused the resultant numbering to be nondet. The fix is to just be careful to not rename functions! --- Diffs of the changes: (+4 -2) DeadArgumentElimination.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp diff -u llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.37 llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.38 --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.37 Mon Feb 5 17:32:05 2007 +++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp Wed Feb 7 13:31:33 2007 @@ -150,7 +150,8 @@ unsigned NumArgs = Params.size(); // Create the new function body and insert it into the module... - Function *NF = new Function(NFTy, Fn.getLinkage(), Fn.getName()); + std::string Name = Fn.getName(); Fn.setName(""); + Function *NF = new Function(NFTy, Fn.getLinkage(), Name); NF->setCallingConv(Fn.getCallingConv()); Fn.getParent()->getFunctionList().insert(&Fn, NF); @@ -508,7 +509,8 @@ FunctionType *NFTy = FunctionType::get(RetTy, Params, FTy->isVarArg()); // Create the new function body and insert it into the module... - Function *NF = new Function(NFTy, F->getLinkage(), F->getName()); + std::string Name = F->getName(); F->setName(""); + Function *NF = new Function(NFTy, F->getLinkage(), Name); NF->setCallingConv(F->getCallingConv()); F->getParent()->getFunctionList().insert(F, NF); From dpatel at apple.com Wed Feb 7 13:38:09 2007 From: dpatel at apple.com (Devang Patel) Date: Wed, 7 Feb 2007 13:38:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp Message-ID: <200702071938.l17Jc9i8015358@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: PassManager.cpp updated: 1.134 -> 1.135 --- Log message: Do not drop transferred last uses on the floor. Use handleLastUserOverflow(). --- Diffs of the changes: (+3 -0) PassManager.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/VMCore/PassManager.cpp diff -u llvm/lib/VMCore/PassManager.cpp:1.134 llvm/lib/VMCore/PassManager.cpp:1.135 --- llvm/lib/VMCore/PassManager.cpp:1.134 Mon Feb 5 13:34:17 2007 +++ llvm/lib/VMCore/PassManager.cpp Wed Feb 7 13:37:53 2007 @@ -157,6 +157,7 @@ recordAvailableAnalysis(IP); } else { P->assignPassManager(activeStack); + activeStack.handleLastUserOverflow(); } } @@ -255,6 +256,7 @@ recordAvailableAnalysis(IP); } else { P->assignPassManager(activeStack); + activeStack.handleLastUserOverflow(); } } @@ -1220,6 +1222,7 @@ if (!TLU.empty()) { Pass *P = dynamic_cast(Parent); TPM->setLastUser(TLU, P); + TLU.clear(); } } } From sabre at nondot.org Wed Feb 7 13:49:17 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 13:49:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Reader.h ReaderWrappers.cpp Message-ID: <200702071949.l17JnHgk015785@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.233 -> 1.234 Reader.h updated: 1.45 -> 1.46 ReaderWrappers.cpp updated: 1.62 -> 1.63 --- Log message: Move compressor out of the core Reader.cpp file. --- Diffs of the changes: (+14 -6) Reader.cpp | 6 +++--- Reader.h | 4 ++++ ReaderWrappers.cpp | 10 +++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.233 llvm/lib/Bytecode/Reader/Reader.cpp:1.234 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.233 Wed Feb 7 00:53:02 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Feb 7 13:49:01 2007 @@ -27,7 +27,6 @@ #include "llvm/Bytecode/Format.h" #include "llvm/Config/alloca.h" #include "llvm/Support/GetElementPtrTypeIterator.h" -#include "llvm/Support/Compressor.h" #include "llvm/Support/MathExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" @@ -1982,6 +1981,7 @@ /// and \p Length parameters. bool BytecodeReader::ParseBytecode(volatile BufPtr Buf, unsigned Length, const std::string &ModuleID, + Decompressor_t *Decompressor, std::string* ErrMsg) { /// We handle errors by @@ -2021,8 +2021,8 @@ // file's magic number which is not part of the compressed block. Hence, // the Buf+4 and Length-4. The result goes into decompressedBlock, a data // member for retention until BytecodeReader is destructed. - unsigned decompressedLength = Compressor::decompressToNewBuffer( - (char*)Buf+4,Length-4,decompressedBlock); + unsigned decompressedLength = + Decompressor((char*)Buf+4,Length-4,decompressedBlock, 0); // We must adjust the buffer pointers used by the bytecode reader to point // into the new decompressed block. After decompression, the Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.45 llvm/lib/Bytecode/Reader/Reader.h:1.46 --- llvm/lib/Bytecode/Reader/Reader.h:1.45 Tue Feb 6 23:08:39 2007 +++ llvm/lib/Bytecode/Reader/Reader.h Wed Feb 7 13:49:01 2007 @@ -140,12 +140,16 @@ /// @name Methods /// @{ public: + + typedef size_t Decompressor_t(const char *, size_t, char*&, std::string*); + /// @returns true if an error occurred /// @brief Main interface to parsing a bytecode buffer. bool ParseBytecode( volatile BufPtr Buf, ///< Beginning of the bytecode buffer unsigned Length, ///< Length of the bytecode buffer const std::string &ModuleID, ///< An identifier for the module constructed. + Decompressor_t *Decompressor = 0, ///< Optional decompressor. std::string* ErrMsg = 0 ///< Optional place for error message ); Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.62 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.63 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.62 Tue Jan 30 14:08:37 2007 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Feb 7 13:49:01 2007 @@ -18,6 +18,7 @@ #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Compressor.h" #include "llvm/System/MappedFile.h" #include "llvm/System/Program.h" #include @@ -63,7 +64,8 @@ return true; } unsigned char* buffer = reinterpret_cast(mapFile.base()); - return ParseBytecode(buffer, mapFile.size(), fileName, ErrMsg); + return ParseBytecode(buffer, mapFile.size(), fileName, + Compressor::decompressToNewBuffer, ErrMsg); } //===----------------------------------------------------------------------===// @@ -122,7 +124,8 @@ ParseBegin = Buffer = Buf; MustDelete = false; } - if (ParseBytecode(ParseBegin, Length, ModuleID, ErrMsg)) { + if (ParseBytecode(ParseBegin, Length, ModuleID, + Compressor::decompressToNewBuffer, ErrMsg)) { if (MustDelete) delete [] Buffer; return true; } @@ -177,7 +180,8 @@ } FileBuf = &FileData[0]; - if (ParseBytecode(FileBuf, FileData.size(), "", ErrMsg)) + if (ParseBytecode(FileBuf, FileData.size(), "", + Compressor::decompressToNewBuffer, ErrMsg)) return true; return false; } From scottm at rushg.aero.org Wed Feb 7 14:12:47 2007 From: scottm at rushg.aero.org (Scott Michel) Date: Wed, 7 Feb 2007 12:12:47 -0800 Subject: [llvm-commits] TargetData patch Message-ID: <20070207201246.GA20800@rush.aero.org> Incorporated suggestions from Chris. Rebsubmitted patch. -- Scott Michel scottm at aero.org High Performance Hardware Section Manager 310/336-5034 Computer Systems Research Department The Aerospace Corporation -------------- next part -------------- A non-text attachment was scrubbed... Name: TargetData.diff Type: text/x-diff Size: 49851 bytes Desc: TargetData resubmitted patch Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070207/876fe6b9/attachment.bin -------------- next part -------------- A non-text attachment was scrubbed... Name: llvm-cfrontend.diff Type: text/x-diff Size: 2359 bytes Desc: C frontend patches to accompany TargetData patch Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070207/876fe6b9/attachment-0001.bin From jlaskey at apple.com Wed Feb 7 14:38:49 2007 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 7 Feb 2007 14:38:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Function.cpp Message-ID: <200702072038.l17KcnJH017091@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Function.cpp updated: 1.111 -> 1.112 --- Log message: Automatically generating intrinsic declarations from Dan Gohman. Modified to construct FunctionType in separate function, and, have getDeclaration return a Function instead of a Constant. --- Diffs of the changes: (+19 -0) Function.cpp | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/lib/VMCore/Function.cpp diff -u llvm/lib/VMCore/Function.cpp:1.111 llvm/lib/VMCore/Function.cpp:1.112 --- llvm/lib/VMCore/Function.cpp:1.111 Mon Feb 5 14:47:20 2007 +++ llvm/lib/VMCore/Function.cpp Wed Feb 7 14:38:26 2007 @@ -183,6 +183,25 @@ return Table[id]; } +const FunctionType *Intrinsic::getType(ID id) { + const Type *ResultTy = NULL; + std::vector ArgTys; + std::vector Attrs; + bool IsVarArg = false; + +#define GET_INTRINSIC_GENERATOR +#include "llvm/Intrinsics.gen" +#undef GET_INTRINSIC_GENERATOR + + return FunctionType::get(ResultTy, ArgTys, IsVarArg, Attrs); +} + +Function *Intrinsic::getDeclaration(Module *M, ID id) { +// There can never be multiple globals with the same name of different types, +// because intrinsics must be a specific type. + return cast(M->getOrInsertFunction(getName(id), getType(id))); +} + Value *IntrinsicInst::StripPointerCasts(Value *Ptr) { if (ConstantExpr *CE = dyn_cast(Ptr)) { if (CE->getOpcode() == Instruction::BitCast) { From jlaskey at apple.com Wed Feb 7 14:38:49 2007 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 7 Feb 2007 14:38:49 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Intrinsics.h Intrinsics.td Message-ID: <200702072038.l17Kcnpm017092@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Intrinsics.h updated: 1.40 -> 1.41 Intrinsics.td updated: 1.43 -> 1.44 --- Log message: Automatically generating intrinsic declarations from Dan Gohman. Modified to construct FunctionType in separate function, and, have getDeclaration return a Function instead of a Constant. --- Diffs of the changes: (+30 -7) Intrinsics.h | 13 +++++++++++++ Intrinsics.td | 24 +++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) Index: llvm/include/llvm/Intrinsics.h diff -u llvm/include/llvm/Intrinsics.h:1.40 llvm/include/llvm/Intrinsics.h:1.41 --- llvm/include/llvm/Intrinsics.h:1.40 Sat Mar 25 00:32:07 2006 +++ llvm/include/llvm/Intrinsics.h Wed Feb 7 14:38:26 2007 @@ -18,6 +18,10 @@ namespace llvm { +class FunctionType; +class Function; +class Module; + /// Intrinsic Namespace - This namespace contains an enum with a value for /// every intrinsic/builtin function known by LLVM. These enum values are /// returned by Function::getIntrinsicID(). @@ -36,6 +40,15 @@ /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as /// "llvm.ppc.altivec.lvx". const char *getName(ID id); + + /// Intrinsic::getType(ID) - Return the function type for an intrinsic. + /// + const FunctionType *getType(ID id); + + /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function + /// declaration for an intrinsic, and return it. + Function *getDeclaration(Module *M, ID id); + } // End Intrinsic namespace } // End llvm namespace Index: llvm/include/llvm/Intrinsics.td diff -u llvm/include/llvm/Intrinsics.td:1.43 llvm/include/llvm/Intrinsics.td:1.44 --- llvm/include/llvm/Intrinsics.td:1.43 Tue Feb 6 12:19:44 2007 +++ llvm/include/llvm/Intrinsics.td Wed Feb 7 14:38:26 2007 @@ -68,6 +68,15 @@ LLVMType ElTy = elty; } +class LLVMPointerType + : LLVMType{ + LLVMType ElTy = elty; +} + +class LLVMEmptyStructType + : LLVMType{ +} + def llvm_void_ty : LLVMType; def llvm_bool_ty : LLVMIntegerType; def llvm_i8_ty : LLVMIntegerType; @@ -76,9 +85,10 @@ def llvm_i64_ty : LLVMIntegerType; def llvm_float_ty : LLVMType; def llvm_double_ty : LLVMType; -def llvm_ptr_ty : LLVMType; // i8* -def llvm_ptrptr_ty : LLVMType; // i8** -def llvm_descriptor_ty : LLVMType; // global* +def llvm_ptr_ty : LLVMPointerType; // i8* +def llvm_ptrptr_ty : LLVMPointerType; // i8** +def llvm_empty_ty : LLVMEmptyStructType; // { } +def llvm_descriptor_ty : LLVMPointerType; // { }* def llvm_v16i8_ty : LLVMPackedType; // 16 x i8 def llvm_v8i16_ty : LLVMPackedType; // 8 x i16 @@ -123,10 +133,10 @@ //===--------------- Variable Argument Handling Intrinsics ----------------===// // -def int_vastart : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty], [], "llvm.va_start">; -def int_vacopy : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty, llvm_ptrptr_ty], [], +def int_vastart : Intrinsic<[llvm_void_ty, llvm_ptr_ty], [], "llvm.va_start">; +def int_vacopy : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty], [], "llvm.va_copy">; -def int_vaend : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty], [], "llvm.va_end">; +def int_vaend : Intrinsic<[llvm_void_ty, llvm_ptr_ty], [], "llvm.va_end">; //===------------------- Garbage Collection Intrinsics --------------------===// // @@ -216,7 +226,7 @@ def int_dbg_region_start : Intrinsic<[llvm_void_ty, llvm_descriptor_ty]>; def int_dbg_region_end : Intrinsic<[llvm_void_ty, llvm_descriptor_ty]>; def int_dbg_func_start : Intrinsic<[llvm_void_ty, llvm_descriptor_ty]>; -def int_dbg_declare : Intrinsic<[llvm_void_ty, llvm_ptr_ty, +def int_dbg_declare : Intrinsic<[llvm_void_ty, llvm_descriptor_ty, llvm_descriptor_ty]>; //===------------------ Exception Handling Intrinsics----------------------===// From jlaskey at apple.com Wed Feb 7 14:38:49 2007 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 7 Feb 2007 14:38:49 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/IntrinsicEmitter.cpp IntrinsicEmitter.h Message-ID: <200702072038.l17Kcnfb017102@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: IntrinsicEmitter.cpp updated: 1.24 -> 1.25 IntrinsicEmitter.h updated: 1.9 -> 1.10 --- Log message: Automatically generating intrinsic declarations from Dan Gohman. Modified to construct FunctionType in separate function, and, have getDeclaration return a Function instead of a Constant. --- Diffs of the changes: (+73 -0) IntrinsicEmitter.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ IntrinsicEmitter.h | 2 + 2 files changed, 73 insertions(+) Index: llvm/utils/TableGen/IntrinsicEmitter.cpp diff -u llvm/utils/TableGen/IntrinsicEmitter.cpp:1.24 llvm/utils/TableGen/IntrinsicEmitter.cpp:1.25 --- llvm/utils/TableGen/IntrinsicEmitter.cpp:1.24 Tue Feb 6 12:30:58 2007 +++ llvm/utils/TableGen/IntrinsicEmitter.cpp Wed Feb 7 14:38:26 2007 @@ -38,6 +38,9 @@ // Emit the intrinsic verifier. EmitVerifier(Ints, OS); + // Emit the intrinsic declaration generator. + EmitGenerator(Ints, OS); + // Emit mod/ref info for each function. EmitModRefInfo(Ints, OS); @@ -125,6 +128,25 @@ return false; } +static void EmitTypeGenerate(std::ostream &OS, Record *ArgType) { + if (ArgType->isSubClassOf("LLVMIntegerType")) { + OS << "IntegerType::get(" << ArgType->getValueAsInt("Width") << ")"; + } else if (ArgType->isSubClassOf("LLVMPackedType")) { + OS << "PackedType::get("; + EmitTypeGenerate(OS, ArgType->getValueAsDef("ElTy")); + OS << ", " << ArgType->getValueAsInt("NumElts") << ")"; + } else if (ArgType->isSubClassOf("LLVMPointerType")) { + OS << "PointerType::get("; + EmitTypeGenerate(OS, ArgType->getValueAsDef("ElTy")); + OS << ")"; + } else if (ArgType->isSubClassOf("LLVMEmptyStructType")) { + OS << "StructType::get(std::vector())"; + } else { + OS << "Type::getPrimitiveType("; + OS << ArgType->getValueAsString("TypeVal") << ")"; + } +} + /// RecordListComparator - Provide a determinstic comparator for lists of /// records. namespace { @@ -188,6 +210,55 @@ OS << "#endif\n\n"; } +void IntrinsicEmitter::EmitGenerator(const std::vector &Ints, + std::ostream &OS) { + OS << "// Code for generating Intrinsic function declarations.\n"; + OS << "#ifdef GET_INTRINSIC_GENERATOR\n"; + OS << " switch (id) {\n"; + OS << " default: assert(0 && \"Invalid intrinsic!\");\n"; + + // Similar to GET_INTRINSIC_VERIFIER, batch up cases that have identical + // types. + typedef std::map, std::vector, + RecordListComparator> MapTy; + MapTy UniqueArgInfos; + + // Compute the unique argument type info. + for (unsigned i = 0, e = Ints.size(); i != e; ++i) + UniqueArgInfos[Ints[i].ArgTypeDefs].push_back(i); + + // Loop through the array, emitting one generator for each batch. + for (MapTy::iterator I = UniqueArgInfos.begin(), + E = UniqueArgInfos.end(); I != E; ++I) { + for (unsigned i = 0, e = I->second.size(); i != e; ++i) { + OS << " case Intrinsic::" << Ints[I->second[i]].EnumName << ":\t\t// " + << Ints[I->second[i]].Name << "\n"; + } + + const std::vector &ArgTypes = I->first; + unsigned N = ArgTypes.size(); + + if (ArgTypes[N-1]->getValueAsString("TypeVal") == "...") { + OS << " IsVarArg = true;\n"; + --N; + } + + OS << " ResultTy = "; + EmitTypeGenerate(OS, ArgTypes[0]); + OS << ";\n"; + + for (unsigned j = 1; j != N; ++j) { + OS << " ArgTys.push_back("; + EmitTypeGenerate(OS, ArgTypes[j]); + OS << ");\n"; + } + + OS << " break;\n"; + } + OS << " }\n"; + OS << "#endif\n\n"; +} + void IntrinsicEmitter::EmitModRefInfo(const std::vector &Ints, std::ostream &OS) { OS << "// BasicAliasAnalysis code.\n"; Index: llvm/utils/TableGen/IntrinsicEmitter.h diff -u llvm/utils/TableGen/IntrinsicEmitter.h:1.9 llvm/utils/TableGen/IntrinsicEmitter.h:1.10 --- llvm/utils/TableGen/IntrinsicEmitter.h:1.9 Thu Mar 23 19:13:55 2006 +++ llvm/utils/TableGen/IntrinsicEmitter.h Wed Feb 7 14:38:26 2007 @@ -35,6 +35,8 @@ std::ostream &OS); void EmitVerifier(const std::vector &Ints, std::ostream &OS); + void EmitGenerator(const std::vector &Ints, + std::ostream &OS); void EmitModRefInfo(const std::vector &Ints, std::ostream &OS); void EmitNoMemoryInfo(const std::vector &Ints, From evan.cheng at apple.com Wed Feb 7 15:18:48 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 15:18:48 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp ARMRegisterInfo.cpp Message-ID: <200702072118.l17LImSP019587@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.106 -> 1.107 ARMRegisterInfo.cpp updated: 1.62 -> 1.63 --- Log message: Get rid of references to iostream. --- Diffs of the changes: (+2 -4) ARMISelDAGToDAG.cpp | 1 - ARMRegisterInfo.cpp | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.106 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.107 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.106 Tue Feb 6 03:11:20 2007 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Wed Feb 7 15:18:32 2007 @@ -28,7 +28,6 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Support/Debug.h" -#include using namespace llvm; //===--------------------------------------------------------------------===// Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.62 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.63 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.62 Wed Feb 7 03:17:36 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 15:18:32 2007 @@ -31,7 +31,6 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/STLExtras.h" #include -#include using namespace llvm; unsigned ARMRegisterInfo::getRegisterNumbering(unsigned RegEnum) { @@ -70,7 +69,7 @@ case S30: return 30; case S31: return 31; default: - std::cerr << "Unknown ARM register!\n"; + assert(0 && "Unknown ARM register!"); abort(); } } @@ -738,7 +737,7 @@ break; } default: - std::cerr << "Unsupported addressing mode!\n"; + assert(0 && "Unsupported addressing mode!"); abort(); break; } From evan.cheng at apple.com Wed Feb 7 15:20:22 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 15:20:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702072120.l17LKMSc025203@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.63 -> 1.64 --- Log message: If sp offset will be materialized in a register. Clear the offset field of str / ldr. --- Diffs of the changes: (+10 -8) ARMRegisterInfo.cpp | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.63 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.64 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.63 Wed Feb 7 15:18:32 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 15:19:58 2007 @@ -762,16 +762,18 @@ return; } + bool isThumSpillRestore = Opcode == ARM::tRestore || Opcode == ARM::tSpill; + if (AddrMode == ARMII::AddrModeTs) { + // Thumb tLDRspi, tSTRspi. These will change to instructions that use + // a different base register. + NumBits = 5; + Mask = (1 << NumBits) - 1; + } // If this is a thumb spill / restore, we will be using a constpool load to // materialize the offset. - bool isThumSpillRestore = Opcode == ARM::tRestore || Opcode == ARM::tSpill; - if (AddrMode == ARMII::AddrModeTs && !isThumSpillRestore) { - if (AddrMode == ARMII::AddrModeTs) { - // Thumb tLDRspi, tSTRspi. These will change to instructions that use - // a different base register. - NumBits = 5; - Mask = (1 << NumBits) - 1; - } + if (AddrMode == ARMII::AddrModeTs && isThumSpillRestore) + ImmOp.ChangeToImmediate(0); + else { // Otherwise, it didn't fit. Pull in what we can to simplify the immed. ImmedOffset = ImmedOffset & Mask; if (isSub) From evan.cheng at apple.com Wed Feb 7 15:24:25 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 15:24:25 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702072124.l17LOPS3031948@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.64 -> 1.65 --- Log message: Rename. --- Diffs of the changes: (+7 -6) ARMRegisterInfo.cpp | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.64 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.65 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.64 Wed Feb 7 15:19:58 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 15:24:09 2007 @@ -371,11 +371,12 @@ BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), DestReg).addConstantPoolIndex(Idx); } -/// emitThumbRegPlusConstPool - Emits a series of instructions to materialize -/// a destreg = basereg + immediate in Thumb code. Load the immediate from a +/// emitThumbRegPlusImmInReg - Emits a series of instructions to materialize +/// a destreg = basereg + immediate in Thumb code. Materialize the immediate +/// in a register using mov / mvn sequences or load the immediate from a /// constpool entry. static -void emitThumbRegPlusConstPool(MachineBasicBlock &MBB, +void emitThumbRegPlusImmInReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, unsigned DestReg, unsigned BaseReg, int NumBytes, bool CanChangeCC, @@ -471,7 +472,7 @@ if (NumMIs > Threshold) { // This will expand into too many instructions. Load the immediate from a // constpool entry. - emitThumbRegPlusConstPool(MBB, MBBI, DestReg, BaseReg, NumBytes, true, TII); + emitThumbRegPlusImmInReg(MBB, MBBI, DestReg, BaseReg, NumBytes, true, TII); return; } @@ -795,7 +796,7 @@ bool UseRR = false; if (Opcode == ARM::tRestore) { if (FrameReg == ARM::SP) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg,Offset,false,TII); + emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg,Offset,false,TII); else { emitLoadConstPool(MBB, II, TmpReg, Offset, TII); UseRR = true; @@ -828,7 +829,7 @@ BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3); if (Opcode == ARM::tSpill) { if (FrameReg == ARM::SP) - emitThumbRegPlusConstPool(MBB, II, TmpReg, FrameReg,Offset,false,TII); + emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg,Offset,false,TII); else { emitLoadConstPool(MBB, II, TmpReg, Offset, TII); UseRR = true; From sabre at nondot.org Wed Feb 7 15:41:49 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:49 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-link/llvm-link.cpp Message-ID: <200702072141.l17LfnWL032545@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-link: llvm-link.cpp updated: 1.62 -> 1.63 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llvm-link.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-link/llvm-link.cpp diff -u llvm/tools/llvm-link/llvm-link.cpp:1.62 llvm/tools/llvm-link/llvm-link.cpp:1.63 --- llvm/tools/llvm-link/llvm-link.cpp:1.62 Sun Jan 21 00:30:37 2007 +++ llvm/tools/llvm-link/llvm-link.cpp Wed Feb 7 15:41:02 2007 @@ -59,7 +59,9 @@ std::string ErrorMessage; if (Filename.exists()) { if (Verbose) cerr << "Loading '" << Filename.c_str() << "'\n"; - Module* Result = ParseBytecodeFile(Filename.toString(), &ErrorMessage); + Module* Result = ParseBytecodeFile(Filename.toString(), + Compressor::decompressToNewBuffer, + &ErrorMessage); if (Result) return std::auto_ptr(Result); // Load successful! if (Verbose) { From sabre at nondot.org Wed Feb 7 15:41:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:51 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvmc/CompilerDriver.cpp Message-ID: <200702072141.l17LfpNY032552@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvmc: CompilerDriver.cpp updated: 1.42 -> 1.43 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) CompilerDriver.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvmc/CompilerDriver.cpp diff -u llvm/tools/llvmc/CompilerDriver.cpp:1.42 llvm/tools/llvmc/CompilerDriver.cpp:1.43 --- llvm/tools/llvmc/CompilerDriver.cpp:1.42 Thu Nov 2 14:25:50 2006 +++ llvm/tools/llvmc/CompilerDriver.cpp Wed Feb 7 15:41:02 2007 @@ -569,7 +569,9 @@ if (fullpath.isBytecodeFile()) { // Process the dependent libraries recursively Module::LibraryListType modlibs; - if (GetBytecodeDependentLibraries(fullpath.toString(),modlibs,&err)) { + if (GetBytecodeDependentLibraries(fullpath.toString(),modlibs, + Compressor::decompressToNewBuffer, + &err)) { // Traverse the dependent libraries list Module::lib_iterator LI = modlibs.begin(); Module::lib_iterator LE = modlibs.end(); From sabre at nondot.org Wed Feb 7 15:41:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:51 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm2cpp/llvm2cpp.cpp Message-ID: <200702072141.l17Lfp0b032551@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm2cpp: llvm2cpp.cpp updated: 1.6 -> 1.7 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llvm2cpp.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvm2cpp/llvm2cpp.cpp diff -u llvm/tools/llvm2cpp/llvm2cpp.cpp:1.6 llvm/tools/llvm2cpp/llvm2cpp.cpp:1.7 --- llvm/tools/llvm2cpp/llvm2cpp.cpp:1.6 Tue Dec 5 19:18:01 2006 +++ llvm/tools/llvm2cpp/llvm2cpp.cpp Wed Feb 7 15:41:02 2007 @@ -49,7 +49,9 @@ int exitCode = 0; std::ostream *Out = 0; std::string ErrorMessage; - std::auto_ptr M(ParseBytecodeFile(InputFilename, &ErrorMessage)); + std::auto_ptr M(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer, + &ErrorMessage)); if (M.get() == 0) { std::cerr << argv[0] << ": "; if (ErrorMessage.size()) From sabre at nondot.org Wed Feb 7 15:41:52 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/Linker.cpp Message-ID: <200702072141.l17Lfqkt032560@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: Linker.cpp updated: 1.13 -> 1.14 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+4 -1) Linker.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Linker/Linker.cpp diff -u llvm/lib/Linker/Linker.cpp:1.13 llvm/lib/Linker/Linker.cpp:1.14 --- llvm/lib/Linker/Linker.cpp:1.13 Wed Dec 6 19:30:31 2006 +++ llvm/lib/Linker/Linker.cpp Wed Feb 7 15:41:02 2007 @@ -16,6 +16,7 @@ #include "llvm/Bytecode/Reader.h" #include "llvm/Config/config.h" #include "llvm/Support/Streams.h" +#include "llvm/Support/Compressor.h" using namespace llvm; Linker::Linker(const std::string& progname, const std::string& modname, unsigned flags) @@ -99,7 +100,9 @@ std::auto_ptr Linker::LoadObject(const sys::Path &FN) { std::string ParseErrorMessage; - Module *Result = ParseBytecodeFile(FN.toString(), &ParseErrorMessage); + Module *Result = ParseBytecodeFile(FN.toString(), + Compressor::decompressToNewBuffer, + &ParseErrorMessage); if (Result) return std::auto_ptr(Result); Error = "Bytecode file '" + FN.toString() + "' could not be loaded"; From sabre at nondot.org Wed Feb 7 15:41:52 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:52 -0600 Subject: [llvm-commits] CVS: llvm/tools/opt/opt.cpp Message-ID: <200702072141.l17Lfq0A032563@zion.cs.uiuc.edu> Changes in directory llvm/tools/opt: opt.cpp updated: 1.130 -> 1.131 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+2 -1) opt.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/tools/opt/opt.cpp diff -u llvm/tools/opt/opt.cpp:1.130 llvm/tools/opt/opt.cpp:1.131 --- llvm/tools/opt/opt.cpp:1.130 Mon Feb 5 14:47:22 2007 +++ llvm/tools/opt/opt.cpp Wed Feb 7 15:41:02 2007 @@ -254,7 +254,8 @@ std::string ErrorMessage; // Load the input module... - std::auto_ptr M(ParseBytecodeFile(InputFilename, &ErrorMessage)); + std::auto_ptr M(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer, &ErrorMessage)); if (M.get() == 0) { cerr << argv[0] << ": "; if (ErrorMessage.size()) From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-nm/llvm-nm.cpp Message-ID: <200702072141.l17LfrNj032571@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-nm: llvm-nm.cpp updated: 1.30 -> 1.31 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llvm-nm.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-nm/llvm-nm.cpp diff -u llvm/tools/llvm-nm/llvm-nm.cpp:1.30 llvm/tools/llvm-nm/llvm-nm.cpp:1.31 --- llvm/tools/llvm-nm/llvm-nm.cpp:1.30 Tue Jan 30 14:08:38 2007 +++ llvm/tools/llvm-nm/llvm-nm.cpp Wed Feb 7 15:41:02 2007 @@ -127,7 +127,9 @@ } // Note: Currently we do not support reading an archive from stdin. if (Filename == "-" || aPath.isBytecodeFile()) { - Module *Result = ParseBytecodeFile(Filename, &ErrorMessage); + Module *Result = ParseBytecodeFile(Filename, + Compressor::decompressToNewBuffer, + &ErrorMessage); if (Result) { DumpSymbolNamesFromModule (Result); } else { From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/llc/llc.cpp Message-ID: <200702072141.l17LfrT6032579@zion.cs.uiuc.edu> Changes in directory llvm/tools/llc: llc.cpp updated: 1.142 -> 1.143 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llc.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llc/llc.cpp diff -u llvm/tools/llc/llc.cpp:1.142 llvm/tools/llc/llc.cpp:1.143 --- llvm/tools/llc/llc.cpp:1.142 Tue Jan 30 14:08:38 2007 +++ llvm/tools/llc/llc.cpp Wed Feb 7 15:41:02 2007 @@ -24,6 +24,7 @@ #include "llvm/PassManager.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/FileUtilities.h" @@ -175,7 +176,8 @@ sys::PrintStackTraceOnErrorSignal(); // Load the module to be compiled... - std::auto_ptr M(ParseBytecodeFile(InputFilename)); + std::auto_ptr M(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer)); if (M.get() == 0) { std::cerr << argv[0] << ": bytecode didn't read correctly.\n"; return 1; From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Reader.h ReaderWrappers.cpp Message-ID: <200702072141.l17LfrnL032590@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.234 -> 1.235 Reader.h updated: 1.46 -> 1.47 ReaderWrappers.cpp updated: 1.63 -> 1.64 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+42 -50) Reader.cpp | 5 ++- Reader.h | 7 +--- ReaderWrappers.cpp | 80 +++++++++++++++++++++++------------------------------ 3 files changed, 42 insertions(+), 50 deletions(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.234 llvm/lib/Bytecode/Reader/Reader.cpp:1.235 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.234 Wed Feb 7 13:49:01 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Feb 7 15:41:01 2007 @@ -1981,7 +1981,7 @@ /// and \p Length parameters. bool BytecodeReader::ParseBytecode(volatile BufPtr Buf, unsigned Length, const std::string &ModuleID, - Decompressor_t *Decompressor, + BCDecompressor_t *Decompressor, std::string* ErrMsg) { /// We handle errors by @@ -2016,6 +2016,9 @@ // If this is a compressed file if (Sig == ('l' | ('l' << 8) | ('v' << 16) | ('c' << 24))) { + if (!Decompressor) { + error("Compressed bytecode found, but not decompressor available"); + } // Invoke the decompression of the bytecode. Note that we have to skip the // file's magic number which is not part of the compressed block. Hence, Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.46 llvm/lib/Bytecode/Reader/Reader.h:1.47 --- llvm/lib/Bytecode/Reader/Reader.h:1.46 Wed Feb 7 13:49:01 2007 +++ llvm/lib/Bytecode/Reader/Reader.h Wed Feb 7 15:41:01 2007 @@ -140,16 +140,15 @@ /// @name Methods /// @{ public: - - typedef size_t Decompressor_t(const char *, size_t, char*&, std::string*); - + typedef size_t BCDecompressor_t(const char *, size_t, char*&, std::string*); + /// @returns true if an error occurred /// @brief Main interface to parsing a bytecode buffer. bool ParseBytecode( volatile BufPtr Buf, ///< Beginning of the bytecode buffer unsigned Length, ///< Length of the bytecode buffer const std::string &ModuleID, ///< An identifier for the module constructed. - Decompressor_t *Decompressor = 0, ///< Optional decompressor. + BCDecompressor_t *Decompressor = 0, ///< Optional decompressor. std::string* ErrMsg = 0 ///< Optional place for error message ); Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.63 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.64 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.63 Wed Feb 7 13:49:01 2007 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Feb 7 15:41:01 2007 @@ -18,7 +18,6 @@ #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/Support/Compressor.h" #include "llvm/System/MappedFile.h" #include "llvm/System/Program.h" #include @@ -35,13 +34,15 @@ class BytecodeFileReader : public BytecodeReader { private: std::string fileName; + BCDecompressor_t *Decompressor; sys::MappedFile mapFile; BytecodeFileReader(const BytecodeFileReader&); // Do not implement void operator=(const BytecodeFileReader &BFR); // Do not implement public: - BytecodeFileReader(const std::string &Filename, llvm::BytecodeHandler* H=0); + BytecodeFileReader(const std::string &Filename, BCDecompressor_t *BCDC, + llvm::BytecodeHandler* H=0); bool read(std::string* ErrMsg); void freeState() { @@ -52,8 +53,9 @@ } BytecodeFileReader::BytecodeFileReader(const std::string &Filename, + BCDecompressor_t *BCDC, llvm::BytecodeHandler* H) - : BytecodeReader(H), fileName(Filename) { + : BytecodeReader(H), fileName(Filename), Decompressor(BCDC) { } bool BytecodeFileReader::read(std::string* ErrMsg) { @@ -65,7 +67,7 @@ } unsigned char* buffer = reinterpret_cast(mapFile.base()); return ParseBytecode(buffer, mapFile.size(), fileName, - Compressor::decompressToNewBuffer, ErrMsg); + Decompressor, ErrMsg); } //===----------------------------------------------------------------------===// @@ -81,6 +83,7 @@ const unsigned char *Buf; unsigned Length; std::string ModuleID; + BCDecompressor_t *Decompressor; bool MustDelete; BytecodeBufferReader(const BytecodeBufferReader&); // Do not implement @@ -88,7 +91,7 @@ public: BytecodeBufferReader(const unsigned char *Buf, unsigned Length, - const std::string &ModuleID, + const std::string &ModuleID, BCDecompressor_t *BCDC, llvm::BytecodeHandler* Handler = 0); ~BytecodeBufferReader(); @@ -100,9 +103,10 @@ BytecodeBufferReader::BytecodeBufferReader(const unsigned char *buf, unsigned len, const std::string &modID, + BCDecompressor_t *BCDC, llvm::BytecodeHandler *H) : BytecodeReader(H), Buffer(0), Buf(buf), Length(len), ModuleID(modID) - , MustDelete(false) { + , Decompressor(BCDC), MustDelete(false) { } BytecodeBufferReader::~BytecodeBufferReader() { @@ -124,8 +128,7 @@ ParseBegin = Buffer = Buf; MustDelete = false; } - if (ParseBytecode(ParseBegin, Length, ModuleID, - Compressor::decompressToNewBuffer, ErrMsg)) { + if (ParseBytecode(ParseBegin, Length, ModuleID, Decompressor, ErrMsg)) { if (MustDelete) delete [] Buffer; return true; } @@ -142,25 +145,24 @@ class BytecodeStdinReader : public BytecodeReader { private: std::vector FileData; + BCDecompressor_t *Decompressor; unsigned char *FileBuf; BytecodeStdinReader(const BytecodeStdinReader&); // Do not implement void operator=(const BytecodeStdinReader &BFR); // Do not implement public: - BytecodeStdinReader( llvm::BytecodeHandler* H = 0 ); + BytecodeStdinReader(BCDecompressor_t *BCDC, llvm::BytecodeHandler* H = 0); bool read(std::string* ErrMsg); }; } -BytecodeStdinReader::BytecodeStdinReader( BytecodeHandler* H ) - : BytecodeReader(H) -{ +BytecodeStdinReader::BytecodeStdinReader(BCDecompressor_t *BCDC, + BytecodeHandler* H) + : BytecodeReader(H), Decompressor(BCDC) { } -bool -BytecodeStdinReader::read(std::string* ErrMsg) -{ +bool BytecodeStdinReader::read(std::string* ErrMsg) { sys::Program::ChangeStdinToBinary(); char Buffer[4096*4]; @@ -180,8 +182,7 @@ } FileBuf = &FileData[0]; - if (ParseBytecode(FileBuf, FileData.size(), "", - Compressor::decompressToNewBuffer, ErrMsg)) + if (ParseBytecode(FileBuf, FileData.size(), "", Decompressor, ErrMsg)) return true; return false; } @@ -196,10 +197,11 @@ llvm::getBytecodeBufferModuleProvider(const unsigned char *Buffer, unsigned Length, const std::string &ModuleID, + BCDecompressor_t *BCDC, std::string *ErrMsg, BytecodeHandler *H) { BytecodeBufferReader *rdr = - new BytecodeBufferReader(Buffer, Length, ModuleID, H); + new BytecodeBufferReader(Buffer, Length, ModuleID, BCDC, H); if (rdr->read(ErrMsg)) return 0; return rdr; @@ -209,9 +211,10 @@ /// Module *llvm::ParseBytecodeBuffer(const unsigned char *Buffer, unsigned Length, const std::string &ModuleID, + BCDecompressor_t *BCDC, std::string *ErrMsg) { ModuleProvider *MP = - getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, ErrMsg, 0); + getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); if (!MP) return 0; Module *M = MP->releaseModule(ErrMsg); delete MP; @@ -222,18 +225,19 @@ /// ModuleProvider * llvm::getBytecodeModuleProvider(const std::string &Filename, + BCDecompressor_t *BCDC, std::string* ErrMsg, BytecodeHandler* H) { // Read from a file if (Filename != std::string("-")) { - BytecodeFileReader *rdr = new BytecodeFileReader(Filename, H); + BytecodeFileReader *rdr = new BytecodeFileReader(Filename, BCDC, H); if (rdr->read(ErrMsg)) return 0; return rdr; } // Read from stdin - BytecodeStdinReader *rdr = new BytecodeStdinReader(H); + BytecodeStdinReader *rdr = new BytecodeStdinReader(BCDC, H); if (rdr->read(ErrMsg)) return 0; return rdr; @@ -242,8 +246,9 @@ /// ParseBytecodeFile - Parse the given bytecode file /// Module *llvm::ParseBytecodeFile(const std::string &Filename, + BCDecompressor_t *BCDC, std::string *ErrMsg) { - ModuleProvider* MP = getBytecodeModuleProvider(Filename, ErrMsg); + ModuleProvider* MP = getBytecodeModuleProvider(Filename, BCDC, ErrMsg); if (!MP) return 0; Module *M = MP->releaseModule(ErrMsg); delete MP; @@ -254,30 +259,12 @@ Module* llvm::AnalyzeBytecodeFile( const std::string &Filename, ///< File to analyze BytecodeAnalysis& bca, ///< Statistical output + BCDecompressor_t *BCDC, std::string *ErrMsg, ///< Error output std::ostream* output ///< Dump output ) { BytecodeHandler* AH = createBytecodeAnalyzerHandler(bca,output); - ModuleProvider* MP = getBytecodeModuleProvider(Filename, ErrMsg, AH); - if (!MP) return 0; - Module *M = MP->releaseModule(ErrMsg); - delete MP; - return M; -} - -// AnalyzeBytecodeBuffer - analyze a buffer -Module* llvm::AnalyzeBytecodeBuffer( - const unsigned char* Buffer, ///< Pointer to start of bytecode buffer - unsigned Length, ///< Size of the bytecode buffer - const std::string& ModuleID, ///< Identifier for the module - BytecodeAnalysis& bca, ///< The results of the analysis - std::string* ErrMsg, ///< Errors, if any. - std::ostream* output ///< Dump output, if any -) -{ - BytecodeHandler* hdlr = createBytecodeAnalyzerHandler(bca, output); - ModuleProvider* MP = - getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, ErrMsg, hdlr); + ModuleProvider* MP = getBytecodeModuleProvider(Filename, BCDC, ErrMsg, AH); if (!MP) return 0; Module *M = MP->releaseModule(ErrMsg); delete MP; @@ -286,8 +273,9 @@ bool llvm::GetBytecodeDependentLibraries(const std::string &fname, Module::LibraryListType& deplibs, + BCDecompressor_t *BCDC, std::string* ErrMsg) { - ModuleProvider* MP = getBytecodeModuleProvider(fname, ErrMsg); + ModuleProvider* MP = getBytecodeModuleProvider(fname, BCDC, ErrMsg); if (!MP) { deplibs.clear(); return true; @@ -316,8 +304,9 @@ // Get just the externally visible defined symbols from the bytecode bool llvm::GetBytecodeSymbols(const sys::Path& fName, std::vector& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg) { - ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), ErrMsg); + ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); if (!MP) return true; @@ -340,10 +329,11 @@ llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, const std::string& ModuleID, std::vector& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg) { // Get the module provider ModuleProvider* MP = - getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, ErrMsg, 0); + getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); if (!MP) return 0; From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-dis/llvm-dis.cpp Message-ID: <200702072141.l17LfrdV032597@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-dis: llvm-dis.cpp updated: 1.55 -> 1.56 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+4 -1) llvm-dis.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-dis/llvm-dis.cpp diff -u llvm/tools/llvm-dis/llvm-dis.cpp:1.55 llvm/tools/llvm-dis/llvm-dis.cpp:1.56 --- llvm/tools/llvm-dis/llvm-dis.cpp:1.55 Tue Feb 6 22:39:35 2007 +++ llvm/tools/llvm-dis/llvm-dis.cpp Wed Feb 7 15:41:02 2007 @@ -20,6 +20,7 @@ #include "llvm/PassManager.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Assembly/PrintModulePass.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Streams.h" @@ -51,7 +52,9 @@ std::ostream *Out = &std::cout; // Default to printing to stdout. std::string ErrorMessage; - std::auto_ptr M(ParseBytecodeFile(InputFilename, &ErrorMessage)); + std::auto_ptr M(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer, + &ErrorMessage)); if (M.get() == 0) { cerr << argv[0] << ": "; if (ErrorMessage.size()) From sabre at nondot.org Wed Feb 7 15:41:55 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:55 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Analyzer.h Archive.h Reader.h Message-ID: <200702072141.l17LftXQ032613@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Analyzer.h updated: 1.14 -> 1.15 Archive.h updated: 1.19 -> 1.20 Reader.h updated: 1.27 -> 1.28 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+22 -19) Analyzer.h | 17 +++-------------- Archive.h | 11 ++++++++--- Reader.h | 13 +++++++++++-- 3 files changed, 22 insertions(+), 19 deletions(-) Index: llvm/include/llvm/Bytecode/Analyzer.h diff -u llvm/include/llvm/Bytecode/Analyzer.h:1.14 llvm/include/llvm/Bytecode/Analyzer.h:1.15 --- llvm/include/llvm/Bytecode/Analyzer.h:1.14 Wed Feb 7 01:33:02 2007 +++ llvm/include/llvm/Bytecode/Analyzer.h Wed Feb 7 15:41:01 2007 @@ -20,9 +20,10 @@ #define LLVM_BYTECODE_ANALYZER_H #include "llvm/Bytecode/Format.h" +#include "llvm/Bytecode/Reader.h" #include #include -#include +#include namespace llvm { @@ -102,23 +103,11 @@ Module* AnalyzeBytecodeFile( const std::string& Filename, ///< The name of the bytecode file to read BytecodeAnalysis& Results, ///< The results of the analysis + BCDecompressor_t *BCDC = 0, ///< Optional decompressor to use. std::string* ErrorStr = 0, ///< Errors, if any. std::ostream* output = 0 ///< Stream for dump output, if wanted ); -/// This function is an alternate entry point into the bytecode analysis -/// library. It allows you to provide an arbitrary memory buffer which is -/// assumed to contain a complete bytecode file. The \p Buffer is analyzed and -/// the \p Results are filled in. -/// @brief Analyze contents of a bytecode buffer. -Module* AnalyzeBytecodeBuffer( - const unsigned char* Buffer, ///< Pointer to start of bytecode buffer - unsigned BufferSize, ///< Size of the bytecode buffer - const std::string& ModuleID, ///< Identifier for the module - BytecodeAnalysis& Results, ///< The results of the analysis - std::string* ErrorStr = 0, ///< Errors, if any. - std::ostream* output = 0 ///< Stream for dump output, if wanted - ); /// This function prints the contents of rhe BytecodeAnalysis structure in /// a human legible form. Index: llvm/include/llvm/Bytecode/Archive.h diff -u llvm/include/llvm/Bytecode/Archive.h:1.19 llvm/include/llvm/Bytecode/Archive.h:1.20 --- llvm/include/llvm/Bytecode/Archive.h:1.19 Sun Nov 5 13:31:28 2006 +++ llvm/include/llvm/Bytecode/Archive.h Wed Feb 7 15:41:01 2007 @@ -20,6 +20,7 @@ #include "llvm/ADT/ilist" #include "llvm/System/Path.h" #include "llvm/System/MappedFile.h" +#include "llvm/Support/Compressor.h" #include #include #include @@ -32,6 +33,9 @@ class Archive; // Declared below class ArchiveMemberHeader; // Internal implementation class +typedef size_t BCDecompressor_t(const char *, size_t, char*&, std::string*); + + /// This class is the main class manipulated by users of the Archive class. It /// holds information about one member of the Archive. It is also the element /// stored by the Archive's ilist, the Archive's main abstraction. Because of @@ -223,7 +227,7 @@ /// applications and the linkers. Consequently, the implementation of the class /// is optimized for reading. class Archive { - + /// @name Types /// @{ public: @@ -468,7 +472,8 @@ protected: /// @brief Construct an Archive for \p filename and optionally map it /// into memory. - Archive(const sys::Path& filename); + Archive(const sys::Path& filename, BCDecompressor_t *BCDC = + Compressor::decompressToNewBuffer); /// @param error Set to address of a std::string to get error messages /// @returns false on error @@ -547,7 +552,7 @@ unsigned firstFileOffset; ///< Offset to first normal file. ModuleMap modules; ///< The modules loaded via symbol lookup. ArchiveMember* foreignST; ///< This holds the foreign symbol table. - + BCDecompressor_t *Decompressor; ///< Optional decompressor /// @} /// @name Hidden /// @{ Index: llvm/include/llvm/Bytecode/Reader.h diff -u llvm/include/llvm/Bytecode/Reader.h:1.27 llvm/include/llvm/Bytecode/Reader.h:1.28 --- llvm/include/llvm/Bytecode/Reader.h:1.27 Wed Aug 30 15:47:48 2006 +++ llvm/include/llvm/Bytecode/Reader.h Wed Feb 7 15:41:01 2007 @@ -19,16 +19,18 @@ #ifndef LLVM_BYTECODE_READER_H #define LLVM_BYTECODE_READER_H -#include "llvm/System/Path.h" #include "llvm/ModuleProvider.h" #include "llvm/Module.h" -#include +#include "llvm/Support/Compressor.h" +#include "llvm/System/Path.h" namespace llvm { // Forward declare the handler class class BytecodeHandler; +typedef size_t BCDecompressor_t(const char *, size_t, char*&, std::string*); + /// This function returns a ModuleProvider that can be used to do lazy /// function-at-a-time loading from a bytecode file. /// @returns NULL on error @@ -36,6 +38,7 @@ /// @brief Get a ModuleProvide for a bytecode file. ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); @@ -49,6 +52,7 @@ const unsigned char *Buffer, ///< Start of buffer to parse unsigned BufferSize, ///< Size of the buffer const std::string &ModuleID, ///< Name to give the module + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional place to return an error message BytecodeHandler* H = 0 ///< Optional handler for reader events ); @@ -61,6 +65,7 @@ /// @brief Parse the given bytecode file Module* ParseBytecodeFile( const std::string &Filename, ///< Name of file to parse + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string *ErrMsg = 0 ///< Optional place to return an error message ); @@ -72,6 +77,7 @@ const unsigned char *Buffer, ///< Start of buffer to parse unsigned BufferSize, ///< Size of the buffer const std::string &ModuleID="", ///< Name to give the module + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string *ErrMsg = 0 ///< Optional place to return an error message ); @@ -84,6 +90,7 @@ bool GetBytecodeDependentLibraries( const std::string &fileName, ///< File name to read bytecode from Module::LibraryListType& deplibs, ///< List of dependent libraries extracted + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0 ///< Optional error message holder ); @@ -96,6 +103,7 @@ bool GetBytecodeSymbols( const sys::Path& fileName, ///< Filename to read bytecode from std::vector& syms, ///< Vector to return symbols in + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0 ///< Optional error message holder ); @@ -111,6 +119,7 @@ unsigned Length, ///< The length of \p Buffer const std::string& ModuleID, ///< An identifier for the module std::vector& symbols, ///< The symbols defined in the module + BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0 ///< Optional error message holder ); From sabre at nondot.org Wed Feb 7 15:41:55 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:55 -0600 Subject: [llvm-commits] CVS: llvm/tools/lli/lli.cpp Message-ID: <200702072141.l17LftS9032623@zion.cs.uiuc.edu> Changes in directory llvm/tools/lli: lli.cpp updated: 1.66 -> 1.67 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+4 -1) lli.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/tools/lli/lli.cpp diff -u llvm/tools/lli/lli.cpp:1.66 llvm/tools/lli/lli.cpp:1.67 --- llvm/tools/lli/lli.cpp:1.66 Mon Feb 5 15:19:13 2007 +++ llvm/tools/lli/lli.cpp Wed Feb 7 15:41:02 2007 @@ -22,6 +22,7 @@ #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/System/Process.h" @@ -70,7 +71,9 @@ // Load the bytecode... std::string ErrorMsg; ModuleProvider *MP = 0; - MP = getBytecodeModuleProvider(InputFile, &ErrorMsg); + MP = getBytecodeModuleProvider(InputFile, + Compressor::decompressToNewBuffer, + &ErrorMsg); if (!MP) { std::cerr << "Error loading program '" << InputFile << "': " << ErrorMsg << "\n"; From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-prof/llvm-prof.cpp Message-ID: <200702072141.l17LfrYc032586@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-prof: llvm-prof.cpp updated: 1.29 -> 1.30 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llvm-prof.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-prof/llvm-prof.cpp diff -u llvm/tools/llvm-prof/llvm-prof.cpp:1.29 llvm/tools/llvm-prof/llvm-prof.cpp:1.30 --- llvm/tools/llvm-prof/llvm-prof.cpp:1.29 Tue Dec 5 19:18:01 2006 +++ llvm/tools/llvm-prof/llvm-prof.cpp Wed Feb 7 15:41:02 2007 @@ -115,7 +115,9 @@ // Read in the bytecode file... std::string ErrorMessage; - Module *M = ParseBytecodeFile(BytecodeFile, &ErrorMessage); + Module *M = ParseBytecodeFile(BytecodeFile, + Compressor::decompressToNewBuffer, + &ErrorMessage); if (M == 0) { std::cerr << argv[0] << ": " << BytecodeFile << ": " << ErrorMessage << "\n"; From sabre at nondot.org Wed Feb 7 15:41:55 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:55 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp Message-ID: <200702072141.l17Lft1s032618@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-bcanalyzer: llvm-bcanalyzer.cpp updated: 1.9 -> 1.10 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+4 -1) llvm-bcanalyzer.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp diff -u llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp:1.9 llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp:1.10 --- llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp:1.9 Tue Dec 5 19:18:00 2006 +++ llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp Wed Feb 7 15:41:02 2007 @@ -32,6 +32,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Bytecode/Analyzer.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/System/Signals.h" #include @@ -66,7 +67,9 @@ bca.progressiveVerify = Verify; /// Analyze the bytecode file - Module* M = AnalyzeBytecodeFile(InputFilename, bca, &ErrorMessage, (Dump?Out:0)); + Module* M = AnalyzeBytecodeFile(InputFilename, bca, + Compressor::decompressToNewBuffer, + &ErrorMessage, (Dump?Out:0)); // All that bcanalyzer does is write the gathered statistics to the output PrintBytecodeAnalysis(bca,*Out); From sabre at nondot.org Wed Feb 7 15:41:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/Archive.cpp ArchiveReader.cpp ArchiveWriter.cpp Message-ID: <200702072141.l17LfrKF032592@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: Archive.cpp updated: 1.15 -> 1.16 ArchiveReader.cpp updated: 1.48 -> 1.49 ArchiveWriter.cpp updated: 1.33 -> 1.34 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+17 -12) Archive.cpp | 6 +++--- ArchiveReader.cpp | 17 ++++++++++------- ArchiveWriter.cpp | 6 ++++-- 3 files changed, 17 insertions(+), 12 deletions(-) Index: llvm/lib/Bytecode/Archive/Archive.cpp diff -u llvm/lib/Bytecode/Archive/Archive.cpp:1.15 llvm/lib/Bytecode/Archive/Archive.cpp:1.16 --- llvm/lib/Bytecode/Archive/Archive.cpp:1.15 Fri Dec 15 13:44:51 2006 +++ llvm/lib/Bytecode/Archive/Archive.cpp Wed Feb 7 15:41:01 2007 @@ -138,10 +138,10 @@ // Archive constructor - this is the only constructor that gets used for the // Archive class. Everything else (default,copy) is deprecated. This just // initializes and maps the file into memory, if requested. -Archive::Archive(const sys::Path& filename) +Archive::Archive(const sys::Path& filename, BCDecompressor_t *BCDC) : archPath(filename), members(), mapfile(0), base(0), symTab(), strtab(), - symTabSize(0), firstFileOffset(0), modules(), foreignST(0) -{ + symTabSize(0), firstFileOffset(0), modules(), foreignST(0), + Decompressor(BCDC) { } bool Index: llvm/lib/Bytecode/Archive/ArchiveReader.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.48 llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.49 --- llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.48 Fri Dec 15 13:44:51 2006 +++ llvm/lib/Bytecode/Archive/ArchiveReader.cpp Wed Feb 7 15:41:01 2007 @@ -13,8 +13,8 @@ #include "ArchiveInternals.h" #include "llvm/Bytecode/Reader.h" +#include "llvm/Support/Compressor.h" #include - using namespace llvm; /// Read a variable-bit-rate encoded unsigned integer @@ -351,7 +351,9 @@ std::string FullMemberName = archPath.toString() + "(" + I->getPath().toString() + ")"; Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), - I->getSize(), FullMemberName, ErrMessage); + I->getSize(), FullMemberName, + Compressor::decompressToNewBuffer, + ErrMessage); if (!M) return true; @@ -486,7 +488,7 @@ mbr->getPath().toString() + ")"; ModuleProvider* mp = getBytecodeBufferModuleProvider( (const unsigned char*) mbr->getData(), mbr->getSize(), - FullMemberName, ErrMsg, 0); + FullMemberName, Decompressor, ErrMsg, 0); if (!mp) return 0; @@ -500,8 +502,7 @@ bool Archive::findModulesDefiningSymbols(std::set& symbols, std::set& result, - std::string* error) -{ + std::string* error) { if (!mapfile || !base) { if (error) *error = "Empty archive invalid for finding modules defining symbols"; @@ -533,8 +534,10 @@ std::vector symbols; std::string FullMemberName = archPath.toString() + "(" + mbr->getPath().toString() + ")"; - ModuleProvider* MP = GetBytecodeSymbols((const unsigned char*)At, - mbr->getSize(), FullMemberName, symbols, error); + ModuleProvider* MP = + GetBytecodeSymbols((const unsigned char*)At, mbr->getSize(), + FullMemberName, symbols, + Compressor::decompressToNewBuffer, error); if (MP) { // Insert the module's symbols into the symbol table Index: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.33 llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.34 --- llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.33 Fri Dec 15 13:44:51 2006 +++ llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Wed Feb 7 15:41:01 2007 @@ -225,8 +225,10 @@ std::string FullMemberName = archPath.toString() + "(" + member.getPath().toString() + ")"; - ModuleProvider* MP = GetBytecodeSymbols( - (const unsigned char*)data,fSize,FullMemberName, symbols, ErrMsg); + ModuleProvider* MP = + GetBytecodeSymbols((const unsigned char*)data,fSize, + FullMemberName, symbols, + Compressor::decompressToNewBuffer, ErrMsg); // If the bytecode parsed successfully if ( MP ) { From sabre at nondot.org Wed Feb 7 15:41:55 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:55 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-extract/llvm-extract.cpp Message-ID: <200702072141.l17LftT6032628@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-extract: llvm-extract.cpp updated: 1.36 -> 1.37 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) llvm-extract.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/llvm-extract/llvm-extract.cpp diff -u llvm/tools/llvm-extract/llvm-extract.cpp:1.36 llvm/tools/llvm-extract/llvm-extract.cpp:1.37 --- llvm/tools/llvm-extract/llvm-extract.cpp:1.36 Mon Feb 5 15:17:53 2007 +++ llvm/tools/llvm-extract/llvm-extract.cpp Wed Feb 7 15:41:02 2007 @@ -19,6 +19,7 @@ #include "llvm/Transforms/IPO.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Streams.h" #include "llvm/System/Signals.h" @@ -57,7 +58,8 @@ cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n"); sys::PrintStackTraceOnErrorSignal(); - std::auto_ptr M(ParseBytecodeFile(InputFilename)); + std::auto_ptr M(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer)); if (M.get() == 0) { cerr << argv[0] << ": bytecode didn't read correctly.\n"; return 1; From sabre at nondot.org Wed Feb 7 15:41:56 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 15:41:56 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/BugDriver.cpp Message-ID: <200702072141.l17Lfu0W032638@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: BugDriver.cpp updated: 1.49 -> 1.50 --- Log message: push bytecode decompressor out through APIs. Now the bytecode reader api's look like this: ModuleProvider *getBytecodeModuleProvider( const std::string &Filename, ///< Name of file to be read BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, std::string* ErrMsg = 0, ///< Optional error message holder BytecodeHandler* H = 0 ///< Optional handler for reader events ); This is ugly, but allows a client to say: getBytecodeModuleProvider("foo", 0); If they do this, there is no dependency on the compression libraries, saving codesize. --- Diffs of the changes: (+3 -1) BugDriver.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/tools/bugpoint/BugDriver.cpp diff -u llvm/tools/bugpoint/BugDriver.cpp:1.49 llvm/tools/bugpoint/BugDriver.cpp:1.50 --- llvm/tools/bugpoint/BugDriver.cpp:1.49 Wed Oct 25 13:36:14 2006 +++ llvm/tools/bugpoint/BugDriver.cpp Wed Feb 7 15:41:02 2007 @@ -21,6 +21,7 @@ #include "llvm/Assembly/Parser.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compressor.h" #include "llvm/Support/FileUtilities.h" #include #include @@ -74,7 +75,8 @@ /// Module *llvm::ParseInputFile(const std::string &InputFilename) { ParseError Err; - Module *Result = ParseBytecodeFile(InputFilename); + Module *Result = ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer); if (!Result && !(Result = ParseAssemblyFile(InputFilename,&Err))) { std::cerr << "bugpoint: " << Err.getMessage() << "\n"; Result = 0; From evan.cheng at apple.com Wed Feb 7 15:44:49 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 7 Feb 2007 15:44:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702072144.l17LinKF032731@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.65 -> 1.66 --- Log message: isLowRegister() expects input is a physical register. --- Diffs of the changes: (+2 -2) ARMRegisterInfo.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.65 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.66 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.65 Wed Feb 7 15:24:09 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Feb 7 15:44:33 2007 @@ -218,14 +218,14 @@ case ARM::tMOVrr: { if (OpNum == 0) { // move -> store unsigned SrcReg = MI->getOperand(1).getReg(); - if (!isLowRegister(SrcReg)) + if (isPhysicalRegister(SrcReg) && !isLowRegister(SrcReg)) // tSpill cannot take a high register operand. break; NewMI = BuildMI(TII.get(ARM::tSpill)).addReg(SrcReg).addFrameIndex(FI) .addImm(0); } else { // move -> load unsigned DstReg = MI->getOperand(0).getReg(); - if (!isLowRegister(DstReg)) + if (isPhysicalRegister(DstReg) && !isLowRegister(DstReg)) // tRestore cannot target a high register operand. break; NewMI = BuildMI(TII.get(ARM::tRestore), DstReg).addFrameIndex(FI) From clattner at apple.com Wed Feb 7 15:53:57 2007 From: clattner at apple.com (clattner at apple.com) Date: Wed, 7 Feb 2007 13:53:57 -0800 (PST) Subject: [llvm-commits] [123559] Don't create useless bitcast instructions. Message-ID: <20070207215357.42AF83165999@src> Revision: 123559 Author: clattner Date: 2007-02-07 13:53:56 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Don't create useless bitcast instructions. Patch by Reid Spencer! Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-convert.cpp Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 19:31:44 UTC (rev 123558) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 21:53:56 UTC (rev 123559) @@ -708,7 +708,10 @@ /// CastToType - Cast the specified value to the specified type if it is /// not already that type. Value *TreeToLLVM::CastToType(unsigned opcode, Value *V, const Type* Ty) { - if (V->getType() == Ty) return V; + // Eliminate useless casts of a type to itself. + if (V->getType() == Ty) + return V; + if (Constant *C = dyn_cast(V)) return ConstantExpr::getCast(Instruction::CastOps(opcode), C, Ty); @@ -725,28 +728,48 @@ /// assumptions about the types of the arguments. This creates an inferred cast. Value *TreeToLLVM::CastToAnyType(Value *V, bool VisSigned, const Type* Ty, bool TyIsSigned) { - Instruction::CastOps opcode = CastInst::getCastOpcode(V, VisSigned, Ty, - TyIsSigned); - return CastToType(opcode, V, Ty); + // Eliminate useless casts of a type to itself. + if (V->getType() == Ty) + return V; + + // The types are different so we must cast. Use getCastOpcode to create an + // inferred cast opcode. + Instruction::CastOps opc = + CastInst::getCastOpcode(V, VisSigned, Ty, TyIsSigned); + + // Generate the cast and return it. + return CastToType(opc, V, Ty); } /// CastToUIntType - Cast the specified value to the specified type assuming /// that the value and type are unsigned integer types. Value *TreeToLLVM::CastToUIntType(Value *V, const Type* Ty) { + // Eliminate useless casts of a type to itself. + if (V->getType() == Ty) + return V; + unsigned SrcBits = V->getType()->getPrimitiveSizeInBits(); unsigned DstBits = Ty->getPrimitiveSizeInBits(); - Instruction::CastOps opcode = (SrcBits == DstBits ? Instruction::BitCast : - (SrcBits > DstBits ? Instruction::Trunc : Instruction::ZExt)); + assert(SrcBits != DstBits && "Types are different but have same #bits?"); + + Instruction::CastOps opcode = + (SrcBits > DstBits ? Instruction::Trunc : Instruction::ZExt); return CastToType(opcode, V, Ty); } /// CastToSIntType - Cast the specified value to the specified type assuming /// that the value and type are signed integer types. Value *TreeToLLVM::CastToSIntType(Value *V, const Type* Ty) { + // Eliminate useless casts of a type to itself. + if (V->getType() == Ty) + return V; + unsigned SrcBits = V->getType()->getPrimitiveSizeInBits(); unsigned DstBits = Ty->getPrimitiveSizeInBits(); - Instruction::CastOps opcode = (SrcBits == DstBits ? Instruction::BitCast : - (SrcBits > DstBits ? Instruction::Trunc : Instruction::SExt)); + assert(SrcBits != DstBits && "Types are different but have same #bits?"); + + Instruction::CastOps opcode = + (SrcBits > DstBits ? Instruction::Trunc : Instruction::SExt); return CastToType(opcode, V, Ty); } From alenhar2 at cs.uiuc.edu Wed Feb 7 16:24:06 2007 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 7 Feb 2007 16:24:06 -0600 Subject: [llvm-commits] CVS: llvm/test/Transforms/InstCombine/2007-02-07-PointerCast.ll Message-ID: <200702072224.l17MO6TH011620@zion.cs.uiuc.edu> Changes in directory llvm/test/Transforms/InstCombine: 2007-02-07-PointerCast.ll added (r1.1) --- Log message: This really only affects pointers in high memory, and only llvm 1.9, but make a regression for it anyway --- Diffs of the changes: (+28 -0) 2007-02-07-PointerCast.ll | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+) Index: llvm/test/Transforms/InstCombine/2007-02-07-PointerCast.ll diff -c /dev/null llvm/test/Transforms/InstCombine/2007-02-07-PointerCast.ll:1.1 *** /dev/null Wed Feb 7 16:23:57 2007 --- llvm/test/Transforms/InstCombine/2007-02-07-PointerCast.ll Wed Feb 7 16:23:47 2007 *************** *** 0 **** --- 1,28 ---- + ;RUN: llvm-upgrade < %s | llvm-as | opt -instcombine |llvm-dis |grep zext + + ;Make sure the uint isn't removed. + ;instcombine in llvm 1.9 was dropping the uint cast which was causing a sign + ;extend + ;this only affected code with pointers in the high half of memory, so it wasn't + ;noticed much :) + ;compile a kernel though... + + target datalayout = "e-p:32:32" + target endian = little + target pointersize = 32 + + %str = internal constant [6 x sbyte] c"%llx\0A\00" + + implementation ; Functions: + + declare int %printf(sbyte*, ...) + + int %main(int %x, sbyte** %a) { + entry: + %tmp = getelementptr [6 x sbyte]* %str, int 0, uint 0 + %tmp1 = load sbyte** %a + %tmp2 = cast sbyte* %tmp1 to uint ; [#uses=1] + %tmp3 = cast uint %tmp2 to long ; [#uses=1] + %tmp = call int (sbyte*, ...)* %printf( sbyte* %tmp, long %tmp3 ) + ret int 0 + } From alenhar2 at cs.uiuc.edu Wed Feb 7 16:32:38 2007 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 7 Feb 2007 16:32:38 -0600 Subject: [llvm-commits] [release_19] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200702072232.l17MWctC014477@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.536 -> 1.536.2.1 --- Log message: Fix miscompile of linux kernel (llvm 1.9) --- Diffs of the changes: (+3 -3) InstructionCombining.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536.2.1 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536 Fri Nov 3 16:45:50 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Wed Feb 7 16:32:03 2007 @@ -377,9 +377,9 @@ // If we are casting between pointer and integer types, treat pointers as // integers of the appropriate size for the code below. - if (isa(SrcTy)) SrcTy = TD->getIntPtrType(); - if (isa(MidTy)) MidTy = TD->getIntPtrType(); - if (isa(DstTy)) DstTy = TD->getIntPtrType(); + if (isa(SrcTy)) SrcTy = TD->getIntPtrType()->getSignedVersion(); + if (isa(MidTy)) MidTy = TD->getIntPtrType()->getSignedVersion(); + if (isa(DstTy)) DstTy = TD->getIntPtrType()->getSignedVersion(); // Allow free casting and conversion of sizes as long as the sign doesn't // change... From clattner at apple.com Wed Feb 7 17:12:06 2007 From: clattner at apple.com (clattner at apple.com) Date: Wed, 7 Feb 2007 15:12:06 -0800 (PST) Subject: [llvm-commits] [123561] shift-related cleanups, patch by Reid! Message-ID: <20070207231206.56D4731B099D@src> Revision: 123561 Author: clattner Date: 2007-02-07 15:12:06 -0800 (Wed, 07 Feb 2007) Log Message: ----------- shift-related cleanups, patch by Reid! Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-convert.cpp Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 22:45:31 UTC (rev 123560) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 23:12:06 UTC (rev 123561) @@ -1827,13 +1827,13 @@ if (LV.BitStart+LV.BitSize != ValSizeInBits) { Value *ShAmt = ConstantInt::get(Val->getType(), ValSizeInBits-(LV.BitStart+LV.BitSize)); - Val = BinaryOperator::create(Instruction::Shl, Val, ShAmt, "tmp", CurBB); + Val = BinaryOperator::createShl(Val, ShAmt, "tmp", CurBB); } // Shift right required? if (ValSizeInBits-LV.BitSize) { Value *ShAmt = ConstantInt::get(Val->getType(), ValSizeInBits-LV.BitSize); - Val = BinaryOperator::create( TYPE_UNSIGNED(TREE_TYPE(exp)) ? + Val = BinaryOperator::create(TYPE_UNSIGNED(TREE_TYPE(exp)) ? Instruction::LShr : Instruction::AShr, Val, ShAmt, "tmp", CurBB); } @@ -2232,7 +2232,7 @@ Value *RetVal = RHS; RHS = CastToAnyType(RHS, Op1Signed, OldVal->getType(), Op0Signed); if (LV.BitStart) - RHS = BinaryOperator::create(Instruction::Shl, RHS, + RHS = BinaryOperator::createShl(RHS, ConstantInt::get(RHS->getType(), LV.BitStart), "tmp", CurBB); // Next, if this doesn't touch the top bit, mask out any bits that shouldn't From sabre at nondot.org Wed Feb 7 17:28:24 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:28:24 -0600 Subject: [llvm-commits] CVS: llvm/test/CFrontend/2007-02-05-nested.c Message-ID: <200702072328.l17NSOmx010778@zion.cs.uiuc.edu> Changes in directory llvm/test/CFrontend: 2007-02-05-nested.c added (r1.1) --- Log message: new testcase for nested functions --- Diffs of the changes: (+54 -0) 2007-02-05-nested.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 54 insertions(+) Index: llvm/test/CFrontend/2007-02-05-nested.c diff -c /dev/null llvm/test/CFrontend/2007-02-05-nested.c:1.1 *** /dev/null Wed Feb 7 17:28:18 2007 --- llvm/test/CFrontend/2007-02-05-nested.c Wed Feb 7 17:28:08 2007 *************** *** 0 **** --- 1,54 ---- + // RUN: %llvmgcc -S -fnested-functions -O0 -o - -emit-llvm %s + // PR915 + + extern void abort(void); + + void nest(int n) + { + int a = 0; + int b = 5; + int c = 0; + int d = 7; + + void o(int i, int j) + { + if (i!=j) + abort(); + } + + void f(x) + int x; /* K&R style */ + { + int e = 0; + int f = 2; + int g = 0; + + void y(void) + { + c = n; + e = 1; + g = x; + } + + void z(void) + { + a = 4; + g = 3; + } + + a = 5; + y(); + c = x; + z(); + o(1,e); + o(2,f); + o(3,g); + } + + c = 2; + f(6); + o(4,a); + o(5,b); + o(6,c); + o(7,d); + } From clattner at apple.com Wed Feb 7 17:28:05 2007 From: clattner at apple.com (clattner at apple.com) Date: Wed, 7 Feb 2007 15:28:05 -0800 (PST) Subject: [llvm-commits] [123562] Initial support for nested functions ( but not non-local gotos or trampolines). Message-ID: <20070207232805.A968E31B62CA@src> Revision: 123562 Author: clattner Date: 2007-02-07 15:28:05 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Initial support for nested functions (but not non-local gotos or trampolines). Patch by Duncan Sands! This implements llvm/test/CFrontend/2007-02-05-nested.c Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-backend.cpp apple-local/branches/llvm/gcc/llvm-convert.cpp apple-local/branches/llvm/gcc/llvm-internal.h apple-local/branches/llvm/gcc/llvm-types.cpp Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-07 23:12:06 UTC (rev 123561) +++ apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-07 23:28:05 UTC (rev 123562) @@ -433,9 +433,9 @@ // llvm_emit_code_for_current_function - Top level interface for emitting a // function to the .s file. void llvm_emit_code_for_current_function(tree fndecl) { - if (cfun->static_chain_decl || cfun->nonlocal_goto_save_area) - sorry("%Jnested functions not supported by LLVM", fndecl); - + if (cfun->nonlocal_goto_save_area) + sorry("%Jnon-local gotos not supported by LLVM", fndecl); + if (errorcount || sorrycount) { TREE_ASM_WRITTEN(fndecl) = 1; return; // Do not process broken code. @@ -709,7 +709,7 @@ if (FnEntry == 0) { unsigned CC; const FunctionType *Ty = - TheTypeConverter->ConvertFunctionType(TREE_TYPE(decl), CC); + TheTypeConverter->ConvertFunctionType(TREE_TYPE(decl), NULL, CC); FnEntry = new Function(Ty, Function::ExternalLinkage, Name, TheModule); FnEntry->setCallingConv(CC); Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 23:12:06 UTC (rev 123561) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-07 23:28:05 UTC (rev 123562) @@ -260,6 +260,7 @@ Name = IDENTIFIER_POINTER(ID); // Determine the FunctionType and calling convention for this function. + tree static_chain = cfun->static_chain_decl; const FunctionType *FTy; unsigned CallingConv; @@ -271,16 +272,19 @@ if (TYPE_ARG_TYPES(TREE_TYPE(FnDecl)) == 0) { FTy = TheTypeConverter->ConvertArgListToFnType(TREE_TYPE(TREE_TYPE(FnDecl)), DECL_ARGUMENTS(FnDecl), + static_chain, CallingConv); #ifdef TARGET_ADJUST_LLVM_CC TARGET_ADJUST_LLVM_CC(CallingConv, TREE_TYPE(FnDecl)); #endif } else { // Otherwise, just get the type from the function itself. - FTy = TheTypeConverter->ConvertFunctionType(TREE_TYPE(FnDecl), CallingConv); + FTy = TheTypeConverter->ConvertFunctionType(TREE_TYPE(FnDecl), + static_chain, + CallingConv); } - // If we've already see this function and created a prototype, and if the + // If we've already seen this function and created a prototype, and if the // proto has the right LLVM type, just use it. if (DECL_LLVM_SET_P(FnDecl) && cast(DECL_LLVM(FnDecl)->getType())->getElementType() == FTy){ @@ -371,8 +375,11 @@ // Handle the DECL_RESULT. ABIConverter.HandleReturnType(TREE_TYPE(TREE_TYPE(FnDecl))); - - for (tree Args = DECL_ARGUMENTS(FnDecl); Args; Args = TREE_CHAIN(Args)) { + + // Prepend the static chain (if any) to the list of arguments. + tree Args = static_chain ? static_chain : DECL_ARGUMENTS(FnDecl); + + while (Args) { const char *Name = "unnamed_arg"; if (DECL_NAME(Args)) Name = IDENTIFIER_POINTER(DECL_NAME(Args)); @@ -400,6 +407,8 @@ ABIConverter.HandleArgument(TREE_TYPE(Args)); Client.clear(); } + + Args = Args == static_chain ? DECL_ARGUMENTS(FnDecl) : TREE_CHAIN(Args); } // If this is not a void-returning function, initialize the RESULT_DECL. @@ -407,9 +416,9 @@ !DECL_LLVM_SET_P(DECL_RESULT(FnDecl))) EmitAutomaticVariableDecl(DECL_RESULT(FnDecl)); - // If this function has nested functions, we should handle the static chain, - // and handle a potential nonlocal_goto_save_area. - if (cfun->static_chain_decl || cfun->nonlocal_goto_save_area) { + // If this function has nested functions, we should handle a potential + // nonlocal_goto_save_area. + if (cfun->nonlocal_goto_save_area) { // Not supported yet. } @@ -1869,9 +1878,23 @@ if (EmitBuiltinCall(exp, fndecl, DestLoc, Res)) return Res; } - + Value *Callee = Emit(TREE_OPERAND(exp, 0), 0); + if (TREE_OPERAND(exp, 2)) { + // This is a direct call to a function using a static chain. We need to + // change the function type to one with an extra parameter for the chain. + assert(fndecl && "Indirect static chain call!"); + tree function_type = TYPE_MAIN_VARIANT(TREE_TYPE(fndecl)); + tree static_chain = TREE_OPERAND(exp, 2); + + unsigned CallingConv; + const Type *Ty = TheTypeConverter->ConvertFunctionType(function_type, + static_chain, + CallingConv); + Callee = CastToType(Instruction::BitCast, Callee, PointerType::get(Ty)); + } + //EmitCall(exp, DestLoc); Value *Result = EmitCallOf(Callee, exp, DestLoc); @@ -2032,7 +2055,11 @@ // Handle the result, including struct returns. ABIConverter.HandleReturnType(TREE_TYPE(exp)); - + + // Pass the static chain, if any, as the first parameter. + if (TREE_OPERAND(exp, 2)) + CallOperands.push_back (Emit(TREE_OPERAND(exp, 2), 0)); + // Loop over the arguments, expanding them and adding them to the op list. const PointerType *PFTy = cast(Callee->getType()); const FunctionType *FTy = cast(PFTy->getElementType()); Modified: apple-local/branches/llvm/gcc/llvm-internal.h =================================================================== --- apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-07 23:12:06 UTC (rev 123561) +++ apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-07 23:28:05 UTC (rev 123562) @@ -117,7 +117,8 @@ /// ConvertFunctionType - Convert the specified FUNCTION_TYPE or METHOD_TYPE /// tree to an LLVM type. This does the same thing that ConvertType does, but /// it also returns the function's LLVM calling convention. - const FunctionType *ConvertFunctionType(tree_node *type, + const FunctionType *ConvertFunctionType(tree_node *type, + tree_node *static_chain, unsigned &CallingConv); /// ConvertArgListToFnType - Given a DECL_ARGUMENTS list on an GCC tree, @@ -125,6 +126,7 @@ /// turning "T foo(...)" functions into "T foo(void)" functions. const FunctionType *ConvertArgListToFnType(tree_node *retty, tree_node *arglist, + tree_node *static_chain, unsigned &CallingConv); private: Modified: apple-local/branches/llvm/gcc/llvm-types.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-types.cpp 2007-02-07 23:12:06 UTC (rev 123561) +++ apple-local/branches/llvm/gcc/llvm-types.cpp 2007-02-07 23:28:05 UTC (rev 123562) @@ -416,7 +416,7 @@ return Ty; unsigned CallingConv; - return TypeDB.setType(type, ConvertFunctionType(type, CallingConv)); + return TypeDB.setType(type, ConvertFunctionType(type, NULL, CallingConv)); } case ARRAY_TYPE: { if (const Type *Ty = GET_TYPE_LLVM(type)) @@ -530,7 +530,8 @@ /// fills in Result with the argument types for the function. It returns the /// specified result type for the function. const FunctionType *TypeConverter:: -ConvertArgListToFnType(tree ReturnType, tree Args, unsigned &CallingConv) { +ConvertArgListToFnType(tree ReturnType, tree Args, tree static_chain, + unsigned &CallingConv) { std::vector ArgTys; const Type *RetTy; @@ -538,12 +539,28 @@ TheLLVMABI ABIConverter(Client); ABIConverter.HandleReturnType(ReturnType); + + if (static_chain) + // Pass the static chain as the first parameter. + ABIConverter.HandleArgument(TREE_TYPE(static_chain)); + for (; Args && TREE_TYPE(Args) != void_type_node; Args = TREE_CHAIN(Args)) ABIConverter.HandleArgument(TREE_TYPE(Args)); - return FunctionType::get(RetTy, ArgTys, false); + + FunctionType::ParamAttrsList ParamAttrs; + + if (static_chain) { + // Something for the return type. + ParamAttrs.push_back(FunctionType::NoAttributeSet); + // Pass the static chain in a register. + ParamAttrs.push_back(FunctionType::InRegAttribute); + } + + return FunctionType::get(RetTy, ArgTys, false, ParamAttrs); } -const FunctionType *TypeConverter::ConvertFunctionType(tree type, +const FunctionType *TypeConverter::ConvertFunctionType(tree type, + tree static_chain, unsigned &CallingConv) { const Type *RetTy = 0; std::vector ArgTypes; @@ -557,7 +574,11 @@ #ifdef TARGET_ADJUST_LLVM_CC TARGET_ADJUST_LLVM_CC(CallingConv, type); #endif - + + if (static_chain) + // Pass the static chain as the first parameter. + ABIConverter.HandleArgument(TREE_TYPE(static_chain)); + // Loop over all of the arguments, adding them as we go. tree Args = TYPE_ARG_TYPES(type); for (; Args && TREE_VALUE(Args) != void_type_node; Args = TREE_CHAIN(Args)){ @@ -613,6 +634,10 @@ LLVM_TARGET_INIT_REGPARM(lparam, type); #endif // LLVM_TARGET_ENABLE_REGPARM + if (static_chain) + // Pass the static chain in a register. + ParamAttrs.push_back(FunctionType::InRegAttribute); + for (tree Args = TYPE_ARG_TYPES(type); Args && TREE_VALUE(Args) != void_type_node; Args = TREE_CHAIN(Args)) { From clattner at apple.com Wed Feb 7 17:30:15 2007 From: clattner at apple.com (Chris Lattner) Date: Wed, 7 Feb 2007 15:30:15 -0800 Subject: [llvm-commits] llvm-gcc4: nested function support (w/o trampolines) In-Reply-To: <200702052217.14334.baldrick@free.fr> References: <200702052217.14334.baldrick@free.fr> Message-ID: <1CE6F144-9BCD-407F-A869-3E138B6EBF7B@apple.com> On Feb 5, 2007, at 1:17 PM, Duncan Sands wrote: > This patch adds support for nested subroutines, but not for > trampolines (used for taking pointers to nested subroutines; > implementing support for trampolines is more tricky since it > needs help from the code generators). There are no changes > to LLVM itself. Applied, thanks! The testcase required tweaking: it passed even without the patch applied. This is because at -O3, gcc was inlining all the nested functions away. Thanks, -Chris From reid at x10sys.com Wed Feb 7 17:41:30 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 17:41:30 -0600 Subject: [llvm-commits] CVS: llvm/test/Assembler/2007-02-07-RenameInternals.ll Message-ID: <200702072341.l17NfUC0012580@zion.cs.uiuc.edu> Changes in directory llvm/test/Assembler: 2007-02-07-RenameInternals.ll added (r1.1) --- Log message: For PR1187: http://llvm.org/PR1187 : Add a test case to test rename of internal linkage functions with the same name, without an error or warning. --- Diffs of the changes: (+11 -0) 2007-02-07-RenameInternals.ll | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/test/Assembler/2007-02-07-RenameInternals.ll diff -c /dev/null llvm/test/Assembler/2007-02-07-RenameInternals.ll:1.1 *** /dev/null Wed Feb 7 17:41:21 2007 --- llvm/test/Assembler/2007-02-07-RenameInternals.ll Wed Feb 7 17:41:10 2007 *************** *** 0 **** --- 1,11 ---- + ; PR1187 + ; RUN: llvm-upgrade < %s > /dev/null + + implementation + internal void %func(int %x) { + ret void + } + + internal void %func(int %x) { + ret void + } From reid at x10sys.com Wed Feb 7 17:46:10 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 17:46:10 -0600 Subject: [llvm-commits] CVS: llvm/test/Assembler/2007-02-07-SizedIntTypes.ll Message-ID: <200702072346.l17NkA21014215@zion.cs.uiuc.edu> Changes in directory llvm/test/Assembler: 2007-02-07-SizedIntTypes.ll added (r1.1) --- Log message: For PR1187: http://llvm.org/PR1187 : Add a test to ensure that i1, i8, i16, i32 and i64 are recognized by the lexer and vars using them will be renamed appropriately. --- Diffs of the changes: (+8 -0) 2007-02-07-SizedIntTypes.ll | 8 ++++++++ 1 files changed, 8 insertions(+) Index: llvm/test/Assembler/2007-02-07-SizedIntTypes.ll diff -c /dev/null llvm/test/Assembler/2007-02-07-SizedIntTypes.ll:1.1 *** /dev/null Wed Feb 7 17:46:01 2007 --- llvm/test/Assembler/2007-02-07-SizedIntTypes.ll Wed Feb 7 17:45:51 2007 *************** *** 0 **** --- 1,8 ---- + ; PR1187 + ; RUN: llvm-upgrade < %s > /dev/null + + implementation + + i1 %func(i8 %x, i16 %x, i32 %x, i64 %x) { + ret void + } From sabre at nondot.org Wed Feb 7 17:47:11 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:47:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.h ReaderWrappers.cpp Message-ID: <200702072347.l17NlBnE014327@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.34 -> 1.35 Reader.h updated: 1.47 -> 1.48 ReaderWrappers.cpp updated: 1.64 -> 1.65 --- Log message: move AnalyzeBytecodeFile out of ReaderWrappers.cpp into Analyzer.cpp. Now lli doesn't link in Analyzer.cpp. --- Diffs of the changes: (+15 -36) Analyzer.cpp | 28 +++++++++++++++------------- Reader.h | 8 -------- ReaderWrappers.cpp | 15 --------------- 3 files changed, 15 insertions(+), 36 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.34 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.35 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.34 Wed Feb 7 01:19:19 2007 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Wed Feb 7 17:46:55 2007 @@ -534,7 +534,7 @@ } }; - +} // end anonymous namespace /// @brief Utility for printing a titled unsigned value with /// an aligned colon. @@ -574,14 +574,10 @@ << std::left << val << (nl ? "\n" : ""); } -} - -namespace llvm { - /// This function prints the contents of rhe BytecodeAnalysis structure in /// a human legible form. /// @brief Print BytecodeAnalysis structure to an ostream -void PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out ) +void llvm::PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out ) { Out << "\nSummary Analysis Of " << bca.ModuleId << ": \n\n"; print(Out, "Bytecode Analysis Of Module", bca.ModuleId); @@ -673,11 +669,17 @@ Out << bca.VerifyInfo; } -BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca, - std::ostream* output) -{ - return new AnalyzerHandler(bca,output); -} - +// AnalyzeBytecodeFile - analyze one file +Module* llvm::AnalyzeBytecodeFile(const std::string &Filename, ///< File to analyze + BytecodeAnalysis& bca, ///< Statistical output + BCDecompressor_t *BCDC, + std::string *ErrMsg, ///< Error output + std::ostream* output ///< Dump output + ) { + BytecodeHandler* AH = new AnalyzerHandler(bca, output); + ModuleProvider* MP = getBytecodeModuleProvider(Filename, BCDC, ErrMsg, AH); + if (!MP) return 0; + Module *M = MP->releaseModule(ErrMsg); + delete MP; + return M; } - Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.47 llvm/lib/Bytecode/Reader/Reader.h:1.48 --- llvm/lib/Bytecode/Reader/Reader.h:1.47 Wed Feb 7 15:41:01 2007 +++ llvm/lib/Bytecode/Reader/Reader.h Wed Feb 7 17:46:55 2007 @@ -18,8 +18,6 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" -#include "llvm/GlobalValue.h" -#include "llvm/Function.h" #include "llvm/ModuleProvider.h" #include "llvm/Bytecode/Analyzer.h" #include "llvm/ADT/SmallVector.h" @@ -455,12 +453,6 @@ /// @} }; -/// @brief A function for creating a BytecodeAnalzer as a handler -/// for the Bytecode reader. -BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca, - std::ostream* output ); - - } // End llvm namespace // vim: sw=2 Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.64 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.65 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.64 Wed Feb 7 15:41:01 2007 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Feb 7 17:46:55 2007 @@ -255,21 +255,6 @@ return M; } -// AnalyzeBytecodeFile - analyze one file -Module* llvm::AnalyzeBytecodeFile( - const std::string &Filename, ///< File to analyze - BytecodeAnalysis& bca, ///< Statistical output - BCDecompressor_t *BCDC, - std::string *ErrMsg, ///< Error output - std::ostream* output ///< Dump output -) { - BytecodeHandler* AH = createBytecodeAnalyzerHandler(bca,output); - ModuleProvider* MP = getBytecodeModuleProvider(Filename, BCDC, ErrMsg, AH); - if (!MP) return 0; - Module *M = MP->releaseModule(ErrMsg); - delete MP; - return M; -} bool llvm::GetBytecodeDependentLibraries(const std::string &fname, Module::LibraryListType& deplibs, From sabre at nondot.org Wed Feb 7 17:48:52 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:48:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Message-ID: <200702072348.l17NmqFA015146@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: ReaderWrappers.cpp updated: 1.65 -> 1.66 --- Log message: move an llvmc-specific function out of the bcreader into llvmc. --- Diffs of the changes: (+0 -16) ReaderWrappers.cpp | 16 ---------------- 1 files changed, 16 deletions(-) Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.65 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.66 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.65 Wed Feb 7 17:46:55 2007 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Feb 7 17:48:32 2007 @@ -256,22 +256,6 @@ } -bool llvm::GetBytecodeDependentLibraries(const std::string &fname, - Module::LibraryListType& deplibs, - BCDecompressor_t *BCDC, - std::string* ErrMsg) { - ModuleProvider* MP = getBytecodeModuleProvider(fname, BCDC, ErrMsg); - if (!MP) { - deplibs.clear(); - return true; - } - Module* M = MP->releaseModule(ErrMsg); - deplibs = M->getLibraries(); - delete M; - delete MP; - return false; -} - static void getSymbols(Module*M, std::vector& symbols) { // Loop over global variables for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) From sabre at nondot.org Wed Feb 7 17:48:53 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:48:53 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvmc/CompilerDriver.cpp Message-ID: <200702072348.l17NmrZe015167@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvmc: CompilerDriver.cpp updated: 1.43 -> 1.44 --- Log message: move an llvmc-specific function out of the bcreader into llvmc. --- Diffs of the changes: (+17 -0) CompilerDriver.cpp | 17 +++++++++++++++++ 1 files changed, 17 insertions(+) Index: llvm/tools/llvmc/CompilerDriver.cpp diff -u llvm/tools/llvmc/CompilerDriver.cpp:1.43 llvm/tools/llvmc/CompilerDriver.cpp:1.44 --- llvm/tools/llvmc/CompilerDriver.cpp:1.43 Wed Feb 7 15:41:02 2007 +++ llvm/tools/llvmc/CompilerDriver.cpp Wed Feb 7 17:48:32 2007 @@ -62,6 +62,23 @@ DumpAction(&cd->Linker); } +static bool GetBytecodeDependentLibraries(const std::string &fname, + Module::LibraryListType& deplibs, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + ModuleProvider* MP = getBytecodeModuleProvider(fname, BCDC, ErrMsg); + if (!MP) { + deplibs.clear(); + return true; + } + Module* M = MP->releaseModule(ErrMsg); + deplibs = M->getLibraries(); + delete M; + delete MP; + return false; +} + + class CompilerDriverImpl : public CompilerDriver { /// @name Constructors /// @{ From sabre at nondot.org Wed Feb 7 17:48:54 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:48:54 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Reader.h Message-ID: <200702072348.l17Nms9t015176@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Reader.h updated: 1.28 -> 1.29 --- Log message: move an llvmc-specific function out of the bcreader into llvmc. --- Diffs of the changes: (+0 -12) Reader.h | 12 ------------ 1 files changed, 12 deletions(-) Index: llvm/include/llvm/Bytecode/Reader.h diff -u llvm/include/llvm/Bytecode/Reader.h:1.28 llvm/include/llvm/Bytecode/Reader.h:1.29 --- llvm/include/llvm/Bytecode/Reader.h:1.28 Wed Feb 7 15:41:01 2007 +++ llvm/include/llvm/Bytecode/Reader.h Wed Feb 7 17:48:32 2007 @@ -81,18 +81,6 @@ std::string *ErrMsg = 0 ///< Optional place to return an error message ); -/// This function will read only the necessary parts of a bytecode file in order -/// to determine the list of dependent libraries encoded within it. The \p -/// deplibs parameter will contain a vector of strings of the bytecode module's -/// dependent libraries. -/// @returns true on error, false otherwise -/// @brief Get the list of dependent libraries from a bytecode file. -bool GetBytecodeDependentLibraries( - const std::string &fileName, ///< File name to read bytecode from - Module::LibraryListType& deplibs, ///< List of dependent libraries extracted - BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, - std::string* ErrMsg = 0 ///< Optional error message holder -); /// This function will read only the necessary parts of a bytecode file in order /// to obtain a list of externally visible global symbols that the bytecode From sabre at nondot.org Wed Feb 7 17:53:37 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:53:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/Archive.cpp ArchiveInternals.h Message-ID: <200702072353.l17NrbFk016007@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: Archive.cpp updated: 1.16 -> 1.17 ArchiveInternals.h updated: 1.5 -> 1.6 --- Log message: move archive-specific stuff out of bcreader into archive library. --- Diffs of the changes: (+80 -3) Archive.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++- ArchiveInternals.h | 13 ++++++++- 2 files changed, 80 insertions(+), 3 deletions(-) Index: llvm/lib/Bytecode/Archive/Archive.cpp diff -u llvm/lib/Bytecode/Archive/Archive.cpp:1.16 llvm/lib/Bytecode/Archive/Archive.cpp:1.17 --- llvm/lib/Bytecode/Archive/Archive.cpp:1.16 Wed Feb 7 15:41:01 2007 +++ llvm/lib/Bytecode/Archive/Archive.cpp Wed Feb 7 17:53:17 2007 @@ -14,8 +14,9 @@ #include "ArchiveInternals.h" #include "llvm/ModuleProvider.h" +#include "llvm/Module.h" +#include "llvm/Bytecode/Reader.h" #include "llvm/System/Process.h" - using namespace llvm; // getMemberSize - compute the actual physical size of the file member as seen @@ -190,3 +191,70 @@ cleanUpMemory(); } + + +static void getSymbols(Module*M, std::vector& symbols) { + // Loop over global variables + for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) + if (!GI->isDeclaration() && !GI->hasInternalLinkage()) + if (!GI->getName().empty()) + symbols.push_back(GI->getName()); + + // Loop over functions. + for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) + if (!FI->isDeclaration() && !FI->hasInternalLinkage()) + if (!FI->getName().empty()) + symbols.push_back(FI->getName()); +} + +// Get just the externally visible defined symbols from the bytecode +bool llvm::GetBytecodeSymbols(const sys::Path& fName, + std::vector& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); + if (!MP) + return true; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return true; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. + delete MP; + return true; +} + +ModuleProvider* +llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, + const std::string& ModuleID, + std::vector& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + // Get the module provider + ModuleProvider* MP = + getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); + if (!MP) + return 0; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return 0; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. Note that ModuleProvider will delete the + // Module when it is deleted. Also note that its the caller's responsibility + // to delete the ModuleProvider. + return MP; +} Index: llvm/lib/Bytecode/Archive/ArchiveInternals.h diff -u llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.5 llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.6 --- llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.5 Thu Apr 21 16:13:18 2005 +++ llvm/lib/Bytecode/Archive/ArchiveInternals.h Wed Feb 7 17:53:17 2007 @@ -65,9 +65,18 @@ bool checkSignature() { return 0 == memcmp(fmag, ARFILE_MEMBER_MAGIC,2); } - }; - + + // Get just the externally visible defined symbols from the bytecode + bool GetBytecodeSymbols(const sys::Path& fName, + std::vector& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg); + + ModuleProvider* GetBytecodeSymbols(const unsigned char*Buffer,unsigned Length, + const std::string& ModuleID, + std::vector& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg); } #endif From sabre at nondot.org Wed Feb 7 17:53:42 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:53:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Message-ID: <200702072353.l17NrgZ3016013@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: ReaderWrappers.cpp updated: 1.66 -> 1.67 --- Log message: move archive-specific stuff out of bcreader into archive library. --- Diffs of the changes: (+0 -67) ReaderWrappers.cpp | 67 ----------------------------------------------------- 1 files changed, 67 deletions(-) Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.66 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.67 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.66 Wed Feb 7 17:48:32 2007 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Feb 7 17:53:17 2007 @@ -254,70 +254,3 @@ delete MP; return M; } - - -static void getSymbols(Module*M, std::vector& symbols) { - // Loop over global variables - for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) - if (!GI->isDeclaration() && !GI->hasInternalLinkage()) - if (!GI->getName().empty()) - symbols.push_back(GI->getName()); - - // Loop over functions. - for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) - if (!FI->isDeclaration() && !FI->hasInternalLinkage()) - if (!FI->getName().empty()) - symbols.push_back(FI->getName()); -} - -// Get just the externally visible defined symbols from the bytecode -bool llvm::GetBytecodeSymbols(const sys::Path& fName, - std::vector& symbols, - BCDecompressor_t *BCDC, - std::string* ErrMsg) { - ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); - if (!MP) - return true; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; - return true; - } - - // Get the symbols - getSymbols(M, symbols); - - // Done with the module. - delete MP; - return true; -} - -ModuleProvider* -llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, - const std::string& ModuleID, - std::vector& symbols, - BCDecompressor_t *BCDC, - std::string* ErrMsg) { - // Get the module provider - ModuleProvider* MP = - getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); - if (!MP) - return 0; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; - return 0; - } - - // Get the symbols - getSymbols(M, symbols); - - // Done with the module. Note that ModuleProvider will delete the - // Module when it is deleted. Also note that its the caller's responsibility - // to delete the ModuleProvider. - return MP; -} From sabre at nondot.org Wed Feb 7 17:53:42 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 17:53:42 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Reader.h Message-ID: <200702072353.l17NrgQO016016@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Reader.h updated: 1.29 -> 1.30 --- Log message: move archive-specific stuff out of bcreader into archive library. --- Diffs of the changes: (+0 -30) Reader.h | 30 ------------------------------ 1 files changed, 30 deletions(-) Index: llvm/include/llvm/Bytecode/Reader.h diff -u llvm/include/llvm/Bytecode/Reader.h:1.29 llvm/include/llvm/Bytecode/Reader.h:1.30 --- llvm/include/llvm/Bytecode/Reader.h:1.29 Wed Feb 7 17:48:32 2007 +++ llvm/include/llvm/Bytecode/Reader.h Wed Feb 7 17:53:17 2007 @@ -81,36 +81,6 @@ std::string *ErrMsg = 0 ///< Optional place to return an error message ); - -/// This function will read only the necessary parts of a bytecode file in order -/// to obtain a list of externally visible global symbols that the bytecode -/// module defines. This is used for archiving and linking when only the list -/// of symbols the module defines is needed. -/// @returns true on error, false otherwise -/// @brief Get a bytecode file's externally visibile defined global symbols. -bool GetBytecodeSymbols( - const sys::Path& fileName, ///< Filename to read bytecode from - std::vector& syms, ///< Vector to return symbols in - BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, - std::string* ErrMsg = 0 ///< Optional error message holder -); - -/// This function will read only the necessary parts of a bytecode buffer in -/// order to obtain a list of externally visible global symbols that the -/// bytecode module defines. This is used for archiving and linking when only -/// the list of symbols the module defines is needed and the bytecode is -/// already in memory. -/// @returns the ModuleProvider on success, 0 if the bytecode can't be parsed -/// @brief Get a bytecode file's externally visibile defined global symbols. -ModuleProvider* GetBytecodeSymbols( - const unsigned char*Buffer, ///< The buffer to be parsed - unsigned Length, ///< The length of \p Buffer - const std::string& ModuleID, ///< An identifier for the module - std::vector& symbols, ///< The symbols defined in the module - BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, - std::string* ErrMsg = 0 ///< Optional error message holder -); - } // End llvm namespace #endif From reid at x10sys.com Wed Feb 7 18:19:56 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 18:19:56 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeLexer.l Message-ID: <200702080019.l180JuV4018148@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeLexer.l updated: 1.18 -> 1.19 --- Log message: For PR1187: http://llvm.org/PR1187 : Allow @ before identifer names. Recognize the i1, i8, i16, i32, i64 keywords as type names corresponding to bool, ubyte, ushort, uint, and ulong respectively. While these aren't LLVM 1.9 constructs, permitting the syntax allows post-1.9 assembly files to be upgraded. --- Diffs of the changes: (+7 -2) UpgradeLexer.l | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeLexer.l diff -u llvm/tools/llvm-upgrade/UpgradeLexer.l:1.18 llvm/tools/llvm-upgrade/UpgradeLexer.l:1.19 --- llvm/tools/llvm-upgrade/UpgradeLexer.l:1.18 Thu Feb 1 20:16:22 2007 +++ llvm/tools/llvm-upgrade/UpgradeLexer.l Wed Feb 7 18:19:40 2007 @@ -152,14 +152,14 @@ Comment ;.* /* Variable(Value) identifiers start with a % sign */ -VarID %[-a-zA-Z$._][-a-zA-Z$._0-9]* +VarID [%@][-a-zA-Z$._][-a-zA-Z$._0-9]* /* Label identifiers end with a colon */ Label [-a-zA-Z$._0-9]+: QuoteLabel \"[^\"]+\": /* Quoted names can contain any character except " and \ */ -StringConstant \"[^\"]*\" +StringConstant @?\"[^\"]*\" /* [PN]Integer: match positive and negative literal integer values that @@ -240,14 +240,19 @@ sbyte { RET_TY(SBYTE, Type::Int8Ty, Signed); } ubyte { RET_TY(UBYTE, Type::Int8Ty, Unsigned); } +i8 { RET_TY(UBYTE, Type::Int8Ty, Unsigned); } short { RET_TY(SHORT, Type::Int16Ty, Signed); } ushort { RET_TY(USHORT, Type::Int16Ty, Unsigned); } +i16 { RET_TY(USHORT, Type::Int16Ty, Unsigned); } int { RET_TY(INT, Type::Int32Ty, Signed); } uint { RET_TY(UINT, Type::Int32Ty, Unsigned); } +i32 { RET_TY(UINT, Type::Int32Ty, Unsigned); } long { RET_TY(LONG, Type::Int64Ty, Signed); } ulong { RET_TY(ULONG, Type::Int64Ty, Unsigned); } +i64 { RET_TY(ULONG, Type::Int64Ty, Unsigned); } void { RET_TY(VOID, Type::VoidTy, Signless ); } bool { RET_TY(BOOL, Type::Int1Ty, Unsigned ); } +i1 { RET_TY(BOOL, Type::Int1Ty, Unsigned ); } float { RET_TY(FLOAT, Type::FloatTy, Signless ); } double { RET_TY(DOUBLE, Type::DoubleTy,Signless); } label { RET_TY(LABEL, Type::LabelTy, Signless ); } From reid at x10sys.com Wed Feb 7 18:21:22 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 18:21:22 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeParser.y Message-ID: <200702080021.l180LMDY018193@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeParser.y updated: 1.58 -> 1.59 --- Log message: For PR1187: http://llvm.org/PR1187 : When a naming conflict arises, allow internal linkage functions to be renamed without warning or error. --- Diffs of the changes: (+29 -5) UpgradeParser.y | 34 +++++++++++++++++++++++++++++----- 1 files changed, 29 insertions(+), 5 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeParser.y diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.58 llvm/tools/llvm-upgrade/UpgradeParser.y:1.59 --- llvm/tools/llvm-upgrade/UpgradeParser.y:1.58 Mon Feb 5 15:19:13 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y Wed Feb 7 18:21:06 2007 @@ -1655,13 +1655,13 @@ }; OptLinkage - : INTERNAL { $$ = GlobalValue::InternalLinkage; } + : INTERNAL { $$ = GlobalValue::InternalLinkage; } | LINKONCE { $$ = GlobalValue::LinkOnceLinkage; } | WEAK { $$ = GlobalValue::WeakLinkage; } | APPENDING { $$ = GlobalValue::AppendingLinkage; } | DLLIMPORT { $$ = GlobalValue::DLLImportLinkage; } | DLLEXPORT { $$ = GlobalValue::DLLExportLinkage; } - | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } + | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } | /*empty*/ { $$ = GlobalValue::ExternalLinkage; } ; @@ -2625,10 +2625,34 @@ InsertValue(Fn, CurModule.Values); RenameMapKey Key = std::make_pair(FunctionName,PFT); CurModule.RenameMap[Key] = NewName; + } else if (Fn->hasInternalLinkage()) { + // The function we are creating conflicts in name with another function + // that has internal linkage. We'll rename that one quietly to get rid + // of the conflict. + Fn->setName(makeNameUnique(Fn->getName())); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = Fn->getName(); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, + CurModule.CurrentModule); + + InsertValue(Fn, CurModule.Values); + } else if (CurFun.Linkage == GlobalValue::InternalLinkage) { + // The function we are creating has internal linkage and conflicts with + // another function of the same name. We'll just rename this one + // quietly because its internal linkage can't conflict with anything + // else. + std::string NewName = makeNameUnique(FunctionName); + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; } else { - // The types are the same. Either the existing or the current function - // needs to be a forward declaration. If not, they're attempting to - // redefine a function. + // The types are the same and they are both external linkage. Either + // the existing or the current function needs to be a forward + // declaration. If not, they're attempting to redefine two external + // functions. This wasn't allowed in llvm 1.9 and it isn't allowed now. if (!CurFun.isDeclare && !Fn->isDeclaration()) error("Redefinition of function '" + FunctionName + "'"); From reid at x10sys.com Wed Feb 7 18:21:56 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 18:21:56 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs UpgradeLexer.l.cvs UpgradeParser.cpp.cvs UpgradeParser.y.cvs Message-ID: <200702080021.l180LuaG018220@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeLexer.cpp.cvs updated: 1.20 -> 1.21 UpgradeLexer.l.cvs updated: 1.18 -> 1.19 UpgradeParser.cpp.cvs updated: 1.57 -> 1.58 UpgradeParser.y.cvs updated: 1.56 -> 1.57 --- Log message: Regenerate for recent changes. --- Diffs of the changes: (+888 -800) UpgradeLexer.cpp.cvs | 1418 +++++++++++++++++++++++++------------------------- UpgradeLexer.l.cvs | 9 UpgradeParser.cpp.cvs | 226 ++++--- UpgradeParser.y.cvs | 35 + 4 files changed, 888 insertions(+), 800 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs diff -u llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.20 llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.21 --- llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs:1.20 Mon Feb 5 14:47:21 2007 +++ llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs Wed Feb 7 18:21:40 2007 @@ -20,7 +20,7 @@ /* A lexical scanner generated by flex*/ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.20 2007/02/05 20:47:21 reid Exp $ + * $Header: /var/cvs/llvm/llvm/tools/llvm-upgrade/UpgradeLexer.cpp.cvs,v 1.21 2007/02/08 00:21:40 reid Exp $ */ #define FLEX_SCANNER @@ -317,107 +317,108 @@ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 156 -#define YY_END_OF_BUFFER 157 -static yyconst short int yy_acclist[234] = +#define YY_NUM_RULES 161 +#define YY_END_OF_BUFFER 162 +static yyconst short int yy_acclist[241] = { 0, - 157, 155, 156, 154, 155, 156, 154, 156, 155, 156, - 155, 156, 155, 156, 155, 156, 155, 156, 155, 156, - 147, 155, 156, 147, 155, 156, 1, 155, 156, 155, - 156, 155, 156, 155, 156, 155, 156, 155, 156, 155, - 156, 155, 156, 155, 156, 155, 156, 155, 156, 155, - 156, 155, 156, 155, 156, 155, 156, 155, 156, 155, - 156, 155, 156, 155, 156, 155, 156, 155, 156, 155, - 156, 146, 144, 143, 143, 150, 148, 152, 147, 1, - 129, 41, 89, 90, 75, 23, 146, 143, 143, 151, - 152, 20, 152, 153, 63, 74, 39, 34, 42, 66, - - 3, 52, 65, 25, 99, 104, 102, 103, 101, 100, - 105, 109, 70, 128, 94, 92, 83, 84, 93, 91, - 64, 107, 98, 96, 97, 95, 108, 106, 76, 145, - 152, 152, 86, 57, 110, 111, 88, 69, 136, 73, - 87, 137, 54, 85, 22, 149, 68, 114, 72, 26, - 4, 61, 67, 53, 71, 56, 11, 113, 152, 36, - 2, 5, 58, 116, 60, 48, 78, 82, 80, 81, - 79, 77, 50, 138, 112, 49, 55, 21, 126, 135, - 45, 59, 30, 24, 44, 118, 117, 7, 131, 33, - 134, 38, 62, 124, 120, 130, 27, 28, 119, 132, - - 51, 127, 125, 123, 43, 6, 29, 115, 37, 8, - 17, 9, 122, 10, 121, 35, 12, 14, 13, 32, - 40, 15, 31, 133, 139, 141, 142, 16, 46, 140, - 18, 47, 19 + 162, 160, 161, 159, 160, 161, 159, 161, 160, 161, + 160, 161, 160, 161, 160, 161, 160, 161, 160, 161, + 152, 160, 161, 152, 160, 161, 1, 160, 161, 160, + 161, 160, 161, 160, 161, 160, 161, 160, 161, 160, + 161, 160, 161, 160, 161, 160, 161, 160, 161, 160, + 161, 160, 161, 160, 161, 160, 161, 160, 161, 160, + 161, 160, 161, 160, 161, 160, 161, 160, 161, 160, + 161, 160, 161, 151, 149, 148, 148, 155, 153, 157, + 152, 1, 134, 41, 94, 62, 50, 95, 80, 23, + 151, 148, 148, 156, 157, 20, 157, 158, 68, 79, + + 39, 34, 42, 71, 3, 53, 56, 59, 54, 70, + 25, 104, 109, 107, 108, 106, 105, 110, 114, 75, + 133, 99, 97, 88, 89, 98, 96, 69, 112, 103, + 101, 102, 100, 113, 111, 81, 150, 157, 157, 91, + 61, 115, 116, 93, 74, 141, 78, 92, 142, 57, + 90, 22, 154, 73, 119, 77, 26, 4, 66, 72, + 55, 76, 60, 11, 118, 157, 36, 2, 5, 63, + 121, 65, 48, 83, 87, 85, 86, 84, 82, 51, + 143, 117, 49, 58, 21, 131, 140, 45, 64, 30, + 24, 44, 123, 122, 7, 136, 33, 139, 38, 67, + + 129, 125, 135, 27, 28, 124, 137, 52, 132, 130, + 128, 43, 6, 29, 120, 37, 8, 17, 9, 127, + 10, 126, 35, 12, 14, 13, 32, 40, 15, 31, + 138, 144, 146, 147, 16, 46, 145, 18, 47, 19 } ; -static yyconst short int yy_accept[611] = +static yyconst short int yy_accept[621] = { 0, 1, 1, 1, 2, 4, 7, 9, 11, 13, 15, 17, 19, 21, 24, 27, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, - 60, 62, 64, 66, 68, 70, 72, 72, 73, 73, - 74, 75, 76, 77, 77, 78, 78, 79, 80, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, + 60, 62, 64, 66, 68, 70, 72, 74, 74, 75, + 75, 76, 77, 78, 79, 79, 80, 80, 81, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, - - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 88, 89, 91, 92, 93, 94, - 94, 95, 96, 96, 96, 97, 97, 97, 98, 98, - 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, - 100, 100, 101, 101, 101, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, - - 111, 112, 113, 113, 113, 114, 115, 115, 115, 115, - 115, 115, 115, 115, 116, 117, 118, 118, 119, 119, - 119, 119, 120, 121, 121, 121, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 123, 124, 125, 125, 125, - 126, 126, 127, 127, 128, 128, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, - 130, 131, 132, 132, 132, 132, 133, 133, 133, 133, - 134, 134, 134, 135, 136, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 138, 139, 139, 139, 139, 139, 140, 141, 141, - - 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 143, 144, 145, 145, 145, 146, 146, 146, 146, 147, - 147, 148, 148, 148, 148, 148, 148, 148, 149, 149, - 149, 149, 149, 150, 150, 150, 151, 151, 151, 152, - 152, 153, 153, 154, 155, 155, 155, 155, 155, 155, - 155, 156, 156, 156, 156, 156, 157, 157, 158, 158, - 158, 159, 160, 161, 161, 161, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 163, 163, 164, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, - - 166, 166, 166, 167, 167, 167, 168, 169, 170, 171, - 172, 173, 174, 174, 174, 174, 175, 175, 175, 175, - 176, 177, 177, 178, 179, 179, 179, 179, 179, 179, - 180, 180, 180, 180, 180, 180, 181, 181, 181, 182, - 182, 182, 182, 182, 182, 182, 182, 183, 184, 185, - 185, 185, 186, 187, 188, 188, 188, 189, 189, 189, - 189, 189, 190, 190, 191, 192, 193, 194, 194, 194, - 194, 195, 195, 195, 196, 197, 198, 199, 200, 200, - 200, 201, 202, 203, 204, 204, 204, 204, 204, 204, - 205, 205, 206, 206, 207, 208, 208, 208, 208, 208, - - 208, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, - 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, - 213, 214, 215, 215, 216, 216, 216, 216, 216, 217, - 217, 217, 217, 218, 218, 219, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, - 222, 222, 222, 222, 223, 223, 223, 223, 223, 224, - 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 226, 226, 227, 228, + 83, 84, 84, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 87, 87, 87, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, + + 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 92, 93, 95, 96, 97, 98, 98, 99, 99, 100, + 100, 100, 101, 101, 101, 102, 102, 103, 103, 103, + 103, 103, 104, 104, 104, 104, 104, 104, 104, 105, + 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 107, 108, 109, 109, 109, + 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, + + 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, + 118, 119, 120, 120, 120, 121, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 124, 125, 125, 126, 126, + 126, 126, 127, 128, 128, 128, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 130, 131, 132, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, + 137, 138, 139, 139, 139, 139, 140, 140, 140, 140, + 141, 141, 141, 142, 143, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + + 144, 145, 146, 146, 146, 146, 146, 147, 148, 148, + 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 150, 151, 152, 152, 152, 153, 153, 153, 153, 154, + 154, 155, 155, 155, 155, 155, 155, 155, 156, 156, + 156, 156, 156, 157, 157, 157, 158, 158, 158, 159, + 159, 160, 160, 161, 162, 162, 162, 162, 162, 162, + 162, 163, 163, 163, 163, 163, 164, 164, 165, 165, + 165, 166, 167, 168, 168, 168, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 170, 170, 171, 172, 172, 172, 172, 172, 172, + + 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, + 173, 173, 173, 174, 174, 174, 175, 176, 177, 178, + 179, 180, 181, 181, 181, 181, 182, 182, 182, 182, + 183, 184, 184, 185, 186, 186, 186, 186, 186, 186, + 187, 187, 187, 187, 187, 187, 188, 188, 188, 189, + 189, 189, 189, 189, 189, 189, 189, 190, 191, 192, + 192, 192, 193, 194, 195, 195, 195, 196, 196, 196, + 196, 196, 197, 197, 198, 199, 200, 201, 201, 201, + 201, 202, 202, 202, 203, 204, 205, 206, 207, 207, + 207, 208, 209, 210, 211, 211, 211, 211, 211, 211, + + 212, 212, 213, 213, 214, 215, 215, 215, 215, 215, + 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, + 220, 221, 222, 222, 223, 223, 223, 223, 223, 224, + 224, 224, 224, 225, 225, 226, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, + 229, 229, 229, 229, 230, 230, 230, 230, 230, 231, + 231, 231, 232, 232, 232, 232, 232, 232, 232, 232, - 229, 229, 230, 230, 231, 232, 233, 233, 234, 234 + 232, 232, 232, 232, 232, 232, 233, 233, 234, 235, + 236, 236, 237, 237, 238, 239, 240, 240, 241, 241 } ; static yyconst int yy_ec[256] = @@ -426,16 +427,16 @@ 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 5, 6, 1, 1, 1, - 1, 1, 7, 1, 8, 9, 1, 10, 11, 11, - 11, 11, 11, 12, 11, 13, 11, 14, 15, 1, - 1, 1, 1, 1, 16, 16, 16, 16, 17, 16, + 1, 1, 7, 1, 8, 9, 1, 10, 11, 12, + 13, 14, 15, 16, 15, 17, 15, 18, 19, 1, + 1, 1, 1, 20, 21, 21, 21, 21, 22, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 1, 1, 1, 1, 18, 1, 19, 20, 21, 22, + 1, 1, 1, 1, 23, 1, 24, 25, 26, 27, - 23, 24, 25, 26, 27, 5, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 1, 1, 1, 1, 1, 1, 1, 1, + 28, 29, 30, 31, 32, 5, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -452,463 +453,471 @@ 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[44] = +static yyconst int yy_meta[49] = { 0, - 1, 1, 2, 1, 3, 1, 1, 3, 3, 3, - 3, 3, 3, 4, 1, 3, 3, 3, 3, 3, + 1, 1, 2, 1, 3, 1, 4, 5, 3, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 1, 1, + 3, 8, 3, 3, 3, 3, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3 + 3, 3, 3, 3, 3, 3, 3, 3 } ; -static yyconst short int yy_base[615] = +static yyconst short int yy_base[630] = { 0, - 0, 0, 1308, 1309, 1309, 1309, 1303, 1292, 36, 40, - 44, 50, 56, 62, 0, 63, 66, 81, 89, 47, - 108, 91, 105, 96, 119, 117, 144, 128, 68, 170, - 169, 202, 92, 111, 131, 125, 1301, 1309, 1290, 1309, - 0, 207, 229, 234, 239, 70, 244, 259, 264, 0, - 139, 145, 142, 76, 136, 156, 157, 31, 1289, 162, - 164, 192, 48, 172, 268, 175, 173, 221, 212, 1288, - 276, 278, 138, 186, 72, 279, 277, 280, 289, 249, - 282, 290, 216, 281, 291, 189, 294, 284, 295, 1287, - 297, 306, 73, 305, 316, 317, 246, 311, 318, 322, - - 323, 324, 327, 329, 330, 338, 332, 348, 350, 333, - 337, 334, 362, 336, 364, 1286, 367, 351, 359, 371, - 374, 379, 375, 381, 405, 386, 389, 403, 396, 378, - 250, 376, 400, 1285, 0, 436, 440, 1284, 454, 471, - 0, 1283, 382, 406, 1282, 410, 425, 1281, 415, 1280, - 422, 430, 440, 456, 1279, 458, 459, 473, 412, 447, - 460, 1278, 474, 442, 472, 477, 480, 476, 461, 478, - 416, 488, 490, 491, 494, 495, 496, 492, 499, 506, - 507, 500, 513, 505, 508, 520, 521, 523, 524, 525, - 1277, 1276, 526, 1275, 1274, 1273, 1272, 1271, 1270, 527, - - 1269, 1268, 529, 533, 1267, 1266, 561, 538, 537, 542, - 534, 572, 550, 1265, 1264, 1263, 553, 1262, 535, 575, - 536, 1261, 1260, 576, 577, 1259, 555, 579, 540, 580, - 586, 582, 585, 588, 1258, 1257, 1256, 593, 596, 1255, - 590, 1254, 597, 1253, 600, 1252, 601, 602, 604, 605, - 619, 609, 612, 618, 622, 611, 214, 1251, 628, 629, - 1309, 635, 643, 651, 657, 662, 651, 663, 664, 1250, - 665, 666, 1249, 1248, 1247, 667, 669, 672, 673, 675, - 676, 677, 678, 683, 679, 686, 685, 691, 690, 693, - 1246, 1245, 687, 697, 701, 702, 1244, 1243, 703, 707, - - 1242, 708, 709, 711, 713, 714, 719, 715, 721, 1241, - 1240, 1239, 722, 724, 1238, 727, 729, 735, 0, 737, - 1237, 741, 738, 742, 747, 748, 749, 1236, 743, 635, - 750, 755, 1235, 760, 761, 1234, 763, 764, 1233, 767, - 1232, 773, 1231, 1230, 775, 776, 778, 777, 781, 780, - 1229, 783, 784, 789, 791, 1228, 792, 1227, 798, 793, - 1226, 813, 1225, 794, 795, 1224, 801, 807, 816, 817, - 822, 813, 796, 819, 825, 826, 828, 829, 830, 832, - 1223, 833, 1222, 1221, 836, 837, 831, 842, 841, 843, - 846, 853, 854, 855, 1220, 857, 858, 861, 862, 863, - - 866, 865, 1219, 876, 860, 1218, 1217, 1216, 1215, 1214, - 1213, 1212, 877, 879, 880, 1211, 881, 882, 886, 1210, - 1209, 884, 1208, 1207, 885, 890, 888, 887, 891, 1206, - 898, 900, 901, 904, 907, 1205, 909, 911, 1204, 912, - 916, 716, 917, 914, 915, 919, 1203, 1202, 1201, 935, - 918, 1200, 1199, 1198, 925, 928, 1197, 938, 942, 943, - 930, 1196, 945, 1195, 1194, 1193, 1192, 946, 949, 954, - 1191, 950, 955, 1190, 1189, 1188, 1187, 1186, 956, 958, - 1185, 1184, 1183, 1182, 957, 960, 968, 961, 962, 1181, - 963, 1180, 973, 1179, 1178, 964, 975, 977, 978, 980, - - 1177, 981, 983, 984, 987, 988, 992, 994, 995, 1176, - 997, 998, 1005, 1006, 1004, 1008, 1012, 1014, 920, 1175, - 1015, 1017, 1020, 1021, 1174, 1023, 1024, 1025, 1026, 1171, - 1162, 1160, 1029, 1159, 1027, 1044, 1032, 1028, 1158, 1045, - 1049, 1033, 1157, 1050, 1155, 1154, 1053, 1055, 1056, 1057, - 1059, 1060, 1061, 1063, 1065, 1066, 1067, 1069, 1071, 1152, - 1074, 1077, 1080, 1082, 1083, 1085, 1087, 1148, 1090, 1091, - 1096, 1097, 1098, 1147, 1095, 1101, 1102, 1103, 1145, 1107, - 1108, 1140, 1106, 1109, 1114, 1118, 1122, 1123, 1126, 1129, - 1128, 1130, 1131, 1132, 1133, 1070, 1134, 643, 552, 548, - - 1139, 444, 1144, 360, 285, 252, 1142, 133, 1309, 1177, - 1179, 143, 1183, 57 + 0, 0, 1336, 1337, 1337, 1337, 1331, 1316, 41, 0, + 49, 59, 69, 1287, 0, 112, 69, 72, 93, 113, + 52, 122, 74, 152, 120, 77, 136, 156, 135, 71, + 187, 186, 224, 118, 115, 56, 153, 1328, 1337, 1313, + 1337, 0, 256, 0, 1321, 1320, 88, 264, 1282, 283, + 0, 1323, 140, 157, 158, 121, 164, 183, 198, 32, + 1308, 190, 95, 175, 54, 165, 217, 162, 117, 182, + 218, 1307, 220, 272, 185, 100, 204, 219, 235, 241, + 264, 232, 273, 57, 1306, 284, 285, 296, 297, 299, + 300, 226, 298, 302, 308, 1305, 303, 309, 307, 316, + + 321, 329, 330, 332, 333, 334, 313, 337, 310, 315, + 342, 343, 350, 353, 346, 352, 358, 363, 357, 365, + 366, 1304, 373, 377, 381, 385, 383, 384, 389, 390, + 402, 386, 392, 417, 418, 395, 271, 393, 403, 1303, + 0, 0, 416, 1302, 0, 447, 0, 1315, 1300, 438, + 428, 1299, 448, 427, 1298, 419, 1297, 451, 452, 453, + 406, 1296, 454, 455, 456, 461, 457, 460, 1295, 465, + 464, 470, 462, 477, 474, 480, 481, 482, 483, 485, + 488, 486, 490, 491, 1294, 1293, 1292, 492, 493, 495, + 506, 502, 514, 511, 494, 519, 515, 517, 520, 522, + + 1291, 1290, 525, 1289, 1288, 1287, 1286, 1285, 1284, 523, + 1283, 1282, 531, 529, 1281, 1280, 562, 538, 537, 540, + 532, 567, 550, 1279, 1278, 1277, 575, 1276, 534, 533, + 576, 1275, 1274, 535, 578, 1273, 580, 582, 581, 586, + 584, 589, 587, 588, 1272, 1271, 1270, 591, 590, 1269, + 592, 1268, 603, 1267, 601, 1266, 607, 608, 612, 605, + 620, 596, 621, 616, 627, 623, 546, 1265, 628, 630, + 1337, 630, 646, 652, 654, 656, 632, 648, 637, 1264, + 639, 652, 1263, 1262, 1261, 651, 649, 653, 660, 661, + 664, 662, 663, 665, 666, 668, 669, 679, 674, 675, + + 1260, 1259, 670, 671, 682, 686, 1258, 1257, 687, 692, + 1256, 689, 693, 696, 697, 702, 704, 700, 706, 1255, + 1254, 1253, 708, 709, 1252, 701, 710, 712, 0, 713, + 1251, 714, 721, 724, 730, 732, 733, 1250, 735, 736, + 738, 739, 1249, 741, 744, 1248, 753, 746, 1247, 749, + 1246, 755, 1245, 1244, 758, 760, 764, 766, 761, 768, + 1243, 770, 771, 773, 774, 1242, 776, 1241, 778, 777, + 1240, 0, 1239, 781, 779, 1238, 782, 790, 797, 796, + 806, 794, 807, 795, 799, 808, 809, 810, 811, 813, + 1237, 817, 1236, 1235, 822, 823, 820, 830, 826, 824, + + 828, 831, 833, 835, 1234, 832, 844, 839, 846, 848, + 851, 843, 1233, 855, 859, 1232, 1231, 1230, 1229, 1228, + 1227, 1226, 860, 862, 864, 1225, 865, 863, 867, 1224, + 1223, 866, 1222, 1221, 868, 871, 872, 869, 870, 1220, + 875, 880, 885, 888, 889, 1219, 890, 895, 1218, 896, + 897, 898, 900, 901, 902, 903, 1217, 1216, 1215, 911, + 906, 1214, 1213, 1212, 915, 908, 1211, 918, 926, 929, + 909, 1210, 931, 1209, 1208, 1207, 1206, 920, 932, 934, + 1205, 937, 938, 1204, 1203, 1202, 1201, 1200, 940, 943, + 1199, 1198, 1197, 1192, 941, 944, 946, 945, 948, 1181, + + 951, 1178, 953, 1170, 1167, 958, 960, 961, 962, 963, + 1164, 964, 965, 968, 969, 970, 971, 976, 977, 1158, + 979, 986, 987, 989, 990, 991, 994, 997, 998, 1146, + 1003, 1006, 1007, 1004, 1145, 1008, 1009, 1011, 1012, 1144, + 1142, 1141, 1018, 1140, 1013, 1017, 1020, 1019, 1139, 1029, + 1033, 1034, 1137, 1016, 1136, 1133, 1038, 1041, 1042, 1043, + 1045, 1046, 1047, 1050, 1053, 1052, 1054, 1056, 1057, 1131, + 1058, 1061, 1059, 1064, 1065, 1070, 1069, 1128, 1071, 1077, + 1081, 1082, 1083, 913, 1084, 1085, 1086, 1089, 784, 1091, + 1092, 783, 1090, 1095, 1104, 1096, 1105, 1111, 1108, 1112, + + 1113, 1115, 1116, 1117, 1119, 737, 1120, 548, 391, 349, + 1121, 312, 1125, 270, 266, 221, 1126, 184, 1337, 1166, + 1172, 1178, 192, 1186, 1192, 70, 1200, 1203, 1208 } ; -static yyconst short int yy_def[615] = +static yyconst short int yy_def[630] = { 0, - 609, 1, 609, 609, 609, 609, 610, 611, 612, 609, - 611, 611, 611, 611, 613, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 610, 609, 611, 609, - 614, 614, 609, 609, 611, 611, 611, 611, 611, 613, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 609, 614, 614, 609, 611, 611, 611, - 49, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 49, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 609, 609, 609, 609, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 207, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 609, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, - - 611, 611, 611, 611, 611, 611, 611, 611, 0, 609, - 609, 609, 609, 609 + 619, 1, 619, 619, 619, 619, 620, 621, 622, 623, + 621, 621, 11, 13, 624, 622, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 620, 619, 621, + 619, 625, 625, 626, 623, 11, 621, 11, 13, 11, + 624, 627, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 619, + 625, 43, 628, 621, 48, 11, 50, 627, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 50, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 619, 628, 629, 629, 146, 146, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 217, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 274, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 0, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619 } ; -static yyconst short int yy_nxt[1353] = +static yyconst short int yy_nxt[1386] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 14, 14, 4, 15, 8, 8, 8, 16, 17, - 18, 19, 20, 21, 22, 8, 23, 8, 24, 25, - 26, 27, 28, 8, 29, 30, 31, 32, 33, 34, - 35, 8, 36, 42, 40, 43, 43, 43, 43, 44, - 44, 44, 44, 45, 45, 45, 45, 40, 46, 135, - 40, 40, 152, 40, 47, 48, 48, 48, 48, 40, - 47, 48, 48, 48, 48, 40, 40, 69, 138, 40, - 70, 40, 158, 40, 51, 40, 40, 71, 56, 40, - 102, 52, 57, 53, 40, 54, 49, 58, 55, 60, - - 59, 61, 40, 172, 40, 40, 194, 64, 146, 40, - 128, 65, 62, 78, 83, 66, 63, 67, 40, 79, - 68, 40, 84, 129, 40, 80, 72, 85, 73, 74, - 40, 86, 40, 130, 81, 82, 75, 87, 40, 90, - 76, 40, 77, 131, 40, 41, 40, 133, 91, 40, - 88, 40, 40, 99, 92, 40, 89, 40, 40, 100, - 142, 147, 132, 145, 101, 148, 93, 170, 94, 40, - 40, 143, 95, 144, 96, 40, 97, 40, 98, 103, - 149, 150, 40, 40, 155, 40, 40, 115, 40, 104, - 153, 105, 106, 151, 107, 108, 109, 154, 110, 40, - - 116, 163, 40, 117, 111, 40, 112, 113, 159, 114, - 118, 103, 171, 162, 188, 40, 136, 136, 136, 136, - 156, 119, 157, 120, 121, 40, 122, 40, 123, 40, - 124, 359, 125, 165, 40, 183, 126, 127, 43, 43, - 43, 43, 137, 44, 44, 44, 44, 47, 45, 45, - 45, 45, 40, 139, 139, 139, 139, 40, 164, 40, - 140, 257, 40, 40, 200, 40, 140, 47, 48, 48, - 48, 48, 40, 141, 141, 141, 141, 40, 178, 141, - 141, 40, 141, 141, 141, 141, 141, 141, 160, 40, - 40, 40, 40, 40, 40, 40, 166, 40, 40, 175, - - 161, 173, 40, 40, 40, 190, 168, 40, 40, 186, - 40, 184, 167, 169, 179, 174, 176, 185, 40, 40, - 177, 187, 189, 191, 40, 180, 181, 195, 182, 40, - 40, 40, 201, 192, 193, 40, 40, 40, 197, 199, - 40, 196, 40, 40, 202, 40, 40, 40, 203, 40, - 40, 40, 198, 205, 214, 222, 209, 204, 210, 224, - 206, 40, 227, 40, 40, 225, 211, 207, 215, 223, - 208, 220, 40, 40, 212, 40, 216, 40, 213, 217, - 40, 226, 218, 232, 40, 219, 221, 40, 40, 40, - 228, 40, 40, 230, 40, 40, 256, 234, 229, 40, - - 233, 236, 40, 240, 231, 238, 267, 235, 249, 40, - 258, 239, 241, 40, 250, 237, 40, 242, 40, 40, - 251, 252, 254, 40, 255, 40, 243, 244, 40, 40, - 279, 245, 269, 253, 259, 40, 246, 268, 40, 247, - 260, 271, 272, 40, 248, 136, 136, 136, 136, 262, - 262, 262, 262, 40, 292, 40, 263, 40, 273, 270, - 40, 284, 263, 139, 139, 139, 139, 40, 274, 40, - 140, 40, 40, 40, 40, 280, 140, 264, 265, 276, - 266, 266, 266, 266, 40, 40, 40, 40, 281, 40, - 40, 40, 275, 40, 277, 278, 282, 290, 285, 286, - - 283, 40, 287, 40, 40, 40, 293, 40, 40, 40, - 291, 289, 40, 40, 288, 300, 297, 299, 40, 40, - 40, 40, 295, 298, 301, 296, 40, 302, 303, 304, - 294, 306, 308, 40, 40, 307, 40, 40, 40, 40, - 40, 310, 40, 305, 309, 311, 40, 40, 40, 40, - 40, 40, 313, 40, 315, 40, 323, 312, 330, 317, - 316, 40, 314, 40, 337, 40, 40, 332, 40, 318, - 319, 319, 319, 319, 320, 321, 319, 319, 322, 319, - 319, 319, 319, 319, 319, 40, 328, 329, 40, 40, - 40, 335, 40, 40, 324, 40, 325, 331, 40, 40, - - 326, 40, 327, 40, 341, 333, 40, 336, 339, 40, - 40, 334, 338, 40, 40, 40, 340, 40, 40, 347, - 346, 342, 40, 349, 40, 40, 343, 345, 350, 344, - 348, 40, 40, 351, 355, 40, 352, 353, 358, 356, - 357, 40, 40, 354, 262, 262, 262, 262, 40, 264, - 264, 263, 362, 362, 362, 362, 40, 263, 413, 360, - 362, 362, 362, 362, 40, 361, 266, 266, 266, 266, - 40, 266, 266, 266, 266, 40, 40, 40, 40, 40, - 40, 363, 40, 364, 367, 40, 40, 368, 40, 40, - 40, 40, 40, 372, 365, 366, 40, 377, 40, 40, - - 40, 371, 373, 40, 40, 369, 40, 375, 370, 380, - 40, 376, 381, 382, 40, 40, 40, 374, 378, 379, - 40, 40, 40, 383, 40, 389, 40, 40, 40, 40, - 390, 388, 40, 384, 40, 40, 385, 40, 386, 387, - 40, 394, 40, 391, 393, 392, 396, 395, 40, 397, - 40, 40, 399, 398, 40, 40, 40, 493, 405, 403, - 40, 40, 40, 40, 400, 401, 402, 404, 40, 407, - 409, 411, 414, 40, 40, 406, 40, 40, 415, 412, - 40, 417, 416, 408, 410, 418, 40, 420, 40, 40, - 40, 40, 419, 40, 40, 421, 40, 40, 422, 426, - - 423, 424, 40, 425, 40, 40, 40, 40, 40, 40, - 427, 40, 436, 430, 40, 444, 437, 428, 429, 435, - 40, 433, 362, 362, 362, 362, 40, 439, 432, 40, - 40, 431, 40, 434, 440, 40, 438, 441, 40, 40, - 442, 40, 40, 40, 40, 40, 40, 443, 447, 40, - 40, 445, 451, 452, 40, 40, 40, 446, 448, 40, - 450, 455, 453, 454, 456, 449, 40, 40, 40, 457, - 40, 40, 458, 40, 40, 40, 40, 462, 40, 40, - 464, 465, 459, 460, 466, 467, 461, 463, 468, 40, - 40, 469, 40, 40, 40, 40, 471, 40, 40, 40, - - 40, 40, 473, 40, 40, 472, 475, 470, 477, 481, - 480, 40, 474, 40, 40, 483, 478, 40, 476, 486, - 40, 479, 40, 482, 40, 40, 485, 40, 40, 40, - 40, 40, 40, 40, 484, 489, 492, 488, 40, 494, - 487, 40, 491, 40, 543, 501, 496, 490, 40, 495, - 497, 40, 498, 499, 500, 40, 40, 502, 40, 40, - 503, 505, 40, 40, 504, 507, 506, 40, 40, 40, - 40, 40, 511, 40, 40, 40, 40, 40, 512, 509, - 508, 40, 513, 514, 510, 515, 40, 518, 40, 517, - 40, 40, 519, 40, 40, 516, 40, 40, 522, 520, - - 40, 40, 526, 527, 521, 40, 525, 40, 40, 523, - 40, 40, 529, 528, 532, 530, 524, 40, 40, 40, - 536, 40, 531, 537, 538, 40, 539, 40, 40, 533, - 40, 534, 541, 40, 40, 535, 40, 40, 40, 40, - 40, 40, 40, 547, 540, 40, 40, 556, 551, 553, - 542, 548, 544, 545, 549, 552, 546, 40, 40, 559, - 555, 550, 40, 40, 554, 557, 40, 558, 40, 40, - 40, 561, 40, 40, 40, 564, 40, 562, 40, 40, - 40, 567, 40, 40, 40, 571, 560, 40, 565, 573, - 40, 569, 563, 40, 570, 40, 40, 572, 40, 568, - - 40, 574, 566, 40, 40, 578, 575, 579, 40, 40, - 40, 40, 576, 582, 40, 40, 40, 586, 577, 40, - 40, 40, 40, 580, 583, 584, 585, 40, 588, 593, - 591, 40, 581, 589, 592, 40, 40, 587, 590, 40, - 594, 40, 40, 40, 40, 40, 40, 40, 595, 600, - 601, 602, 40, 40, 597, 40, 596, 40, 40, 606, - 40, 40, 598, 599, 605, 40, 607, 40, 40, 604, - 40, 40, 40, 40, 603, 40, 608, 37, 37, 37, - 37, 39, 39, 50, 40, 50, 50, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 261, 40, - - 40, 40, 40, 40, 134, 40, 38, 609, 3, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609 + 14, 14, 14, 14, 14, 14, 14, 4, 15, 16, + 8, 8, 8, 17, 18, 19, 20, 21, 22, 23, + 8, 24, 8, 25, 26, 27, 28, 29, 8, 30, + 31, 32, 33, 34, 35, 36, 8, 37, 43, 41, + 44, 44, 44, 44, 44, 44, 44, 44, 46, 46, + 46, 46, 46, 46, 46, 46, 41, 47, 159, 41, + 187, 41, 137, 41, 41, 44, 41, 48, 49, 49, + 49, 49, 49, 49, 49, 49, 41, 71, 41, 41, + 72, 41, 138, 165, 41, 53, 144, 73, 108, 58, + + 93, 80, 54, 59, 55, 41, 56, 81, 60, 57, + 41, 61, 41, 94, 50, 52, 62, 41, 63, 95, + 162, 619, 619, 619, 619, 619, 619, 619, 619, 64, + 41, 178, 41, 65, 41, 41, 66, 41, 41, 41, + 67, 134, 136, 89, 68, 74, 69, 75, 76, 70, + 170, 90, 41, 41, 135, 77, 91, 41, 153, 78, + 92, 79, 82, 96, 83, 105, 149, 84, 85, 41, + 41, 106, 97, 41, 41, 41, 107, 86, 98, 41, + 139, 41, 41, 99, 152, 100, 87, 88, 150, 101, + 151, 102, 41, 103, 154, 104, 109, 45, 155, 41, + + 41, 41, 41, 41, 41, 169, 166, 41, 163, 121, + 164, 110, 156, 111, 112, 41, 113, 114, 115, 177, + 116, 41, 122, 160, 171, 123, 117, 157, 118, 119, + 161, 120, 124, 109, 41, 41, 41, 41, 41, 158, + 179, 41, 167, 41, 172, 173, 180, 185, 125, 41, + 126, 127, 41, 128, 168, 129, 198, 130, 41, 131, + 181, 174, 182, 132, 133, 142, 142, 142, 142, 142, + 142, 142, 142, 145, 145, 145, 145, 145, 145, 145, + 145, 41, 183, 41, 186, 146, 267, 41, 41, 41, + 41, 146, 147, 147, 147, 147, 147, 147, 147, 147, + + 184, 41, 41, 147, 147, 175, 147, 147, 147, 147, + 147, 147, 176, 41, 41, 41, 41, 41, 188, 41, + 41, 193, 189, 196, 41, 41, 41, 41, 200, 41, + 41, 199, 41, 41, 194, 197, 190, 191, 41, 192, + 195, 201, 203, 205, 202, 204, 41, 41, 207, 41, + 41, 41, 214, 210, 41, 217, 209, 206, 211, 41, + 41, 218, 208, 41, 212, 213, 41, 41, 220, 41, + 41, 215, 230, 219, 41, 41, 221, 224, 216, 232, + 41, 236, 41, 41, 222, 234, 226, 231, 223, 227, + 41, 225, 228, 233, 41, 229, 237, 238, 41, 235, + + 41, 41, 41, 41, 240, 239, 41, 41, 41, 41, + 41, 246, 41, 259, 242, 241, 244, 250, 266, 41, + 41, 245, 260, 41, 248, 247, 251, 243, 253, 254, + 249, 252, 268, 255, 41, 41, 41, 273, 256, 261, + 262, 257, 269, 273, 41, 41, 258, 285, 270, 264, + 281, 265, 263, 274, 275, 41, 276, 276, 276, 276, + 276, 276, 276, 276, 278, 41, 280, 277, 41, 41, + 41, 41, 41, 41, 41, 279, 282, 41, 41, 41, + 286, 41, 41, 288, 289, 283, 284, 41, 294, 296, + 290, 41, 292, 291, 41, 287, 293, 41, 41, 41, + + 41, 295, 41, 41, 297, 41, 303, 41, 41, 41, + 41, 41, 41, 307, 299, 310, 298, 309, 301, 41, + 308, 300, 313, 41, 305, 302, 312, 306, 41, 311, + 304, 41, 41, 314, 41, 319, 41, 41, 316, 41, + 41, 317, 41, 318, 321, 320, 41, 315, 41, 41, + 41, 41, 41, 323, 41, 41, 322, 41, 325, 333, + 341, 326, 340, 41, 324, 41, 327, 41, 369, 343, + 328, 329, 329, 329, 329, 329, 329, 329, 329, 330, + 331, 332, 329, 329, 41, 329, 329, 329, 329, 329, + 329, 338, 41, 41, 334, 41, 335, 41, 41, 41, + + 336, 41, 337, 41, 41, 41, 41, 41, 41, 41, + 347, 349, 342, 41, 339, 346, 351, 344, 41, 350, + 41, 345, 41, 348, 41, 41, 355, 356, 352, 41, + 357, 353, 354, 41, 359, 364, 358, 41, 41, 360, + 41, 362, 366, 363, 41, 41, 361, 41, 365, 41, + 367, 273, 274, 274, 41, 368, 41, 273, 619, 619, + 619, 40, 619, 40, 370, 41, 41, 373, 41, 41, + 41, 371, 375, 374, 376, 377, 378, 41, 41, 41, + 41, 41, 41, 41, 382, 41, 41, 41, 41, 387, + 379, 41, 41, 381, 380, 383, 41, 385, 386, 41, + + 392, 391, 390, 41, 41, 388, 41, 384, 389, 41, + 41, 393, 394, 41, 41, 399, 400, 41, 41, 41, + 398, 41, 395, 41, 396, 41, 41, 41, 397, 41, + 41, 41, 401, 403, 404, 402, 406, 405, 41, 407, + 413, 41, 409, 410, 408, 414, 415, 41, 412, 41, + 41, 411, 41, 41, 41, 41, 41, 417, 41, 419, + 421, 41, 416, 41, 423, 424, 41, 425, 426, 427, + 41, 418, 41, 420, 430, 41, 422, 41, 41, 429, + 428, 41, 431, 41, 436, 41, 432, 41, 41, 433, + 41, 41, 434, 41, 41, 41, 41, 435, 41, 41, + + 41, 41, 440, 437, 446, 447, 443, 41, 445, 438, + 439, 41, 41, 41, 41, 449, 41, 442, 444, 441, + 450, 451, 448, 41, 41, 41, 41, 41, 41, 452, + 41, 454, 455, 453, 41, 457, 456, 41, 461, 41, + 41, 41, 462, 41, 458, 41, 460, 41, 41, 41, + 41, 459, 41, 463, 464, 465, 41, 466, 468, 467, + 41, 41, 472, 41, 475, 41, 470, 473, 41, 469, + 471, 474, 41, 476, 479, 477, 41, 41, 478, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 483, 480, 41, 482, 487, 485, 490, 41, 491, 493, + + 481, 484, 41, 488, 486, 41, 41, 41, 496, 489, + 492, 495, 41, 41, 41, 41, 494, 41, 41, 41, + 41, 499, 502, 41, 498, 41, 41, 504, 41, 497, + 41, 501, 41, 508, 509, 41, 500, 41, 506, 507, + 511, 505, 512, 41, 503, 513, 41, 510, 41, 41, + 516, 41, 515, 514, 41, 41, 517, 41, 41, 518, + 41, 41, 41, 41, 521, 41, 522, 519, 41, 520, + 41, 523, 527, 524, 525, 41, 528, 41, 41, 41, + 41, 41, 41, 529, 526, 41, 41, 41, 41, 531, + 536, 537, 530, 41, 41, 535, 41, 532, 542, 533, + + 538, 539, 540, 41, 41, 534, 41, 41, 41, 541, + 547, 41, 548, 546, 41, 41, 543, 549, 544, 551, + 41, 41, 545, 41, 41, 41, 41, 553, 41, 41, + 41, 557, 550, 41, 41, 41, 41, 41, 552, 561, + 563, 558, 564, 566, 559, 554, 41, 555, 556, 562, + 41, 41, 560, 565, 567, 41, 568, 570, 41, 41, + 41, 571, 41, 41, 41, 569, 574, 41, 572, 41, + 41, 41, 577, 41, 41, 41, 41, 581, 41, 575, + 583, 41, 41, 573, 579, 580, 41, 41, 41, 582, + 584, 578, 588, 576, 41, 585, 586, 589, 41, 41, + + 41, 41, 41, 41, 592, 587, 41, 41, 41, 41, + 590, 596, 41, 41, 593, 594, 595, 598, 591, 601, + 603, 41, 41, 602, 599, 41, 597, 600, 41, 41, + 41, 605, 41, 41, 41, 604, 41, 41, 41, 610, + 611, 612, 41, 41, 606, 41, 616, 607, 41, 608, + 41, 609, 617, 41, 41, 615, 41, 41, 41, 41, + 614, 41, 41, 41, 613, 618, 38, 38, 38, 38, + 38, 38, 38, 38, 40, 41, 40, 40, 40, 40, + 42, 41, 42, 42, 41, 42, 51, 41, 51, 51, + 51, 51, 51, 51, 141, 41, 141, 141, 41, 141, + + 148, 148, 148, 148, 148, 148, 148, 148, 272, 41, + 272, 372, 372, 372, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 39, 41, + 271, 41, 41, 41, 41, 41, 39, 40, 48, 143, + 41, 140, 40, 41, 39, 619, 3, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619 } ; -static yyconst short int yy_chk[1353] = +static yyconst short int yy_chk[1386] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 9, 58, 9, 9, 9, 9, 10, - 10, 10, 10, 11, 11, 11, 11, 11, 12, 614, - 20, 63, 58, 12, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 16, 20, 46, 17, - 20, 29, 63, 46, 16, 75, 93, 20, 17, 54, - 29, 16, 17, 16, 18, 16, 13, 17, 16, 18, - - 17, 18, 19, 75, 22, 33, 93, 19, 54, 24, - 33, 19, 18, 22, 24, 19, 18, 19, 23, 22, - 19, 21, 24, 33, 34, 23, 21, 24, 21, 21, - 26, 24, 25, 34, 23, 23, 21, 25, 36, 26, - 21, 28, 21, 35, 35, 612, 608, 36, 26, 55, - 25, 73, 51, 28, 26, 53, 25, 27, 52, 28, - 51, 55, 35, 53, 28, 55, 27, 73, 27, 56, - 57, 52, 27, 52, 27, 60, 27, 61, 27, 30, - 56, 57, 31, 30, 61, 64, 67, 31, 66, 30, - 60, 30, 30, 57, 30, 30, 30, 60, 30, 74, - - 31, 67, 86, 31, 30, 62, 30, 30, 64, 30, - 31, 32, 74, 66, 86, 32, 42, 42, 42, 42, - 62, 32, 62, 32, 32, 69, 32, 257, 32, 83, - 32, 257, 32, 69, 68, 83, 32, 32, 43, 43, - 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, - 45, 45, 45, 47, 47, 47, 47, 47, 68, 97, - 47, 131, 80, 131, 97, 606, 47, 48, 48, 48, - 48, 48, 48, 49, 49, 49, 49, 49, 80, 49, - 49, 65, 49, 49, 49, 49, 49, 49, 65, 71, - 77, 72, 76, 78, 84, 81, 71, 88, 605, 77, - - 65, 76, 79, 82, 85, 88, 72, 87, 89, 85, - 91, 84, 71, 72, 81, 76, 78, 84, 94, 92, - 79, 85, 87, 89, 98, 82, 82, 94, 82, 95, - 96, 99, 98, 91, 92, 100, 101, 102, 95, 96, - 103, 94, 104, 105, 99, 107, 110, 112, 100, 114, - 111, 106, 95, 102, 107, 110, 105, 101, 106, 111, - 102, 108, 114, 109, 118, 112, 106, 103, 107, 110, - 104, 109, 119, 604, 106, 113, 108, 115, 106, 108, - 117, 113, 108, 118, 120, 108, 109, 121, 123, 132, - 115, 130, 122, 117, 124, 143, 130, 120, 115, 126, - - 119, 122, 127, 124, 117, 123, 143, 121, 126, 129, - 132, 123, 124, 133, 127, 122, 128, 124, 125, 144, - 128, 128, 129, 146, 129, 159, 125, 125, 149, 171, - 159, 125, 146, 128, 133, 151, 125, 144, 147, 125, - 133, 149, 151, 152, 125, 136, 136, 136, 136, 137, - 137, 137, 137, 153, 171, 164, 137, 602, 152, 147, - 160, 164, 137, 139, 139, 139, 139, 139, 153, 154, - 139, 156, 157, 161, 169, 160, 139, 140, 140, 156, - 140, 140, 140, 140, 140, 165, 158, 163, 161, 168, - 166, 170, 154, 167, 157, 158, 163, 169, 165, 166, - - 163, 172, 167, 173, 174, 178, 172, 175, 176, 177, - 170, 168, 179, 182, 167, 177, 175, 176, 184, 180, - 181, 185, 174, 175, 178, 174, 183, 179, 180, 181, - 173, 182, 184, 186, 187, 183, 188, 189, 190, 193, - 200, 186, 203, 181, 185, 187, 204, 211, 219, 221, - 209, 208, 189, 229, 193, 210, 211, 188, 219, 203, - 200, 600, 190, 213, 229, 599, 217, 221, 227, 204, - 207, 207, 207, 207, 208, 209, 207, 207, 210, 207, - 207, 207, 207, 207, 207, 212, 213, 217, 220, 224, - 225, 227, 228, 230, 212, 232, 212, 220, 233, 231, - - 212, 234, 212, 241, 232, 224, 238, 228, 231, 239, - 243, 225, 230, 245, 247, 248, 231, 249, 250, 243, - 241, 233, 252, 247, 256, 253, 234, 239, 248, 238, - 245, 254, 251, 249, 253, 255, 250, 251, 256, 254, - 255, 259, 260, 252, 262, 262, 262, 262, 330, 263, - 263, 262, 263, 263, 263, 263, 598, 262, 330, 259, - 264, 264, 264, 264, 267, 260, 265, 265, 265, 265, - 265, 266, 266, 266, 266, 266, 268, 269, 271, 272, - 276, 267, 277, 268, 272, 278, 279, 276, 280, 281, - 282, 283, 285, 280, 269, 271, 284, 285, 287, 286, - - 293, 279, 281, 289, 288, 277, 290, 283, 278, 288, - 294, 284, 289, 290, 295, 296, 299, 282, 286, 287, - 300, 302, 303, 293, 304, 300, 305, 306, 308, 442, - 302, 299, 307, 294, 309, 313, 295, 314, 295, 296, - 316, 306, 317, 303, 305, 304, 308, 307, 318, 309, - 320, 323, 314, 313, 322, 324, 329, 442, 323, 320, - 325, 326, 327, 331, 316, 317, 318, 322, 332, 325, - 326, 327, 331, 334, 335, 324, 337, 338, 332, 329, - 340, 335, 334, 325, 326, 337, 342, 340, 345, 346, - 348, 347, 338, 350, 349, 342, 352, 353, 345, 349, - - 346, 347, 354, 348, 355, 357, 360, 364, 365, 373, - 350, 359, 364, 354, 367, 373, 365, 352, 353, 360, - 368, 359, 362, 362, 362, 362, 372, 368, 357, 369, - 370, 355, 374, 359, 369, 371, 367, 370, 375, 376, - 371, 377, 378, 379, 387, 380, 382, 372, 376, 385, - 386, 374, 380, 382, 389, 388, 390, 375, 377, 391, - 379, 387, 385, 386, 388, 378, 392, 393, 394, 389, - 396, 397, 390, 405, 398, 399, 400, 394, 402, 401, - 397, 398, 391, 392, 399, 400, 393, 396, 401, 404, - 413, 402, 414, 415, 417, 418, 405, 422, 425, 419, - - 428, 427, 414, 426, 429, 413, 417, 404, 419, 427, - 426, 431, 415, 432, 433, 429, 422, 434, 418, 433, - 435, 425, 437, 428, 438, 440, 432, 444, 445, 441, - 443, 451, 446, 519, 431, 437, 441, 435, 455, 443, - 434, 456, 440, 461, 519, 455, 445, 438, 450, 444, - 446, 458, 450, 450, 451, 459, 460, 456, 463, 468, - 458, 460, 469, 472, 459, 463, 461, 470, 473, 479, - 485, 480, 472, 486, 488, 489, 491, 496, 473, 469, - 468, 487, 479, 480, 470, 485, 493, 488, 497, 487, - 498, 499, 489, 500, 502, 486, 503, 504, 496, 491, - - 505, 506, 500, 502, 493, 507, 499, 508, 509, 497, - 511, 512, 504, 503, 507, 505, 498, 515, 513, 514, - 512, 516, 506, 513, 514, 517, 515, 518, 521, 508, - 522, 509, 517, 523, 524, 511, 526, 527, 528, 529, - 535, 538, 533, 524, 516, 537, 542, 538, 529, 535, - 518, 526, 521, 522, 527, 533, 523, 536, 540, 542, - 537, 528, 541, 544, 536, 540, 547, 541, 548, 549, - 550, 547, 551, 552, 553, 550, 554, 548, 555, 556, - 557, 553, 558, 596, 559, 557, 544, 561, 551, 559, - 562, 555, 549, 563, 556, 564, 565, 558, 566, 554, - - 567, 561, 552, 569, 570, 565, 562, 566, 575, 571, - 572, 573, 563, 570, 576, 577, 578, 575, 564, 583, - 580, 581, 584, 567, 571, 572, 573, 585, 577, 584, - 581, 586, 569, 578, 583, 587, 588, 576, 580, 589, - 585, 591, 590, 592, 593, 594, 595, 597, 586, 591, - 592, 593, 601, 582, 588, 607, 587, 603, 579, 601, - 574, 568, 589, 590, 597, 560, 603, 546, 545, 595, - 543, 539, 534, 532, 594, 531, 607, 610, 610, 610, - 610, 611, 611, 613, 530, 613, 613, 525, 520, 510, - 501, 495, 494, 492, 490, 484, 483, 482, 481, 478, - - 477, 476, 475, 474, 471, 467, 466, 465, 464, 462, - 457, 454, 453, 452, 449, 448, 447, 439, 436, 430, - 424, 423, 421, 420, 416, 412, 411, 410, 409, 408, - 407, 406, 403, 395, 384, 383, 381, 366, 363, 361, - 358, 356, 351, 344, 343, 341, 339, 336, 333, 328, - 321, 315, 312, 311, 310, 301, 298, 297, 292, 291, - 275, 274, 273, 270, 258, 246, 244, 242, 240, 237, - 236, 235, 226, 223, 222, 218, 216, 215, 214, 206, - 205, 202, 201, 199, 198, 197, 196, 195, 194, 192, - 191, 162, 155, 150, 148, 145, 142, 138, 134, 116, - - 90, 70, 59, 39, 37, 8, 7, 3, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 609 + 1, 1, 1, 1, 1, 1, 1, 1, 9, 60, + 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 12, 60, 21, + 84, 65, 36, 36, 84, 626, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 17, 21, 30, 18, + 21, 23, 36, 65, 26, 17, 47, 21, 30, 18, + + 26, 23, 17, 18, 17, 47, 17, 23, 18, 17, + 19, 18, 63, 26, 13, 16, 19, 76, 19, 26, + 63, 16, 16, 16, 16, 16, 16, 16, 16, 19, + 20, 76, 35, 19, 69, 34, 20, 25, 56, 22, + 20, 34, 35, 25, 20, 22, 20, 22, 22, 20, + 69, 25, 29, 27, 34, 22, 25, 53, 56, 22, + 25, 22, 24, 27, 24, 29, 53, 24, 24, 24, + 37, 29, 27, 28, 54, 55, 29, 24, 27, 68, + 37, 57, 66, 28, 55, 28, 24, 24, 54, 28, + 54, 28, 64, 28, 57, 28, 31, 623, 57, 70, + + 58, 618, 75, 32, 31, 68, 66, 62, 64, 32, + 64, 31, 58, 31, 31, 59, 31, 31, 31, 75, + 31, 77, 32, 62, 70, 32, 31, 59, 31, 31, + 62, 31, 32, 33, 67, 71, 78, 73, 616, 59, + 77, 33, 67, 92, 71, 73, 78, 82, 33, 82, + 33, 33, 79, 33, 67, 33, 92, 33, 80, 33, + 78, 73, 79, 33, 33, 43, 43, 43, 43, 43, + 43, 43, 43, 48, 48, 48, 48, 48, 48, 48, + 48, 81, 80, 615, 83, 48, 137, 614, 137, 74, + 83, 48, 50, 50, 50, 50, 50, 50, 50, 50, + + 81, 86, 87, 50, 50, 74, 50, 50, 50, 50, + 50, 50, 74, 88, 89, 93, 90, 91, 86, 94, + 97, 89, 87, 91, 99, 95, 98, 109, 94, 612, + 107, 93, 110, 100, 90, 91, 88, 88, 101, 88, + 90, 95, 98, 100, 97, 99, 102, 103, 101, 104, + 105, 106, 107, 103, 108, 109, 102, 100, 104, 111, + 112, 110, 101, 115, 105, 106, 610, 113, 112, 116, + 114, 108, 115, 111, 119, 117, 112, 113, 108, 116, + 118, 119, 120, 121, 112, 117, 114, 115, 112, 114, + 123, 113, 114, 116, 124, 114, 120, 121, 125, 118, + + 127, 128, 126, 132, 123, 121, 129, 130, 609, 133, + 138, 128, 136, 132, 124, 123, 126, 130, 136, 131, + 139, 127, 133, 161, 129, 128, 130, 125, 131, 131, + 129, 130, 138, 131, 134, 135, 156, 143, 131, 134, + 134, 131, 139, 143, 154, 151, 131, 161, 139, 135, + 156, 135, 134, 146, 146, 150, 146, 146, 146, 146, + 146, 146, 146, 146, 151, 153, 154, 150, 158, 159, + 160, 163, 164, 165, 167, 153, 158, 168, 166, 173, + 163, 171, 170, 165, 166, 159, 160, 172, 171, 173, + 167, 175, 170, 168, 174, 164, 170, 176, 177, 178, + + 179, 172, 180, 182, 174, 181, 179, 183, 184, 188, + 189, 195, 190, 182, 175, 184, 174, 183, 177, 192, + 182, 176, 190, 191, 181, 178, 189, 181, 194, 188, + 180, 193, 197, 191, 198, 195, 196, 199, 192, 200, + 210, 193, 203, 194, 197, 196, 214, 191, 213, 221, + 230, 229, 234, 199, 219, 218, 198, 220, 203, 221, + 230, 210, 229, 267, 200, 608, 213, 223, 267, 234, + 214, 217, 217, 217, 217, 217, 217, 217, 217, 218, + 219, 220, 217, 217, 222, 217, 217, 217, 217, 217, + 217, 223, 227, 231, 222, 235, 222, 237, 239, 238, + + 222, 241, 222, 240, 243, 244, 242, 249, 248, 251, + 239, 241, 231, 262, 227, 238, 242, 235, 255, 241, + 253, 237, 260, 240, 257, 258, 249, 251, 243, 259, + 253, 244, 248, 264, 257, 262, 255, 261, 263, 258, + 266, 260, 264, 261, 265, 269, 259, 270, 263, 277, + 265, 272, 273, 273, 279, 266, 281, 272, 274, 274, + 275, 275, 276, 276, 269, 278, 287, 277, 286, 282, + 288, 270, 279, 278, 281, 282, 286, 289, 290, 292, + 293, 291, 294, 295, 290, 296, 297, 303, 304, 295, + 287, 299, 300, 289, 288, 291, 298, 293, 294, 305, + + 300, 299, 298, 306, 309, 296, 312, 292, 297, 310, + 313, 303, 304, 314, 315, 310, 312, 318, 326, 316, + 309, 317, 305, 319, 305, 323, 324, 327, 306, 328, + 330, 332, 313, 315, 316, 314, 318, 317, 333, 319, + 330, 334, 324, 326, 323, 332, 333, 335, 328, 336, + 337, 327, 339, 340, 606, 341, 342, 335, 344, 336, + 337, 345, 334, 348, 340, 341, 350, 342, 344, 345, + 347, 335, 352, 336, 350, 355, 339, 356, 359, 348, + 347, 357, 352, 358, 359, 360, 355, 362, 363, 356, + 364, 365, 357, 367, 370, 369, 375, 358, 374, 377, + + 592, 589, 364, 360, 374, 375, 369, 378, 370, 362, + 363, 382, 384, 380, 379, 378, 385, 367, 369, 365, + 379, 380, 377, 381, 383, 386, 387, 388, 389, 381, + 390, 383, 384, 382, 392, 386, 385, 397, 390, 395, + 396, 400, 392, 399, 387, 401, 389, 398, 402, 406, + 403, 388, 404, 395, 396, 397, 408, 398, 400, 399, + 412, 407, 404, 409, 408, 410, 402, 406, 411, 401, + 403, 407, 414, 409, 412, 410, 415, 423, 411, 424, + 428, 425, 427, 432, 429, 435, 438, 439, 436, 437, + 424, 414, 441, 423, 429, 427, 436, 442, 437, 439, + + 415, 425, 443, 432, 428, 444, 445, 447, 443, 435, + 438, 442, 448, 450, 451, 452, 441, 453, 454, 455, + 456, 447, 451, 461, 445, 466, 471, 453, 460, 444, + 584, 450, 465, 460, 460, 468, 448, 478, 455, 456, + 465, 454, 466, 469, 452, 468, 470, 461, 473, 479, + 471, 480, 470, 469, 482, 483, 473, 489, 495, 478, + 490, 496, 498, 497, 482, 499, 483, 479, 501, 480, + 503, 489, 497, 490, 495, 506, 498, 507, 508, 509, + 510, 512, 513, 499, 496, 514, 515, 516, 517, 503, + 510, 512, 501, 518, 519, 509, 521, 506, 517, 507, + + 513, 514, 515, 522, 523, 508, 524, 525, 526, 516, + 523, 527, 524, 522, 528, 529, 518, 525, 519, 527, + 531, 534, 521, 532, 533, 536, 537, 529, 538, 539, + 545, 534, 526, 554, 546, 543, 548, 547, 528, 539, + 545, 536, 546, 548, 537, 531, 550, 532, 533, 543, + 551, 552, 538, 547, 550, 557, 551, 554, 558, 559, + 560, 557, 561, 562, 563, 552, 560, 564, 558, 566, + 565, 567, 563, 568, 569, 571, 573, 567, 572, 561, + 569, 574, 575, 559, 565, 566, 577, 576, 579, 568, + 571, 564, 575, 562, 580, 572, 573, 576, 581, 582, + + 583, 585, 586, 587, 580, 574, 588, 593, 590, 591, + 577, 585, 594, 596, 581, 582, 583, 587, 579, 591, + 594, 595, 597, 593, 588, 599, 586, 590, 598, 600, + 601, 596, 602, 603, 604, 595, 605, 607, 611, 601, + 602, 603, 613, 617, 597, 578, 611, 598, 570, 599, + 556, 600, 613, 555, 553, 607, 549, 544, 542, 541, + 605, 540, 535, 530, 604, 617, 620, 620, 620, 620, + 620, 620, 620, 620, 621, 520, 621, 621, 621, 621, + 622, 511, 622, 622, 505, 622, 624, 504, 624, 624, + 624, 624, 624, 624, 625, 502, 625, 625, 500, 625, + + 627, 627, 627, 627, 627, 627, 627, 627, 628, 494, + 628, 629, 629, 629, 493, 492, 491, 488, 487, 486, + 485, 484, 481, 477, 476, 475, 474, 472, 467, 464, + 463, 462, 459, 458, 457, 449, 446, 440, 434, 433, + 431, 430, 426, 422, 421, 420, 419, 418, 417, 416, + 413, 405, 394, 393, 391, 376, 373, 371, 368, 366, + 361, 354, 353, 351, 349, 346, 343, 338, 331, 325, + 322, 321, 320, 311, 308, 307, 302, 301, 285, 284, + 283, 280, 268, 256, 254, 252, 250, 247, 246, 245, + 236, 233, 232, 228, 226, 225, 224, 216, 215, 212, + + 211, 209, 208, 207, 206, 205, 204, 202, 201, 187, + 186, 185, 169, 162, 157, 155, 152, 149, 148, 144, + 140, 122, 96, 85, 72, 61, 52, 49, 46, 45, + 40, 38, 14, 8, 7, 3, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1076,7 +1085,7 @@ /* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing * it to deal with 64 bit numbers. */ -#line 1080 "UpgradeLexer.cpp" +#line 1089 "UpgradeLexer.cpp" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1230,7 +1239,7 @@ #line 189 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -#line 1234 "UpgradeLexer.cpp" +#line 1243 "UpgradeLexer.cpp" if ( yy_init ) { @@ -1278,14 +1287,14 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 610 ) + if ( yy_current_state >= 620 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 609 ); + while ( yy_current_state != 619 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -1569,480 +1578,505 @@ case 50: YY_RULE_SETUP #line 243 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(SHORT, Type::Int16Ty, Signed); } +{ RET_TY(UBYTE, Type::Int8Ty, Unsigned); } YY_BREAK case 51: YY_RULE_SETUP #line 244 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(USHORT, Type::Int16Ty, Unsigned); } +{ RET_TY(SHORT, Type::Int16Ty, Signed); } YY_BREAK case 52: YY_RULE_SETUP #line 245 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(INT, Type::Int32Ty, Signed); } +{ RET_TY(USHORT, Type::Int16Ty, Unsigned); } YY_BREAK case 53: YY_RULE_SETUP #line 246 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(UINT, Type::Int32Ty, Unsigned); } +{ RET_TY(USHORT, Type::Int16Ty, Unsigned); } YY_BREAK case 54: YY_RULE_SETUP #line 247 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(LONG, Type::Int64Ty, Signed); } +{ RET_TY(INT, Type::Int32Ty, Signed); } YY_BREAK case 55: YY_RULE_SETUP #line 248 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(ULONG, Type::Int64Ty, Unsigned); } +{ RET_TY(UINT, Type::Int32Ty, Unsigned); } YY_BREAK case 56: YY_RULE_SETUP #line 249 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(VOID, Type::VoidTy, Signless ); } +{ RET_TY(UINT, Type::Int32Ty, Unsigned); } YY_BREAK case 57: YY_RULE_SETUP #line 250 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(BOOL, Type::Int1Ty, Unsigned ); } +{ RET_TY(LONG, Type::Int64Ty, Signed); } YY_BREAK case 58: YY_RULE_SETUP #line 251 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(FLOAT, Type::FloatTy, Signless ); } +{ RET_TY(ULONG, Type::Int64Ty, Unsigned); } YY_BREAK case 59: YY_RULE_SETUP #line 252 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(DOUBLE, Type::DoubleTy,Signless); } +{ RET_TY(ULONG, Type::Int64Ty, Unsigned); } YY_BREAK case 60: YY_RULE_SETUP #line 253 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TY(LABEL, Type::LabelTy, Signless ); } +{ RET_TY(VOID, Type::VoidTy, Signless ); } YY_BREAK case 61: YY_RULE_SETUP #line 254 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return TYPE; } +{ RET_TY(BOOL, Type::Int1Ty, Unsigned ); } YY_BREAK case 62: YY_RULE_SETUP #line 255 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OPAQUE; } +{ RET_TY(BOOL, Type::Int1Ty, Unsigned ); } YY_BREAK case 63: YY_RULE_SETUP -#line 257 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, AddOp, ADD); } +#line 256 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TY(FLOAT, Type::FloatTy, Signless ); } YY_BREAK case 64: YY_RULE_SETUP -#line 258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SubOp, SUB); } +#line 257 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TY(DOUBLE, Type::DoubleTy,Signless); } YY_BREAK case 65: YY_RULE_SETUP -#line 259 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, MulOp, MUL); } +#line 258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TY(LABEL, Type::LabelTy, Signless ); } YY_BREAK case 66: YY_RULE_SETUP -#line 260 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, DivOp, DIV); } +#line 259 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return TYPE; } YY_BREAK case 67: YY_RULE_SETUP -#line 261 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, UDivOp, UDIV); } +#line 260 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return OPAQUE; } YY_BREAK case 68: YY_RULE_SETUP #line 262 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SDivOp, SDIV); } +{ RET_TOK(BinaryOpVal, AddOp, ADD); } YY_BREAK case 69: YY_RULE_SETUP #line 263 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, FDivOp, FDIV); } +{ RET_TOK(BinaryOpVal, SubOp, SUB); } YY_BREAK case 70: YY_RULE_SETUP #line 264 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, RemOp, REM); } +{ RET_TOK(BinaryOpVal, MulOp, MUL); } YY_BREAK case 71: YY_RULE_SETUP #line 265 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, URemOp, UREM); } +{ RET_TOK(BinaryOpVal, DivOp, DIV); } YY_BREAK case 72: YY_RULE_SETUP #line 266 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SRemOp, SREM); } +{ RET_TOK(BinaryOpVal, UDivOp, UDIV); } YY_BREAK case 73: YY_RULE_SETUP #line 267 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, FRemOp, FREM); } +{ RET_TOK(BinaryOpVal, SDivOp, SDIV); } YY_BREAK case 74: YY_RULE_SETUP #line 268 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, AndOp, AND); } +{ RET_TOK(BinaryOpVal, FDivOp, FDIV); } YY_BREAK case 75: YY_RULE_SETUP #line 269 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, OrOp , OR ); } +{ RET_TOK(BinaryOpVal, RemOp, REM); } YY_BREAK case 76: YY_RULE_SETUP #line 270 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, XorOp, XOR); } +{ RET_TOK(BinaryOpVal, URemOp, UREM); } YY_BREAK case 77: YY_RULE_SETUP #line 271 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetNE, SETNE); } +{ RET_TOK(BinaryOpVal, SRemOp, SREM); } YY_BREAK case 78: YY_RULE_SETUP #line 272 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); } +{ RET_TOK(BinaryOpVal, FRemOp, FREM); } YY_BREAK case 79: YY_RULE_SETUP #line 273 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetLT, SETLT); } +{ RET_TOK(BinaryOpVal, AndOp, AND); } YY_BREAK case 80: YY_RULE_SETUP #line 274 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetGT, SETGT); } +{ RET_TOK(BinaryOpVal, OrOp , OR ); } YY_BREAK case 81: YY_RULE_SETUP #line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetLE, SETLE); } +{ RET_TOK(BinaryOpVal, XorOp, XOR); } YY_BREAK case 82: YY_RULE_SETUP #line 276 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, SetGE, SETGE); } +{ RET_TOK(BinaryOpVal, SetNE, SETNE); } YY_BREAK case 83: YY_RULE_SETUP #line 277 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, ShlOp, SHL); } +{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); } YY_BREAK case 84: YY_RULE_SETUP #line 278 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, ShrOp, SHR); } +{ RET_TOK(BinaryOpVal, SetLT, SETLT); } YY_BREAK case 85: YY_RULE_SETUP #line 279 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, LShrOp, LSHR); } +{ RET_TOK(BinaryOpVal, SetGT, SETGT); } YY_BREAK case 86: YY_RULE_SETUP #line 280 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(BinaryOpVal, AShrOp, ASHR); } +{ RET_TOK(BinaryOpVal, SetLE, SETLE); } YY_BREAK case 87: YY_RULE_SETUP -#line 282 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, ICmpOp, ICMP); } +#line 281 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(BinaryOpVal, SetGE, SETGE); } YY_BREAK case 88: YY_RULE_SETUP -#line 283 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, FCmpOp, FCMP); } +#line 282 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(BinaryOpVal, ShlOp, SHL); } YY_BREAK case 89: YY_RULE_SETUP -#line 285 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return EQ; } +#line 283 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(BinaryOpVal, ShrOp, SHR); } YY_BREAK case 90: YY_RULE_SETUP -#line 286 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return NE; } +#line 284 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(BinaryOpVal, LShrOp, LSHR); } YY_BREAK case 91: YY_RULE_SETUP -#line 287 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return SLT; } +#line 285 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(BinaryOpVal, AShrOp, ASHR); } YY_BREAK case 92: YY_RULE_SETUP -#line 288 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return SGT; } +#line 287 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(OtherOpVal, ICmpOp, ICMP); } YY_BREAK case 93: YY_RULE_SETUP -#line 289 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return SLE; } +#line 288 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(OtherOpVal, FCmpOp, FCMP); } YY_BREAK case 94: YY_RULE_SETUP #line 290 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return SGE; } +{ return EQ; } YY_BREAK case 95: YY_RULE_SETUP #line 291 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return ULT; } +{ return NE; } YY_BREAK case 96: YY_RULE_SETUP #line 292 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UGT; } +{ return SLT; } YY_BREAK case 97: YY_RULE_SETUP #line 293 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return ULE; } +{ return SGT; } YY_BREAK case 98: YY_RULE_SETUP #line 294 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UGE; } +{ return SLE; } YY_BREAK case 99: YY_RULE_SETUP #line 295 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OEQ; } +{ return SGE; } YY_BREAK case 100: YY_RULE_SETUP #line 296 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return ONE; } +{ return ULT; } YY_BREAK case 101: YY_RULE_SETUP #line 297 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OLT; } +{ return UGT; } YY_BREAK case 102: YY_RULE_SETUP #line 298 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OGT; } +{ return ULE; } YY_BREAK case 103: YY_RULE_SETUP #line 299 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OLE; } +{ return UGE; } YY_BREAK case 104: YY_RULE_SETUP #line 300 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return OGE; } +{ return OEQ; } YY_BREAK case 105: YY_RULE_SETUP #line 301 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return ORD; } +{ return ONE; } YY_BREAK case 106: YY_RULE_SETUP #line 302 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UNO; } +{ return OLT; } YY_BREAK case 107: YY_RULE_SETUP #line 303 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UEQ; } +{ return OGT; } YY_BREAK case 108: YY_RULE_SETUP #line 304 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UNE; } +{ return OLE; } YY_BREAK case 109: YY_RULE_SETUP -#line 306 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, PHIOp, PHI_TOK); } +#line 305 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return OGE; } YY_BREAK case 110: YY_RULE_SETUP -#line 307 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, CallOp, CALL); } +#line 306 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return ORD; } YY_BREAK case 111: YY_RULE_SETUP -#line 308 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, CastOp, CAST); } +#line 307 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return UNO; } YY_BREAK case 112: YY_RULE_SETUP -#line 309 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, TruncOp, TRUNC); } +#line 308 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return UEQ; } YY_BREAK case 113: YY_RULE_SETUP -#line 310 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, ZExtOp , ZEXT); } +#line 309 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return UNE; } YY_BREAK case 114: YY_RULE_SETUP #line 311 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, SExtOp, SEXT); } +{ RET_TOK(OtherOpVal, PHIOp, PHI_TOK); } YY_BREAK case 115: YY_RULE_SETUP #line 312 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); } +{ RET_TOK(OtherOpVal, CallOp, CALL); } YY_BREAK case 116: YY_RULE_SETUP #line 313 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, FPExtOp, FPEXT); } +{ RET_TOK(CastOpVal, CastOp, CAST); } YY_BREAK case 117: YY_RULE_SETUP #line 314 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, FPToUIOp, FPTOUI); } +{ RET_TOK(CastOpVal, TruncOp, TRUNC); } YY_BREAK case 118: YY_RULE_SETUP #line 315 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, FPToSIOp, FPTOSI); } +{ RET_TOK(CastOpVal, ZExtOp , ZEXT); } YY_BREAK case 119: YY_RULE_SETUP #line 316 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, UIToFPOp, UITOFP); } +{ RET_TOK(CastOpVal, SExtOp, SEXT); } YY_BREAK case 120: YY_RULE_SETUP #line 317 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, SIToFPOp, SITOFP); } +{ RET_TOK(CastOpVal, FPTruncOp, FPTRUNC); } YY_BREAK case 121: YY_RULE_SETUP #line 318 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); } +{ RET_TOK(CastOpVal, FPExtOp, FPEXT); } YY_BREAK case 122: YY_RULE_SETUP #line 319 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); } +{ RET_TOK(CastOpVal, FPToUIOp, FPTOUI); } YY_BREAK case 123: YY_RULE_SETUP #line 320 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(CastOpVal, BitCastOp, BITCAST); } +{ RET_TOK(CastOpVal, FPToSIOp, FPTOSI); } YY_BREAK case 124: YY_RULE_SETUP #line 321 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, SelectOp, SELECT); } +{ RET_TOK(CastOpVal, UIToFPOp, UITOFP); } YY_BREAK case 125: YY_RULE_SETUP #line 322 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return VANEXT_old; } +{ RET_TOK(CastOpVal, SIToFPOp, SITOFP); } YY_BREAK case 126: YY_RULE_SETUP #line 323 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return VAARG_old; } +{ RET_TOK(CastOpVal, PtrToIntOp, PTRTOINT); } YY_BREAK case 127: YY_RULE_SETUP #line 324 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, VAArg , VAARG); } +{ RET_TOK(CastOpVal, IntToPtrOp, INTTOPTR); } YY_BREAK case 128: YY_RULE_SETUP #line 325 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(TermOpVal, RetOp, RET); } +{ RET_TOK(CastOpVal, BitCastOp, BITCAST); } YY_BREAK case 129: YY_RULE_SETUP #line 326 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(TermOpVal, BrOp, BR); } +{ RET_TOK(OtherOpVal, SelectOp, SELECT); } YY_BREAK case 130: YY_RULE_SETUP #line 327 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(TermOpVal, SwitchOp, SWITCH); } +{ return VANEXT_old; } YY_BREAK case 131: YY_RULE_SETUP #line 328 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(TermOpVal, InvokeOp, INVOKE); } +{ return VAARG_old; } YY_BREAK case 132: YY_RULE_SETUP #line 329 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ return UNWIND; } +{ RET_TOK(OtherOpVal, VAArg , VAARG); } YY_BREAK case 133: YY_RULE_SETUP #line 330 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); } +{ RET_TOK(TermOpVal, RetOp, RET); } YY_BREAK case 134: YY_RULE_SETUP -#line 332 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, MallocOp, MALLOC); } +#line 331 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(TermOpVal, BrOp, BR); } YY_BREAK case 135: YY_RULE_SETUP -#line 333 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, AllocaOp, ALLOCA); } +#line 332 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(TermOpVal, SwitchOp, SWITCH); } YY_BREAK case 136: YY_RULE_SETUP -#line 334 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, FreeOp, FREE); } +#line 333 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(TermOpVal, InvokeOp, INVOKE); } YY_BREAK case 137: YY_RULE_SETUP -#line 335 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, LoadOp, LOAD); } +#line 334 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ return UNWIND; } YY_BREAK case 138: YY_RULE_SETUP -#line 336 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, StoreOp, STORE); } +#line 335 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(TermOpVal, UnreachableOp, UNREACHABLE); } YY_BREAK case 139: YY_RULE_SETUP #line 337 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); } +{ RET_TOK(MemOpVal, MallocOp, MALLOC); } YY_BREAK case 140: YY_RULE_SETUP -#line 339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); } +#line 338 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(MemOpVal, AllocaOp, ALLOCA); } YY_BREAK case 141: YY_RULE_SETUP -#line 340 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); } +#line 339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(MemOpVal, FreeOp, FREE); } YY_BREAK case 142: YY_RULE_SETUP -#line 341 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" -{ RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); } +#line 340 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(MemOpVal, LoadOp, LOAD); } YY_BREAK case 143: YY_RULE_SETUP +#line 341 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(MemOpVal, StoreOp, STORE); } + YY_BREAK +case 144: +YY_RULE_SETUP +#line 342 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(MemOpVal, GetElementPtrOp, GETELEMENTPTR); } + YY_BREAK +case 145: +YY_RULE_SETUP #line 344 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(OtherOpVal, ExtractElementOp, EXTRACTELEMENT); } + YY_BREAK +case 146: +YY_RULE_SETUP +#line 345 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(OtherOpVal, InsertElementOp, INSERTELEMENT); } + YY_BREAK +case 147: +YY_RULE_SETUP +#line 346 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +{ RET_TOK(OtherOpVal, ShuffleVectorOp, SHUFFLEVECTOR); } + YY_BREAK +case 148: +YY_RULE_SETUP +#line 349 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { UnEscapeLexed(yytext+1); Upgradelval.StrVal = strdup(yytext+1); // Skip % return VAR_ID; } YY_BREAK -case 144: +case 149: YY_RULE_SETUP -#line 349 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 354 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { yytext[strlen(yytext)-1] = 0; // nuke colon UnEscapeLexed(yytext); @@ -2050,9 +2084,9 @@ return LABELSTR; } YY_BREAK -case 145: +case 150: YY_RULE_SETUP -#line 355 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 360 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { yytext[strlen(yytext)-2] = 0; // nuke colon, end quote UnEscapeLexed(yytext+1); @@ -2060,9 +2094,9 @@ return LABELSTR; } YY_BREAK -case 146: +case 151: YY_RULE_SETUP -#line 362 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 367 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { // Note that we cannot unescape a string constant here! The // string constant might contain a \00 which would not be // understood by the string stuff. It is valid to make a @@ -2073,14 +2107,14 @@ return STRINGCONSTANT; } YY_BREAK -case 147: +case 152: YY_RULE_SETUP -#line 373 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 378 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.UInt64Val = atoull(yytext); return EUINT64VAL; } YY_BREAK -case 148: +case 153: YY_RULE_SETUP -#line 374 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 379 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+1); // +1: we have bigger negative range @@ -2090,17 +2124,17 @@ return ESINT64VAL; } YY_BREAK -case 149: +case 154: YY_RULE_SETUP -#line 382 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 387 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.UInt64Val = HexIntToVal(yytext+3); return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; } YY_BREAK -case 150: +case 155: YY_RULE_SETUP -#line 387 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 392 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -2109,9 +2143,9 @@ return UINTVAL; } YY_BREAK -case 151: +case 156: YY_RULE_SETUP -#line 394 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 399 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { uint64_t Val = atoull(yytext+2); // +1: we have bigger negative range @@ -2121,18 +2155,18 @@ return SINTVAL; } YY_BREAK -case 152: +case 157: YY_RULE_SETUP -#line 403 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 408 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.FPVal = atof(yytext); return FPVAL; } YY_BREAK -case 153: +case 158: YY_RULE_SETUP -#line 404 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 409 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { Upgradelval.FPVal = HexToFP(yytext); return FPVAL; } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 406 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 411 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { /* Make sure to free the internal buffers for flex when we are * done reading our input! @@ -2141,22 +2175,22 @@ return EOF; } YY_BREAK -case 154: +case 159: YY_RULE_SETUP -#line 414 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 419 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { /* Ignore whitespace */ } YY_BREAK -case 155: +case 160: YY_RULE_SETUP -#line 415 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 420 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" { return yytext[0]; } YY_BREAK -case 156: +case 161: YY_RULE_SETUP -#line 417 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 422 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2160 "UpgradeLexer.cpp" +#line 2194 "UpgradeLexer.cpp" case YY_END_OF_BUFFER: { @@ -2443,7 +2477,7 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 610 ) + if ( yy_current_state >= 620 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2473,11 +2507,11 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 610 ) + if ( yy_current_state >= 620 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 609); + yy_is_jam = (yy_current_state == 619); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3034,5 +3068,5 @@ return 0; } #endif -#line 417 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" +#line 422 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeLexer.l" Index: llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs diff -u llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.18 llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.19 --- llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs:1.18 Thu Feb 1 20:16:22 2007 +++ llvm/tools/llvm-upgrade/UpgradeLexer.l.cvs Wed Feb 7 18:21:40 2007 @@ -152,14 +152,14 @@ Comment ;.* /* Variable(Value) identifiers start with a % sign */ -VarID %[-a-zA-Z$._][-a-zA-Z$._0-9]* +VarID [%@][-a-zA-Z$._][-a-zA-Z$._0-9]* /* Label identifiers end with a colon */ Label [-a-zA-Z$._0-9]+: QuoteLabel \"[^\"]+\": /* Quoted names can contain any character except " and \ */ -StringConstant \"[^\"]*\" +StringConstant @?\"[^\"]*\" /* [PN]Integer: match positive and negative literal integer values that @@ -240,14 +240,19 @@ sbyte { RET_TY(SBYTE, Type::Int8Ty, Signed); } ubyte { RET_TY(UBYTE, Type::Int8Ty, Unsigned); } +i8 { RET_TY(UBYTE, Type::Int8Ty, Unsigned); } short { RET_TY(SHORT, Type::Int16Ty, Signed); } ushort { RET_TY(USHORT, Type::Int16Ty, Unsigned); } +i16 { RET_TY(USHORT, Type::Int16Ty, Unsigned); } int { RET_TY(INT, Type::Int32Ty, Signed); } uint { RET_TY(UINT, Type::Int32Ty, Unsigned); } +i32 { RET_TY(UINT, Type::Int32Ty, Unsigned); } long { RET_TY(LONG, Type::Int64Ty, Signed); } ulong { RET_TY(ULONG, Type::Int64Ty, Unsigned); } +i64 { RET_TY(ULONG, Type::Int64Ty, Unsigned); } void { RET_TY(VOID, Type::VoidTy, Signless ); } bool { RET_TY(BOOL, Type::Int1Ty, Unsigned ); } +i1 { RET_TY(BOOL, Type::Int1Ty, Unsigned ); } float { RET_TY(FLOAT, Type::FloatTy, Signless ); } double { RET_TY(DOUBLE, Type::DoubleTy,Signless); } label { RET_TY(LABEL, Type::LabelTy, Signless ); } Index: llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.57 llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.58 --- llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs:1.57 Mon Feb 5 15:19:13 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs Wed Feb 7 18:21:40 2007 @@ -2241,16 +2241,16 @@ 2358, 2359, 2360, 2361, 2362, 2378, 2398, 2400, 2402, 2402, 2409, 2409, 2416, 2416, 2423, 2423, 2431, 2433, 2435, 2440, 2454, 2455, 2459, 2462, 2470, 2474, 2481, 2485, 2489, 2493, - 2501, 2501, 2505, 2506, 2510, 2518, 2523, 2531, 2532, 2539, - 2546, 2550, 2686, 2686, 2690, 2700, 2700, 2704, 2708, 2710, - 2711, 2715, 2715, 2727, 2728, 2733, 2734, 2735, 2736, 2737, - 2738, 2739, 2740, 2741, 2762, 2765, 2780, 2781, 2786, 2786, - 2794, 2803, 2806, 2815, 2825, 2830, 2839, 2850, 2850, 2853, - 2856, 2859, 2863, 2869, 2884, 2890, 2946, 2949, 2955, 2965, - 2978, 3007, 3015, 3023, 3027, 3034, 3035, 3039, 3042, 3048, - 3065, 3081, 3095, 3107, 3119, 3130, 3148, 3157, 3166, 3173, - 3194, 3218, 3224, 3230, 3236, 3252, 3330, 3338, 3339, 3343, - 3344, 3348, 3354, 3360, 3366, 3372, 3379, 3391, 3405 + 2501, 2501, 2506, 2507, 2511, 2519, 2524, 2532, 2533, 2540, + 2547, 2551, 2711, 2711, 2715, 2725, 2725, 2729, 2733, 2735, + 2736, 2740, 2740, 2752, 2753, 2758, 2759, 2760, 2761, 2762, + 2763, 2764, 2765, 2766, 2787, 2790, 2805, 2806, 2811, 2811, + 2819, 2828, 2831, 2840, 2850, 2855, 2864, 2875, 2875, 2878, + 2881, 2884, 2888, 2894, 2909, 2915, 2971, 2974, 2980, 2990, + 3003, 3032, 3040, 3048, 3052, 3059, 3060, 3064, 3067, 3073, + 3090, 3106, 3120, 3132, 3144, 3155, 3173, 3182, 3191, 3198, + 3219, 3243, 3249, 3255, 3261, 3277, 3355, 3363, 3364, 3368, + 3369, 3373, 3379, 3385, 3391, 3397, 3404, 3416, 3430 }; #endif @@ -4980,12 +4980,12 @@ break; case 213: -#line 2506 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2507 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.StrVal) = 0; ;} break; case 214: -#line 2510 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2511 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-1].TypeVal).T->get() == Type::VoidTy) error("void typed arguments are invalid"); @@ -4994,7 +4994,7 @@ break; case 215: -#line 2518 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2519 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[-2].ArgList); (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); @@ -5003,7 +5003,7 @@ break; case 216: -#line 2523 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2524 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = new std::vector >(); (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); @@ -5012,12 +5012,12 @@ break; case 217: -#line 2531 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2532 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[0].ArgList); ;} break; case 218: -#line 2532 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2533 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = (yyvsp[-2].ArgList); PATypeInfo VoidTI; @@ -5028,7 +5028,7 @@ break; case 219: -#line 2539 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2540 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = new std::vector >(); PATypeInfo VoidTI; @@ -5039,12 +5039,12 @@ break; case 220: -#line 2546 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2547 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ArgList) = 0; ;} break; case 221: -#line 2550 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2551 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { UnEscapeLexed((yyvsp[-5].StrVal)); std::string FunctionName((yyvsp[-5].StrVal)); @@ -5123,10 +5123,34 @@ InsertValue(Fn, CurModule.Values); RenameMapKey Key = std::make_pair(FunctionName,PFT); CurModule.RenameMap[Key] = NewName; + } else if (Fn->hasInternalLinkage()) { + // The function we are creating conflicts in name with another function + // that has internal linkage. We'll rename that one quietly to get rid + // of the conflict. + Fn->setName(makeNameUnique(Fn->getName())); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = Fn->getName(); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, + CurModule.CurrentModule); + + InsertValue(Fn, CurModule.Values); + } else if (CurFun.Linkage == GlobalValue::InternalLinkage) { + // The function we are creating has internal linkage and conflicts with + // another function of the same name. We'll just rename this one + // quietly because its internal linkage can't conflict with anything + // else. + std::string NewName = makeNameUnique(FunctionName); + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; } else { - // The types are the same. Either the existing or the current function - // needs to be a forward declaration. If not, they're attempting to - // redefine a function. + // The types are the same and they are both external linkage. Either + // the existing or the current function needs to be a forward + // declaration. If not, they're attempting to redefine two external + // functions. This wasn't allowed in llvm 1.9 and it isn't allowed now. if (!CurFun.isDeclare && !Fn->isDeclaration()) error("Redefinition of function '" + FunctionName + "'"); @@ -5181,7 +5205,7 @@ break; case 224: -#line 2690 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = CurFun.CurrentFunction; @@ -5192,29 +5216,29 @@ break; case 227: -#line 2704 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2729 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 229: -#line 2710 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2735 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;} break; case 230: -#line 2711 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2736 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;} break; case 231: -#line 2715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { CurFun.isDeclare = true; ;} break; case 232: -#line 2715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = CurFun.CurrentFunction; CurFun.FunctionDone(); @@ -5223,57 +5247,57 @@ break; case 233: -#line 2727 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2752 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 234: -#line 2728 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2753 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 235: -#line 2733 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2758 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;} break; case 236: -#line 2734 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2759 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); ;} break; case 237: -#line 2735 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2760 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); ;} break; case 238: -#line 2736 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2761 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, true)); ;} break; case 239: -#line 2737 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2762 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, false)); ;} break; case 240: -#line 2738 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2763 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createNull(); ;} break; case 241: -#line 2739 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2764 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createUndef(); ;} break; case 242: -#line 2740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2765 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::createZeroInit(); ;} break; case 243: -#line 2741 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2766 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized packed vector const Type *ETy = (*(yyvsp[-1].ConstVector))[0].C->getType(); int NumElements = (yyvsp[-1].ConstVector)->size(); @@ -5298,14 +5322,14 @@ break; case 244: -#line 2762 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2787 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal).C); ;} break; case 245: -#line 2765 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2790 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); std::string AsmStr = std::string((yyvsp[-2].StrVal), End); @@ -5318,17 +5342,17 @@ break; case 246: -#line 2780 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2805 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); ;} break; case 247: -#line 2781 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2806 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); ;} break; case 250: -#line 2794 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2819 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.ValueVal).S = (yyvsp[-1].TypeVal).S; @@ -5338,21 +5362,21 @@ break; case 251: -#line 2803 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2828 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 252: -#line 2806 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2831 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Do not allow functions with 0 basic blocks (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); ;} break; case 253: -#line 2815 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2840 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); InsertValue((yyvsp[0].TermInstVal)); @@ -5363,7 +5387,7 @@ break; case 254: -#line 2825 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2850 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[0].InstVal).I) (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal).I); @@ -5372,7 +5396,7 @@ break; case 255: -#line 2830 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2855 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); // Make sure to move the basic block to the correct location in the @@ -5385,7 +5409,7 @@ break; case 256: -#line 2839 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2864 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true); // Make sure to move the basic block to the correct location in the @@ -5398,21 +5422,21 @@ break; case 259: -#line 2853 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2878 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with a result... (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal).V); ;} break; case 260: -#line 2856 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2881 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with no result... (yyval.TermInstVal) = new ReturnInst(); ;} break; case 261: -#line 2859 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2884 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Unconditional Branch... BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); (yyval.TermInstVal) = new BranchInst(tmpBB); @@ -5420,7 +5444,7 @@ break; case 262: -#line 2863 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2888 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); @@ -5430,7 +5454,7 @@ break; case 263: -#line 2869 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2894 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { Value* tmpVal = getVal((yyvsp[-7].PrimType).T, (yyvsp[-6].ValIDVal)); BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); @@ -5449,7 +5473,7 @@ break; case 264: -#line 2884 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2909 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { Value* tmpVal = getVal((yyvsp[-6].PrimType).T, (yyvsp[-5].ValIDVal)); BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); @@ -5459,7 +5483,7 @@ break; case 265: -#line 2891 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2916 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -5518,21 +5542,21 @@ break; case 266: -#line 2946 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2971 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TermInstVal) = new UnwindInst(); ;} break; case 267: -#line 2949 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2974 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.TermInstVal) = new UnreachableInst(); ;} break; case 268: -#line 2955 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2980 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.JumpTable) = (yyvsp[-5].JumpTable); Constant *V = cast(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal))); @@ -5546,7 +5570,7 @@ break; case 269: -#line 2965 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 2990 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.JumpTable) = new std::vector >(); Constant *V = cast(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal))); @@ -5560,7 +5584,7 @@ break; case 270: -#line 2978 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3003 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { bool omit = false; if ((yyvsp[-1].StrVal)) @@ -5592,7 +5616,7 @@ break; case 271: -#line 3007 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3032 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for PHI nodes (yyval.PHIList).P = new std::list >(); (yyval.PHIList).S = (yyvsp[-5].TypeVal).S; @@ -5604,7 +5628,7 @@ break; case 272: -#line 3015 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3040 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.PHIList) = (yyvsp[-6].PHIList); Value* tmpVal = getVal((yyvsp[-6].PHIList).P->front().first->getType(), (yyvsp[-3].ValIDVal)); @@ -5614,7 +5638,7 @@ break; case 273: -#line 3023 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3048 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for call statements, and memory insts... (yyval.ValueList) = new std::vector(); (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); @@ -5622,7 +5646,7 @@ break; case 274: -#line 3027 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3052 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = (yyvsp[-2].ValueList); (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal)); @@ -5630,26 +5654,26 @@ break; case 276: -#line 3035 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3060 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = 0; ;} break; case 277: -#line 3039 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3064 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 278: -#line 3042 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3067 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 279: -#line 3048 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3073 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].TypeVal).T->get(); if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa(Ty)) @@ -5670,7 +5694,7 @@ break; case 280: -#line 3065 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3090 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (!Ty->isInteger()) { @@ -5690,7 +5714,7 @@ break; case 281: -#line 3081 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3106 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-3].TypeVal).T->get(); if(isa(Ty)) @@ -5708,7 +5732,7 @@ break; case 282: -#line 3095 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3120 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (isa(Ty)) @@ -5724,7 +5748,7 @@ break; case 283: -#line 3107 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3132 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-3].TypeVal).T->get(); if (isa(Ty)) @@ -5740,7 +5764,7 @@ break; case 284: -#line 3119 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3144 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { warning("Use of obsolete 'not' instruction: Replacing with 'xor"); const Type *Ty = (yyvsp[0].ValueVal).V->getType(); @@ -5755,7 +5779,7 @@ break; case 285: -#line 3130 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3155 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[0].ValueVal).V->getType()->isInteger() || cast((yyvsp[0].ValueVal).V->getType())->getBitWidth() != 8) @@ -5777,7 +5801,7 @@ break; case 286: -#line 3148 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3173 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *DstTy = (yyvsp[0].TypeVal).T->get(); if (!DstTy->isFirstClassType()) @@ -5790,7 +5814,7 @@ break; case 287: -#line 3157 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3182 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].ValueVal).V->getType()->isInteger() || cast((yyvsp[-4].ValueVal).V->getType())->getBitWidth() != 1) @@ -5803,7 +5827,7 @@ break; case 288: -#line 3166 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3191 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].TypeVal).T->get(); NewVarArgs = true; @@ -5814,7 +5838,7 @@ break; case 289: -#line 3173 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3198 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType(); const Type* DstTy = (yyvsp[0].TypeVal).T->get(); @@ -5839,7 +5863,7 @@ break; case 290: -#line 3194 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3219 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType(); const Type* DstTy = (yyvsp[0].TypeVal).T->get(); @@ -5867,7 +5891,7 @@ break; case 291: -#line 3218 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3243 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid extractelement operands"); @@ -5877,7 +5901,7 @@ break; case 292: -#line 3224 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3249 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid insertelement operands"); @@ -5887,7 +5911,7 @@ break; case 293: -#line 3230 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3255 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V)) error("Invalid shufflevector operands"); @@ -5897,7 +5921,7 @@ break; case 294: -#line 3236 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3261 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[0].PHIList).P->front().first->getType(); if (!Ty->isFirstClassType()) @@ -5917,7 +5941,7 @@ break; case 295: -#line 3252 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3277 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Handle the short call syntax @@ -5999,34 +6023,34 @@ break; case 296: -#line 3330 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3355 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.InstVal) = (yyvsp[0].InstVal); ;} break; case 297: -#line 3338 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3363 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = (yyvsp[0].ValueList); ;} break; case 298: -#line 3339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3364 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValueList) = new std::vector(); ;} break; case 299: -#line 3343 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3368 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = true; ;} break; case 300: -#line 3344 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3369 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.BoolVal) = false; ;} break; case 301: -#line 3348 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3373 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6036,7 +6060,7 @@ break; case 302: -#line 3354 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3379 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-4].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-4].TypeVal).S; @@ -6046,7 +6070,7 @@ break; case 303: -#line 3360 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3385 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6056,7 +6080,7 @@ break; case 304: -#line 3366 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3391 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *Ty = (yyvsp[-4].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-4].TypeVal).S; @@ -6066,7 +6090,7 @@ break; case 305: -#line 3372 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3397 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type *PTy = (yyvsp[0].ValueVal).V->getType(); if (!isa(PTy)) @@ -6077,7 +6101,7 @@ break; case 306: -#line 3379 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3404 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-1].TypeVal).T->get(); (yyval.InstVal).S = (yyvsp[-1].TypeVal).S; @@ -6093,7 +6117,7 @@ break; case 307: -#line 3391 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3416 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal).T->get()); if (!PTy) @@ -6111,7 +6135,7 @@ break; case 308: -#line 3405 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3430 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const Type* Ty = (yyvsp[-2].TypeVal).T->get(); if (!isa(Ty)) @@ -6133,7 +6157,7 @@ } /* Line 1126 of yacc.c. */ -#line 6137 "UpgradeParser.tab.c" +#line 6161 "UpgradeParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -6401,7 +6425,7 @@ } -#line 3421 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" +#line 3446 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" int yyerror(const char *ErrorMsg) { Index: llvm/tools/llvm-upgrade/UpgradeParser.y.cvs diff -u llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.56 llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.57 --- llvm/tools/llvm-upgrade/UpgradeParser.y.cvs:1.56 Mon Feb 5 15:19:13 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y.cvs Wed Feb 7 18:21:40 2007 @@ -1655,13 +1655,13 @@ }; OptLinkage - : INTERNAL { $$ = GlobalValue::InternalLinkage; } + : INTERNAL { $$ = GlobalValue::InternalLinkage; } | LINKONCE { $$ = GlobalValue::LinkOnceLinkage; } | WEAK { $$ = GlobalValue::WeakLinkage; } | APPENDING { $$ = GlobalValue::AppendingLinkage; } | DLLIMPORT { $$ = GlobalValue::DLLImportLinkage; } | DLLEXPORT { $$ = GlobalValue::DLLExportLinkage; } - | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } + | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } | /*empty*/ { $$ = GlobalValue::ExternalLinkage; } ; @@ -2499,6 +2499,7 @@ Name : VAR_ID | STRINGCONSTANT + //| '@' STRINGCONSTANT { $$ = $2; } ; OptName @@ -2625,10 +2626,34 @@ InsertValue(Fn, CurModule.Values); RenameMapKey Key = std::make_pair(FunctionName,PFT); CurModule.RenameMap[Key] = NewName; + } else if (Fn->hasInternalLinkage()) { + // The function we are creating conflicts in name with another function + // that has internal linkage. We'll rename that one quietly to get rid + // of the conflict. + Fn->setName(makeNameUnique(Fn->getName())); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = Fn->getName(); + + Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, + CurModule.CurrentModule); + + InsertValue(Fn, CurModule.Values); + } else if (CurFun.Linkage == GlobalValue::InternalLinkage) { + // The function we are creating has internal linkage and conflicts with + // another function of the same name. We'll just rename this one + // quietly because its internal linkage can't conflict with anything + // else. + std::string NewName = makeNameUnique(FunctionName); + Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; } else { - // The types are the same. Either the existing or the current function - // needs to be a forward declaration. If not, they're attempting to - // redefine a function. + // The types are the same and they are both external linkage. Either + // the existing or the current function needs to be a forward + // declaration. If not, they're attempting to redefine two external + // functions. This wasn't allowed in llvm 1.9 and it isn't allowed now. if (!CurFun.isDeclare && !Fn->isDeclaration()) error("Redefinition of function '" + FunctionName + "'"); From reid at x10sys.com Wed Feb 7 18:29:46 2007 From: reid at x10sys.com (Reid Spencer) Date: Wed, 7 Feb 2007 18:29:46 -0600 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Interpreter.h Message-ID: <200702080029.l180TklX018380@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/Interpreter: Execution.cpp updated: 1.167 -> 1.168 Interpreter.h updated: 1.82 -> 1.83 --- Log message: For PR1188: http://llvm.org/PR1188 : Compute BitMask correctly. Patch by Leo (wenwenti at hotmail.com). --- Diffs of the changes: (+2 -2) Execution.cpp | 2 +- Interpreter.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.167 llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.168 --- llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.167 Thu Feb 1 20:16:22 2007 +++ llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Wed Feb 7 18:29:31 2007 @@ -1307,7 +1307,7 @@ #define INTEGER_ASSIGN(DEST, BITWIDTH, VAL) \ { \ - uint64_t Mask = (1ull << BITWIDTH) - 1; \ + uint64_t Mask = ~(uint64_t)(0ull) >> (64-BITWIDTH); \ if (BITWIDTH == 1) { \ Dest.Int1Val = (bool) (VAL & Mask); \ } else if (BITWIDTH <= 8) { \ Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.h diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.82 llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.83 --- llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.82 Thu Feb 1 20:16:22 2007 +++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.h Wed Feb 7 18:29:31 2007 @@ -236,7 +236,7 @@ }; inline void maskToBitWidth(GenericValue& GV, unsigned BitWidth) { - uint64_t BitMask = (1ull << BitWidth) - 1; + uint64_t BitMask = ~(uint64_t)(0ull) >> (64-BitWidth); if (BitWidth <= 8) GV.Int8Val &= BitMask; else if (BitWidth <= 16) From dpatel at apple.com Wed Feb 7 19:14:27 2007 From: dpatel at apple.com (Devang Patel) Date: Wed, 7 Feb 2007 17:14:27 -0800 Subject: [llvm-commits] [PATCH] Read llvm bytecodes from PCH file References: <7F474F66-EBCF-4641-BA99-B710B5C8D311@apple.com> Message-ID: <9DB11FF4-30F3-493E-8B0B-84797FD62ADF@apple.com> This patch enables reading llvm bytecodes from PCH file. Applied. - Devang > > Index: llvm.h > =================================================================== > --- llvm.h (revision 123555) > +++ llvm.h (working copy) > @@ -83,6 +83,9 @@ void print_llvm(FILE *file, void *LLVM); > /* Init pch writing. */ > void llvm_pch_write_init(void); > +/* Read bytecodes from PCH file. */ > +void llvm_pch_read(void); > + > /* llvm_asm_file_start - Start the .s file. */ > void llvm_asm_file_start(void); > Index: llvm-backend.cpp > =================================================================== > --- llvm-backend.cpp (revision 123555) > +++ llvm-backend.cpp (working copy) > @@ -32,6 +32,7 @@ Software Foundation, 59 Temple Place - S > #include "llvm/Assembly/Writer.h" > #include "llvm/Assembly/PrintModulePass.h" > #include "llvm/Bytecode/WriteBytecodePass.h" > +#include "llvm/Bytecode/Reader.h" > #include "llvm/CodeGen/RegAllocRegistry.h" > #include "llvm/CodeGen/SchedulerRegistry.h" > #include "llvm/CodeGen/ScheduleDAG.h" > @@ -184,6 +185,21 @@ void llvm_lang_dependent_init(const char > oFILEstream *AsmOutStream = 0; > +void llvm_pch_read(void) { > + > + if (TheModule) > + delete TheModule; > + > + fclose (asm_out_file); > + std::string ErrMsg; > + TheModule = ParseBytecodeFile(asm_file_name, &ErrMsg); > + if (!TheModule) { > + cerr << "Error reading bytecodes from PCH file\n"; > + cerr << ErrMsg << "\n"; > + exit(1); > + } > +} > + > // Initialize PCH writing. > void llvm_pch_write_init(void) { > timevar_push(TV_LLVM_INIT); > Index: c-pch.c > =================================================================== > --- c-pch.c (revision 123555) > +++ c-pch.c (working copy) > @@ -429,6 +429,12 @@ c_common_read_pch (cpp_reader *pfile, co > written += size; > } > free (buf); > + /* APPLE LOCAL begin LLVM */ > +#ifdef ENABLE_LLVM > + llvm_pch_read(); > +#endif > + /* APPLE LOCAL end LLVM */ > + > } > else > { > @@ -438,6 +444,7 @@ c_common_read_pch (cpp_reader *pfile, co > cpp_errno (pfile, CPP_DL_ERROR, "seeking"); > } > + > cpp_prepare_state (pfile, &smd); > gt_pch_restore (f); > Index: llvm-linker-hack.cpp > =================================================================== > --- llvm-linker-hack.cpp (revision 123555) > +++ llvm-linker-hack.cpp (working copy) > @@ -26,6 +26,7 @@ Software Foundation, 59 Temple Place - S > #include "llvm/Analysis/LoadValueNumbering.h" > #include "llvm/Transforms/IPO.h" > #include "llvm/Bytecode/Writer.h" > +#include "llvm/Bytecode/Reader.h" > #include "llvm/CodeGen/ScheduleDAG.h" > #include "llvm/CodeGen/Passes.h" > #include "llvm/Support/Streams.h" > @@ -41,6 +42,7 @@ void dummy_function() { > new llvm::ExistingModuleProvider(0); > llvm::createVerifierPass(); > llvm::WriteBytecodeToFile(0, llvm::cout); > + llvm::ParseBytecodeFile(NULL,NULL); > llvm::createInstructionCombiningPass(); > llvm::createScalarReplAggregatesPass(); > Index: Makefile.in > =================================================================== > --- Makefile.in (revision 123555) > +++ Makefile.in (working copy) > @@ -1069,7 +1069,7 @@ endif > # We use llvm-config to determine the libraries that we need to > link in our > # target, optimizations analyses and the bcwriter. > -LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils > analysis bcwriter ipo > +LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils > analysis bcwriter ipo bcreader > LLVMLIBFILES := $(shell $(LLVMBINPATH)/llvm-config --libfiles $ > (LLVMCOMPONENTS)) > LLVMLDFLAGS := $(shell $(LLVMBINPATH)/llvm-config --ldflags) > LIBS += $(LLVMLDFLAGS) > [dp5.apple.com:/Volumes/src/llvm-gcc/gcc]$ > From dpatel at apple.com Wed Feb 7 19:17:39 2007 From: dpatel at apple.com (Devang Patel) Date: Wed, 7 Feb 2007 17:17:39 -0800 Subject: [llvm-commits] [PATCH] Fix llvm-gcc bootstrap failure on mac os x 10.4 Message-ID: At the moment, llvm-gcc enables DWARF by default on darwin. But you'll don't have required tools. This patch enables DWARF only if they are available. Applied. I also regenerated gcc/config.in and gcc/configure. - Devang Index: configure.ac =================================================================== --- configure.ac (revision 123268) +++ configure.ac (working copy) @@ -705,6 +705,28 @@ esac], AC_SUBST(onestep) # APPLE LOCAL begin LLVM +# See if dsymutil has been installed and is modern enough +# that we can use DWARF. +gcc_AC_CHECK_PROG_VER(DSYMUTIL, dsymutil, --version, + [.*dwarfutils.\([0-9]*\)], + [2[5-9]*]) +if test $gcc_cv_prog_dsymutil_modern = no; then + AC_MSG_RESULT([dsymutil is not available]) +else + AC_DEFINE(HAVE_DSYMUTIL, 1, + [dsymutil is available]) +fi + +gcc_AC_CHECK_PROG_VER(DSYMUTIL, dsymutil, --version, + [.*dwarfutils.\([0-9]*\)], + [[3-9][0-9]*]) +if test $gcc_cv_prog_dsymutil_modern = no; then + AC_MSG_RESULT([dsymutil is not available]) +else + AC_DEFINE(HAVE_DSYMUTIL, 1, + [dsymutil is available]) +fi + AC_ARG_ENABLE(llvm, [ --enable-llvm=DIR enable the LLVM backend, use DIR as LLVM root], [case "${enableval}" in Index: config/darwin.h =================================================================== --- config/darwin.h (revision 123268) +++ config/darwin.h (working copy) @@ -367,6 +367,15 @@ do { \ #define CC1PLUS_SPEC "-D__private_extern__=extern" /* APPLE LOCAL end private extern */ +/* APPLE LOCAL begin llvm */ +#ifdef HAVE_DSYMUTIL +#define DARWIN_DSYMUTIL_SPEC "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:% {!MM:%{!E:%{!S:\ + %{.c|.cc|.C|.cpp|.c++|.CPP|.m|.mm: \ + %{g*:%{!gstabs*:%{!g0: dsymutil % {o*:%*}%{!o:a.out}}}}}}}}}}}}" +#else +#define DARWIN_DSYMUTIL_SPEC "" +#endif +/* APPLE LOCAL end llvm */ /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus precomp, libtool, and fat build additions. Also we don't specify a second %G after %L because libSystem is @@ -389,10 +398,10 @@ do { \ %{fnested-functions: -allow_stack_execute} \ %{!nostdlib:%{!nodefaultlibs:%G %L}} \ "/* APPLE LOCAL begin mainline 4.3 2006-12-20 4370146 4869554 */"\ - %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} }}}}}}}}\n\ -%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ - %{.c|.cc|.C|.cpp|.c++|.CPP|.m|.mm: \ - %{g*:%{!gstabs*:%{!g0: dsymutil %{o*:%*}%{!o:a.out}}}}}}}}}}}}" +"/* APPLE LOCAL begin llvm */"\ + %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} }}}}}}}} \n % (darwin_dsymutil) " +/* APPLE LOCAL end llvm */ + /* APPLE LOCAL end mainline 4.3 2006-12-20 4370146 4869554 */ /* APPLE LOCAL end no-libtool */ @@ -553,7 +562,9 @@ do { \ /* APPLE LOCAL begin crt1 4521370 */ #define DARWIN_EXTRA_SPECS \ { "darwin_crt1", DARWIN_CRT1_SPEC }, \ - { "darwin_dylib1", DARWIN_DYLIB1_SPEC }, + { "darwin_dylib1", DARWIN_DYLIB1_SPEC }, \ + /* APPLE LOCAL LLVM */ \ + { "darwin_dsymutil", DARWIN_DSYMUTIL_SPEC }, #define DARWIN_DYLIB1_SPEC \ "%:version-compare(!> 10.5 mmacosx-version-min= - ldylib1.o) \ @@ -576,9 +587,15 @@ do { \ #define DBX_DEBUGGING_INFO 1 /* Prefer DWARF2. */ +/* APPLE LOCAL begin llvm */ +/* Prefer DWARF only if appropriate dsymutil is available. */ #define DWARF2_DEBUGGING_INFO +#ifdef HAVE_DSYMUTIL #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG - +#else +#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG +#endif +/* APPLE LOCAL end llvm */ /* APPLE LOCAL end for-fsf-4_3 4370143 */ /* APPLE LOCAL begin mainline 2006-03-16 dwarf2 section flags */ #define DEBUG_FRAME_SECTION "__DWARF,__debug_frame,regular,debug" From isanbard at gmail.com Wed Feb 7 19:31:07 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:31:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/ELFWriter.h MachOWriter.h Message-ID: <200702080131.l181V7hR019655@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: ELFWriter.h added (r1.1) MachOWriter.h added (r1.1) --- Log message: Moved from include/llvm/CodeGen to lib/CodeGen. --- Diffs of the changes: (+850 -0) ELFWriter.h | 226 +++++++++++++++++++++ MachOWriter.h | 624 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 850 insertions(+) Index: llvm/lib/CodeGen/ELFWriter.h diff -c /dev/null llvm/lib/CodeGen/ELFWriter.h:1.1 *** /dev/null Wed Feb 7 19:31:00 2007 --- llvm/lib/CodeGen/ELFWriter.h Wed Feb 7 19:30:50 2007 *************** *** 0 **** --- 1,226 ---- + //===-- ELFWriter.h - Target-independent ELF writer support -----*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the ELFWriter class. + // + //===----------------------------------------------------------------------===// + + #ifndef ELFWRITER_H + #define ELFWRITER_H + + #include "llvm/CodeGen/MachineFunctionPass.h" + #include + + namespace llvm { + class GlobalVariable; + class Mangler; + class MachineCodeEmitter; + class ELFCodeEmitter; + + /// ELFWriter - This class implements the common target-independent code for + /// writing ELF files. Targets should derive a class from this to + /// parameterize the output format. + /// + class ELFWriter : public MachineFunctionPass { + friend class ELFCodeEmitter; + public: + MachineCodeEmitter &getMachineCodeEmitter() const { + return *(MachineCodeEmitter*)MCE; + } + + ELFWriter(std::ostream &O, TargetMachine &TM); + ~ELFWriter(); + + typedef std::vector DataBuffer; + + protected: + /// Output stream to send the resultant object file to. + /// + std::ostream &O; + + /// Target machine description. + /// + TargetMachine &TM; + + /// Mang - The object used to perform name mangling for this module. + /// + Mangler *Mang; + + /// MCE - The MachineCodeEmitter object that we are exposing to emit machine + /// code for functions to the .o file. + ELFCodeEmitter *MCE; + + //===------------------------------------------------------------------===// + // Properties to be set by the derived class ctor, used to configure the + // ELFWriter. + + // e_machine - This field is the target specific value to emit as the + // e_machine member of the ELF header. + unsigned short e_machine; + + // e_flags - The machine flags for the target. This defaults to zero. + unsigned e_flags; + + //===------------------------------------------------------------------===// + // Properties inferred automatically from the target machine. + // + + /// is64Bit/isLittleEndian - This information is inferred from the target + /// machine directly, indicating whether to emit a 32- or 64-bit ELF file. + bool is64Bit, isLittleEndian; + + /// doInitialization - Emit the file header and all of the global variables + /// for the module to the ELF file. + bool doInitialization(Module &M); + + bool runOnMachineFunction(MachineFunction &MF); + + + /// doFinalization - Now that the module has been completely processed, emit + /// the ELF file to 'O'. + bool doFinalization(Module &M); + + private: + // The buffer we accumulate the file header into. Note that this should be + // changed into something much more efficient later (and the bytecode writer + // as well!). + DataBuffer FileHeader; + + /// ELFSection - This struct contains information about each section that is + /// emitted to the file. This is eventually turned into the section header + /// table at the end of the file. + struct ELFSection { + std::string Name; // Name of the section. + unsigned NameIdx; // Index in .shstrtab of name, once emitted. + unsigned Type; + unsigned Flags; + uint64_t Addr; + unsigned Offset; + unsigned Size; + unsigned Link; + unsigned Info; + unsigned Align; + unsigned EntSize; + + /// SectionIdx - The number of the section in the Section Table. + /// + unsigned short SectionIdx; + + /// SectionData - The actual data for this section which we are building + /// up for emission to the file. + DataBuffer SectionData; + + enum { SHT_NULL = 0, SHT_PROGBITS = 1, SHT_SYMTAB = 2, SHT_STRTAB = 3, + SHT_RELA = 4, SHT_HASH = 5, SHT_DYNAMIC = 6, SHT_NOTE = 7, + SHT_NOBITS = 8, SHT_REL = 9, SHT_SHLIB = 10, SHT_DYNSYM = 11 }; + enum { SHN_UNDEF = 0, SHN_ABS = 0xFFF1, SHN_COMMON = 0xFFF2 }; + enum { // SHF - ELF Section Header Flags + SHF_WRITE = 1 << 0, // Writable + SHF_ALLOC = 1 << 1, // Mapped into the process addr space + SHF_EXECINSTR = 1 << 2, // Executable + SHF_MERGE = 1 << 4, // Might be merged if equal + SHF_STRINGS = 1 << 5, // Contains null-terminated strings + SHF_INFO_LINK = 1 << 6, // 'sh_info' contains SHT index + SHF_LINK_ORDER = 1 << 7, // Preserve order after combining + SHF_OS_NONCONFORMING = 1 << 8, // nonstandard OS support required + SHF_GROUP = 1 << 9, // Section is a member of a group + SHF_TLS = 1 << 10 // Section holds thread-local data + }; + + ELFSection(const std::string &name) + : Name(name), Type(0), Flags(0), Addr(0), Offset(0), Size(0), + Link(0), Info(0), Align(0), EntSize(0) { + } + }; + + /// SectionList - This is the list of sections that we have emitted to the + /// file. Once the file has been completely built, the section header table + /// is constructed from this info. + std::list SectionList; + unsigned NumSections; // Always = SectionList.size() + + /// SectionLookup - This is a mapping from section name to section number in + /// the SectionList. + std::map SectionLookup; + + /// getSection - Return the section with the specified name, creating a new + /// section if one does not already exist. + ELFSection &getSection(const std::string &Name, + unsigned Type, unsigned Flags = 0) { + ELFSection *&SN = SectionLookup[Name]; + if (SN) return *SN; + + SectionList.push_back(Name); + SN = &SectionList.back(); + SN->SectionIdx = NumSections++; + SN->Type = Type; + SN->Flags = Flags; + return *SN; + } + + ELFSection &getDataSection() { + return getSection(".data", ELFSection::SHT_PROGBITS, + ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC); + } + ELFSection &getBSSSection() { + return getSection(".bss", ELFSection::SHT_NOBITS, + ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC); + } + + /// ELFSym - This struct contains information about each symbol that is + /// added to logical symbol table for the module. This is eventually + /// turned into a real symbol table in the file. + struct ELFSym { + const GlobalValue *GV; // The global value this corresponds to. + unsigned NameIdx; // Index in .strtab of name, once emitted. + uint64_t Value; + unsigned Size; + unsigned char Info; + unsigned char Other; + unsigned short SectionIdx; + + enum { STB_LOCAL = 0, STB_GLOBAL = 1, STB_WEAK = 2 }; + enum { STT_NOTYPE = 0, STT_OBJECT = 1, STT_FUNC = 2, STT_SECTION = 3, + STT_FILE = 4 }; + ELFSym(const GlobalValue *gv) : GV(gv), Value(0), Size(0), Info(0), + Other(0), SectionIdx(0) {} + + void SetBind(unsigned X) { + assert(X == (X & 0xF) && "Bind value out of range!"); + Info = (Info & 0x0F) | (X << 4); + } + void SetType(unsigned X) { + assert(X == (X & 0xF) && "Type value out of range!"); + Info = (Info & 0xF0) | X; + } + }; + + /// SymbolTable - This is the list of symbols we have emitted to the file. + /// This actually gets rearranged before emission to the file (to put the + /// local symbols first in the list). + std::vector SymbolTable; + + // As we complete the ELF file, we need to update fields in the ELF header + // (e.g. the location of the section table). These members keep track of + // the offset in ELFHeader of these various pieces to update and other + // locations in the file. + unsigned ELFHeader_e_shoff_Offset; // e_shoff in ELF header. + unsigned ELFHeader_e_shstrndx_Offset; // e_shstrndx in ELF header. + unsigned ELFHeader_e_shnum_Offset; // e_shnum in ELF header. + private: + void EmitGlobal(GlobalVariable *GV); + + void EmitSymbolTable(); + + void EmitSectionTableStringTable(); + void OutputSectionsAndSectionTable(); + }; + } + + #endif Index: llvm/lib/CodeGen/MachOWriter.h diff -c /dev/null llvm/lib/CodeGen/MachOWriter.h:1.1 *** /dev/null Wed Feb 7 19:31:07 2007 --- llvm/lib/CodeGen/MachOWriter.h Wed Feb 7 19:30:50 2007 *************** *** 0 **** --- 1,624 ---- + //=== MachOWriter.h - Target-independent Mach-O writer support --*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Nate Begeman and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the MachOWriter class. + // + //===----------------------------------------------------------------------===// + + #ifndef MACHOWRITER_H + #define MACHOWRITER_H + + #include "llvm/Constants.h" + #include "llvm/DerivedTypes.h" + #include "llvm/CodeGen/MachineFunctionPass.h" + #include "llvm/CodeGen/MachineRelocation.h" + #include "llvm/Target/TargetData.h" + #include "llvm/Target/TargetMachine.h" + #include "llvm/Target/TargetMachOWriterInfo.h" + + namespace llvm { + class GlobalVariable; + class Mangler; + class MachineCodeEmitter; + class MachOCodeEmitter; + class OutputBuffer; + + /// MachOSym - This struct contains information about each symbol that is + /// added to logical symbol table for the module. This is eventually + /// turned into a real symbol table in the file. + struct MachOSym { + const GlobalValue *GV; // The global value this corresponds to. + std::string GVName; // The mangled name of the global value. + uint32_t n_strx; // index into the string table + uint8_t n_type; // type flag + uint8_t n_sect; // section number or NO_SECT + int16_t n_desc; // see + uint64_t n_value; // value for this symbol (or stab offset) + + // Constants for the n_sect field + // see + enum { NO_SECT = 0 }; // symbol is not in any section + + // Constants for the n_type field + // see + enum { N_UNDF = 0x0, // undefined, n_sect == NO_SECT + N_ABS = 0x2, // absolute, n_sect == NO_SECT + N_SECT = 0xe, // defined in section number n_sect + N_PBUD = 0xc, // prebound undefined (defined in a dylib) + N_INDR = 0xa // indirect + }; + // The following bits are OR'd into the types above. For example, a type + // of 0x0f would be an external N_SECT symbol (0x0e | 0x01). + enum { N_EXT = 0x01, // external symbol bit + N_PEXT = 0x10 // private external symbol bit + }; + + // Constants for the n_desc field + // see + enum { REFERENCE_FLAG_UNDEFINED_NON_LAZY = 0, + REFERENCE_FLAG_UNDEFINED_LAZY = 1, + REFERENCE_FLAG_DEFINED = 2, + REFERENCE_FLAG_PRIVATE_DEFINED = 3, + REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY = 4, + REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY = 5 + }; + enum { N_NO_DEAD_STRIP = 0x0020, // symbol is not to be dead stripped + N_WEAK_REF = 0x0040, // symbol is weak referenced + N_WEAK_DEF = 0x0080 // coalesced symbol is a weak definition + }; + + MachOSym(const GlobalValue *gv, std::string name, uint8_t sect, + TargetMachine &TM); + }; + + /// MachOWriter - This class implements the common target-independent code for + /// writing Mach-O files. Targets should derive a class from this to + /// parameterize the output format. + /// + class MachOWriter : public MachineFunctionPass { + friend class MachOCodeEmitter; + public: + MachineCodeEmitter &getMachineCodeEmitter() const { + return *(MachineCodeEmitter*)MCE; + } + + MachOWriter(std::ostream &O, TargetMachine &TM); + virtual ~MachOWriter(); + + virtual const char *getPassName() const { + return "Mach-O Writer"; + } + + typedef std::vector DataBuffer; + protected: + /// Output stream to send the resultant object file to. + /// + std::ostream &O; + + /// Target machine description. + /// + TargetMachine &TM; + + /// Mang - The object used to perform name mangling for this module. + /// + Mangler *Mang; + + /// MCE - The MachineCodeEmitter object that we are exposing to emit machine + /// code for functions to the .o file. + MachOCodeEmitter *MCE; + + /// is64Bit/isLittleEndian - This information is inferred from the target + /// machine directly, indicating what header values and flags to set. + bool is64Bit, isLittleEndian; + + /// doInitialization - Emit the file header and all of the global variables + /// for the module to the Mach-O file. + bool doInitialization(Module &M); + + bool runOnMachineFunction(MachineFunction &MF); + + /// doFinalization - Now that the module has been completely processed, emit + /// the Mach-O file to 'O'. + bool doFinalization(Module &M); + + /// MachOHeader - This struct contains the header information about a + /// specific architecture type/subtype pair that is emitted to the file. + struct MachOHeader { + uint32_t magic; // mach magic number identifier + uint32_t filetype; // type of file + uint32_t ncmds; // number of load commands + uint32_t sizeofcmds; // the size of all the load commands + uint32_t flags; // flags + uint32_t reserved; // 64-bit only + + /// HeaderData - The actual data for the header which we are building + /// up for emission to the file. + DataBuffer HeaderData; + + // Constants for the filetype field + // see for additional info on the various types + enum { MH_OBJECT = 1, // relocatable object file + MH_EXECUTE = 2, // demand paged executable file + MH_FVMLIB = 3, // fixed VM shared library file + MH_CORE = 4, // core file + MH_PRELOAD = 5, // preloaded executable file + MH_DYLIB = 6, // dynamically bound shared library + MH_DYLINKER = 7, // dynamic link editor + MH_BUNDLE = 8, // dynamically bound bundle file + MH_DYLIB_STUB = 9, // shared library stub for static linking only + MH_DSYM = 10 // companion file wiht only debug sections + }; + + // Constants for the flags field + enum { MH_NOUNDEFS = 1 << 0, + // the object file has no undefined references + MH_INCRLINK = 1 << 1, + // the object file is the output of an incremental link against + // a base file and cannot be link edited again + MH_DYLDLINK = 1 << 2, + // the object file is input for the dynamic linker and cannot be + // statically link edited again. + MH_BINDATLOAD = 1 << 3, + // the object file's undefined references are bound by the + // dynamic linker when loaded. + MH_PREBOUND = 1 << 4, + // the file has its dynamic undefined references prebound + MH_SPLIT_SEGS = 1 << 5, + // the file has its read-only and read-write segments split + // see + MH_LAZY_INIT = 1 << 6, + // the shared library init routine is to be run lazily via + // catching memory faults to its writable segments (obsolete) + MH_TWOLEVEL = 1 << 7, + // the image is using two-level namespace bindings + MH_FORCE_FLAT = 1 << 8, + // the executable is forcing all images to use flat namespace + // bindings. + MH_NOMULTIDEFS = 1 << 8, + // this umbrella guarantees no multiple definitions of symbols + // in its sub-images so the two-level namespace hints can + // always be used. + MH_NOFIXPREBINDING = 1 << 10, + // do not have dyld notify the prebidning agent about this + // executable. + MH_PREBINDABLE = 1 << 11, + // the binary is not prebound but can have its prebinding + // redone. only used when MH_PREBOUND is not set. + MH_ALLMODSBOUND = 1 << 12, + // indicates that this binary binds to all two-level namespace + // modules of its dependent libraries. Only used when + // MH_PREBINDABLE and MH_TWOLEVEL are both set. + MH_SUBSECTIONS_VIA_SYMBOLS = 1 << 13, + // safe to divide up the sections into sub-sections via symbols + // for dead code stripping. + MH_CANONICAL = 1 << 14, + // the binary has been canonicalized via the unprebind operation + MH_WEAK_DEFINES = 1 << 15, + // the final linked image contains external weak symbols + MH_BINDS_TO_WEAK = 1 << 16, + // the final linked image uses weak symbols + MH_ALLOW_STACK_EXECUTION = 1 << 17 + // When this bit is set, all stacks in the task will be given + // stack execution privilege. Only used in MH_EXECUTE filetype + }; + + MachOHeader() : magic(0), filetype(0), ncmds(0), sizeofcmds(0), flags(0), + reserved(0) { } + + /// cmdSize - This routine returns the size of the MachOSection as written + /// to disk, depending on whether the destination is a 64 bit Mach-O file. + unsigned cmdSize(bool is64Bit) const { + if (is64Bit) + return 8 * sizeof(uint32_t); + else + return 7 * sizeof(uint32_t); + } + + /// setMagic - This routine sets the appropriate value for the 'magic' + /// field based on pointer size and endianness. + void setMagic(bool isLittleEndian, bool is64Bit) { + if (isLittleEndian) + if (is64Bit) magic = 0xcffaedfe; + else magic = 0xcefaedfe; + else + if (is64Bit) magic = 0xfeedfacf; + else magic = 0xfeedface; + } + }; + + /// Header - An instance of MachOHeader that we will update while we build + /// the file, and then emit during finalization. + MachOHeader Header; + + /// MachOSegment - This struct contains the necessary information to + /// emit the load commands for each section in the file. + struct MachOSegment { + uint32_t cmd; // LC_SEGMENT or LC_SEGMENT_64 + uint32_t cmdsize; // Total size of this struct and section commands + std::string segname; // segment name + uint64_t vmaddr; // address of this segment + uint64_t vmsize; // size of this segment, may be larger than filesize + uint64_t fileoff; // offset in file + uint64_t filesize; // amount to read from file + uint32_t maxprot; // maximum VM protection + uint32_t initprot; // initial VM protection + uint32_t nsects; // number of sections in this segment + uint32_t flags; // flags + + // The following constants are getting pulled in by one of the + // system headers, which creates a neat clash with the enum. + #if !defined(VM_PROT_NONE) + #define VM_PROT_NONE 0x00 + #endif + #if !defined(VM_PROT_READ) + #define VM_PROT_READ 0x01 + #endif + #if !defined(VM_PROT_WRITE) + #define VM_PROT_WRITE 0x02 + #endif + #if !defined(VM_PROT_EXECUTE) + #define VM_PROT_EXECUTE 0x04 + #endif + #if !defined(VM_PROT_ALL) + #define VM_PROT_ALL 0x07 + #endif + + // Constants for the vm protection fields + // see + enum { SEG_VM_PROT_NONE = VM_PROT_NONE, + SEG_VM_PROT_READ = VM_PROT_READ, // read permission + SEG_VM_PROT_WRITE = VM_PROT_WRITE, // write permission + SEG_VM_PROT_EXECUTE = VM_PROT_EXECUTE, + SEG_VM_PROT_ALL = VM_PROT_ALL + }; + + // Constants for the cmd field + // see + enum { LC_SEGMENT = 0x01, // segment of this file to be mapped + LC_SEGMENT_64 = 0x19 // 64-bit segment of this file to be mapped + }; + + /// cmdSize - This routine returns the size of the MachOSection as written + /// to disk, depending on whether the destination is a 64 bit Mach-O file. + unsigned cmdSize(bool is64Bit) const { + if (is64Bit) + return 6 * sizeof(uint32_t) + 4 * sizeof(uint64_t) + 16; + else + return 10 * sizeof(uint32_t) + 16; // addresses only 32 bits + } + + MachOSegment(const std::string &seg, bool is64Bit) + : cmd(is64Bit ? LC_SEGMENT_64 : LC_SEGMENT), cmdsize(0), segname(seg), + vmaddr(0), vmsize(0), fileoff(0), filesize(0), maxprot(VM_PROT_ALL), + initprot(VM_PROT_ALL), nsects(0), flags(0) { } + }; + + /// MachOSection - This struct contains information about each section in a + /// particular segment that is emitted to the file. This is eventually + /// turned into the SectionCommand in the load command for a particlar + /// segment. + struct MachOSection { + std::string sectname; // name of this section, + std::string segname; // segment this section goes in + uint64_t addr; // memory address of this section + uint64_t size; // size in bytes of this section + uint32_t offset; // file offset of this section + uint32_t align; // section alignment (power of 2) + uint32_t reloff; // file offset of relocation entries + uint32_t nreloc; // number of relocation entries + uint32_t flags; // flags (section type and attributes) + uint32_t reserved1; // reserved (for offset or index) + uint32_t reserved2; // reserved (for count or sizeof) + uint32_t reserved3; // reserved (64 bit only) + + /// A unique number for this section, which will be used to match symbols + /// to the correct section. + uint32_t Index; + + /// SectionData - The actual data for this section which we are building + /// up for emission to the file. + DataBuffer SectionData; + + /// RelocBuffer - A buffer to hold the mach-o relocations before we write + /// them out at the appropriate location in the file. + DataBuffer RelocBuffer; + + /// Relocations - The relocations that we have encountered so far in this + /// section that we will need to convert to MachORelocation entries when + /// the file is written. + std::vector Relocations; + + // Constants for the section types (low 8 bits of flags field) + // see + enum { S_REGULAR = 0, + // regular section + S_ZEROFILL = 1, + // zero fill on demand section + S_CSTRING_LITERALS = 2, + // section with only literal C strings + S_4BYTE_LITERALS = 3, + // section with only 4 byte literals + S_8BYTE_LITERALS = 4, + // section with only 8 byte literals + S_LITERAL_POINTERS = 5, + // section with only pointers to literals + S_NON_LAZY_SYMBOL_POINTERS = 6, + // section with only non-lazy symbol pointers + S_LAZY_SYMBOL_POINTERS = 7, + // section with only lazy symbol pointers + S_SYMBOL_STUBS = 8, + // section with only symbol stubs + // byte size of stub in the reserved2 field + S_MOD_INIT_FUNC_POINTERS = 9, + // section with only function pointers for initialization + S_MOD_TERM_FUNC_POINTERS = 10, + // section with only function pointers for termination + S_COALESCED = 11, + // section contains symbols that are coalesced + S_GB_ZEROFILL = 12, + // zero fill on demand section (that can be larger than 4GB) + S_INTERPOSING = 13, + // section with only pairs of function pointers for interposing + S_16BYTE_LITERALS = 14 + // section with only 16 byte literals + }; + + // Constants for the section flags (high 24 bits of flags field) + // see + enum { S_ATTR_PURE_INSTRUCTIONS = 1 << 31, + // section contains only true machine instructions + S_ATTR_NO_TOC = 1 << 30, + // section contains coalesced symbols that are not to be in a + // ranlib table of contents + S_ATTR_STRIP_STATIC_SYMS = 1 << 29, + // ok to strip static symbols in this section in files with the + // MY_DYLDLINK flag + S_ATTR_NO_DEAD_STRIP = 1 << 28, + // no dead stripping + S_ATTR_LIVE_SUPPORT = 1 << 27, + // blocks are live if they reference live blocks + S_ATTR_SELF_MODIFYING_CODE = 1 << 26, + // used with i386 code stubs written on by dyld + S_ATTR_DEBUG = 1 << 25, + // a debug section + S_ATTR_SOME_INSTRUCTIONS = 1 << 10, + // section contains some machine instructions + S_ATTR_EXT_RELOC = 1 << 9, + // section has external relocation entries + S_ATTR_LOC_RELOC = 1 << 8 + // section has local relocation entries + }; + + /// cmdSize - This routine returns the size of the MachOSection as written + /// to disk, depending on whether the destination is a 64 bit Mach-O file. + unsigned cmdSize(bool is64Bit) const { + if (is64Bit) + return 7 * sizeof(uint32_t) + 2 * sizeof(uint64_t) + 32; + else + return 9 * sizeof(uint32_t) + 32; // addresses only 32 bits + } + + MachOSection(const std::string &seg, const std::string §) + : sectname(sect), segname(seg), addr(0), size(0), offset(0), align(2), + reloff(0), nreloc(0), flags(0), reserved1(0), reserved2(0), + reserved3(0) { } + }; + + private: + + /// SectionList - This is the list of sections that we have emitted to the + /// file. Once the file has been completely built, the segment load command + /// SectionCommands are constructed from this info. + std::vector SectionList; + + /// SectionLookup - This is a mapping from section name to SectionList entry + std::map SectionLookup; + + /// GVSection - This is a mapping from a GlobalValue to a MachOSection, + /// to aid in emitting relocations. + std::map GVSection; + + /// GVOffset - This is a mapping from a GlobalValue to an offset from the + /// start of the section in which the GV resides, to aid in emitting + /// relocations. + std::map GVOffset; + + /// getSection - Return the section with the specified name, creating a new + /// section if one does not already exist. + MachOSection *getSection(const std::string &seg, const std::string §, + unsigned Flags = 0) { + MachOSection *MOS = SectionLookup[seg+sect]; + if (MOS) return MOS; + + MOS = new MachOSection(seg, sect); + SectionList.push_back(MOS); + MOS->Index = SectionList.size(); + MOS->flags = MachOSection::S_REGULAR | Flags; + SectionLookup[seg+sect] = MOS; + return MOS; + } + MachOSection *getTextSection(bool isCode = true) { + if (isCode) + return getSection("__TEXT", "__text", + MachOSection::S_ATTR_PURE_INSTRUCTIONS | + MachOSection::S_ATTR_SOME_INSTRUCTIONS); + else + return getSection("__TEXT", "__text"); + } + MachOSection *getBSSSection() { + return getSection("__DATA", "__bss", MachOSection::S_ZEROFILL); + } + MachOSection *getDataSection() { + return getSection("__DATA", "__data"); + } + MachOSection *getConstSection(Constant *C) { + const ConstantArray *CVA = dyn_cast(C); + if (CVA && CVA->isCString()) + return getSection("__TEXT", "__cstring", + MachOSection::S_CSTRING_LITERALS); + + const Type *Ty = C->getType(); + if (Ty->isPrimitiveType() || Ty->isInteger()) { + unsigned Size = TM.getTargetData()->getTypeSize(Ty); + switch(Size) { + default: break; // Fall through to __TEXT,__const + case 4: + return getSection("__TEXT", "__literal4", + MachOSection::S_4BYTE_LITERALS); + case 8: + return getSection("__TEXT", "__literal8", + MachOSection::S_8BYTE_LITERALS); + case 16: + return getSection("__TEXT", "__literal16", + MachOSection::S_16BYTE_LITERALS); + } + } + return getSection("__TEXT", "__const"); + } + MachOSection *getJumpTableSection() { + if (TM.getRelocationModel() == Reloc::PIC_) + return getTextSection(false); + else + return getSection("__TEXT", "__const"); + } + + /// MachOSymTab - This struct contains information about the offsets and + /// size of symbol table information. + /// segment. + struct MachOSymTab { + uint32_t cmd; // LC_SYMTAB + uint32_t cmdsize; // sizeof( MachOSymTab ) + uint32_t symoff; // symbol table offset + uint32_t nsyms; // number of symbol table entries + uint32_t stroff; // string table offset + uint32_t strsize; // string table size in bytes + + // Constants for the cmd field + // see + enum { LC_SYMTAB = 0x02 // link-edit stab symbol table info + }; + + MachOSymTab() : cmd(LC_SYMTAB), cmdsize(6 * sizeof(uint32_t)), symoff(0), + nsyms(0), stroff(0), strsize(0) { } + }; + + /// MachOSymTab - This struct contains information about the offsets and + /// size of symbol table information. + /// segment. + struct MachODySymTab { + uint32_t cmd; // LC_DYSYMTAB + uint32_t cmdsize; // sizeof( MachODySymTab ) + uint32_t ilocalsym; // index to local symbols + uint32_t nlocalsym; // number of local symbols + uint32_t iextdefsym; // index to externally defined symbols + uint32_t nextdefsym; // number of externally defined symbols + uint32_t iundefsym; // index to undefined symbols + uint32_t nundefsym; // number of undefined symbols + uint32_t tocoff; // file offset to table of contents + uint32_t ntoc; // number of entries in table of contents + uint32_t modtaboff; // file offset to module table + uint32_t nmodtab; // number of module table entries + uint32_t extrefsymoff; // offset to referenced symbol table + uint32_t nextrefsyms; // number of referenced symbol table entries + uint32_t indirectsymoff; // file offset to the indirect symbol table + uint32_t nindirectsyms; // number of indirect symbol table entries + uint32_t extreloff; // offset to external relocation entries + uint32_t nextrel; // number of external relocation entries + uint32_t locreloff; // offset to local relocation entries + uint32_t nlocrel; // number of local relocation entries + + // Constants for the cmd field + // see + enum { LC_DYSYMTAB = 0x0B // dynamic link-edit symbol table info + }; + + MachODySymTab() : cmd(LC_DYSYMTAB), cmdsize(20 * sizeof(uint32_t)), + ilocalsym(0), nlocalsym(0), iextdefsym(0), nextdefsym(0), + iundefsym(0), nundefsym(0), tocoff(0), ntoc(0), modtaboff(0), + nmodtab(0), extrefsymoff(0), nextrefsyms(0), indirectsymoff(0), + nindirectsyms(0), extreloff(0), nextrel(0), locreloff(0), nlocrel(0) { } + }; + + /// SymTab - The "stab" style symbol table information + MachOSymTab SymTab; + /// DySymTab - symbol table info for the dynamic link editor + MachODySymTab DySymTab; + + struct MachOSymCmp { + // FIXME: this does not appear to be sorting 'f' after 'F' + bool operator()(const MachOSym &LHS, const MachOSym &RHS) { + return LHS.GVName < RHS.GVName; + } + }; + + /// PartitionByLocal - Simple boolean predicate that returns true if Sym is + /// a local symbol rather than an external symbol. + static bool PartitionByLocal(const MachOSym &Sym); + + /// PartitionByDefined - Simple boolean predicate that returns true if Sym + /// is defined in this module. + static bool PartitionByDefined(const MachOSym &Sym); + + protected: + + /// SymbolTable - This is the list of symbols we have emitted to the file. + /// This actually gets rearranged before emission to the file (to put the + /// local symbols first in the list). + std::vector SymbolTable; + + /// SymT - A buffer to hold the symbol table before we write it out at the + /// appropriate location in the file. + DataBuffer SymT; + + /// StrT - A buffer to hold the string table before we write it out at the + /// appropriate location in the file. + DataBuffer StrT; + + /// PendingSyms - This is a list of externally defined symbols that we have + /// been asked to emit, but have not seen a reference to. When a reference + /// is seen, the symbol will move from this list to the SymbolTable. + std::vector PendingSyms; + + /// DynamicSymbolTable - This is just a vector of indices into + /// SymbolTable to aid in emitting the DYSYMTAB load command. + std::vector DynamicSymbolTable; + + static void InitMem(const Constant *C, void *Addr, intptr_t Offset, + const TargetData *TD, + std::vector &MRs); + + private: + void AddSymbolToSection(MachOSection *MOS, GlobalVariable *GV); + void EmitGlobal(GlobalVariable *GV); + void EmitHeaderAndLoadCommands(); + void EmitSections(); + void BufferSymbolAndStringTable(); + void CalculateRelocations(MachOSection &MOS); + + MachineRelocation GetJTRelocation(unsigned Offset, + MachineBasicBlock *MBB) const { + return TM.getMachOWriterInfo()->GetJTRelocation(Offset, MBB); + } + + /// GetTargetRelocation - Returns the number of relocations. + unsigned GetTargetRelocation(MachineRelocation &MR, + unsigned FromIdx, + unsigned ToAddr, + unsigned ToIndex, + OutputBuffer &RelocOut, + OutputBuffer &SecOut, + bool Scattered) { + return TM.getMachOWriterInfo()->GetTargetRelocation(MR, FromIdx, ToAddr, + ToIndex, RelocOut, + SecOut, Scattered); + } + }; + } + + #endif From llvm at cs.uiuc.edu Wed Feb 7 19:31:14 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Wed, 7 Feb 2007 19:31:14 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/ELFWriter.h MachOWriter.h Message-ID: <200702080131.l181VEjg019662@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: ELFWriter.h (r1.15) removed MachOWriter.h (r1.19) removed --- Log message: Moved from include/llvm/CodeGen to lib/CodeGen. --- Diffs of the changes: (+0 -0) 0 files changed From isanbard at gmail.com Wed Feb 7 19:31:54 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:31:54 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/FileWriters.h Message-ID: <200702080131.l181VsPp019684@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: FileWriters.h added (r1.1) --- Log message: Declarations for functions that create different file writers. --- Diffs of the changes: (+32 -0) FileWriters.h | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+) Index: llvm/include/llvm/CodeGen/FileWriters.h diff -c /dev/null llvm/include/llvm/CodeGen/FileWriters.h:1.1 *** /dev/null Wed Feb 7 19:31:48 2007 --- llvm/include/llvm/CodeGen/FileWriters.h Wed Feb 7 19:31:38 2007 *************** *** 0 **** --- 1,32 ---- + //===-- FileWriters.cpp - File Writers Creation Functions -------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Bill Wendling and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // Functions to add the various file writer passes. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_CODEGEN_FILEWRITERS_H + #define LLVM_CODEGEN_FILEWRITERS_H + + #include + + namespace llvm { + + class FunctionPassManager; + class MachineCodeEmitter; + class TargetMachine; + + MachineCodeEmitter *AddELFWriter(FunctionPassManager &FPM, std::ostream &O, + TargetMachine &TM); + MachineCodeEmitter *AddMachOWriter(FunctionPassManager &FPM, std::ostream &O, + TargetMachine &TM); + + } // end llvm namespace + + #endif // LLVM_CODEGEN_FILEWRITERS_H From llvm at cs.uiuc.edu Wed Feb 7 19:33:08 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Wed, 7 Feb 2007 19:33:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCMachOWriter.cpp Message-ID: <200702080133.l181X8r3019717@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCMachOWriter.cpp (r1.16) removed --- Log message: Dead files. Functionality has been taken over by the Add*Writer functions. --- Diffs of the changes: (+0 -0) 0 files changed From llvm at cs.uiuc.edu Wed Feb 7 19:33:09 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Wed, 7 Feb 2007 19:33:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ELFWriter.cpp Message-ID: <200702080133.l181X9Sj019722@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ELFWriter.cpp (r1.7) removed --- Log message: Dead files. Functionality has been taken over by the Add*Writer functions. --- Diffs of the changes: (+0 -0) 0 files changed From isanbard at gmail.com Wed Feb 7 19:35:01 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:35:01 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetMachine.h Message-ID: <200702080135.l181Z1Ot019765@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetMachine.h updated: 1.75 -> 1.76 --- Log message: Added new method to finish up the addition of passes to emit files. This allows us to split that method into two so that we can optionally call a concrete function to add a writer. Removed moribund addObjectWriter() method. --- Diffs of the changes: (+53 -24) TargetMachine.h | 77 ++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 53 insertions(+), 24 deletions(-) Index: llvm/include/llvm/Target/TargetMachine.h diff -u llvm/include/llvm/Target/TargetMachine.h:1.75 llvm/include/llvm/Target/TargetMachine.h:1.76 --- llvm/include/llvm/Target/TargetMachine.h:1.75 Fri Jan 26 20:55:04 2007 +++ llvm/include/llvm/Target/TargetMachine.h Wed Feb 7 19:34:45 2007 @@ -58,6 +58,16 @@ }; } +namespace FileModel { + enum Model { + Error, + None, + AsmFile, + MachOFile, + ElfFile + }; +} + //===----------------------------------------------------------------------===// /// /// TargetMachine - Primary interface to the complete machine description for @@ -175,14 +185,25 @@ AssemblyFile, ObjectFile, DynamicLibrary }; - /// addPassesToEmitFile - Add passes to the specified pass manager to get - /// the specified file emitted. Typically this will involve several steps of - /// code generation. If Fast is set to true, the code generator should emit - /// code as fast as possible, without regard for compile time. This method - /// should return true if emission of this file type is not supported. + /// addPassesToEmitFile - Add passes to the specified pass manager to get the + /// specified file emitted. Typically this will involve several steps of code + /// generation. If Fast is set to true, the code generator should emit code + /// as fast as possible, without regard for compile time. This method should + /// return FileModel::Error if emission of this file type is not supported. + /// + virtual FileModel::Model addPassesToEmitFile(FunctionPassManager &PM, + std::ostream &Out, + CodeGenFileType FileType, + bool Fast) { + return FileModel::None; + } + + /// addPassesToEmitFileFinish - If the passes to emit the specified file had + /// to be split up (e.g., to add an object writer pass), this method can be + /// used to finish up adding passes to emit the file, if necessary. /// - virtual bool addPassesToEmitFile(FunctionPassManager &PM, std::ostream &Out, - CodeGenFileType FileType, bool Fast) { + virtual bool addPassesToEmitFileFinish(FunctionPassManager &PM, + MachineCodeEmitter *MCE, bool Fast) { return true; } @@ -196,7 +217,6 @@ MachineCodeEmitter &MCE, bool Fast) { return true; } - /// addPassesToEmitWholeFile - This method can be implemented by targets that /// require having the entire module at once. This is not recommended, do not @@ -216,19 +236,28 @@ LLVMTargetMachine() { } public: - /// addPassesToEmitFile - Add passes to the specified pass manager to get - /// the specified file emitted. Typically this will involve several steps of - /// code generation. If Fast is set to true, the code generator should emit - /// code as fast as possible, without regard for compile time. This method - /// should return true if emission of this file type is not supported. + /// addPassesToEmitFile - Add passes to the specified pass manager to get the + /// specified file emitted. Typically this will involve several steps of code + /// generation. If Fast is set to true, the code generator should emit code + /// as fast as possible, without regard for compile time. This method should + /// return FileModel::Error if emission of this file type is not supported. /// /// The default implementation of this method adds components from the /// LLVM retargetable code generator, invoking the methods below to get /// target-specific passes in standard locations. /// - virtual bool addPassesToEmitFile(FunctionPassManager &PM, std::ostream &Out, - CodeGenFileType FileType, bool Fast); - + virtual FileModel::Model addPassesToEmitFile(FunctionPassManager &PM, + std::ostream &Out, + CodeGenFileType FileType, + bool Fast); + + /// addPassesToEmitFileFinish - If the passes to emit the specified file had + /// to be split up (e.g., to add an object writer pass), this method can be + /// used to finish up adding passes to emit the file, if necessary. + /// + virtual bool addPassesToEmitFileFinish(FunctionPassManager &PM, + MachineCodeEmitter *MCE, bool Fast); + /// addPassesToEmitMachineCode - Add passes to the specified pass manager to /// get machine code emitted. This uses a MachineCodeEmitter object to handle /// actually outputting the machine code and resolving things like the address @@ -271,14 +300,6 @@ return true; } - /// addObjectWriter - This pass should be overridden by the target to add - /// the object-file writer, if supported. If this is not supported, - /// 'true' should be returned. - virtual bool addObjectWriter(FunctionPassManager &PM, bool Fast, - std::ostream &Out) { - return true; - } - /// addCodeEmitter - This pass should be overridden by the target to add a /// code emitter, if supported. If this is not supported, 'true' should be /// returned. @@ -286,6 +307,14 @@ MachineCodeEmitter &MCE) { return true; } + + /// addSimpleCodeEmitter - This pass should be overridden by the target to add + /// a code emitter (without setting flags), if supported. If this is not + /// supported, 'true' should be returned. + virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE) { + return true; + } }; } // End llvm namespace From isanbard at gmail.com Wed Feb 7 19:35:42 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:35:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/ELFWriter.cpp MachOWriter.cpp Message-ID: <200702080135.l181Zg3P019793@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: ELFWriter.cpp updated: 1.36 -> 1.37 MachOWriter.cpp updated: 1.23 -> 1.24 --- Log message: Add function to create a file writer. --- Diffs of the changes: (+28 -3) ELFWriter.cpp | 16 +++++++++++++++- MachOWriter.cpp | 15 +++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/ELFWriter.cpp diff -u llvm/lib/CodeGen/ELFWriter.cpp:1.36 llvm/lib/CodeGen/ELFWriter.cpp:1.37 --- llvm/lib/CodeGen/ELFWriter.cpp:1.36 Fri Jan 26 20:55:44 2007 +++ llvm/lib/CodeGen/ELFWriter.cpp Wed Feb 7 19:35:27 2007 @@ -31,18 +31,32 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/ELFWriter.h" +#include "ELFWriter.h" #include "llvm/Module.h" +#include "llvm/PassManager.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetELFWriterInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/Mangler.h" #include "llvm/Support/OutputBuffer.h" #include "llvm/Support/Streams.h" +#include using namespace llvm; +/// AddELFWriter - Concrete function to add the ELF writer to the function pass +/// manager. +MachineCodeEmitter *llvm::AddELFWriter(FunctionPassManager &FPM, + std::ostream &O, + TargetMachine &TM) { + ELFWriter *EW = new ELFWriter(O, TM); + FPM.add(EW); + return &EW->getMachineCodeEmitter(); +} + //===----------------------------------------------------------------------===// // ELFCodeEmitter Implementation //===----------------------------------------------------------------------===// Index: llvm/lib/CodeGen/MachOWriter.cpp diff -u llvm/lib/CodeGen/MachOWriter.cpp:1.23 llvm/lib/CodeGen/MachOWriter.cpp:1.24 --- llvm/lib/CodeGen/MachOWriter.cpp:1.23 Tue Feb 6 23:47:16 2007 +++ llvm/lib/CodeGen/MachOWriter.cpp Wed Feb 7 19:35:27 2007 @@ -22,13 +22,15 @@ // //===----------------------------------------------------------------------===// +#include "MachOWriter.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Module.h" +#include "llvm/PassManager.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" -#include "llvm/CodeGen/MachOWriter.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetJITInfo.h" @@ -37,9 +39,18 @@ #include "llvm/Support/OutputBuffer.h" #include "llvm/Support/Streams.h" #include - using namespace llvm; +/// AddMachOWriter - Concrete function to add the Mach-O writer to the function +/// pass manager. +MachineCodeEmitter *llvm::AddMachOWriter(FunctionPassManager &FPM, + std::ostream &O, + TargetMachine &TM) { + MachOWriter *MOW = new MachOWriter(O, TM); + FPM.add(MOW); + return &MOW->getMachineCodeEmitter(); +} + //===----------------------------------------------------------------------===// // MachOCodeEmitter Implementation //===----------------------------------------------------------------------===// From isanbard at gmail.com Wed Feb 7 19:37:09 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:37:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/LLVMTargetMachine.cpp Message-ID: <200702080137.l181b9iO019829@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: LLVMTargetMachine.cpp updated: 1.7 -> 1.8 --- Log message: Split the addPassesToEmitFile method up into two. This is so that we can do some common stuff, then on our own add an object file writer (by calling a concrete function), and then do some finishing stuff, if need be. --- Diffs of the changes: (+52 -48) LLVMTargetMachine.cpp | 100 ++++++++++++++++++++++++++------------------------ 1 files changed, 52 insertions(+), 48 deletions(-) Index: llvm/lib/CodeGen/LLVMTargetMachine.cpp diff -u llvm/lib/CodeGen/LLVMTargetMachine.cpp:1.7 llvm/lib/CodeGen/LLVMTargetMachine.cpp:1.8 --- llvm/lib/CodeGen/LLVMTargetMachine.cpp:1.7 Thu Dec 7 14:28:15 2006 +++ llvm/lib/CodeGen/LLVMTargetMachine.cpp Wed Feb 7 19:36:53 2007 @@ -19,10 +19,11 @@ #include "llvm/Transforms/Scalar.h" using namespace llvm; -bool LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM, - std::ostream &Out, - CodeGenFileType FileType, - bool Fast) { +FileModel::Model +LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM, + std::ostream &Out, + CodeGenFileType FileType, + bool Fast) { // Standard LLVM-Level Passes. // Run loop strength reduction before anything else. @@ -36,29 +37,25 @@ // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); - - + // Ask the target for an isel. if (addInstSelector(PM, Fast)) - return true; - - + return FileModel::Error; + // Print the instruction selected machine code... if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); + PM.add(createMachineFunctionPrinterPass(cerr)); // Perform register allocation to convert to a concrete x86 representation PM.add(createRegisterAllocator()); if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + // Run post-ra passes. if (addPostRegAlloc(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + // Insert prolog/epilog code. Eliminate abstract frame index references... PM.add(createPrologEpilogCodeInserter()); @@ -70,28 +67,40 @@ PM.add(createDebugLabelFoldingPass()); if (PrintMachineCode) // Print the register-allocated code - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + if (addPreEmitPass(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + switch (FileType) { - default: return true; - case TargetMachine::AssemblyFile: - if (addAssemblyEmitter(PM, Fast, Out)) - return true; - break; - case TargetMachine::ObjectFile: - if (addObjectWriter(PM, Fast, Out)) - return true; - break; + default: + break; + case TargetMachine::AssemblyFile: + if (addAssemblyEmitter(PM, Fast, Out)) + return FileModel::Error; + return FileModel::AsmFile; + case TargetMachine::ObjectFile: + if (getMachOWriterInfo()) + return FileModel::MachOFile; + else if (getELFWriterInfo()) + return FileModel::ElfFile; } - + + return FileModel::Error; +} + +/// addPassesToEmitFileFinish - If the passes to emit the specified file had to +/// be split up (e.g., to add an object writer pass), this method can be used to +/// finish up adding passes to emit the file, if necessary. +bool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM, + MachineCodeEmitter *MCE, + bool Fast) { + if (MCE) + addSimpleCodeEmitter(PM, Fast, *MCE); + // Delete machine code for this function PM.add(createMachineCodeDeleter()); - + return false; // success! } @@ -117,43 +126,38 @@ // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); - - + // Ask the target for an isel. if (addInstSelector(PM, Fast)) return true; - - + // Print the instruction selected machine code... if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); + PM.add(createMachineFunctionPrinterPass(cerr)); // Perform register allocation to convert to a concrete x86 representation PM.add(createRegisterAllocator()); if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + // Run post-ra passes. if (addPostRegAlloc(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + // Insert prolog/epilog code. Eliminate abstract frame index references... PM.add(createPrologEpilogCodeInserter()); if (PrintMachineCode) // Print the register-allocated code - PM.add(createMachineFunctionPrinterPass(cerr.stream())); + PM.add(createMachineFunctionPrinterPass(cerr)); // Branch folding must be run after regalloc and prolog/epilog insertion. if (!Fast) PM.add(createBranchFoldingPass()); if (addPreEmitPass(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr.stream())); - - + PM.add(createMachineFunctionPrinterPass(cerr)); + addCodeEmitter(PM, Fast, MCE); // Delete machine code for this function From isanbard at gmail.com Wed Feb 7 19:38:49 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:38:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp AlphaTargetMachine.h Message-ID: <200702080138.l181cnch019876@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaTargetMachine.cpp updated: 1.35 -> 1.36 AlphaTargetMachine.h updated: 1.18 -> 1.19 --- Log message: Added new method to add a "simple" code emitter. That is, to only add the code emitter and not set variables. --- Diffs of the changes: (+7 -0) AlphaTargetMachine.cpp | 5 +++++ AlphaTargetMachine.h | 2 ++ 2 files changed, 7 insertions(+) Index: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.35 llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.36 --- llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.35 Tue Oct 31 10:49:55 2006 +++ llvm/lib/Target/Alpha/AlphaTargetMachine.cpp Wed Feb 7 19:38:33 2007 @@ -88,3 +88,8 @@ PM.add(createAlphaCodeEmitterPass(*this, MCE)); return false; } +bool AlphaTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, + bool Fast, + MachineCodeEmitter &MCE) { + return addCodeEmitter(PM, Fast, MCE); +} Index: llvm/lib/Target/Alpha/AlphaTargetMachine.h diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.18 llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.19 --- llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.18 Tue Oct 10 23:29:42 2006 +++ llvm/lib/Target/Alpha/AlphaTargetMachine.h Wed Feb 7 19:38:33 2007 @@ -64,6 +64,8 @@ std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, MachineCodeEmitter &MCE); + virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE); }; } // end namespace llvm From isanbard at gmail.com Wed Feb 7 19:40:04 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:40:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC.h PPCMachOWriterInfo.cpp PPCTargetMachine.cpp PPCTargetMachine.h Message-ID: <200702080140.l181e4d6019924@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC.h updated: 1.37 -> 1.38 PPCMachOWriterInfo.cpp updated: 1.2 -> 1.3 PPCTargetMachine.cpp updated: 1.115 -> 1.116 PPCTargetMachine.h updated: 1.28 -> 1.29 --- Log message: Moved the MachOWriter and ELFWriter out of the Target/* files. Placed the definition of it into the CodeGen library. This is so that a backend doesn't necessarily add in these writers if it doesn't use them (like in the lli program). --- Diffs of the changes: (+11 -17) PPC.h | 2 -- PPCMachOWriterInfo.cpp | 6 +++--- PPCTargetMachine.cpp | 16 ++++++---------- PPCTargetMachine.h | 4 ++-- 4 files changed, 11 insertions(+), 17 deletions(-) Index: llvm/lib/Target/PowerPC/PPC.h diff -u llvm/lib/Target/PowerPC/PPC.h:1.37 llvm/lib/Target/PowerPC/PPC.h:1.38 --- llvm/lib/Target/PowerPC/PPC.h:1.37 Fri Nov 17 16:10:59 2006 +++ llvm/lib/Target/PowerPC/PPC.h Wed Feb 7 19:39:44 2007 @@ -33,8 +33,6 @@ PPCTargetMachine &TM); FunctionPass *createPPCCodeEmitterPass(PPCTargetMachine &TM, MachineCodeEmitter &MCE); -void addPPCMachOObjectWriterPass(FunctionPassManager &FPM, std::ostream &o, - PPCTargetMachine &tm); } // end namespace llvm; // Defines symbolic names for PowerPC registers. This defines a mapping from Index: llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.2 llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.3 --- llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.2 Fri Feb 2 20:41:58 2007 +++ llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp Wed Feb 7 19:39:44 2007 @@ -2,8 +2,9 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Bill Wendling and is distributed under the -// University of Illinois Open Source License. See LICENSE.TXT for details. +// This file was developed by Nate Begeman and Bill Wendling and is distributed +// under the University of Illinois Open Source License. See LICENSE.TXT for +// details. // //===----------------------------------------------------------------------===// // @@ -25,7 +26,6 @@ HDR_CPU_SUBTYPE_POWERPC_ALL) {} PPCMachOWriterInfo::~PPCMachOWriterInfo() {} - /// GetTargetRelocation - For the MachineRelocation MR, convert it to one or /// more PowerPC MachORelocation(s), add the new relocations to the /// MachOSection, and rewrite the instruction at the section offset if required Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.115 llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.116 --- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.115 Tue Jan 23 21:41:36 2007 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Wed Feb 7 19:39:44 2007 @@ -129,16 +129,6 @@ return false; } -bool PPCTargetMachine::addObjectWriter(FunctionPassManager &PM, bool Fast, - std::ostream &Out) { - // FIXME: until the macho writer is 100% functional, diable this by default. - return true; - - // FIXME: support PPC ELF files at some point - addPPCMachOObjectWriterPass(PM, Out, *this); - return false; -} - bool PPCTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, MachineCodeEmitter &MCE) { // The JIT should use the static relocation model in ppc32 mode, PIC in ppc64. @@ -161,3 +151,9 @@ return false; } +bool PPCTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE) { + // Machine code emitter pass for PowerPC. + PM.add(createPPCCodeEmitterPass(*this, MCE)); + return false; +} Index: llvm/lib/Target/PowerPC/PPCTargetMachine.h diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.28 llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.29 --- llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.28 Tue Jan 23 21:41:36 2007 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.h Wed Feb 7 19:39:44 2007 @@ -69,10 +69,10 @@ virtual bool addPreEmitPass(FunctionPassManager &PM, bool Fast); virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); - virtual bool addObjectWriter(FunctionPassManager &PM, bool Fast, - std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, MachineCodeEmitter &MCE); + virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE); }; /// PPC32TargetMachine - PowerPC 32-bit target machine. From isanbard at gmail.com Wed Feb 7 19:40:04 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:40:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86TargetMachine.cpp X86TargetMachine.h Message-ID: <200702080140.l181e4Iv019931@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86.h updated: 1.49 -> 1.50 X86TargetMachine.cpp updated: 1.140 -> 1.141 X86TargetMachine.h updated: 1.44 -> 1.45 --- Log message: Moved the MachOWriter and ELFWriter out of the Target/* files. Placed the definition of it into the CodeGen library. This is so that a backend doesn't necessarily add in these writers if it doesn't use them (like in the lli program). --- Diffs of the changes: (+9 -19) X86.h | 6 ------ X86TargetMachine.cpp | 15 ++++++--------- X86TargetMachine.h | 7 +++---- 3 files changed, 9 insertions(+), 19 deletions(-) Index: llvm/lib/Target/X86/X86.h diff -u llvm/lib/Target/X86/X86.h:1.49 llvm/lib/Target/X86/X86.h:1.50 --- llvm/lib/Target/X86/X86.h:1.49 Wed Nov 15 11:53:13 2006 +++ llvm/lib/Target/X86/X86.h Wed Feb 7 19:39:44 2007 @@ -46,12 +46,6 @@ FunctionPass *createX86CodeEmitterPass(X86TargetMachine &TM, MachineCodeEmitter &MCE); -/// addX86ELFObjectWriterPass - Add passes to the FPM that output the generated -/// code as an ELF object file. -/// -void addX86ELFObjectWriterPass(FunctionPassManager &FPM, - std::ostream &o, X86TargetMachine &tm); - /// createX86EmitCodeToMemory - Returns a pass that converts a register /// allocated function into raw machine code in a dynamically /// allocated chunk of memory. Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.140 llvm/lib/Target/X86/X86TargetMachine.cpp:1.141 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.140 Mon Jan 22 17:09:50 2007 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Wed Feb 7 19:39:44 2007 @@ -163,15 +163,6 @@ return false; } -bool X86TargetMachine::addObjectWriter(FunctionPassManager &PM, bool Fast, - std::ostream &Out) { - if (Subtarget.isTargetELF()) { - addX86ELFObjectWriterPass(PM, Out, *this); - return false; - } - return true; -} - bool X86TargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, MachineCodeEmitter &MCE) { // FIXME: Move this to TargetJITInfo! @@ -185,3 +176,9 @@ PM.add(createX86CodeEmitterPass(*this, MCE)); return false; } + +bool X86TargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE) { + PM.add(createX86CodeEmitterPass(*this, MCE)); + return false; +} Index: llvm/lib/Target/X86/X86TargetMachine.h diff -u llvm/lib/Target/X86/X86TargetMachine.h:1.44 llvm/lib/Target/X86/X86TargetMachine.h:1.45 --- llvm/lib/Target/X86/X86TargetMachine.h:1.44 Fri Jan 26 20:56:16 2007 +++ llvm/lib/Target/X86/X86TargetMachine.h Wed Feb 7 19:39:44 2007 @@ -53,22 +53,21 @@ } virtual const TargetData *getTargetData() const { return &DataLayout; } virtual const X86ELFWriterInfo *getELFWriterInfo() const { - return &ELFWriterInfo; + return Subtarget.isTargetELF() ? &ELFWriterInfo : 0; } static unsigned getModuleMatchQuality(const Module &M); static unsigned getJITMatchQuality(); - // Set up the pass pipeline. virtual bool addInstSelector(FunctionPassManager &PM, bool Fast); virtual bool addPostRegAlloc(FunctionPassManager &PM, bool Fast); virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); - virtual bool addObjectWriter(FunctionPassManager &PM, bool Fast, - std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, MachineCodeEmitter &MCE); + virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE); }; /// X86_32TargetMachine - X86 32-bit target machine. From isanbard at gmail.com Wed Feb 7 19:41:27 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:41:27 -0600 Subject: [llvm-commits] CVS: llvm/tools/llc/llc.cpp Message-ID: <200702080141.l181fRtE019971@zion.cs.uiuc.edu> Changes in directory llvm/tools/llc: llc.cpp updated: 1.143 -> 1.144 --- Log message: The new version of how to add passes to emit files. We explicitly call a function to add the file writers between calls to add the passes. --- Diffs of the changes: (+25 -1) llc.cpp | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletion(-) Index: llvm/tools/llc/llc.cpp diff -u llvm/tools/llc/llc.cpp:1.143 llvm/tools/llc/llc.cpp:1.144 --- llvm/tools/llc/llc.cpp:1.143 Wed Feb 7 15:41:02 2007 +++ llvm/tools/llc/llc.cpp Wed Feb 7 19:41:07 2007 @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Bytecode/Reader.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" @@ -248,7 +249,30 @@ #endif // Ask the target to add backend passes as necessary. - if (Target.addPassesToEmitFile(Passes, *Out, FileType, Fast)) { + MachineCodeEmitter *MCE = 0; + + switch (Target.addPassesToEmitFile(Passes, *Out, FileType, Fast)) { + default: + assert(0 && "Invalid file model!"); + return 1; + case FileModel::Error: + std::cerr << argv[0] << ": target does not support generation of this" + << " file type!\n"; + if (Out != &std::cout) delete Out; + // And the Out file is empty and useless, so remove it now. + sys::Path(OutputFilename).eraseFromDisk(); + return 1; + case FileModel::AsmFile: + break; + case FileModel::MachOFile: + MCE = AddMachOWriter(Passes, *Out, Target); + break; + case FileModel::ElfFile: + MCE = AddELFWriter(Passes, *Out, Target); + break; + } + + if (Target.addPassesToEmitFileFinish(Passes, MCE, Fast)) { std::cerr << argv[0] << ": target does not support generation of this" << " file type!\n"; if (Out != &std::cout) delete Out; From isanbard at gmail.com Wed Feb 7 19:41:27 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:41:27 -0600 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200702080141.l181fRHZ019974@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.34 -> 1.35 --- Log message: The new version of how to add passes to emit files. We explicitly call a function to add the file writers between calls to add the passes. --- Diffs of the changes: (+26 -2) lto.cpp | 28 ++++++++++++++++++++++++++-- 1 files changed, 26 insertions(+), 2 deletions(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.34 llvm/tools/lto/lto.cpp:1.35 --- llvm/tools/lto/lto.cpp:1.34 Mon Feb 5 14:47:21 2007 +++ llvm/tools/lto/lto.cpp Wed Feb 7 19:41:07 2007 @@ -27,6 +27,7 @@ #include "llvm/System/Signals.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/Verifier.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -308,8 +309,31 @@ new FunctionPassManager(new ExistingModuleProvider(M)); CodeGenPasses->add(new TargetData(*Target->getTargetData())); - Target->addPassesToEmitFile(*CodeGenPasses, Out, TargetMachine::AssemblyFile, - true); + + MachineCodeEmitter *MCE = 0; + + switch (Target->addPassesToEmitFile(*CodeGenPasses, Out, + TargetMachine::AssemblyFile, true)) { + default: + assert(0 && "Invalid file model!"); + return LTO_UNKNOWN; + case FileModel::Error: + // FIXME: Error... + return LTO_UNKNOWN; + case FileModel::AsmFile: + break; + case FileModel::MachOFile: + MCE = AddMachOWriter(*CodeGenPasses, Out, *Target); + break; + case FileModel::ElfFile: + MCE = AddELFWriter(*CodeGenPasses, Out, *Target); + break; + } + + if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) { + // FIXME: Error... + return LTO_UNKNOWN; + } // Run our queue of passes all at once now, efficiently. Passes.run(*M); From dpatel at apple.com Wed Feb 7 19:44:33 2007 From: dpatel at apple.com (Devang Patel) Date: Wed, 7 Feb 2007 17:44:33 -0800 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp In-Reply-To: <200702080141.l181fRHZ019974@zion.cs.uiuc.edu> References: <200702080141.l181fRHZ019974@zion.cs.uiuc.edu> Message-ID: <65F0BE11-A79D-4929-A8E2-1C3F5DE67C71@apple.com> On Feb 7, 2007, at 5:41 PM, Bill Wendling wrote: > CodeGenPasses->add(new TargetData(*Target->getTargetData())); > - Target->addPassesToEmitFile(*CodeGenPasses, Out, > TargetMachine::AssemblyFile, > - true); > + > + MachineCodeEmitter *MCE = 0; > + > + switch (Target->addPassesToEmitFile(*CodeGenPasses, Out, > + TargetMachine::AssemblyFile, > true)) { > + default: > + assert(0 && "Invalid file model!"); > + return LTO_UNKNOWN; > + case FileModel::Error: > + // FIXME: Error... > + return LTO_UNKNOWN; > + case FileModel::AsmFile: > + break; > + case FileModel::MachOFile: > + MCE = AddMachOWriter(*CodeGenPasses, Out, *Target); > + break; > + case FileModel::ElfFile: > + MCE = AddELFWriter(*CodeGenPasses, Out, *Target); > + break; > + } > + > + if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) { > + // FIXME: Error... > + return LTO_UNKNOWN; > + } Please avoid assert() in lto. Let linker handle all failures. Use LTO_WRITE_FAILURE instead of LTO_UNKNOWN. Thanks, - Devang -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070207/88d555f3/attachment.html From isanbard at gmail.com Wed Feb 7 19:48:44 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 19:48:44 -0600 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200702080148.l181miUX020095@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.35 -> 1.36 --- Log message: Avoid assert() in lto. Let linker handle all failures. Use LTO_WRITE_FAILURE instead of LTO_UNKNOWN. --- Diffs of the changes: (+4 -9) lto.cpp | 13 ++++--------- 1 files changed, 4 insertions(+), 9 deletions(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.35 llvm/tools/lto/lto.cpp:1.36 --- llvm/tools/lto/lto.cpp:1.35 Wed Feb 7 19:41:07 2007 +++ llvm/tools/lto/lto.cpp Wed Feb 7 19:48:28 2007 @@ -313,13 +313,10 @@ MachineCodeEmitter *MCE = 0; switch (Target->addPassesToEmitFile(*CodeGenPasses, Out, - TargetMachine::AssemblyFile, true)) { + TargetMachine::AssemblyFile, true)) { default: - assert(0 && "Invalid file model!"); - return LTO_UNKNOWN; case FileModel::Error: - // FIXME: Error... - return LTO_UNKNOWN; + return LTO_WRITE_FAILURE; case FileModel::AsmFile: break; case FileModel::MachOFile: @@ -330,10 +327,8 @@ break; } - if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) { - // FIXME: Error... - return LTO_UNKNOWN; - } + if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) + return LTO_WRITE_FAILURE; // Run our queue of passes all at once now, efficiently. Passes.run(*M); From isanbard at gmail.com Wed Feb 7 19:48:51 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 17:48:51 -0800 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp In-Reply-To: <65F0BE11-A79D-4929-A8E2-1C3F5DE67C71@apple.com> References: <200702080141.l181fRHZ019974@zion.cs.uiuc.edu> <65F0BE11-A79D-4929-A8E2-1C3F5DE67C71@apple.com> Message-ID: <16e5fdf90702071748g587e25c9o8d82acc27c464514@mail.gmail.com> Done. Thanks for catching that. :-) -bw On 2/7/07, Devang Patel wrote: > > > On Feb 7, 2007, at 5:41 PM, Bill Wendling wrote: > > > CodeGenPasses->add(new > TargetData(*Target->getTargetData())); > > - > Target->addPassesToEmitFile(*CodeGenPasses, Out, > TargetMachine::AssemblyFile, > > - true); > > + > > + MachineCodeEmitter *MCE = 0; > > + > > + switch > (Target->addPassesToEmitFile(*CodeGenPasses, > Out, > > + TargetMachine::AssemblyFile, true)) { > > + default: > > + assert(0 && "Invalid file model!"); > > + return LTO_UNKNOWN; > > + case FileModel::Error: > > + // FIXME: Error... > > + return LTO_UNKNOWN; > > + case FileModel::AsmFile: > > + break; > > + case FileModel::MachOFile: > > + MCE = AddMachOWriter(*CodeGenPasses, Out, *Target); > > + break; > > + case FileModel::ElfFile: > > + MCE = AddELFWriter(*CodeGenPasses, Out, *Target); > > + break; > > + } > > + > > + if > (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, > true)) { > > + // FIXME: Error... > > + return LTO_UNKNOWN; > > + } > Please avoid assert() in lto. Let linker handle all failures. > Use LTO_WRITE_FAILURE instead of LTO_UNKNOWN. > > Thanks, > - > Devang From jlaskey at apple.com Wed Feb 7 19:49:59 2007 From: jlaskey at apple.com (jlaskey at apple.com) Date: Wed, 7 Feb 2007 17:49:59 -0800 (PST) Subject: [llvm-commits] [123566] Use getDeclaration to simplify code. Message-ID: <20070208014959.529E832550B5@src> Revision: 123566 Author: jlaskey Date: 2007-02-07 17:49:59 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Use getDeclaration to simplify code. Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-debug.cpp Modified: apple-local/branches/llvm/gcc/llvm-debug.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-debug.cpp 2007-02-08 01:42:33 UTC (rev 123565) +++ apple-local/branches/llvm/gcc/llvm-debug.cpp 2007-02-08 01:49:59 UTC (rev 123566) @@ -31,6 +31,7 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" +#include "llvm/Intrinsics.h" #include "llvm/Module.h" #include "llvm/Support/Dwarf.h" #include "llvm/Target/TargetMachine.h" @@ -273,12 +274,8 @@ Subprogram->setIsDefinition(true); // Lazily construct llvm.dbg.func.start. - if (!FuncStartFn) { - FuncStartFn = - cast(M->getOrInsertFunction("llvm.dbg.func.start", - Type::VoidTy, - SR.getEmptyStructPtrType(), NULL)); - } + if (!FuncStartFn) + FuncStartFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_func_start); // Call llvm.dbg.func.start. new CallInst(FuncStartFn, getCastValueFor(Subprogram), "", CurBB); @@ -298,12 +295,8 @@ RegionStack.push_back(Block); // Lazily construct llvm.dbg.region.start function. - if (!RegionStartFn) { - const PointerType *EmpPtr = SR.getEmptyStructPtrType(); - RegionStartFn = - cast(M->getOrInsertFunction("llvm.dbg.region.start", - Type::VoidTy, EmpPtr, NULL)); - } + if (!RegionStartFn) + RegionStartFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_region_start); // Call llvm.dbg.func.start. new CallInst(RegionStartFn, getCastValueFor(Block), "", CurBB); @@ -313,12 +306,8 @@ /// region - "llvm.dbg.region.end." void DebugInfo::EmitRegionEnd(Function *Fn, BasicBlock *CurBB) { // Lazily construct llvm.dbg.region.end function. - if (!RegionEndFn) { - const PointerType *EmpPtr = SR.getEmptyStructPtrType(); - RegionEndFn = - cast(M->getOrInsertFunction("llvm.dbg.region.end", Type::VoidTy, - EmpPtr, NULL)); - } + if (!RegionEndFn) + RegionEndFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_region_end); // Provide an region stop point. EmitStopPoint(Fn, CurBB); @@ -334,11 +323,8 @@ tree type, Value *AI, BasicBlock *CurBB) { // Lazily construct llvm.dbg.declare function. const PointerType *EmpPtr = SR.getEmptyStructPtrType(); - if (!DeclareFn) { - DeclareFn = - cast(M->getOrInsertFunction("llvm.dbg.declare", - Type::VoidTy, EmpPtr, EmpPtr,NULL)); - } + if (!DeclareFn) + DeclareFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_declare); // Get type information. CompileUnitDesc *Unit = getOrCreateCompileUnit(CurFullPath); @@ -382,13 +368,8 @@ CompileUnitDesc *Unit = getOrCreateCompileUnit(CurFullPath); // Lazily construct llvm.dbg.stoppoint function. - if (!StopPointFn) { - StopPointFn = - cast(M->getOrInsertFunction("llvm.dbg.stoppoint", - Type::VoidTy, Type::Int32Ty, - Type::Int32Ty, - SR.getEmptyStructPtrType(), NULL)); - } + if (!StopPointFn) + StopPointFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_stoppoint); // Invoke llvm.dbg.stoppoint std::vector Args; From isanbard at gmail.com Wed Feb 7 19:51:57 2007 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 7 Feb 2007 17:51:57 -0800 Subject: [llvm-commits] [PATCH] gcc/llvm-backend.cpp Message-ID: <16e5fdf90702071751i75c8c4fsda700282e183d6c6@mail.gmail.com> Applied this patch. This goes along with the changes I checked in that removed the MachO and ELF writers from LLI. -bw Index: gcc/llvm-backend.cpp =================================================================== --- gcc/llvm-backend.cpp (revision 123562) +++ gcc/llvm-backend.cpp (revision 123565) @@ -338,10 +338,11 @@ } // Normal mode, emit a .s file by running the code generator. - if (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, + if (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, TargetMachine::AssemblyFile, - /*FAST*/optimize == 0)) { - cerr << "Error interfacing to target machine!"; + /*FAST*/optimize == 0) + == FileModel::Error) { + cerr << "Error interfacing to target machine!\n"; exit(1); } From bwendlin at apple.com Wed Feb 7 19:42:34 2007 From: bwendlin at apple.com (bwendlin at apple.com) Date: Wed, 7 Feb 2007 17:42:34 -0800 (PST) Subject: [llvm-commits] [123565] Need to check the correct return value for the call to addPassesToEmitFile . Message-ID: <20070208014234.2FADB325012A@src> Revision: 123565 Author: bwendlin Date: 2007-02-07 17:42:33 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Need to check the correct return value for the call to addPassesToEmitFile. Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-backend.cpp Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 00:47:00 UTC (rev 123564) +++ apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 01:42:33 UTC (rev 123565) @@ -338,10 +338,11 @@ } // Normal mode, emit a .s file by running the code generator. - if (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, + if (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, TargetMachine::AssemblyFile, - /*FAST*/optimize == 0)) { - cerr << "Error interfacing to target machine!"; + /*FAST*/optimize == 0) + == FileModel::Error) { + cerr << "Error interfacing to target machine!\n"; exit(1); } From bwendlin at apple.com Wed Feb 7 20:16:06 2007 From: bwendlin at apple.com (bwendlin at apple.com) Date: Wed, 7 Feb 2007 18:16:06 -0800 (PST) Subject: [llvm-commits] [123567] The "addPassesToEmitFile" method should have the "*Finish" method called afterwards. Message-ID: <20070208021606.983A3326D1C1@src> Revision: 123567 Author: bwendlin Date: 2007-02-07 18:16:06 -0800 (Wed, 07 Feb 2007) Log Message: ----------- The "addPassesToEmitFile" method should have the "*Finish" method called afterwards. Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-backend.cpp Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 01:49:59 UTC (rev 123566) +++ apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 02:16:06 UTC (rev 123567) @@ -338,14 +338,21 @@ } // Normal mode, emit a .s file by running the code generator. - if (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, - TargetMachine::AssemblyFile, - /*FAST*/optimize == 0) - == FileModel::Error) { + switch (TheTarget->addPassesToEmitFile(*PM, *AsmOutStream, + TargetMachine::AssemblyFile, + /*FAST*/optimize == 0)) { + default: + case FileModel::Error: cerr << "Error interfacing to target machine!\n"; exit(1); + case FileModel::AsmFile: + break; } - + + if (TheTarget->addPassesToEmitFileFinish(*PM, 0, /*Fast*/optimize == 0)) { + cerr << "Error interfacing to target machine!\n"; + exit(1); + } } if (HasPerFunctionPasses) { From sabre at nondot.org Wed Feb 7 22:31:31 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 22:31:31 -0600 Subject: [llvm-commits] CVS: llvm/test/CFrontend/2003-01-30-UnionInit.c 2003-08-30-AggregateInitializer.c 2004-01-01-UnknownInitSize.c 2005-10-18-VariableSizedElementCrash.c 2006-01-13-StackSave.c 2006-01-23-FileScopeAsm.c 2006-03-16-VectorCtor.c 2006-07-31-PR854.c 2006-09-28-SimpleAsm.c Message-ID: <200702080431.l184VVHe022766@zion.cs.uiuc.edu> Changes in directory llvm/test/CFrontend: 2003-01-30-UnionInit.c updated: 1.6 -> 1.7 2003-08-30-AggregateInitializer.c updated: 1.6 -> 1.7 2004-01-01-UnknownInitSize.c updated: 1.6 -> 1.7 2005-10-18-VariableSizedElementCrash.c updated: 1.2 -> 1.3 2006-01-13-StackSave.c updated: 1.2 -> 1.3 2006-01-23-FileScopeAsm.c updated: 1.2 -> 1.3 2006-03-16-VectorCtor.c updated: 1.2 -> 1.3 2006-07-31-PR854.c updated: 1.4 -> 1.5 2006-09-28-SimpleAsm.c updated: 1.2 -> 1.3 --- Log message: llvm-gcc3 is gone --- Diffs of the changes: (+0 -11) 2003-01-30-UnionInit.c | 1 - 2003-08-30-AggregateInitializer.c | 2 -- 2004-01-01-UnknownInitSize.c | 1 - 2005-10-18-VariableSizedElementCrash.c | 1 - 2006-01-13-StackSave.c | 1 - 2006-01-23-FileScopeAsm.c | 1 - 2006-03-16-VectorCtor.c | 2 -- 2006-07-31-PR854.c | 1 - 2006-09-28-SimpleAsm.c | 1 - 9 files changed, 11 deletions(-) Index: llvm/test/CFrontend/2003-01-30-UnionInit.c diff -u llvm/test/CFrontend/2003-01-30-UnionInit.c:1.6 llvm/test/CFrontend/2003-01-30-UnionInit.c:1.7 --- llvm/test/CFrontend/2003-01-30-UnionInit.c:1.6 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2003-01-30-UnionInit.c Wed Feb 7 22:31:15 2007 @@ -1,5 +1,4 @@ // RUN: %llvmgcc -S %s -o /dev/null -// XFAIL: llvmgcc3 union foo { struct { char A, B; } X; Index: llvm/test/CFrontend/2003-08-30-AggregateInitializer.c diff -u llvm/test/CFrontend/2003-08-30-AggregateInitializer.c:1.6 llvm/test/CFrontend/2003-08-30-AggregateInitializer.c:1.7 --- llvm/test/CFrontend/2003-08-30-AggregateInitializer.c:1.6 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2003-08-30-AggregateInitializer.c Wed Feb 7 22:31:15 2007 @@ -1,7 +1,5 @@ // RUN: %llvmgcc -S %s -o /dev/null -// XFAIL: llvmgcc3 - struct istruct { unsigned char C; }; Index: llvm/test/CFrontend/2004-01-01-UnknownInitSize.c diff -u llvm/test/CFrontend/2004-01-01-UnknownInitSize.c:1.6 llvm/test/CFrontend/2004-01-01-UnknownInitSize.c:1.7 --- llvm/test/CFrontend/2004-01-01-UnknownInitSize.c:1.6 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2004-01-01-UnknownInitSize.c Wed Feb 7 22:31:15 2007 @@ -1,5 +1,4 @@ // RUN: %llvmgcc -S %s -o /dev/null -// XFAIL: llvmgcc3 /* * This regression test ensures that the C front end can compile initializers Index: llvm/test/CFrontend/2005-10-18-VariableSizedElementCrash.c diff -u llvm/test/CFrontend/2005-10-18-VariableSizedElementCrash.c:1.2 llvm/test/CFrontend/2005-10-18-VariableSizedElementCrash.c:1.3 --- llvm/test/CFrontend/2005-10-18-VariableSizedElementCrash.c:1.2 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2005-10-18-VariableSizedElementCrash.c Wed Feb 7 22:31:15 2007 @@ -1,5 +1,4 @@ // RUN: %llvmgcc %s -S -o - -// XFAIL: llvmgcc3 int sub1(int i, char *pi) { typedef int foo[i]; Index: llvm/test/CFrontend/2006-01-13-StackSave.c diff -u llvm/test/CFrontend/2006-01-13-StackSave.c:1.2 llvm/test/CFrontend/2006-01-13-StackSave.c:1.3 --- llvm/test/CFrontend/2006-01-13-StackSave.c:1.2 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2006-01-13-StackSave.c Wed Feb 7 22:31:15 2007 @@ -1,5 +1,4 @@ // RUN: %llvmgcc %s -S -o - | gccas | llvm-dis | grep llvm.stacksave -// XFAIL: llvmgcc3 // PR691 Index: llvm/test/CFrontend/2006-01-23-FileScopeAsm.c diff -u llvm/test/CFrontend/2006-01-23-FileScopeAsm.c:1.2 llvm/test/CFrontend/2006-01-23-FileScopeAsm.c:1.3 --- llvm/test/CFrontend/2006-01-23-FileScopeAsm.c:1.2 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2006-01-23-FileScopeAsm.c Wed Feb 7 22:31:15 2007 @@ -1,5 +1,4 @@ // RUN: %llvmgcc %s -S -o - | gccas | llvm-dis | grep foo[12345] | wc -l | grep 5 -// XFAIL: llvmgcc3 __asm__ ("foo1"); __asm__ ("foo2"); Index: llvm/test/CFrontend/2006-03-16-VectorCtor.c diff -u llvm/test/CFrontend/2006-03-16-VectorCtor.c:1.2 llvm/test/CFrontend/2006-03-16-VectorCtor.c:1.3 --- llvm/test/CFrontend/2006-03-16-VectorCtor.c:1.2 Thu Apr 13 12:16:21 2006 +++ llvm/test/CFrontend/2006-03-16-VectorCtor.c Wed Feb 7 22:31:15 2007 @@ -1,7 +1,5 @@ // Test that basic generic vector support works - // RUN: %llvmgcc %s -S -o - -// XFAIL: llvmgcc3 typedef int v4si __attribute__ ((__vector_size__ (16))); void test(v4si *P, v4si *Q, float X) { Index: llvm/test/CFrontend/2006-07-31-PR854.c diff -u llvm/test/CFrontend/2006-07-31-PR854.c:1.4 llvm/test/CFrontend/2006-07-31-PR854.c:1.5 --- llvm/test/CFrontend/2006-07-31-PR854.c:1.4 Thu Nov 9 22:53:50 2006 +++ llvm/test/CFrontend/2006-07-31-PR854.c Wed Feb 7 22:31:15 2007 @@ -1,6 +1,5 @@ // RUN: %llvmgcc %s -S -o - // PR854 -// XFAIL: llvmgcc3 struct kernel_symbol { unsigned long value; }; Index: llvm/test/CFrontend/2006-09-28-SimpleAsm.c diff -u llvm/test/CFrontend/2006-09-28-SimpleAsm.c:1.2 llvm/test/CFrontend/2006-09-28-SimpleAsm.c:1.3 --- llvm/test/CFrontend/2006-09-28-SimpleAsm.c:1.2 Wed Nov 8 17:26:16 2006 +++ llvm/test/CFrontend/2006-09-28-SimpleAsm.c Wed Feb 7 22:31:15 2007 @@ -1,7 +1,6 @@ // RUN: %llvmgcc %s -S -o /dev/null && // RUN: %llvmgcc %s -S -o - | grep 'ext: xorl %eax, eax; movl' && // RUN: %llvmgcc %s -S -o - | grep 'nonext: xorl %eax, %eax; mov' -// XFAIL: llvmgcc3 // PR924 void bar() { From sabre at nondot.org Wed Feb 7 22:34:18 2007 From: sabre at nondot.org (Chris Lattner) Date: Wed, 7 Feb 2007 22:34:18 -0600 Subject: [llvm-commits] CVS: llvm/test/CFrontend/2007-02-07-AddrLabel.c Message-ID: <200702080434.l184YIL9022861@zion.cs.uiuc.edu> Changes in directory llvm/test/CFrontend: 2007-02-07-AddrLabel.c added (r1.1) --- Log message: New testcase for PR947: http://llvm.org/PR947 --- Diffs of the changes: (+10 -0) 2007-02-07-AddrLabel.c | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/test/CFrontend/2007-02-07-AddrLabel.c diff -c /dev/null llvm/test/CFrontend/2007-02-07-AddrLabel.c:1.1 *** /dev/null Wed Feb 7 22:34:13 2007 --- llvm/test/CFrontend/2007-02-07-AddrLabel.c Wed Feb 7 22:34:03 2007 *************** *** 0 **** --- 1,10 ---- + // PR947 + // RUN: %llvmgcc %s -c -o - + + void foo() { + void *ptr; + label: + ptr = &&label; + + goto *ptr; + } From clattner at apple.com Wed Feb 7 22:34:01 2007 From: clattner at apple.com (clattner at apple.com) Date: Wed, 7 Feb 2007 20:34:01 -0800 (PST) Subject: [llvm-commits] [123568] Complete support for the GCC address-of-label extension (most was Message-ID: <20070208043401.C45EE32C84F2@src> Revision: 123568 Author: clattner Date: 2007-02-07 20:34:00 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Complete support for the GCC address-of-label extension (most was already implemented) and do some other minor cleanup. This implements PR947 and test/CFrontend/2007-02-07-AddrLabel.c Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-convert.cpp apple-local/branches/llvm/gcc/llvm-internal.h Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-08 02:16:06 UTC (rev 123567) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-08 04:34:00 UTC (rev 123568) @@ -689,18 +689,24 @@ case FUNCTION_DECL: case CONST_DECL: case RESULT_DECL: return EmitLV_DECL(exp); - case STRING_CST: return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp)); - case INDIRECT_REF: return EmitLV_INDIRECT_REF(exp); case ARRAY_RANGE_REF: case ARRAY_REF: return EmitLV_ARRAY_REF(exp); case COMPONENT_REF: return EmitLV_COMPONENT_REF(exp); case BIT_FIELD_REF: return EmitLV_BIT_FIELD_REF(exp); case REALPART_EXPR: return EmitLV_XXXXPART_EXPR(exp, 0); case IMAGPART_EXPR: return EmitLV_XXXXPART_EXPR(exp, 1); + // Constants. + case LABEL_DECL: return TreeConstantToLLVM::EmitLV_LABEL_DECL(exp); + case STRING_CST: return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp)); + + // Trivial Cases. case VIEW_CONVERT_EXPR: case WITH_SIZE_EXPR: // The address of a these is the address of their operand. return EmitLV(TREE_OPERAND(exp, 0)); + case INDIRECT_REF: + // The lvalue is just the address. + return Emit(TREE_OPERAND(exp, 0), 0); } } @@ -4093,11 +4099,6 @@ return CastToType(Instruction::BitCast, Decl, PTy); } -LValue TreeToLLVM::EmitLV_INDIRECT_REF(tree exp) { - // The lvalue is just the address. - return Emit(TREE_OPERAND(exp, 0), 0); -} - LValue TreeToLLVM::EmitLV_ARRAY_REF(tree exp) { tree Array = TREE_OPERAND(exp, 0); tree Index = TREE_OPERAND(exp, 1); @@ -5095,9 +5096,11 @@ case COMPONENT_REF: return EmitLV_COMPONENT_REF(exp); case ARRAY_RANGE_REF: case ARRAY_REF: return EmitLV_ARRAY_REF(exp); - case INDIRECT_REF: return EmitLV_INDIRECT_REF(exp); + case INDIRECT_REF: + // The lvalue is just the address. + return Convert(TREE_OPERAND(exp, 0)); case COMPOUND_LITERAL_EXPR: - return EmitLV_COMPOUND_LITERAL_EXPR(exp); + return EmitLV(COMPOUND_LITERAL_EXPR_DECL(exp)); } } @@ -5278,15 +5281,5 @@ return FieldPtr; } -Constant* TreeConstantToLLVM::EmitLV_INDIRECT_REF(tree exp) { - // The lvalue is just the address. - return Convert(TREE_OPERAND(exp, 0)); -} - -Constant *TreeConstantToLLVM::EmitLV_COMPOUND_LITERAL_EXPR(tree exp) { - tree Decl = COMPOUND_LITERAL_EXPR_DECL(exp); - return EmitLV(Decl); -} - /* APPLE LOCAL end LLVM (ENTIRE FILE!) */ Modified: apple-local/branches/llvm/gcc/llvm-internal.h =================================================================== --- apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-08 02:16:06 UTC (rev 123567) +++ apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-08 04:34:00 UTC (rev 123568) @@ -463,7 +463,6 @@ Value *EmitComplexBinOp(tree_node *exp, Value *DestLoc); // L-Value Expressions. - LValue EmitLV_INDIRECT_REF(tree_node *exp); LValue EmitLV_DECL(tree_node *exp); LValue EmitLV_ARRAY_REF(tree_node *exp); LValue EmitLV_COMPONENT_REF(tree_node *exp); @@ -515,8 +514,6 @@ static Constant *EmitLV_STRING_CST(tree_node *exp); static Constant *EmitLV_COMPONENT_REF(tree_node *exp); static Constant *EmitLV_ARRAY_REF(tree_node *exp); - static Constant *EmitLV_INDIRECT_REF(tree_node *exp); - static Constant *EmitLV_COMPOUND_LITERAL_EXPR(tree_node *exp); }; #endif From dpatel at apple.com Wed Feb 7 22:36:09 2007 From: dpatel at apple.com (dpatel at apple.com) Date: Wed, 7 Feb 2007 20:36:09 -0800 (PST) Subject: [llvm-commits] [123569] Read bytecodes from PCH file. Message-ID: <20070208043609.BA19F32C8C5D@src> Revision: 123569 Author: dpatel Date: 2007-02-07 20:36:09 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Read bytecodes from PCH file. Modified Paths: -------------- apple-local/branches/llvm/gcc/Makefile.in apple-local/branches/llvm/gcc/c-pch.c apple-local/branches/llvm/gcc/llvm-backend.cpp apple-local/branches/llvm/gcc/llvm-linker-hack.cpp apple-local/branches/llvm/gcc/llvm.h Modified: apple-local/branches/llvm/gcc/Makefile.in =================================================================== --- apple-local/branches/llvm/gcc/Makefile.in 2007-02-08 04:34:00 UTC (rev 123568) +++ apple-local/branches/llvm/gcc/Makefile.in 2007-02-08 04:36:09 UTC (rev 123569) @@ -1069,7 +1069,7 @@ # We use llvm-config to determine the libraries that we need to link in our # target, optimizations analyses and the bcwriter. -LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils analysis bcwriter ipo +LLVMCOMPONENTS := $(LLVMTARGETOBJ) scalaropts transformutils analysis bcwriter ipo bcreader LLVMLIBFILES := $(shell $(LLVMBINPATH)/llvm-config --libfiles $(LLVMCOMPONENTS)) LLVMLDFLAGS := $(shell $(LLVMBINPATH)/llvm-config --ldflags) LIBS += $(LLVMLDFLAGS) Modified: apple-local/branches/llvm/gcc/c-pch.c =================================================================== --- apple-local/branches/llvm/gcc/c-pch.c 2007-02-08 04:34:00 UTC (rev 123568) +++ apple-local/branches/llvm/gcc/c-pch.c 2007-02-08 04:36:09 UTC (rev 123569) @@ -429,6 +429,12 @@ written += size; } free (buf); + /* APPLE LOCAL begin LLVM */ +#ifdef ENABLE_LLVM + llvm_pch_read(); +#endif + /* APPLE LOCAL end LLVM */ + } else { @@ -438,6 +444,7 @@ cpp_errno (pfile, CPP_DL_ERROR, "seeking"); } + cpp_prepare_state (pfile, &smd); gt_pch_restore (f); Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 04:34:00 UTC (rev 123568) +++ apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-02-08 04:36:09 UTC (rev 123569) @@ -32,6 +32,7 @@ #include "llvm/Assembly/Writer.h" #include "llvm/Assembly/PrintModulePass.h" #include "llvm/Bytecode/WriteBytecodePass.h" +#include "llvm/Bytecode/Reader.h" #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/CodeGen/ScheduleDAG.h" @@ -184,6 +185,21 @@ oFILEstream *AsmOutStream = 0; +void llvm_pch_read(void) { + + if (TheModule) + delete TheModule; + + fclose (asm_out_file); + std::string ErrMsg; + TheModule = ParseBytecodeFile(asm_file_name, &ErrMsg); + if (!TheModule) { + cerr << "Error reading bytecodes from PCH file\n"; + cerr << ErrMsg << "\n"; + exit(1); + } +} + // Initialize PCH writing. void llvm_pch_write_init(void) { timevar_push(TV_LLVM_INIT); Modified: apple-local/branches/llvm/gcc/llvm-linker-hack.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-linker-hack.cpp 2007-02-08 04:34:00 UTC (rev 123568) +++ apple-local/branches/llvm/gcc/llvm-linker-hack.cpp 2007-02-08 04:36:09 UTC (rev 123569) @@ -26,6 +26,7 @@ #include "llvm/Analysis/LoadValueNumbering.h" #include "llvm/Transforms/IPO.h" #include "llvm/Bytecode/Writer.h" +#include "llvm/Bytecode/Reader.h" #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Support/Streams.h" @@ -41,6 +42,7 @@ new llvm::ExistingModuleProvider(0); llvm::createVerifierPass(); llvm::WriteBytecodeToFile(0, llvm::cout); + llvm::ParseBytecodeFile(NULL,NULL); llvm::createInstructionCombiningPass(); llvm::createScalarReplAggregatesPass(); Modified: apple-local/branches/llvm/gcc/llvm.h =================================================================== --- apple-local/branches/llvm/gcc/llvm.h 2007-02-08 04:34:00 UTC (rev 123568) +++ apple-local/branches/llvm/gcc/llvm.h 2007-02-08 04:36:09 UTC (rev 123569) @@ -83,6 +83,9 @@ /* Init pch writing. */ void llvm_pch_write_init(void); +/* Read bytecodes from PCH file. */ +void llvm_pch_read(void); + /* llvm_asm_file_start - Start the .s file. */ void llvm_asm_file_start(void); From evan.cheng at apple.com Thu Feb 8 00:05:10 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 8 Feb 2007 00:05:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/VirtRegMap.cpp Message-ID: <200702080605.l1865Awi024457@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: VirtRegMap.cpp updated: 1.94 -> 1.95 --- Log message: Fixed a long standing spiller bug that's exposed by Thumb: The code sequence before the spiller is something like: = tMOVrr %reg1117 = tMOVrr %reg1078 = tLSLri %reg1117, 2 The it starts spilling: %r0 = tRestore , 0 %r1 = tRestore , 0 %r1 = tMOVrr %r1 tSpill %r1, , 0 %reg1078 = tLSLri %reg1117, 2 It restores the value while processing the first tMOVrr. At this point, the spiller remembers fi#5 is available in %r0. Next it processes the second move. It restores the source before the move and spills the result afterwards. The move becomes a noop and is deleted. However, a spill has been inserted and that should invalidate reuse of %r0 for fi#5 and add reuse of %r1 for fi#5. Therefore, %reg1117 (which is also assigned fi#5) should get %r1, not %r0. --- Diffs of the changes: (+13 -13) VirtRegMap.cpp | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/VirtRegMap.cpp diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.94 llvm/lib/CodeGen/VirtRegMap.cpp:1.95 --- llvm/lib/CodeGen/VirtRegMap.cpp:1.94 Mon Jan 22 18:59:48 2007 +++ llvm/lib/CodeGen/VirtRegMap.cpp Thu Feb 8 00:04:54 2007 @@ -923,19 +923,6 @@ DOUT << "Store:\t" << *next(MII); MI.getOperand(i).setReg(PhysReg); - // Check to see if this is a noop copy. If so, eliminate the - // instruction before considering the dest reg to be changed. - { - unsigned Src, Dst; - if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) { - ++NumDCE; - DOUT << "Removing now-noop copy: " << MI; - MBB.erase(&MI); - VRM.RemoveFromFoldedVirtMap(&MI); - goto ProcessNextInst; - } - } - // If there is a dead store to this stack slot, nuke it now. MachineInstr *&LastStore = MaybeDeadStores[StackSlot]; if (LastStore) { @@ -953,6 +940,19 @@ Spills.ClobberPhysReg(PhysReg); Spills.addAvailable(StackSlot, PhysReg); ++NumStores; + + // Check to see if this is a noop copy. If so, eliminate the + // instruction before considering the dest reg to be changed. + { + unsigned Src, Dst; + if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) { + ++NumDCE; + DOUT << "Removing now-noop copy: " << MI; + MBB.erase(&MI); + VRM.RemoveFromFoldedVirtMap(&MI); + goto ProcessNextInst; + } + } } } ProcessNextInst: From isanbard at gmail.com Thu Feb 8 00:05:28 2007 From: isanbard at gmail.com (Bill Wendling) Date: Thu, 8 Feb 2007 00:05:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp Message-ID: <200702080605.l1865SA5024471@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCMachOWriterInfo.cpp updated: 1.3 -> 1.4 --- Log message: Fixed comments. --- Diffs of the changes: (+2 -3) PPCMachOWriterInfo.cpp | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.3 llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.4 --- llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp:1.3 Wed Feb 7 19:39:44 2007 +++ llvm/lib/Target/PowerPC/PPCMachOWriterInfo.cpp Thu Feb 8 00:05:08 2007 @@ -2,9 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Nate Begeman and Bill Wendling and is distributed -// under the University of Illinois Open Source License. See LICENSE.TXT for -// details. +// This file was developed by Bill Wendling and is distributed under the +// University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // From isanbard at gmail.com Thu Feb 8 00:05:28 2007 From: isanbard at gmail.com (Bill Wendling) Date: Thu, 8 Feb 2007 00:05:28 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/FileWriters.h Message-ID: <200702080605.l1865Stc024474@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: FileWriters.h updated: 1.1 -> 1.2 --- Log message: Fixed comments. --- Diffs of the changes: (+1 -1) FileWriters.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/FileWriters.h diff -u llvm/include/llvm/CodeGen/FileWriters.h:1.1 llvm/include/llvm/CodeGen/FileWriters.h:1.2 --- llvm/include/llvm/CodeGen/FileWriters.h:1.1 Wed Feb 7 19:31:38 2007 +++ llvm/include/llvm/CodeGen/FileWriters.h Thu Feb 8 00:05:08 2007 @@ -1,4 +1,4 @@ -//===-- FileWriters.cpp - File Writers Creation Functions -------*- C++ -*-===// +//===-- FileWriters.h - File Writers Creation Functions ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // From sabre at nondot.org Thu Feb 8 00:08:11 2007 From: sabre at nondot.org (Chris Lattner) Date: Thu, 8 Feb 2007 00:08:11 -0600 Subject: [llvm-commits] CVS: llvm-www/OpenProjects.html Message-ID: <200702080608.l1868BQo024573@zion.cs.uiuc.edu> Changes in directory llvm-www: OpenProjects.html updated: 1.18 -> 1.19 --- Log message: add an open project, with a link! --- Diffs of the changes: (+5 -2) OpenProjects.html | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm-www/OpenProjects.html diff -u llvm-www/OpenProjects.html:1.18 llvm-www/OpenProjects.html:1.19 --- llvm-www/OpenProjects.html:1.18 Tue Jan 23 23:28:10 2007 +++ llvm-www/OpenProjects.html Thu Feb 8 00:07:55 2007 @@ -314,12 +314,15 @@
  1. Improve the instruction selectors.
  2. +
  3. Implement a way to describe calling conventions abstractly, instead of + us having to write C++ code in the lowering phase. Many approaches are + available, a good one is Staged Allocation: A Compositional Technique for Specifying and Implementing Procedure Calling Conventions.
  4. Implement interprocedural register allocation. The CallGraphSCCPass can be used to implement a bottom-up analysis that will determine the *actual* registers clobbered by a function. Use the pass to fine tune register usage in callers based on *actual* registers used by the callee.
  5. Write a new backend for a target -(MIPS? +(VAX, i960, PA-RISC, MIPS? MMIX?)
@@ -372,7 +375,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"> LLVM Compiler Infrastructure
- Last modified: $Date: 2007/01/24 05:28:10 $ + Last modified: $Date: 2007/02/08 06:07:55 $ From reid at x10sys.com Thu Feb 8 00:45:18 2007 From: reid at x10sys.com (Reid Spencer) Date: Thu, 8 Feb 2007 00:45:18 -0600 Subject: [llvm-commits] CVS: llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll Message-ID: <200702080645.l186jIu1025164@zion.cs.uiuc.edu> Changes in directory llvm/test/Assembler: 2007-02-07-UpgradeCSRETCC.ll added (r1.1) --- Log message: For PR1187: http://llvm.org/PR1187 : Add some interesting CSRETCC upgrade cases. --- Diffs of the changes: (+21 -0) 2007-02-07-UpgradeCSRETCC.ll | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) Index: llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll diff -c /dev/null llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll:1.1 *** /dev/null Thu Feb 8 00:45:12 2007 --- llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll Thu Feb 8 00:45:02 2007 *************** *** 0 **** --- 1,21 ---- + ; For PR1187 + ; RUN: llvm-upgrade < %s > /dev/null + + %mystruct = type { int, double } + %glob = global %mystruct { int 3, double 42.0 } + %fptr = external global void (i32)* + + implementation + + csretcc void %nada(%mystruct * %ptr, int %val) { + ret void + } + + int %main(int %argc, ubyte** %argv) { + %astr = alloca %mystruct + call void %nada(%mystruct* %astr, i32 7) + %fptr = alloca void (%mystruct*, i32)* + %f = load void (%mystruct*, i32)**%fptr + call csretcc void %f(%mystruct* %astr, i32 7) + ret int 0 + } From reid at x10sys.com Thu Feb 8 02:04:30 2007 From: reid at x10sys.com (Reid Spencer) Date: Thu, 8 Feb 2007 02:04:30 -0600 Subject: [llvm-commits] CVS: llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll Message-ID: <200702080804.l1884Ufg026424@zion.cs.uiuc.edu> Changes in directory llvm/test/Assembler: 2007-02-07-UpgradeCSRETCC.ll updated: 1.1 -> 1.2 --- Log message: Add some more interesting cases to this test. --- Diffs of the changes: (+2 -0) 2007-02-07-UpgradeCSRETCC.ll | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll diff -u llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll:1.1 llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll:1.2 --- llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll:1.1 Thu Feb 8 00:45:02 2007 +++ llvm/test/Assembler/2007-02-07-UpgradeCSRETCC.ll Thu Feb 8 02:03:46 2007 @@ -17,5 +17,7 @@ %fptr = alloca void (%mystruct*, i32)* %f = load void (%mystruct*, i32)**%fptr call csretcc void %f(%mystruct* %astr, i32 7) + store void (%mystruct* , i32)* %nada, void (%mystruct*, i32)** %fptr + ret int 0 } From reid at x10sys.com Thu Feb 8 02:10:42 2007 From: reid at x10sys.com (Reid Spencer) Date: Thu, 8 Feb 2007 02:10:42 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeParser.y Message-ID: <200702080810.l188Ag26028390@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-upgrade: UpgradeParser.y updated: 1.59 -> 1.60 --- Log message: For PR1187: http://llvm.org/PR1187 : Some changes to get the smbd.ll test case working: 1. Move the logic for CSRETCC->sret attribute out of the ResolveDefinitions code and into getExistingValue. This resolves it much earlier and works in function scope as well. 2. Fix handling of CSRETCC->sret for the store instruction. 3. Rewrite the code for handling renaming to factor in linkage types. 4. Rename a structure filed for a PATypeInfo* so it doesn't get confused with a field for a Type*. --- Diffs of the changes: (+277 -253) UpgradeParser.y | 530 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 277 insertions(+), 253 deletions(-) Index: llvm/tools/llvm-upgrade/UpgradeParser.y diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.59 llvm/tools/llvm-upgrade/UpgradeParser.y:1.60 --- llvm/tools/llvm-upgrade/UpgradeParser.y:1.59 Wed Feb 7 18:21:06 2007 +++ llvm/tools/llvm-upgrade/UpgradeParser.y Thu Feb 8 02:09:36 2007 @@ -171,7 +171,6 @@ std::map > BBForwardRefs; std::vector NumberedBlocks; RenameMapType RenameMap; - unsigned LastCC; unsigned NextBBNum; inline PerFunctionInfo() { @@ -268,6 +267,55 @@ return Typ; } +/// This function determines if two function types differ only in their use of +/// the sret parameter attribute in the first argument. If they are identical +/// in all other respects, it returns true. Otherwise, it returns false. +bool FuncTysDifferOnlyBySRet(const FunctionType *F1, + const FunctionType *F2) { + if (F1->getReturnType() != F2->getReturnType() || + F1->getNumParams() != F2->getNumParams() || + F1->getParamAttrs(0) != F2->getParamAttrs(0)) + return false; + unsigned SRetMask = ~unsigned(FunctionType::StructRetAttribute); + for (unsigned i = 0; i < F1->getNumParams(); ++i) { + if (F1->getParamType(i) != F2->getParamType(i) || + unsigned(F1->getParamAttrs(i+1)) & SRetMask != + unsigned(F2->getParamAttrs(i+1)) & SRetMask) + return false; + } + return true; +} + +// The upgrade of csretcc to sret param attribute may have caused a function +// to not be found because the param attribute changed the type of the called +// function. This helper function, used in getExistingValue, detects that +// situation and returns V if it occurs and 0 otherwise. +static Value* handleSRetFuncTypeMerge(Value *V, const Type* Ty) { + // Handle degenerate cases + if (!V) + return 0; + if (V->getType() == Ty) + return V; + + Value* Result = 0; + const PointerType *PF1 = dyn_cast(Ty); + const PointerType *PF2 = dyn_cast(V->getType()); + if (PF1 && PF2) { + const FunctionType *FT1 = + dyn_cast(PF1->getElementType()); + const FunctionType *FT2 = + dyn_cast(PF2->getElementType()); + if (FT1 && FT2 && FuncTysDifferOnlyBySRet(FT1, FT2)) + if (FT2->paramHasAttr(1, FunctionType::StructRetAttribute)) + Result = V; + else if (Constant *C = dyn_cast(V)) + Result = ConstantExpr::getBitCast(C, PF1); + else + Result = new BitCastInst(V, PF1, "upgrd.cast", CurBB); + } + return Result; +} + // getExistingValue - Look up the value specified by the provided type and // the provided ValID. If the value exists and has already been defined, return // it. Otherwise return null. @@ -314,8 +362,7 @@ LookupName = Name; ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable(); V = SymTab.lookup(LookupName); - if (V && V->getType() != Ty) - V = 0; + V = handleSRetFuncTypeMerge(V, Ty); } if (!V) { RenameMapType::const_iterator I = CurModule.RenameMap.find(Key); @@ -325,8 +372,7 @@ else LookupName = Name; V = CurModule.CurrentModule->getValueSymbolTable().lookup(LookupName); - if (V && V->getType() != Ty) - V = 0; + V = handleSRetFuncTypeMerge(V, Ty); } if (!V) return 0; @@ -509,25 +555,6 @@ // and back patchs after we are done. // -/// This function determines if two function types differ only in their use of -/// the sret parameter attribute in the first argument. If they are identical -/// in all other respects, it returns true. Otherwise, it returns false. -bool FuncTysDifferOnlyBySRet(const FunctionType *F1, - const FunctionType *F2) { - if (F1->getReturnType() != F2->getReturnType() || - F1->getNumParams() != F2->getNumParams() || - F1->getParamAttrs(0) != F2->getParamAttrs(0)) - return false; - unsigned SRetMask = ~unsigned(FunctionType::StructRetAttribute); - for (unsigned i = 0; i < F1->getNumParams(); ++i) { - if (F1->getParamType(i) != F2->getParamType(i) || - unsigned(F1->getParamAttrs(i+1)) & SRetMask != - unsigned(F2->getParamAttrs(i+1)) & SRetMask) - return false; - } - return true; -} - // ResolveDefinitions - If we could not resolve some defs at parsing // time (forward branches, phi functions for loops, etc...) resolve the // defs now... @@ -535,9 +562,11 @@ static void ResolveDefinitions(std::map &LateResolvers, std::map *FutureLateResolvers) { + // Loop over LateResolveDefs fixing up stuff that couldn't be resolved for (std::map::iterator LRI = LateResolvers.begin(), E = LateResolvers.end(); LRI != E; ++LRI) { + const Type* Ty = LRI->first; ValueList &List = LRI->second; while (!List.empty()) { Value *V = List.back(); @@ -549,7 +578,7 @@ ValID &DID = PHI->second.first; - Value *TheRealValue = getExistingValue(LRI->first, DID); + Value *TheRealValue = getExistingValue(Ty, DID); if (TheRealValue) { V->replaceAllUsesWith(TheRealValue); delete V; @@ -560,26 +589,10 @@ InsertValue(V, *FutureLateResolvers); } else { if (DID.Type == ValID::NameVal) { - // The upgrade of csretcc to sret param attribute may have caused a - // function to not be found because the param attribute changed the - // type of the called function. Detect this situation and insert a - // cast as necessary. - bool fixed = false; - if (const PointerType *PTy = dyn_cast(V->getType())) - if (const FunctionType *FTy = - dyn_cast(PTy->getElementType())) - if (Function *OtherF = - CurModule.CurrentModule->getFunction(DID.getName())) - if (FuncTysDifferOnlyBySRet(FTy,OtherF->getFunctionType())) { - V->replaceAllUsesWith(ConstantExpr::getBitCast(OtherF, PTy)); - fixed = true; - } - if (!fixed) { - error("Reference to an invalid definition: '" +DID.getName()+ - "' of type '" + V->getType()->getDescription() + "'", - PHI->second.second); + error("Reference to an invalid definition: '" + DID.getName() + + "' of type '" + V->getType()->getDescription() + "'", + PHI->second.second); return; - } } else { error("Reference to an invalid definition: #" + itostr(DID.Num) + " of type '" + @@ -1488,7 +1501,7 @@ %type OptVolatile // 'volatile' or not %type OptTailCall // TAIL CALL or plain CALL. %type OptSideEffect // 'sideeffect' or not. -%type OptLinkage +%type OptLinkage FnDeclareLinkage %type BigOrLittle // ValueRef - Unresolved reference to a definition or BB @@ -1666,13 +1679,13 @@ ; OptCallingConv - : /*empty*/ { CurFun.LastCC = $$ = OldCallingConv::C; } - | CCC_TOK { CurFun.LastCC = $$ = OldCallingConv::C; } - | CSRETCC_TOK { CurFun.LastCC = $$ = OldCallingConv::CSRet; } - | FASTCC_TOK { CurFun.LastCC = $$ = OldCallingConv::Fast; } - | COLDCC_TOK { CurFun.LastCC = $$ = OldCallingConv::Cold; } - | X86_STDCALLCC_TOK { CurFun.LastCC = $$ = OldCallingConv::X86_StdCall; } - | X86_FASTCALLCC_TOK { CurFun.LastCC = $$ = OldCallingConv::X86_FastCall; } + : /*empty*/ { $$ = OldCallingConv::C; } + | CCC_TOK { $$ = OldCallingConv::C; } + | CSRETCC_TOK { $$ = OldCallingConv::CSRet; } + | FASTCC_TOK { $$ = OldCallingConv::Fast; } + | COLDCC_TOK { $$ = OldCallingConv::Cold; } + | X86_STDCALLCC_TOK { $$ = OldCallingConv::X86_StdCall; } + | X86_FASTCALLCC_TOK { $$ = OldCallingConv::X86_FastCall; } | CC_TOK EUINT64VAL { if ((unsigned)$2 != $2) error("Calling conv too large"); @@ -1745,7 +1758,7 @@ TypesV : Types | VOID { - $$.T = new PATypeHolder($1.T); + $$.PAT = new PATypeHolder($1.T); $$.S = Signless; } ; @@ -1753,7 +1766,7 @@ UpRTypesV : UpRTypes | VOID { - $$.T = new PATypeHolder($1.T); + $$.PAT = new PATypeHolder($1.T); $$.S = Signless; } ; @@ -1761,7 +1774,7 @@ Types : UpRTypes { if (!UpRefs.empty()) - error("Invalid upreference in type: " + (*$1.T)->getDescription()); + error("Invalid upreference in type: " + (*$1.PAT)->getDescription()); $$ = $1; } ; @@ -1774,16 +1787,16 @@ // Derived types are added later... UpRTypes : PrimType { - $$.T = new PATypeHolder($1.T); + $$.PAT = new PATypeHolder($1.T); $$.S = $1.S; } | OPAQUE { - $$.T = new PATypeHolder(OpaqueType::get()); + $$.PAT = new PATypeHolder(OpaqueType::get()); $$.S = Signless; } | SymbolicValueRef { // Named types are also simple types... const Type* tmp = getType($1); - $$.T = new PATypeHolder(tmp); + $$.PAT = new PATypeHolder(tmp); $$.S = Signless; // FIXME: what if its signed? } | '\\' EUINT64VAL { // Type UpReference @@ -1791,7 +1804,7 @@ error("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector... - $$.T = new PATypeHolder(OT); + $$.PAT = new PATypeHolder(OT); $$.S = Signless; UR_OUT("New Upreference!\n"); } @@ -1799,75 +1812,72 @@ std::vector Params; for (std::list::iterator I = $3->begin(), E = $3->end(); I != E; ++I) { - Params.push_back(I->T->get()); + Params.push_back(I->PAT->get()); } FunctionType::ParamAttrsList ParamAttrs; - if (CurFun.LastCC == OldCallingConv::CSRet) { - ParamAttrs.push_back(FunctionType::NoAttributeSet); - ParamAttrs.push_back(FunctionType::StructRetAttribute); - } bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - $$.T = new PATypeHolder( - HandleUpRefs(FunctionType::get($1.T->get(),Params,isVarArg, ParamAttrs))); + $$.PAT = new PATypeHolder( + HandleUpRefs(FunctionType::get($1.PAT->get(), Params, isVarArg, + ParamAttrs))); $$.S = $1.S; - delete $1.T; // Delete the return type handle + delete $1.PAT; // Delete the return type handle delete $3; // Delete the argument list } | '[' EUINT64VAL 'x' UpRTypes ']' { // Sized array type? - $$.T = new PATypeHolder(HandleUpRefs(ArrayType::get($4.T->get(), + $$.PAT = new PATypeHolder(HandleUpRefs(ArrayType::get($4.PAT->get(), (unsigned)$2))); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | '<' EUINT64VAL 'x' UpRTypes '>' { // Packed array type? - const llvm::Type* ElemTy = $4.T->get(); + const llvm::Type* ElemTy = $4.PAT->get(); if ((unsigned)$2 != $2) error("Unsigned result not equal to signed result"); if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint())) error("Elements of a PackedType must be integer or floating point"); if (!isPowerOf2_32($2)) error("PackedType length should be a power of 2"); - $$.T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy, + $$.PAT = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy, (unsigned)$2))); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | '{' TypeListI '}' { // Structure type? std::vector Elements; for (std::list::iterator I = $2->begin(), E = $2->end(); I != E; ++I) - Elements.push_back(I->T->get()); - $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + Elements.push_back(I->PAT->get()); + $$.PAT = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); $$.S = Signless; delete $2; } | '{' '}' { // Empty structure type? - $$.T = new PATypeHolder(StructType::get(std::vector())); + $$.PAT = new PATypeHolder(StructType::get(std::vector())); $$.S = Signless; } | '<' '{' TypeListI '}' '>' { // Packed Structure type? std::vector Elements; for (std::list::iterator I = $3->begin(), E = $3->end(); I != E; ++I) { - Elements.push_back(I->T->get()); - delete I->T; + Elements.push_back(I->PAT->get()); + delete I->PAT; } - $$.T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); + $$.PAT = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); $$.S = Signless; delete $3; } | '<' '{' '}' '>' { // Empty packed structure type? - $$.T = new PATypeHolder(StructType::get(std::vector(),true)); + $$.PAT = new PATypeHolder(StructType::get(std::vector(),true)); $$.S = Signless; } | UpRTypes '*' { // Pointer type? - if ($1.T->get() == Type::LabelTy) + if ($1.PAT->get() == Type::LabelTy) error("Cannot form a pointer to a basic block"); - $$.T = new PATypeHolder(HandleUpRefs(PointerType::get($1.T->get()))); + $$.PAT = new PATypeHolder(HandleUpRefs(PointerType::get($1.PAT->get()))); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } ; @@ -1889,14 +1899,14 @@ : TypeListI | TypeListI ',' DOTDOTDOT { PATypeInfo VoidTI; - VoidTI.T = new PATypeHolder(Type::VoidTy); + VoidTI.PAT = new PATypeHolder(Type::VoidTy); VoidTI.S = Signless; ($$=$1)->push_back(VoidTI); } | DOTDOTDOT { $$ = new std::list(); PATypeInfo VoidTI; - VoidTI.T = new PATypeHolder(Type::VoidTy); + VoidTI.PAT = new PATypeHolder(Type::VoidTy); VoidTI.S = Signless; $$->push_back(VoidTI); } @@ -1913,10 +1923,10 @@ // ConstVal : Types '[' ConstVector ']' { // Nonempty unsized arr - const ArrayType *ATy = dyn_cast($1.T->get()); + const ArrayType *ATy = dyn_cast($1.PAT->get()); if (ATy == 0) error("Cannot make array constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); @@ -1939,27 +1949,27 @@ } $$.C = ConstantArray::get(ATy, Elems); $$.S = $1.S; - delete $1.T; + delete $1.PAT; delete $3; } | Types '[' ']' { - const ArrayType *ATy = dyn_cast($1.T->get()); + const ArrayType *ATy = dyn_cast($1.PAT->get()); if (ATy == 0) error("Cannot make array constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) error("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +""); $$.C = ConstantArray::get(ATy, std::vector()); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types 'c' STRINGCONSTANT { - const ArrayType *ATy = dyn_cast($1.T->get()); + const ArrayType *ATy = dyn_cast($1.PAT->get()); if (ATy == 0) error("Cannot make array constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); int NumElements = ATy->getNumElements(); const Type *ETy = dyn_cast(ATy->getElementType()); if (!ETy || cast(ETy)->getBitWidth() != 8) @@ -1976,13 +1986,13 @@ free($3); $$.C = ConstantArray::get(ATy, Vals); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types '<' ConstVector '>' { // Nonempty unsized arr - const PackedType *PTy = dyn_cast($1.T->get()); + const PackedType *PTy = dyn_cast($1.PAT->get()); if (PTy == 0) error("Cannot make packed constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); // Verify that we have the correct size... @@ -2003,14 +2013,14 @@ } $$.C = ConstantPacked::get(PTy, Elems); $$.S = $1.S; - delete $1.T; + delete $1.PAT; delete $3; } | Types '{' ConstVector '}' { - const StructType *STy = dyn_cast($1.T->get()); + const StructType *STy = dyn_cast($1.PAT->get()); if (STy == 0) error("Cannot make struct constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); if ($3->size() != STy->getNumContainedTypes()) error("Illegal number of initializers for structure type"); @@ -2025,25 +2035,25 @@ } $$.C = ConstantStruct::get(STy, Fields); $$.S = $1.S; - delete $1.T; + delete $1.PAT; delete $3; } | Types '{' '}' { - const StructType *STy = dyn_cast($1.T->get()); + const StructType *STy = dyn_cast($1.PAT->get()); if (STy == 0) error("Cannot make struct constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) error("Illegal number of initializers for structure type"); $$.C = ConstantStruct::get(STy, std::vector()); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types '<' '{' ConstVector '}' '>' { - const StructType *STy = dyn_cast($1.T->get()); + const StructType *STy = dyn_cast($1.PAT->get()); if (STy == 0) error("Cannot make packed struct constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); if ($4->size() != STy->getNumContainedTypes()) error("Illegal number of initializers for packed structure type"); @@ -2058,39 +2068,39 @@ } $$.C = ConstantStruct::get(STy, Fields); $$.S = $1.S; - delete $1.T; + delete $1.PAT; delete $4; } | Types '<' '{' '}' '>' { - const StructType *STy = dyn_cast($1.T->get()); + const StructType *STy = dyn_cast($1.PAT->get()); if (STy == 0) error("Cannot make packed struct constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) error("Illegal number of initializers for packed structure type"); $$.C = ConstantStruct::get(STy, std::vector()); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types NULL_TOK { - const PointerType *PTy = dyn_cast($1.T->get()); + const PointerType *PTy = dyn_cast($1.PAT->get()); if (PTy == 0) error("Cannot make null pointer constant with type: '" + - $1.T->get()->getDescription() + "'"); + $1.PAT->get()->getDescription() + "'"); $$.C = ConstantPointerNull::get(PTy); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types UNDEF { - $$.C = UndefValue::get($1.T->get()); + $$.C = UndefValue::get($1.PAT->get()); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types SymbolicValueRef { - const PointerType *Ty = dyn_cast($1.T->get()); + const PointerType *Ty = dyn_cast($1.PAT->get()); if (Ty == 0) error("Global const reference must be a pointer type, not" + - $1.T->get()->getDescription()); + $1.PAT->get()->getDescription()); // ConstExprs can exist in the body of a function, thus creating // GlobalValues whenever they refer to a variable. Because we are in @@ -2142,22 +2152,22 @@ } $$.C = cast(V); $$.S = $1.S; - delete $1.T; // Free the type handle + delete $1.PAT; // Free the type handle } | Types ConstExpr { - if ($1.T->get() != $2.C->getType()) + if ($1.PAT->get() != $2.C->getType()) error("Mismatched types for constant expression"); $$ = $2; $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | Types ZEROINITIALIZER { - const Type *Ty = $1.T->get(); + const Type *Ty = $1.PAT->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) error("Cannot create a null initialized value of this type"); $$.C = Constant::getNullValue(Ty); $$.S = $1.S; - delete $1.T; + delete $1.PAT; } | SIntType EINT64VAL { // integral constants const Type *Ty = $1.T; @@ -2192,7 +2202,7 @@ ConstExpr : CastOps '(' ConstVal TO Types ')' { const Type* SrcTy = $3.C->getType(); - const Type* DstTy = $5.T->get(); + const Type* DstTy = $5.PAT->get(); Signedness SrcSign = $3.S; Signedness DstSign = $5.S; if (!SrcTy->isFirstClassType()) @@ -2203,7 +2213,7 @@ DstTy->getDescription() + "'"); $$.C = cast(getCast($1, $3.C, SrcSign, DstTy, DstSign)); $$.S = DstSign; - delete $5.T; + delete $5.PAT; } | GETELEMENTPTR '(' ConstVal IndexList ')' { const Type *Ty = $3.C->getType(); @@ -2385,7 +2395,7 @@ // If types are not resolved eagerly, then the two types will not be // determined to be the same type! // - const Type* Ty = $4.T->get(); + const Type* Ty = $4.PAT->get(); ResolveTypeTo($2, Ty); if (!setTypeName(Ty, $2) && !$2) { @@ -2393,7 +2403,7 @@ // table. CurModule.Types.push_back(Ty); } - delete $4.T; + delete $4.PAT; } | ConstPool FunctionProto { // Function prototypes can be in const pool } @@ -2407,24 +2417,24 @@ CurGV = 0; } | ConstPool OptAssign EXTERNAL GlobalType Types { - const Type *Ty = $5.T->get(); + const Type *Ty = $5.PAT->get(); CurGV = ParseGlobalVariable($2, GlobalValue::ExternalLinkage, $4, Ty, 0); - delete $5.T; + delete $5.PAT; } GlobalVarAttributes { CurGV = 0; } | ConstPool OptAssign DLLIMPORT GlobalType Types { - const Type *Ty = $5.T->get(); + const Type *Ty = $5.PAT->get(); CurGV = ParseGlobalVariable($2, GlobalValue::DLLImportLinkage, $4, Ty, 0); - delete $5.T; + delete $5.PAT; } GlobalVarAttributes { CurGV = 0; } | ConstPool OptAssign EXTERN_WEAK GlobalType Types { - const Type *Ty = $5.T->get(); + const Type *Ty = $5.PAT->get(); CurGV = ParseGlobalVariable($2, GlobalValue::ExternalWeakLinkage, $4, Ty, 0); - delete $5.T; + delete $5.PAT; } GlobalVarAttributes { CurGV = 0; } @@ -2508,7 +2518,7 @@ ArgVal : Types OptName { - if ($1.T->get() == Type::VoidTy) + if ($1.PAT->get() == Type::VoidTy) error("void typed arguments are invalid"); $$ = new std::pair($1, $2); } @@ -2532,14 +2542,14 @@ | ArgListH ',' DOTDOTDOT { $$ = $1; PATypeInfo VoidTI; - VoidTI.T = new PATypeHolder(Type::VoidTy); + VoidTI.PAT = new PATypeHolder(Type::VoidTy); VoidTI.S = Signless; $$->push_back(std::pair(VoidTI, 0)); } | DOTDOTDOT { $$ = new std::vector >(); PATypeInfo VoidTI; - VoidTI.T = new PATypeHolder(Type::VoidTy); + VoidTI.PAT = new PATypeHolder(Type::VoidTy); VoidTI.S = Signless; $$->push_back(std::pair(VoidTI, 0)); } @@ -2552,7 +2562,7 @@ std::string FunctionName($3); free($3); // Free strdup'd memory! - const Type* RetTy = $2.T->get(); + const Type* RetTy = $2.PAT->get(); if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy) error("LLVM functions cannot return aggregate types"); @@ -2570,7 +2580,7 @@ } else if ($5) { // If there are arguments... for (std::vector >::iterator I = $5->begin(), E = $5->end(); I != E; ++I) { - const Type *Ty = I->first.T->get(); + const Type *Ty = I->first.PAT->get(); ParamTyList.push_back(Ty); } } @@ -2590,7 +2600,7 @@ const FunctionType *FT = FunctionType::get(RetTy, ParamTyList, isVarArg, ParamAttrs); const PointerType *PFT = PointerType::get(FT); - delete $2.T; + delete $2.PAT; ValID ID; if (!FunctionName.empty()) { @@ -2600,73 +2610,75 @@ } Function *Fn = 0; + Module* M = CurModule.CurrentModule; + // See if this function was forward referenced. If so, recycle the object. if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) { // Move the function to the end of the list, from whereever it was // previously inserted. Fn = cast(FWRef); - CurModule.CurrentModule->getFunctionList().remove(Fn); - CurModule.CurrentModule->getFunctionList().push_back(Fn); - } else if (!FunctionName.empty() && // Merge with an earlier prototype? - (Fn = CurModule.CurrentModule->getFunction(FunctionName))) { - if (Fn->getFunctionType() != FT ) { - // The existing function doesn't have the same type. Previously this was - // permitted because the symbol tables had "type planes" and names were - // distinct within a type plane. After PR411 was fixed, this is no - // longer the case. To resolve this we must rename this function. - // However, renaming it can cause problems if its linkage is external - // because it could cause a link failure. We warn about this. - std::string NewName = makeNameUnique(FunctionName); - warning("Renaming function '" + FunctionName + "' as '" + NewName + - "' may cause linkage errors"); - - Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, - CurModule.CurrentModule); - InsertValue(Fn, CurModule.Values); - RenameMapKey Key = std::make_pair(FunctionName,PFT); - CurModule.RenameMap[Key] = NewName; - } else if (Fn->hasInternalLinkage()) { - // The function we are creating conflicts in name with another function - // that has internal linkage. We'll rename that one quietly to get rid - // of the conflict. - Fn->setName(makeNameUnique(Fn->getName())); - RenameMapKey Key = std::make_pair(FunctionName,PFT); - CurModule.RenameMap[Key] = Fn->getName(); - - Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, - CurModule.CurrentModule); - - InsertValue(Fn, CurModule.Values); - } else if (CurFun.Linkage == GlobalValue::InternalLinkage) { - // The function we are creating has internal linkage and conflicts with - // another function of the same name. We'll just rename this one - // quietly because its internal linkage can't conflict with anything - // else. - std::string NewName = makeNameUnique(FunctionName); - Fn = new Function(FT, GlobalValue::ExternalLinkage, NewName, - CurModule.CurrentModule); - InsertValue(Fn, CurModule.Values); - RenameMapKey Key = std::make_pair(FunctionName,PFT); - CurModule.RenameMap[Key] = NewName; + M->getFunctionList().remove(Fn); + M->getFunctionList().push_back(Fn); + } else if (!FunctionName.empty()) { + GlobalValue *Conflict = M->getFunction(FunctionName); + if (!Conflict) + Conflict = M->getNamedGlobal(FunctionName); + if (Conflict && PFT == Conflict->getType()) { + if (!CurFun.isDeclare && !Conflict->isDeclaration()) { + // We have two function definitions that conflict, same type, same + // name. This wasn't allowed in 1.9, its not allowed here either + error("Redefinition of function '" + FunctionName + "' of type '" + + PFT->getDescription() + "'"); + + } else { + // If they are not both definitions, then just use the function we + // found since the types are the same. + Fn = cast(Conflict); + + // Make sure to strip off any argument names so we can't get + // conflicts. + if (Fn->isDeclaration()) + for (Function::arg_iterator AI = Fn->arg_begin(), + AE = Fn->arg_end(); AI != AE; ++AI) + AI->setName(""); + } + } else if (Conflict) { + // We have two globals with the same name and different types. + // Previously, this was permitted because the symbol table had + // "type planes" and names only needed to be distinct within a + // type plane. After PR411 was fixed, this is no loner the case. + // To resolve this we must rename one of the two. + if (Conflict->hasInternalLinkage()) { + // We can safely renamed the Conflict. + Conflict->setName(makeNameUnique(Conflict->getName())); + RenameMapKey Key = std::make_pair(FunctionName,Conflict->getType()); + CurModule.RenameMap[Key] = Conflict->getName(); + Fn = new Function(FT, CurFun.Linkage, FunctionName, M); + InsertValue(Fn, CurModule.Values); + } else if (CurFun.Linkage == GlobalValue::InternalLinkage) { + // We can safely rename the function we're defining + std::string NewName = makeNameUnique(FunctionName); + Fn = new Function(FT, CurFun.Linkage, NewName, M); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; + } else { + // We can't quietly rename either of these things, but we must + // rename one of them. Generate a warning about the renaming and + // elect to rename the thing we're now defining. + std::string NewName = makeNameUnique(FunctionName); + warning("Renaming function '" + FunctionName + "' as '" + NewName + + "' may cause linkage errors"); + Fn = new Function(FT, CurFun.Linkage, NewName, M); + InsertValue(Fn, CurModule.Values); + RenameMapKey Key = std::make_pair(FunctionName,PFT); + CurModule.RenameMap[Key] = NewName; + } } else { - // The types are the same and they are both external linkage. Either - // the existing or the current function needs to be a forward - // declaration. If not, they're attempting to redefine two external - // functions. This wasn't allowed in llvm 1.9 and it isn't allowed now. - if (!CurFun.isDeclare && !Fn->isDeclaration()) - error("Redefinition of function '" + FunctionName + "'"); - - // Make sure to strip off any argument names so we can't get conflicts. - if (Fn->isDeclaration()) - for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); - AI != AE; ++AI) - AI->setName(""); - } - } else { // Not already defined? - Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, - CurModule.CurrentModule); - - InsertValue(Fn, CurModule.Values); + // There's no conflict, just define the function + Fn = new Function(FT, CurFun.Linkage, FunctionName, M); + InsertValue(Fn, CurModule.Values); + } } CurFun.FunctionStart(Fn); @@ -2687,9 +2699,9 @@ // Add all of the arguments we parsed to the function... if ($5) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert($5->back().first.T->get() == Type::VoidTy && + assert($5->back().first.PAT->get() == Type::VoidTy && $5->back().second == 0 && "Not a varargs marker"); - delete $5->back().first.T; + delete $5->back().first.PAT; $5->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); @@ -2697,7 +2709,7 @@ std::vector >::iterator I = $5->begin(); std::vector >::iterator E = $5->end(); for ( ; I != E && ArgIt != ArgEnd; ++I, ++ArgIt) { - delete I->first.T; // Delete the typeholder... + delete I->first.PAT; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... InsertValue(ArgIt); } @@ -2730,13 +2742,14 @@ }; FnDeclareLinkage - : /*default*/ - | DLLIMPORT { CurFun.Linkage = GlobalValue::DLLImportLinkage; } - | EXTERN_WEAK { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; } + : /*default*/ { $$ = GlobalValue::ExternalLinkage; } + | DLLIMPORT { $$ = GlobalValue::DLLImportLinkage; } + | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } ; FunctionProto - : DECLARE { CurFun.isDeclare = true; } FnDeclareLinkage FunctionHeaderH { + : DECLARE { CurFun.isDeclare = true; } + FnDeclareLinkage { CurFun.Linkage = $3; } FunctionHeaderH { $$ = CurFun.CurrentFunction; CurFun.FunctionDone(); @@ -2816,10 +2829,10 @@ // pool references (for things like: 'ret [2 x int] [ int 12, int 42]') ResolvedVal : Types ValueRef { - const Type *Ty = $1.T->get(); + const Type *Ty = $1.PAT->get(); $$.S = $1.S; $$.V = getVal(Ty, $2); - delete $1.T; + delete $1.PAT; } ; @@ -2916,7 +2929,7 @@ const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast($3.T->get())) || + if (!(PFTy = dyn_cast($3.PAT->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; @@ -2932,7 +2945,7 @@ } bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - Ty = FunctionType::get($3.T->get(), ParamTypes, isVarArg, ParamAttrs); + Ty = FunctionType::get($3.PAT->get(), ParamTypes, isVarArg, ParamAttrs); PFTy = PointerType::get(Ty); } Value *V = getVal(PFTy, $4); // Get the function we're calling... @@ -2964,7 +2977,7 @@ $$ = new InvokeInst(V, Normal, Except, Args); } cast($$)->setCallingConv(upgradeCallingConv($2)); - delete $3.T; + delete $3.PAT; delete $6; } | Unwind { @@ -3031,10 +3044,10 @@ PHIList : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes $$.P = new std::list >(); $$.S = $1.S; - Value* tmpVal = getVal($1.T->get(), $3); + Value* tmpVal = getVal($1.PAT->get(), $3); BasicBlock* tmpBB = getBBVal($5); $$.P->push_back(std::make_pair(tmpVal, tmpBB)); - delete $1.T; + delete $1.PAT; } | PHIList ',' '[' ValueRef ',' ValueRef ']' { $$ = $1; @@ -3070,7 +3083,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { - const Type* Ty = $2.T->get(); + const Type* Ty = $2.PAT->get(); if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa(Ty)) error("Arithmetic operator requires integer, FP, or packed operands"); if (isa(Ty) && @@ -3084,10 +3097,10 @@ if ($$.I == 0) error("binary operator returned null"); $$.S = $2.S; - delete $2.T; + delete $2.PAT; } | LogicalOps Types ValueRef ',' ValueRef { - const Type *Ty = $2.T->get(); + const Type *Ty = $2.PAT->get(); if (!Ty->isInteger()) { if (!isa(Ty) || !cast(Ty)->getElementType()->isInteger()) @@ -3100,10 +3113,10 @@ if ($$.I == 0) error("binary operator returned null"); $$.S = $2.S; - delete $2.T; + delete $2.PAT; } | SetCondOps Types ValueRef ',' ValueRef { - const Type* Ty = $2.T->get(); + const Type* Ty = $2.PAT->get(); if(isa(Ty)) error("PackedTypes currently not supported in setcc instructions"); unsigned short pred; @@ -3114,10 +3127,10 @@ if ($$.I == 0) error("binary operator returned null"); $$.S = Unsigned; - delete $2.T; + delete $2.PAT; } | ICMP IPredicates Types ValueRef ',' ValueRef { - const Type *Ty = $3.T->get(); + const Type *Ty = $3.PAT->get(); if (isa(Ty)) error("PackedTypes currently not supported in icmp instructions"); else if (!Ty->isInteger() && !isa(Ty)) @@ -3126,10 +3139,10 @@ Value* tmpVal2 = getVal(Ty, $6); $$.I = new ICmpInst($2, tmpVal1, tmpVal2); $$.S = Unsigned; - delete $3.T; + delete $3.PAT; } | FCMP FPredicates Types ValueRef ',' ValueRef { - const Type *Ty = $3.T->get(); + const Type *Ty = $3.PAT->get(); if (isa(Ty)) error("PackedTypes currently not supported in fcmp instructions"); else if (!Ty->isFloatingPoint()) @@ -3138,7 +3151,7 @@ Value* tmpVal2 = getVal(Ty, $6); $$.I = new FCmpInst($2, tmpVal1, tmpVal2); $$.S = Unsigned; - delete $3.T; + delete $3.PAT; } | NOT ResolvedVal { warning("Use of obsolete 'not' instruction: Replacing with 'xor"); @@ -3170,13 +3183,13 @@ $$.S = $2.S; } | CastOps ResolvedVal TO Types { - const Type *DstTy = $4.T->get(); + const Type *DstTy = $4.PAT->get(); if (!DstTy->isFirstClassType()) error("cast instruction to a non-primitive type: '" + DstTy->getDescription() + "'"); $$.I = cast(getCast($1, $2.V, $2.S, DstTy, $4.S, true)); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal { if (!$2.V->getType()->isInteger() || @@ -3188,15 +3201,15 @@ $$.S = $2.S; } | VAARG ResolvedVal ',' Types { - const Type *Ty = $4.T->get(); + const Type *Ty = $4.PAT->get(); NewVarArgs = true; $$.I = new VAArgInst($2.V, Ty); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | VAARG_old ResolvedVal ',' Types { const Type* ArgTy = $2.V->getType(); - const Type* DstTy = $4.T->get(); + const Type* DstTy = $4.PAT->get(); ObsoleteVarArgs = true; Function* NF = cast(CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0)); @@ -3213,11 +3226,11 @@ CurBB->getInstList().push_back(new StoreInst(bar, foo)); $$.I = new VAArgInst(foo, DstTy); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | VANEXT_old ResolvedVal ',' Types { const Type* ArgTy = $2.V->getType(); - const Type* DstTy = $4.T->get(); + const Type* DstTy = $4.PAT->get(); ObsoleteVarArgs = true; Function* NF = cast(CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0)); @@ -3237,7 +3250,7 @@ CurBB->getInstList().push_back(tmp); $$.I = new LoadInst(foo); $$.S = $4.S; - delete $4.T; + delete $4.PAT; } | EXTRACTELEMENT ResolvedVal ',' ResolvedVal { if (!ExtractElementInst::isValidOperands($2.V, $4.V)) @@ -3278,7 +3291,7 @@ // Handle the short call syntax const PointerType *PFTy; const FunctionType *FTy; - if (!(PFTy = dyn_cast($3.T->get())) || + if (!(PFTy = dyn_cast($3.PAT->get())) || !(FTy = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; @@ -3296,7 +3309,7 @@ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - const Type *RetTy = $3.T->get(); + const Type *RetTy = $3.PAT->get(); if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy) error("Functions cannot return aggregate types"); @@ -3348,7 +3361,7 @@ $$.I = CI; $$.S = $3.S; } - delete $3.T; + delete $3.PAT; delete $6; } | MemoryInst { @@ -3370,28 +3383,28 @@ MemoryInst : MALLOC Types OptCAlign { - const Type *Ty = $2.T->get(); + const Type *Ty = $2.PAT->get(); $$.S = $2.S; $$.I = new MallocInst(Ty, 0, $3); - delete $2.T; + delete $2.PAT; } | MALLOC Types ',' UINT ValueRef OptCAlign { - const Type *Ty = $2.T->get(); + const Type *Ty = $2.PAT->get(); $$.S = $2.S; $$.I = new MallocInst(Ty, getVal($4.T, $5), $6); - delete $2.T; + delete $2.PAT; } | ALLOCA Types OptCAlign { - const Type *Ty = $2.T->get(); + const Type *Ty = $2.PAT->get(); $$.S = $2.S; $$.I = new AllocaInst(Ty, 0, $3); - delete $2.T; + delete $2.PAT; } | ALLOCA Types ',' UINT ValueRef OptCAlign { - const Type *Ty = $2.T->get(); + const Type *Ty = $2.PAT->get(); $$.S = $2.S; $$.I = new AllocaInst(Ty, getVal($4.T, $5), $6); - delete $2.T; + delete $2.PAT; } | FREE ResolvedVal { const Type *PTy = $2.V->getType(); @@ -3401,7 +3414,7 @@ $$.S = Signless; } | OptVolatile LOAD Types ValueRef { - const Type* Ty = $3.T->get(); + const Type* Ty = $3.PAT->get(); $$.S = $3.S; if (!isa(Ty)) error("Can't load from nonpointer type: " + Ty->getDescription()); @@ -3410,24 +3423,35 @@ Ty->getDescription()); Value* tmpVal = getVal(Ty, $4); $$.I = new LoadInst(tmpVal, "", $1); - delete $3.T; + delete $3.PAT; } | OptVolatile STORE ResolvedVal ',' Types ValueRef { - const PointerType *PTy = dyn_cast($5.T->get()); + const PointerType *PTy = dyn_cast($5.PAT->get()); if (!PTy) error("Can't store to a nonpointer type: " + - $5.T->get()->getDescription()); + $5.PAT->get()->getDescription()); const Type *ElTy = PTy->getElementType(); - if (ElTy != $3.V->getType()) - error("Can't store '" + $3.V->getType()->getDescription() + - "' into space of type '" + ElTy->getDescription() + "'"); + Value *StoreVal = $3.V; Value* tmpVal = getVal(PTy, $6); - $$.I = new StoreInst($3.V, tmpVal, $1); + if (ElTy != $3.V->getType()) { + StoreVal = handleSRetFuncTypeMerge($3.V, ElTy); + if (!StoreVal) + error("Can't store '" + $3.V->getType()->getDescription() + + "' into space of type '" + ElTy->getDescription() + "'"); + else { + PTy = PointerType::get(StoreVal->getType()); + if (Constant *C = dyn_cast(tmpVal)) + tmpVal = ConstantExpr::getBitCast(C, PTy); + else + tmpVal = new BitCastInst(tmpVal, PTy, "upgrd.cast", CurBB); + } + } + $$.I = new StoreInst(StoreVal, tmpVal, $1); $$.S = Signless; - delete $5.T; + delete $5.PAT; } | GETELEMENTPTR Types ValueRef IndexList { - const Type* Ty = $2.T->get(); + const Type* Ty = $2.PAT->get(); if (!isa(Ty)) error("getelementptr insn requires pointer operand"); @@ -3437,7 +3461,7 @@ Value* tmpVal = getVal(Ty, $3); $$.I = new GetElementPtrInst(tmpVal, VIndices); $$.S = Signless; - delete $2.T; + delete $2.PAT; delete $4; }; @@ -3447,7 +3471,7 @@ int yyerror(const char *ErrorMsg) { std::string where = std::string((CurFilename == "-") ? std::string("") : CurFilename) - + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": "; + + ":" + llvm::utostr((unsigned) Upgradelineno) + ": "; std::string errMsg = where + "error: " + std::string(ErrorMsg); if (yychar != YYEMPTY && yychar != 0) errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) + @@ -3460,7 +3484,7 @@ void warning(const std::string& ErrorMsg) { std::string where = std::string((CurFilename == "-") ? std::string("") : CurFilename) - + ":" + llvm::utostr((unsigned) Upgradelineno-1) + ": "; + + ":" + llvm::utostr((unsigned) Upgradelineno) + ": "; std::string errMsg = where + "warning: " + std::string(ErrorMsg); if (yychar != YYEMPTY && yychar != 0) errMsg += " while reading token '" + std::string(Upgradetext, Upgradeleng) + From llvm at cs.uiuc.edu Thu Feb 8 02:21:56 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Thu, 8 Feb 2007 02:21:56 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/minisat/ Message-ID: <200702080821.l188Lu02003139@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Benchmarks/minisat: --- Log message: Directory /var/cvs/llvm/llvm-test/MultiSource/Benchmarks/minisat added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From llvm at cs.uiuc.edu Thu Feb 8 02:22:54 2007 From: llvm at cs.uiuc.edu (LLVM) Date: Thu, 8 Feb 2007 02:22:54 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/minisat/mtl/ Message-ID: <200702080822.l188MsXU003169@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Benchmarks/minisat/mtl: --- Log message: Directory /var/cvs/llvm/llvm-test/MultiSource/Benchmarks/minisat/mtl added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From resistor at mac.com Thu Feb 8 02:25:40 2007 From: resistor at mac.com (Owen Anderson) Date: Thu, 8 Feb 2007 02:25:40 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/minisat/mtl/Alg.h BasicHeap.h BoxedVec.h Heap.h Map.h Queue.h SolverTypes.h Sort.h Vec.h Message-ID: <200702080825.l188Pemn003270@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Benchmarks/minisat/mtl: Alg.h added (r1.1) BasicHeap.h added (r1.1) BoxedVec.h added (r1.1) Heap.h added (r1.1) Map.h added (r1.1) Queue.h added (r1.1) SolverTypes.h added (r1.1) Sort.h added (r1.1) Vec.h added (r1.1) --- Log message: Add minisat to the testsuite. This test was recommended by Domagoj Babic. --- Diffs of the changes: (+1094 -0) Alg.h | 57 ++++++++++++++++ BasicHeap.h | 98 ++++++++++++++++++++++++++++ BoxedVec.h | 147 +++++++++++++++++++++++++++++++++++++++++++ Heap.h | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ Map.h | 118 ++++++++++++++++++++++++++++++++++ Queue.h | 82 ++++++++++++++++++++++++ SolverTypes.h | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sort.h | 93 +++++++++++++++++++++++++++ Vec.h | 133 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 1094 insertions(+) Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Alg.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Alg.h:1.1 *** /dev/null Thu Feb 8 02:25:27 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Alg.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,57 ---- + /*******************************************************************************************[Alg.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Alg_h + #define Alg_h + + //================================================================================================= + // Useful functions on vectors + + + #if 1 + template + static inline void remove(V& ts, const T& t) + { + int j = 0; + for (; j < ts.size() && ts[j] != t; j++); + assert(j < ts.size()); + for (; j < ts.size()-1; j++) ts[j] = ts[j+1]; + ts.pop(); + } + #else + template + static inline void remove(V& ts, const T& t) + { + int j = 0; + for (; j < ts.size() && ts[j] != t; j++); + assert(j < ts.size()); + ts[j] = ts.last(); + ts.pop(); + } + #endif + + template + static inline bool find(V& ts, const T& t) + { + int j = 0; + for (; j < ts.size() && ts[j] != t; j++); + return j < ts.size(); + } + + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/BasicHeap.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/BasicHeap.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/BasicHeap.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,98 ---- + /******************************************************************************************[Heap.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef BasicHeap_h + #define BasicHeap_h + + #include "Vec.h" + + //================================================================================================= + // A heap implementation with support for decrease/increase key. + + + template + class BasicHeap { + Comp lt; + vec heap; // heap of ints + + // Index "traversal" functions + static inline int left (int i) { return i*2+1; } + static inline int right (int i) { return (i+1)*2; } + static inline int parent(int i) { return (i-1) >> 1; } + + inline void percolateUp(int i) + { + int x = heap[i]; + while (i != 0 && lt(x, heap[parent(i)])){ + heap[i] = heap[parent(i)]; + i = parent(i); + } + heap [i] = x; + } + + + inline void percolateDown(int i) + { + int x = heap[i]; + while (left(i) < heap.size()){ + int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); + if (!lt(heap[child], x)) break; + heap[i] = heap[child]; + i = child; + } + heap[i] = x; + } + + + bool heapProperty(int i) { + return i >= heap.size() + || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } + + + public: + BasicHeap(const C& c) : comp(c) { } + + int size () const { return heap.size(); } + bool empty () const { return heap.size() == 0; } + int operator[](int index) const { return heap[index+1]; } + void clear (bool dealloc = false) { heap.clear(dealloc); } + void insert (int n) { heap.push(n); percolateUp(heap.size()-1); } + + + int removeMin() { + int r = heap[0]; + heap[0] = heap.last(); + heap.pop(); + if (heap.size() > 1) percolateDown(0); + return r; + } + + + // DEBUG: consistency checking + bool heapProperty() { + return heapProperty(1); } + + + // COMPAT: should be removed + int getmin () { return removeMin(); } + }; + + + //================================================================================================= + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/BoxedVec.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/BoxedVec.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/BoxedVec.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,147 ---- + /*******************************************************************************************[Vec.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef BoxedVec_h + #define BoxedVec_h + + #include + #include + #include + + //================================================================================================= + // Automatically resizable arrays + // + // NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) + + template + class bvec { + + static inline int imin(int x, int y) { + int mask = (x-y) >> (sizeof(int)*8-1); + return (x&mask) + (y&(~mask)); } + + static inline int imax(int x, int y) { + int mask = (y-x) >> (sizeof(int)*8-1); + return (x&mask) + (y&(~mask)); } + + struct Vec_t { + int sz; + int cap; + T data[0]; + + static Vec_t* alloc(Vec_t* x, int size){ + x = (Vec_t*)realloc((void*)x, sizeof(Vec_t) + sizeof(T)*size); + x->cap = size; + return x; + } + + }; + + Vec_t* ref; + + static const int init_size = 2; + static int nextSize (int current) { return (current * 3 + 1) >> 1; } + static int fitSize (int needed) { int x; for (x = init_size; needed > x; x = nextSize(x)); return x; } + + void fill (int size) { + assert(ref != NULL); + for (T* i = ref->data; i < ref->data + size; i++) + new (i) T(); + } + + void fill (int size, const T& pad) { + assert(ref != NULL); + for (T* i = ref->data; i < ref->data + size; i++) + new (i) T(pad); + } + + // Don't allow copying (error prone): + altvec& operator = (altvec& other) { assert(0); } + altvec (altvec& other) { assert(0); } + + public: + void clear (bool dealloc = false) { + if (ref != NULL){ + for (int i = 0; i < ref->sz; i++) + (*ref).data[i].~T(); + + if (dealloc) { + free(ref); ref = NULL; + }else + ref->sz = 0; + } + } + + // Constructors: + altvec(void) : ref (NULL) { } + altvec(int size) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size); ref->sz = size; } + altvec(int size, const T& pad) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size, pad); ref->sz = size; } + ~altvec(void) { clear(true); } + + // Ownership of underlying array: + operator T* (void) { return ref->data; } // (unsafe but convenient) + operator const T* (void) const { return ref->data; } + + // Size operations: + int size (void) const { return ref != NULL ? ref->sz : 0; } + + void pop (void) { assert(ref != NULL && ref->sz > 0); int last = --ref->sz; ref->data[last].~T(); } + void push (const T& elem) { + int size = ref != NULL ? ref->sz : 0; + int cap = ref != NULL ? ref->cap : 0; + if (size == cap){ + cap = cap != 0 ? nextSize(cap) : init_size; + ref = Vec_t::alloc(ref, cap); + } + //new (&ref->data[size]) T(elem); + ref->data[size] = elem; + ref->sz = size+1; + } + + void push () { + int size = ref != NULL ? ref->sz : 0; + int cap = ref != NULL ? ref->cap : 0; + if (size == cap){ + cap = cap != 0 ? nextSize(cap) : init_size; + ref = Vec_t::alloc(ref, cap); + } + new (&ref->data[size]) T(); + ref->sz = size+1; + } + + void shrink (int nelems) { for (int i = 0; i < nelems; i++) pop(); } + void shrink_(int nelems) { for (int i = 0; i < nelems; i++) pop(); } + void growTo (int size) { while (this->size() < size) push(); } + void growTo (int size, const T& pad) { while (this->size() < size) push(pad); } + void capacity (int size) { growTo(size); } + + const T& last (void) const { return ref->data[ref->sz-1]; } + T& last (void) { return ref->data[ref->sz-1]; } + + // Vector interface: + const T& operator [] (int index) const { return ref->data[index]; } + T& operator [] (int index) { return ref->data[index]; } + + void copyTo(altvec& copy) const { copy.clear(); for (int i = 0; i < size(); i++) copy.push(ref->data[i]); } + void moveTo(altvec& dest) { dest.clear(true); dest.ref = ref; ref = NULL; } + + }; + + + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Heap.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Heap.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Heap.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,169 ---- + /******************************************************************************************[Heap.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Heap_h + #define Heap_h + + #include "Vec.h" + + //================================================================================================= + // A heap implementation with support for decrease/increase key. + + + template + class Heap { + Comp lt; + vec heap; // heap of ints + vec indices; // int -> index in heap + + // Index "traversal" functions + static inline int left (int i) { return i*2+1; } + static inline int right (int i) { return (i+1)*2; } + static inline int parent(int i) { return (i-1) >> 1; } + + + inline void percolateUp(int i) + { + int x = heap[i]; + while (i != 0 && lt(x, heap[parent(i)])){ + heap[i] = heap[parent(i)]; + indices[heap[i]] = i; + i = parent(i); + } + heap [i] = x; + indices[x] = i; + } + + + inline void percolateDown(int i) + { + int x = heap[i]; + while (left(i) < heap.size()){ + int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); + if (!lt(heap[child], x)) break; + heap[i] = heap[child]; + indices[heap[i]] = i; + i = child; + } + heap [i] = x; + indices[x] = i; + } + + + bool heapProperty (int i) const { + return i >= heap.size() + || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } + + + public: + Heap(const Comp& c) : lt(c) { } + + int size () const { return heap.size(); } + bool empty () const { return heap.size() == 0; } + bool inHeap (int n) const { return n < indices.size() && indices[n] >= 0; } + int operator[](int index) const { assert(index < heap.size()); return heap[index]; } + + void decrease (int n) { assert(inHeap(n)); percolateUp(indices[n]); } + + // RENAME WHEN THE DEPRECATED INCREASE IS REMOVED. + void increase_ (int n) { assert(inHeap(n)); percolateDown(indices[n]); } + + + void insert(int n) + { + indices.growTo(n+1, -1); + assert(!inHeap(n)); + + indices[n] = heap.size(); + heap.push(n); + percolateUp(indices[n]); + } + + + int removeMin() + { + int x = heap[0]; + heap[0] = heap.last(); + indices[heap[0]] = 0; + indices[x] = -1; + heap.pop(); + if (heap.size() > 1) percolateDown(0); + return x; + } + + + void clear(bool dealloc = false) + { + for (int i = 0; i < heap.size(); i++) + indices[heap[i]] = -1; + #ifdef NDEBUG + for (int i = 0; i < indices.size(); i++) + assert(indices[i] == -1); + #endif + heap.clear(dealloc); + } + + + // Fool proof variant of insert/decrease/increase + void update (int n) + { + if (!inHeap(n)) + insert(n); + else { + percolateUp(indices[n]); + percolateDown(indices[n]); + } + } + + + // Delete elements from the heap using a given filter function (-object). + // *** this could probaly be replaced with a more general "buildHeap(vec&)" method *** + template + void filter(const F& filt) { + int i,j; + for (i = j = 0; i < heap.size(); i++) + if (filt(heap[i])){ + heap[j] = heap[i]; + indices[heap[i]] = j++; + }else + indices[heap[i]] = -1; + + heap.shrink(i - j); + for (int i = heap.size() / 2 - 1; i >= 0; i--) + percolateDown(i); + + assert(heapProperty()); + } + + + // DEBUG: consistency checking + bool heapProperty() const { + return heapProperty(1); } + + + // COMPAT: should be removed + void setBounds (int n) { } + void increase (int n) { decrease(n); } + int getmin () { return removeMin(); } + + }; + + + //================================================================================================= + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Map.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Map.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Map.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,118 ---- + /*******************************************************************************************[Map.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Map_h + #define Map_h + + #include + + #include "Vec.h" + + //================================================================================================= + // Default hash/equals functions + // + + template struct Hash { uint32_t operator()(const K& k) const { return hash(k); } }; + template struct Equal { bool operator()(const K& k1, const K& k2) const { return k1 == k2; } }; + + template struct DeepHash { uint32_t operator()(const K* k) const { return hash(*k); } }; + template struct DeepEqual { bool operator()(const K* k1, const K* k2) const { return *k1 == *k2; } }; + + //================================================================================================= + // Some primes + // + + static const int nprimes = 25; + static const int primes [nprimes] = { 31, 73, 151, 313, 643, 1291, 2593, 5233, 10501, 21013, 42073, 84181, 168451, 337219, 674701, 1349473, 2699299, 5398891, 10798093, 21596719, 43193641, 86387383, 172775299, 345550609, 691101253 }; + + //================================================================================================= + // Hash table implementation of Maps + // + + template, class E = Equal > + class Map { + struct Pair { K key; D data; }; + + H hash; + E equals; + + vec* table; + int cap; + int size; + + // Don't allow copying (error prone): + Map& operator = (Map& other) { assert(0); } + Map (Map& other) { assert(0); } + + int32_t index (const K& k) const { return hash(k) % cap; } + void _insert (const K& k, const D& d) { table[index(k)].push(); table[index(k)].last().key = k; table[index(k)].last().data = d; } + void rehash () { + const vec* old = table; + + int newsize = primes[0]; + for (int i = 1; newsize <= cap && i < nprimes; i++) + newsize = primes[i]; + + table = new vec[newsize]; + + for (int i = 0; i < cap; i++){ + for (int j = 0; j < old[i].size(); j++){ + _insert(old[i][j].key, old[i][j].data); }} + + delete [] old; + + cap = newsize; + } + + + public: + + Map () : table(NULL), cap(0), size(0) {} + Map (const H& h, const E& e) : Map(), hash(h), equals(e) {} + ~Map () { delete [] table; } + + void insert (const K& k, const D& d) { if (size+1 > cap / 2) rehash(); _insert(k, d); size++; } + bool peek (const K& k, D& d) { + if (size == 0) return false; + const vec& ps = table[index(k)]; + for (int i = 0; i < ps.size(); i++) + if (equals(ps[i].key, k)){ + d = ps[i].data; + return true; } + return false; + } + + void remove (const K& k) { + assert(table != NULL); + vec& ps = table[index(k)]; + int j = 0; + for (; j < ps.size() && !equals(ps[j].key, k); j++); + assert(j < ps.size()); + ps[j] = ps.last(); + ps.pop(); + } + + void clear () { + cap = size = 0; + delete [] table; + table = NULL; + } + }; + + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Queue.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Queue.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Queue.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,82 ---- + /*****************************************************************************************[Queue.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Queue_h + #define Queue_h + + #include "Vec.h" + + //================================================================================================= + + + template + class Queue { + vec elems; + int first; + + public: + Queue(void) : first(0) { } + + void insert(T x) { elems.push(x); } + T peek () const { return elems[first]; } + void pop () { first++; } + + void clear(bool dealloc = false) { elems.clear(dealloc); first = 0; } + int size(void) { return elems.size() - first; } + + //bool has(T x) { for (int i = first; i < elems.size(); i++) if (elems[i] == x) return true; return false; } + + const T& operator [] (int index) const { return elems[first + index]; } + + }; + + //template + //class Queue { + // vec buf; + // int first; + // int end; + // + //public: + // typedef T Key; + // + // Queue() : buf(1), first(0), end(0) {} + // + // void clear () { buf.shrinkTo(1); first = end = 0; } + // int size () { return (end >= first) ? end - first : end - first + buf.size(); } + // + // T peek () { assert(first != end); return buf[first]; } + // void pop () { assert(first != end); first++; if (first == buf.size()) first = 0; } + // void insert(T elem) { // INVARIANT: buf[end] is always unused + // buf[end++] = elem; + // if (end == buf.size()) end = 0; + // if (first == end){ // Resize: + // vec tmp((buf.size()*3 + 1) >> 1); + // //**/printf("queue alloc: %d elems (%.1f MB)\n", tmp.size(), tmp.size() * sizeof(T) / 1000000.0); + // int i = 0; + // for (int j = first; j < buf.size(); j++) tmp[i++] = buf[j]; + // for (int j = 0 ; j < end ; j++) tmp[i++] = buf[j]; + // first = 0; + // end = buf.size(); + // tmp.moveTo(buf); + // } + // } + //}; + + //================================================================================================= + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/SolverTypes.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/SolverTypes.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/SolverTypes.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,197 ---- + /***********************************************************************************[SolverTypes.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + + #ifndef SolverTypes_h + #define SolverTypes_h + + #include + #include + + //================================================================================================= + // Variables, literals, lifted booleans, clauses: + + + // NOTE! Variables are just integers. No abstraction here. They should be chosen from 0..N, + // so that they can be used as array indices. + + typedef int Var; + #define var_Undef (-1) + + + class Lit { + int x; + public: + Lit() : x(2*var_Undef) { } // (lit_Undef) + explicit Lit(Var var, bool sign = false) : x((var+var) + (int)sign) { } + + // Don't use these for constructing/deconstructing literals. Use the normal constructors instead. + friend int toInt (Lit p); // Guarantees small, positive integers suitable for array indexing. + friend Lit toLit (int i); // Inverse of 'toInt()' + friend Lit operator ~(Lit p); + friend bool sign (Lit p); + friend int var (Lit p); + friend Lit unsign (Lit p); + friend Lit id (Lit p, bool sgn); + + bool operator == (Lit p) const { return x == p.x; } + bool operator != (Lit p) const { return x != p.x; } + bool operator < (Lit p) const { return x < p.x; } // '<' guarantees that p, ~p are adjacent in the ordering. + }; + + inline int toInt (Lit p) { return p.x; } + inline Lit toLit (int i) { Lit p; p.x = i; return p; } + inline Lit operator ~(Lit p) { Lit q; q.x = p.x ^ 1; return q; } + inline bool sign (Lit p) { return p.x & 1; } + inline int var (Lit p) { return p.x >> 1; } + inline Lit unsign (Lit p) { Lit q; q.x = p.x & ~1; return q; } + inline Lit id (Lit p, bool sgn) { Lit q; q.x = p.x ^ (int)sgn; return q; } + + const Lit lit_Undef(var_Undef, false); // }- Useful special constants. + const Lit lit_Error(var_Undef, true ); // } + + + //================================================================================================= + // Lifted booleans: + + + class lbool { + char value; + explicit lbool(int v) : value(v) { } + + public: + lbool() : value(0) { } + lbool(bool x) : value((int)x*2-1) { } + int toInt(void) const { return value; } + + bool operator == (lbool b) const { return value == b.value; } + bool operator != (lbool b) const { return value != b.value; } + lbool operator ^ (bool b) const { return b ? lbool(-value) : lbool(value); } + + friend int toInt (lbool l); + friend lbool toLbool(int v); + }; + inline int toInt (lbool l) { return l.toInt(); } + inline lbool toLbool(int v) { return lbool(v); } + + const lbool l_True = toLbool( 1); + const lbool l_False = toLbool(-1); + const lbool l_Undef = toLbool( 0); + + //================================================================================================= + // Clause -- a simple class for representing a clause: + + + class Clause { + uint32_t size_etc; + union { float act; uint32_t abst; } extra; + Lit data[0]; + + public: + void calcAbstraction() { + uint32_t abstraction = 0; + for (int i = 0; i < size(); i++) + abstraction |= 1 << (var(data[i]) & 31); + extra.abst = abstraction; } + + // NOTE: This constructor cannot be used directly (doesn't allocate enough memory). + template + Clause(const V& ps, bool learnt) { + size_etc = (ps.size() << 3) | (uint32_t)learnt; + for (int i = 0; i < ps.size(); i++) data[i] = ps[i]; + if (learnt) extra.act = 0; else calcAbstraction(); } + + // -- use this function instead: + template + friend Clause* Clause_new(const V& ps, bool learnt = false) { + assert(sizeof(Lit) == sizeof(uint32_t)); + assert(sizeof(float) == sizeof(uint32_t)); + void* mem = malloc(sizeof(Clause) + sizeof(uint32_t)*(ps.size())); + return new (mem) Clause(ps, learnt); } + + int size () const { return size_etc >> 3; } + void shrink (int i) { assert(i <= size()); size_etc = (((size_etc >> 3) - i) << 3) | (size_etc & 7); } + void pop () { shrink(1); } + bool learnt () const { return size_etc & 1; } + uint32_t mark () const { return (size_etc >> 1) & 3; } + void mark (uint32_t m) { size_etc = (size_etc & ~6) | ((m & 3) << 1); } + const Lit& last () const { return data[size()-1]; } + + // NOTE: somewhat unsafe to change the clause in-place! Must manually call 'calcAbstraction' afterwards for + // subsumption operations to behave correctly. + Lit& operator [] (int i) { return data[i]; } + Lit operator [] (int i) const { return data[i]; } + operator const Lit* (void) const { return data; } + + float& activity () { return extra.act; } + uint32_t abstraction () const { return extra.abst; } + + Lit subsumes (const Clause& other) const; + void strengthen (Lit p); + }; + + + /*_________________________________________________________________________________________________ + | + | subsumes : (other : const Clause&) -> Lit + | + | Description: + | Checks if clause subsumes 'other', and at the same time, if it can be used to simplify 'other' + | by subsumption resolution. + | + | Result: + | lit_Error - No subsumption or simplification + | lit_Undef - Clause subsumes 'other' + | p - The literal p can be deleted from 'other' + |________________________________________________________________________________________________@*/ + inline Lit Clause::subsumes(const Clause& other) const + { + if (other.size() < size() || (extra.abst & ~other.extra.abst) != 0) + return lit_Error; + + Lit ret = lit_Undef; + const Lit* c = (const Lit*)(*this); + const Lit* d = (const Lit*)other; + + for (int i = 0; i < size(); i++) { + // search for c[i] or ~c[i] + for (int j = 0; j < other.size(); j++) + if (c[i] == d[j]) + goto ok; + else if (ret == lit_Undef && c[i] == ~d[j]){ + ret = c[i]; + goto ok; + } + + // did not find it + return lit_Error; + ok:; + } + + return ret; + } + + + inline void Clause::strengthen(Lit p) + { + remove(*this, p); + calcAbstraction(); + } + + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Sort.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Sort.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Sort.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,93 ---- + /******************************************************************************************[Sort.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Sort_h + #define Sort_h + + #include "Vec.h" + + //================================================================================================= + // Some sorting algorithms for vec's + + + template + struct LessThan_default { + bool operator () (T x, T y) { return x < y; } + }; + + + template + void selectionSort(T* array, int size, LessThan lt) + { + int i, j, best_i; + T tmp; + + for (i = 0; i < size-1; i++){ + best_i = i; + for (j = i+1; j < size; j++){ + if (lt(array[j], array[best_i])) + best_i = j; + } + tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; + } + } + template static inline void selectionSort(T* array, int size) { + selectionSort(array, size, LessThan_default()); } + + template + void sort(T* array, int size, LessThan lt) + { + if (size <= 15) + selectionSort(array, size, lt); + + else{ + T pivot = array[size / 2]; + T tmp; + int i = -1; + int j = size; + + for(;;){ + do i++; while(lt(array[i], pivot)); + do j--; while(lt(pivot, array[j])); + + if (i >= j) break; + + tmp = array[i]; array[i] = array[j]; array[j] = tmp; + } + + sort(array , i , lt); + sort(&array[i], size-i, lt); + } + } + template static inline void sort(T* array, int size) { + sort(array, size, LessThan_default()); } + + + //================================================================================================= + // For 'vec's: + + + template void sort(vec& v, LessThan lt) { + sort((T*)v, v.size(), lt); } + template void sort(vec& v) { + sort(v, LessThan_default()); } + + + //================================================================================================= + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/mtl/Vec.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/mtl/Vec.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/mtl/Vec.h Thu Feb 8 02:25:17 2007 *************** *** 0 **** --- 1,133 ---- + /*******************************************************************************************[Vec.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Vec_h + #define Vec_h + + #include + #include + #include + + //================================================================================================= + // Automatically resizable arrays + // + // NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) + + template + class vec { + T* data; + int sz; + int cap; + + void init(int size, const T& pad); + void grow(int min_cap); + + // Don't allow copying (error prone): + vec& operator = (vec& other) { assert(0); return *this; } + vec (vec& other) { assert(0); } + + static inline int imin(int x, int y) { + int mask = (x-y) >> (sizeof(int)*8-1); + return (x&mask) + (y&(~mask)); } + + static inline int imax(int x, int y) { + int mask = (y-x) >> (sizeof(int)*8-1); + return (x&mask) + (y&(~mask)); } + + public: + // Types: + typedef int Key; + typedef T Datum; + + // Constructors: + vec(void) : data(NULL) , sz(0) , cap(0) { } + vec(int size) : data(NULL) , sz(0) , cap(0) { growTo(size); } + vec(int size, const T& pad) : data(NULL) , sz(0) , cap(0) { growTo(size, pad); } + vec(T* array, int size) : data(array), sz(size), cap(size) { } // (takes ownership of array -- will be deallocated with 'free()') + ~vec(void) { clear(true); } + + // Ownership of underlying array: + T* release (void) { T* ret = data; data = NULL; sz = 0; cap = 0; return ret; } + operator T* (void) { return data; } // (unsafe but convenient) + operator const T* (void) const { return data; } + + // Size operations: + int size (void) const { return sz; } + void shrink (int nelems) { assert(nelems <= sz); for (int i = 0; i < nelems; i++) sz--, data[sz].~T(); } + void shrink_(int nelems) { assert(nelems <= sz); sz -= nelems; } + void pop (void) { sz--, data[sz].~T(); } + void growTo (int size); + void growTo (int size, const T& pad); + void clear (bool dealloc = false); + void capacity (int size) { grow(size); } + + // Stack interface: + #if 1 + void push (void) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } new (&data[sz]) T(); sz++; } + //void push (const T& elem) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } new (&data[sz]) T(elem); sz++; } + void push (const T& elem) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } data[sz++] = elem; } + void push_ (const T& elem) { assert(sz < cap); data[sz++] = elem; } + #else + void push (void) { if (sz == cap) grow(sz+1); new (&data[sz]) T() ; sz++; } + void push (const T& elem) { if (sz == cap) grow(sz+1); new (&data[sz]) T(elem); sz++; } + #endif + + const T& last (void) const { return data[sz-1]; } + T& last (void) { return data[sz-1]; } + + // Vector interface: + const T& operator [] (int index) const { return data[index]; } + T& operator [] (int index) { return data[index]; } + + + // Duplicatation (preferred instead): + void copyTo(vec& copy) const { copy.clear(); copy.growTo(sz); for (int i = 0; i < sz; i++) new (©[i]) T(data[i]); } + void moveTo(vec& dest) { dest.clear(true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; } + }; + + template + void vec::grow(int min_cap) { + if (min_cap <= cap) return; + if (cap == 0) cap = (min_cap >= 2) ? min_cap : 2; + else do cap = (cap*3+1) >> 1; while (cap < min_cap); + data = (T*)realloc(data, cap * sizeof(T)); } + + template + void vec::growTo(int size, const T& pad) { + if (sz >= size) return; + grow(size); + for (int i = sz; i < size; i++) new (&data[i]) T(pad); + sz = size; } + + template + void vec::growTo(int size) { + if (sz >= size) return; + grow(size); + for (int i = sz; i < size; i++) new (&data[i]) T(); + sz = size; } + + template + void vec::clear(bool dealloc) { + if (data != NULL){ + for (int i = 0; i < sz; i++) data[i].~T(); + sz = 0; + if (dealloc) free(data), data = NULL, cap = 0; } } + + + #endif From resistor at mac.com Thu Feb 8 02:25:42 2007 From: resistor at mac.com (Owen Anderson) Date: Thu, 8 Feb 2007 02:25:42 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/minisat/LICENSE Main.cpp Makefile Solver.cpp Solver.h long.cnf short.cnf Message-ID: <200702080825.l188Pgv8003278@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Benchmarks/minisat: LICENSE added (r1.1) Main.cpp added (r1.1) Makefile added (r1.1) Solver.cpp added (r1.1) Solver.h added (r1.1) long.cnf added (r1.1) short.cnf added (r1.1) --- Log message: Add minisat to the testsuite. This test was recommended by Domagoj Babic. --- Diffs of the changes: (+438370 -0) LICENSE | 20 Main.cpp | 331 Makefile | 8 Solver.cpp | 729 Solver.h | 302 long.cnf |218638 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ short.cnf |218342 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 438370 insertions(+) Index: llvm-test/MultiSource/Benchmarks/minisat/LICENSE diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/LICENSE:1.1 *** /dev/null Thu Feb 8 02:25:27 2007 --- llvm-test/MultiSource/Benchmarks/minisat/LICENSE Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,20 ---- + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Index: llvm-test/MultiSource/Benchmarks/minisat/Main.cpp diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/Main.cpp:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/Main.cpp Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,331 ---- + /******************************************************************************************[Main.C] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #include + #include + #include + #include + + #include + + #include "Solver.h" + + /*************************************************************************************/ + #ifdef _MSC_VER + #include + + static inline double cpuTime(void) { + return (double)clock() / CLOCKS_PER_SEC; } + #else + + #include + #include + #include + + static inline double cpuTime(void) { + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + return (double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec / 1000000; } + #endif + + + #if defined(__linux__) + static inline int memReadStat(int field) + { + char name[256]; + pid_t pid = getpid(); + sprintf(name, "/proc/%d/statm", pid); + FILE* in = fopen(name, "rb"); + if (in == NULL) return 0; + int value; + for (; field >= 0; field--) + fscanf(in, "%d", &value); + fclose(in); + return value; + } + static inline uint64_t memUsed() { return (uint64_t)memReadStat(0) * (uint64_t)getpagesize(); } + + + #elif defined(__FreeBSD__) + static inline uint64_t memUsed(void) { + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + return ru.ru_maxrss*1024; } + + + #else + static inline uint64_t memUsed() { return 0; } + #endif + + #if defined(__linux__) + #include + #endif + + //================================================================================================= + // DIMACS Parser: + + #define CHUNK_LIMIT 1048576 + + class StreamBuffer { + FILE* in; + char buf[CHUNK_LIMIT]; + int pos; + int size; + + void assureLookahead() { + if (pos >= size) { + pos = 0; + size = fread(buf, 1, sizeof(buf), in); } } + + public: + StreamBuffer(FILE* i) : in(i), pos(0), size(0) { + assureLookahead(); } + + int operator * () { return (pos >= size) ? EOF : buf[pos]; } + void operator ++ () { pos++; assureLookahead(); } + }; + + //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + template + static void skipWhitespace(B& in) { + while ((*in >= 9 && *in <= 13) || *in == 32) + ++in; } + + template + static void skipLine(B& in) { + for (;;){ + if (*in == EOF || *in == '\0') return; + if (*in == '\n') { ++in; return; } + ++in; } } + + template + static int parseInt(B& in) { + int val = 0; + bool neg = false; + skipWhitespace(in); + if (*in == '-') neg = true, ++in; + else if (*in == '+') ++in; + if (*in < '0' || *in > '9') reportf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3); + while (*in >= '0' && *in <= '9') + val = val*10 + (*in - '0'), + ++in; + return neg ? -val : val; } + + template + static void readClause(B& in, Solver& S, vec& lits) { + int parsed_lit, var; + lits.clear(); + for (;;){ + parsed_lit = parseInt(in); + if (parsed_lit == 0) break; + var = abs(parsed_lit)-1; + while (var >= S.nVars()) S.newVar(); + lits.push( (parsed_lit > 0) ? Lit(var) : ~Lit(var) ); + } + } + + template + static bool match(B& in, char* str) { + for (; *str != 0; ++str, ++in) + if (*str != *in) + return false; + return true; + } + + + template + static void parse_DIMACS_main(B& in, Solver& S) { + vec lits; + for (;;){ + skipWhitespace(in); + if (*in == EOF) + break; + else if (*in == 'p'){ + if (match(in, "p cnf")){ + int vars = parseInt(in); + int clauses = parseInt(in); + }else{ + reportf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3); + } + } else if (*in == 'c' || *in == 'p') + skipLine(in); + else + readClause(in, S, lits), + S.addClause(lits); + } + } + + // Inserts problem into solver. + // + static void parse_DIMACS(FILE* input_stream, Solver& S) { + StreamBuffer in(input_stream); + parse_DIMACS_main(in, S); } + + + //================================================================================================= + + + void printStats(Solver& solver) + { + double cpu_time = cpuTime(); + uint64_t mem_used = memUsed(); + reportf("restarts : %lld\n", solver.starts); + reportf("conflicts : %-12lld (%.0f /sec)\n", solver.conflicts , solver.conflicts /cpu_time); + reportf("decisions : %-12lld (%4.2f %% random) (%.0f /sec)\n", solver.decisions, (float)solver.rnd_decisions*100 / (float)solver.decisions, solver.decisions /cpu_time); + reportf("propagations : %-12lld (%.0f /sec)\n", solver.propagations, solver.propagations/cpu_time); + reportf("conflict literals : %-12lld (%4.2f %% deleted)\n", solver.tot_literals, (solver.max_literals - solver.tot_literals)*100 / (double)solver.max_literals); + if (mem_used != 0) reportf("Memory used : %.2f MB\n", mem_used / 1048576.0); + reportf("CPU time : %g s\n", cpu_time); + } + + Solver* solver; + static void SIGINT_handler(int signum) { + reportf("\n"); reportf("*** INTERRUPTED ***\n"); + printStats(*solver); + reportf("\n"); reportf("*** INTERRUPTED ***\n"); + exit(1); } + + + //================================================================================================= + // Main: + + void printUsage(char** argv) + { + reportf("USAGE: %s [options] \n\n where input may be either in plain or gzipped DIMACS.\n\n", argv[0]); + reportf("OPTIONS:\n\n"); + reportf(" -polarity-mode = {true,false,rnd}\n"); + reportf(" -decay = [ 0 - 1 ]\n"); + reportf(" -rnd-freq = [ 0 - 1 ]\n"); + reportf(" -verbosity = {0,1,2}\n"); + reportf("\n"); + } + + + const char* hasPrefix(const char* str, const char* prefix) + { + int len = strlen(prefix); + if (strncmp(str, prefix, len) == 0) + return str + len; + else + return NULL; + } + + + int main(int argc, char** argv) + { + Solver S; + S.verbosity = 1; + + + int i, j; + const char* value; + for (i = j = 0; i < argc; i++){ + if ((value = hasPrefix(argv[i], "-polarity-mode="))){ + if (strcmp(value, "true") == 0) + S.polarity_mode = Solver::polarity_true; + else if (strcmp(value, "false") == 0) + S.polarity_mode = Solver::polarity_false; + else if (strcmp(value, "rnd") == 0) + S.polarity_mode = Solver::polarity_rnd; + else{ + reportf("ERROR! unknown polarity-mode %s\n", value); + exit(0); } + + }else if ((value = hasPrefix(argv[i], "-rnd-freq="))){ + double rnd; + if (sscanf(value, "%lf", &rnd) <= 0 || rnd < 0 || rnd > 1){ + reportf("ERROR! illegal rnd-freq constant %s\n", value); + exit(0); } + S.random_var_freq = rnd; + + }else if ((value = hasPrefix(argv[i], "-decay="))){ + double decay; + if (sscanf(value, "%lf", &decay) <= 0 || decay <= 0 || decay > 1){ + reportf("ERROR! illegal decay constant %s\n", value); + exit(0); } + S.var_decay = 1 / decay; + + }else if ((value = hasPrefix(argv[i], "-verbosity="))){ + int verbosity = (int)strtol(value, NULL, 10); + if (verbosity == 0 && errno == EINVAL){ + reportf("ERROR! illegal verbosity level %s\n", value); + exit(0); } + S.verbosity = verbosity; + + }else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0){ + printUsage(argv); + exit(0); + + }else if (strncmp(argv[i], "-", 1) == 0){ + reportf("ERROR! unknown flag %s\n", argv[i]); + exit(0); + + }else + argv[j++] = argv[i]; + } + argc = j; + + + #if defined(__linux__) + fpu_control_t oldcw, newcw; + _FPU_GETCW(oldcw); newcw = (oldcw & ~_FPU_EXTENDED) | _FPU_DOUBLE; _FPU_SETCW(newcw); + reportf("WARNING: for repeatability, setting FPU to use double precision\n"); + #endif + double cpu_time = cpuTime(); + + solver = &S; + signal(SIGINT,SIGINT_handler); + signal(SIGHUP,SIGINT_handler); + + if (argc == 1) + reportf("Reading from standard input... Use '-h' or '--help' for help.\n"); + + FILE* in = fopen(argv[1], "rb"); + if (in == NULL) + reportf("ERROR! Could not open file: %s\n", argc == 1 ? "" : argv[1]), exit(1); + + parse_DIMACS(in, S);; + FILE* res = (argc >= 3) ? fopen(argv[2], "wb") : NULL; + + if (!S.simplify()){ + reportf("Solved by unit propagation\n"); + if (res != NULL) fprintf(res, "UNSAT\n"), fclose(res); + printf("UNSATISFIABLE\n"); + exit(20); + } + + bool ret = S.solve(); + printf(ret ? "SATISFIABLE\n" : "UNSATISFIABLE\n"); + if (res != NULL){ + if (ret){ + fprintf(res, "SAT\n"); + for (int i = 0; i < S.nVars(); i++) + if (S.model[i] != l_Undef) + fprintf(res, "%s%s%d", (i==0)?"":" ", (S.model[i]==l_True)?"":"-", i+1); + fprintf(res, " 0\n"); + }else + fprintf(res, "UNSAT\n"); + fclose(res); + } + + #ifdef NDEBUG + exit(ret ? 10 : 20); // (faster than "return", which will invoke the destructor for 'Solver') + #endif + } Index: llvm-test/MultiSource/Benchmarks/minisat/Makefile diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/Makefile:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/Makefile Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,8 ---- + # MultiSource/minisat Makefile: Build all subdirectories automatically + + LEVEL = ../../.. + PROG = minisat + CPPFLAGS = -D NDEBUG -Imtl + RUN_OPTIONS = long.cnf + + include ../../Makefile.multisrc Index: llvm-test/MultiSource/Benchmarks/minisat/Solver.cpp diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/Solver.cpp:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/Solver.cpp Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,729 ---- + /****************************************************************************************[Solver.C] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #include "Solver.h" + #include "Sort.h" + #include + + + //================================================================================================= + // Constructor/Destructor: + + + Solver::Solver() : + + // Parameters: (formerly in 'SearchParams') + var_decay(1 / 0.95), clause_decay(1 / 0.999), random_var_freq(0.02) + , restart_first(100), restart_inc(1.5), learntsize_factor((double)1/(double)3), learntsize_inc(1.1) + + // More parameters: + // + , expensive_ccmin (true) + , polarity_mode (polarity_false) + , verbosity (0) + + // Statistics: (formerly in 'SolverStats') + // + , starts(0), decisions(0), rnd_decisions(0), propagations(0), conflicts(0) + , clauses_literals(0), learnts_literals(0), max_literals(0), tot_literals(0) + + , ok (true) + , cla_inc (1) + , var_inc (1) + , qhead (0) + , simpDB_assigns (-1) + , simpDB_props (0) + , order_heap (VarOrderLt(activity)) + , random_seed (91648253) + , progress_estimate(0) + , remove_satisfied (true) + {} + + + Solver::~Solver() + { + for (int i = 0; i < learnts.size(); i++) free(learnts[i]); + for (int i = 0; i < clauses.size(); i++) free(clauses[i]); + } + + + //================================================================================================= + // Minor methods: + + + // Creates a new SAT variable in the solver. If 'decision_var' is cleared, variable will not be + // used as a decision variable (NOTE! This has effects on the meaning of a SATISFIABLE result). + // + Var Solver::newVar(bool sign, bool dvar) + { + int v = nVars(); + watches .push(); // (list for positive literal) + watches .push(); // (list for negative literal) + reason .push(NULL); + assigns .push(toInt(l_Undef)); + level .push(-1); + activity .push(0); + seen .push(0); + + polarity .push((char)sign); + decision_var.push((char)dvar); + + insertVarOrder(v); + return v; + } + + + bool Solver::addClause(vec& ps) + { + assert(decisionLevel() == 0); + + if (!ok) + return false; + else{ + // Check if clause is satisfied and remove false/duplicate literals: + sort(ps); + Lit p; int i, j; + for (i = j = 0, p = lit_Undef; i < ps.size(); i++) + if (value(ps[i]) == l_True || ps[i] == ~p) + return true; + else if (value(ps[i]) != l_False && ps[i] != p) + ps[j++] = p = ps[i]; + ps.shrink(i - j); + } + + if (ps.size() == 0) + return ok = false; + else if (ps.size() == 1){ + assert(value(ps[0]) == l_Undef); + uncheckedEnqueue(ps[0]); + return ok = (propagate() == NULL); + }else{ + Clause* c = Clause_new(ps, false); + clauses.push(c); + attachClause(*c); + } + + return true; + } + + + void Solver::attachClause(Clause& c) { + assert(c.size() > 1); + watches[toInt(~c[0])].push(&c); + watches[toInt(~c[1])].push(&c); + if (c.learnt()) learnts_literals += c.size(); + else clauses_literals += c.size(); } + + + void Solver::detachClause(Clause& c) { + assert(c.size() > 1); + assert(find(watches[toInt(~c[0])], &c)); + assert(find(watches[toInt(~c[1])], &c)); + remove(watches[toInt(~c[0])], &c); + remove(watches[toInt(~c[1])], &c); + if (c.learnt()) learnts_literals -= c.size(); + else clauses_literals -= c.size(); } + + + void Solver::removeClause(Clause& c) { + detachClause(c); + free(&c); } + + + bool Solver::satisfied(const Clause& c) const { + for (int i = 0; i < c.size(); i++) + if (value(c[i]) == l_True) + return true; + return false; } + + + // Revert to the state at given level (keeping all assignment at 'level' but not beyond). + // + void Solver::cancelUntil(int level) { + if (decisionLevel() > level){ + for (int c = trail.size()-1; c >= trail_lim[level]; c--){ + Var x = var(trail[c]); + assigns[x] = toInt(l_Undef); + insertVarOrder(x); } + qhead = trail_lim[level]; + trail.shrink(trail.size() - trail_lim[level]); + trail_lim.shrink(trail_lim.size() - level); + } } + + + //================================================================================================= + // Major methods: + + + Lit Solver::pickBranchLit(int polarity_mode, double random_var_freq) + { + Var next = var_Undef; + + // Random decision: + if (drand(random_seed) < random_var_freq && !order_heap.empty()){ + next = order_heap[irand(random_seed,order_heap.size())]; + if (toLbool(assigns[next]) == l_Undef && decision_var[next]) + rnd_decisions++; } + + // Activity based decision: + while (next == var_Undef || toLbool(assigns[next]) != l_Undef || !decision_var[next]) + if (order_heap.empty()){ + next = var_Undef; + break; + }else + next = order_heap.removeMin(); + + bool sign = false; + switch (polarity_mode){ + case polarity_true: sign = false; break; + case polarity_false: sign = true; break; + case polarity_user: sign = polarity[next]; break; + case polarity_rnd: sign = irand(random_seed, 2); break; + default: assert(false); } + + return next == var_Undef ? lit_Undef : Lit(next, sign); + } + + + /*_________________________________________________________________________________________________ + | + | analyze : (confl : Clause*) (out_learnt : vec&) (out_btlevel : int&) -> [void] + | + | Description: + | Analyze conflict and produce a reason clause. + | + | Pre-conditions: + | * 'out_learnt' is assumed to be cleared. + | * Current decision level must be greater than root level. + | + | Post-conditions: + | * 'out_learnt[0]' is the asserting literal at level 'out_btlevel'. + | + | Effect: + | Will undo part of the trail, upto but not beyond the assumption of the current decision level. + |________________________________________________________________________________________________@*/ + void Solver::analyze(Clause* confl, vec& out_learnt, int& out_btlevel) + { + int pathC = 0; + Lit p = lit_Undef; + + // Generate conflict clause: + // + out_learnt.push(); // (leave room for the asserting literal) + int index = trail.size() - 1; + out_btlevel = 0; + + do{ + assert(confl != NULL); // (otherwise should be UIP) + Clause& c = *confl; + + if (c.learnt()) + claBumpActivity(c); + + for (int j = (p == lit_Undef) ? 0 : 1; j < c.size(); j++){ + Lit q = c[j]; + + if (!seen[var(q)] && level[var(q)] > 0){ + varBumpActivity(var(q)); + seen[var(q)] = 1; + if (level[var(q)] >= decisionLevel()) + pathC++; + else{ + out_learnt.push(q); + if (level[var(q)] > out_btlevel) + out_btlevel = level[var(q)]; + } + } + } + + // Select next clause to look at: + while (!seen[var(trail[index--])]); + p = trail[index+1]; + confl = reason[var(p)]; + seen[var(p)] = 0; + pathC--; + + }while (pathC > 0); + out_learnt[0] = ~p; + + // Simplify conflict clause: + // + int i, j; + if (expensive_ccmin){ + uint32_t abstract_level = 0; + for (i = 1; i < out_learnt.size(); i++) + abstract_level |= abstractLevel(var(out_learnt[i])); // (maintain an abstraction of levels involved in conflict) + + out_learnt.copyTo(analyze_toclear); + for (i = j = 1; i < out_learnt.size(); i++) + if (reason[var(out_learnt[i])] == NULL || !litRedundant(out_learnt[i], abstract_level)) + out_learnt[j++] = out_learnt[i]; + }else{ + out_learnt.copyTo(analyze_toclear); + for (i = j = 1; i < out_learnt.size(); i++){ + Clause& c = *reason[var(out_learnt[i])]; + for (int k = 1; k < c.size(); k++) + if (!seen[var(c[k])] && level[var(c[k])] > 0){ + out_learnt[j++] = out_learnt[i]; + break; } + } + } + max_literals += out_learnt.size(); + out_learnt.shrink(i - j); + tot_literals += out_learnt.size(); + + // Find correct backtrack level: + // + if (out_learnt.size() == 1) + out_btlevel = 0; + else{ + int max_i = 1; + for (int i = 2; i < out_learnt.size(); i++) + if (level[var(out_learnt[i])] > level[var(out_learnt[max_i])]) + max_i = i; + Lit p = out_learnt[max_i]; + out_learnt[max_i] = out_learnt[1]; + out_learnt[1] = p; + out_btlevel = level[var(p)]; + } + + + for (int j = 0; j < analyze_toclear.size(); j++) seen[var(analyze_toclear[j])] = 0; // ('seen[]' is now cleared) + } + + + // Check if 'p' can be removed. 'abstract_levels' is used to abort early if the algorithm is + // visiting literals at levels that cannot be removed later. + bool Solver::litRedundant(Lit p, uint32_t abstract_levels) + { + analyze_stack.clear(); analyze_stack.push(p); + int top = analyze_toclear.size(); + while (analyze_stack.size() > 0){ + assert(reason[var(analyze_stack.last())] != NULL); + Clause& c = *reason[var(analyze_stack.last())]; analyze_stack.pop(); + + for (int i = 1; i < c.size(); i++){ + Lit p = c[i]; + if (!seen[var(p)] && level[var(p)] > 0){ + if (reason[var(p)] != NULL && (abstractLevel(var(p)) & abstract_levels) != 0){ + seen[var(p)] = 1; + analyze_stack.push(p); + analyze_toclear.push(p); + }else{ + for (int j = top; j < analyze_toclear.size(); j++) + seen[var(analyze_toclear[j])] = 0; + analyze_toclear.shrink(analyze_toclear.size() - top); + return false; + } + } + } + } + + return true; + } + + + /*_________________________________________________________________________________________________ + | + | analyzeFinal : (p : Lit) -> [void] + | + | Description: + | Specialized analysis procedure to express the final conflict in terms of assumptions. + | Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and + | stores the result in 'out_conflict'. + |________________________________________________________________________________________________@*/ + void Solver::analyzeFinal(Lit p, vec& out_conflict) + { + out_conflict.clear(); + out_conflict.push(p); + + if (decisionLevel() == 0) + return; + + seen[var(p)] = 1; + + for (int i = trail.size()-1; i >= trail_lim[0]; i--){ + Var x = var(trail[i]); + if (seen[x]){ + if (reason[x] == NULL){ + assert(level[x] > 0); + out_conflict.push(~trail[i]); + }else{ + Clause& c = *reason[x]; + for (int j = 1; j < c.size(); j++) + if (level[var(c[j])] > 0) + seen[var(c[j])] = 1; + } + seen[x] = 0; + } + } + + seen[var(p)] = 0; + } + + + void Solver::uncheckedEnqueue(Lit p, Clause* from) + { + assert(value(p) == l_Undef); + assigns [var(p)] = toInt(lbool(!sign(p))); // <<== abstract but not uttermost effecient + level [var(p)] = decisionLevel(); + reason [var(p)] = from; + trail.push(p); + } + + + /*_________________________________________________________________________________________________ + | + | propagate : [void] -> [Clause*] + | + | Description: + | Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned, + | otherwise NULL. + | + | Post-conditions: + | * the propagation queue is empty, even if there was a conflict. + |________________________________________________________________________________________________@*/ + Clause* Solver::propagate() + { + Clause* confl = NULL; + int num_props = 0; + + while (qhead < trail.size()){ + Lit p = trail[qhead++]; // 'p' is enqueued fact to propagate. + vec& ws = watches[toInt(p)]; + Clause **i, **j, **end; + num_props++; + + for (i = j = (Clause**)ws, end = i + ws.size(); i != end;){ + Clause& c = **i++; + + // Make sure the false literal is data[1]: + Lit false_lit = ~p; + if (c[0] == false_lit) + c[0] = c[1], c[1] = false_lit; + + assert(c[1] == false_lit); + + // If 0th watch is true, then clause is already satisfied. + Lit first = c[0]; + if (value(first) == l_True){ + *j++ = &c; + }else{ + // Look for new watch: + for (int k = 2; k < c.size(); k++) + if (value(c[k]) != l_False){ + c[1] = c[k]; c[k] = false_lit; + watches[toInt(~c[1])].push(&c); + goto FoundWatch; } + + // Did not find watch -- clause is unit under assignment: + *j++ = &c; + if (value(first) == l_False){ + confl = &c; + qhead = trail.size(); + // Copy the remaining watches: + while (i < end) + *j++ = *i++; + }else + uncheckedEnqueue(first, &c); + } + FoundWatch:; + } + ws.shrink(i - j); + } + propagations += num_props; + simpDB_props -= num_props; + + return confl; + } + + /*_________________________________________________________________________________________________ + | + | reduceDB : () -> [void] + | + | Description: + | Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked + | clauses are clauses that are reason to some assignment. Binary clauses are never removed. + |________________________________________________________________________________________________@*/ + struct reduceDB_lt { bool operator () (Clause* x, Clause* y) { return x->size() > 2 && (y->size() == 2 || x->activity() < y->activity()); } }; + void Solver::reduceDB() + { + int i, j; + double extra_lim = cla_inc / learnts.size(); // Remove any clause below this activity + + sort(learnts, reduceDB_lt()); + for (i = j = 0; i < learnts.size() / 2; i++){ + if (learnts[i]->size() > 2 && !locked(*learnts[i])) + removeClause(*learnts[i]); + else + learnts[j++] = learnts[i]; + } + for (; i < learnts.size(); i++){ + if (learnts[i]->size() > 2 && !locked(*learnts[i]) && learnts[i]->activity() < extra_lim) + removeClause(*learnts[i]); + else + learnts[j++] = learnts[i]; + } + learnts.shrink(i - j); + } + + + void Solver::removeSatisfied(vec& cs) + { + int i,j; + for (i = j = 0; i < cs.size(); i++){ + if (satisfied(*cs[i])) + removeClause(*cs[i]); + else + cs[j++] = cs[i]; + } + cs.shrink(i - j); + } + + + /*_________________________________________________________________________________________________ + | + | simplify : [void] -> [bool] + | + | Description: + | Simplify the clause database according to the current top-level assigment. Currently, the only + | thing done here is the removal of satisfied clauses, but more things can be put here. + |________________________________________________________________________________________________@*/ + bool Solver::simplify() + { + assert(decisionLevel() == 0); + + if (!ok || propagate() != NULL) + return ok = false; + + if (nAssigns() == simpDB_assigns || (simpDB_props > 0)) + return true; + + // Remove satisfied clauses: + removeSatisfied(learnts); + if (remove_satisfied) // Can be turned off. + removeSatisfied(clauses); + + // Remove fixed variables from the variable heap: + order_heap.filter(VarFilter(*this)); + + simpDB_assigns = nAssigns(); + simpDB_props = clauses_literals + learnts_literals; // (shouldn't depend on stats really, but it will do for now) + + return true; + } + + + /*_________________________________________________________________________________________________ + | + | search : (nof_conflicts : int) (nof_learnts : int) (params : const SearchParams&) -> [lbool] + | + | Description: + | Search for a model the specified number of conflicts, keeping the number of learnt clauses + | below the provided limit. NOTE! Use negative value for 'nof_conflicts' or 'nof_learnts' to + | indicate infinity. + | + | Output: + | 'l_True' if a partial assigment that is consistent with respect to the clauseset is found. If + | all variables are decision variables, this means that the clause set is satisfiable. 'l_False' + | if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached. + |________________________________________________________________________________________________@*/ + lbool Solver::search(int nof_conflicts, int nof_learnts) + { + assert(ok); + int backtrack_level; + int conflictC = 0; + vec learnt_clause; + + starts++; + + bool first = true; + + for (;;){ + Clause* confl = propagate(); + if (confl != NULL){ + // CONFLICT + conflicts++; conflictC++; + if (decisionLevel() == 0) return l_False; + + first = false; + + learnt_clause.clear(); + analyze(confl, learnt_clause, backtrack_level); + cancelUntil(backtrack_level); + assert(value(learnt_clause[0]) == l_Undef); + + if (learnt_clause.size() == 1){ + uncheckedEnqueue(learnt_clause[0]); + }else{ + Clause* c = Clause_new(learnt_clause, true); + learnts.push(c); + attachClause(*c); + claBumpActivity(*c); + uncheckedEnqueue(learnt_clause[0], c); + } + + varDecayActivity(); + claDecayActivity(); + + }else{ + // NO CONFLICT + + if (nof_conflicts >= 0 && conflictC >= nof_conflicts){ + // Reached bound on number of conflicts: + progress_estimate = progressEstimate(); + cancelUntil(0); + return l_Undef; } + + // Simplify the set of problem clauses: + if (decisionLevel() == 0 && !simplify()) + return l_False; + + if (nof_learnts >= 0 && learnts.size()-nAssigns() >= nof_learnts) + // Reduce the set of learnt clauses: + reduceDB(); + + Lit next = lit_Undef; + while (decisionLevel() < assumptions.size()){ + // Perform user provided assumption: + Lit p = assumptions[decisionLevel()]; + if (value(p) == l_True){ + // Dummy decision level: + newDecisionLevel(); + }else if (value(p) == l_False){ + analyzeFinal(~p, conflict); + return l_False; + }else{ + next = p; + break; + } + } + + if (next == lit_Undef){ + // New variable decision: + decisions++; + next = pickBranchLit(polarity_mode, random_var_freq); + + if (next == lit_Undef) + // Model found: + return l_True; + } + + // Increase decision level and enqueue 'next' + assert(value(next) == l_Undef); + newDecisionLevel(); + uncheckedEnqueue(next); + } + } + } + + + double Solver::progressEstimate() const + { + double progress = 0; + double F = 1.0 / nVars(); + + for (int i = 0; i <= decisionLevel(); i++){ + int beg = i == 0 ? 0 : trail_lim[i - 1]; + int end = i == decisionLevel() ? trail.size() : trail_lim[i]; + progress += pow(F, i) * (end - beg); + } + + return progress / nVars(); + } + + + bool Solver::solve(const vec& assumps) + { + model.clear(); + conflict.clear(); + + if (!ok) return false; + + assumps.copyTo(assumptions); + + double nof_conflicts = restart_first; + double nof_learnts = nClauses() * learntsize_factor; + lbool status = l_Undef; + + // Search: + while (status == l_Undef){ + status = search((int)nof_conflicts, (int)nof_learnts); + nof_conflicts *= restart_inc; + nof_learnts *= learntsize_inc; + } + + + if (status == l_True){ + // Extend & copy model: + model.growTo(nVars()); + for (int i = 0; i < nVars(); i++) model[i] = value(i); + #ifndef NDEBUG + verifyModel(); + #endif + }else{ + assert(status == l_False); + if (conflict.size() == 0) + ok = false; + } + + cancelUntil(0); + return status == l_True; + } + + //================================================================================================= + // Debug methods: + + + void Solver::verifyModel() + { + bool failed = false; + for (int i = 0; i < clauses.size(); i++){ + assert(clauses[i]->mark() == 0); + Clause& c = *clauses[i]; + for (int j = 0; j < c.size(); j++) + if (modelValue(c[j]) == l_True) + goto next; + + reportf("unsatisfied clause: "); + printClause(*clauses[i]); + reportf("\n"); + failed = true; + next:; + } + + assert(!failed); + + reportf("Verified %d original clauses.\n", clauses.size()); + } + + + void Solver::checkLiteralCount() + { + // Check that sizes are calculated correctly: + int cnt = 0; + for (int i = 0; i < clauses.size(); i++) + if (clauses[i]->mark() == 0) + cnt += clauses[i]->size(); + + if ((int)clauses_literals != cnt){ + fprintf(stderr, "literal count: %d, real value = %d\n", (int)clauses_literals, cnt); + assert((int)clauses_literals == cnt); + } + } Index: llvm-test/MultiSource/Benchmarks/minisat/Solver.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/Solver.h:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/Solver.h Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,302 ---- + /****************************************************************************************[Solver.h] + MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **************************************************************************************************/ + + #ifndef Solver_h + #define Solver_h + + #include + + #include "Vec.h" + #include "Heap.h" + #include "Alg.h" + + #include "SolverTypes.h" + + + //================================================================================================= + // Solver -- the main class: + + + class Solver { + public: + + // Constructor/Destructor: + // + Solver(); + ~Solver(); + + // Problem specification: + // + Var newVar (bool polarity = true, bool dvar = true); // Add a new variable with parameters specifying variable mode. + bool addClause (vec& ps); // Add a clause to the solver. NOTE! 'ps' may be shrunk by this method! + + // Solving: + // + bool simplify (); // Removes already satisfied clauses. + bool solve (const vec& assumps); // Search for a model that respects a given set of assumptions. + bool solve (); // Search without assumptions. + bool okay () const; // FALSE means solver is in a conflicting state + + // Variable mode: + // + void setPolarity (Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'. + void setDecisionVar (Var v, bool b); // Declare if a variable should be eligible for selection in the decision heuristic. + + // Read state: + // + lbool value (Var x) const; // The current value of a variable. + lbool value (Lit p) const; // The current value of a literal. + lbool modelValue (Lit p) const; // The value of a literal in the last model. The last call to solve must have been satisfiable. + int nAssigns () const; // The current number of assigned literals. + int nClauses () const; // The current number of original clauses. + int nLearnts () const; // The current number of learnt clauses. + int nVars () const; // The current number of variables. + + // Extra results: (read-only member variable) + // + vec model; // If problem is satisfiable, this vector contains the model (if any). + vec conflict; // If problem is unsatisfiable (possibly under assumptions), + // this vector represent the final conflict clause expressed in the assumptions. + + // Mode of operation: + // + double var_decay; // Inverse of the variable activity decay factor. (default 1 / 0.95) + double clause_decay; // Inverse of the clause activity decay factor. (1 / 0.999) + double random_var_freq; // The frequency with which the decision heuristic tries to choose a random variable. (default 0.02) + int restart_first; // The initial restart limit. (default 100) + double restart_inc; // The factor with which the restart limit is multiplied in each restart. (default 1.5) + double learntsize_factor; // The intitial limit for learnt clauses is a factor of the original clauses. (default 1 / 3) + double learntsize_inc; // The limit for learnt clauses is multiplied with this factor each restart. (default 1.1) + bool expensive_ccmin; // Controls conflict clause minimization. (default TRUE) + int polarity_mode; // Controls which polarity the decision heuristic chooses. See enum below for allowed modes. (default polarity_false) + int verbosity; // Verbosity level. 0=silent, 1=some progress report (default 0) + + enum { polarity_true = 0, polarity_false = 1, polarity_user = 2, polarity_rnd = 3 }; + + // Statistics: (read-only member variable) + // + uint64_t starts, decisions, rnd_decisions, propagations, conflicts; + uint64_t clauses_literals, learnts_literals, max_literals, tot_literals; + + protected: + + // Helper structures: + // + struct VarOrderLt { + const vec& activity; + bool operator () (Var x, Var y) const { return activity[x] > activity[y]; } + VarOrderLt(const vec& act) : activity(act) { } + }; + + friend class VarFilter; + struct VarFilter { + const Solver& s; + VarFilter(const Solver& _s) : s(_s) {} + bool operator()(Var v) const { return toLbool(s.assigns[v]) == l_Undef && s.decision_var[v]; } + }; + + // Solver state: + // + bool ok; // If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used! + vec clauses; // List of problem clauses. + vec learnts; // List of learnt clauses. + double cla_inc; // Amount to bump next clause with. + vec activity; // A heuristic measurement of the activity of a variable. + double var_inc; // Amount to bump next variable with. + vec > watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true). + vec assigns; // The current assignments (lbool:s stored as char:s). + vec polarity; // The preferred polarity of each variable. + vec decision_var; // Declares if a variable is eligible for selection in the decision heuristic. + vec trail; // Assignment stack; stores all assigments made in the order they were made. + vec trail_lim; // Separator indices for different decision levels in 'trail'. + vec reason; // 'reason[var]' is the clause that implied the variables current value, or 'NULL' if none. + vec level; // 'level[var]' contains the level at which the assignment was made. + int qhead; // Head of queue (as index into the trail -- no more explicit propagation queue in MiniSat). + int simpDB_assigns; // Number of top-level assignments since last execution of 'simplify()'. + int64_t simpDB_props; // Remaining number of propagations that must be made before next execution of 'simplify()'. + vec assumptions; // Current set of assumptions provided to solve by the user. + Heap order_heap; // A priority queue of variables ordered with respect to the variable activity. + double random_seed; // Used by the random variable selection. + double progress_estimate;// Set by 'search()'. + bool remove_satisfied; // Indicates whether possibly inefficient linear scan for satisfied clauses should be performed in 'simplify'. + + // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is + // used, exept 'seen' wich is used in several places. + // + vec seen; + vec analyze_stack; + vec analyze_toclear; + vec add_tmp; + + // Main internal methods: + // + void insertVarOrder (Var x); // Insert a variable in the decision order priority queue. + Lit pickBranchLit (int polarity_mode, double random_var_freq); // Return the next decision variable. + void newDecisionLevel (); // Begins a new decision level. + void uncheckedEnqueue (Lit p, Clause* from = NULL); // Enqueue a literal. Assumes value of literal is undefined. + bool enqueue (Lit p, Clause* from = NULL); // Test if fact 'p' contradicts current state, enqueue otherwise. + Clause* propagate (); // Perform unit propagation. Returns possibly conflicting clause. + void cancelUntil (int level); // Backtrack until a certain level. + void analyze (Clause* confl, vec& out_learnt, int& out_btlevel); // (bt = backtrack) + void analyzeFinal (Lit p, vec& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION? + bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()') + lbool search (int nof_conflicts, int nof_learnts); // Search for a given number of conflicts. + void reduceDB (); // Reduce the set of learnt clauses. + void removeSatisfied (vec& cs); // Shrink 'cs' to contain only non-satisfied clauses. + + // Maintaining Variable/Clause activity: + // + void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead. + void varBumpActivity (Var v); // Increase a variable with the current 'bump' value. + void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead. + void claBumpActivity (Clause& c); // Increase a clause with the current 'bump' value. + + // Operations on clauses: + // + void attachClause (Clause& c); // Attach a clause to watcher lists. + void detachClause (Clause& c); // Detach a clause to watcher lists. + void removeClause (Clause& c); // Detach and free a clause. + bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state. + bool satisfied (const Clause& c) const; // Returns TRUE if a clause is satisfied in the current state. + + // Misc: + // + int decisionLevel () const; // Gives the current decisionlevel. + uint32_t abstractLevel (Var x) const; // Used to represent an abstraction of sets of decision levels. + double progressEstimate () const; // DELETE THIS ?? IT'S NOT VERY USEFUL ... + + // Debug: + void printLit (Lit l); + template + void printClause (const C& c); + void verifyModel (); + void checkLiteralCount(); + + // Static helpers: + // + + // Returns a random float 0 <= x < 1. Seed must never be 0. + static inline double drand(double& seed) { + seed *= 1389796; + int q = (int)(seed / 2147483647); + seed -= (double)q * 2147483647; + return seed / 2147483647; } + + // Returns a random integer 0 <= x < size. Seed must never be 0. + static inline int irand(double& seed, int size) { + return (int)(drand(seed) * size); } + }; + + + //================================================================================================= + // Implementation of inline methods: + + + inline void Solver::insertVarOrder(Var x) { + if (!order_heap.inHeap(x) && decision_var[x]) order_heap.insert(x); } + + inline void Solver::varDecayActivity() { var_inc *= var_decay; } + inline void Solver::varBumpActivity(Var v) { + if ( (activity[v] += var_inc) > 1e100 ) { + // Rescale: + for (int i = 0; i < nVars(); i++) + activity[i] *= 1e-100; + var_inc *= 1e-100; } + + // Update order_heap with respect to new activity: + if (order_heap.inHeap(v)) + order_heap.decrease(v); } + + inline void Solver::claDecayActivity() { cla_inc *= clause_decay; } + inline void Solver::claBumpActivity (Clause& c) { + if ( (c.activity() += cla_inc) > 1e20 ) { + // Rescale: + for (int i = 0; i < learnts.size(); i++) + learnts[i]->activity() *= 1e-20; + cla_inc *= 1e-20; } } + + inline bool Solver::enqueue (Lit p, Clause* from) { return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); } + inline bool Solver::locked (const Clause& c) const { return reason[var(c[0])] == &c && value(c[0]) == l_True; } + inline void Solver::newDecisionLevel() { trail_lim.push(trail.size()); } + + inline int Solver::decisionLevel () const { return trail_lim.size(); } + inline uint32_t Solver::abstractLevel (Var x) const { return 1 << (level[x] & 31); } + inline lbool Solver::value (Var x) const { return toLbool(assigns[x]); } + inline lbool Solver::value (Lit p) const { return toLbool(assigns[var(p)]) ^ sign(p); } + inline lbool Solver::modelValue (Lit p) const { return model[var(p)] ^ sign(p); } + inline int Solver::nAssigns () const { return trail.size(); } + inline int Solver::nClauses () const { return clauses.size(); } + inline int Solver::nLearnts () const { return learnts.size(); } + inline int Solver::nVars () const { return assigns.size(); } + inline void Solver::setPolarity (Var v, bool b) { polarity [v] = (char)b; } + inline void Solver::setDecisionVar(Var v, bool b) { decision_var[v] = (char)b; if (b) { insertVarOrder(v); } } + inline bool Solver::solve () { vec tmp; return solve(tmp); } + inline bool Solver::okay () const { return ok; } + + + + //================================================================================================= + // Debug + etc: + + + #define reportf(format, args...) ( fflush(stdout), fprintf(stderr, format, ## args), fflush(stderr) ) + + static inline void logLit(FILE* f, Lit l) + { + fprintf(f, "%sx%d", sign(l) ? "~" : "", var(l)+1); + } + + static inline void logLits(FILE* f, const vec& ls) + { + fprintf(f, "[ "); + if (ls.size() > 0){ + logLit(f, ls[0]); + for (int i = 1; i < ls.size(); i++){ + fprintf(f, ", "); + logLit(f, ls[i]); + } + } + fprintf(f, "] "); + } + + static inline const char* showBool(bool b) { return b ? "true" : "false"; } + + + // Just like 'assert()' but expression will be evaluated in the release version as well. + static inline void check(bool expr) { assert(expr); } + + + inline void Solver::printLit(Lit l) + { + reportf("%s%d:%c", sign(l) ? "-" : "", var(l)+1, value(l) == l_True ? '1' : (value(l) == l_False ? '0' : 'X')); + } + + + template + inline void Solver::printClause(const C& c) + { + for (int i = 0; i < c.size(); i++){ + printLit(c[i]); + fprintf(stderr, " "); + } + } + + + //================================================================================================= + #endif Index: llvm-test/MultiSource/Benchmarks/minisat/long.cnf diff -c /dev/null llvm-test/MultiSource/Benchmarks/minisat/long.cnf:1.1 *** /dev/null Thu Feb 8 02:25:40 2007 --- llvm-test/MultiSource/Benchmarks/minisat/long.cnf Thu Feb 8 02:25:16 2007 *************** *** 0 **** --- 1,218638 ---- + c Software verification instances generated by + c Calysto static checker. For more information + c contact Domagoj Babic (Google for my email). + c Verified property: + c NULL ptr dereference check + c Location in code: /work/benchmarks/SOURCES/HyperSAT/datas.h:792 + p cnf 65993 218631 + 1 0 + -2 0 + 35 0 + -36 0 + -37 0 + -38 0 + -39 0 + -40 0 + -41 0 + -42 0 + -43 0 + -44 0 + -45 0 + -46 0 + -47 0 + -48 0 + -49 0 + -50 0 + -51 0 + -52 0 + -53 0 + -54 0 + -55 0 + -56 0 + -57 0 + -58 0 + -59 0 + -60 0 + -61 0 + -62 0 + -63 0 + -64 0 + -65 0 + -66 0 + -100 0 + 101 0 + 102 0 + 103 0 + 104 0 + 105 0 + 106 0 + 107 0 + 108 0 + 109 0 + 110 0 + 111 0 + 112 0 + 113 0 + 114 0 + 115 0 + 116 0 + 117 0 + 118 0 + 119 0 + 120 0 + 121 0 + 122 0 + 123 0 + 124 0 + 125 0 + 126 0 + 127 0 + 128 0 + 129 0 + 130 0 + 131 0 + -134 0 + 389 0 + 422 0 + 423 0 + 424 0 + 425 0 + 426 0 + 427 0 + 428 0 + 429 0 + 430 0 + 431 0 + 432 0 + 433 0 + 434 0 + 435 0 + 436 0 + 437 0 + 438 0 + 439 0 + 440 0 + 441 0 + 442 0 + 443 0 + 444 0 + 445 0 + 446 0 + 447 0 + 448 0 + 449 0 + 450 0 + 451 0 + 452 0 + 453 0 + -584 0 + -585 0 + -586 0 + -587 0 + -588 0 + -589 0 + -590 0 + -591 0 + -592 0 + -593 0 + -594 0 + -595 0 + -596 0 + -597 0 + -598 0 + -599 0 + -600 0 + -601 0 + -602 0 + -603 0 + -604 0 + -605 0 + -606 0 + -607 0 + -608 0 + -609 0 + -610 0 + -611 0 + -612 0 + -613 0 + -614 0 + -1097 0 + -1098 0 + -1099 0 + -1100 0 + -1101 0 + -1102 0 + -1103 0 + -1104 0 + -1105 0 + -1106 0 + -1107 0 + -1108 0 + -1109 0 + -1110 0 + -1111 0 + -1112 0 + -1113 0 + -1114 0 + -1115 0 + -1116 0 + -1117 0 + -1118 0 + -1119 0 + -1120 0 + -1121 0 + -1122 0 + -1123 0 + -1124 0 + -1125 0 + -1126 0 + -1127 0 + -1128 0 + -1526 0 + -1685 0 + -1686 0 + -1687 0 + -1688 0 + -1689 0 + -1690 0 + -1691 0 + -1692 0 + -1693 0 + -1694 0 + -1695 0 + -1696 0 + -1697 0 + -1698 0 + -1699 0 + -1700 0 + -1701 0 + -1702 0 + -1703 0 + -1704 0 + -1705 0 + -1706 0 + -1707 0 + -1708 0 + -1709 0 + -1710 0 + -1711 0 + -1712 0 + -1713 0 + -1714 0 + -1715 0 + -1716 0 + 1750 0 + 1751 0 + 1752 0 + 1753 0 + 1754 0 + 1755 0 + 1756 0 + 1757 0 + 1758 0 + 1759 0 + 1760 0 + 1761 0 + 1762 0 + 1763 0 + 1764 0 + 1765 0 + 1766 0 + 1767 0 + 1768 0 + 1769 0 + 1770 0 + 1771 0 + 1772 0 + 1773 0 + 1774 0 + 1775 0 + 1776 0 + 1777 0 + 1778 0 + 1779 0 + 1780 0 + 1781 0 + -1915 0 + -1916 0 + -1917 0 + -1918 0 + -1919 0 + -1920 0 + -1921 0 + -1922 0 + -1923 0 + -1924 0 + -1925 0 + -1926 0 + -1927 0 + -1928 0 + -1929 0 + -1930 0 + -1931 0 + -1932 0 + -1933 0 + -1934 0 + -1935 0 + -1936 0 + -1937 0 + -1938 0 + -1939 0 + -1940 0 + -1941 0 + -1942 0 + -1943 0 + -1944 0 + -1945 0 + -1946 0 + -2044 0 + -2142 0 + 2143 0 + -2144 0 + -2145 0 + -2146 0 + -2147 0 + -2148 0 + -2149 0 + -2150 0 + -2151 0 + -2152 0 + -2153 0 + -2154 0 + -2155 0 + -2156 0 + -2157 0 + -2158 0 + -2159 0 + -2160 0 + -2161 0 + -2162 0 + -2163 0 + -2164 0 + -2165 0 + -2166 0 + -2167 0 + -2168 0 + -2169 0 + -2170 0 + -2171 0 + -2172 0 + -2173 0 + -2239 0 + -2240 0 + -2241 0 + -2242 0 + -2243 0 + 2244 0 + -2245 0 + -2246 0 + -2248 0 + -2249 0 + -2250 0 + -2251 0 + -2252 0 + -2253 0 + -2254 0 + -2255 0 + -2256 0 + -2257 0 + -2258 0 + -2259 0 + -2260 0 + -2261 0 + -2262 0 + -2263 0 + -2264 0 + -2265 0 + -2266 0 + -2267 0 + -2268 0 + -2269 0 + -2270 0 + -2271 0 + -2272 0 + -2273 0 + -2274 0 + -2275 0 + -2276 0 + -2277 0 + -2278 0 + -2279 0 + -2280 0 + -2281 0 + -2282 0 + -2283 0 + -2284 0 + -2285 0 + -2286 0 + -2287 0 + -2288 0 + -2289 0 + -2290 0 + -2291 0 + -2292 0 + -2293 0 + -2294 0 + -2295 0 + -2296 0 + -2297 0 + -2298 0 + -2299 0 + -2300 0 + -2301 0 + -2302 0 + -2303 0 + -2304 0 + -2305 0 + -2306 0 + -2307 0 + -2308 0 + -2309 0 + -2310 0 + 2313 0 + 2314 0 + 2315 0 + 2316 0 + 2317 0 + 2318 0 + 2319 0 + 2320 0 + 2321 0 + 2322 0 + 2323 0 + 2324 0 + 2325 0 + 2326 0 + 2327 0 + 2328 0 + 2329 0 + 2330 0 + 2331 0 + 2332 0 + 2333 0 + 2334 0 + 2335 0 + 2336 0 + 2337 0 + 2338 0 + 2339 0 + 2340 0 + 2341 0 + 2342 0 + 2343 0 + 2698 0 + 2699 0 + 2700 0 + 2701 0 + 2702 0 + 2703 0 + 2704 0 + 2705 0 + 2706 0 + 2707 0 + 2708 0 + 2709 0 + 2710 0 + 2711 0 + 2712 0 + 2713 0 + 2714 0 + 2715 0 + 2716 0 + 2717 0 + 2718 0 + 2719 0 + 2720 0 + 2721 0 + 2722 0 + 2723 0 + 2724 0 + 2725 0 + 2726 0 + 2727 0 + 2728 0 + 2729 0 + -2763 0 + -2955 0 + 3147 0 + 3148 0 + 3149 0 + 3150 0 + 3151 0 + 3152 0 + 3153 0 + 3154 0 + 3155 0 + 3156 0 + 3157 0 + 3158 0 + 3159 0 + 3160 0 + 3161 0 + 3162 0 + 3163 0 + 3164 0 + 3165 0 + 3166 0 + 3167 0 + 3168 0 + 3169 0 + 3170 0 + 3171 0 + 3172 0 + 3173 0 + 3174 0 + 3175 0 + 3176 0 + 3177 0 + 3178 0 + -3340 0 + -3341 0 + -3342 0 + 3343 0 + -3344 0 + -3345 0 + -3346 0 + -3347 0 + 3356 0 + -3357 0 + -3358 0 + -3359 0 + -3360 0 + -3361 0 + -3362 0 + -3363 0 + -3371 0 + -3379 0 + -3380 0 + -3381 0 + -3382 0 + -3383 0 + -3384 0 + -3385 0 + -3386 0 + -3387 0 + -3388 0 + -3389 0 + -3390 0 + -3391 0 + -3392 0 + -3393 0 + -3394 0 + -3395 0 + -3396 0 + -3397 0 + -3398 0 + -3399 0 + -3400 0 + -3401 0 + -3402 0 + -3403 0 + 3600 0 + 3601 0 + 3602 0 + 3603 0 + 3604 0 + 3605 0 + 3606 0 + 3607 0 + 3608 0 + 3609 0 + 3610 0 + 3611 0 + 3612 0 + 3613 0 + 3614 0 + 3615 0 + 3616 0 + 3617 0 + 3618 0 + 3619 0 + 3620 0 + 3621 0 + 3622 0 + 3623 0 + 3624 0 + 3625 0 + 3626 0 + 3627 0 + 3628 0 + 3629 0 + 3630 0 + 3631 0 + 3767 0 + 3768 0 + 3769 0 + 3770 0 + 3771 0 + 3772 0 + 3773 0 + 3774 0 + 3775 0 + 3776 0 + 3777 0 + 3778 0 + 3779 0 + 3780 0 + 3781 0 + 3782 0 + 3783 0 + 3784 0 + 3785 0 + 3786 0 + 3787 0 + 3788 0 + 3789 0 + 3790 0 + 3791 0 + 3792 0 + 3793 0 + 3794 0 + 3795 0 + 3796 0 + 3797 0 + 3831 0 + 3832 0 + 3833 0 + 3834 0 + 3835 0 + 3836 0 + 3837 0 + -3838 0 + -3839 0 + -3840 0 + -3841 0 + -3842 0 + -3843 0 + -3844 0 + -3845 0 + -3846 0 + -3847 0 + -3848 0 + -3849 0 + -3850 0 + -3851 0 + -3852 0 + -3853 0 + -3854 0 + -3855 0 + -3856 0 + -3857 0 + -3858 0 + -3859 0 + -3860 0 + -3861 0 + -3862 0 + -3929 0 + -3930 0 + -3931 0 + -3932 0 + -3933 0 + -3934 0 + -3935 0 + -3936 0 + -3937 0 + -3938 0 + -3939 0 + -3940 0 + -3941 0 + -3942 0 + -3943 0 + -3944 0 + -3945 0 + -3946 0 + -3947 0 + -3948 0 + -3949 0 + -3950 0 + -3951 0 + -3952 0 + -3953 0 + -3954 0 + -3955 0 + -3956 0 + -3957 0 + -3958 0 + -3959 0 + 3962 0 + 3963 0 + 3964 0 + 3965 0 + 3966 0 + 3967 0 + 3968 0 + 3969 0 + 3970 0 + 3971 0 + 3972 0 + 3973 0 + 3974 0 + 3975 0 + 3976 0 + 3977 0 + 3978 0 + 3979 0 + 3980 0 + 3981 0 + 3982 0 + 3983 0 + 3984 0 + 3985 0 + 3986 0 + 3987 0 + 3988 0 + 3989 0 + 3990 0 + 3991 0 + 3992 0 + -4483 0 + -4484 0 + -4485 0 + -4486 0 + -4487 0 + -4488 0 + 4489 0 + -4490 0 + -4556 0 + -4557 0 + -4558 0 + -4559 0 + -4560 0 + -4561 0 + -4562 0 + -4563 0 + -4564 0 + -4565 0 + -4566 0 + -4567 0 + -4568 0 + -4569 0 + -4570 0 + -4571 0 + -4572 0 + -4573 0 + -4574 0 + -4575 0 + -4576 0 + -4577 0 + -4578 0 + -4579 0 + -4580 0 + -4581 0 + -4582 0 + -4583 0 + -4584 0 + -4585 0 + -4586 0 + -4620 0 + -4623 0 + -4625 0 + -4624 0 + -4626 0 + -4627 0 + -4629 0 + -4628 0 + -4630 0 + -4589 0 + -4631 0 + -4633 0 + -4632 0 + -4634 0 + -4590 0 + -4635 0 + -4637 0 + -4636 0 + -4638 0 + -4591 0 + -4639 0 + -4641 0 + -4640 0 + -4642 0 + -4592 0 + -4643 0 + -4645 0 + -4644 0 + -4646 0 + -4593 0 + -4647 0 + -4649 0 + -4648 0 + -4650 0 + -4594 0 + -4651 0 + -4653 0 + -4652 0 + -4654 0 + -4595 0 + -4655 0 + -4657 0 + -4656 0 + -4658 0 + -4596 0 + -4659 0 + -4661 0 + -4660 0 + -4662 0 + -4597 0 + -4663 0 + -4665 0 + -4664 0 + -4666 0 + -4598 0 + -4667 0 + -4669 0 + -4668 0 + -4670 0 + -4599 0 + -4671 0 + -4673 0 + -4672 0 + -4674 0 + -4600 0 + -4675 0 + -4677 0 + -4676 0 + -4678 0 + -4601 0 + -4679 0 + -4681 0 + -4680 0 + -4682 0 + -4602 0 + -4683 0 + -4685 0 + -4684 0 + -4686 0 + -4603 0 + -4687 0 + -4689 0 + -4688 0 + -4690 0 + -4604 0 + -4691 0 + -4693 0 + -4692 0 + -4694 0 + -4605 0 + -4695 0 + -4697 0 + -4696 0 + -4698 0 + -4606 0 + -4699 0 + -4701 0 + -4700 0 + -4702 0 + -4607 0 + -4703 0 + -4705 0 + -4704 0 + -4706 0 + -4608 0 + -4707 0 + -4709 0 + -4708 0 + -4710 0 + -4609 0 + -4711 0 + -4713 0 + -4712 0 + -4714 0 + -4610 0 + -4715 0 + -4717 0 + -4716 0 + -4718 0 + -4611 0 + -4719 0 + -4721 0 + -4720 0 + -4722 0 + -4612 0 + -4723 0 + -4725 0 + -4724 0 + -4726 0 + -4613 0 + -4727 0 + -4729 0 + -4728 0 + -4730 0 + -4614 0 + -4731 0 + -4733 0 + -4732 0 + -4734 0 + -4615 0 + -4735 0 + -4737 0 + -4736 0 + -4738 0 + -4616 0 + -4739 0 + -4741 0 + -4740 0 + -4742 0 + -4617 0 + -4743 0 + -4745 0 + -4744 0 + -4746 0 + -4618 0 + 4908 0 + -4909 0 + -4910 0 + -4911 0 + -4912 0 + -4913 0 + -4914 0 + -4915 0 + -4916 0 + -4917 0 + -4918 0 + -4919 0 + -4920 0 + -4921 0 + -4922 0 + -4923 0 + -4924 0 + -4925 0 + -4926 0 + -4927 0 + -4928 0 + -4929 0 + -4930 0 + -4931 0 + -4932 0 + -4933 0 + -4934 0 + -4935 0 + -4936 0 + -4937 0 + -4938 0 + -4939 0 + -4940 0 + -4941 0 + -4942 0 + -4943 0 + -4944 0 + -4945 0 + -4946 0 + -4947 0 + -4948 0 + -4949 0 + -4950 0 + -4951 0 + -4952 0 + -4953 0 + -4954 0 + -4955 0 + -4956 0 + -4957 0 + -4958 0 + -4959 0 + -4960 0 + -4961 0 + -4962 0 + -4963 0 + -4964 0 + -4965 0 + -4966 0 + -4967 0 + -4968 0 + -4969 0 + -4970 0 + -4971 0 + -5110 0 + -5112 0 + -5115 0 + -5116 0 + -5046 0 + -5118 0 + -5119 0 + -5047 0 + -5121 0 + -5122 0 + -5048 0 + -5124 0 + -5125 0 + -5049 0 + -5127 0 + -5128 0 + -5050 0 + -5130 0 + -5131 0 + -5051 0 + -5133 0 + -5134 0 + -5052 0 + -5136 0 + -5137 0 + -5053 0 + -5139 0 + -5140 0 + -5054 0 + -5142 0 + -5143 0 + -5055 0 + -5145 0 + -5146 0 + -5056 0 + -5148 0 + -5149 0 + -5057 0 + -5151 0 + -5152 0 + -5058 0 + -5154 0 + -5155 0 + -5059 0 + -5157 0 + -5158 0 + -5060 0 + -5160 0 + -5161 0 + -5061 0 + -5163 0 + -5164 0 + -5062 0 + -5166 0 + -5167 0 + -5063 0 + -5169 0 + -5170 0 + -5064 0 + -5172 0 + -5173 0 + -5065 0 + -5175 0 + -5176 0 + -5066 0 + -5178 0 + -5179 0 + -5067 0 + -5181 0 + -5182 0 + -5068 0 + -5184 0 + -5185 0 + -5069 0 + -5187 0 + -5188 0 + -5070 0 + -5190 0 + -5191 0 + -5071 0 + -5193 0 + -5194 0 + -5072 0 + -5196 0 + -5197 0 + -5073 0 + -5199 0 + -5200 0 + -5074 0 + -5202 0 + -5203 0 + -5075 0 + -5205 0 + -5206 0 + -5076 0 + -5208 0 + -5209 0 + -5077 0 + -5211 0 + -5212 0 + -5078 0 + -5214 0 + -5215 0 + -5079 0 + -5217 0 + -5218 0 + -5080 0 + -5220 0 + -5221 0 + -5081 0 + -5223 0 + -5224 0 + -5082 0 + -5226 0 + -5227 0 + -5083 0 + -5229 0 + -5230 0 + -5084 0 + -5232 0 + -5233 0 + -5085 0 + -5235 0 + -5236 0 + -5086 0 + -5238 0 + -5239 0 + -5087 0 + -5241 0 + -5242 0 + -5088 0 + -5244 0 + -5245 0 + -5089 0 + -5247 0 + -5248 0 + -5090 0 + -5250 0 + -5251 0 + -5091 0 + -5253 0 + -5254 0 + -5092 0 + -5256 0 + -5257 0 + -5093 0 + -5259 0 + -5260 0 + -5094 0 + -5262 0 + -5263 0 + -5095 0 + -5265 0 + -5266 0 + -5096 0 + -5268 0 + -5269 0 + -5097 0 + -5271 0 + -5272 0 + -5098 0 + -5274 0 + -5275 0 + -5099 0 + -5277 0 + -5278 0 + -5100 0 + -5280 0 + -5281 0 + -5101 0 + -5283 0 + -5284 0 + -5102 0 + -5286 0 + -5287 0 + -5103 0 + -5289 0 + -5290 0 + -5104 0 + -5292 0 + -5293 0 + -5105 0 + -5295 0 + -5296 0 + -5106 0 + -5298 0 + -5299 0 + -5107 0 + -5366 0 + -5369 0 + -5371 0 + -5374 0 + -5377 0 + -5378 0 + -5304 0 + -5380 0 + -5381 0 + -5305 0 + -5383 0 + -5384 0 + -5306 0 + -5386 0 + -5387 0 + -5307 0 + -5389 0 + -5390 0 + -5308 0 + -5392 0 + -5393 0 + -5309 0 + -5395 0 + -5396 0 + -5310 0 + -5398 0 + -5399 0 + -5311 0 + -5401 0 + -5402 0 + -5312 0 + -5404 0 + -5405 0 + -5313 0 + -5407 0 + -5408 0 + -5314 0 + -5410 0 + -5411 0 + -5315 0 + -5413 0 + -5414 0 + -5316 0 + -5416 0 + -5417 0 + -5317 0 + -5419 0 + -5420 0 + -5318 0 + -5422 0 + -5423 0 + -5319 0 + -5425 0 + -5426 0 + -5320 0 + -5428 0 + -5429 0 + -5321 0 + -5431 0 + -5432 0 + -5322 0 + -5434 0 + -5435 0 + -5323 0 + -5437 0 + -5438 0 + -5324 0 + -5440 0 + -5441 0 + -5325 0 + -5443 0 + -5444 0 + -5326 0 + -5446 0 + -5447 0 + -5327 0 + -5449 0 + -5450 0 + -5328 0 + -5452 0 + -5453 0 + -5329 0 + -5455 0 + -5456 0 + -5330 0 + -5458 0 + -5459 0 + -5331 0 + -5461 0 + -5462 0 + -5332 0 + -5464 0 + -5465 0 + -5333 0 + -5467 0 + -5468 0 + -5334 0 + -5470 0 + -5471 0 + -5335 0 + -5473 0 + -5474 0 + -5336 0 + -5476 0 + -5477 0 + -5337 0 + -5479 0 + -5480 0 + -5338 0 + -5482 0 + -5483 0 + -5339 0 + -5485 0 + -5486 0 + -5340 0 + -5488 0 + -5489 0 + -5341 0 + -5491 0 + -5492 0 + -5342 0 + -5494 0 + -5495 0 + -5343 0 + -5497 0 + -5498 0 + -5344 0 + -5500 0 + -5501 0 + -5345 0 + -5503 0 + -5504 0 + -5346 0 + -5506 0 + -5507 0 + -5347 0 + -5509 0 + -5510 0 + -5348 0 + -5512 0 + -5513 0 + -5349 0 + -5515 0 + -5516 0 + -5350 0 + -5518 0 + -5519 0 + -5351 0 + -5521 0 + -5522 0 + -5352 0 + -5524 0 + -5525 0 + -5353 0 + -5527 0 + -5528 0 + -5354 0 + -5530 0 + -5531 0 + -5355 0 + -5533 0 + -5534 0 + -5356 0 + -5536 0 + -5537 0 + -5357 0 + -5539 0 + -5540 0 + -5358 0 + -5542 0 + -5543 0 + -5359 0 + -5545 0 + -5546 0 + -5360 0 + -5548 0 + -5549 0 + -5361 0 + -5551 0 + -5552 0 + -5362 0 + -5554 0 + -5555 0 + -5363 0 + -5622 0 + -5625 0 + -5628 0 + -5631 0 + -5633 0 + -5636 0 + -5639 0 + -5642 0 + -5645 0 + -5646 0 + -5564 0 + -5648 0 + -5649 0 + -5565 0 + -5651 0 + -5652 0 + -5566 0 + -5654 0 + -5655 0 + -5567 0 + -5657 0 + -5658 0 + -5568 0 + -5660 0 + -5661 0 + -5569 0 + -5663 0 + -5664 0 + -5570 0 + -5666 0 + -5667 0 + -5571 0 + -5669 0 + -5670 0 + -5572 0 + -5672 0 + -5673 0 + -5573 0 + -5675 0 + -5676 0 + -5574 0 + -5678 0 + -5679 0 + -5575 0 + -5681 0 + -5682 0 + -5576 0 + -5684 0 + -5685 0 + -5577 0 + -5687 0 + -5688 0 + -5578 0 + -5690 0 + -5691 0 + -5579 0 + -5693 0 + -5694 0 + -5580 0 + -5696 0 + -5697 0 + -5581 0 + -5699 0 + -5700 0 + -5582 0 + -5702 0 + -5703 0 + -5583 0 + -5705 0 + -5706 0 + -5584 0 + -5708 0 + -5709 0 + -5585 0 + -5711 0 + -5712 0 + -5586 0 + -5714 0 + -5715 0 + -5587 0 + -5717 0 + -5718 0 + -5588 0 + -5720 0 + -5721 0 + -5589 0 + -5723 0 + -5724 0 + -5590 0 + -5726 0 + -5727 0 + -5591 0 + -5729 0 + -5730 0 + -5592 0 + -5732 0 + -5733 0 + -5593 0 + -5735 0 + -5736 0 + -5594 0 + -5738 0 + -5739 0 + -5595 0 + -5741 0 + -5742 0 + -5596 0 + -5744 0 + -5745 0 + -5597 0 + -5747 0 + -5748 0 + -5598 0 + -5750 0 + -5751 0 + -5599 0 + -5753 0 + -5754 0 + -5600 0 + -5756 0 + -5757 0 + -5601 0 + -5759 0 + -5760 0 + -5602 0 + -5762 0 + -5763 0 + -5603 0 + -5765 0 + -5766 0 + -5604 0 + -5768 0 + -5769 0 + -5605 0 + -5771 0 + -5772 0 + -5606 0 + -5774 0 + -5775 0 + -5607 0 + -5777 0 + -5778 0 + -5608 0 + -5780 0 + -5781 0 + -5609 0 + -5783 0 + -5784 0 + -5610 0 + -5786 0 + -5787 0 + -5611 0 + -5789 0 + -5790 0 + -5612 0 + -5792 0 + -5793 0 + -5613 0 + -5795 0 + -5796 0 + -5614 0 + -5798 0 + -5799 0 + -5615 0 + -5801 0 + -5802 0 + -5616 0 + -5804 0 + -5805 0 + -5617 0 + -5807 0 + -5808 0 + -5618 0 + -5810 0 + -5811 0 + -5619 0 + -5878 0 + -5881 0 + -5884 0 + -5887 0 + -5890 0 + -5893 0 + -5896 0 + -5899 0 + -5901 0 + -5904 0 + -5907 0 + -5910 0 + -5913 0 + -5916 0 + -5919 0 + -5922 0 + -5925 0 + -5926 0 + -5828 0 + -5928 0 + -5929 0 + -5829 0 + -5931 0 + -5932 0 + -5830 0 + -5934 0 + -5935 0 + -5831 0 + -5937 0 + -5938 0 + -5832 0 + -5940 0 + -5941 0 + -5833 0 + -5943 0 + -5944 0 + -5834 0 + -5946 0 + -5947 0 + -5835 0 + -5949 0 + -5950 0 + -5836 0 + -5952 0 + -5953 0 + -5837 0 + -5955 0 + -5956 0 + -5838 0 + -5958 0 + -5959 0 + -5839 0 + -5961 0 + -5962 0 + -5840 0 + -5964 0 + -5965 0 + -5841 0 + -5967 0 + -5968 0 + -5842 0 + -5970 0 + -5971 0 + -5843 0 + -5973 0 + -5974 0 + -5844 0 + -5976 0 + -5977 0 + -5845 0 + -5979 0 + -5980 0 + -5846 0 + -5982 0 + -5983 0 + -5847 0 + -5985 0 + -5986 0 + -5848 0 + -5988 0 + -5989 0 + -5849 0 + -5991 0 + -5992 0 + -5850 0 + -5994 0 + -5995 0 + -5851 0 + -5997 0 + -5998 0 + -5852 0 + -6000 0 + -6001 0 + -5853 0 + -6003 0 + -6004 0 + -5854 0 + -6006 0 + -6007 0 + -5855 0 + -6009 0 + -6010 0 + -5856 0 + -6012 0 + -6013 0 + -5857 0 + -6015 0 + -6016 0 + -5858 0 + -6018 0 + -6019 0 + -5859 0 + -6021 0 + -6022 0 + -5860 0 + -6024 0 + -6025 0 + -5861 0 + -6027 0 + -6028 0 + -5862 0 + -6030 0 + -6031 0 + -5863 0 + -6033 0 + -6034 0 + -5864 0 + -6036 0 + -6037 0 + -5865 0 + -6039 0 + -6040 0 + -5866 0 + -6042 0 + -6043 0 + -5867 0 + -6045 0 + -6046 0 + -5868 0 + -6048 0 + -6049 0 + -5869 0 + -6051 0 + -6052 0 + -5870 0 + -6054 0 + -6055 0 + -5871 0 + -6057 0 + -6058 0 + -5872 0 + -6060 0 + -6061 0 + -5873 0 + -6063 0 + -6064 0 + -5874 0 + -6066 0 + -6067 0 + -5875 0 + -6134 0 + -6137 0 + -6140 0 + -6143 0 + -6146 0 + -6149 0 + -6152 0 + -6155 0 + -6158 0 + -6161 0 + -6164 0 + -6167 0 + -6170 0 + -6173 0 + -6176 0 + -6179 0 + -6181 0 + -6184 0 + -6187 0 + -6190 0 + -6193 0 + -6196 0 + -6199 0 + -6202 0 + -6205 0 + -6208 0 + -6211 0 + -6214 0 + -6217 0 + -6220 0 + -6223 0 + -6226 0 + -6229 0 + -6230 0 + -6100 0 + -6232 0 + -6233 0 + -6101 0 + -6235 0 + -6236 0 + -6102 0 + -6238 0 + -6239 0 + -6103 0 + -6241 0 + -6242 0 + -6104 0 + -6244 0 + -6245 0 + -6105 0 + -6247 0 + -6248 0 + -6106 0 + -6250 0 + -6251 0 + -6107 0 + -6253 0 + -6254 0 + -6108 0 + -6256 0 + -6257 0 + -6109 0 + -6259 0 + -6260 0 + -6110 0 + -6262 0 + -6263 0 + -6111 0 + -6265 0 + -6266 0 + -6112 0 + -6268 0 + -6269 0 + -6113 0 + -6271 0 + -6272 0 + -6114 0 + -6274 0 + -6275 0 + -6115 0 + -6277 0 + -6278 0 + -6116 0 + -6280 0 + -6281 0 + -6117 0 + -6283 0 + -6284 0 + -6118 0 + -6286 0 + -6287 0 + -6119 0 + -6289 0 + -6290 0 + -6120 0 + -6292 0 + -6293 0 + -6121 0 + -6295 0 + -6296 0 + -6122 0 + -6298 0 + -6299 0 + -6123 0 + -6301 0 + -6302 0 + -6124 0 + -6304 0 + -6305 0 + -6125 0 + -6307 0 + -6308 0 + -6126 0 + -6310 0 + -6311 0 + -6127 0 + -6313 0 + -6314 0 + -6128 0 + -6316 0 + -6317 0 + -6129 0 + -6319 0 + -6320 0 + -6130 0 + -6322 0 + -6323 0 + -6131 0 + -6390 0 + -6393 0 + -6396 0 + -6399 0 + -6402 0 + -6405 0 + -6408 0 + -6411 0 + -6414 0 + -6417 0 + -6420 0 + -6423 0 + -6426 0 + -6429 0 + -6432 0 + -6435 0 + -6438 0 + -6441 0 + -6444 0 + -6447 0 + -6450 0 + -6453 0 + -6456 0 + -6459 0 + -6462 0 + -6465 0 + -6468 0 + -6471 0 + -6474 0 + -6477 0 + -6480 0 + -6483 0 + -6485 0 + -6488 0 + -6491 0 + -6494 0 + -6497 0 + -6500 0 + -6503 0 + -6506 0 + -6509 0 + -6512 0 + -6515 0 + -6518 0 + -6521 0 + -6524 0 + -6527 0 + -6530 0 + -6533 0 + -6536 0 + -6539 0 + -6542 0 + -6545 0 + -6548 0 + -6551 0 + -6554 0 + -6557 0 + -6560 0 + -6563 0 + -6566 0 + -6569 0 + -6572 0 + -6575 0 + -6578 0 + -6582 0 + -6585 0 + -6588 0 + -6591 0 + -6594 0 + -6597 0 + -6600 0 + -6603 0 + -6606 0 + -6609 0 + -6612 0 + -6615 0 + -6618 0 + -6621 0 + -6624 0 + -6627 0 + -6630 0 + -6633 0 + -6636 0 + -6639 0 + -6642 0 + -6645 0 + -6648 0 + -6651 0 + -6654 0 + -6657 0 + -6660 0 + -6663 0 + -6666 0 + -6669 0 + -6672 0 + -6675 0 + -6678 0 + -6681 0 + -6684 0 + -6687 0 + -6690 0 + -6693 0 + -6696 0 + -6699 0 + -6702 0 + -6705 0 + -6708 0 + -6711 0 + -6714 0 + -6717 0 + -6720 0 + -6723 0 + -6726 0 + -6729 0 + -6732 0 + -6735 0 + -6738 0 + -6741 0 + -6744 0 + -6747 0 + -6750 0 + -6753 0 + -6756 0 + -6759 0 + -6762 0 + -6765 0 + -6768 0 + -6771 0 + -6837 0 + -7156 0 + -7157 0 + -7158 0 + -7159 0 + -7160 0 + -7161 0 + -7162 0 + -7163 0 + -7164 0 + -7165 0 + -7166 0 + -7167 0 + -7168 0 + -7169 0 + -7170 0 + -7171 0 + -7172 0 + -7173 0 + -7174 0 + -7175 0 + -7176 0 + -7177 0 + -7178 0 + -7179 0 + -7180 0 + -7181 0 + -7182 0 + -7183 0 + -7184 0 + -7185 0 + -7186 0 + -7187 0 + -7188 0 + -7189 0 + -7190 0 + -7191 0 + -7192 0 + -7193 0 + -7194 0 + -7195 0 + -7196 0 + -7197 0 + -7198 0 + -7199 0 + -7200 0 + -7201 0 + -7202 0 + -7203 0 + -7204 0 + -7205 0 + -7206 0 + -7207 0 + -7208 0 + -7209 0 + -7210 0 + -7211 0 + -7212 0 + -7213 0 + -7214 0 + -7215 0 + -7216 0 + -7217 0 + -7218 0 + -7219 0 + -7414 0 + -7861 0 + -7862 0 + -7863 0 + -7864 0 + 7865 0 + -7866 0 + -7867 0 + -7868 0 + -8320 0 + -8321 0 + -8322 0 + -8323 0 + -8324 0 + -8325 0 + -8326 0 + -8327 0 + -8328 0 + -8329 0 + -8330 0 + -8331 0 + -8332 0 + -8333 0 + -8334 0 + -8335 0 + -8336 0 + -8337 0 + -8338 0 + -8339 0 + -8340 0 + -8341 0 + -8342 0 + -8343 0 + -8344 0 + -8345 0 + -8346 0 + -8347 0 + -8348 0 + -8349 0 + -8350 0 + -8384 0 + -8387 0 + -8389 0 + -8388 0 + -8390 0 + -8391 0 + -8393 0 + -8392 0 + -8394 0 + -8353 0 + -8395 0 + -8397 0 + -8396 0 + -8398 0 + -8354 0 + -8399 0 + -8401 0 + -8400 0 + -8402 0 + -8355 0 + -8403 0 + -8405 0 + -8404 0 + -8406 0 + -8356 0 + -8407 0 + -8409 0 + -8408 0 + -8410 0 + -8357 0 + -8411 0 + -8413 0 + -8412 0 + -8414 0 + -8358 0 + -8415 0 + -8417 0 + -8416 0 + -8418 0 + -8359 0 + -8419 0 + -8421 0 + -8420 0 + -8422 0 + -8360 0 + -8423 0 + -8425 0 + -8424 0 + -8426 0 + -8361 0 + -8427 0 + -8429 0 + -8428 0 + -8430 0 + -8362 0 + -8431 0 + -8433 0 + -8432 0 + -8434 0 + -8363 0 + -8435 0 + -8437 0 + -8436 0 + -8438 0 + -8364 0 + -8439 0 + -8441 0 + -8440 0 + -8442 0 + -8365 0 + -8443 0 + -8445 0 + -8444 0 + -8446 0 + -8366 0 + -8447 0 + -8449 0 + -8448 0 + -8450 0 + -8367 0 + -8451 0 + -8453 0 + -8452 0 + -8454 0 + -8368 0 + -8455 0 + -8457 0 + -8456 0 + -8458 0 + -8369 0 + -8459 0 + -8461 0 + -8460 0 + -8462 0 + -8370 0 + -8463 0 + -8465 0 + -8464 0 + -8466 0 + -8371 0 + -8467 0 + -8469 0 + -8468 0 + -8470 0 + -8372 0 + -8471 0 + -8473 0 + -8472 0 + -8474 0 + -8373 0 + -8475 0 + -8477 0 + -8476 0 + -8478 0 + -8374 0 + -8479 0 + -8481 0 + -8480 0 + -8482 0 + -8375 0 + -8483 0 + -8485 0 + -8484 0 + -8486 0 + -8376 0 + -8487 0 + -8489 0 + -8488 0 + -8490 0 + -8377 0 + -8491 0 + -8493 0 + -8492 0 + -8494 0 + -8378 0 + -8495 0 + -8497 0 + -8496 0 + -8498 0 + -8379 0 + -8499 0 + -8501 0 + -8500 0 + -8502 0 + -8380 0 + -8503 0 + -8505 0 + -8504 0 + -8506 0 + -8381 0 + -8507 0 + -8509 0 + -8508 0 + -8510 0 + -8382 0 + -8576 0 + 8577 0 + -8578 0 + -8579 0 + -8580 0 + -8581 0 + -8582 0 + -8583 0 + -8584 0 + -8585 0 + -8586 0 + -8587 0 + -8588 0 + -8589 0 + -8590 0 + -8591 0 + -8592 0 + -8593 0 + -8594 0 + -8595 0 + -8596 0 + -8597 0 + -8598 0 + -8599 0 + -8600 0 + -8601 0 + -8602 0 + -8603 0 + -8604 0 + -8605 0 + -8606 0 + -8607 0 + -9335 0 + -9336 0 + -9337 0 + -9338 0 + -9339 0 + -9340 0 + -9341 0 + -9342 0 + -9343 0 + -9344 0 + -9345 0 + -9346 0 + -9347 0 + -9348 0 + -9349 0 + -9350 0 + -9351 0 + -9352 0 + -9353 0 + -9354 0 + -9355 0 + -9356 0 + -9357 0 + -9358 0 + -9359 0 + -9360 0 + -9361 0 + -9362 0 + -9363 0 + -9364 0 + -9365 0 + -9367 0 + -9368 0 + -9369 0 + -9370 0 + -9371 0 + -9372 0 + -9373 0 + -9374 0 + -9375 0 + -9376 0 + -9377 0 + -9378 0 + -9379 0 + -9380 0 + -9381 0 + -9382 0 + -9383 0 + -9384 0 + -9385 0 + -9386 0 + -9387 0 + -9388 0 + -9389 0 + -9390 0 + -9391 0 + -9392 0 + -9393 0 + -9394 0 + -9395 0 + -9396 0 + -9397 0 + -9431 0 + -9434 0 + -9436 0 + -9435 0 + -9437 0 + -9438 0 + -9440 0 + -9439 0 + -9441 0 + -9400 0 + -9442 0 + -9444 0 + -9443 0 + -9445 0 + -9401 0 + -9446 0 + -9448 0 + -9447 0 + -9449 0 + -9402 0 + -9450 0 + -9452 0 + -9451 0 + -9453 0 + -9403 0 + -9454 0 + -9456 0 + -9455 0 + -9457 0 + -9404 0 + -9458 0 + -9460 0 + -9459 0 + -9461 0 + -9405 0 + -9462 0 + -9464 0 + -9463 0 + -9465 0 + -9406 0 + -9466 0 + -9468 0 + -9467 0 + -9469 0 + -9407 0 + -9470 0 + -9472 0 + -9471 0 + -9473 0 + -9408 0 + -9474 0 + -9476 0 + -9475 0 + -9477 0 + -9409 0 + -9478 0 + -9480 0 + -9479 0 + -9481 0 + -9410 0 + -9482 0 + -9484 0 + -9483 0 + -9485 0 + -9411 0 + -9486 0 + -9488 0 + -9487 0 + -9489 0 + -9412 0 + -9490 0 + -9492 0 + -9491 0 + -9493 0 + -9413 0 + -9494 0 + -9496 0 + -9495 0 + -9497 0 + -9414 0 + -9498 0 + -9500 0 + -9499 0 + -9501 0 + -9415 0 + -9502 0 + -9504 0 + -9503 0 + -9505 0 + -9416 0 + -9506 0 + -9508 0 + -9507 0 + -9509 0 + -9417 0 + -9510 0 + -9512 0 + -9511 0 + -9513 0 + -9418 0 + -9514 0 + -9516 0 + -9515 0 + -9517 0 + -9419 0 + -9518 0 + -9520 0 + -9519 0 + -9521 0 + -9420 0 + -9522 0 + -9524 0 + -9523 0 + -9525 0 + -9421 0 + -9526 0 + -9528 0 + -9527 0 + -9529 0 + -9422 0 + -9530 0 + -9532 0 + -9531 0 + -9533 0 + -9423 0 + -9534 0 + -9536 0 + -9535 0 + -9537 0 + -9424 0 + -9538 0 + -9540 0 + -9539 0 + -9541 0 + -9425 0 + -9542 0 + -9544 0 + -9543 0 + -9545 0 + -9426 0 + -9546 0 + -9548 0 + -9547 0 + -9549 0 + -9427 0 + -9550 0 + -9552 0 + -9551 0 + -9553 0 + -9428 0 + -9554 0 + -9556 0 + -9555 0 + -9557 0 + -9429 0 + -10027 0 + -10032 0 + -10036 0 + -10040 0 + -10044 0 + -10048 0 + -10052 0 + -10056 0 + -10060 0 + -10064 0 + -10068 0 + -10072 0 + -10076 0 + -10080 0 + -10084 0 + -10088 0 + -10092 0 + -10096 0 + -10100 0 + -10104 0 + -10108 0 + -10112 0 + -10116 0 + -10120 0 + -10124 0 + -10128 0 + -10132 0 + -10136 0 + -10140 0 + -10144 0 + -10148 0 + -10152 0 + -11683 0 + -12788 0 + -12793 0 + -12797 0 + -12801 0 + -12805 0 + -12809 0 + -12813 0 + -12817 0 + -12821 0 + -12825 0 + -12829 0 + -12833 0 + -12837 0 + -12841 0 + -12845 0 + -12849 0 + -12853 0 + -12857 0 + -12861 0 + -12865 0 + -12869 0 + -12873 0 + -12877 0 + -12881 0 + -12885 0 + -12889 0 + -12893 0 + -12897 0 + -12901 0 + -12905 0 + -12909 0 + -12913 0 + -13044 0 + -13049 0 + -13053 0 + -13057 0 + -13061 0 + -13065 0 + -13069 0 + -13073 0 + -13077 0 + -13081 0 + -13085 0 + -13089 0 + -13093 0 + -13097 0 + -13101 0 + -13105 0 + -13109 0 + -13113 0 + -13117 0 + -13121 0 + -13125 0 + -13129 0 + -13133 0 + -13137 0 + -13141 0 + -13145 0 + -13149 0 + -13153 0 + -13157 0 + -13161 0 + -13165 0 + -13169 0 + -14168 0 + -14169 0 + -14170 0 + -14171 0 + -14172 0 + -14173 0 + -14174 0 + -14175 0 + -14176 0 + -14177 0 + -14178 0 + -14179 0 + -14180 0 + -14181 0 + -14182 0 + -14183 0 + -14184 0 + -14185 0 + -14186 0 + -14187 0 + -14188 0 + -14189 0 + -14190 0 + -14191 0 + -14192 0 + -14193 0 + -14194 0 + -14195 0 + -14196 0 + -14197 0 + -14198 0 + -14200 0 + -14201 0 + -14202 0 + -14203 0 + -14204 0 + -14205 0 + -14206 0 + -14207 0 + -14208 0 + -14209 0 + -14210 0 + -14211 0 + -14212 0 + -14213 0 + -14214 0 + -14215 0 + -14216 0 + -14217 0 + -14218 0 + -14219 0 + -14220 0 + -14221 0 + -14222 0 + -14223 0 + -14224 0 + -14225 0 + -14226 0 + -14227 0 + -14228 0 + -14229 0 + -14230 0 + -14489 0 + 14681 0 + 14682 0 + 14683 0 + 14684 0 + 14685 0 + 14686 0 + 14687 0 + 14688 0 + 14689 0 + 14690 0 + 14691 0 + 14692 0 + 14693 0 + 14694 0 + 14695 0 + 14696 0 + 14697 0 + 14698 0 + 14699 0 + 14700 0 + 14701 0 + 14702 0 + 14703 0 + 14704 0 + 14705 0 + 14706 0 + 14707 0 + 14708 0 + 14709 0 + 14710 0 + 14711 0 + 14712 0 + -14875 0 + -14880 0 + -14884 0 + -14888 0 + -14892 0 + -14896 0 + -14900 0 + -14904 0 + -14908 0 + -14912 0 + -14916 0 + -14920 0 + -14924 0 + -14928 0 + -14932 0 + -14936 0 + -14940 0 + -14944 0 + -14948 0 + -14952 0 + -14956 0 + -14960 0 + -14964 0 + -14968 0 + -14972 0 + -14976 0 + -14980 0 + -14984 0 + -14988 0 + -14992 0 + -14996 0 + -15000 0 + -15098 0 + -15162 0 + -15733 0 + -15741 0 + -15742 0 + -15743 0 + -15744 0 + -15745 0 + -15746 0 + -15747 0 + -15748 0 + -15749 0 + -15750 0 + -15751 0 + -15752 0 + -15753 0 + -15754 0 + -15755 0 + -15756 0 + -15757 0 + -15758 0 + -15759 0 + -15760 0 + -15761 0 + -15762 0 + -15763 0 + -15764 0 + -15765 0 + -17382 0 + -18793 0 + -19306 0 + -20848 0 + -21361 0 + 22273 0 + 22274 0 + 22275 0 + 22276 0 + 22277 0 + 22278 0 + 22279 0 + -22280 0 + -22281 0 + -22282 0 + -22283 0 + -22284 0 + -22285 0 + -22286 0 + -22287 0 + -22288 0 + -22289 0 + -22290 0 + -22291 0 + -22292 0 + -22293 0 + -22294 0 + -22295 0 + -22296 0 + -22297 0 + -22298 0 + -22299 0 + -22300 0 + -22301 0 + -22302 0 + -22303 0 + -22304 0 + -22726 0 + -22727 0 + -22728 0 + -22729 0 + -22730 0 + -22731 0 + -22732 0 + -22733 0 + -22734 0 + -22735 0 + -22736 0 + -22737 0 + -22738 0 + -22739 0 + -22740 0 + -22741 0 + -22742 0 + -22743 0 + -22744 0 + -22745 0 + -22746 0 + -22747 0 + -22748 0 + -22749 0 + -22750 0 + -22751 0 + -22752 0 + -22753 0 + -22754 0 + -22755 0 + -22756 0 + -22790 0 + -22793 0 + -22795 0 + -22794 0 + -22796 0 + -22797 0 + -22799 0 + -22798 0 + -22800 0 + -22759 0 + -22801 0 + -22803 0 + -22802 0 + -22804 0 + -22760 0 + -22805 0 + -22807 0 + -22806 0 + -22808 0 + -22761 0 + -22809 0 + -22811 0 + -22810 0 + -22812 0 + -22762 0 + -22813 0 + -22815 0 + -22814 0 + -22816 0 + -22763 0 + -22817 0 + -22819 0 + -22818 0 + -22820 0 + -22764 0 + -22821 0 + -22823 0 + -22822 0 + -22824 0 + -22765 0 + -22825 0 + -22827 0 + -22826 0 + -22828 0 + -22766 0 + -22829 0 + -22831 0 + -22830 0 + -22832 0 + -22767 0 + -22833 0 + -22835 0 + -22834 0 + -22836 0 + -22768 0 + -22837 0 + -22839 0 + -22838 0 + -22840 0 + -22769 0 + -22841 0 + -22843 0 + -22842 0 + -22844 0 + -22770 0 + -22845 0 + -22847 0 + -22846 0 + -22848 0 + -22771 0 + -22849 0 + -22851 0 + -22850 0 + -22852 0 + -22772 0 + -22853 0 + -22855 0 + -22854 0 + -22856 0 + -22773 0 + -22857 0 + -22859 0 + -22858 0 + -22860 0 + -22774 0 + -22861 0 + -22863 0 + -22862 0 + -22864 0 + -22775 0 + -22865 0 + -22867 0 + -22866 0 + -22868 0 + -22776 0 + -22869 0 + -22871 0 + -22870 0 + -22872 0 + -22777 0 + -22873 0 + -22875 0 + -22874 0 + -22876 0 + -22778 0 + -22877 0 + -22879 0 + -22878 0 + -22880 0 + -22779 0 + -22881 0 + -22883 0 + -22882 0 + -22884 0 + -22780 0 + -22885 0 + -22887 0 + -22886 0 + -22888 0 + -22781 0 + -22889 0 + -22891 0 + -22890 0 + -22892 0 + -22782 0 + -22893 0 + -22895 0 + -22894 0 + -22896 0 + -22783 0 + -22897 0 + -22899 0 + -22898 0 + -22900 0 + -22784 0 + -22901 0 + -22903 0 + -22902 0 + -22904 0 + -22785 0 + -22905 0 + -22907 0 + -22906 0 + -22908 0 + -22786 0 + -22909 0 + -22911 0 + -22910 0 + -22912 0 + -22787 0 + -22913 0 + -22915 0 + -22914 0 + -22916 0 + -22788 0 + -22919 0 + -22920 0 + -22921 0 + -22922 0 + -22923 0 + -22924 0 + -22925 0 + -22926 0 + -22927 0 + -22928 0 + -22929 0 + -22930 0 + -22931 0 + -22932 0 + -22933 0 + -22934 0 + -22935 0 + -22936 0 + -22937 0 + -22938 0 + -22939 0 + -22940 0 + -22941 0 + -22942 0 + -22943 0 + -22944 0 + -22945 0 + -22946 0 + -22947 0 + -22948 0 + -24559 0 + -25072 0 + -26399 0 + -26404 0 + -26409 0 + -26414 0 + -26419 0 + -26424 0 + -26429 0 + -26434 0 + -26439 0 + -26444 0 + -26449 0 + -26454 0 + -26459 0 + -26464 0 + -26469 0 + -26474 0 + -26479 0 + -26484 0 + -26489 0 + -26494 0 + -26499 0 + -26504 0 + -26509 0 + -26514 0 + -26519 0 + -26524 0 + -26529 0 + -26534 0 + -26539 0 + -26544 0 + -26549 0 + -32640 0 + -32645 0 + -32650 0 + -32655 0 + -32660 0 + -32665 0 + -32670 0 + -32675 0 + -32680 0 + -32685 0 + -32690 0 + -32695 0 + -32700 0 + -32705 0 + -32710 0 + -32715 0 + -32720 0 + -32725 0 + -32730 0 + -32735 0 + -32740 0 + -32745 0 + -32750 0 + -32755 0 + -32760 0 + -32765 0 + -32770 0 + -32775 0 + -32780 0 + -32785 0 + -32790 0 + -38817 0 + -38822 0 + -38827 0 + -38832 0 + -38837 0 + -38842 0 + -38847 0 + -38852 0 + -38857 0 + -38862 0 + -38867 0 + -38872 0 + -38877 0 + -38882 0 + -38887 0 + -38892 0 + -38897 0 + -38902 0 + -38907 0 + -38912 0 + -38917 0 + -38922 0 + -38927 0 + -38932 0 + -38937 0 + -38942 0 + -38947 0 + -38952 0 + -38957 0 + -38962 0 + -38967 0 + -45058 0 + -45063 0 + -45068 0 + -45073 0 + -45078 0 + -45083 0 + -45088 0 + -45093 0 + -45098 0 + -45103 0 + -45108 0 + -45113 0 + -45118 0 + -45123 0 + -45128 0 + -45133 0 + -45138 0 + -45143 0 + -45148 0 + -45153 0 + -45158 0 + -45163 0 + -45168 0 + -45173 0 + -45178 0 + -45183 0 + -45188 0 + -45193 0 + -45198 0 + -45203 0 + -45208 0 + -51235 0 + -51240 0 + -51245 0 + -51250 0 + -51255 0 + -51260 0 + -51265 0 + -51270 0 + -51275 0 + -51280 0 + -51285 0 + -51290 0 + -51295 0 + -51300 0 + -51305 0 + -51310 0 + -51315 0 + -51320 0 + -51325 0 + -51330 0 + -51335 0 + -51340 0 + -51345 0 + -51350 0 + -51355 0 + -51360 0 + -51365 0 + -51370 0 + -51375 0 + -51380 0 + -51385 0 + -57412 0 + -57417 0 + -57422 0 + -57427 0 + -57432 0 + -57437 0 + -57442 0 + -57447 0 + -57452 0 + -57457 0 + -57462 0 + -57467 0 + -57472 0 + -57477 0 + -57482 0 + -57487 0 + -57492 0 + -57497 0 + -57502 0 + -57507 0 + -57512 0 + -57517 0 + -57522 0 + -57527 0 + -57532 0 + -57537 0 + -57542 0 + -57547 0 + -57552 0 + -57557 0 + -57562 0 + -64223 0 + -64227 0 + -64231 0 + -64235 0 + -64239 0 + -64243 0 + -64247 0 + -64251 0 + -64255 0 + -64259 0 + -64263 0 + -64267 0 + -64271 0 + -64275 0 + -64279 0 + -64283 0 + -64287 0 + -64291 0 + -64295 0 + -64299 0 + -64303 0 + -64307 0 + -64311 0 + -64315 0 + -64319 0 + -64323 0 + -64327 0 + -64331 0 + -64335 0 + -64339 0 + -64343 0 + -64347 0 + -64929 0 + -64933 0 + -64937 0 + -64941 0 + -64945 0 + -64949 0 + -64953 0 + -64957 0 + -64961 0 + -64965 0 + -64969 0 + -64973 0 + -64977 0 + -64981 0 + -64985 0 + -64989 0 + -64993 0 + -64997 0 + -65001 0 + -65005 0 + -65009 0 + -65013 0 + -65017 0 + -65021 0 + -65025 0 + -65029 0 + -65033 0 + -65037 0 + -65041 0 + -65045 0 + -65049 0 + -65053 0 + -65379 0 + -65383 0 + -65387 0 + -65391 0 + -65395 0 + -65399 0 + -65403 0 + -65407 0 + -65411 0 + -65415 0 + -65419 0 + -65423 0 + -65427 0 + -65431 0 + -65435 0 + -65439 0 + -65443 0 + -65447 0 + -65451 0 + -65455 0 + -65459 0 + -65463 0 + -65467 0 + -65471 0 + -65475 0 + -65479 0 + -65483 0 + -65487 0 + -65491 0 + -65495 0 + -65499 0 + -65503 0 + -65993 0 + 35 100 0 + -3 132 0 + 3 -100 132 0 + 3 -132 0 + -3 -100 -132 0 + -3 -100 134 0 + 3 -134 0 + -132 133 0 + 132 -133 0 + 1 -133 0 + 133 -135 0 + -133 135 0 + -134 135 0 + 1 68 -132 0 + 68 132 0 + 1 -68 132 0 + -68 -132 0 + -4 101 136 0 + 4 136 0 + 4 101 -136 0 + -4 -136 0 + -4 138 0 + 4 -138 0 + 101 -138 0 + -135 -136 137 0 + 136 -137 0 + 135 -137 0 + 137 138 -139 0 + -137 139 0 + -138 139 0 + 69 135 -136 0 + 69 -135 136 0 + -69 135 136 0 + -69 -135 -136 0 + -5 102 140 0 + 5 140 0 + 5 102 -140 0 + -5 -140 0 + -5 142 0 + 5 -142 0 + 102 -142 0 + -139 -140 141 0 + 140 -141 0 + 139 -141 0 + 141 142 -143 0 + -141 143 0 + -142 143 0 + 70 139 -140 0 + 70 -139 140 0 + -70 139 140 0 + -70 -139 -140 0 + -6 103 144 0 + 6 144 0 + 6 103 -144 0 + -6 -144 0 + -6 146 0 + 6 -146 0 + 103 -146 0 + -143 -144 145 0 + 144 -145 0 + 143 -145 0 + 145 146 -147 0 + -145 147 0 + -146 147 0 + 71 143 -144 0 + 71 -143 144 0 + -71 143 144 0 + -71 -143 -144 0 + -7 104 148 0 + 7 148 0 + 7 104 -148 0 + -7 -148 0 + -7 150 0 + 7 -150 0 + 104 -150 0 + -147 -148 149 0 + 148 -149 0 + 147 -149 0 + 149 150 -151 0 + -149 151 0 + -150 151 0 + 72 147 -148 0 + 72 -147 148 0 + -72 147 148 0 + -72 -147 -148 0 + -8 105 152 0 + 8 152 0 + 8 105 -152 0 + -8 -152 0 + -8 154 0 + 8 -154 0 + 105 -154 0 + -151 -152 153 0 + 152 -153 0 + 151 -153 0 + 153 154 -155 0 + -153 155 0 + -154 155 0 + 73 151 -152 0 + 73 -151 152 0 + -73 151 152 0 + -73 -151 -152 0 + -9 106 156 0 + 9 156 0 + 9 106 -156 0 + -9 -156 0 + -9 158 0 + 9 -158 0 + 106 -158 0 + -155 -156 157 0 + 156 -157 0 + 155 -157 0 + 157 158 -159 0 + -157 159 0 + -158 159 0 + 74 155 -156 0 + 74 -155 156 0 + -74 155 156 0 + -74 -155 -156 0 + -10 107 160 0 + 10 160 0 + 10 107 -160 0 + -10 -160 0 + -10 162 0 + 10 -162 0 + 107 -162 0 + -159 -160 161 0 + 160 -161 0 + 159 -161 0 + 161 162 -163 0 + -161 163 0 + -162 163 0 + 75 159 -160 0 + 75 -159 160 0 + -75 159 160 0 + -75 -159 -160 0 + -11 108 164 0 + 11 164 0 + 11 108 -164 0 + -11 -164 0 + -11 166 0 + 11 -166 0 + 108 -166 0 + -163 -164 165 0 + 164 -165 0 + 163 -165 0 + 165 166 -167 0 + -165 167 0 + -166 167 0 + 76 163 -164 0 + 76 -163 164 0 + -76 163 164 0 + -76 -163 -164 0 + -12 109 168 0 + 12 168 0 + 12 109 -168 0 + -12 -168 0 + -12 170 0 + 12 -170 0 + 109 -170 0 + -167 -168 169 0 + 168 -169 0 + 167 -169 0 + 169 170 -171 0 + -169 171 0 + -170 171 0 + 77 167 -168 0 + 77 -167 168 0 + -77 167 168 0 + -77 -167 -168 0 + -13 110 172 0 + 13 172 0 + 13 110 -172 0 + -13 -172 0 + -13 174 0 + 13 -174 0 + 110 -174 0 + -171 -172 173 0 + 172 -173 0 + 171 -173 0 + 173 174 -175 0 + -173 175 0 + -174 175 0 + 78 171 -172 0 + 78 -171 172 0 + -78 171 172 0 + -78 -171 -172 0 + -14 111 176 0 + 14 176 0 + 14 111 -176 0 + -14 -176 0 + -14 178 0 + 14 -178 0 + 111 -178 0 + -175 -176 177 0 + 176 -177 0 + 175 -177 0 + 177 178 -179 0 + -177 179 0 + -178 179 0 + 79 175 -176 0 + 79 -175 176 0 + -79 175 176 0 + -79 -175 -176 0 + -15 112 180 0 + 15 180 0 + 15 112 -180 0 + -15 -180 0 + -15 182 0 + 15 -182 0 + 112 -182 0 + -179 -180 181 0 + 180 -181 0 + 179 -181 0 + 181 182 -183 0 + -181 183 0 + -182 183 0 + 80 179 -180 0 + 80 -179 180 0 + -80 179 180 0 + -80 -179 -180 0 + -16 113 184 0 + 16 184 0 + 16 113 -184 0 + -16 -184 0 + -16 186 0 + 16 -186 0 + 113 -186 0 + -183 -184 185 0 + 184 -185 0 + 183 -185 0 + 185 186 -187 0 + -185 187 0 + -186 187 0 + 81 183 -184 0 + 81 -183 184 0 + -81 183 184 0 + -81 -183 -184 0 + -17 114 188 0 + 17 188 0 + 17 114 -188 0 + -17 -188 0 + -17 190 0 + 17 -190 0 + 114 -190 0 + -187 -188 189 0 + 188 -189 0 + 187 -189 0 + 189 190 -191 0 + -189 191 0 + -190 191 0 + 82 187 -188 0 + 82 -187 188 0 + -82 187 188 0 + -82 -187 -188 0 + -18 115 192 0 + 18 192 0 + 18 115 -192 0 + -18 -192 0 + -18 194 0 + 18 -194 0 + 115 -194 0 + -191 -192 193 0 + 192 -193 0 + 191 -193 0 + 193 194 -195 0 + -193 195 0 + -194 195 0 + 83 191 -192 0 + 83 -191 192 0 + -83 191 192 0 + -83 -191 -192 0 + -19 116 196 0 + 19 196 0 + 19 116 -196 0 + -19 -196 0 + -19 198 0 + 19 -198 0 + 116 -198 0 + -195 -196 197 0 + 196 -197 0 + 195 -197 0 + 197 198 -199 0 + -197 199 0 + -198 199 0 + 84 195 -196 0 + 84 -195 196 0 + -84 195 196 0 + -84 -195 -196 0 + -20 117 200 0 + 20 200 0 + 20 117 -200 0 + -20 -200 0 + -20 202 0 + 20 -202 0 + 117 -202 0 + -199 -200 201 0 + 200 -201 0 + 199 -201 0 + 201 202 -203 0 + -201 203 0 + -202 203 0 + 85 199 -200 0 + 85 -199 200 0 + -85 199 200 0 + -85 -199 -200 0 + -21 118 204 0 + 21 204 0 + 21 118 -204 0 + -21 -204 0 + -21 206 0 + 21 -206 0 + 118 -206 0 + -203 -204 205 0 + 204 -205 0 + 203 -205 0 + 205 206 -207 0 + -205 207 0 + -206 207 0 + 86 203 -204 0 + 86 -203 204 0 + -86 203 204 0 + -86 -203 -204 0 + -22 119 208 0 + 22 208 0 + 22 119 -208 0 + -22 -208 0 + -22 210 0 + 22 -210 0 + 119 -210 0 + -207 -208 209 0 + 208 -209 0 + 207 -209 0 + 209 210 -211 0 + -209 211 0 + -210 211 0 + 87 207 -208 0 + 87 -207 208 0 + -87 207 208 0 + -87 -207 -208 0 + -23 120 212 0 + 23 212 0 + 23 120 -212 0 + -23 -212 0 + -23 214 0 + 23 -214 0 + 120 -214 0 + -211 -212 213 0 + 212 -213 0 + 211 -213 0 + 213 214 -215 0 + -213 215 0 + -214 215 0 + 88 211 -212 0 + 88 -211 212 0 + -88 211 212 0 + -88 -211 -212 0 + -24 121 216 0 + 24 216 0 + 24 121 -216 0 + -24 -216 0 + -24 218 0 + 24 -218 0 + 121 -218 0 + -215 -216 217 0 + 216 -217 0 + 215 -217 0 + 217 218 -219 0 + -217 219 0 + -218 219 0 + 89 215 -216 0 + 89 -215 216 0 + -89 215 216 0 + -89 -215 -216 0 + -25 122 220 0 + 25 220 0 + 25 122 -220 0 + -25 -220 0 + -25 222 0 + 25 -222 0 + 122 -222 0 + -219 -220 221 0 + 220 -221 0 + 219 -221 0 + 221 222 -223 0 + -221 223 0 + -222 223 0 + 90 219 -220 0 + 90 -219 220 0 + -90 219 220 0 + -90 -219 -220 0 + -26 123 224 0 + 26 224 0 + 26 123 -224 0 + -26 -224 0 + -26 226 0 + 26 -226 0 + 123 -226 0 + -223 -224 225 0 + 224 -225 0 + 223 -225 0 + 225 226 -227 0 + -225 227 0 + -226 227 0 + 91 223 -224 0 + 91 -223 224 0 + -91 223 224 0 + -91 -223 -224 0 + -27 124 228 0 + 27 228 0 + 27 124 -228 0 + -27 -228 0 + -27 230 0 + 27 -230 0 + 124 -230 0 + -227 -228 229 0 + 228 -229 0 + 227 -229 0 + 229 230 -231 0 + -229 231 0 + -230 231 0 + 92 227 -228 0 + 92 -227 228 0 + -92 227 228 0 + -92 -227 -228 0 + -28 125 232 0 + 28 232 0 + 28 125 -232 0 + -28 -232 0 + -28 234 0 + 28 -234 0 + 125 -234 0 + -231 -232 233 0 + 232 -233 0 + 231 -233 0 + 233 234 -235 0 + -233 235 0 + -234 235 0 + 93 231 -232 0 + 93 -231 232 0 + -93 231 232 0 + -93 -231 -232 0 + -29 126 236 0 + 29 236 0 + 29 126 -236 0 + -29 -236 0 + -29 238 0 + 29 -238 0 + 126 -238 0 + -235 -236 237 0 + 236 -237 0 + 235 -237 0 + 237 238 -239 0 + -237 239 0 + -238 239 0 + 94 235 -236 0 + 94 -235 236 0 + -94 235 236 0 + -94 -235 -236 0 + -30 127 240 0 + 30 240 0 + 30 127 -240 0 + -30 -240 0 + -30 242 0 + 30 -242 0 + 127 -242 0 + -239 -240 241 0 + 240 -241 0 + 239 -241 0 + 241 242 -243 0 + -241 243 0 + -242 243 0 + 95 239 -240 0 + 95 -239 240 0 + -95 239 240 0 + -95 -239 -240 0 + -31 128 244 0 + 31 244 0 + 31 128 -244 0 + -31 -244 0 + -31 246 0 + 31 -246 0 + 128 -246 0 + -243 -244 245 0 + 244 -245 0 + 243 -245 0 + 245 246 -247 0 + -245 247 0 + -246 247 0 + 96 243 -244 0 + 96 -243 244 0 + -96 243 244 0 + -96 -243 -244 0 + -32 129 248 0 + 32 248 0 + 32 129 -248 0 + -32 -248 0 + -32 250 0 + 32 -250 0 + 129 -250 0 + -247 -248 249 0 + 248 -249 0 + 247 -249 0 + 249 250 -251 0 + -249 251 0 + -250 251 0 + 97 247 -248 0 + 97 -247 248 0 + -97 247 248 0 + -97 -247 -248 0 + -33 130 252 0 + 33 252 0 + 33 130 -252 0 + -33 -252 0 + -33 254 0 + 33 -254 0 + 130 -254 0 + -251 -252 253 0 + 252 -253 0 + 251 -253 0 + 253 254 -255 0 + -253 255 0 + -254 255 0 + 98 251 -252 0 + 98 -251 252 0 + -98 251 252 0 + -98 -251 -252 0 + -34 131 256 0 + 34 256 0 + 34 131 -256 0 + -34 -256 0 + -34 258 0 + 34 -258 0 + 131 -258 0 + -255 -256 257 0 + 256 -257 0 + 255 -257 0 + 257 258 -259 0 + -257 259 0 + -258 259 0 + 99 255 -256 0 + 99 -255 256 0 + -99 255 256 0 + -99 -255 -256 0 + 67 259 0 + -67 -259 0 + 260 292 325 0 + -260 -292 325 0 + 260 -292 -325 0 + -260 292 -325 0 + 261 293 326 0 + -261 -293 326 0 + 261 -293 -326 0 + -261 293 -326 0 + 262 294 327 0 + -262 -294 327 0 + 262 -294 -327 0 + -262 294 -327 0 + 263 295 328 0 + -263 -295 328 0 + 263 -295 -328 0 + -263 295 -328 0 + 264 296 329 0 + -264 -296 329 0 + 264 -296 -329 0 + -264 296 -329 0 + 265 297 330 0 + -265 -297 330 0 + 265 -297 -330 0 + -265 297 -330 0 + 266 298 331 0 + -266 -298 331 0 + 266 -298 -331 0 + -266 298 -331 0 + 267 299 332 0 + -267 -299 332 0 + 267 -299 -332 0 + -267 299 -332 0 + 268 300 333 0 + -268 -300 333 0 + 268 -300 -333 0 + -268 300 -333 0 + 269 301 334 0 + -269 -301 334 0 + 269 -301 -334 0 + -269 301 -334 0 + 270 302 335 0 + -270 -302 335 0 + 270 -302 -335 0 + -270 302 -335 0 + 271 303 336 0 + -271 -303 336 0 + 271 -303 -336 0 + -271 303 -336 0 + 272 304 337 0 + -272 -304 337 0 + 272 -304 -337 0 + -272 304 -337 0 + 273 305 338 0 + -273 -305 338 0 + 273 -305 -338 0 + -273 305 -338 0 + 274 306 339 0 + -274 -306 339 0 + 274 -306 -339 0 + -274 306 -339 0 + 275 307 340 0 + -275 -307 340 0 + 275 -307 -340 0 + -275 307 -340 0 + 276 308 341 0 + -276 -308 341 0 + 276 -308 -341 0 + -276 308 -341 0 + 277 309 342 0 + -277 -309 342 0 + 277 -309 -342 0 + -277 309 -342 0 + 278 310 343 0 + -278 -310 343 0 + 278 -310 -343 0 + -278 310 -343 0 + 279 311 344 0 + -279 -311 344 0 + 279 -311 -344 0 + -279 311 -344 0 + 280 312 345 0 + -280 -312 345 0 + 280 -312 -345 0 + -280 312 -345 0 + 281 313 346 0 + -281 -313 346 0 + 281 -313 -346 0 + -281 313 -346 0 + 282 314 347 0 + -282 -314 347 0 + 282 -314 -347 0 + -282 314 -347 0 + 283 315 348 0 + -283 -315 348 0 + 283 -315 -348 0 + -283 315 -348 0 + 284 316 349 0 + -284 -316 349 0 + 284 -316 -349 0 + -284 316 -349 0 + 285 317 350 0 + -285 -317 350 0 + 285 -317 -350 0 + -285 317 -350 0 + 286 318 351 0 + -286 -318 351 0 + 286 -318 -351 0 + -286 318 -351 0 + 287 319 352 0 + -287 -319 352 0 + 287 -319 -352 0 + -287 319 -352 0 + 288 320 353 0 + -288 -320 353 0 + 288 -320 -353 0 + -288 320 -353 0 + 289 321 354 0 + -289 -321 354 0 + 289 -321 -354 0 + -289 321 -354 0 + 290 322 355 0 + -290 -322 355 0 + 290 -322 -355 0 + -290 322 -355 0 + 291 323 356 0 + -291 -323 356 0 + 291 -323 -356 0 + -291 323 -356 0 + -325 357 0 + 1 -357 0 + 325 -357 0 + -326 -357 358 0 + 357 -358 0 + 326 -358 0 + -327 -358 359 0 + 358 -359 0 + 327 -359 0 + -328 -359 360 0 + 359 -360 0 + 328 -360 0 + -329 -360 361 0 + 360 -361 0 + 329 -361 0 + -330 -361 362 0 + 361 -362 0 + 330 -362 0 + -331 -362 363 0 + 362 -363 0 + 331 -363 0 + -332 -363 364 0 + 363 -364 0 + 332 -364 0 + -333 -364 365 0 + 364 -365 0 + 333 -365 0 + -334 -365 366 0 + 365 -366 0 + 334 -366 0 + -335 -366 367 0 + 366 -367 0 + 335 -367 0 + -336 -367 368 0 + 367 -368 0 + 336 -368 0 + -337 -368 369 0 + 368 -369 0 + 337 -369 0 + -338 -369 370 0 + 369 -370 0 + 338 -370 0 + -339 -370 371 0 + 370 -371 0 + 339 -371 0 + -340 -371 372 0 + 371 -372 0 + 340 -372 0 + -341 -372 373 0 + 372 -373 0 + 341 -373 0 + -342 -373 374 0 + 373 -374 0 + 342 -374 0 + -343 -374 375 0 + 374 -375 0 + 343 -375 0 + -344 -375 376 0 + 375 -376 0 + 344 -376 0 + -345 -376 377 0 + 376 -377 0 + 345 -377 0 + -346 -377 378 0 + 377 -378 0 + 346 -378 0 + -347 -378 379 0 + 378 -379 0 + 347 -379 0 + -348 -379 380 0 + 379 -380 0 + 348 -380 0 + -349 -380 381 0 + 380 -381 0 + 349 -381 0 + -350 -381 382 0 + 381 -382 0 + 350 -382 0 + -351 -382 383 0 + 382 -383 0 + 351 -383 0 + -352 -383 384 0 + 383 -384 0 + 352 -384 0 + -353 -384 385 0 + 384 -385 0 + 353 -385 0 + -354 -385 386 0 + 385 -386 0 + 354 -386 0 + -355 -386 387 0 + 386 -387 0 + 355 -387 0 + -356 -387 388 0 + 387 -388 0 + 356 -388 0 + -324 388 0 + 324 -388 0 + 390 422 455 0 + -390 455 0 + -390 422 -455 0 + 390 -455 0 + 391 423 456 0 + -391 456 0 + -391 423 -456 0 + 391 -456 0 + 392 424 457 0 + -392 457 0 + -392 424 -457 0 + 392 -457 0 + 393 425 458 0 + -393 458 0 + -393 425 -458 0 + 393 -458 0 + 394 426 459 0 + -394 459 0 + -394 426 -459 0 + 394 -459 0 + 395 427 460 0 + -395 460 0 + -395 427 -460 0 + 395 -460 0 + 396 428 461 0 + -396 461 0 + -396 428 -461 0 + 396 -461 0 + 397 429 462 0 + -397 462 0 + -397 429 -462 0 + 397 -462 0 + 398 430 463 0 + -398 463 0 + -398 430 -463 0 + 398 -463 0 + 399 431 464 0 + -399 464 0 + -399 431 -464 0 + 399 -464 0 + 400 432 465 0 + -400 465 0 + -400 432 -465 0 + 400 -465 0 + 401 433 466 0 + -401 466 0 + -401 433 -466 0 + 401 -466 0 + 402 434 467 0 + -402 467 0 + -402 434 -467 0 + 402 -467 0 + 403 435 468 0 + -403 468 0 + -403 435 -468 0 + 403 -468 0 + 404 436 469 0 + -404 469 0 + -404 436 -469 0 + 404 -469 0 + 405 437 470 0 + -405 470 0 + -405 437 -470 0 + 405 -470 0 + 406 438 471 0 + -406 471 0 + -406 438 -471 0 + 406 -471 0 + 407 439 472 0 + -407 472 0 + -407 439 -472 0 + 407 -472 0 + 408 440 473 0 + -408 473 0 + -408 440 -473 0 + 408 -473 0 + 409 441 474 0 + -409 474 0 + -409 441 -474 0 + 409 -474 0 + 410 442 475 0 + -410 475 0 + -410 442 -475 0 + 410 -475 0 + 411 443 476 0 + -411 476 0 + -411 443 -476 0 + 411 -476 0 + 412 444 477 0 + -412 477 0 + -412 444 -477 0 + 412 -477 0 + 413 445 478 0 + -413 478 0 + -413 445 -478 0 + 413 -478 0 + 414 446 479 0 + -414 479 0 + -414 446 -479 0 + 414 -479 0 + 415 447 480 0 + -415 480 0 + -415 447 -480 0 + 415 -480 0 + 416 448 481 0 + -416 481 0 + -416 448 -481 0 + 416 -481 0 + 417 449 482 0 + -417 482 0 + -417 449 -482 0 + 417 -482 0 + 418 450 483 0 + -418 483 0 + -418 450 -483 0 + 418 -483 0 + 419 451 484 0 + -419 484 0 + -419 451 -484 0 + 419 -484 0 + 420 452 485 0 + -420 485 0 + -420 452 -485 0 + 420 -485 0 + 421 453 486 0 + -421 486 0 + -421 453 -486 0 + 421 -486 0 + -455 487 0 + 1 -487 0 + 455 -487 0 + -456 -487 488 0 + 487 -488 0 + 456 -488 0 + -457 -488 489 0 + 488 -489 0 + 457 -489 0 + -458 -489 490 0 + 489 -490 0 + 458 -490 0 + -459 -490 491 0 + 490 -491 0 + 459 -491 0 + -460 -491 492 0 + 491 -492 0 + 460 -492 0 + -461 -492 493 0 + 492 -493 0 + 461 -493 0 + -462 -493 494 0 + 493 -494 0 + 462 -494 0 + -463 -494 495 0 + 494 -495 0 + 463 -495 0 + -464 -495 496 0 + 495 -496 0 + 464 -496 0 + -465 -496 497 0 + 496 -497 0 + 465 -497 0 + -466 -497 498 0 + 497 -498 0 + 466 -498 0 + -467 -498 499 0 + 498 -499 0 + 467 -499 0 + -468 -499 500 0 + 499 -500 0 + 468 -500 0 + -469 -500 501 0 + 500 -501 0 + 469 -501 0 + -470 -501 502 0 + 501 -502 0 + 470 -502 0 + -471 -502 503 0 + 502 -503 0 + 471 -503 0 + -472 -503 504 0 + 503 -504 0 + 472 -504 0 + -473 -504 505 0 + 504 -505 0 + 473 -505 0 + -474 -505 506 0 + 505 -506 0 + 474 -506 0 + -475 -506 507 0 + 506 -507 0 + 475 -507 0 + -476 -507 508 0 + 507 -508 0 + 476 -508 0 + -477 -508 509 0 + 508 -509 0 + 477 -509 0 + -478 -509 510 0 + 509 -510 0 + 478 -510 0 + -479 -510 511 0 + 510 -511 0 + 479 -511 0 + -480 -511 512 0 + 511 -512 0 + 480 -512 0 + -481 -512 513 0 + 512 -513 0 + 481 -513 0 + -482 -513 514 0 + 513 -514 0 + 482 -514 0 + -483 -514 515 0 + 514 -515 0 + 483 -515 0 + -484 -515 516 0 + 515 -516 0 + 484 -516 0 + -485 -516 517 0 + 516 -517 0 + 485 -517 0 + -486 -517 518 0 + 517 -518 0 + 486 -518 0 + -454 518 0 + 454 -518 0 + 519 -551 0 + -519 551 0 + 520 -552 0 + -520 552 0 + 521 -553 0 + -521 553 0 + 522 -554 0 + -522 554 0 + 523 -555 0 + -523 555 0 + 524 -556 0 + -524 556 0 + 525 -557 0 + -525 557 0 + 526 -558 0 + -526 558 0 + 527 -559 0 + -527 559 0 + 528 -560 0 + -528 560 0 + 529 -561 0 + -529 561 0 + 530 -562 0 + -530 562 0 + 531 -563 0 + -531 563 0 + 532 -564 0 + -532 564 0 + 533 -565 0 + -533 565 0 + 534 -566 0 + -534 566 0 + 535 -567 0 + -535 567 0 + 536 -568 0 + -536 568 0 + 537 -569 0 + -537 569 0 + 538 -570 0 + -538 570 0 + 539 -571 0 + -539 571 0 + 540 -572 0 + -540 572 0 + 541 -573 0 + -541 573 0 + 542 -574 0 + -542 574 0 + 543 -575 0 + -543 575 0 + 544 -576 0 + -544 576 0 + 545 -577 0 + -545 577 0 + 546 -578 0 + -546 578 0 + 547 -579 0 + -547 579 0 + 548 -580 0 + -548 580 0 + 549 -581 0 + -549 581 0 + 550 -582 0 + -550 582 0 + -551 583 0 + 35 -583 0 + 551 -583 0 + -36 -552 584 0 + 552 -584 0 + -37 -553 585 0 + 553 -585 0 + -38 -554 586 0 + 554 -586 0 + -39 -555 587 0 + 555 -587 0 + -40 -556 588 0 + 556 -588 0 + -41 -557 589 0 + 557 -589 0 + -42 -558 590 0 + 558 -590 0 + -43 -559 591 0 + 559 -591 0 + -44 -560 592 0 + 560 -592 0 + -45 -561 593 0 + 561 -593 0 + -46 -562 594 0 + 562 -594 0 + -47 -563 595 0 + 563 -595 0 + -48 -564 596 0 + 564 -596 0 + -49 -565 597 0 + 565 -597 0 + -50 -566 598 0 + 566 -598 0 + -51 -567 599 0 + 567 -599 0 + -52 -568 600 0 + 568 -600 0 + -53 -569 601 0 + 569 -601 0 + -54 -570 602 0 + 570 -602 0 + -55 -571 603 0 + 571 -603 0 + -56 -572 604 0 + 572 -604 0 + -57 -573 605 0 + 573 -605 0 + -58 -574 606 0 + 574 -606 0 + -59 -575 607 0 + 575 -607 0 + -60 -576 608 0 + 576 -608 0 + -61 -577 609 0 + 577 -609 0 + -62 -578 610 0 + 578 -610 0 + -63 -579 611 0 + 579 -611 0 + -64 -580 612 0 + 580 -612 0 + -65 -581 613 0 + 581 -613 0 + -66 -582 614 0 + 582 -614 0 + -583 615 647 0 + 583 -615 647 0 + 583 615 -647 0 + -583 -615 -647 0 + -584 616 648 0 + -616 648 0 + 616 -648 0 + -584 -616 -648 0 + -585 617 649 0 + -617 649 0 + 617 -649 0 + -585 -617 -649 0 + -586 618 650 0 + -618 650 0 + 618 -650 0 + -586 -618 -650 0 + -587 619 651 0 + -619 651 0 + 619 -651 0 + -587 -619 -651 0 + -588 620 652 0 + -620 652 0 + 620 -652 0 + -588 -620 -652 0 + -589 621 653 0 + -621 653 0 + 621 -653 0 + -589 -621 -653 0 + -590 622 654 0 + -622 654 0 + 622 -654 0 + -590 -622 -654 0 + -591 623 655 0 + -623 655 0 + 623 -655 0 + -591 -623 -655 0 + -592 624 656 0 + -624 656 0 + 624 -656 0 + -592 -624 -656 0 + -593 625 657 0 + -625 657 0 + 625 -657 0 + -593 -625 -657 0 + -594 626 658 0 + -626 658 0 + 626 -658 0 + -594 -626 -658 0 + -595 627 659 0 + -627 659 0 + 627 -659 0 + -595 -627 -659 0 + -596 628 660 0 + -628 660 0 + 628 -660 0 + -596 -628 -660 0 + -597 629 661 0 + -629 661 0 + 629 -661 0 + -597 -629 -661 0 + -598 630 662 0 + -630 662 0 + 630 -662 0 + -598 -630 -662 0 + -599 631 663 0 + -631 663 0 + 631 -663 0 + -599 -631 -663 0 + -600 632 664 0 + -632 664 0 + 632 -664 0 + -600 -632 -664 0 + -601 633 665 0 + -633 665 0 + 633 -665 0 + -601 -633 -665 0 + -602 634 666 0 + -634 666 0 + 634 -666 0 + -602 -634 -666 0 + -603 635 667 0 + -635 667 0 + 635 -667 0 + -603 -635 -667 0 + -604 636 668 0 + -636 668 0 + 636 -668 0 + -604 -636 -668 0 + -605 637 669 0 + -637 669 0 + 637 -669 0 + -605 -637 -669 0 + -606 638 670 0 + -638 670 0 + 638 -670 0 + -606 -638 -670 0 + -607 639 671 0 + -639 671 0 + 639 -671 0 + -607 -639 -671 0 + -608 640 672 0 + -640 672 0 + 640 -672 0 + -608 -640 -672 0 + -609 641 673 0 + -641 673 0 + 641 -673 0 + -609 -641 -673 0 + -610 642 674 0 + -642 674 0 + 642 -674 0 + -610 -642 -674 0 + -611 643 675 0 + -643 675 0 + 643 -675 0 + -611 -643 -675 0 + -612 644 676 0 + -644 676 0 + 644 -676 0 + -612 -644 -676 0 + -613 645 677 0 + -645 677 0 + 645 -677 0 + -613 -645 -677 0 + -614 646 678 0 + -646 678 0 + 646 -678 0 + -614 -646 -678 0 + 647 679 0 + 35 -647 679 0 + 35 647 -679 0 + -647 -679 0 + -36 648 680 0 + -648 680 0 + 648 -680 0 + -36 -648 -680 0 + -37 649 681 0 + -649 681 0 + 649 -681 0 + -37 -649 -681 0 + -38 650 682 0 + -650 682 0 + 650 -682 0 + -38 -650 -682 0 + -39 651 683 0 + -651 683 0 + 651 -683 0 + -39 -651 -683 0 + -40 652 684 0 + -652 684 0 + 652 -684 0 + -40 -652 -684 0 + -41 653 685 0 + -653 685 0 + 653 -685 0 + -41 -653 -685 0 + -42 654 686 0 + -654 686 0 + 654 -686 0 + -42 -654 -686 0 + -43 655 687 0 + -655 687 0 + 655 -687 0 + -43 -655 -687 0 + -44 656 688 0 + -656 688 0 + 656 -688 0 + -44 -656 -688 0 + -45 657 689 0 + -657 689 0 + 657 -689 0 + -45 -657 -689 0 + -46 658 690 0 + -658 690 0 + 658 -690 0 + -46 -658 -690 0 + -47 659 691 0 + -659 691 0 + 659 -691 0 + -47 -659 -691 0 + -48 660 692 0 + -660 692 0 + 660 -692 0 + -48 -660 -692 0 + -49 661 693 0 + -661 693 0 + 661 -693 0 + -49 -661 -693 0 + -50 662 694 0 + -662 694 0 + 662 -694 0 + -50 -662 -694 0 + -51 663 695 0 + -663 695 0 + 663 -695 0 + -51 -663 -695 0 + -52 664 696 0 + -664 696 0 + 664 -696 0 + -52 -664 -696 0 + -53 665 697 0 + -665 697 0 + 665 -697 0 + -53 -665 -697 0 + -54 666 698 0 + -666 698 0 + 666 -698 0 + -54 -666 -698 0 + -55 667 699 0 + -667 699 0 + 667 -699 0 + -55 -667 -699 0 + -56 668 700 0 + -668 700 0 + 668 -700 0 + -56 -668 -700 0 + -57 669 701 0 + -669 701 0 + 669 -701 0 + -57 -669 -701 0 + -58 670 702 0 + -670 702 0 + 670 -702 0 + -58 -670 -702 0 + -59 671 703 0 + -671 703 0 + 671 -703 0 + -59 -671 -703 0 + -60 672 704 0 + -672 704 0 + 672 -704 0 + -60 -672 -704 0 + -61 673 705 0 + -673 705 0 + 673 -705 0 + -61 -673 -705 0 + -62 674 706 0 + -674 706 0 + 674 -706 0 + -62 -674 -706 0 + -63 675 707 0 + -675 707 0 + 675 -707 0 + -63 -675 -707 0 + -64 676 708 0 + -676 708 0 + 676 -708 0 + -64 -676 -708 0 + -65 677 709 0 + -677 709 0 + 677 -709 0 + -65 -677 -709 0 + -66 678 710 0 + -678 710 0 + 678 -710 0 + -66 -678 -710 0 + -454 -551 711 0 + -454 551 -711 0 + 454 -679 711 0 + 454 679 -711 0 + -454 -552 712 0 + -454 552 -712 0 + 454 -680 712 0 + 454 680 -712 0 + -454 -553 713 0 + -454 553 -713 0 + 454 -681 713 0 + 454 681 -713 0 + -454 -554 714 0 + -454 554 -714 0 + 454 -682 714 0 + 454 682 -714 0 + -454 -555 715 0 + -454 555 -715 0 + 454 -683 715 0 + 454 683 -715 0 + -454 -556 716 0 + -454 556 -716 0 + 454 -684 716 0 + 454 684 -716 0 + -454 -557 717 0 + -454 557 -717 0 + 454 -685 717 0 + 454 685 -717 0 + -454 -558 718 0 + -454 558 -718 0 + 454 -686 718 0 + 454 686 -718 0 + -454 -559 719 0 + -454 559 -719 0 + 454 -687 719 0 + 454 687 -719 0 + -454 -560 720 0 + -454 560 -720 0 + 454 -688 720 0 + 454 688 -720 0 + -454 -561 721 0 + -454 561 -721 0 + 454 -689 721 0 + 454 689 -721 0 + -454 -562 722 0 + -454 562 -722 0 + 454 -690 722 0 + 454 690 -722 0 + -454 -563 723 0 + -454 563 -723 0 + 454 -691 723 0 + 454 691 -723 0 + -454 -564 724 0 + -454 564 -724 0 + 454 -692 724 0 + 454 692 -724 0 + -454 -565 725 0 + -454 565 -725 0 + 454 -693 725 0 + 454 693 -725 0 + -454 -566 726 0 + -454 566 -726 0 + 454 -694 726 0 + 454 694 -726 0 + -454 -567 727 0 + -454 567 -727 0 + 454 -695 727 0 + 454 695 -727 0 + -454 -568 728 0 + -454 568 -728 0 + 454 -696 728 0 + 454 696 -728 0 + -454 -569 729 0 + -454 569 -729 0 + 454 -697 729 0 + 454 697 -729 0 + -454 -570 730 0 + -454 570 -730 0 + 454 -698 730 0 + 454 698 -730 0 + -454 -571 731 0 + -454 571 -731 0 + 454 -699 731 0 + 454 699 -731 0 + -454 -572 732 0 + -454 572 -732 0 + 454 -700 732 0 + 454 700 -732 0 + -454 -573 733 0 + -454 573 -733 0 + 454 -701 733 0 + 454 701 -733 0 + -454 -574 734 0 + -454 574 -734 0 + 454 -702 734 0 + 454 702 -734 0 + -454 -575 735 0 + -454 575 -735 0 + 454 -703 735 0 + 454 703 -735 0 + -454 -576 736 0 + -454 576 -736 0 + 454 -704 736 0 + 454 704 -736 0 + -454 -577 737 0 + -454 577 -737 0 + 454 -705 737 0 + 454 705 -737 0 + -454 -578 738 0 + -454 578 -738 0 + 454 -706 738 0 + 454 706 -738 0 + -454 -579 739 0 + -454 579 -739 0 + 454 -707 739 0 + 454 707 -739 0 + -454 -580 740 0 + -454 580 -740 0 + 454 -708 740 0 + 454 708 -740 0 + -454 -581 741 0 + -454 581 -741 0 + 454 -709 741 0 + 454 709 -741 0 + -454 -582 742 0 + -454 582 -742 0 + 454 -710 742 0 + 454 710 -742 0 + 519 711 744 0 + -519 -711 744 0 + -519 711 -744 0 + 519 -711 -744 0 + 520 712 745 0 + -520 -712 745 0 + -520 712 -745 0 + 520 -712 -745 0 + 521 713 746 0 + -521 -713 746 0 + -521 713 -746 0 + 521 -713 -746 0 + 522 714 747 0 + -522 -714 747 0 + -522 714 -747 0 + 522 -714 -747 0 + 523 715 748 0 + -523 -715 748 0 + -523 715 -748 0 + 523 -715 -748 0 + 524 716 749 0 + -524 -716 749 0 + -524 716 -749 0 + 524 -716 -749 0 + 525 717 750 0 + -525 -717 750 0 + -525 717 -750 0 + 525 -717 -750 0 + 526 718 751 0 + -526 -718 751 0 + -526 718 -751 0 + 526 -718 -751 0 + 527 719 752 0 + -527 -719 752 0 + -527 719 -752 0 + 527 -719 -752 0 + 528 720 753 0 + -528 -720 753 0 + -528 720 -753 0 + 528 -720 -753 0 + 529 721 754 0 + -529 -721 754 0 + -529 721 -754 0 + 529 -721 -754 0 + 530 722 755 0 + -530 -722 755 0 + -530 722 -755 0 + 530 -722 -755 0 + 531 723 756 0 + -531 -723 756 0 + -531 723 -756 0 + 531 -723 -756 0 + 532 724 757 0 + -532 -724 757 0 + -532 724 -757 0 + 532 -724 -757 0 + 533 725 758 0 + -533 -725 758 0 + -533 725 -758 0 + 533 -725 -758 0 + 534 726 759 0 + -534 -726 759 0 + -534 726 -759 0 + 534 -726 -759 0 + 535 727 760 0 + -535 -727 760 0 + -535 727 -760 0 + 535 -727 -760 0 + 536 728 761 0 + -536 -728 761 0 + -536 728 -761 0 + 536 -728 -761 0 + 537 729 762 0 + -537 -729 762 0 + -537 729 -762 0 + 537 -729 -762 0 + 538 730 763 0 + -538 -730 763 0 + -538 730 -763 0 + 538 -730 -763 0 + 539 731 764 0 + -539 -731 764 0 + -539 731 -764 0 + 539 -731 -764 0 + 540 732 765 0 + -540 -732 765 0 + -540 732 -765 0 + 540 -732 -765 0 + 541 733 766 0 + -541 -733 766 0 + -541 733 -766 0 + 541 -733 -766 0 + 542 734 767 0 + -542 -734 767 0 + -542 734 -767 0 + 542 -734 -767 0 + 543 735 768 0 + -543 -735 768 0 + -543 735 -768 0 + 543 -735 -768 0 + 544 736 769 0 + -544 -736 769 0 + -544 736 -769 0 + 544 -736 -769 0 + 545 737 770 0 + -545 -737 770 0 + -545 737 -770 0 + 545 -737 -770 0 + 546 738 771 0 + -546 -738 771 0 + -546 738 -771 0 + 546 -738 -771 0 + 547 739 772 0 + -547 -739 772 0 + -547 739 -772 0 + 547 -739 -772 0 + 548 740 773 0 + -548 -740 773 0 + -548 740 -773 0 + 548 -740 -773 0 + 549 741 774 0 + -549 -741 774 0 + -549 741 -774 0 + 549 -741 -774 0 + 550 742 775 0 + -550 -742 775 0 + -550 742 -775 0 + 550 -742 -775 0 + -744 776 0 + 1 -776 0 + 744 -776 0 + -745 -776 777 0 + 776 -777 0 + 745 -777 0 + -746 -777 778 0 + 777 -778 0 + 746 -778 0 + -747 -778 779 0 + 778 -779 0 + 747 -779 0 + -748 -779 780 0 + 779 -780 0 + 748 -780 0 + -749 -780 781 0 + 780 -781 0 + 749 -781 0 + -750 -781 782 0 + 781 -782 0 + 750 -782 0 + -751 -782 783 0 + 782 -783 0 + 751 -783 0 + -752 -783 784 0 + 783 -784 0 + 752 -784 0 + -753 -784 785 0 + 784 -785 0 + 753 -785 0 + -754 -785 786 0 + 785 -786 0 + 754 -786 0 + -755 -786 787 0 + 786 -787 0 + 755 -787 0 + -756 -787 788 0 + 787 -788 0 + 756 -788 0 + -757 -788 789 0 + 788 -789 0 + 757 -789 0 + -758 -789 790 0 + 789 -790 0 + 758 -790 0 + -759 -790 791 0 + 790 -791 0 + 759 -791 0 + -760 -791 792 0 + 791 -792 0 + 760 -792 0 + -761 -792 793 0 + 792 -793 0 + 761 -793 0 + -762 -793 794 0 + 793 -794 0 + 762 -794 0 + -763 -794 795 0 + 794 -795 0 + 763 -795 0 + -764 -795 796 0 + 795 -796 0 + 764 -796 0 + -765 -796 797 0 + 796 -797 0 + 765 -797 0 + -766 -797 798 0 + 797 -798 0 + 766 -798 0 + -767 -798 799 0 + 798 -799 0 + 767 -799 0 + -768 -799 800 0 + 799 -800 0 + 768 -800 0 + -769 -800 801 0 + 800 -801 0 + 769 -801 0 + -770 -801 802 0 + 801 -802 0 + 770 -802 0 + -771 -802 803 0 + 802 -803 0 + 771 -803 0 + -772 -803 804 0 + 803 -804 0 + 772 -804 0 + -773 -804 805 0 + 804 -805 0 + 773 -805 0 + -774 -805 806 0 + 805 -806 0 + 774 -806 0 + -775 -806 807 0 + 806 -807 0 + 775 -807 0 + -743 807 0 + 743 -807 0 + 840 905 0 + -840 -905 0 + 841 906 0 + -841 -906 0 + 842 907 0 + -842 -907 0 + 843 908 0 + -843 -908 0 + 844 909 0 + -844 -909 0 + 845 910 0 + -845 -910 0 + 846 911 0 + -846 -911 0 + 847 912 0 + -847 -912 0 + 848 913 0 + -848 -913 0 + 849 914 0 + -849 -914 0 + 850 915 0 + -850 -915 0 + 851 916 0 + -851 -916 0 + 852 917 0 + -852 -917 0 + 853 918 0 + -853 -918 0 + 854 919 0 + -854 -919 0 + 855 920 0 + -855 -920 0 + 856 921 0 + -856 -921 0 + 857 922 0 + -857 -922 0 + 858 923 0 + -858 -923 0 + 859 924 0 + -859 -924 0 + 860 925 0 + -860 -925 0 + 861 926 0 + -861 -926 0 + 862 927 0 + -862 -927 0 + 863 928 0 + -863 -928 0 + 864 929 0 + -864 -929 0 + 865 930 0 + -865 -930 0 + 866 931 0 + -866 -931 0 + 867 932 0 + -867 -932 0 + 868 933 0 + -868 -933 0 + 869 934 0 + -869 -934 0 + 870 935 0 + -870 -935 0 + 871 936 0 + -871 -936 0 + -808 905 937 0 + 808 -905 937 0 + 808 905 -937 0 + -808 -905 -937 0 + -808 -905 939 0 + 808 -939 0 + 905 -939 0 + -937 938 0 + 937 -938 0 + 1 -938 0 + 938 939 -940 0 + -938 940 0 + -939 940 0 + 1 873 -937 0 + 873 937 0 + 1 -873 937 0 + -873 -937 0 + -809 906 941 0 + 809 -906 941 0 + 809 906 -941 0 + -809 -906 -941 0 + -809 -906 943 0 + 809 -943 0 + 906 -943 0 + -940 -941 942 0 + 941 -942 0 + 940 -942 0 + 942 943 -944 0 + -942 944 0 + -943 944 0 + 874 940 -941 0 + 874 -940 941 0 + -874 940 941 0 + -874 -940 -941 0 + -810 907 945 0 + 810 -907 945 0 + 810 907 -945 0 + -810 -907 -945 0 + -810 -907 947 0 + 810 -947 0 + 907 -947 0 + -944 -945 946 0 + 945 -946 0 + 944 -946 0 + 946 947 -948 0 + -946 948 0 + -947 948 0 + 875 944 -945 0 + 875 -944 945 0 + -875 944 945 0 + -875 -944 -945 0 + -811 908 949 0 + 811 -908 949 0 + 811 908 -949 0 + -811 -908 -949 0 + -811 -908 951 0 + 811 -951 0 + 908 -951 0 + -948 -949 950 0 + 949 -950 0 + 948 -950 0 + 950 951 -952 0 + -950 952 0 + -951 952 0 + 876 948 -949 0 + 876 -948 949 0 + -876 948 949 0 + -876 -948 -949 0 + -812 909 953 0 + 812 -909 953 0 + 812 909 -953 0 + -812 -909 -953 0 + -812 -909 955 0 + 812 -955 0 + 909 -955 0 + -952 -953 954 0 + 953 -954 0 + 952 -954 0 + 954 955 -956 0 + -954 956 0 + -955 956 0 + 877 952 -953 0 + 877 -952 953 0 + -877 952 953 0 + -877 -952 -953 0 + -813 910 957 0 + 813 -910 957 0 + 813 910 -957 0 + -813 -910 -957 0 + -813 -910 959 0 + 813 -959 0 + 910 -959 0 + -956 -957 958 0 + 957 -958 0 + 956 -958 0 + 958 959 -960 0 + -958 960 0 + -959 960 0 + 878 956 -957 0 + 878 -956 957 0 + -878 956 957 0 + -878 -956 -957 0 + -814 911 961 0 + 814 -911 961 0 + 814 911 -961 0 + -814 -911 -961 0 + -814 -911 963 0 + 814 -963 0 + 911 -963 0 + -960 -961 962 0 + 961 -962 0 + 960 -962 0 + 962 963 -964 0 + -962 964 0 + -963 964 0 + 879 960 -961 0 + 879 -960 961 0 + -879 960 961 0 + -879 -960 -961 0 + -815 912 965 0 + 815 -912 965 0 + 815 912 -965 0 + -815 -912 -965 0 + -815 -912 967 0 + 815 -967 0 + 912 -967 0 + -964 -965 966 0 + 965 -966 0 + 964 -966 0 + 966 967 -968 0 + -966 968 0 + -967 968 0 + 880 964 -965 0 + 880 -964 965 0 + -880 964 965 0 + -880 -964 -965 0 + -816 913 969 0 + 816 -913 969 0 + 816 913 -969 0 + -816 -913 -969 0 + -816 -913 971 0 + 816 -971 0 + 913 -971 0 + -968 -969 970 0 + 969 -970 0 + 968 -970 0 + 970 971 -972 0 + -970 972 0 + -971 972 0 + 881 968 -969 0 + 881 -968 969 0 + -881 968 969 0 + -881 -968 -969 0 + -817 914 973 0 + 817 -914 973 0 + 817 914 -973 0 + -817 -914 -973 0 + -817 -914 975 0 + 817 -975 0 + 914 -975 0 + -972 -973 974 0 + 973 -974 0 + 972 -974 0 + 974 975 -976 0 + -974 976 0 + -975 976 0 + 882 972 -973 0 + 882 -972 973 0 + -882 972 973 0 + -882 -972 -973 0 + -818 915 977 0 + 818 -915 977 0 + 818 915 -977 0 + -818 -915 -977 0 + -818 -915 979 0 + 818 -979 0 + 915 -979 0 + -976 -977 978 0 + 977 -978 0 + 976 -978 0 + 978 979 -980 0 + -978 980 0 + -979 980 0 + 883 976 -977 0 + 883 -976 977 0 + -883 976 977 0 + -883 -976 -977 0 + -819 916 981 0 + 819 -916 981 0 + 819 916 -981 0 + -819 -916 -981 0 + -819 -916 983 0 + 819 -983 0 + 916 -983 0 + -980 -981 982 0 + 981 -982 0 + 980 -982 0 + 982 983 -984 0 + -982 984 0 + -983 984 0 + 884 980 -981 0 + 884 -980 981 0 + -884 980 981 0 + -884 -980 -981 0 + -820 917 985 0 + 820 -917 985 0 + 820 917 -985 0 + -820 -917 -985 0 + -820 -917 987 0 + 820 -987 0 + 917 -987 0 + -984 -985 986 0 + 985 -986 0 + 984 -986 0 + 986 987 -988 0 + -986 988 0 + -987 988 0 + 885 984 -985 0 + 885 -984 985 0 + -885 984 985 0 + -885 -984 -985 0 + -821 918 989 0 + 821 -918 989 0 + 821 918 -989 0 + -821 -918 -989 0 + -821 -918 991 0 + 821 -991 0 + 918 -991 0 + -988 -989 990 0 + 989 -990 0 + 988 -990 0 + 990 991 -992 0 + -990 992 0 + -991 992 0 + 886 988 -989 0 + 886 -988 989 0 + -886 988 989 0 + -886 -988 -989 0 + -822 919 993 0 + 822 -919 993 0 + 822 919 -993 0 + -822 -919 -993 0 + -822 -919 995 0 + 822 -995 0 + 919 -995 0 + -992 -993 994 0 + 993 -994 0 + 992 -994 0 + 994 995 -996 0 + -994 996 0 + -995 996 0 + 887 992 -993 0 + 887 -992 993 0 + -887 992 993 0 + -887 -992 -993 0 + -823 920 997 0 + 823 -920 997 0 + 823 920 -997 0 + -823 -920 -997 0 + -823 -920 999 0 + 823 -999 0 + 920 -999 0 + -996 -997 998 0 + 997 -998 0 + 996 -998 0 + 998 999 -1000 0 + -998 1000 0 + -999 1000 0 + 888 996 -997 0 + 888 -996 997 0 + -888 996 997 0 + -888 -996 -997 0 + -824 921 1001 0 + 824 -921 1001 0 + 824 921 -1001 0 + -824 -921 -1001 0 + -824 -921 1003 0 + 824 -1003 0 + 921 -1003 0 + -1000 -1001 1002 0 + 1001 -1002 0 + 1000 -1002 0 + 1002 1003 -1004 0 + -1002 1004 0 + -1003 1004 0 + 889 1000 -1001 0 + 889 -1000 1001 0 + -889 1000 1001 0 + -889 -1000 -1001 0 + -825 922 1005 0 + 825 -922 1005 0 + 825 922 -1005 0 + -825 -922 -1005 0 + -825 -922 1007 0 + 825 -1007 0 + 922 -1007 0 + -1004 -1005 1006 0 + 1005 -1006 0 + 1004 -1006 0 + 1006 1007 -1008 0 + -1006 1008 0 + -1007 1008 0 + 890 1004 -1005 0 + 890 -1004 1005 0 + -890 1004 1005 0 + -890 -1004 -1005 0 + -826 923 1009 0 + 826 -923 1009 0 + 826 923 -1009 0 + -826 -923 -1009 0 + -826 -923 1011 0 + 826 -1011 0 + 923 -1011 0 + -1008 -1009 1010 0 + 1009 -1010 0 + 1008 -1010 0 + 1010 1011 -1012 0 + -1010 1012 0 + -1011 1012 0 + 891 1008 -1009 0 + 891 -1008 1009 0 + -891 1008 1009 0 + -891 -1008 -1009 0 + -827 924 1013 0 + 827 -924 1013 0 + 827 924 -1013 0 + -827 -924 -1013 0 + -827 -924 1015 0 + 827 -1015 0 + 924 -1015 0 + -1012 -1013 1014 0 + 1013 -1014 0 + 1012 -1014 0 + 1014 1015 -1016 0 + -1014 1016 0 + -1015 1016 0 + 892 1012 -1013 0 + 892 -1012 1013 0 + -892 1012 1013 0 + -892 -1012 -1013 0 + -828 925 1017 0 + 828 -925 1017 0 + 828 925 -1017 0 + -828 -925 -1017 0 + -828 -925 1019 0 + 828 -1019 0 + 925 -1019 0 + -1016 -1017 1018 0 + 1017 -1018 0 + 1016 -1018 0 + 1018 1019 -1020 0 + -1018 1020 0 + -1019 1020 0 + 893 1016 -1017 0 + 893 -1016 1017 0 + -893 1016 1017 0 + -893 -1016 -1017 0 + -829 926 1021 0 + 829 -926 1021 0 + 829 926 -1021 0 + -829 -926 -1021 0 + -829 -926 1023 0 + 829 -1023 0 + 926 -1023 0 + -1020 -1021 1022 0 + 1021 -1022 0 + 1020 -1022 0 + 1022 1023 -1024 0 + -1022 1024 0 + -1023 1024 0 + 894 1020 -1021 0 + 894 -1020 1021 0 + -894 1020 1021 0 + -894 -1020 -1021 0 + -830 927 1025 0 + 830 -927 1025 0 + 830 927 -1025 0 + -830 -927 -1025 0 + -830 -927 1027 0 + 830 -1027 0 + 927 -1027 0 + -1024 -1025 1026 0 + 1025 -1026 0 + 1024 -1026 0 + 1026 1027 -1028 0 + -1026 1028 0 + -1027 1028 0 + 895 1024 -1025 0 + 895 -1024 1025 0 + -895 1024 1025 0 + -895 -1024 -1025 0 + -831 928 1029 0 + 831 -928 1029 0 + 831 928 -1029 0 + -831 -928 -1029 0 + -831 -928 1031 0 + 831 -1031 0 + 928 -1031 0 + -1028 -1029 1030 0 + 1029 -1030 0 + 1028 -1030 0 + 1030 1031 -1032 0 + -1030 1032 0 + -1031 1032 0 + 896 1028 -1029 0 + 896 -1028 1029 0 + -896 1028 1029 0 + -896 -1028 -1029 0 + -832 929 1033 0 + 832 -929 1033 0 + 832 929 -1033 0 + -832 -929 -1033 0 + -832 -929 1035 0 + 832 -1035 0 + 929 -1035 0 + -1032 -1033 1034 0 + 1033 -1034 0 + 1032 -1034 0 + 1034 1035 -1036 0 + -1034 1036 0 + -1035 1036 0 + 897 1032 -1033 0 + 897 -1032 1033 0 + -897 1032 1033 0 + -897 -1032 -1033 0 + -833 930 1037 0 + 833 -930 1037 0 + 833 930 -1037 0 + -833 -930 -1037 0 + -833 -930 1039 0 + 833 -1039 0 + 930 -1039 0 + -1036 -1037 1038 0 + 1037 -1038 0 + 1036 -1038 0 + 1038 1039 -1040 0 + -1038 1040 0 + -1039 1040 0 + 898 1036 -1037 0 + 898 -1036 1037 0 + -898 1036 1037 0 + -898 -1036 -1037 0 + -834 931 1041 0 + 834 -931 1041 0 + 834 931 -1041 0 + -834 -931 -1041 0 + -834 -931 1043 0 + 834 -1043 0 + 931 -1043 0 + -1040 -1041 1042 0 + 1041 -1042 0 + 1040 -1042 0 + 1042 1043 -1044 0 + -1042 1044 0 + -1043 1044 0 + 899 1040 -1041 0 + 899 -1040 1041 0 + -899 1040 1041 0 + -899 -1040 -1041 0 + -835 932 1045 0 + 835 -932 1045 0 + 835 932 -1045 0 + -835 -932 -1045 0 + -835 -932 1047 0 + 835 -1047 0 + 932 -1047 0 + -1044 -1045 1046 0 + 1045 -1046 0 + 1044 -1046 0 + 1046 1047 -1048 0 + -1046 1048 0 + -1047 1048 0 + 900 1044 -1045 0 + 900 -1044 1045 0 + -900 1044 1045 0 + -900 -1044 -1045 0 + -836 933 1049 0 + 836 -933 1049 0 + 836 933 -1049 0 + -836 -933 -1049 0 + -836 -933 1051 0 + 836 -1051 0 + 933 -1051 0 + -1048 -1049 1050 0 + 1049 -1050 0 + 1048 -1050 0 + 1050 1051 -1052 0 + -1050 1052 0 + -1051 1052 0 + 901 1048 -1049 0 + 901 -1048 1049 0 + -901 1048 1049 0 + -901 -1048 -1049 0 + -837 934 1053 0 + 837 -934 1053 0 + 837 934 -1053 0 + -837 -934 -1053 0 + -837 -934 1055 0 + 837 -1055 0 + 934 -1055 0 + -1052 -1053 1054 0 + 1053 -1054 0 + 1052 -1054 0 + 1054 1055 -1056 0 + -1054 1056 0 + -1055 1056 0 + 902 1052 -1053 0 + 902 -1052 1053 0 + -902 1052 1053 0 + -902 -1052 -1053 0 + -838 935 1057 0 + 838 -935 1057 0 + 838 935 -1057 0 + -838 -935 -1057 0 + -838 -935 1059 0 + 838 -1059 0 + 935 -1059 0 + -1056 -1057 1058 0 + 1057 -1058 0 + 1056 -1058 0 + 1058 1059 -1060 0 + -1058 1060 0 + -1059 1060 0 + 903 1056 -1057 0 + 903 -1056 1057 0 + -903 1056 1057 0 + -903 -1056 -1057 0 + -839 936 1061 0 + 839 -936 1061 0 + 839 936 -1061 0 + -839 -936 -1061 0 + -839 -936 1063 0 + 839 -1063 0 + 936 -1063 0 + -1060 -1061 1062 0 + 1061 -1062 0 + 1060 -1062 0 + 1062 1063 -1064 0 + -1062 1064 0 + -1063 1064 0 + 904 1060 -1061 0 + 904 -1060 1061 0 + -904 1060 1061 0 + -904 -1060 -1061 0 + 872 1064 0 + -872 -1064 0 + 1065 1130 0 + -1065 -1097 1130 0 + -1065 -1130 0 + 1065 -1097 -1130 0 + 1066 1131 0 + -1066 -1098 1131 0 + -1066 -1131 0 + 1066 -1098 -1131 0 + 1067 1132 0 + -1067 -1099 1132 0 + -1067 -1132 0 + 1067 -1099 -1132 0 + 1068 1133 0 + -1068 -1100 1133 0 + -1068 -1133 0 + 1068 -1100 -1133 0 + 1069 1134 0 + -1069 -1101 1134 0 + -1069 -1134 0 + 1069 -1101 -1134 0 + 1070 1135 0 + -1070 -1102 1135 0 + -1070 -1135 0 + 1070 -1102 -1135 0 + 1071 1136 0 + -1071 -1103 1136 0 + -1071 -1136 0 + 1071 -1103 -1136 0 + 1072 1137 0 + -1072 -1104 1137 0 + -1072 -1137 0 + 1072 -1104 -1137 0 + 1073 1138 0 + -1073 -1105 1138 0 + -1073 -1138 0 + 1073 -1105 -1138 0 + 1074 1139 0 + -1074 -1106 1139 0 + -1074 -1139 0 + 1074 -1106 -1139 0 + 1075 1140 0 + -1075 -1107 1140 0 + -1075 -1140 0 + 1075 -1107 -1140 0 + 1076 1141 0 + -1076 -1108 1141 0 + -1076 -1141 0 + 1076 -1108 -1141 0 + 1077 1142 0 + -1077 -1109 1142 0 + -1077 -1142 0 + 1077 -1109 -1142 0 + 1078 1143 0 + -1078 -1110 1143 0 + -1078 -1143 0 + 1078 -1110 -1143 0 + 1079 1144 0 + -1079 -1111 1144 0 + -1079 -1144 0 + 1079 -1111 -1144 0 + 1080 1145 0 + -1080 -1112 1145 0 + -1080 -1145 0 + 1080 -1112 -1145 0 + 1081 1146 0 + -1081 -1113 1146 0 + -1081 -1146 0 + 1081 -1113 -1146 0 + 1082 1147 0 + -1082 -1114 1147 0 + -1082 -1147 0 + 1082 -1114 -1147 0 + 1083 1148 0 + -1083 -1115 1148 0 + -1083 -1148 0 + 1083 -1115 -1148 0 + 1084 1149 0 + -1084 -1116 1149 0 + -1084 -1149 0 + 1084 -1116 -1149 0 + 1085 1150 0 + -1085 -1117 1150 0 + -1085 -1150 0 + 1085 -1117 -1150 0 + 1086 1151 0 + -1086 -1118 1151 0 + -1086 -1151 0 + 1086 -1118 -1151 0 + 1087 1152 0 + -1087 -1119 1152 0 + -1087 -1152 0 + 1087 -1119 -1152 0 + 1088 1153 0 + -1088 -1120 1153 0 + -1088 -1153 0 + 1088 -1120 -1153 0 + 1089 1154 0 + -1089 -1121 1154 0 + -1089 -1154 0 + 1089 -1121 -1154 0 + 1090 1155 0 + -1090 -1122 1155 0 + -1090 -1155 0 + 1090 -1122 -1155 0 + 1091 1156 0 + -1091 -1123 1156 0 + -1091 -1156 0 + 1091 -1123 -1156 0 + 1092 1157 0 + -1092 -1124 1157 0 + -1092 -1157 0 + 1092 -1124 -1157 0 + 1093 1158 0 + -1093 -1125 1158 0 + -1093 -1158 0 + 1093 -1125 -1158 0 + 1094 1159 0 + -1094 -1126 1159 0 + -1094 -1159 0 + 1094 -1126 -1159 0 + 1095 1160 0 + -1095 -1127 1160 0 + -1095 -1160 0 + 1095 -1127 -1160 0 + 1096 1161 0 + -1096 -1128 1161 0 + -1096 -1161 0 + 1096 -1128 -1161 0 + -1130 1162 0 + 1 -1162 0 + 1130 -1162 0 + -1131 -1162 1163 0 + 1162 -1163 0 + 1131 -1163 0 + -1132 -1163 1164 0 + 1163 -1164 0 + 1132 -1164 0 + -1133 -1164 1165 0 + 1164 -1165 0 + 1133 -1165 0 + -1134 -1165 1166 0 + 1165 -1166 0 + 1134 -1166 0 + -1135 -1166 1167 0 + 1166 -1167 0 + 1135 -1167 0 + -1136 -1167 1168 0 + 1167 -1168 0 + 1136 -1168 0 + -1137 -1168 1169 0 + 1168 -1169 0 + 1137 -1169 0 + -1138 -1169 1170 0 + 1169 -1170 0 + 1138 -1170 0 + -1139 -1170 1171 0 + 1170 -1171 0 + 1139 -1171 0 + -1140 -1171 1172 0 + 1171 -1172 0 + 1140 -1172 0 + -1141 -1172 1173 0 + 1172 -1173 0 + 1141 -1173 0 + -1142 -1173 1174 0 + 1173 -1174 0 + 1142 -1174 0 + -1143 -1174 1175 0 + 1174 -1175 0 + 1143 -1175 0 + -1144 -1175 1176 0 + 1175 -1176 0 + 1144 -1176 0 + -1145 -1176 1177 0 + 1176 -1177 0 + 1145 -1177 0 + -1146 -1177 1178 0 + 1177 -1178 0 + 1146 -1178 0 + -1147 -1178 1179 0 + 1178 -1179 0 + 1147 -1179 0 + -1148 -1179 1180 0 + 1179 -1180 0 + 1148 -1180 0 + -1149 -1180 1181 0 + 1180 -1181 0 + 1149 -1181 0 + -1150 -1181 1182 0 + 1181 -1182 0 + 1150 -1182 0 + -1151 -1182 1183 0 + 1182 -1183 0 + 1151 -1183 0 + -1152 -1183 1184 0 + 1183 -1184 0 + 1152 -1184 0 + -1153 -1184 1185 0 + 1184 -1185 0 + 1153 -1185 0 + -1154 -1185 1186 0 + 1185 -1186 0 + 1154 -1186 0 + -1155 -1186 1187 0 + 1186 -1187 0 + 1155 -1187 0 + -1156 -1187 1188 0 + 1187 -1188 0 + 1156 -1188 0 + -1157 -1188 1189 0 + 1188 -1189 0 + 1157 -1189 0 + -1158 -1189 1190 0 + 1189 -1190 0 + 1158 -1190 0 + -1159 -1190 1191 0 + 1190 -1191 0 + 1159 -1191 0 + -1160 -1191 1192 0 + 1191 -1192 0 + 1160 -1192 0 + -1161 -1192 1193 0 + 1192 -1193 0 + 1161 -1193 0 + -1129 1193 0 + 1129 -1193 0 + 840 1227 0 + -840 -1227 0 + 841 1228 0 + -841 -1228 0 + 842 1229 0 + -842 -1229 0 + 843 1230 0 + -843 -1230 0 + 844 1231 0 + -844 -1231 0 + 845 1232 0 + -845 -1232 0 + 846 1233 0 + -846 -1233 0 + 847 1234 0 + -847 -1234 0 + 848 1235 0 + -848 -1235 0 + 849 1236 0 + -849 -1236 0 + 850 1237 0 + -850 -1237 0 + 851 1238 0 + -851 -1238 0 + 852 1239 0 + -852 -1239 0 + 853 1240 0 + -853 -1240 0 + 854 1241 0 + -854 -1241 0 + 855 1242 0 + -855 -1242 0 + 856 1243 0 + -856 -1243 0 + 857 1244 0 + -857 -1244 0 + 858 1245 0 + -858 -1245 0 + 859 1246 0 + -859 -1246 0 + 860 1247 0 + -860 -1247 0 + 861 1248 0 + -861 -1248 0 + 862 1249 0 + -862 -1249 0 + 863 1250 0 + -863 -1250 0 + 864 1251 0 + -864 -1251 0 + 865 1252 0 + -865 -1252 0 + 866 1253 0 + -866 -1253 0 + 867 1254 0 + -867 -1254 0 + 868 1255 0 + -868 -1255 0 + 869 1256 0 + -869 -1256 0 + 870 1257 0 + -870 -1257 0 + 871 1258 0 + -871 -1258 0 + -808 1227 1259 0 + 808 -1227 1259 0 + 808 1227 -1259 0 + -808 -1227 -1259 0 + -808 -1227 1261 0 + 808 -1261 0 + 1227 -1261 0 + -1259 1260 0 + 1259 -1260 0 + 1 -1260 0 + 1260 1261 -1262 0 + -1260 1262 0 + -1261 1262 0 + 1 1195 -1259 0 + 1195 1259 0 + 1 -1195 1259 0 + -1195 -1259 0 + -809 1228 1263 0 + 809 -1228 1263 0 + 809 1228 -1263 0 + -809 -1228 -1263 0 + -809 -1228 1265 0 + 809 -1265 0 + 1228 -1265 0 + -1262 -1263 1264 0 + 1263 -1264 0 + 1262 -1264 0 + 1264 1265 -1266 0 + -1264 1266 0 + -1265 1266 0 + 1196 1262 -1263 0 + 1196 -1262 1263 0 + -1196 1262 1263 0 + -1196 -1262 -1263 0 + -810 1229 1267 0 + 810 -1229 1267 0 + 810 1229 -1267 0 + -810 -1229 -1267 0 + -810 -1229 1269 0 + 810 -1269 0 + 1229 -1269 0 + -1266 -1267 1268 0 + 1267 -1268 0 + 1266 -1268 0 + 1268 1269 -1270 0 + -1268 1270 0 + -1269 1270 0 + 1197 1266 -1267 0 + 1197 -1266 1267 0 + -1197 1266 1267 0 + -1197 -1266 -1267 0 + -811 1230 1271 0 + 811 -1230 1271 0 + 811 1230 -1271 0 + -811 -1230 -1271 0 + -811 -1230 1273 0 + 811 -1273 0 + 1230 -1273 0 + -1270 -1271 1272 0 + 1271 -1272 0 + 1270 -1272 0 + 1272 1273 -1274 0 + -1272 1274 0 + -1273 1274 0 + 1198 1270 -1271 0 + 1198 -1270 1271 0 + -1198 1270 1271 0 + -1198 -1270 -1271 0 + -812 1231 1275 0 + 812 -1231 1275 0 + 812 1231 -1275 0 + -812 -1231 -1275 0 + -812 -1231 1277 0 + 812 -1277 0 + 1231 -1277 0 + -1274 -1275 1276 0 + 1275 -1276 0 + 1274 -1276 0 + 1276 1277 -1278 0 + -1276 1278 0 + -1277 1278 0 + 1199 1274 -1275 0 + 1199 -1274 1275 0 + -1199 1274 1275 0 + -1199 -1274 -1275 0 + -813 1232 1279 0 + 813 -1232 1279 0 + 813 1232 -1279 0 + -813 -1232 -1279 0 + -813 -1232 1281 0 + 813 -1281 0 + 1232 -1281 0 + -1278 -1279 1280 0 + 1279 -1280 0 + 1278 -1280 0 + 1280 1281 -1282 0 + -1280 1282 0 + -1281 1282 0 + 1200 1278 -1279 0 + 1200 -1278 1279 0 + -1200 1278 1279 0 + -1200 -1278 -1279 0 + -814 1233 1283 0 + 814 -1233 1283 0 + 814 1233 -1283 0 + -814 -1233 -1283 0 + -814 -1233 1285 0 + 814 -1285 0 + 1233 -1285 0 + -1282 -1283 1284 0 + 1283 -1284 0 + 1282 -1284 0 + 1284 1285 -1286 0 + -1284 1286 0 + -1285 1286 0 + 1201 1282 -1283 0 + 1201 -1282 1283 0 + -1201 1282 1283 0 + -1201 -1282 -1283 0 + -815 1234 1287 0 + 815 -1234 1287 0 + 815 1234 -1287 0 + -815 -1234 -1287 0 + -815 -1234 1289 0 + 815 -1289 0 + 1234 -1289 0 + -1286 -1287 1288 0 + 1287 -1288 0 + 1286 -1288 0 + 1288 1289 -1290 0 + -1288 1290 0 + -1289 1290 0 + 1202 1286 -1287 0 + 1202 -1286 1287 0 + -1202 1286 1287 0 + -1202 -1286 -1287 0 + -816 1235 1291 0 + 816 -1235 1291 0 + 816 1235 -1291 0 + -816 -1235 -1291 0 + -816 -1235 1293 0 + 816 -1293 0 + 1235 -1293 0 + -1290 -1291 1292 0 + 1291 -1292 0 + 1290 -1292 0 + 1292 1293 -1294 0 + -1292 1294 0 + -1293 1294 0 + 1203 1290 -1291 0 + 1203 -1290 1291 0 + -1203 1290 1291 0 + -1203 -1290 -1291 0 + -817 1236 1295 0 + 817 -1236 1295 0 + 817 1236 -1295 0 + -817 -1236 -1295 0 + -817 -1236 1297 0 + 817 -1297 0 + 1236 -1297 0 + -1294 -1295 1296 0 + 1295 -1296 0 + 1294 -1296 0 + 1296 1297 -1298 0 + -1296 1298 0 + -1297 1298 0 + 1204 1294 -1295 0 + 1204 -1294 1295 0 + -1204 1294 1295 0 + -1204 -1294 -1295 0 + -818 1237 1299 0 + 818 -1237 1299 0 + 818 1237 -1299 0 + -818 -1237 -1299 0 + -818 -1237 1301 0 + 818 -1301 0 + 1237 -1301 0 + -1298 -1299 1300 0 + 1299 -1300 0 + 1298 -1300 0 + 1300 1301 -1302 0 + -1300 1302 0 + -1301 1302 0 + 1205 1298 -1299 0 + 1205 -1298 1299 0 + -1205 1298 1299 0 + -1205 -1298 -1299 0 + -819 1238 1303 0 + 819 -1238 1303 0 + 819 1238 -1303 0 + -819 -1238 -1303 0 + -819 -1238 1305 0 + 819 -1305 0 + 1238 -1305 0 + -1302 -1303 1304 0 + 1303 -1304 0 + 1302 -1304 0 + 1304 1305 -1306 0 + -1304 1306 0 + -1305 1306 0 + 1206 1302 -1303 0 + 1206 -1302 1303 0 + -1206 1302 1303 0 + -1206 -1302 -1303 0 + -820 1239 1307 0 + 820 -1239 1307 0 + 820 1239 -1307 0 + -820 -1239 -1307 0 + -820 -1239 1309 0 + 820 -1309 0 + 1239 -1309 0 + -1306 -1307 1308 0 + 1307 -1308 0 + 1306 -1308 0 + 1308 1309 -1310 0 + -1308 1310 0 + -1309 1310 0 + 1207 1306 -1307 0 + 1207 -1306 1307 0 + -1207 1306 1307 0 + -1207 -1306 -1307 0 + -821 1240 1311 0 + 821 -1240 1311 0 + 821 1240 -1311 0 + -821 -1240 -1311 0 + -821 -1240 1313 0 + 821 -1313 0 + 1240 -1313 0 + -1310 -1311 1312 0 + 1311 -1312 0 + 1310 -1312 0 + 1312 1313 -1314 0 + -1312 1314 0 + -1313 1314 0 + 1208 1310 -1311 0 + 1208 -1310 1311 0 + -1208 1310 1311 0 + -1208 -1310 -1311 0 + -822 1241 1315 0 + 822 -1241 1315 0 + 822 1241 -1315 0 + -822 -1241 -1315 0 + -822 -1241 1317 0 + 822 -1317 0 + 1241 -1317 0 + -1314 -1315 1316 0 + 1315 -1316 0 + 1314 -1316 0 + 1316 1317 -1318 0 + -1316 1318 0 + -1317 1318 0 + 1209 1314 -1315 0 + 1209 -1314 1315 0 + -1209 1314 1315 0 + -1209 -1314 -1315 0 + -823 1242 1319 0 + 823 -1242 1319 0 + 823 1242 -1319 0 + -823 -1242 -1319 0 + -823 -1242 1321 0 + 823 -1321 0 + 1242 -1321 0 + -1318 -1319 1320 0 + 1319 -1320 0 + 1318 -1320 0 + 1320 1321 -1322 0 + -1320 1322 0 + -1321 1322 0 + 1210 1318 -1319 0 + 1210 -1318 1319 0 + -1210 1318 1319 0 + -1210 -1318 -1319 0 + -824 1243 1323 0 + 824 -1243 1323 0 + 824 1243 -1323 0 + -824 -1243 -1323 0 + -824 -1243 1325 0 + 824 -1325 0 + 1243 -1325 0 + -1322 -1323 1324 0 + 1323 -1324 0 + 1322 -1324 0 + 1324 1325 -1326 0 + -1324 1326 0 + -1325 1326 0 + 1211 1322 -1323 0 + 1211 -1322 1323 0 + -1211 1322 1323 0 + -1211 -1322 -1323 0 + -825 1244 1327 0 + 825 -1244 1327 0 + 825 1244 -1327 0 + -825 -1244 -1327 0 + -825 -1244 1329 0 + 825 -1329 0 + 1244 -1329 0 + -1326 -1327 1328 0 + 1327 -1328 0 + 1326 -1328 0 + 1328 1329 -1330 0 + -1328 1330 0 + -1329 1330 0 + 1212 1326 -1327 0 + 1212 -1326 1327 0 + -1212 1326 1327 0 + -1212 -1326 -1327 0 + -826 1245 1331 0 + 826 -1245 1331 0 + 826 1245 -1331 0 + -826 -1245 -1331 0 + -826 -1245 1333 0 + 826 -1333 0 + 1245 -1333 0 + -1330 -1331 1332 0 + 1331 -1332 0 + 1330 -1332 0 + 1332 1333 -1334 0 + -1332 1334 0 + -1333 1334 0 + 1213 1330 -1331 0 + 1213 -1330 1331 0 + -1213 1330 1331 0 + -1213 -1330 -1331 0 + -827 1246 1335 0 + 827 -1246 1335 0 + 827 1246 -1335 0 + -827 -1246 -1335 0 + -827 -1246 1337 0 + 827 -1337 0 + 1246 -1337 0 + -1334 -1335 1336 0 + 1335 -1336 0 + 1334 -1336 0 + 1336 1337 -1338 0 + -1336 1338 0 + -1337 1338 0 + 1214 1334 -1335 0 + 1214 -1334 1335 0 + -1214 1334 1335 0 + -1214 -1334 -1335 0 + -828 1247 1339 0 + 828 -1247 1339 0 + 828 1247 -1339 0 + -828 -1247 -1339 0 + -828 -1247 1341 0 + 828 -1341 0 + 1247 -1341 0 + -1338 -1339 1340 0 + 1339 -1340 0 + 1338 -1340 0 + 1340 1341 -1342 0 + -1340 1342 0 + -1341 1342 0 + 1215 1338 -1339 0 + 1215 -1338 1339 0 + -1215 1338 1339 0 + -1215 -1338 -1339 0 + -829 1248 1343 0 + 829 -1248 1343 0 + 829 1248 -1343 0 + -829 -1248 -1343 0 + -829 -1248 1345 0 + 829 -1345 0 + 1248 -1345 0 + -1342 -1343 1344 0 + 1343 -1344 0 + 1342 -1344 0 + 1344 1345 -1346 0 + -1344 1346 0 + -1345 1346 0 + 1216 1342 -1343 0 + 1216 -1342 1343 0 + -1216 1342 1343 0 + -1216 -1342 -1343 0 + -830 1249 1347 0 + 830 -1249 1347 0 + 830 1249 -1347 0 + -830 -1249 -1347 0 + -830 -1249 1349 0 + 830 -1349 0 + 1249 -1349 0 + -1346 -1347 1348 0 + 1347 -1348 0 + 1346 -1348 0 + 1348 1349 -1350 0 + -1348 1350 0 + -1349 1350 0 + 1217 1346 -1347 0 + 1217 -1346 1347 0 + -1217 1346 1347 0 + -1217 -1346 -1347 0 + -831 1250 1351 0 + 831 -1250 1351 0 + 831 1250 -1351 0 + -831 -1250 -1351 0 + -831 -1250 1353 0 + 831 -1353 0 + 1250 -1353 0 + -1350 -1351 1352 0 + 1351 -1352 0 + 1350 -1352 0 + 1352 1353 -1354 0 + -1352 1354 0 + -1353 1354 0 + 1218 1350 -1351 0 + 1218 -1350 1351 0 + -1218 1350 1351 0 + -1218 -1350 -1351 0 + -832 1251 1355 0 + 832 -1251 1355 0 + 832 1251 -1355 0 + -832 -1251 -1355 0 + -832 -1251 1357 0 + 832 -1357 0 + 1251 -1357 0 + -1354 -1355 1356 0 + 1355 -1356 0 + 1354 -1356 0 + 1356 1357 -1358 0 + -1356 1358 0 + -1357 1358 0 + 1219 1354 -1355 0 + 1219 -1354 1355 0 + -1219 1354 1355 0 + -1219 -1354 -1355 0 + -833 1252 1359 0 + 833 -1252 1359 0 + 833 1252 -1359 0 + -833 -1252 -1359 0 + -833 -1252 1361 0 + 833 -1361 0 + 1252 -1361 0 + -1358 -1359 1360 0 + 1359 -1360 0 + 1358 -1360 0 + 1360 1361 -1362 0 + -1360 1362 0 + -1361 1362 0 + 1220 1358 -1359 0 + 1220 -1358 1359 0 + -1220 1358 1359 0 + -1220 -1358 -1359 0 + -834 1253 1363 0 + 834 -1253 1363 0 + 834 1253 -1363 0 + -834 -1253 -1363 0 + -834 -1253 1365 0 + 834 -1365 0 + 1253 -1365 0 + -1362 -1363 1364 0 + 1363 -1364 0 + 1362 -1364 0 + 1364 1365 -1366 0 + -1364 1366 0 + -1365 1366 0 + 1221 1362 -1363 0 + 1221 -1362 1363 0 + -1221 1362 1363 0 + -1221 -1362 -1363 0 + -835 1254 1367 0 + 835 -1254 1367 0 + 835 1254 -1367 0 + -835 -1254 -1367 0 + -835 -1254 1369 0 + 835 -1369 0 + 1254 -1369 0 + -1366 -1367 1368 0 + 1367 -1368 0 + 1366 -1368 0 + 1368 1369 -1370 0 + -1368 1370 0 + -1369 1370 0 + 1222 1366 -1367 0 + 1222 -1366 1367 0 + -1222 1366 1367 0 + -1222 -1366 -1367 0 + -836 1255 1371 0 + 836 -1255 1371 0 + 836 1255 -1371 0 + -836 -1255 -1371 0 + -836 -1255 1373 0 + 836 -1373 0 + 1255 -1373 0 + -1370 -1371 1372 0 + 1371 -1372 0 + 1370 -1372 0 + 1372 1373 -1374 0 + -1372 1374 0 + -1373 1374 0 + 1223 1370 -1371 0 + 1223 -1370 1371 0 + -1223 1370 1371 0 + -1223 -1370 -1371 0 + -837 1256 1375 0 + 837 -1256 1375 0 + 837 1256 -1375 0 + -837 -1256 -1375 0 + -837 -1256 1377 0 + 837 -1377 0 + 1256 -1377 0 + -1374 -1375 1376 0 + 1375 -1376 0 + 1374 -1376 0 + 1376 1377 -1378 0 + -1376 1378 0 + -1377 1378 0 + 1224 1374 -1375 0 + 1224 -1374 1375 0 + -1224 1374 1375 0 + -1224 -1374 -1375 0 + -838 1257 1379 0 + 838 -1257 1379 0 + 838 1257 -1379 0 + -838 -1257 -1379 0 + -838 -1257 1381 0 + 838 -1381 0 + 1257 -1381 0 + -1378 -1379 1380 0 + 1379 -1380 0 + 1378 -1380 0 + 1380 1381 -1382 0 + -1380 1382 0 + -1381 1382 0 + 1225 1378 -1379 0 + 1225 -1378 1379 0 + -1225 1378 1379 0 + -1225 -1378 -1379 0 + -839 1258 1383 0 + 839 -1258 1383 0 + 839 1258 -1383 0 + -839 -1258 -1383 0 + -839 -1258 1385 0 + 839 -1385 0 + 1258 -1385 0 + -1382 -1383 1384 0 + 1383 -1384 0 + 1382 -1384 0 + 1384 1385 -1386 0 + -1384 1386 0 + -1385 1386 0 + 1226 1382 -1383 0 + 1226 -1382 1383 0 + -1226 1382 1383 0 + -1226 -1382 -1383 0 + -1194 1386 0 + 1194 -1386 0 + -1129 -1194 1387 0 + 1129 -1387 0 + 1194 -1387 0 + -1387 -1388 1389 0 + 1387 -1389 0 + 1388 -1389 0 + -1129 -1389 1390 0 + -1129 1389 -1390 0 + 1129 -1194 1390 0 + 1129 1194 -1390 0 + -872 1391 0 + 389 -872 -1391 0 + 872 -1390 1391 0 + 872 1390 -1391 0 + 260 292 1394 0 + -260 -292 1394 0 + 260 -292 -1394 0 + -260 292 -1394 0 + 261 293 1395 0 + -261 -293 1395 0 + 261 -293 -1395 0 + -261 293 -1395 0 + 262 294 1396 0 + -262 -294 1396 0 + 262 -294 -1396 0 + -262 294 -1396 0 + 263 295 1397 0 + -263 -295 1397 0 + 263 -295 -1397 0 + -263 295 -1397 0 + 264 296 1398 0 + -264 -296 1398 0 + 264 -296 -1398 0 + -264 296 -1398 0 + 265 297 1399 0 + -265 -297 1399 0 + 265 -297 -1399 0 + -265 297 -1399 0 + 266 298 1400 0 + -266 -298 1400 0 + 266 -298 -1400 0 + -266 298 -1400 0 + 267 299 1401 0 + -267 -299 1401 0 + 267 -299 -1401 0 + -267 299 -1401 0 + 268 300 1402 0 + -268 -300 1402 0 + 268 -300 -1402 0 + -268 300 -1402 0 + 269 301 1403 0 + -269 -301 1403 0 + 269 -301 -1403 0 + -269 301 -1403 0 + 270 302 1404 0 + -270 -302 1404 0 + 270 -302 -1404 0 + -270 302 -1404 0 + 271 303 1405 0 + -271 -303 1405 0 + 271 -303 -1405 0 + -271 303 -1405 0 + 272 304 1406 0 + -272 -304 1406 0 + 272 -304 -1406 0 + -272 304 -1406 0 + 273 305 1407 0 + -273 -305 1407 0 + 273 -305 -1407 0 + -273 305 -1407 0 + 274 306 1408 0 + -274 -306 1408 0 + 274 -306 -1408 0 + -274 306 -1408 0 + 275 307 1409 0 + -275 -307 1409 0 + 275 -307 -1409 0 + -275 307 -1409 0 + 276 308 1410 0 + -276 -308 1410 0 + 276 -308 -1410 0 + -276 308 -1410 0 + 277 309 1411 0 + -277 -309 1411 0 + 277 -309 -1411 0 + -277 309 -1411 0 + 278 310 1412 0 + -278 -310 1412 0 + 278 -310 -1412 0 + -278 310 -1412 0 + 279 311 1413 0 + -279 -311 1413 0 + 279 -311 -1413 0 + -279 311 -1413 0 + 280 312 1414 0 + -280 -312 1414 0 + 280 -312 -1414 0 + -280 312 -1414 0 + 281 313 1415 0 + -281 -313 1415 0 + 281 -313 -1415 0 + -281 313 -1415 0 + 282 314 1416 0 + -282 -314 1416 0 + 282 -314 -1416 0 + -282 314 -1416 0 + 283 315 1417 0 + -283 -315 1417 0 + 283 -315 -1417 0 + -283 315 -1417 0 + 284 316 1418 0 + -284 -316 1418 0 + 284 -316 -1418 0 + -284 316 -1418 0 + 285 317 1419 0 + -285 -317 1419 0 + 285 -317 -1419 0 + -285 317 -1419 0 + 286 318 1420 0 + -286 -318 1420 0 + 286 -318 -1420 0 + -286 318 -1420 0 + 287 319 1421 0 + -287 -319 1421 0 + 287 -319 -1421 0 + -287 319 -1421 0 + 288 320 1422 0 + -288 -320 1422 0 + 288 -320 -1422 0 + -288 320 -1422 0 + 289 321 1423 0 + -289 -321 1423 0 + 289 -321 -1423 0 + -289 321 -1423 0 + 290 322 1424 0 + -290 -322 1424 0 + 290 -322 -1424 0 + -290 322 -1424 0 + 291 323 1425 0 + -291 -323 1425 0 + 291 -323 -1425 0 + -291 323 -1425 0 + -1394 1426 0 + 1 -1426 0 + 1394 -1426 0 + -1395 -1426 1427 0 + 1426 -1427 0 + 1395 -1427 0 + -1396 -1427 1428 0 + 1427 -1428 0 + 1396 -1428 0 + -1397 -1428 1429 0 + 1428 -1429 0 + 1397 -1429 0 + -1398 -1429 1430 0 + 1429 -1430 0 + 1398 -1430 0 + -1399 -1430 1431 0 + 1430 -1431 0 + 1399 -1431 0 + -1400 -1431 1432 0 + 1431 -1432 0 + 1400 -1432 0 + -1401 -1432 1433 0 + 1432 -1433 0 + 1401 -1433 0 + -1402 -1433 1434 0 + 1433 -1434 0 + 1402 -1434 0 + -1403 -1434 1435 0 + 1434 -1435 0 + 1403 -1435 0 + -1404 -1435 1436 0 + 1435 -1436 0 + 1404 -1436 0 + -1405 -1436 1437 0 + 1436 -1437 0 + 1405 -1437 0 + -1406 -1437 1438 0 + 1437 -1438 0 + 1406 -1438 0 + -1407 -1438 1439 0 + 1438 -1439 0 + 1407 -1439 0 + -1408 -1439 1440 0 + 1439 -1440 0 + 1408 -1440 0 + -1409 -1440 1441 0 + 1440 -1441 0 + 1409 -1441 0 + -1410 -1441 1442 0 + 1441 -1442 0 + 1410 -1442 0 + -1411 -1442 1443 0 + 1442 -1443 0 + 1411 -1443 0 + -1412 -1443 1444 0 + 1443 -1444 0 + 1412 -1444 0 + -1413 -1444 1445 0 + 1444 -1445 0 + 1413 -1445 0 + -1414 -1445 1446 0 + 1445 -1446 0 + 1414 -1446 0 + -1415 -1446 1447 0 + 1446 -1447 0 + 1415 -1447 0 + -1416 -1447 1448 0 + 1447 -1448 0 + 1416 -1448 0 + -1417 -1448 1449 0 + 1448 -1449 0 + 1417 -1449 0 + -1418 -1449 1450 0 + 1449 -1450 0 + 1418 -1450 0 + -1419 -1450 1451 0 + 1450 -1451 0 + 1419 -1451 0 + -1420 -1451 1452 0 + 1451 -1452 0 + 1420 -1452 0 + -1421 -1452 1453 0 + 1452 -1453 0 + 1421 -1453 0 + -1422 -1453 1454 0 + 1453 -1454 0 + 1422 -1454 0 + -1423 -1454 1455 0 + 1454 -1455 0 + 1423 -1455 0 + -1424 -1455 1456 0 + 1455 -1456 0 + 1424 -1456 0 + -1425 -1456 1457 0 + 1456 -1457 0 + 1425 -1457 0 + -1393 1457 0 + 1393 -1457 0 + 1392 1393 0 + -1392 -1393 0 + -454 -1392 1458 0 + 1392 -1458 0 + 454 -1458 0 + -743 -1458 1459 0 + 1458 -1459 0 + 743 -1459 0 + -1391 -1459 1460 0 + 1391 -1460 0 + 1459 -1460 0 + 1461 1525 0 + 422 -1461 1525 0 + 422 1461 -1525 0 + -1461 -1525 0 + -1461 1527 0 + 422 -1527 0 + 1461 -1527 0 + -2 -1525 1526 0 + 1525 -1526 0 + 1527 -1528 0 + -1526 1528 0 + -1527 1528 0 + 1493 -1525 0 + -2 1493 1525 0 + -1493 1525 0 + -2 -1493 -1525 0 + 1462 1529 0 + 423 -1462 1529 0 + 423 1462 -1529 0 + -1462 -1529 0 + -1462 1531 0 + 423 -1531 0 + 1462 -1531 0 + -1528 -1529 1530 0 + 1529 -1530 0 + 1528 -1530 0 + 1530 1531 -1532 0 + -1530 1532 0 + -1531 1532 0 + 1494 1528 -1529 0 + 1494 -1528 1529 0 + -1494 1528 1529 0 + -1494 -1528 -1529 0 + 1463 1533 0 + 424 -1463 1533 0 + 424 1463 -1533 0 + -1463 -1533 0 + -1463 1535 0 + 424 -1535 0 + 1463 -1535 0 + -1532 -1533 1534 0 + 1533 -1534 0 + 1532 -1534 0 + 1534 1535 -1536 0 + -1534 1536 0 + -1535 1536 0 + 1495 1532 -1533 0 + 1495 -1532 1533 0 + -1495 1532 1533 0 + -1495 -1532 -1533 0 + 1464 1537 0 + 425 -1464 1537 0 + 425 1464 -1537 0 + -1464 -1537 0 + -1464 1539 0 + 425 -1539 0 + 1464 -1539 0 + -1536 -1537 1538 0 + 1537 -1538 0 + 1536 -1538 0 + 1538 1539 -1540 0 + -1538 1540 0 + -1539 1540 0 + 1496 1536 -1537 0 + 1496 -1536 1537 0 + -1496 1536 1537 0 + -1496 -1536 -1537 0 + 1465 1541 0 + 426 -1465 1541 0 + 426 1465 -1541 0 + -1465 -1541 0 + -1465 1543 0 + 426 -1543 0 + 1465 -1543 0 + -1540 -1541 1542 0 + 1541 -1542 0 + 1540 -1542 0 + 1542 1543 -1544 0 + -1542 1544 0 + -1543 1544 0 + 1497 1540 -1541 0 + 1497 -1540 1541 0 + -1497 1540 1541 0 + -1497 -1540 -1541 0 + 1466 1545 0 + 427 -1466 1545 0 + 427 1466 -1545 0 + -1466 -1545 0 + -1466 1547 0 + 427 -1547 0 + 1466 -1547 0 + -1544 -1545 1546 0 + 1545 -1546 0 + 1544 -1546 0 + 1546 1547 -1548 0 + -1546 1548 0 + -1547 1548 0 + 1498 1544 -1545 0 + 1498 -1544 1545 0 + -1498 1544 1545 0 + -1498 -1544 -1545 0 + 1467 1549 0 + 428 -1467 1549 0 + 428 1467 -1549 0 + -1467 -1549 0 + -1467 1551 0 + 428 -1551 0 + 1467 -1551 0 + -1548 -1549 1550 0 + 1549 -1550 0 + 1548 -1550 0 + 1550 1551 -1552 0 + -1550 1552 0 + -1551 1552 0 + 1499 1548 -1549 0 + 1499 -1548 1549 0 + -1499 1548 1549 0 + -1499 -1548 -1549 0 + 1468 1553 0 + 429 -1468 1553 0 + 429 1468 -1553 0 + -1468 -1553 0 + -1468 1555 0 + 429 -1555 0 + 1468 -1555 0 + -1552 -1553 1554 0 + 1553 -1554 0 + 1552 -1554 0 + 1554 1555 -1556 0 + -1554 1556 0 + -1555 1556 0 + 1500 1552 -1553 0 + 1500 -1552 1553 0 + -1500 1552 1553 0 + -1500 -1552 -1553 0 + 1469 1557 0 + 430 -1469 1557 0 + 430 1469 -1557 0 + -1469 -1557 0 + -1469 1559 0 + 430 -1559 0 + 1469 -1559 0 + -1556 -1557 1558 0 + 1557 -1558 0 + 1556 -1558 0 + 1558 1559 -1560 0 + -1558 1560 0 + -1559 1560 0 + 1501 1556 -1557 0 + 1501 -1556 1557 0 + -1501 1556 1557 0 + -1501 -1556 -1557 0 + 1470 1561 0 + 431 -1470 1561 0 + 431 1470 -1561 0 + -1470 -1561 0 + -1470 1563 0 + 431 -1563 0 + 1470 -1563 0 + -1560 -1561 1562 0 + 1561 -1562 0 + 1560 -1562 0 + 1562 1563 -1564 0 + -1562 1564 0 + -1563 1564 0 + 1502 1560 -1561 0 + 1502 -1560 1561 0 + -1502 1560 1561 0 + -1502 -1560 -1561 0 + 1471 1565 0 + 432 -1471 1565 0 + 432 1471 -1565 0 + -1471 -1565 0 + -1471 1567 0 + 432 -1567 0 + 1471 -1567 0 + -1564 -1565 1566 0 + 1565 -1566 0 + 1564 -1566 0 + 1566 1567 -1568 0 + -1566 1568 0 + -1567 1568 0 + 1503 1564 -1565 0 + 1503 -1564 1565 0 + -1503 1564 1565 0 + -1503 -1564 -1565 0 + 1472 1569 0 + 433 -1472 1569 0 + 433 1472 -1569 0 + -1472 -1569 0 + -1472 1571 0 + 433 -1571 0 + 1472 -1571 0 + -1568 -1569 1570 0 + 1569 -1570 0 + 1568 -1570 0 + 1570 1571 -1572 0 + -1570 1572 0 + -1571 1572 0 + 1504 1568 -1569 0 + 1504 -1568 1569 0 + -1504 1568 1569 0 + -1504 -1568 -1569 0 + 1473 1573 0 + 434 -1473 1573 0 + 434 1473 -1573 0 + -1473 -1573 0 + -1473 1575 0 + 434 -1575 0 + 1473 -1575 0 + -1572 -1573 1574 0 + 1573 -1574 0 + 1572 -1574 0 + 1574 1575 -1576 0 + -1574 1576 0 + -1575 1576 0 + 1505 1572 -1573 0 + 1505 -1572 1573 0 + -1505 1572 1573 0 + -1505 -1572 -1573 0 + 1474 1577 0 + 435 -1474 1577 0 + 435 1474 -1577 0 + -1474 -1577 0 + -1474 1579 0 + 435 -1579 0 + 1474 -1579 0 + -1576 -1577 1578 0 + 1577 -1578 0 + 1576 -1578 0 + 1578 1579 -1580 0 + -1578 1580 0 + -1579 1580 0 + 1506 1576 -1577 0 + 1506 -1576 1577 0 + -1506 1576 1577 0 + -1506 -1576 -1577 0 + 1475 1581 0 + 436 -1475 1581 0 + 436 1475 -1581 0 + -1475 -1581 0 + -1475 1583 0 + 436 -1583 0 + 1475 -1583 0 + -1580 -1581 1582 0 + 1581 -1582 0 + 1580 -1582 0 + 1582 1583 -1584 0 + -1582 1584 0 + -1583 1584 0 + 1507 1580 -1581 0 + 1507 -1580 1581 0 + -1507 1580 1581 0 + -1507 -1580 -1581 0 + 1476 1585 0 + 437 -1476 1585 0 + 437 1476 -1585 0 + -1476 -1585 0 + -1476 1587 0 + 437 -1587 0 + 1476 -1587 0 + -1584 -1585 1586 0 + 1585 -1586 0 + 1584 -1586 0 + 1586 1587 -1588 0 + -1586 1588 0 + -1587 1588 0 + 1508 1584 -1585 0 + 1508 -1584 1585 0 + -1508 1584 1585 0 + -1508 -1584 -1585 0 + 1477 1589 0 + 438 -1477 1589 0 + 438 1477 -1589 0 + -1477 -1589 0 + -1477 1591 0 + 438 -1591 0 + 1477 -1591 0 + -1588 -1589 1590 0 + 1589 -1590 0 + 1588 -1590 0 + 1590 1591 -1592 0 + -1590 1592 0 + -1591 1592 0 + 1509 1588 -1589 0 + 1509 -1588 1589 0 + -1509 1588 1589 0 + -1509 -1588 -1589 0 + 1478 1593 0 + 439 -1478 1593 0 + 439 1478 -1593 0 + -1478 -1593 0 + -1478 1595 0 + 439 -1595 0 + 1478 -1595 0 + -1592 -1593 1594 0 + 1593 -1594 0 + 1592 -1594 0 + 1594 1595 -1596 0 + -1594 1596 0 + -1595 1596 0 + 1510 1592 -1593 0 + 1510 -1592 1593 0 + -1510 1592 1593 0 + -1510 -1592 -1593 0 + 1479 1597 0 + 440 -1479 1597 0 + 440 1479 -1597 0 + -1479 -1597 0 + -1479 1599 0 + 440 -1599 0 + 1479 -1599 0 + -1596 -1597 1598 0 + 1597 -1598 0 + 1596 -1598 0 + 1598 1599 -1600 0 + -1598 1600 0 + -1599 1600 0 + 1511 1596 -1597 0 + 1511 -1596 1597 0 + -1511 1596 1597 0 + -1511 -1596 -1597 0 + 1480 1601 0 + 441 -1480 1601 0 + 441 1480 -1601 0 + -1480 -1601 0 + -1480 1603 0 + 441 -1603 0 + 1480 -1603 0 + -1600 -1601 1602 0 + 1601 -1602 0 + 1600 -1602 0 + 1602 1603 -1604 0 + -1602 1604 0 + -1603 1604 0 + 1512 1600 -1601 0 + 1512 -1600 1601 0 + -1512 1600 1601 0 + -1512 -1600 -1601 0 + 1481 1605 0 + 442 -1481 1605 0 + 442 1481 -1605 0 + -1481 -1605 0 + -1481 1607 0 + 442 -1607 0 + 1481 -1607 0 + -1604 -1605 1606 0 + 1605 -1606 0 + 1604 -1606 0 + 1606 1607 -1608 0 + -1606 1608 0 + -1607 1608 0 + 1513 1604 -1605 0 + 1513 -1604 1605 0 + -1513 1604 1605 0 + -1513 -1604 -1605 0 + 1482 1609 0 + 443 -1482 1609 0 + 443 1482 -1609 0 + -1482 -1609 0 + -1482 1611 0 + 443 -1611 0 + 1482 -1611 0 + -1608 -1609 1610 0 + 1609 -1610 0 + 1608 -1610 0 + 1610 1611 -1612 0 + -1610 1612 0 + -1611 1612 0 + 1514 1608 -1609 0 + 1514 -1608 1609 0 + -1514 1608 1609 0 + -1514 -1608 -1609 0 + 1483 1613 0 + 444 -1483 1613 0 + 444 1483 -1613 0 + -1483 -1613 0 + -1483 1615 0 + 444 -1615 0 + 1483 -1615 0 + -1612 -1613 1614 0 + 1613 -1614 0 + 1612 -1614 0 + 1614 1615 -1616 0 + -1614 1616 0 + -1615 1616 0 + 1515 1612 -1613 0 + 1515 -1612 1613 0 + -1515 1612 1613 0 + -1515 -1612 -1613 0 + 1484 1617 0 + 445 -1484 1617 0 + 445 1484 -1617 0 + -1484 -1617 0 + -1484 1619 0 + 445 -1619 0 + 1484 -1619 0 + -1616 -1617 1618 0 + 1617 -1618 0 + 1616 -1618 0 + 1618 1619 -1620 0 + -1618 1620 0 + -1619 1620 0 + 1516 1616 -1617 0 + 1516 -1616 1617 0 + -1516 1616 1617 0 + -1516 -1616 -1617 0 + 1485 1621 0 + 446 -1485 1621 0 + 446 1485 -1621 0 + -1485 -1621 0 + -1485 1623 0 + 446 -1623 0 + 1485 -1623 0 + -1620 -1621 1622 0 + 1621 -1622 0 + 1620 -1622 0 + 1622 1623 -1624 0 + -1622 1624 0 + -1623 1624 0 + 1517 1620 -1621 0 + 1517 -1620 1621 0 + -1517 1620 1621 0 + -1517 -1620 -1621 0 + 1486 1625 0 + 447 -1486 1625 0 + 447 1486 -1625 0 + -1486 -1625 0 + -1486 1627 0 + 447 -1627 0 + 1486 -1627 0 + -1624 -1625 1626 0 + 1625 -1626 0 + 1624 -1626 0 + 1626 1627 -1628 0 + -1626 1628 0 + -1627 1628 0 + 1518 1624 -1625 0 + 1518 -1624 1625 0 + -1518 1624 1625 0 + -1518 -1624 -1625 0 + 1487 1629 0 + 448 -1487 1629 0 + 448 1487 -1629 0 + -1487 -1629 0 + -1487 1631 0 + 448 -1631 0 + 1487 -1631 0 + -1628 -1629 1630 0 + 1629 -1630 0 + 1628 -1630 0 + 1630 1631 -1632 0 + -1630 1632 0 + -1631 1632 0 + 1519 1628 -1629 0 + 1519 -1628 1629 0 + -1519 1628 1629 0 + -1519 -1628 -1629 0 + 1488 1633 0 + 449 -1488 1633 0 + 449 1488 -1633 0 + -1488 -1633 0 + -1488 1635 0 + 449 -1635 0 + 1488 -1635 0 + -1632 -1633 1634 0 + 1633 -1634 0 + 1632 -1634 0 + 1634 1635 -1636 0 + -1634 1636 0 + -1635 1636 0 + 1520 1632 -1633 0 + 1520 -1632 1633 0 + -1520 1632 1633 0 + -1520 -1632 -1633 0 + 1489 1637 0 + 450 -1489 1637 0 + 450 1489 -1637 0 + -1489 -1637 0 + -1489 1639 0 + 450 -1639 0 + 1489 -1639 0 + -1636 -1637 1638 0 + 1637 -1638 0 + 1636 -1638 0 + 1638 1639 -1640 0 + -1638 1640 0 + -1639 1640 0 + 1521 1636 -1637 0 + 1521 -1636 1637 0 + -1521 1636 1637 0 + -1521 -1636 -1637 0 + 1490 1641 0 + 451 -1490 1641 0 + 451 1490 -1641 0 + -1490 -1641 0 + -1490 1643 0 + 451 -1643 0 + 1490 -1643 0 + -1640 -1641 1642 0 + 1641 -1642 0 + 1640 -1642 0 + 1642 1643 -1644 0 + -1642 1644 0 + -1643 1644 0 + 1522 1640 -1641 0 + 1522 -1640 1641 0 + -1522 1640 1641 0 + -1522 -1640 -1641 0 + 1491 1645 0 + 452 -1491 1645 0 + 452 1491 -1645 0 + -1491 -1645 0 + -1491 1647 0 + 452 -1647 0 + 1491 -1647 0 + -1644 -1645 1646 0 + 1645 -1646 0 + 1644 -1646 0 + 1646 1647 -1648 0 + -1646 1648 0 + -1647 1648 0 + 1523 1644 -1645 0 + 1523 -1644 1645 0 + -1523 1644 1645 0 + -1523 -1644 -1645 0 + 1492 1649 0 + 453 -1492 1649 0 + 453 1492 -1649 0 + -1492 -1649 0 + -1492 1651 0 + 453 -1651 0 + 1492 -1651 0 + -1648 -1649 1650 0 + 1649 -1650 0 + 1648 -1650 0 + 1650 1651 -1652 0 + -1650 1652 0 + -1651 1652 0 + 1524 1648 -1649 0 + 1524 -1648 1649 0 + -1524 1648 1649 0 + -1524 -1648 -1649 0 + 1493 -1653 0 + -1493 1653 0 + 1494 -1654 0 + -1494 1654 0 + 1495 -1655 0 + -1495 1655 0 + 1496 -1656 0 + -1496 1656 0 + 1497 -1657 0 + -1497 1657 0 + 1498 -1658 0 + -1498 1658 0 + 1499 -1659 0 + -1499 1659 0 + 1500 -1660 0 + -1500 1660 0 + 1501 -1661 0 + -1501 1661 0 + 1502 -1662 0 + -1502 1662 0 + 1503 -1663 0 + -1503 1663 0 + 1504 -1664 0 + -1504 1664 0 + 1505 -1665 0 + -1505 1665 0 + 1506 -1666 0 + -1506 1666 0 + 1507 -1667 0 + -1507 1667 0 + 1508 -1668 0 + -1508 1668 0 + 1509 -1669 0 + -1509 1669 0 + 1510 -1670 0 + -1510 1670 0 + 1511 -1671 0 + -1511 1671 0 + 1512 -1672 0 + -1512 1672 0 + 1513 -1673 0 + -1513 1673 0 + 1514 -1674 0 + -1514 1674 0 + 1515 -1675 0 + -1515 1675 0 + 1516 -1676 0 + -1516 1676 0 + 1517 -1677 0 + -1517 1677 0 + 1518 -1678 0 + -1518 1678 0 + 1519 -1679 0 + -1519 1679 0 + 1520 -1680 0 + -1520 1680 0 + 1521 -1681 0 + -1521 1681 0 + 1522 -1682 0 + -1522 1682 0 + 1523 -1683 0 + -1523 1683 0 + 1524 -1684 0 + -1524 1684 0 + -1653 1750 1782 0 + 1653 1782 0 + 1653 1750 -1782 0 + -1653 -1782 0 + -1653 1784 0 + 1653 -1784 0 + 1750 -1784 0 + -1782 1783 0 + 1782 -1783 0 + 1 -1783 0 + 1783 1784 -1785 0 + -1783 1785 0 + -1784 1785 0 + 1 1718 -1782 0 + 1718 1782 0 + 1 -1718 1782 0 + -1718 -1782 0 + -1654 1751 1786 0 + 1654 1786 0 + 1654 1751 -1786 0 + -1654 -1786 0 + -1654 1788 0 + 1654 -1788 0 + 1751 -1788 0 + -1785 -1786 1787 0 + 1786 -1787 0 + 1785 -1787 0 + 1787 1788 -1789 0 + -1787 1789 0 + -1788 1789 0 + 1719 1785 -1786 0 + 1719 -1785 1786 0 + -1719 1785 1786 0 + -1719 -1785 -1786 0 + -1655 1752 1790 0 + 1655 1790 0 + 1655 1752 -1790 0 + -1655 -1790 0 + -1655 1792 0 + 1655 -1792 0 + 1752 -1792 0 + -1789 -1790 1791 0 + 1790 -1791 0 + 1789 -1791 0 + 1791 1792 -1793 0 + -1791 1793 0 + -1792 1793 0 + 1720 1789 -1790 0 + 1720 -1789 1790 0 + -1720 1789 1790 0 + -1720 -1789 -1790 0 + -1656 1753 1794 0 + 1656 1794 0 + 1656 1753 -1794 0 + -1656 -1794 0 + -1656 1796 0 + 1656 -1796 0 + 1753 -1796 0 + -1793 -1794 1795 0 + 1794 -1795 0 + 1793 -1795 0 + 1795 1796 -1797 0 + -1795 1797 0 + -1796 1797 0 + 1721 1793 -1794 0 + 1721 -1793 1794 0 + -1721 1793 1794 0 + -1721 -1793 -1794 0 + -1657 1754 1798 0 + 1657 1798 0 + 1657 1754 -1798 0 + -1657 -1798 0 + -1657 1800 0 + 1657 -1800 0 + 1754 -1800 0 + -1797 -1798 1799 0 + 1798 -1799 0 + 1797 -1799 0 + 1799 1800 -1801 0 + -1799 1801 0 + -1800 1801 0 + 1722 1797 -1798 0 + 1722 -1797 1798 0 + -1722 1797 1798 0 + -1722 -1797 -1798 0 + -1658 1755 1802 0 + 1658 1802 0 + 1658 1755 -1802 0 + -1658 -1802 0 + -1658 1804 0 + 1658 -1804 0 + 1755 -1804 0 + -1801 -1802 1803 0 + 1802 -1803 0 + 1801 -1803 0 + 1803 1804 -1805 0 + -1803 1805 0 + -1804 1805 0 + 1723 1801 -1802 0 + 1723 -1801 1802 0 + -1723 1801 1802 0 + -1723 -1801 -1802 0 + -1659 1756 1806 0 + 1659 1806 0 + 1659 1756 -1806 0 + -1659 -1806 0 + -1659 1808 0 + 1659 -1808 0 + 1756 -1808 0 + -1805 -1806 1807 0 + 1806 -1807 0 + 1805 -1807 0 + 1807 1808 -1809 0 + -1807 1809 0 + -1808 1809 0 + 1724 1805 -1806 0 + 1724 -1805 1806 0 + -1724 1805 1806 0 + -1724 -1805 -1806 0 + -1660 1757 1810 0 + 1660 1810 0 + 1660 1757 -1810 0 + -1660 -1810 0 + -1660 1812 0 + 1660 -1812 0 + 1757 -1812 0 + -1809 -1810 1811 0 + 1810 -1811 0 + 1809 -1811 0 + 1811 1812 -1813 0 + -1811 1813 0 + -1812 1813 0 + 1725 1809 -1810 0 + 1725 -1809 1810 0 + -1725 1809 1810 0 + -1725 -1809 -1810 0 + -1661 1758 1814 0 + 1661 1814 0 + 1661 1758 -1814 0 + -1661 -1814 0 + -1661 1816 0 + 1661 -1816 0 + 1758 -1816 0 + -1813 -1814 1815 0 + 1814 -1815 0 + 1813 -1815 0 + 1815 1816 -1817 0 + -1815 1817 0 + -1816 1817 0 + 1726 1813 -1814 0 + 1726 -1813 1814 0 + -1726 1813 1814 0 + -1726 -1813 -1814 0 + -1662 1759 1818 0 + 1662 1818 0 + 1662 1759 -1818 0 + -1662 -1818 0 + -1662 1820 0 + 1662 -1820 0 + 1759 -1820 0 + -1817 -1818 1819 0 + 1818 -1819 0 + 1817 -1819 0 + 1819 1820 -1821 0 + -1819 1821 0 + -1820 1821 0 + 1727 1817 -1818 0 + 1727 -1817 1818 0 + -1727 1817 1818 0 + -1727 -1817 -1818 0 + -1663 1760 1822 0 + 1663 1822 0 + 1663 1760 -1822 0 + -1663 -1822 0 + -1663 1824 0 + 1663 -1824 0 + 1760 -1824 0 + -1821 -1822 1823 0 + 1822 -1823 0 + 1821 -1823 0 + 1823 1824 -1825 0 + -1823 1825 0 + -1824 1825 0 + 1728 1821 -1822 0 + 1728 -1821 1822 0 + -1728 1821 1822 0 + -1728 -1821 -1822 0 + -1664 1761 1826 0 + 1664 1826 0 + 1664 1761 -1826 0 + -1664 -1826 0 + -1664 1828 0 + 1664 -1828 0 + 1761 -1828 0 + -1825 -1826 1827 0 + 1826 -1827 0 + 1825 -1827 0 + 1827 1828 -1829 0 + -1827 1829 0 + -1828 1829 0 + 1729 1825 -1826 0 + 1729 -1825 1826 0 + -1729 1825 1826 0 + -1729 -1825 -1826 0 + -1665 1762 1830 0 + 1665 1830 0 + 1665 1762 -1830 0 + -1665 -1830 0 + -1665 1832 0 + 1665 -1832 0 + 1762 -1832 0 + -1829 -1830 1831 0 + 1830 -1831 0 + 1829 -1831 0 + 1831 1832 -1833 0 + -1831 1833 0 + -1832 1833 0 + 1730 1829 -1830 0 + 1730 -1829 1830 0 + -1730 1829 1830 0 + -1730 -1829 -1830 0 + -1666 1763 1834 0 + 1666 1834 0 + 1666 1763 -1834 0 + -1666 -1834 0 + -1666 1836 0 + 1666 -1836 0 + 1763 -1836 0 + -1833 -1834 1835 0 + 1834 -1835 0 + 1833 -1835 0 + 1835 1836 -1837 0 + -1835 1837 0 + -1836 1837 0 + 1731 1833 -1834 0 + 1731 -1833 1834 0 + -1731 1833 1834 0 + -1731 -1833 -1834 0 + -1667 1764 1838 0 + 1667 1838 0 + 1667 1764 -1838 0 + -1667 -1838 0 + -1667 1840 0 + 1667 -1840 0 + 1764 -1840 0 + -1837 -1838 1839 0 + 1838 -1839 0 + 1837 -1839 0 + 1839 1840 -1841 0 + -1839 1841 0 + -1840 1841 0 + 1732 1837 -1838 0 + 1732 -1837 1838 0 + -1732 1837 1838 0 + -1732 -1837 -1838 0 + -1668 1765 1842 0 + 1668 1842 0 + 1668 1765 -1842 0 + -1668 -1842 0 + -1668 1844 0 + 1668 -1844 0 + 1765 -1844 0 + -1841 -1842 1843 0 + 1842 -1843 0 + 1841 -1843 0 + 1843 1844 -1845 0 + -1843 1845 0 + -1844 1845 0 + 1733 1841 -1842 0 + 1733 -1841 1842 0 + -1733 1841 1842 0 + -1733 -1841 -1842 0 + -1669 1766 1846 0 + 1669 1846 0 + 1669 1766 -1846 0 + -1669 -1846 0 + -1669 1848 0 + 1669 -1848 0 + 1766 -1848 0 + -1845 -1846 1847 0 + 1846 -1847 0 + 1845 -1847 0 + 1847 1848 -1849 0 + -1847 1849 0 + -1848 1849 0 + 1734 1845 -1846 0 + 1734 -1845 1846 0 + -1734 1845 1846 0 + -1734 -1845 -1846 0 + -1670 1767 1850 0 + 1670 1850 0 + 1670 1767 -1850 0 + -1670 -1850 0 + -1670 1852 0 + 1670 -1852 0 + 1767 -1852 0 + -1849 -1850 1851 0 + 1850 -1851 0 + 1849 -1851 0 + 1851 1852 -1853 0 + -1851 1853 0 + -1852 1853 0 + 1735 1849 -1850 0 + 1735 -1849 1850 0 + -1735 1849 1850 0 + -1735 -1849 -1850 0 + -1671 1768 1854 0 + 1671 1854 0 + 1671 1768 -1854 0 + -1671 -1854 0 + -1671 1856 0 + 1671 -1856 0 + 1768 -1856 0 + -1853 -1854 1855 0 + 1854 -1855 0 + 1853 -1855 0 + 1855 1856 -1857 0 + -1855 1857 0 + -1856 1857 0 + 1736 1853 -1854 0 + 1736 -1853 1854 0 + -1736 1853 1854 0 + -1736 -1853 -1854 0 + -1672 1769 1858 0 + 1672 1858 0 + 1672 1769 -1858 0 + -1672 -1858 0 + -1672 1860 0 + 1672 -1860 0 + 1769 -1860 0 + -1857 -1858 1859 0 + 1858 -1859 0 + 1857 -1859 0 + 1859 1860 -1861 0 + -1859 1861 0 + -1860 1861 0 + 1737 1857 -1858 0 + 1737 -1857 1858 0 + -1737 1857 1858 0 + -1737 -1857 -1858 0 + -1673 1770 1862 0 + 1673 1862 0 + 1673 1770 -1862 0 + -1673 -1862 0 + -1673 1864 0 + 1673 -1864 0 + 1770 -1864 0 + -1861 -1862 1863 0 + 1862 -1863 0 + 1861 -1863 0 + 1863 1864 -1865 0 + -1863 1865 0 + -1864 1865 0 + 1738 1861 -1862 0 + 1738 -1861 1862 0 + -1738 1861 1862 0 + -1738 -1861 -1862 0 + -1674 1771 1866 0 + 1674 1866 0 + 1674 1771 -1866 0 + -1674 -1866 0 + -1674 1868 0 + 1674 -1868 0 + 1771 -1868 0 + -1865 -1866 1867 0 + 1866 -1867 0 + 1865 -1867 0 + 1867 1868 -1869 0 + -1867 1869 0 + -1868 1869 0 + 1739 1865 -1866 0 + 1739 -1865 1866 0 + -1739 1865 1866 0 + -1739 -1865 -1866 0 + -1675 1772 1870 0 + 1675 1870 0 + 1675 1772 -1870 0 + -1675 -1870 0 + -1675 1872 0 + 1675 -1872 0 + 1772 -1872 0 + -1869 -1870 1871 0 + 1870 -1871 0 + 1869 -1871 0 + 1871 1872 -1873 0 + -1871 1873 0 + -1872 1873 0 + 1740 1869 -1870 0 + 1740 -1869 1870 0 + -1740 1869 1870 0 + -1740 -1869 -1870 0 + -1676 1773 1874 0 + 1676 1874 0 + 1676 1773 -1874 0 + -1676 -1874 0 + -1676 1876 0 + 1676 -1876 0 + 1773 -1876 0 + -1873 -1874 1875 0 + 1874 -1875 0 + 1873 -1875 0 + 1875 1876 -1877 0 + -1875 1877 0 + -1876 1877 0 + 1741 1873 -1874 0 + 1741 -1873 1874 0 + -1741 1873 1874 0 + -1741 -1873 -1874 0 + -1677 1774 1878 0 + 1677 1878 0 + 1677 1774 -1878 0 + -1677 -1878 0 + -1677 1880 0 + 1677 -1880 0 + 1774 -1880 0 + -1877 -1878 1879 0 + 1878 -1879 0 + 1877 -1879 0 + 1879 1880 -1881 0 + -1879 1881 0 + -1880 1881 0 + 1742 1877 -1878 0 + 1742 -1877 1878 0 + -1742 1877 1878 0 + -1742 -1877 -1878 0 + -1678 1775 1882 0 + 1678 1882 0 + 1678 1775 -1882 0 + -1678 -1882 0 + -1678 1884 0 + 1678 -1884 0 + 1775 -1884 0 + -1881 -1882 1883 0 + 1882 -1883 0 + 1881 -1883 0 + 1883 1884 -1885 0 + -1883 1885 0 + -1884 1885 0 + 1743 1881 -1882 0 + 1743 -1881 1882 0 + -1743 1881 1882 0 + -1743 -1881 -1882 0 + -1679 1776 1886 0 + 1679 1886 0 + 1679 1776 -1886 0 + -1679 -1886 0 + -1679 1888 0 + 1679 -1888 0 + 1776 -1888 0 + -1885 -1886 1887 0 + 1886 -1887 0 + 1885 -1887 0 + 1887 1888 -1889 0 + -1887 1889 0 + -1888 1889 0 + 1744 1885 -1886 0 + 1744 -1885 1886 0 + -1744 1885 1886 0 + -1744 -1885 -1886 0 + -1680 1777 1890 0 + 1680 1890 0 + 1680 1777 -1890 0 + -1680 -1890 0 + -1680 1892 0 + 1680 -1892 0 + 1777 -1892 0 + -1889 -1890 1891 0 + 1890 -1891 0 + 1889 -1891 0 + 1891 1892 -1893 0 + -1891 1893 0 + -1892 1893 0 + 1745 1889 -1890 0 + 1745 -1889 1890 0 + -1745 1889 1890 0 + -1745 -1889 -1890 0 + -1681 1778 1894 0 + 1681 1894 0 + 1681 1778 -1894 0 + -1681 -1894 0 + -1681 1896 0 + 1681 -1896 0 + 1778 -1896 0 + -1893 -1894 1895 0 + 1894 -1895 0 + 1893 -1895 0 + 1895 1896 -1897 0 + -1895 1897 0 + -1896 1897 0 + 1746 1893 -1894 0 + 1746 -1893 1894 0 + -1746 1893 1894 0 + -1746 -1893 -1894 0 + -1682 1779 1898 0 + 1682 1898 0 + 1682 1779 -1898 0 + -1682 -1898 0 + -1682 1900 0 + 1682 -1900 0 + 1779 -1900 0 + -1897 -1898 1899 0 + 1898 -1899 0 + 1897 -1899 0 + 1899 1900 -1901 0 + -1899 1901 0 + -1900 1901 0 + 1747 1897 -1898 0 + 1747 -1897 1898 0 + -1747 1897 1898 0 + -1747 -1897 -1898 0 + -1683 1780 1902 0 + 1683 1902 0 + 1683 1780 -1902 0 + -1683 -1902 0 + -1683 1904 0 + 1683 -1904 0 + 1780 -1904 0 + -1901 -1902 1903 0 + 1902 -1903 0 + 1901 -1903 0 + 1903 1904 -1905 0 + -1903 1905 0 + -1904 1905 0 + 1748 1901 -1902 0 + 1748 -1901 1902 0 + -1748 1901 1902 0 + -1748 -1901 -1902 0 + -1684 1781 1906 0 + 1684 1906 0 + 1684 1781 -1906 0 + -1684 -1906 0 + -1684 1908 0 + 1684 -1908 0 + 1781 -1908 0 + -1905 -1906 1907 0 + 1906 -1907 0 + 1905 -1907 0 + 1907 1908 -1909 0 + -1907 1909 0 + -1908 1909 0 + 1749 1905 -1906 0 + 1749 -1905 1906 0 + -1749 1905 1906 0 + -1749 -1905 -1906 0 + 1905 -1909 1910 0 + -1905 1909 1910 0 + 1905 1909 -1910 0 + -1905 -1909 -1910 0 + 1717 1749 -1910 0 + 1717 -1749 1910 0 + -1717 1749 1910 0 + -1717 -1749 -1910 0 + -1460 -1717 1911 0 + 1460 -1911 0 + 1717 -1911 0 + -1911 -1912 1913 0 + 1911 -1913 0 + 1912 -1913 0 + 1947 1980 0 + -1915 -1947 1980 0 + -1947 -1980 0 + -1915 1947 -1980 0 + 1948 1981 0 + -1916 -1948 1981 0 + -1948 -1981 0 + -1916 1948 -1981 0 + 1949 1982 0 + -1917 -1949 1982 0 + -1949 -1982 0 + -1917 1949 -1982 0 + 1950 1983 0 + -1918 -1950 1983 0 + -1950 -1983 0 + -1918 1950 -1983 0 + 1951 1984 0 + -1919 -1951 1984 0 + -1951 -1984 0 + -1919 1951 -1984 0 + 1952 1985 0 + -1920 -1952 1985 0 + -1952 -1985 0 + -1920 1952 -1985 0 + 1953 1986 0 + -1921 -1953 1986 0 + -1953 -1986 0 + -1921 1953 -1986 0 + 1954 1987 0 + -1922 -1954 1987 0 + -1954 -1987 0 + -1922 1954 -1987 0 + 1955 1988 0 + -1923 -1955 1988 0 + -1955 -1988 0 + -1923 1955 -1988 0 + 1956 1989 0 + -1924 -1956 1989 0 + -1956 -1989 0 + -1924 1956 -1989 0 + 1957 1990 0 + -1925 -1957 1990 0 + -1957 -1990 0 + -1925 1957 -1990 0 + 1958 1991 0 + -1926 -1958 1991 0 + -1958 -1991 0 + -1926 1958 -1991 0 + 1959 1992 0 + -1927 -1959 1992 0 + -1959 -1992 0 + -1927 1959 -1992 0 + 1960 1993 0 + -1928 -1960 1993 0 + -1960 -1993 0 + -1928 1960 -1993 0 + 1961 1994 0 + -1929 -1961 1994 0 + -1961 -1994 0 + -1929 1961 -1994 0 + 1962 1995 0 + -1930 -1962 1995 0 + -1962 -1995 0 + -1930 1962 -1995 0 + 1963 1996 0 + -1931 -1963 1996 0 + -1963 -1996 0 + -1931 1963 -1996 0 + 1964 1997 0 + -1932 -1964 1997 0 + -1964 -1997 0 + -1932 1964 -1997 0 + 1965 1998 0 + -1933 -1965 1998 0 + -1965 -1998 0 + -1933 1965 -1998 0 + 1966 1999 0 + -1934 -1966 1999 0 + -1966 -1999 0 + -1934 1966 -1999 0 + 1967 2000 0 + -1935 -1967 2000 0 + -1967 -2000 0 + -1935 1967 -2000 0 + 1968 2001 0 + -1936 -1968 2001 0 + -1968 -2001 0 + -1936 1968 -2001 0 + 1969 2002 0 + -1937 -1969 2002 0 + -1969 -2002 0 + -1937 1969 -2002 0 + 1970 2003 0 + -1938 -1970 2003 0 + -1970 -2003 0 + -1938 1970 -2003 0 + 1971 2004 0 + -1939 -1971 2004 0 + -1971 -2004 0 + -1939 1971 -2004 0 + 1972 2005 0 + -1940 -1972 2005 0 + -1972 -2005 0 + -1940 1972 -2005 0 + 1973 2006 0 + -1941 -1973 2006 0 + -1973 -2006 0 + -1941 1973 -2006 0 + 1974 2007 0 + -1942 -1974 2007 0 + -1974 -2007 0 + -1942 1974 -2007 0 + 1975 2008 0 + -1943 -1975 2008 0 + -1975 -2008 0 + -1943 1975 -2008 0 + 1976 2009 0 + -1944 -1976 2009 0 + -1976 -2009 0 + -1944 1976 -2009 0 + 1977 2010 0 + -1945 -1977 2010 0 + -1977 -2010 0 + -1945 1977 -2010 0 + 1978 2011 0 + -1946 -1978 2011 0 + -1978 -2011 0 + -1946 1978 -2011 0 + -1980 2012 0 + 1 -2012 0 + 1980 -2012 0 + -1981 -2012 2013 0 + 2012 -2013 0 + 1981 -2013 0 + -1982 -2013 2014 0 + 2013 -2014 0 + 1982 -2014 0 + -1983 -2014 2015 0 + 2014 -2015 0 + 1983 -2015 0 + -1984 -2015 2016 0 + 2015 -2016 0 + 1984 -2016 0 + -1985 -2016 2017 0 + 2016 -2017 0 + 1985 -2017 0 + -1986 -2017 2018 0 + 2017 -2018 0 + 1986 -2018 0 + -1987 -2018 2019 0 + 2018 -2019 0 + 1987 -2019 0 + -1988 -2019 2020 0 + 2019 -2020 0 + 1988 -2020 0 + -1989 -2020 2021 0 + 2020 -2021 0 + 1989 -2021 0 + -1990 -2021 2022 0 + 2021 -2022 0 + 1990 -2022 0 + -1991 -2022 2023 0 + 2022 -2023 0 + 1991 -2023 0 + -1992 -2023 2024 0 + 2023 -2024 0 + 1992 -2024 0 + -1993 -2024 2025 0 + 2024 -2025 0 + 1993 -2025 0 + -1994 -2025 2026 0 + 2025 -2026 0 + 1994 -2026 0 + -1995 -2026 2027 0 + 2026 -2027 0 + 1995 -2027 0 + -1996 -2027 2028 0 + 2027 -2028 0 + 1996 -2028 0 + -1997 -2028 2029 0 + 2028 -2029 0 + 1997 -2029 0 + -1998 -2029 2030 0 + 2029 -2030 0 + 1998 -2030 0 + -1999 -2030 2031 0 + 2030 -2031 0 + 1999 -2031 0 + -2000 -2031 2032 0 + 2031 -2032 0 + 2000 -2032 0 + -2001 -2032 2033 0 + 2032 -2033 0 + 2001 -2033 0 + -2002 -2033 2034 0 + 2033 -2034 0 + 2002 -2034 0 + -2003 -2034 2035 0 + 2034 -2035 0 + 2003 -2035 0 + -2004 -2035 2036 0 + 2035 -2036 0 + 2004 -2036 0 + -2005 -2036 2037 0 + 2036 -2037 0 + 2005 -2037 0 + -2006 -2037 2038 0 + 2037 -2038 0 + 2006 -2038 0 + -2007 -2038 2039 0 + 2038 -2039 0 + 2007 -2039 0 + -2008 -2039 2040 0 + 2039 -2040 0 + 2008 -2040 0 + -2009 -2040 2041 0 + 2040 -2041 0 + 2009 -2041 0 + -2010 -2041 2042 0 + 2041 -2042 0 + 2010 -2042 0 + -2011 -2042 2043 0 + 2042 -2043 0 + 2011 -2043 0 + -1979 2043 0 + 1979 -2043 0 + -1979 2045 0 + 1979 -2044 2045 0 + 1979 -2045 0 + -1979 -2046 2110 0 + -1979 2046 -2110 0 + 1979 -2078 2110 0 + 1979 2078 -2110 0 + -1979 -2047 2111 0 + -1979 2047 -2111 0 + 1979 -2079 2111 0 + 1979 2079 -2111 0 + -1979 -2048 2112 0 + -1979 2048 -2112 0 + 1979 -2080 2112 0 + 1979 2080 -2112 0 + -1979 -2049 2113 0 + -1979 2049 -2113 0 + 1979 -2081 2113 0 + 1979 2081 -2113 0 + -1979 -2050 2114 0 + -1979 2050 -2114 0 + 1979 -2082 2114 0 + 1979 2082 -2114 0 + -1979 -2051 2115 0 + -1979 2051 -2115 0 + 1979 -2083 2115 0 + 1979 2083 -2115 0 + -1979 -2052 2116 0 + -1979 2052 -2116 0 + 1979 -2084 2116 0 + 1979 2084 -2116 0 + -1979 -2053 2117 0 + -1979 2053 -2117 0 + 1979 -2085 2117 0 + 1979 2085 -2117 0 + -1979 -2054 2118 0 + -1979 2054 -2118 0 + 1979 -2086 2118 0 + 1979 2086 -2118 0 + -1979 -2055 2119 0 + -1979 2055 -2119 0 + 1979 -2087 2119 0 + 1979 2087 -2119 0 + -1979 -2056 2120 0 + -1979 2056 -2120 0 + 1979 -2088 2120 0 + 1979 2088 -2120 0 + -1979 -2057 2121 0 + -1979 2057 -2121 0 + 1979 -2089 2121 0 + 1979 2089 -2121 0 + -1979 -2058 2122 0 + -1979 2058 -2122 0 + 1979 -2090 2122 0 + 1979 2090 -2122 0 + -1979 -2059 2123 0 + -1979 2059 -2123 0 + 1979 -2091 2123 0 + 1979 2091 -2123 0 + -1979 -2060 2124 0 + -1979 2060 -2124 0 + 1979 -2092 2124 0 + 1979 2092 -2124 0 + -1979 -2061 2125 0 + -1979 2061 -2125 0 + 1979 -2093 2125 0 + 1979 2093 -2125 0 + -1979 -2062 2126 0 + -1979 2062 -2126 0 + 1979 -2094 2126 0 + 1979 2094 -2126 0 + -1979 -2063 2127 0 + -1979 2063 -2127 0 + 1979 -2095 2127 0 + 1979 2095 -2127 0 + -1979 -2064 2128 0 + -1979 2064 -2128 0 + 1979 -2096 2128 0 + 1979 2096 -2128 0 + -1979 -2065 2129 0 + -1979 2065 -2129 0 + 1979 -2097 2129 0 + 1979 2097 -2129 0 + -1979 -2066 2130 0 + -1979 2066 -2130 0 + 1979 -2098 2130 0 + 1979 2098 -2130 0 + -1979 -2067 2131 0 + -1979 2067 -2131 0 + 1979 -2099 2131 0 + 1979 2099 -2131 0 + -1979 -2068 2132 0 + -1979 2068 -2132 0 + 1979 -2100 2132 0 + 1979 2100 -2132 0 + -1979 -2069 2133 0 + -1979 2069 -2133 0 + 1979 -2101 2133 0 + 1979 2101 -2133 0 + -1979 -2070 2134 0 + -1979 2070 -2134 0 + 1979 -2102 2134 0 + 1979 2102 -2134 0 + -1979 -2071 2135 0 + -1979 2071 -2135 0 + 1979 -2103 2135 0 + 1979 2103 -2135 0 + -1979 -2072 2136 0 + -1979 2072 -2136 0 + 1979 -2104 2136 0 + 1979 2104 -2136 0 + -1979 -2073 2137 0 + -1979 2073 -2137 0 + 1979 -2105 2137 0 + 1979 2105 -2137 0 + -1979 -2074 2138 0 + -1979 2074 -2138 0 + 1979 -2106 2138 0 + 1979 2106 -2138 0 + -1979 -2075 2139 0 + -1979 2075 -2139 0 + 1979 -2107 2139 0 + 1979 2107 -2139 0 + -1979 -2076 2140 0 + -1979 2076 -2140 0 + 1979 -2108 2140 0 + 1979 2108 -2140 0 + -1979 -2077 2141 0 + -1979 2077 -2141 0 + 1979 -2109 2141 0 + 1979 2109 -2141 0 + 2110 2175 0 + -2110 -2142 2175 0 + -2110 -2175 0 + 2110 -2142 -2175 0 + 2111 2143 2176 0 + -2111 2176 0 + -2111 2143 -2176 0 + 2111 -2176 0 + 2112 2177 0 + -2112 -2144 2177 0 + -2112 -2177 0 + 2112 -2144 -2177 0 + 2113 2178 0 + -2113 -2145 2178 0 + -2113 -2178 0 + 2113 -2145 -2178 0 + 2114 2179 0 + -2114 -2146 2179 0 + -2114 -2179 0 + 2114 -2146 -2179 0 + 2115 2180 0 + -2115 -2147 2180 0 + -2115 -2180 0 + 2115 -2147 -2180 0 + 2116 2181 0 + -2116 -2148 2181 0 + -2116 -2181 0 + 2116 -2148 -2181 0 + 2117 2182 0 + -2117 -2149 2182 0 + -2117 -2182 0 + 2117 -2149 -2182 0 + 2118 2183 0 + -2118 -2150 2183 0 + -2118 -2183 0 + 2118 -2150 -2183 0 + 2119 2184 0 + -2119 -2151 2184 0 + -2119 -2184 0 + 2119 -2151 -2184 0 + 2120 2185 0 + -2120 -2152 2185 0 + -2120 -2185 0 + 2120 -2152 -2185 0 + 2121 2186 0 + -2121 -2153 2186 0 + -2121 -2186 0 + 2121 -2153 -2186 0 + 2122 2187 0 + -2122 -2154 2187 0 + -2122 -2187 0 + 2122 -2154 -2187 0 + 2123 2188 0 + -2123 -2155 2188 0 + -2123 -2188 0 + 2123 -2155 -2188 0 + 2124 2189 0 + -2124 -2156 2189 0 + -2124 -2189 0 + 2124 -2156 -2189 0 + 2125 2190 0 + -2125 -2157 2190 0 + -2125 -2190 0 + 2125 -2157 -2190 0 + 2126 2191 0 + -2126 -2158 2191 0 + -2126 -2191 0 + 2126 -2158 -2191 0 + 2127 2192 0 + -2127 -2159 2192 0 + -2127 -2192 0 + 2127 -2159 -2192 0 + 2128 2193 0 + -2128 -2160 2193 0 + -2128 -2193 0 + 2128 -2160 -2193 0 + 2129 2194 0 + -2129 -2161 2194 0 + -2129 -2194 0 + 2129 -2161 -2194 0 + 2130 2195 0 + -2130 -2162 2195 0 + -2130 -2195 0 + 2130 -2162 -2195 0 + 2131 2196 0 + -2131 -2163 2196 0 + -2131 -2196 0 + 2131 -2163 -2196 0 + 2132 2197 0 + -2132 -2164 2197 0 + -2132 -2197 0 + 2132 -2164 -2197 0 + 2133 2198 0 + -2133 -2165 2198 0 + -2133 -2198 0 + 2133 -2165 -2198 0 + 2134 2199 0 + -2134 -2166 2199 0 + -2134 -2199 0 + 2134 -2166 -2199 0 + 2135 2200 0 + -2135 -2167 2200 0 + -2135 -2200 0 + 2135 -2167 -2200 0 + 2136 2201 0 + -2136 -2168 2201 0 + -2136 -2201 0 + 2136 -2168 -2201 0 + 2137 2202 0 + -2137 -2169 2202 0 + -2137 -2202 0 + 2137 -2169 -2202 0 + 2138 2203 0 + -2138 -2170 2203 0 + -2138 -2203 0 + 2138 -2170 -2203 0 + 2139 2204 0 + -2139 -2171 2204 0 + -2139 -2204 0 + 2139 -2171 -2204 0 + 2140 2205 0 + -2140 -2172 2205 0 + -2140 -2205 0 + 2140 -2172 -2205 0 + 2141 2206 0 + -2141 -2173 2206 0 + -2141 -2206 0 + 2141 -2173 -2206 0 + -2175 2207 0 + 1 -2207 0 + 2175 -2207 0 + -2176 -2207 2208 0 + 2207 -2208 0 + 2176 -2208 0 + -2177 -2208 2209 0 + 2208 -2209 0 + 2177 -2209 0 + -2178 -2209 2210 0 + 2209 -2210 0 + 2178 -2210 0 + -2179 -2210 2211 0 + 2210 -2211 0 + 2179 -2211 0 + -2180 -2211 2212 0 + 2211 -2212 0 + 2180 -2212 0 + -2181 -2212 2213 0 + 2212 -2213 0 + 2181 -2213 0 + -2182 -2213 2214 0 + 2213 -2214 0 + 2182 -2214 0 + -2183 -2214 2215 0 + 2214 -2215 0 + 2183 -2215 0 + -2184 -2215 2216 0 + 2215 -2216 0 + 2184 -2216 0 + -2185 -2216 2217 0 + 2216 -2217 0 + 2185 -2217 0 + -2186 -2217 2218 0 + 2217 -2218 0 + 2186 -2218 0 + -2187 -2218 2219 0 + 2218 -2219 0 + 2187 -2219 0 + -2188 -2219 2220 0 + 2219 -2220 0 + 2188 -2220 0 + -2189 -2220 2221 0 + 2220 -2221 0 + 2189 -2221 0 + -2190 -2221 2222 0 + 2221 -2222 0 + 2190 -2222 0 + -2191 -2222 2223 0 + 2222 -2223 0 + 2191 -2223 0 + -2192 -2223 2224 0 + 2223 -2224 0 + 2192 -2224 0 + -2193 -2224 2225 0 + 2224 -2225 0 + 2193 -2225 0 + -2194 -2225 2226 0 + 2225 -2226 0 + 2194 -2226 0 + -2195 -2226 2227 0 + 2226 -2227 0 + 2195 -2227 0 + -2196 -2227 2228 0 + 2227 -2228 0 + 2196 -2228 0 + -2197 -2228 2229 0 + 2228 -2229 0 + 2197 -2229 0 + -2198 -2229 2230 0 + 2229 -2230 0 + 2198 -2230 0 + -2199 -2230 2231 0 + 2230 -2231 0 + 2199 -2231 0 + -2200 -2231 2232 0 + 2231 -2232 0 + 2200 -2232 0 + -2201 -2232 2233 0 + 2232 -2233 0 + 2201 -2233 0 + -2202 -2233 2234 0 + 2233 -2234 0 + 2202 -2234 0 + -2203 -2234 2235 0 + 2234 -2235 0 + 2203 -2235 0 + -2204 -2235 2236 0 + 2235 -2236 0 + 2204 -2236 0 + -2205 -2236 2237 0 + 2236 -2237 0 + 2205 -2237 0 + -2206 -2237 2238 0 + 2237 -2238 0 + 2206 -2238 0 + -2174 2238 0 + 2174 -2238 0 + 2174 -2247 0 + -2174 2247 0 + 2247 2312 0 + -2247 -2279 2312 0 + -2247 -2312 0 + 2247 -2279 -2312 0 + -2248 -2280 2313 0 + -2249 -2281 2314 0 + -2250 -2282 2315 0 + -2251 -2283 2316 0 + -2252 -2284 2317 0 + -2253 -2285 2318 0 + -2254 -2286 2319 0 + -2255 -2287 2320 0 + -2256 -2288 2321 0 + -2257 -2289 2322 0 + -2258 -2290 2323 0 + -2259 -2291 2324 0 + -2260 -2292 2325 0 + -2261 -2293 2326 0 + -2262 -2294 2327 0 + -2263 -2295 2328 0 + -2264 -2296 2329 0 + -2265 -2297 2330 0 + -2266 -2298 2331 0 + -2267 -2299 2332 0 + -2268 -2300 2333 0 + -2269 -2301 2334 0 + -2270 -2302 2335 0 + -2271 -2303 2336 0 + -2272 -2304 2337 0 + -2273 -2305 2338 0 + -2274 -2306 2339 0 + -2275 -2307 2340 0 + -2276 -2308 2341 0 + -2277 -2309 2342 0 + -2278 -2310 2343 0 + -2312 2344 0 + 1 -2344 0 + 2312 -2344 0 + -2344 2345 0 + 2344 -2345 0 + 2313 -2345 0 + -2345 2346 0 + 2345 -2346 0 + 2314 -2346 0 + -2346 2347 0 + 2346 -2347 0 + 2315 -2347 0 + -2347 2348 0 + 2347 -2348 0 + 2316 -2348 0 + -2348 2349 0 + 2348 -2349 0 + 2317 -2349 0 + -2349 2350 0 + 2349 -2350 0 + 2318 -2350 0 + -2350 2351 0 + 2350 -2351 0 + 2319 -2351 0 + -2351 2352 0 + 2351 -2352 0 + 2320 -2352 0 + -2352 2353 0 + 2352 -2353 0 + 2321 -2353 0 + -2353 2354 0 + 2353 -2354 0 + 2322 -2354 0 + -2354 2355 0 + 2354 -2355 0 + 2323 -2355 0 + -2355 2356 0 + 2355 -2356 0 + 2324 -2356 0 + -2356 2357 0 + 2356 -2357 0 + 2325 -2357 0 + -2357 2358 0 + 2357 -2358 0 + 2326 -2358 0 + -2358 2359 0 + 2358 -2359 0 + 2327 -2359 0 + -2359 2360 0 + 2359 -2360 0 + 2328 -2360 0 + -2360 2361 0 + 2360 -2361 0 + 2329 -2361 0 + -2361 2362 0 + 2361 -2362 0 + 2330 -2362 0 + -2362 2363 0 + 2362 -2363 0 + 2331 -2363 0 + -2363 2364 0 + 2363 -2364 0 + 2332 -2364 0 + -2364 2365 0 + 2364 -2365 0 + 2333 -2365 0 + -2365 2366 0 + 2365 -2366 0 + 2334 -2366 0 + -2366 2367 0 + 2366 -2367 0 + 2335 -2367 0 + -2367 2368 0 + 2367 -2368 0 + 2336 -2368 0 + -2368 2369 0 + 2368 -2369 0 + 2337 -2369 0 + -2369 2370 0 + 2369 -2370 0 + 2338 -2370 0 + -2370 2371 0 + 2370 -2371 0 + 2339 -2371 0 + -2371 2372 0 + 2371 -2372 0 + 2340 -2372 0 + -2372 2373 0 + 2372 -2373 0 + 2341 -2373 0 + -2373 2374 0 + 2373 -2374 0 + 2342 -2374 0 + -2374 2375 0 + 2374 -2375 0 + 2343 -2375 0 + -2311 2375 0 + 2311 -2375 0 + -1979 -2279 2440 0 + -1979 -2440 0 + 1979 -2408 2440 0 + 1979 2408 -2440 0 + -1979 -2280 2441 0 + -1979 -2441 0 + 1979 -2409 2441 0 + 1979 2409 -2441 0 + -1979 -2281 2442 0 + -1979 -2442 0 + 1979 -2410 2442 0 + 1979 2410 -2442 0 + -1979 -2282 2443 0 + -1979 -2443 0 + 1979 -2411 2443 0 + 1979 2411 -2443 0 + -1979 -2283 2444 0 + -1979 -2444 0 + 1979 -2412 2444 0 + 1979 2412 -2444 0 + -1979 -2284 2445 0 + -1979 -2445 0 + 1979 -2413 2445 0 + 1979 2413 -2445 0 + -1979 -2285 2446 0 + -1979 -2446 0 + 1979 -2414 2446 0 + 1979 2414 -2446 0 + -1979 -2286 2447 0 + -1979 -2447 0 + 1979 -2415 2447 0 + 1979 2415 -2447 0 + -1979 -2287 2448 0 + -1979 -2448 0 + 1979 -2416 2448 0 + 1979 2416 -2448 0 + -1979 -2288 2449 0 + -1979 -2449 0 + 1979 -2417 2449 0 + 1979 2417 -2449 0 + -1979 -2289 2450 0 + -1979 -2450 0 + 1979 -2418 2450 0 + 1979 2418 -2450 0 + -1979 -2290 2451 0 + -1979 -2451 0 + 1979 -2419 2451 0 + 1979 2419 -2451 0 + -1979 -2291 2452 0 + -1979 -2452 0 + 1979 -2420 2452 0 + 1979 2420 -2452 0 + -1979 -2292 2453 0 + -1979 -2453 0 + 1979 -2421 2453 0 + 1979 2421 -2453 0 + -1979 -2293 2454 0 + -1979 -2454 0 + 1979 -2422 2454 0 + 1979 2422 -2454 0 + -1979 -2294 2455 0 + -1979 -2455 0 + 1979 -2423 2455 0 + 1979 2423 -2455 0 + -1979 -2295 2456 0 + -1979 -2456 0 + 1979 -2424 2456 0 + 1979 2424 -2456 0 + -1979 -2296 2457 0 + -1979 -2457 0 + 1979 -2425 2457 0 + 1979 2425 -2457 0 + -1979 -2297 2458 0 + -1979 -2458 0 + 1979 -2426 2458 0 + 1979 2426 -2458 0 + -1979 -2298 2459 0 + -1979 -2459 0 + 1979 -2427 2459 0 + 1979 2427 -2459 0 + -1979 -2299 2460 0 + -1979 -2460 0 + 1979 -2428 2460 0 + 1979 2428 -2460 0 + -1979 -2300 2461 0 + -1979 -2461 0 + 1979 -2429 2461 0 + 1979 2429 -2461 0 + -1979 -2301 2462 0 + -1979 -2462 0 + 1979 -2430 2462 0 + 1979 2430 -2462 0 + -1979 -2302 2463 0 + -1979 -2463 0 + 1979 -2431 2463 0 + 1979 2431 -2463 0 + -1979 -2303 2464 0 + -1979 -2464 0 + 1979 -2432 2464 0 + 1979 2432 -2464 0 + -1979 -2304 2465 0 + -1979 -2465 0 + 1979 -2433 2465 0 + 1979 2433 -2465 0 + -1979 -2305 2466 0 + -1979 -2466 0 + 1979 -2434 2466 0 + 1979 2434 -2466 0 + -1979 -2306 2467 0 + -1979 -2467 0 + 1979 -2435 2467 0 + 1979 2435 -2467 0 + -1979 -2307 2468 0 + -1979 -2468 0 + 1979 -2436 2468 0 + 1979 2436 -2468 0 + -1979 -2308 2469 0 + -1979 -2469 0 + 1979 -2437 2469 0 + 1979 2437 -2469 0 + -1979 -2309 2470 0 + -1979 -2470 0 + 1979 -2438 2470 0 + 1979 2438 -2470 0 + -1979 -2310 2471 0 + -1979 -2471 0 + 1979 -2439 2471 0 + 1979 2439 -2471 0 + 2440 2505 0 + -2440 -2505 0 + 2441 2506 0 + -2441 -2506 0 + 2442 2507 0 + -2442 -2507 0 + 2443 2508 0 + -2443 -2508 0 + 2444 2509 0 + -2444 -2509 0 + 2445 2510 0 + -2445 -2510 0 + 2446 2511 0 + -2446 -2511 0 + 2447 2512 0 + -2447 -2512 0 + 2448 2513 0 + -2448 -2513 0 + 2449 2514 0 + -2449 -2514 0 + 2450 2515 0 + -2450 -2515 0 + 2451 2516 0 + -2451 -2516 0 + 2452 2517 0 + -2452 -2517 0 + 2453 2518 0 + -2453 -2518 0 + 2454 2519 0 + -2454 -2519 0 + 2455 2520 0 + -2455 -2520 0 + 2456 2521 0 + -2456 -2521 0 + 2457 2522 0 + -2457 -2522 0 + 2458 2523 0 + -2458 -2523 0 + 2459 2524 0 + -2459 -2524 0 + 2460 2525 0 + -2460 -2525 0 + 2461 2526 0 + -2461 -2526 0 + 2462 2527 0 + -2462 -2527 0 + 2463 2528 0 + -2463 -2528 0 + 2464 2529 0 + -2464 -2529 0 + 2465 2530 0 + -2465 -2530 0 + 2466 2531 0 + -2466 -2531 0 + 2467 2532 0 + -2467 -2532 0 + 2468 2533 0 + -2468 -2533 0 + 2469 2534 0 + -2469 -2534 0 + 2470 2535 0 + -2470 -2535 0 + 2471 2536 0 + -2471 -2536 0 + -2376 2505 2537 0 + 2376 -2505 2537 0 + 2376 2505 -2537 0 + -2376 -2505 -2537 0 + -2376 -2505 2539 0 + 2376 -2539 0 + 2505 -2539 0 + -2537 2538 0 + 2537 -2538 0 + 1 -2538 0 + 2538 2539 -2540 0 + -2538 2540 0 + -2539 2540 0 + 1 2473 -2537 0 + 2473 2537 0 + 1 -2473 2537 0 + -2473 -2537 0 + -2377 2506 2541 0 + 2377 -2506 2541 0 + 2377 2506 -2541 0 + -2377 -2506 -2541 0 + -2377 -2506 2543 0 + 2377 -2543 0 + 2506 -2543 0 + -2540 -2541 2542 0 + 2541 -2542 0 + 2540 -2542 0 + 2542 2543 -2544 0 + -2542 2544 0 + -2543 2544 0 + 2474 2540 -2541 0 + 2474 -2540 2541 0 + -2474 2540 2541 0 + -2474 -2540 -2541 0 + -2378 2507 2545 0 + 2378 -2507 2545 0 + 2378 2507 -2545 0 + -2378 -2507 -2545 0 + -2378 -2507 2547 0 + 2378 -2547 0 + 2507 -2547 0 + -2544 -2545 2546 0 + 2545 -2546 0 + 2544 -2546 0 + 2546 2547 -2548 0 + -2546 2548 0 + -2547 2548 0 + 2475 2544 -2545 0 + 2475 -2544 2545 0 + -2475 2544 2545 0 + -2475 -2544 -2545 0 + -2379 2508 2549 0 + 2379 -2508 2549 0 + 2379 2508 -2549 0 + -2379 -2508 -2549 0 + -2379 -2508 2551 0 + 2379 -2551 0 + 2508 -2551 0 + -2548 -2549 2550 0 + 2549 -2550 0 + 2548 -2550 0 + 2550 2551 -2552 0 + -2550 2552 0 + -2551 2552 0 + 2476 2548 -2549 0 + 2476 -2548 2549 0 + -2476 2548 2549 0 + -2476 -2548 -2549 0 + -2380 2509 2553 0 + 2380 -2509 2553 0 + 2380 2509 -2553 0 + -2380 -2509 -2553 0 + -2380 -2509 2555 0 + 2380 -2555 0 + 2509 -2555 0 + -2552 -2553 2554 0 + 2553 -2554 0 + 2552 -2554 0 + 2554 2555 -2556 0 + -2554 2556 0 + -2555 2556 0 + 2477 2552 -2553 0 + 2477 -2552 2553 0 + -2477 2552 2553 0 + -2477 -2552 -2553 0 + -2381 2510 2557 0 + 2381 -2510 2557 0 + 2381 2510 -2557 0 + -2381 -2510 -2557 0 + -2381 -2510 2559 0 + 2381 -2559 0 + 2510 -2559 0 + -2556 -2557 2558 0 + 2557 -2558 0 + 2556 -2558 0 + 2558 2559 -2560 0 + -2558 2560 0 + -2559 2560 0 + 2478 2556 -2557 0 + 2478 -2556 2557 0 + -2478 2556 2557 0 + -2478 -2556 -2557 0 + -2382 2511 2561 0 + 2382 -2511 2561 0 + 2382 2511 -2561 0 + -2382 -2511 -2561 0 + -2382 -2511 2563 0 + 2382 -2563 0 + 2511 -2563 0 + -2560 -2561 2562 0 + 2561 -2562 0 + 2560 -2562 0 + 2562 2563 -2564 0 + -2562 2564 0 + -2563 2564 0 + 2479 2560 -2561 0 + 2479 -2560 2561 0 + -2479 2560 2561 0 + -2479 -2560 -2561 0 + -2383 2512 2565 0 + 2383 -2512 2565 0 + 2383 2512 -2565 0 + -2383 -2512 -2565 0 + -2383 -2512 2567 0 + 2383 -2567 0 + 2512 -2567 0 + -2564 -2565 2566 0 + 2565 -2566 0 + 2564 -2566 0 + 2566 2567 -2568 0 + -2566 2568 0 + -2567 2568 0 + 2480 2564 -2565 0 + 2480 -2564 2565 0 + -2480 2564 2565 0 + -2480 -2564 -2565 0 + -2384 2513 2569 0 + 2384 -2513 2569 0 + 2384 2513 -2569 0 + -2384 -2513 -2569 0 + -2384 -2513 2571 0 + 2384 -2571 0 + 2513 -2571 0 + -2568 -2569 2570 0 + 2569 -2570 0 + 2568 -2570 0 + 2570 2571 -2572 0 + -2570 2572 0 + -2571 2572 0 + 2481 2568 -2569 0 + 2481 -2568 2569 0 + -2481 2568 2569 0 + -2481 -2568 -2569 0 + -2385 2514 2573 0 + 2385 -2514 2573 0 + 2385 2514 -2573 0 + -2385 -2514 -2573 0 + -2385 -2514 2575 0 + 2385 -2575 0 + 2514 -2575 0 + -2572 -2573 2574 0 + 2573 -2574 0 + 2572 -2574 0 + 2574 2575 -2576 0 + -2574 2576 0 + -2575 2576 0 + 2482 2572 -2573 0 + 2482 -2572 2573 0 + -2482 2572 2573 0 + -2482 -2572 -2573 0 + -2386 2515 2577 0 + 2386 -2515 2577 0 + 2386 2515 -2577 0 + -2386 -2515 -2577 0 + -2386 -2515 2579 0 + 2386 -2579 0 + 2515 -2579 0 + -2576 -2577 2578 0 + 2577 -2578 0 + 2576 -2578 0 + 2578 2579 -2580 0 + -2578 2580 0 + -2579 2580 0 + 2483 2576 -2577 0 + 2483 -2576 2577 0 + -2483 2576 2577 0 + -2483 -2576 -2577 0 + -2387 2516 2581 0 + 2387 -2516 2581 0 + 2387 2516 -2581 0 + -2387 -2516 -2581 0 + -2387 -2516 2583 0 + 2387 -2583 0 + 2516 -2583 0 + -2580 -2581 2582 0 + 2581 -2582 0 + 2580 -2582 0 + 2582 2583 -2584 0 + -2582 2584 0 + -2583 2584 0 + 2484 2580 -2581 0 + 2484 -2580 2581 0 + -2484 2580 2581 0 + -2484 -2580 -2581 0 + -2388 2517 2585 0 + 2388 -2517 2585 0 + 2388 2517 -2585 0 + -2388 -2517 -2585 0 + -2388 -2517 2587 0 + 2388 -2587 0 + 2517 -2587 0 + -2584 -2585 2586 0 + 2585 -2586 0 + 2584 -2586 0 + 2586 2587 -2588 0 + -2586 2588 0 + -2587 2588 0 + 2485 2584 -2585 0 + 2485 -2584 2585 0 + -2485 2584 2585 0 + -2485 -2584 -2585 0 + -2389 2518 2589 0 + 2389 -2518 2589 0 + 2389 2518 -2589 0 + -2389 -2518 -2589 0 + -2389 -2518 2591 0 + 2389 -2591 0 + 2518 -2591 0 + -2588 -2589 2590 0 + 2589 -2590 0 + 2588 -2590 0 + 2590 2591 -2592 0 + -2590 2592 0 + -2591 2592 0 + 2486 2588 -2589 0 + 2486 -2588 2589 0 + -2486 2588 2589 0 + -2486 -2588 -2589 0 + -2390 2519 2593 0 + 2390 -2519 2593 0 + 2390 2519 -2593 0 + -2390 -2519 -2593 0 + -2390 -2519 2595 0 + 2390 -2595 0 + 2519 -2595 0 + -2592 -2593 2594 0 + 2593 -2594 0 + 2592 -2594 0 + 2594 2595 -2596 0 + -2594 2596 0 + -2595 2596 0 + 2487 2592 -2593 0 + 2487 -2592 2593 0 + -2487 2592 2593 0 + -2487 -2592 -2593 0 + -2391 2520 2597 0 + 2391 -2520 2597 0 + 2391 2520 -2597 0 + -2391 -2520 -2597 0 + -2391 -2520 2599 0 + 2391 -2599 0 + 2520 -2599 0 + -2596 -2597 2598 0 + 2597 -2598 0 + 2596 -2598 0 + 2598 2599 -2600 0 + -2598 2600 0 + -2599 2600 0 + 2488 2596 -2597 0 + 2488 -2596 2597 0 + -2488 2596 2597 0 + -2488 -2596 -2597 0 + -2392 2521 2601 0 + 2392 -2521 2601 0 + 2392 2521 -2601 0 + -2392 -2521 -2601 0 + -2392 -2521 2603 0 + 2392 -2603 0 + 2521 -2603 0 + -2600 -2601 2602 0 + 2601 -2602 0 + 2600 -2602 0 + 2602 2603 -2604 0 + -2602 2604 0 + -2603 2604 0 + 2489 2600 -2601 0 + 2489 -2600 2601 0 + -2489 2600 2601 0 + -2489 -2600 -2601 0 + -2393 2522 2605 0 + 2393 -2522 2605 0 + 2393 2522 -2605 0 + -2393 -2522 -2605 0 + -2393 -2522 2607 0 + 2393 -2607 0 + 2522 -2607 0 + -2604 -2605 2606 0 + 2605 -2606 0 + 2604 -2606 0 + 2606 2607 -2608 0 + -2606 2608 0 + -2607 2608 0 + 2490 2604 -2605 0 + 2490 -2604 2605 0 + -2490 2604 2605 0 + -2490 -2604 -2605 0 + -2394 2523 2609 0 + 2394 -2523 2609 0 + 2394 2523 -2609 0 + -2394 -2523 -2609 0 + -2394 -2523 2611 0 + 2394 -2611 0 + 2523 -2611 0 + -2608 -2609 2610 0 + 2609 -2610 0 + 2608 -2610 0 + 2610 2611 -2612 0 + -2610 2612 0 + -2611 2612 0 + 2491 2608 -2609 0 + 2491 -2608 2609 0 + -2491 2608 2609 0 + -2491 -2608 -2609 0 + -2395 2524 2613 0 + 2395 -2524 2613 0 + 2395 2524 -2613 0 + -2395 -2524 -2613 0 + -2395 -2524 2615 0 + 2395 -2615 0 + 2524 -2615 0 + -2612 -2613 2614 0 + 2613 -2614 0 + 2612 -2614 0 + 2614 2615 -2616 0 + -2614 2616 0 + -2615 2616 0 + 2492 2612 -2613 0 + 2492 -2612 2613 0 + -2492 2612 2613 0 + -2492 -2612 -2613 0 + -2396 2525 2617 0 + 2396 -2525 2617 0 + 2396 2525 -2617 0 + -2396 -2525 -2617 0 + -2396 -2525 2619 0 + 2396 -2619 0 + 2525 -2619 0 + -2616 -2617 2618 0 + 2617 -2618 0 + 2616 -2618 0 + 2618 2619 -2620 0 + -2618 2620 0 + -2619 2620 0 + 2493 2616 -2617 0 + 2493 -2616 2617 0 + -2493 2616 2617 0 + -2493 -2616 -2617 0 + -2397 2526 2621 0 + 2397 -2526 2621 0 + 2397 2526 -2621 0 + -2397 -2526 -2621 0 + -2397 -2526 2623 0 + 2397 -2623 0 + 2526 -2623 0 + -2620 -2621 2622 0 + 2621 -2622 0 + 2620 -2622 0 + 2622 2623 -2624 0 + -2622 2624 0 + -2623 2624 0 + 2494 2620 -2621 0 + 2494 -2620 2621 0 + -2494 2620 2621 0 + -2494 -2620 -2621 0 + -2398 2527 2625 0 + 2398 -2527 2625 0 + 2398 2527 -2625 0 + -2398 -2527 -2625 0 + -2398 -2527 2627 0 + 2398 -2627 0 + 2527 -2627 0 + -2624 -2625 2626 0 + 2625 -2626 0 + 2624 -2626 0 + 2626 2627 -2628 0 + -2626 2628 0 + -2627 2628 0 + 2495 2624 -2625 0 + 2495 -2624 2625 0 + -2495 2624 2625 0 + -2495 -2624 -2625 0 + -2399 2528 2629 0 + 2399 -2528 2629 0 + 2399 2528 -2629 0 + -2399 -2528 -2629 0 + -2399 -2528 2631 0 + 2399 -2631 0 + 2528 -2631 0 + -2628 -2629 2630 0 + 2629 -2630 0 + 2628 -2630 0 + 2630 2631 -2632 0 + -2630 2632 0 + -2631 2632 0 + 2496 2628 -2629 0 + 2496 -2628 2629 0 + -2496 2628 2629 0 + -2496 -2628 -2629 0 + -2400 2529 2633 0 + 2400 -2529 2633 0 + 2400 2529 -2633 0 + -2400 -2529 -2633 0 + -2400 -2529 2635 0 + 2400 -2635 0 + 2529 -2635 0 + -2632 -2633 2634 0 + 2633 -2634 0 + 2632 -2634 0 + 2634 2635 -2636 0 + -2634 2636 0 + -2635 2636 0 + 2497 2632 -2633 0 + 2497 -2632 2633 0 + -2497 2632 2633 0 + -2497 -2632 -2633 0 + -2401 2530 2637 0 + 2401 -2530 2637 0 + 2401 2530 -2637 0 + -2401 -2530 -2637 0 + -2401 -2530 2639 0 + 2401 -2639 0 + 2530 -2639 0 + -2636 -2637 2638 0 + 2637 -2638 0 + 2636 -2638 0 + 2638 2639 -2640 0 + -2638 2640 0 + -2639 2640 0 + 2498 2636 -2637 0 + 2498 -2636 2637 0 + -2498 2636 2637 0 + -2498 -2636 -2637 0 + -2402 2531 2641 0 + 2402 -2531 2641 0 + 2402 2531 -2641 0 + -2402 -2531 -2641 0 + -2402 -2531 2643 0 + 2402 -2643 0 + 2531 -2643 0 + -2640 -2641 2642 0 + 2641 -2642 0 + 2640 -2642 0 + 2642 2643 -2644 0 + -2642 2644 0 + -2643 2644 0 + 2499 2640 -2641 0 + 2499 -2640 2641 0 + -2499 2640 2641 0 + -2499 -2640 -2641 0 + -2403 2532 2645 0 + 2403 -2532 2645 0 + 2403 2532 -2645 0 + -2403 -2532 -2645 0 + -2403 -2532 2647 0 + 2403 -2647 0 + 2532 -2647 0 + -2644 -2645 2646 0 + 2645 -2646 0 + 2644 -2646 0 + 2646 2647 -2648 0 + -2646 2648 0 + -2647 2648 0 + 2500 2644 -2645 0 + 2500 -2644 2645 0 + -2500 2644 2645 0 + -2500 -2644 -2645 0 + -2404 2533 2649 0 + 2404 -2533 2649 0 + 2404 2533 -2649 0 + -2404 -2533 -2649 0 + -2404 -2533 2651 0 + 2404 -2651 0 + 2533 -2651 0 + -2648 -2649 2650 0 + 2649 -2650 0 + 2648 -2650 0 + 2650 2651 -2652 0 + -2650 2652 0 + -2651 2652 0 + 2501 2648 -2649 0 + 2501 -2648 2649 0 + -2501 2648 2649 0 + -2501 -2648 -2649 0 + -2405 2534 2653 0 + 2405 -2534 2653 0 + 2405 2534 -2653 0 + -2405 -2534 -2653 0 + -2405 -2534 2655 0 + 2405 -2655 0 + 2534 -2655 0 + -2652 -2653 2654 0 + 2653 -2654 0 + 2652 -2654 0 + 2654 2655 -2656 0 + -2654 2656 0 + -2655 2656 0 + 2502 2652 -2653 0 + 2502 -2652 2653 0 + -2502 2652 2653 0 + -2502 -2652 -2653 0 + -2406 2535 2657 0 + 2406 -2535 2657 0 + 2406 2535 -2657 0 + -2406 -2535 -2657 0 + -2406 -2535 2659 0 + 2406 -2659 0 + 2535 -2659 0 + -2656 -2657 2658 0 + 2657 -2658 0 + 2656 -2658 0 + 2658 2659 -2660 0 + -2658 2660 0 + -2659 2660 0 + 2503 2656 -2657 0 + 2503 -2656 2657 0 + -2503 2656 2657 0 + -2503 -2656 -2657 0 + -2407 2536 2661 0 + 2407 -2536 2661 0 + 2407 2536 -2661 0 + -2407 -2536 -2661 0 + -2407 -2536 2663 0 + 2407 -2663 0 + 2536 -2663 0 + -2660 -2661 2662 0 + 2661 -2662 0 + 2660 -2662 0 + 2662 2663 -2664 0 + -2662 2664 0 + -2663 2664 0 + 2504 2660 -2661 0 + 2504 -2660 2661 0 + -2504 2660 2661 0 + -2504 -2660 -2661 0 + 2472 2664 0 + -2472 -2664 0 + -1913 -2472 2665 0 + 2472 -2665 0 + 1913 -2665 0 + 2110 -2666 0 + -2110 2666 0 + 2111 -2667 0 + -2111 2667 0 + 2112 -2668 0 + -2112 2668 0 + 2113 -2669 0 + -2113 2669 0 + 2114 -2670 0 + -2114 2670 0 + 2115 -2671 0 + -2115 2671 0 + 2116 -2672 0 + -2116 2672 0 + 2117 -2673 0 + -2117 2673 0 + 2118 -2674 0 + -2118 2674 0 + 2119 -2675 0 + -2119 2675 0 + 2120 -2676 0 + -2120 2676 0 + 2121 -2677 0 + -2121 2677 0 + 2122 -2678 0 + -2122 2678 0 + 2123 -2679 0 + -2123 2679 0 + 2124 -2680 0 + -2124 2680 0 + 2125 -2681 0 + -2125 2681 0 + 2126 -2682 0 + -2126 2682 0 + 2127 -2683 0 + -2127 2683 0 + 2128 -2684 0 + -2128 2684 0 + 2129 -2685 0 + -2129 2685 0 + 2130 -2686 0 + -2130 2686 0 + 2131 -2687 0 + -2131 2687 0 + 2132 -2688 0 + -2132 2688 0 + 2133 -2689 0 + -2133 2689 0 + 2134 -2690 0 + -2134 2690 0 + 2135 -2691 0 + -2135 2691 0 + 2136 -2692 0 + -2136 2692 0 + 2137 -2693 0 + -2137 2693 0 + 2138 -2694 0 + -2138 2694 0 + 2139 -2695 0 + -2139 2695 0 + 2140 -2696 0 + -2140 2696 0 + 2141 -2697 0 + -2141 2697 0 + 2666 2762 0 + -2666 2698 2762 0 + 2666 2698 -2762 0 + -2666 -2762 0 + -2666 2764 0 + 2698 -2764 0 + 2666 -2764 0 + -2 -2762 2763 0 + 2762 -2763 0 + 2764 -2765 0 + -2763 2765 0 + -2764 2765 0 + 2730 -2762 0 + -2 2730 2762 0 + -2730 2762 0 + -2 -2730 -2762 0 + 2667 2766 0 + -2667 2699 2766 0 + 2667 2699 -2766 0 + -2667 -2766 0 + -2667 2768 0 + 2699 -2768 0 + 2667 -2768 0 + -2765 -2766 2767 0 + 2766 -2767 0 + 2765 -2767 0 + 2767 2768 -2769 0 + -2767 2769 0 + -2768 2769 0 + 2731 2765 -2766 0 + 2731 -2765 2766 0 + -2731 2765 2766 0 + -2731 -2765 -2766 0 + 2668 2770 0 + -2668 2700 2770 0 + 2668 2700 -2770 0 + -2668 -2770 0 + -2668 2772 0 + 2700 -2772 0 + 2668 -2772 0 + -2769 -2770 2771 0 + 2770 -2771 0 + 2769 -2771 0 + 2771 2772 -2773 0 + -2771 2773 0 + -2772 2773 0 + 2732 2769 -2770 0 + 2732 -2769 2770 0 + -2732 2769 2770 0 + -2732 -2769 -2770 0 + 2669 2774 0 + -2669 2701 2774 0 + 2669 2701 -2774 0 + -2669 -2774 0 + -2669 2776 0 + 2701 -2776 0 + 2669 -2776 0 + -2773 -2774 2775 0 + 2774 -2775 0 + 2773 -2775 0 + 2775 2776 -2777 0 + -2775 2777 0 + -2776 2777 0 + 2733 2773 -2774 0 + 2733 -2773 2774 0 + -2733 2773 2774 0 + -2733 -2773 -2774 0 + 2670 2778 0 + -2670 2702 2778 0 + 2670 2702 -2778 0 + -2670 -2778 0 + -2670 2780 0 + 2702 -2780 0 + 2670 -2780 0 + -2777 -2778 2779 0 + 2778 -2779 0 + 2777 -2779 0 + 2779 2780 -2781 0 + -2779 2781 0 + -2780 2781 0 + 2734 2777 -2778 0 + 2734 -2777 2778 0 + -2734 2777 2778 0 + -2734 -2777 -2778 0 + 2671 2782 0 + -2671 2703 2782 0 + 2671 2703 -2782 0 + -2671 -2782 0 + -2671 2784 0 + 2703 -2784 0 + 2671 -2784 0 + -2781 -2782 2783 0 + 2782 -2783 0 + 2781 -2783 0 + 2783 2784 -2785 0 + -2783 2785 0 + -2784 2785 0 + 2735 2781 -2782 0 + 2735 -2781 2782 0 + -2735 2781 2782 0 + -2735 -2781 -2782 0 + 2672 2786 0 + -2672 2704 2786 0 + 2672 2704 -2786 0 + -2672 -2786 0 + -2672 2788 0 + 2704 -2788 0 + 2672 -2788 0 + -2785 -2786 2787 0 + 2786 -2787 0 + 2785 -2787 0 + 2787 2788 -2789 0 + -2787 2789 0 + -2788 2789 0 + 2736 2785 -2786 0 + 2736 -2785 2786 0 + -2736 2785 2786 0 + -2736 -2785 -2786 0 + 2673 2790 0 + -2673 2705 2790 0 + 2673 2705 -2790 0 + -2673 -2790 0 + -2673 2792 0 + 2705 -2792 0 + 2673 -2792 0 + -2789 -2790 2791 0 + 2790 -2791 0 + 2789 -2791 0 + 2791 2792 -2793 0 + -2791 2793 0 + -2792 2793 0 + 2737 2789 -2790 0 + 2737 -2789 2790 0 + -2737 2789 2790 0 + -2737 -2789 -2790 0 + 2674 2794 0 + -2674 2706 2794 0 + 2674 2706 -2794 0 + -2674 -2794 0 + -2674 2796 0 + 2706 -2796 0 + 2674 -2796 0 + -2793 -2794 2795 0 + 2794 -2795 0 + 2793 -2795 0 + 2795 2796 -2797 0 + -2795 2797 0 + -2796 2797 0 + 2738 2793 -2794 0 + 2738 -2793 2794 0 + -2738 2793 2794 0 + -2738 -2793 -2794 0 + 2675 2798 0 + -2675 2707 2798 0 + 2675 2707 -2798 0 + -2675 -2798 0 + -2675 2800 0 + 2707 -2800 0 + 2675 -2800 0 + -2797 -2798 2799 0 + 2798 -2799 0 + 2797 -2799 0 + 2799 2800 -2801 0 + -2799 2801 0 + -2800 2801 0 + 2739 2797 -2798 0 + 2739 -2797 2798 0 + -2739 2797 2798 0 + -2739 -2797 -2798 0 + 2676 2802 0 + -2676 2708 2802 0 + 2676 2708 -2802 0 + -2676 -2802 0 + -2676 2804 0 + 2708 -2804 0 + 2676 -2804 0 + -2801 -2802 2803 0 + 2802 -2803 0 + 2801 -2803 0 + 2803 2804 -2805 0 + -2803 2805 0 + -2804 2805 0 + 2740 2801 -2802 0 + 2740 -2801 2802 0 + -2740 2801 2802 0 + -2740 -2801 -2802 0 + 2677 2806 0 + -2677 2709 2806 0 + 2677 2709 -2806 0 + -2677 -2806 0 + -2677 2808 0 + 2709 -2808 0 + 2677 -2808 0 + -2805 -2806 2807 0 + 2806 -2807 0 + 2805 -2807 0 + 2807 2808 -2809 0 + -2807 2809 0 + -2808 2809 0 + 2741 2805 -2806 0 + 2741 -2805 2806 0 + -2741 2805 2806 0 + -2741 -2805 -2806 0 + 2678 2810 0 + -2678 2710 2810 0 + 2678 2710 -2810 0 + -2678 -2810 0 + -2678 2812 0 + 2710 -2812 0 + 2678 -2812 0 + -2809 -2810 2811 0 + 2810 -2811 0 + 2809 -2811 0 + 2811 2812 -2813 0 + -2811 2813 0 + -2812 2813 0 + 2742 2809 -2810 0 + 2742 -2809 2810 0 + -2742 2809 2810 0 + -2742 -2809 -2810 0 + 2679 2814 0 + -2679 2711 2814 0 + 2679 2711 -2814 0 + -2679 -2814 0 + -2679 2816 0 + 2711 -2816 0 + 2679 -2816 0 + -2813 -2814 2815 0 + 2814 -2815 0 + 2813 -2815 0 + 2815 2816 -2817 0 + -2815 2817 0 + -2816 2817 0 + 2743 2813 -2814 0 + 2743 -2813 2814 0 + -2743 2813 2814 0 + -2743 -2813 -2814 0 + 2680 2818 0 + -2680 2712 2818 0 + 2680 2712 -2818 0 + -2680 -2818 0 + -2680 2820 0 + 2712 -2820 0 + 2680 -2820 0 + -2817 -2818 2819 0 + 2818 -2819 0 + 2817 -2819 0 + 2819 2820 -2821 0 + -2819 2821 0 + -2820 2821 0 + 2744 2817 -2818 0 + 2744 -2817 2818 0 + -2744 2817 2818 0 + -2744 -2817 -2818 0 + 2681 2822 0 + -2681 2713 2822 0 + 2681 2713 -2822 0 + -2681 -2822 0 + -2681 2824 0 + 2713 -2824 0 + 2681 -2824 0 + -2821 -2822 2823 0 + 2822 -2823 0 + 2821 -2823 0 + 2823 2824 -2825 0 + -2823 2825 0 + -2824 2825 0 + 2745 2821 -2822 0 + 2745 -2821 2822 0 + -2745 2821 2822 0 + -2745 -2821 -2822 0 + 2682 2826 0 + -2682 2714 2826 0 + 2682 2714 -2826 0 + -2682 -2826 0 + -2682 2828 0 + 2714 -2828 0 + 2682 -2828 0 + -2825 -2826 2827 0 + 2826 -2827 0 + 2825 -2827 0 + 2827 2828 -2829 0 + -2827 2829 0 + -2828 2829 0 + 2746 2825 -2826 0 + 2746 -2825 2826 0 + -2746 2825 2826 0 + -2746 -2825 -2826 0 + 2683 2830 0 + -2683 2715 2830 0 + 2683 2715 -2830 0 + -2683 -2830 0 + -2683 2832 0 + 2715 -2832 0 + 2683 -2832 0 + -2829 -2830 2831 0 + 2830 -2831 0 + 2829 -2831 0 + 2831 2832 -2833 0 + -2831 2833 0 + -2832 2833 0 + 2747 2829 -2830 0 + 2747 -2829 2830 0 + -2747 2829 2830 0 + -2747 -2829 -2830 0 + 2684 2834 0 + -2684 2716 2834 0 + 2684 2716 -2834 0 + -2684 -2834 0 + -2684 2836 0 + 2716 -2836 0 + 2684 -2836 0 + -2833 -2834 2835 0 + 2834 -2835 0 + 2833 -2835 0 + 2835 2836 -2837 0 + -2835 2837 0 + -2836 2837 0 + 2748 2833 -2834 0 + 2748 -2833 2834 0 + -2748 2833 2834 0 + -2748 -2833 -2834 0 + 2685 2838 0 + -2685 2717 2838 0 + 2685 2717 -2838 0 + -2685 -2838 0 + -2685 2840 0 + 2717 -2840 0 + 2685 -2840 0 + -2837 -2838 2839 0 + 2838 -2839 0 + 2837 -2839 0 + 2839 2840 -2841 0 + -2839 2841 0 + -2840 2841 0 + 2749 2837 -2838 0 + 2749 -2837 2838 0 + -2749 2837 2838 0 + -2749 -2837 -2838 0 + 2686 2842 0 + -2686 2718 2842 0 + 2686 2718 -2842 0 + -2686 -2842 0 + -2686 2844 0 + 2718 -2844 0 + 2686 -2844 0 + -2841 -2842 2843 0 + 2842 -2843 0 + 2841 -2843 0 + 2843 2844 -2845 0 + -2843 2845 0 + -2844 2845 0 + 2750 2841 -2842 0 + 2750 -2841 2842 0 + -2750 2841 2842 0 + -2750 -2841 -2842 0 + 2687 2846 0 + -2687 2719 2846 0 + 2687 2719 -2846 0 + -2687 -2846 0 + -2687 2848 0 + 2719 -2848 0 + 2687 -2848 0 + -2845 -2846 2847 0 + 2846 -2847 0 + 2845 -2847 0 + 2847 2848 -2849 0 + -2847 2849 0 + -2848 2849 0 + 2751 2845 -2846 0 + 2751 -2845 2846 0 + -2751 2845 2846 0 + -2751 -2845 -2846 0 + 2688 2850 0 + -2688 2720 2850 0 + 2688 2720 -2850 0 + -2688 -2850 0 + -2688 2852 0 + 2720 -2852 0 + 2688 -2852 0 + -2849 -2850 2851 0 + 2850 -2851 0 + 2849 -2851 0 + 2851 2852 -2853 0 + -2851 2853 0 + -2852 2853 0 + 2752 2849 -2850 0 + 2752 -2849 2850 0 + -2752 2849 2850 0 + -2752 -2849 -2850 0 + 2689 2854 0 + -2689 2721 2854 0 + 2689 2721 -2854 0 + -2689 -2854 0 + -2689 2856 0 + 2721 -2856 0 + 2689 -2856 0 + -2853 -2854 2855 0 + 2854 -2855 0 + 2853 -2855 0 + 2855 2856 -2857 0 + -2855 2857 0 + -2856 2857 0 + 2753 2853 -2854 0 + 2753 -2853 2854 0 + -2753 2853 2854 0 + -2753 -2853 -2854 0 + 2690 2858 0 + -2690 2722 2858 0 + 2690 2722 -2858 0 + -2690 -2858 0 + -2690 2860 0 + 2722 -2860 0 + 2690 -2860 0 + -2857 -2858 2859 0 + 2858 -2859 0 + 2857 -2859 0 + 2859 2860 -2861 0 + -2859 2861 0 + -2860 2861 0 + 2754 2857 -2858 0 + 2754 -2857 2858 0 + -2754 2857 2858 0 + -2754 -2857 -2858 0 + 2691 2862 0 + -2691 2723 2862 0 + 2691 2723 -2862 0 + -2691 -2862 0 + -2691 2864 0 + 2723 -2864 0 + 2691 -2864 0 + -2861 -2862 2863 0 + 2862 -2863 0 + 2861 -2863 0 + 2863 2864 -2865 0 + -2863 2865 0 + -2864 2865 0 + 2755 2861 -2862 0 + 2755 -2861 2862 0 + -2755 2861 2862 0 + -2755 -2861 -2862 0 + 2692 2866 0 + -2692 2724 2866 0 + 2692 2724 -2866 0 + -2692 -2866 0 + -2692 2868 0 + 2724 -2868 0 + 2692 -2868 0 + -2865 -2866 2867 0 + 2866 -2867 0 + 2865 -2867 0 + 2867 2868 -2869 0 + -2867 2869 0 + -2868 2869 0 + 2756 2865 -2866 0 + 2756 -2865 2866 0 + -2756 2865 2866 0 + -2756 -2865 -2866 0 + 2693 2870 0 + -2693 2725 2870 0 + 2693 2725 -2870 0 + -2693 -2870 0 + -2693 2872 0 + 2725 -2872 0 + 2693 -2872 0 + -2869 -2870 2871 0 + 2870 -2871 0 + 2869 -2871 0 + 2871 2872 -2873 0 + -2871 2873 0 + -2872 2873 0 + 2757 2869 -2870 0 + 2757 -2869 2870 0 + -2757 2869 2870 0 + -2757 -2869 -2870 0 + 2694 2874 0 + -2694 2726 2874 0 + 2694 2726 -2874 0 + -2694 -2874 0 + -2694 2876 0 + 2726 -2876 0 + 2694 -2876 0 + -2873 -2874 2875 0 + 2874 -2875 0 + 2873 -2875 0 + 2875 2876 -2877 0 + -2875 2877 0 + -2876 2877 0 + 2758 2873 -2874 0 + 2758 -2873 2874 0 + -2758 2873 2874 0 + -2758 -2873 -2874 0 + 2695 2878 0 + -2695 2727 2878 0 + 2695 2727 -2878 0 + -2695 -2878 0 + -2695 2880 0 + 2727 -2880 0 + 2695 -2880 0 + -2877 -2878 2879 0 + 2878 -2879 0 + 2877 -2879 0 + 2879 2880 -2881 0 + -2879 2881 0 + -2880 2881 0 + 2759 2877 -2878 0 + 2759 -2877 2878 0 + -2759 2877 2878 0 + -2759 -2877 -2878 0 + 2696 2882 0 + -2696 2728 2882 0 + 2696 2728 -2882 0 + -2696 -2882 0 + -2696 2884 0 + 2728 -2884 0 + 2696 -2884 0 + -2881 -2882 2883 0 + 2882 -2883 0 + 2881 -2883 0 + 2883 2884 -2885 0 + -2883 2885 0 + -2884 2885 0 + 2760 2881 -2882 0 + 2760 -2881 2882 0 + -2760 2881 2882 0 + -2760 -2881 -2882 0 + 2697 2886 0 + -2697 2729 2886 0 + 2697 2729 -2886 0 + -2697 -2886 0 + -2697 2888 0 + 2729 -2888 0 + 2697 -2888 0 + -2885 -2886 2887 0 + 2886 -2887 0 + 2885 -2887 0 + 2887 2888 -2889 0 + -2887 2889 0 + -2888 2889 0 + 2761 2885 -2886 0 + 2761 -2885 2886 0 + -2761 2885 2886 0 + -2761 -2885 -2886 0 + 2730 -2890 0 + -2730 2890 0 + 2731 -2891 0 + -2731 2891 0 + 2732 -2892 0 + -2732 2892 0 + 2733 -2893 0 + -2733 2893 0 + 2734 -2894 0 + -2734 2894 0 + 2735 -2895 0 + -2735 2895 0 + 2736 -2896 0 + -2736 2896 0 + 2737 -2897 0 + -2737 2897 0 + 2738 -2898 0 + -2738 2898 0 + 2739 -2899 0 + -2739 2899 0 + 2740 -2900 0 + -2740 2900 0 + 2741 -2901 0 + -2741 2901 0 + 2742 -2902 0 + -2742 2902 0 + 2743 -2903 0 + -2743 2903 0 + 2744 -2904 0 + -2744 2904 0 + 2745 -2905 0 + -2745 2905 0 + 2746 -2906 0 + -2746 2906 0 + 2747 -2907 0 + -2747 2907 0 + 2748 -2908 0 + -2748 2908 0 + 2749 -2909 0 + -2749 2909 0 + 2750 -2910 0 + -2750 2910 0 + 2751 -2911 0 + -2751 2911 0 + 2752 -2912 0 + -2752 2912 0 + 2753 -2913 0 + -2753 2913 0 + 2754 -2914 0 + -2754 2914 0 + 2755 -2915 0 + -2755 2915 0 + 2756 -2916 0 + -2756 2916 0 + 2757 -2917 0 + -2757 2917 0 + 2758 -2918 0 + -2758 2918 0 + 2759 -2919 0 + -2759 2919 0 + 2760 -2920 0 + -2760 2920 0 + 2761 -2921 0 + -2761 2921 0 + 2890 2954 0 + 2698 -2890 2954 0 + 2698 2890 -2954 0 + -2890 -2954 0 + -2890 2956 0 + 2698 -2956 0 + 2890 -2956 0 + -2 -2954 2955 0 + 2954 -2955 0 + 2956 -2957 0 + -2955 2957 0 + -2956 2957 0 + 2922 -2954 0 + -2 2922 2954 0 + -2922 2954 0 + -2 -2922 -2954 0 + 2891 2958 0 + 2699 -2891 2958 0 + 2699 2891 -2958 0 + -2891 -2958 0 + -2891 2960 0 + 2699 -2960 0 + 2891 -2960 0 + -2957 -2958 2959 0 + 2958 -2959 0 + 2957 -2959 0 + 2959 2960 -2961 0 + -2959 2961 0 + -2960 2961 0 + 2923 2957 -2958 0 + 2923 -2957 2958 0 + -2923 2957 2958 0 + -2923 -2957 -2958 0 + 2892 2962 0 + 2700 -2892 2962 0 + 2700 2892 -2962 0 + -2892 -2962 0 + -2892 2964 0 + 2700 -2964 0 + 2892 -2964 0 + -2961 -2962 2963 0 + 2962 -2963 0 + 2961 -2963 0 + 2963 2964 -2965 0 + -2963 2965 0 + -2964 2965 0 + 2924 2961 -2962 0 + 2924 -2961 2962 0 + -2924 2961 2962 0 + -2924 -2961 -2962 0 + 2893 2966 0 + 2701 -2893 2966 0 + 2701 2893 -2966 0 + -2893 -2966 0 + -2893 2968 0 + 2701 -2968 0 + 2893 -2968 0 + -2965 -2966 2967 0 + 2966 -2967 0 + 2965 -2967 0 + 2967 2968 -2969 0 + -2967 2969 0 + -2968 2969 0 + 2925 2965 -2966 0 + 2925 -2965 2966 0 + -2925 2965 2966 0 + -2925 -2965 -2966 0 + 2894 2970 0 + 2702 -2894 2970 0 + 2702 2894 -2970 0 + -2894 -2970 0 + -2894 2972 0 + 2702 -2972 0 + 2894 -2972 0 + -2969 -2970 2971 0 + 2970 -2971 0 + 2969 -2971 0 + 2971 2972 -2973 0 + -2971 2973 0 + -2972 2973 0 + 2926 2969 -2970 0 + 2926 -2969 2970 0 + -2926 2969 2970 0 + -2926 -2969 -2970 0 + 2895 2974 0 + 2703 -2895 2974 0 + 2703 2895 -2974 0 + -2895 -2974 0 + -2895 2976 0 + 2703 -2976 0 + 2895 -2976 0 + -2973 -2974 2975 0 + 2974 -2975 0 + 2973 -2975 0 + 2975 2976 -2977 0 + -2975 2977 0 + -2976 2977 0 + 2927 2973 -2974 0 + 2927 -2973 2974 0 + -2927 2973 2974 0 + -2927 -2973 -2974 0 + 2896 2978 0 + 2704 -2896 2978 0 + 2704 2896 -2978 0 + -2896 -2978 0 + -2896 2980 0 + 2704 -2980 0 + 2896 -2980 0 + -2977 -2978 2979 0 + 2978 -2979 0 + 2977 -2979 0 + 2979 2980 -2981 0 + -2979 2981 0 + -2980 2981 0 + 2928 2977 -2978 0 + 2928 -2977 2978 0 + -2928 2977 2978 0 + -2928 -2977 -2978 0 + 2897 2982 0 + 2705 -2897 2982 0 + 2705 2897 -2982 0 + -2897 -2982 0 + -2897 2984 0 + 2705 -2984 0 + 2897 -2984 0 + -2981 -2982 2983 0 + 2982 -2983 0 + 2981 -2983 0 + 2983 2984 -2985 0 + -2983 2985 0 + -2984 2985 0 + 2929 2981 -2982 0 + 2929 -2981 2982 0 + -2929 2981 2982 0 + -2929 -2981 -2982 0 + 2898 2986 0 + 2706 -2898 2986 0 + 2706 2898 -2986 0 + -2898 -2986 0 + -2898 2988 0 + 2706 -2988 0 + 2898 -2988 0 + -2985 -2986 2987 0 + 2986 -2987 0 + 2985 -2987 0 + 2987 2988 -2989 0 + -2987 2989 0 + -2988 2989 0 + 2930 2985 -2986 0 + 2930 -2985 2986 0 + -2930 2985 2986 0 + -2930 -2985 -2986 0 + 2899 2990 0 + 2707 -2899 2990 0 + 2707 2899 -2990 0 + -2899 -2990 0 + -2899 2992 0 + 2707 -2992 0 + 2899 -2992 0 + -2989 -2990 2991 0 + 2990 -2991 0 + 2989 -2991 0 + 2991 2992 -2993 0 + -2991 2993 0 + -2992 2993 0 + 2931 2989 -2990 0 + 2931 -2989 2990 0 + -2931 2989 2990 0 + -2931 -2989 -2990 0 + 2900 2994 0 + 2708 -2900 2994 0 + 2708 2900 -2994 0 + -2900 -2994 0 + -2900 2996 0 + 2708 -2996 0 + 2900 -2996 0 + -2993 -2994 2995 0 + 2994 -2995 0 + 2993 -2995 0 + 2995 2996 -2997 0 + -2995 2997 0 + -2996 2997 0 + 2932 2993 -2994 0 + 2932 -2993 2994 0 + -2932 2993 2994 0 + -2932 -2993 -2994 0 + 2901 2998 0 + 2709 -2901 2998 0 + 2709 2901 -2998 0 + -2901 -2998 0 + -2901 3000 0 + 2709 -3000 0 + 2901 -3000 0 + -2997 -2998 2999 0 + 2998 -2999 0 + 2997 -2999 0 + 2999 3000 -3001 0 + -2999 3001 0 + -3000 3001 0 + 2933 2997 -2998 0 + 2933 -2997 2998 0 + -2933 2997 2998 0 + -2933 -2997 -2998 0 + 2902 3002 0 + 2710 -2902 3002 0 + 2710 2902 -3002 0 + -2902 -3002 0 + -2902 3004 0 + 2710 -3004 0 + 2902 -3004 0 + -3001 -3002 3003 0 + 3002 -3003 0 + 3001 -3003 0 + 3003 3004 -3005 0 + -3003 3005 0 + -3004 3005 0 + 2934 3001 -3002 0 + 2934 -3001 3002 0 + -2934 3001 3002 0 + -2934 -3001 -3002 0 + 2903 3006 0 + 2711 -2903 3006 0 + 2711 2903 -3006 0 + -2903 -3006 0 + -2903 3008 0 + 2711 -3008 0 + 2903 -3008 0 + -3005 -3006 3007 0 + 3006 -3007 0 + 3005 -3007 0 + 3007 3008 -3009 0 + -3007 3009 0 + -3008 3009 0 + 2935 3005 -3006 0 + 2935 -3005 3006 0 + -2935 3005 3006 0 + -2935 -3005 -3006 0 + 2904 3010 0 + 2712 -2904 3010 0 + 2712 2904 -3010 0 + -2904 -3010 0 + -2904 3012 0 + 2712 -3012 0 + 2904 -3012 0 + -3009 -3010 3011 0 + 3010 -3011 0 + 3009 -3011 0 + 3011 3012 -3013 0 + -3011 3013 0 + -3012 3013 0 + 2936 3009 -3010 0 + 2936 -3009 3010 0 + -2936 3009 3010 0 + -2936 -3009 -3010 0 + 2905 3014 0 + 2713 -2905 3014 0 + 2713 2905 -3014 0 + -2905 -3014 0 + -2905 3016 0 + 2713 -3016 0 + 2905 -3016 0 + -3013 -3014 3015 0 + 3014 -3015 0 + 3013 -3015 0 + 3015 3016 -3017 0 + -3015 3017 0 + -3016 3017 0 + 2937 3013 -3014 0 + 2937 -3013 3014 0 + -2937 3013 3014 0 + -2937 -3013 -3014 0 + 2906 3018 0 + 2714 -2906 3018 0 + 2714 2906 -3018 0 + -2906 -3018 0 + -2906 3020 0 + 2714 -3020 0 + 2906 -3020 0 + -3017 -3018 3019 0 + 3018 -3019 0 + 3017 -3019 0 + 3019 3020 -3021 0 + -3019 3021 0 + -3020 3021 0 + 2938 3017 -3018 0 + 2938 -3017 3018 0 + -2938 3017 3018 0 + -2938 -3017 -3018 0 + 2907 3022 0 + 2715 -2907 3022 0 + 2715 2907 -3022 0 + -2907 -3022 0 + -2907 3024 0 + 2715 -3024 0 + 2907 -3024 0 + -3021 -3022 3023 0 + 3022 -3023 0 + 3021 -3023 0 + 3023 3024 -3025 0 + -3023 3025 0 + -3024 3025 0 + 2939 3021 -3022 0 + 2939 -3021 3022 0 + -2939 3021 3022 0 + -2939 -3021 -3022 0 + 2908 3026 0 + 2716 -2908 3026 0 + 2716 2908 -3026 0 + -2908 -3026 0 + -2908 3028 0 + 2716 -3028 0 + 2908 -3028 0 + -3025 -3026 3027 0 + 3026 -3027 0 + 3025 -3027 0 + 3027 3028 -3029 0 + -3027 3029 0 + -3028 3029 0 + 2940 3025 -3026 0 + 2940 -3025 3026 0 + -2940 3025 3026 0 + -2940 -3025 -3026 0 + 2909 3030 0 + 2717 -2909 3030 0 + 2717 2909 -3030 0 + -2909 -3030 0 + -2909 3032 0 + 2717 -3032 0 + 2909 -3032 0 + -3029 -3030 3031 0 + 3030 -3031 0 + 3029 -3031 0 + 3031 3032 -3033 0 + -3031 3033 0 + -3032 3033 0 + 2941 3029 -3030 0 + 2941 -3029 3030 0 + -2941 3029 3030 0 + -2941 -3029 -3030 0 + 2910 3034 0 + 2718 -2910 3034 0 + 2718 2910 -3034 0 + -2910 -3034 0 + -2910 3036 0 + 2718 -3036 0 + 2910 -3036 0 + -3033 -3034 3035 0 + 3034 -3035 0 + 3033 -3035 0 + 3035 3036 -3037 0 + -3035 3037 0 + -3036 3037 0 + 2942 3033 -3034 0 + 2942 -3033 3034 0 + -2942 3033 3034 0 + -2942 -3033 -3034 0 + 2911 3038 0 + 2719 -2911 3038 0 + 2719 2911 -3038 0 + -2911 -3038 0 + -2911 3040 0 + 2719 -3040 0 + 2911 -3040 0 + -3037 -3038 3039 0 + 3038 -3039 0 + 3037 -3039 0 + 3039 3040 -3041 0 + -3039 3041 0 + -3040 3041 0 + 2943 3037 -3038 0 + 2943 -3037 3038 0 + -2943 3037 3038 0 + -2943 -3037 -3038 0 + 2912 3042 0 + 2720 -2912 3042 0 + 2720 2912 -3042 0 + -2912 -3042 0 + -2912 3044 0 + 2720 -3044 0 + 2912 -3044 0 + -3041 -3042 3043 0 + 3042 -3043 0 + 3041 -3043 0 + 3043 3044 -3045 0 + -3043 3045 0 + -3044 3045 0 + 2944 3041 -3042 0 + 2944 -3041 3042 0 + -2944 3041 3042 0 + -2944 -3041 -3042 0 + 2913 3046 0 + 2721 -2913 3046 0 + 2721 2913 -3046 0 + -2913 -3046 0 + -2913 3048 0 + 2721 -3048 0 + 2913 -3048 0 + -3045 -3046 3047 0 + 3046 -3047 0 + 3045 -3047 0 + 3047 3048 -3049 0 + -3047 3049 0 + -3048 3049 0 + 2945 3045 -3046 0 + 2945 -3045 3046 0 + -2945 3045 3046 0 + -2945 -3045 -3046 0 + 2914 3050 0 + 2722 -2914 3050 0 + 2722 2914 -3050 0 + -2914 -3050 0 + -2914 3052 0 + 2722 -3052 0 + 2914 -3052 0 + -3049 -3050 3051 0 + 3050 -3051 0 + 3049 -3051 0 + 3051 3052 -3053 0 + -3051 3053 0 + -3052 3053 0 + 2946 3049 -3050 0 + 2946 -3049 3050 0 + -2946 3049 3050 0 + -2946 -3049 -3050 0 + 2915 3054 0 + 2723 -2915 3054 0 + 2723 2915 -3054 0 + -2915 -3054 0 + -2915 3056 0 + 2723 -3056 0 + 2915 -3056 0 + -3053 -3054 3055 0 + 3054 -3055 0 + 3053 -3055 0 + 3055 3056 -3057 0 + -3055 3057 0 + -3056 3057 0 + 2947 3053 -3054 0 + 2947 -3053 3054 0 + -2947 3053 3054 0 + -2947 -3053 -3054 0 + 2916 3058 0 + 2724 -2916 3058 0 + 2724 2916 -3058 0 + -2916 -3058 0 + -2916 3060 0 + 2724 -3060 0 + 2916 -3060 0 + -3057 -3058 3059 0 + 3058 -3059 0 + 3057 -3059 0 + 3059 3060 -3061 0 + -3059 3061 0 + -3060 3061 0 + 2948 3057 -3058 0 + 2948 -3057 3058 0 + -2948 3057 3058 0 + -2948 -3057 -3058 0 + 2917 3062 0 + 2725 -2917 3062 0 + 2725 2917 -3062 0 + -2917 -3062 0 + -2917 3064 0 + 2725 -3064 0 + 2917 -3064 0 + -3061 -3062 3063 0 + 3062 -3063 0 + 3061 -3063 0 + 3063 3064 -3065 0 + -3063 3065 0 + -3064 3065 0 + 2949 3061 -3062 0 + 2949 -3061 3062 0 + -2949 3061 3062 0 + -2949 -3061 -3062 0 + 2918 3066 0 + 2726 -2918 3066 0 + 2726 2918 -3066 0 + -2918 -3066 0 + -2918 3068 0 + 2726 -3068 0 + 2918 -3068 0 + -3065 -3066 3067 0 + 3066 -3067 0 + 3065 -3067 0 + 3067 3068 -3069 0 + -3067 3069 0 + -3068 3069 0 + 2950 3065 -3066 0 + 2950 -3065 3066 0 + -2950 3065 3066 0 + -2950 -3065 -3066 0 + 2919 3070 0 + 2727 -2919 3070 0 + 2727 2919 -3070 0 + -2919 -3070 0 + -2919 3072 0 + 2727 -3072 0 + 2919 -3072 0 + -3069 -3070 3071 0 + 3070 -3071 0 + 3069 -3071 0 + 3071 3072 -3073 0 + -3071 3073 0 + -3072 3073 0 + 2951 3069 -3070 0 + 2951 -3069 3070 0 + -2951 3069 3070 0 + -2951 -3069 -3070 0 + 2920 3074 0 + 2728 -2920 3074 0 + 2728 2920 -3074 0 + -2920 -3074 0 + -2920 3076 0 + 2728 -3076 0 + 2920 -3076 0 + -3073 -3074 3075 0 + 3074 -3075 0 + 3073 -3075 0 + 3075 3076 -3077 0 + -3075 3077 0 + -3076 3077 0 + 2952 3073 -3074 0 + 2952 -3073 3074 0 + -2952 3073 3074 0 + -2952 -3073 -3074 0 + 2921 3078 0 + 2729 -2921 3078 0 + 2729 2921 -3078 0 + -2921 -3078 0 + -2921 3080 0 + 2729 -3080 0 + 2921 -3080 0 + -3077 -3078 3079 0 + 3078 -3079 0 + 3077 -3079 0 + 3079 3080 -3081 0 + -3079 3081 0 + -3080 3081 0 + 2953 3077 -3078 0 + 2953 -3077 3078 0 + -2953 3077 3078 0 + -2953 -3077 -3078 0 + 2922 -3082 0 + -2922 3082 0 + 2923 -3083 0 + -2923 3083 0 + 2924 -3084 0 + -2924 3084 0 + 2925 -3085 0 + -2925 3085 0 + 2926 -3086 0 + -2926 3086 0 + 2927 -3087 0 + -2927 3087 0 + 2928 -3088 0 + -2928 3088 0 + 2929 -3089 0 + -2929 3089 0 + 2930 -3090 0 + -2930 3090 0 + 2931 -3091 0 + -2931 3091 0 + 2932 -3092 0 + -2932 3092 0 + 2933 -3093 0 + -2933 3093 0 + 2934 -3094 0 + -2934 3094 0 + 2935 -3095 0 + -2935 3095 0 + 2936 -3096 0 + -2936 3096 0 + 2937 -3097 0 + -2937 3097 0 + 2938 -3098 0 + -2938 3098 0 + 2939 -3099 0 + -2939 3099 0 + 2940 -3100 0 + -2940 3100 0 + 2941 -3101 0 + -2941 3101 0 + 2942 -3102 0 + -2942 3102 0 + 2943 -3103 0 + -2943 3103 0 + 2944 -3104 0 + -2944 3104 0 + 2945 -3105 0 + -2945 3105 0 + 2946 -3106 0 + -2946 3106 0 + 2947 -3107 0 + -2947 3107 0 + 2948 -3108 0 + -2948 3108 0 + 2949 -3109 0 + -2949 3109 0 + 2950 -3110 0 + -2950 3110 0 + 2951 -3111 0 + -2951 3111 0 + 2952 -3112 0 + -2952 3112 0 + 2953 -3113 0 + -2953 3113 0 + -3082 3147 3179 0 + 3082 3179 0 + 3082 3147 -3179 0 + -3082 -3179 0 + -3082 3181 0 + 3082 -3181 0 + 3147 -3181 0 + -3179 3180 0 + 3179 -3180 0 + 1 -3180 0 + 3180 3181 -3182 0 + -3180 3182 0 + -3181 3182 0 + 1 3115 -3179 0 + 3115 3179 0 + 1 -3115 3179 0 + -3115 -3179 0 + -3083 3148 3183 0 + 3083 3183 0 + 3083 3148 -3183 0 + -3083 -3183 0 + -3083 3185 0 + 3083 -3185 0 + 3148 -3185 0 + -3182 -3183 3184 0 + 3183 -3184 0 + 3182 -3184 0 + 3184 3185 -3186 0 + -3184 3186 0 + -3185 3186 0 + 3116 3182 -3183 0 + 3116 -3182 3183 0 + -3116 3182 3183 0 + -3116 -3182 -3183 0 + -3084 3149 3187 0 + 3084 3187 0 + 3084 3149 -3187 0 + -3084 -3187 0 + -3084 3189 0 + 3084 -3189 0 + 3149 -3189 0 + -3186 -3187 3188 0 + 3187 -3188 0 + 3186 -3188 0 + 3188 3189 -3190 0 + -3188 3190 0 + -3189 3190 0 + 3117 3186 -3187 0 + 3117 -3186 3187 0 + -3117 3186 3187 0 + -3117 -3186 -3187 0 + -3085 3150 3191 0 + 3085 3191 0 + 3085 3150 -3191 0 + -3085 -3191 0 + -3085 3193 0 + 3085 -3193 0 + 3150 -3193 0 + -3190 -3191 3192 0 + 3191 -3192 0 + 3190 -3192 0 + 3192 3193 -3194 0 + -3192 3194 0 + -3193 3194 0 + 3118 3190 -3191 0 + 3118 -3190 3191 0 + -3118 3190 3191 0 + -3118 -3190 -3191 0 + -3086 3151 3195 0 + 3086 3195 0 + 3086 3151 -3195 0 + -3086 -3195 0 + -3086 3197 0 + 3086 -3197 0 + 3151 -3197 0 + -3194 -3195 3196 0 + 3195 -3196 0 + 3194 -3196 0 + 3196 3197 -3198 0 + -3196 3198 0 + -3197 3198 0 + 3119 3194 -3195 0 + 3119 -3194 3195 0 + -3119 3194 3195 0 + -3119 -3194 -3195 0 + -3087 3152 3199 0 + 3087 3199 0 + 3087 3152 -3199 0 + -3087 -3199 0 + -3087 3201 0 + 3087 -3201 0 + 3152 -3201 0 + -3198 -3199 3200 0 + 3199 -3200 0 + 3198 -3200 0 + 3200 3201 -3202 0 + -3200 3202 0 + -3201 3202 0 + 3120 3198 -3199 0 + 3120 -3198 3199 0 + -3120 3198 3199 0 + -3120 -3198 -3199 0 + -3088 3153 3203 0 + 3088 3203 0 + 3088 3153 -3203 0 + -3088 -3203 0 + -3088 3205 0 + 3088 -3205 0 + 3153 -3205 0 + -3202 -3203 3204 0 + 3203 -3204 0 + 3202 -3204 0 + 3204 3205 -3206 0 + -3204 3206 0 + -3205 3206 0 + 3121 3202 -3203 0 + 3121 -3202 3203 0 + -3121 3202 3203 0 + -3121 -3202 -3203 0 + -3089 3154 3207 0 + 3089 3207 0 + 3089 3154 -3207 0 + -3089 -3207 0 + -3089 3209 0 + 3089 -3209 0 + 3154 -3209 0 + -3206 -3207 3208 0 + 3207 -3208 0 + 3206 -3208 0 + 3208 3209 -3210 0 + -3208 3210 0 + -3209 3210 0 + 3122 3206 -3207 0 + 3122 -3206 3207 0 + -3122 3206 3207 0 + -3122 -3206 -3207 0 + -3090 3155 3211 0 + 3090 3211 0 + 3090 3155 -3211 0 + -3090 -3211 0 + -3090 3213 0 + 3090 -3213 0 + 3155 -3213 0 + -3210 -3211 3212 0 + 3211 -3212 0 + 3210 -3212 0 + 3212 3213 -3214 0 + -3212 3214 0 + -3213 3214 0 + 3123 3210 -3211 0 + 3123 -3210 3211 0 + -3123 3210 3211 0 + -3123 -3210 -3211 0 + -3091 3156 3215 0 + 3091 3215 0 + 3091 3156 -3215 0 + -3091 -3215 0 + -3091 3217 0 + 3091 -3217 0 + 3156 -3217 0 + -3214 -3215 3216 0 + 3215 -3216 0 + 3214 -3216 0 + 3216 3217 -3218 0 + -3216 3218 0 + -3217 3218 0 + 3124 3214 -3215 0 + 3124 -3214 3215 0 + -3124 3214 3215 0 + -3124 -3214 -3215 0 + -3092 3157 3219 0 + 3092 3219 0 + 3092 3157 -3219 0 + -3092 -3219 0 + -3092 3221 0 + 3092 -3221 0 + 3157 -3221 0 + -3218 -3219 3220 0 + 3219 -3220 0 + 3218 -3220 0 + 3220 3221 -3222 0 + -3220 3222 0 + -3221 3222 0 + 3125 3218 -3219 0 + 3125 -3218 3219 0 + -3125 3218 3219 0 + -3125 -3218 -3219 0 + -3093 3158 3223 0 + 3093 3223 0 + 3093 3158 -3223 0 + -3093 -3223 0 + -3093 3225 0 + 3093 -3225 0 + 3158 -3225 0 + -3222 -3223 3224 0 + 3223 -3224 0 + 3222 -3224 0 + 3224 3225 -3226 0 + -3224 3226 0 + -3225 3226 0 + 3126 3222 -3223 0 + 3126 -3222 3223 0 + -3126 3222 3223 0 + -3126 -3222 -3223 0 + -3094 3159 3227 0 + 3094 3227 0 + 3094 3159 -3227 0 + -3094 -3227 0 + -3094 3229 0 + 3094 -3229 0 + 3159 -3229 0 + -3226 -3227 3228 0 + 3227 -3228 0 + 3226 -3228 0 + 3228 3229 -3230 0 + -3228 3230 0 + -3229 3230 0 + 3127 3226 -3227 0 + 3127 -3226 3227 0 + -3127 3226 3227 0 + -3127 -3226 -3227 0 + -3095 3160 3231 0 + 3095 3231 0 + 3095 3160 -3231 0 + -3095 -3231 0 + -3095 3233 0 + 3095 -3233 0 + 3160 -3233 0 + -3230 -3231 3232 0 + 3231 -3232 0 + 3230 -3232 0 + 3232 3233 -3234 0 + -3232 3234 0 + -3233 3234 0 + 3128 3230 -3231 0 + 3128 -3230 3231 0 + -3128 3230 3231 0 + -3128 -3230 -3231 0 + -3096 3161 3235 0 + 3096 3235 0 + 3096 3161 -3235 0 + -3096 -3235 0 + -3096 3237 0 + 3096 -3237 0 + 3161 -3237 0 + -3234 -3235 3236 0 + 3235 -3236 0 + 3234 -3236 0 + 3236 3237 -3238 0 + -3236 3238 0 + -3237 3238 0 + 3129 3234 -3235 0 + 3129 -3234 3235 0 + -3129 3234 3235 0 + -3129 -3234 -3235 0 + -3097 3162 3239 0 + 3097 3239 0 + 3097 3162 -3239 0 + -3097 -3239 0 + -3097 3241 0 + 3097 -3241 0 + 3162 -3241 0 + -3238 -3239 3240 0 + 3239 -3240 0 + 3238 -3240 0 + 3240 3241 -3242 0 + -3240 3242 0 + -3241 3242 0 + 3130 3238 -3239 0 + 3130 -3238 3239 0 + -3130 3238 3239 0 + -3130 -3238 -3239 0 + -3098 3163 3243 0 + 3098 3243 0 + 3098 3163 -3243 0 + -3098 -3243 0 + -3098 3245 0 + 3098 -3245 0 + 3163 -3245 0 + -3242 -3243 3244 0 + 3243 -3244 0 + 3242 -3244 0 + 3244 3245 -3246 0 + -3244 3246 0 + -3245 3246 0 + 3131 3242 -3243 0 + 3131 -3242 3243 0 + -3131 3242 3243 0 + -3131 -3242 -3243 0 + -3099 3164 3247 0 + 3099 3247 0 + 3099 3164 -3247 0 + -3099 -3247 0 + -3099 3249 0 + 3099 -3249 0 + 3164 -3249 0 + -3246 -3247 3248 0 + 3247 -3248 0 + 3246 -3248 0 + 3248 3249 -3250 0 + -3248 3250 0 + -3249 3250 0 + 3132 3246 -3247 0 + 3132 -3246 3247 0 + -3132 3246 3247 0 + -3132 -3246 -3247 0 + -3100 3165 3251 0 + 3100 3251 0 + 3100 3165 -3251 0 + -3100 -3251 0 + -3100 3253 0 + 3100 -3253 0 + 3165 -3253 0 + -3250 -3251 3252 0 + 3251 -3252 0 + 3250 -3252 0 + 3252 3253 -3254 0 + -3252 3254 0 + -3253 3254 0 + 3133 3250 -3251 0 + 3133 -3250 3251 0 + -3133 3250 3251 0 + -3133 -3250 -3251 0 + -3101 3166 3255 0 + 3101 3255 0 + 3101 3166 -3255 0 + -3101 -3255 0 + -3101 3257 0 + 3101 -3257 0 + 3166 -3257 0 + -3254 -3255 3256 0 + 3255 -3256 0 + 3254 -3256 0 + 3256 3257 -3258 0 + -3256 3258 0 + -3257 3258 0 + 3134 3254 -3255 0 + 3134 -3254 3255 0 + -3134 3254 3255 0 + -3134 -3254 -3255 0 + -3102 3167 3259 0 + 3102 3259 0 + 3102 3167 -3259 0 + -3102 -3259 0 + -3102 3261 0 + 3102 -3261 0 + 3167 -3261 0 + -3258 -3259 3260 0 + 3259 -3260 0 + 3258 -3260 0 + 3260 3261 -3262 0 + -3260 3262 0 + -3261 3262 0 + 3135 3258 -3259 0 + 3135 -3258 3259 0 + -3135 3258 3259 0 + -3135 -3258 -3259 0 + -3103 3168 3263 0 + 3103 3263 0 + 3103 3168 -3263 0 + -3103 -3263 0 + -3103 3265 0 + 3103 -3265 0 + 3168 -3265 0 + -3262 -3263 3264 0 + 3263 -3264 0 + 3262 -3264 0 + 3264 3265 -3266 0 + -3264 3266 0 + -3265 3266 0 + 3136 3262 -3263 0 + 3136 -3262 3263 0 + -3136 3262 3263 0 + -3136 -3262 -3263 0 + -3104 3169 3267 0 + 3104 3267 0 + 3104 3169 -3267 0 + -3104 -3267 0 + -3104 3269 0 + 3104 -3269 0 + 3169 -3269 0 + -3266 -3267 3268 0 + 3267 -3268 0 + 3266 -3268 0 + 3268 3269 -3270 0 + -3268 3270 0 + -3269 3270 0 + 3137 3266 -3267 0 + 3137 -3266 3267 0 + -3137 3266 3267 0 + -3137 -3266 -3267 0 + -3105 3170 3271 0 + 3105 3271 0 + 3105 3170 -3271 0 + -3105 -3271 0 + -3105 3273 0 + 3105 -3273 0 + 3170 -3273 0 + -3270 -3271 3272 0 + 3271 -3272 0 + 3270 -3272 0 + 3272 3273 -3274 0 + -3272 3274 0 + -3273 3274 0 + 3138 3270 -3271 0 + 3138 -3270 3271 0 + -3138 3270 3271 0 + -3138 -3270 -3271 0 + -3106 3171 3275 0 + 3106 3275 0 + 3106 3171 -3275 0 + -3106 -3275 0 + -3106 3277 0 + 3106 -3277 0 + 3171 -3277 0 + -3274 -3275 3276 0 + 3275 -3276 0 + 3274 -3276 0 + 3276 3277 -3278 0 + -3276 3278 0 + -3277 3278 0 + 3139 3274 -3275 0 + 3139 -3274 3275 0 + -3139 3274 3275 0 + -3139 -3274 -3275 0 + -3107 3172 3279 0 + 3107 3279 0 + 3107 3172 -3279 0 + -3107 -3279 0 + -3107 3281 0 + 3107 -3281 0 + 3172 -3281 0 + -3278 -3279 3280 0 + 3279 -3280 0 + 3278 -3280 0 + 3280 3281 -3282 0 + -3280 3282 0 + -3281 3282 0 + 3140 3278 -3279 0 + 3140 -3278 3279 0 + -3140 3278 3279 0 + -3140 -3278 -3279 0 + -3108 3173 3283 0 + 3108 3283 0 + 3108 3173 -3283 0 + -3108 -3283 0 + -3108 3285 0 + 3108 -3285 0 + 3173 -3285 0 + -3282 -3283 3284 0 + 3283 -3284 0 + 3282 -3284 0 + 3284 3285 -3286 0 + -3284 3286 0 + -3285 3286 0 + 3141 3282 -3283 0 + 3141 -3282 3283 0 + -3141 3282 3283 0 + -3141 -3282 -3283 0 + -3109 3174 3287 0 + 3109 3287 0 + 3109 3174 -3287 0 + -3109 -3287 0 + -3109 3289 0 + 3109 -3289 0 + 3174 -3289 0 + -3286 -3287 3288 0 + 3287 -3288 0 + 3286 -3288 0 + 3288 3289 -3290 0 + -3288 3290 0 + -3289 3290 0 + 3142 3286 -3287 0 + 3142 -3286 3287 0 + -3142 3286 3287 0 + -3142 -3286 -3287 0 + -3110 3175 3291 0 + 3110 3291 0 + 3110 3175 -3291 0 + -3110 -3291 0 + -3110 3293 0 + 3110 -3293 0 + 3175 -3293 0 + -3290 -3291 3292 0 + 3291 -3292 0 + 3290 -3292 0 + 3292 3293 -3294 0 + -3292 3294 0 + -3293 3294 0 + 3143 3290 -3291 0 + 3143 -3290 3291 0 + -3143 3290 3291 0 + -3143 -3290 -3291 0 + -3111 3176 3295 0 + 3111 3295 0 + 3111 3176 -3295 0 + -3111 -3295 0 + -3111 3297 0 + 3111 -3297 0 + 3176 -3297 0 + -3294 -3295 3296 0 + 3295 -3296 0 + 3294 -3296 0 + 3296 3297 -3298 0 + -3296 3298 0 + -3297 3298 0 + 3144 3294 -3295 0 + 3144 -3294 3295 0 + -3144 3294 3295 0 + -3144 -3294 -3295 0 + -3112 3177 3299 0 + 3112 3299 0 + 3112 3177 -3299 0 + -3112 -3299 0 + -3112 3301 0 + 3112 -3301 0 + 3177 -3301 0 + -3298 -3299 3300 0 + 3299 -3300 0 + 3298 -3300 0 + 3300 3301 -3302 0 + -3300 3302 0 + -3301 3302 0 + 3145 3298 -3299 0 + 3145 -3298 3299 0 + -3145 3298 3299 0 + -3145 -3298 -3299 0 + -3113 3178 3303 0 + 3113 3303 0 + 3113 3178 -3303 0 + -3113 -3303 0 + -3113 3305 0 + 3113 -3305 0 + 3178 -3305 0 + -3302 -3303 3304 0 + 3303 -3304 0 + 3302 -3304 0 + 3304 3305 -3306 0 + -3304 3306 0 + -3305 3306 0 + 3146 3302 -3303 0 + 3146 -3302 3303 0 + -3146 3302 3303 0 + -3146 -3302 -3303 0 + 3302 -3306 3307 0 + -3302 3306 3307 0 + 3302 3306 -3307 0 + -3302 -3306 -3307 0 + 3114 3146 -3307 0 + 3114 -3146 3307 0 + -3114 3146 3307 0 + -3114 -3146 -3307 0 + 519 -3348 0 + -519 3348 0 + 520 -3349 0 + -520 3349 0 + 521 -3350 0 + -521 3350 0 + 522 -3351 0 + -522 3351 0 + 523 -3352 0 + -523 3352 0 + 524 -3353 0 + -524 3353 0 + 525 -3354 0 + -525 3354 0 + 526 -3355 0 + -526 3355 0 + 3349 -3364 0 + -3349 3364 0 + 3350 -3365 0 + -3350 3365 0 + 3351 -3366 0 + -3351 3366 0 + 3352 -3367 0 + -3352 3367 0 + 3353 -3368 0 + -3353 3368 0 + 3354 -3369 0 + -3354 3369 0 + 3355 -3370 0 + -3355 3370 0 + 3364 -3372 0 + -3364 3372 0 + 3365 -3373 0 + -3365 3373 0 + 3366 -3374 0 + -3366 3374 0 + 3367 -3375 0 + -3367 3375 0 + 3368 -3376 0 + -3368 3376 0 + 3369 -3377 0 + -3369 3377 0 + 3370 -3378 0 + -3370 3378 0 + 3308 3372 3405 0 + -3308 -3372 3405 0 + 3308 -3372 -3405 0 + -3308 3372 -3405 0 + 3309 3373 3406 0 + -3309 -3373 3406 0 + 3309 -3373 -3406 0 + -3309 3373 -3406 0 + 3310 3374 3407 0 + -3310 -3374 3407 0 + 3310 -3374 -3407 0 + -3310 3374 -3407 0 + 3311 3375 3408 0 + -3311 -3375 3408 0 + 3311 -3375 -3408 0 + -3311 3375 -3408 0 + 3312 3376 3409 0 + -3312 -3376 3409 0 + 3312 -3376 -3409 0 + -3312 3376 -3409 0 + 3313 3377 3410 0 + -3313 -3377 3410 0 + 3313 -3377 -3410 0 + -3313 3377 -3410 0 + 3314 3378 3411 0 + -3314 -3378 3411 0 + 3314 -3378 -3411 0 + -3314 3378 -3411 0 + 3315 3412 0 + -3315 -3379 3412 0 + 3315 -3379 -3412 0 + -3315 -3412 0 + 3316 3413 0 + -3316 -3380 3413 0 + 3316 -3380 -3413 0 + -3316 -3413 0 + 3317 3414 0 + -3317 -3381 3414 0 + 3317 -3381 -3414 0 + -3317 -3414 0 + 3318 3415 0 + -3318 -3382 3415 0 + 3318 -3382 -3415 0 + -3318 -3415 0 + 3319 3416 0 + -3319 -3383 3416 0 + 3319 -3383 -3416 0 + -3319 -3416 0 + 3320 3417 0 + -3320 -3384 3417 0 + 3320 -3384 -3417 0 + -3320 -3417 0 + 3321 3418 0 + -3321 -3385 3418 0 + 3321 -3385 -3418 0 + -3321 -3418 0 + 3322 3419 0 + -3322 -3386 3419 0 + 3322 -3386 -3419 0 + -3322 -3419 0 + 3323 3420 0 + -3323 -3387 3420 0 + 3323 -3387 -3420 0 + -3323 -3420 0 + 3324 3421 0 + -3324 -3388 3421 0 + 3324 -3388 -3421 0 + -3324 -3421 0 + 3325 3422 0 + -3325 -3389 3422 0 + 3325 -3389 -3422 0 + -3325 -3422 0 + 3326 3423 0 + -3326 -3390 3423 0 + 3326 -3390 -3423 0 + -3326 -3423 0 + 3327 3424 0 + -3327 -3391 3424 0 + 3327 -3391 -3424 0 + -3327 -3424 0 + 3328 3425 0 + -3328 -3392 3425 0 + 3328 -3392 -3425 0 + -3328 -3425 0 + 3329 3426 0 + -3329 -3393 3426 0 + 3329 -3393 -3426 0 + -3329 -3426 0 + 3330 3427 0 + -3330 -3394 3427 0 + 3330 -3394 -3427 0 + -3330 -3427 0 + 3331 3428 0 + -3331 -3395 3428 0 + 3331 -3395 -3428 0 + -3331 -3428 0 + 3332 3429 0 + -3332 -3396 3429 0 + 3332 -3396 -3429 0 + -3332 -3429 0 + 3333 3430 0 + -3333 -3397 3430 0 + 3333 -3397 -3430 0 + -3333 -3430 0 + 3334 3431 0 + -3334 -3398 3431 0 + 3334 -3398 -3431 0 + -3334 -3431 0 + 3335 3432 0 + -3335 -3399 3432 0 + 3335 -3399 -3432 0 + -3335 -3432 0 + 3336 3433 0 + -3336 -3400 3433 0 + 3336 -3400 -3433 0 + -3336 -3433 0 + 3337 3434 0 + -3337 -3401 3434 0 + 3337 -3401 -3434 0 + -3337 -3434 0 + 3338 3435 0 + -3338 -3402 3435 0 + 3338 -3402 -3435 0 + -3338 -3435 0 + 3339 3436 0 + -3339 -3403 3436 0 + 3339 -3403 -3436 0 + -3339 -3436 0 + -3405 3437 0 + 1 -3437 0 + 3405 -3437 0 + -3406 -3437 3438 0 + 3437 -3438 0 + 3406 -3438 0 + -3407 -3438 3439 0 + 3438 -3439 0 + 3407 -3439 0 + -3408 -3439 3440 0 + 3439 -3440 0 + 3408 -3440 0 + -3409 -3440 3441 0 + 3440 -3441 0 + 3409 -3441 0 + -3410 -3441 3442 0 + 3441 -3442 0 + 3410 -3442 0 + -3411 -3442 3443 0 + 3442 -3443 0 + 3411 -3443 0 + -3412 -3443 3444 0 + 3443 -3444 0 + 3412 -3444 0 + -3413 -3444 3445 0 + 3444 -3445 0 + 3413 -3445 0 + -3414 -3445 3446 0 + 3445 -3446 0 + 3414 -3446 0 + -3415 -3446 3447 0 + 3446 -3447 0 + 3415 -3447 0 + -3416 -3447 3448 0 + 3447 -3448 0 + 3416 -3448 0 + -3417 -3448 3449 0 + 3448 -3449 0 + 3417 -3449 0 + -3418 -3449 3450 0 + 3449 -3450 0 + 3418 -3450 0 + -3419 -3450 3451 0 + 3450 -3451 0 + 3419 -3451 0 + -3420 -3451 3452 0 + 3451 -3452 0 + 3420 -3452 0 + -3421 -3452 3453 0 + 3452 -3453 0 + 3421 -3453 0 + -3422 -3453 3454 0 + 3453 -3454 0 + 3422 -3454 0 + -3423 -3454 3455 0 + 3454 -3455 0 + 3423 -3455 0 + -3424 -3455 3456 0 + 3455 -3456 0 + 3424 -3456 0 + -3425 -3456 3457 0 + 3456 -3457 0 + 3425 -3457 0 + -3426 -3457 3458 0 + 3457 -3458 0 + 3426 -3458 0 + -3427 -3458 3459 0 + 3458 -3459 0 + 3427 -3459 0 + -3428 -3459 3460 0 + 3459 -3460 0 + 3428 -3460 0 + -3429 -3460 3461 0 + 3460 -3461 0 + 3429 -3461 0 + -3430 -3461 3462 0 + 3461 -3462 0 + 3430 -3462 0 + -3431 -3462 3463 0 + 3462 -3463 0 + 3431 -3463 0 + -3432 -3463 3464 0 + 3463 -3464 0 + 3432 -3464 0 + -3433 -3464 3465 0 + 3464 -3465 0 + 3433 -3465 0 + -3434 -3465 3466 0 + 3465 -3466 0 + 3434 -3466 0 + -3435 -3466 3467 0 + 3466 -3467 0 + 3435 -3467 0 + -3436 -3467 3468 0 + 3467 -3468 0 + 3436 -3468 0 + -3404 3468 0 + 3404 -3468 0 + 551 3469 3502 0 + -551 -3469 3502 0 + 551 -3469 -3502 0 + -551 3469 -3502 0 + 552 3470 3503 0 + -552 -3470 3503 0 + 552 -3470 -3503 0 + -552 3470 -3503 0 + 553 3471 3504 0 + -553 -3471 3504 0 + 553 -3471 -3504 0 + -553 3471 -3504 0 + 554 3472 3505 0 + -554 -3472 3505 0 + 554 -3472 -3505 0 + -554 3472 -3505 0 + 555 3473 3506 0 + -555 -3473 3506 0 + 555 -3473 -3506 0 + -555 3473 -3506 0 + 556 3474 3507 0 + -556 -3474 3507 0 + 556 -3474 -3507 0 + -556 3474 -3507 0 + 557 3475 3508 0 + -557 -3475 3508 0 + 557 -3475 -3508 0 + -557 3475 -3508 0 + 558 3476 3509 0 + -558 -3476 3509 0 + 558 -3476 -3509 0 + -558 3476 -3509 0 + 559 3477 3510 0 + -559 -3477 3510 0 + 559 -3477 -3510 0 + -559 3477 -3510 0 + 560 3478 3511 0 + -560 -3478 3511 0 + 560 -3478 -3511 0 + -560 3478 -3511 0 + 561 3479 3512 0 + -561 -3479 3512 0 + 561 -3479 -3512 0 + -561 3479 -3512 0 + 562 3480 3513 0 + -562 -3480 3513 0 + 562 -3480 -3513 0 + -562 3480 -3513 0 + 563 3481 3514 0 + -563 -3481 3514 0 + 563 -3481 -3514 0 + -563 3481 -3514 0 + 564 3482 3515 0 + -564 -3482 3515 0 + 564 -3482 -3515 0 + -564 3482 -3515 0 + 565 3483 3516 0 + -565 -3483 3516 0 + 565 -3483 -3516 0 + -565 3483 -3516 0 + 566 3484 3517 0 + -566 -3484 3517 0 + 566 -3484 -3517 0 + -566 3484 -3517 0 + 567 3485 3518 0 + -567 -3485 3518 0 + 567 -3485 -3518 0 + -567 3485 -3518 0 + 568 3486 3519 0 + -568 -3486 3519 0 + 568 -3486 -3519 0 + -568 3486 -3519 0 + 569 3487 3520 0 + -569 -3487 3520 0 + 569 -3487 -3520 0 + -569 3487 -3520 0 + 570 3488 3521 0 + -570 -3488 3521 0 + 570 -3488 -3521 0 + -570 3488 -3521 0 + 571 3489 3522 0 + -571 -3489 3522 0 + 571 -3489 -3522 0 + -571 3489 -3522 0 + 572 3490 3523 0 + -572 -3490 3523 0 + 572 -3490 -3523 0 + -572 3490 -3523 0 + 573 3491 3524 0 + -573 -3491 3524 0 + 573 -3491 -3524 0 + -573 3491 -3524 0 + 574 3492 3525 0 + -574 -3492 3525 0 + 574 -3492 -3525 0 + -574 3492 -3525 0 + 575 3493 3526 0 + -575 -3493 3526 0 + 575 -3493 -3526 0 + -575 3493 -3526 0 + 576 3494 3527 0 + -576 -3494 3527 0 + 576 -3494 -3527 0 + -576 3494 -3527 0 + 577 3495 3528 0 + -577 -3495 3528 0 + 577 -3495 -3528 0 + -577 3495 -3528 0 + 578 3496 3529 0 + -578 -3496 3529 0 + 578 -3496 -3529 0 + -578 3496 -3529 0 + 579 3497 3530 0 + -579 -3497 3530 0 + 579 -3497 -3530 0 + -579 3497 -3530 0 + 580 3498 3531 0 + -580 -3498 3531 0 + 580 -3498 -3531 0 + -580 3498 -3531 0 + 581 3499 3532 0 + -581 -3499 3532 0 + 581 -3499 -3532 0 + -581 3499 -3532 0 + 582 3500 3533 0 + -582 -3500 3533 0 + 582 -3500 -3533 0 + -582 3500 -3533 0 + -3502 3534 0 + 1 -3534 0 + 3502 -3534 0 + -3503 -3534 3535 0 + 3534 -3535 0 + 3503 -3535 0 + -3504 -3535 3536 0 + 3535 -3536 0 + 3504 -3536 0 + -3505 -3536 3537 0 + 3536 -3537 0 + 3505 -3537 0 + -3506 -3537 3538 0 + 3537 -3538 0 + 3506 -3538 0 + -3507 -3538 3539 0 + 3538 -3539 0 + 3507 -3539 0 + -3508 -3539 3540 0 + 3539 -3540 0 + 3508 -3540 0 + -3509 -3540 3541 0 + 3540 -3541 0 + 3509 -3541 0 + -3510 -3541 3542 0 + 3541 -3542 0 + 3510 -3542 0 + -3511 -3542 3543 0 + 3542 -3543 0 + 3511 -3543 0 + -3512 -3543 3544 0 + 3543 -3544 0 + 3512 -3544 0 + -3513 -3544 3545 0 + 3544 -3545 0 + 3513 -3545 0 + -3514 -3545 3546 0 + 3545 -3546 0 + 3514 -3546 0 + -3515 -3546 3547 0 + 3546 -3547 0 + 3515 -3547 0 + -3516 -3547 3548 0 + 3547 -3548 0 + 3516 -3548 0 + -3517 -3548 3549 0 + 3548 -3549 0 + 3517 -3549 0 + -3518 -3549 3550 0 + 3549 -3550 0 + 3518 -3550 0 + -3519 -3550 3551 0 + 3550 -3551 0 + 3519 -3551 0 + -3520 -3551 3552 0 + 3551 -3552 0 + 3520 -3552 0 + -3521 -3552 3553 0 + 3552 -3553 0 + 3521 -3553 0 + -3522 -3553 3554 0 + 3553 -3554 0 + 3522 -3554 0 + -3523 -3554 3555 0 + 3554 -3555 0 + 3523 -3555 0 + -3524 -3555 3556 0 + 3555 -3556 0 + 3524 -3556 0 + -3525 -3556 3557 0 + 3556 -3557 0 + 3525 -3557 0 + -3526 -3557 3558 0 + 3557 -3558 0 + 3526 -3558 0 + -3527 -3558 3559 0 + 3558 -3559 0 + 3527 -3559 0 + -3528 -3559 3560 0 + 3559 -3560 0 + 3528 -3560 0 + -3529 -3560 3561 0 + 3560 -3561 0 + 3529 -3561 0 + -3530 -3561 3562 0 + 3561 -3562 0 + 3530 -3562 0 + -3531 -3562 3563 0 + 3562 -3563 0 + 3531 -3563 0 + -3532 -3563 3564 0 + 3563 -3564 0 + 3532 -3564 0 + -3533 -3564 3565 0 + 3564 -3565 0 + 3533 -3565 0 + -3501 3565 0 + 3501 -3565 0 + 3404 3501 3566 0 + -3404 -3501 3566 0 + 3404 -3501 -3566 0 + -3404 3501 -3566 0 + -2922 3600 3632 0 + 2922 3632 0 + 2922 3600 -3632 0 + -2922 -3632 0 + -2922 3634 0 + 2922 -3634 0 + 3600 -3634 0 + -3632 3633 0 + 3632 -3633 0 + 1 -3633 0 + 3633 3634 -3635 0 + -3633 3635 0 + -3634 3635 0 + 1 3568 -3632 0 + 3568 3632 0 + 1 -3568 3632 0 + -3568 -3632 0 + -2923 3601 3636 0 + 2923 3636 0 + 2923 3601 -3636 0 + -2923 -3636 0 + -2923 3638 0 + 2923 -3638 0 + 3601 -3638 0 + -3635 -3636 3637 0 + 3636 -3637 0 + 3635 -3637 0 + 3637 3638 -3639 0 + -3637 3639 0 + -3638 3639 0 + 3569 3635 -3636 0 + 3569 -3635 3636 0 + -3569 3635 3636 0 + -3569 -3635 -3636 0 + -2924 3602 3640 0 + 2924 3640 0 + 2924 3602 -3640 0 + -2924 -3640 0 + -2924 3642 0 + 2924 -3642 0 + 3602 -3642 0 + -3639 -3640 3641 0 + 3640 -3641 0 + 3639 -3641 0 + 3641 3642 -3643 0 + -3641 3643 0 + -3642 3643 0 + 3570 3639 -3640 0 + 3570 -3639 3640 0 + -3570 3639 3640 0 + -3570 -3639 -3640 0 + -2925 3603 3644 0 + 2925 3644 0 + 2925 3603 -3644 0 + -2925 -3644 0 + -2925 3646 0 + 2925 -3646 0 + 3603 -3646 0 + -3643 -3644 3645 0 + 3644 -3645 0 + 3643 -3645 0 + 3645 3646 -3647 0 + -3645 3647 0 + -3646 3647 0 + 3571 3643 -3644 0 + 3571 -3643 3644 0 + -3571 3643 3644 0 + -3571 -3643 -3644 0 + -2926 3604 3648 0 + 2926 3648 0 + 2926 3604 -3648 0 + -2926 -3648 0 + -2926 3650 0 + 2926 -3650 0 + 3604 -3650 0 + -3647 -3648 3649 0 + 3648 -3649 0 + 3647 -3649 0 + 3649 3650 -3651 0 + -3649 3651 0 + -3650 3651 0 + 3572 3647 -3648 0 + 3572 -3647 3648 0 + -3572 3647 3648 0 + -3572 -3647 -3648 0 + -2927 3605 3652 0 + 2927 3652 0 + 2927 3605 -3652 0 + -2927 -3652 0 + -2927 3654 0 + 2927 -3654 0 + 3605 -3654 0 + -3651 -3652 3653 0 + 3652 -3653 0 + 3651 -3653 0 + 3653 3654 -3655 0 + -3653 3655 0 + -3654 3655 0 + 3573 3651 -3652 0 + 3573 -3651 3652 0 + -3573 3651 3652 0 + -3573 -3651 -3652 0 + -2928 3606 3656 0 + 2928 3656 0 + 2928 3606 -3656 0 + -2928 -3656 0 + -2928 3658 0 + 2928 -3658 0 + 3606 -3658 0 + -3655 -3656 3657 0 + 3656 -3657 0 + 3655 -3657 0 + 3657 3658 -3659 0 + -3657 3659 0 + -3658 3659 0 + 3574 3655 -3656 0 + 3574 -3655 3656 0 + -3574 3655 3656 0 + -3574 -3655 -3656 0 + -2929 3607 3660 0 + 2929 3660 0 + 2929 3607 -3660 0 + -2929 -3660 0 + -2929 3662 0 + 2929 -3662 0 + 3607 -3662 0 + -3659 -3660 3661 0 + 3660 -3661 0 + 3659 -3661 0 + 3661 3662 -3663 0 + -3661 3663 0 + -3662 3663 0 + 3575 3659 -3660 0 + 3575 -3659 3660 0 + -3575 3659 3660 0 + -3575 -3659 -3660 0 + -2930 3608 3664 0 + 2930 3664 0 + 2930 3608 -3664 0 + -2930 -3664 0 + -2930 3666 0 + 2930 -3666 0 + 3608 -3666 0 + -3663 -3664 3665 0 + 3664 -3665 0 + 3663 -3665 0 + 3665 3666 -3667 0 + -3665 3667 0 + -3666 3667 0 + 3576 3663 -3664 0 + 3576 -3663 3664 0 + -3576 3663 3664 0 + -3576 -3663 -3664 0 + -2931 3609 3668 0 + 2931 3668 0 + 2931 3609 -3668 0 + -2931 -3668 0 + -2931 3670 0 + 2931 -3670 0 + 3609 -3670 0 + -3667 -3668 3669 0 + 3668 -3669 0 + 3667 -3669 0 + 3669 3670 -3671 0 + -3669 3671 0 + -3670 3671 0 + 3577 3667 -3668 0 + 3577 -3667 3668 0 + -3577 3667 3668 0 + -3577 -3667 -3668 0 + -2932 3610 3672 0 + 2932 3672 0 + 2932 3610 -3672 0 + -2932 -3672 0 + -2932 3674 0 + 2932 -3674 0 + 3610 -3674 0 + -3671 -3672 3673 0 + 3672 -3673 0 + 3671 -3673 0 + 3673 3674 -3675 0 + -3673 3675 0 + -3674 3675 0 + 3578 3671 -3672 0 + 3578 -3671 3672 0 + -3578 3671 3672 0 + -3578 -3671 -3672 0 + -2933 3611 3676 0 + 2933 3676 0 + 2933 3611 -3676 0 + -2933 -3676 0 + -2933 3678 0 + 2933 -3678 0 + 3611 -3678 0 + -3675 -3676 3677 0 + 3676 -3677 0 + 3675 -3677 0 + 3677 3678 -3679 0 + -3677 3679 0 + -3678 3679 0 + 3579 3675 -3676 0 + 3579 -3675 3676 0 + -3579 3675 3676 0 + -3579 -3675 -3676 0 + -2934 3612 3680 0 + 2934 3680 0 + 2934 3612 -3680 0 + -2934 -3680 0 + -2934 3682 0 + 2934 -3682 0 + 3612 -3682 0 + -3679 -3680 3681 0 + 3680 -3681 0 + 3679 -3681 0 + 3681 3682 -3683 0 + -3681 3683 0 + -3682 3683 0 + 3580 3679 -3680 0 + 3580 -3679 3680 0 + -3580 3679 3680 0 + -3580 -3679 -3680 0 + -2935 3613 3684 0 + 2935 3684 0 + 2935 3613 -3684 0 + -2935 -3684 0 + -2935 3686 0 + 2935 -3686 0 + 3613 -3686 0 + -3683 -3684 3685 0 + 3684 -3685 0 + 3683 -3685 0 + 3685 3686 -3687 0 + -3685 3687 0 + -3686 3687 0 + 3581 3683 -3684 0 + 3581 -3683 3684 0 + -3581 3683 3684 0 + -3581 -3683 -3684 0 + -2936 3614 3688 0 + 2936 3688 0 + 2936 3614 -3688 0 + -2936 -3688 0 + -2936 3690 0 + 2936 -3690 0 + 3614 -3690 0 + -3687 -3688 3689 0 + 3688 -3689 0 + 3687 -3689 0 + 3689 3690 -3691 0 + -3689 3691 0 + -3690 3691 0 + 3582 3687 -3688 0 + 3582 -3687 3688 0 + -3582 3687 3688 0 + -3582 -3687 -3688 0 + -2937 3615 3692 0 + 2937 3692 0 + 2937 3615 -3692 0 + -2937 -3692 0 + -2937 3694 0 + 2937 -3694 0 + 3615 -3694 0 + -3691 -3692 3693 0 + 3692 -3693 0 + 3691 -3693 0 + 3693 3694 -3695 0 + -3693 3695 0 + -3694 3695 0 + 3583 3691 -3692 0 + 3583 -3691 3692 0 + -3583 3691 3692 0 + -3583 -3691 -3692 0 + -2938 3616 3696 0 + 2938 3696 0 + 2938 3616 -3696 0 + -2938 -3696 0 + -2938 3698 0 + 2938 -3698 0 + 3616 -3698 0 + -3695 -3696 3697 0 + 3696 -3697 0 + 3695 -3697 0 + 3697 3698 -3699 0 + -3697 3699 0 + -3698 3699 0 + 3584 3695 -3696 0 + 3584 -3695 3696 0 + -3584 3695 3696 0 + -3584 -3695 -3696 0 + -2939 3617 3700 0 + 2939 3700 0 + 2939 3617 -3700 0 + -2939 -3700 0 + -2939 3702 0 + 2939 -3702 0 + 3617 -3702 0 + -3699 -3700 3701 0 + 3700 -3701 0 + 3699 -3701 0 + 3701 3702 -3703 0 + -3701 3703 0 + -3702 3703 0 + 3585 3699 -3700 0 + 3585 -3699 3700 0 + -3585 3699 3700 0 + -3585 -3699 -3700 0 + -2940 3618 3704 0 + 2940 3704 0 + 2940 3618 -3704 0 + -2940 -3704 0 + -2940 3706 0 + 2940 -3706 0 + 3618 -3706 0 + -3703 -3704 3705 0 + 3704 -3705 0 + 3703 -3705 0 + 3705 3706 -3707 0 + -3705 3707 0 + -3706 3707 0 + 3586 3703 -3704 0 + 3586 -3703 3704 0 + -3586 3703 3704 0 + -3586 -3703 -3704 0 + -2941 3619 3708 0 + 2941 3708 0 + 2941 3619 -3708 0 + -2941 -3708 0 + -2941 3710 0 + 2941 -3710 0 + 3619 -3710 0 + -3707 -3708 3709 0 + 3708 -3709 0 + 3707 -3709 0 + 3709 3710 -3711 0 + -3709 3711 0 + -3710 3711 0 + 3587 3707 -3708 0 + 3587 -3707 3708 0 + -3587 3707 3708 0 + -3587 -3707 -3708 0 + -2942 3620 3712 0 + 2942 3712 0 + 2942 3620 -3712 0 + -2942 -3712 0 + -2942 3714 0 + 2942 -3714 0 + 3620 -3714 0 + -3711 -3712 3713 0 + 3712 -3713 0 + 3711 -3713 0 + 3713 3714 -3715 0 + -3713 3715 0 + -3714 3715 0 + 3588 3711 -3712 0 + 3588 -3711 3712 0 + -3588 3711 3712 0 + -3588 -3711 -3712 0 + -2943 3621 3716 0 + 2943 3716 0 + 2943 3621 -3716 0 + -2943 -3716 0 + -2943 3718 0 + 2943 -3718 0 + 3621 -3718 0 + -3715 -3716 3717 0 + 3716 -3717 0 + 3715 -3717 0 + 3717 3718 -3719 0 + -3717 3719 0 + -3718 3719 0 + 3589 3715 -3716 0 + 3589 -3715 3716 0 + -3589 3715 3716 0 + -3589 -3715 -3716 0 + -2944 3622 3720 0 + 2944 3720 0 + 2944 3622 -3720 0 + -2944 -3720 0 + -2944 3722 0 + 2944 -3722 0 + 3622 -3722 0 + -3719 -3720 3721 0 + 3720 -3721 0 + 3719 -3721 0 + 3721 3722 -3723 0 + -3721 3723 0 + -3722 3723 0 + 3590 3719 -3720 0 + 3590 -3719 3720 0 + -3590 3719 3720 0 + -3590 -3719 -3720 0 + -2945 3623 3724 0 + 2945 3724 0 + 2945 3623 -3724 0 + -2945 -3724 0 + -2945 3726 0 + 2945 -3726 0 + 3623 -3726 0 + -3723 -3724 3725 0 + 3724 -3725 0 + 3723 -3725 0 + 3725 3726 -3727 0 + -3725 3727 0 + -3726 3727 0 + 3591 3723 -3724 0 + 3591 -3723 3724 0 + -3591 3723 3724 0 + -3591 -3723 -3724 0 + -2946 3624 3728 0 + 2946 3728 0 + 2946 3624 -3728 0 + -2946 -3728 0 + -2946 3730 0 + 2946 -3730 0 + 3624 -3730 0 + -3727 -3728 3729 0 + 3728 -3729 0 + 3727 -3729 0 + 3729 3730 -3731 0 + -3729 3731 0 + -3730 3731 0 + 3592 3727 -3728 0 + 3592 -3727 3728 0 + -3592 3727 3728 0 + -3592 -3727 -3728 0 + -2947 3625 3732 0 + 2947 3732 0 + 2947 3625 -3732 0 + -2947 -3732 0 + -2947 3734 0 + 2947 -3734 0 + 3625 -3734 0 + -3731 -3732 3733 0 + 3732 -3733 0 + 3731 -3733 0 + 3733 3734 -3735 0 + -3733 3735 0 + -3734 3735 0 + 3593 3731 -3732 0 + 3593 -3731 3732 0 + -3593 3731 3732 0 + -3593 -3731 -3732 0 + -2948 3626 3736 0 + 2948 3736 0 + 2948 3626 -3736 0 + -2948 -3736 0 + -2948 3738 0 + 2948 -3738 0 + 3626 -3738 0 + -3735 -3736 3737 0 + 3736 -3737 0 + 3735 -3737 0 + 3737 3738 -3739 0 + -3737 3739 0 + -3738 3739 0 + 3594 3735 -3736 0 + 3594 -3735 3736 0 + -3594 3735 3736 0 + -3594 -3735 -3736 0 + -2949 3627 3740 0 + 2949 3740 0 + 2949 3627 -3740 0 + -2949 -3740 0 + -2949 3742 0 + 2949 -3742 0 + 3627 -3742 0 + -3739 -3740 3741 0 + 3740 -3741 0 + 3739 -3741 0 + 3741 3742 -3743 0 + -3741 3743 0 + -3742 3743 0 + 3595 3739 -3740 0 + 3595 -3739 3740 0 + -3595 3739 3740 0 + -3595 -3739 -3740 0 + -2950 3628 3744 0 + 2950 3744 0 + 2950 3628 -3744 0 + -2950 -3744 0 + -2950 3746 0 + 2950 -3746 0 + 3628 -3746 0 + -3743 -3744 3745 0 + 3744 -3745 0 + 3743 -3745 0 + 3745 3746 -3747 0 + -3745 3747 0 + -3746 3747 0 + 3596 3743 -3744 0 + 3596 -3743 3744 0 + -3596 3743 3744 0 + -3596 -3743 -3744 0 + -2951 3629 3748 0 + 2951 3748 0 + 2951 3629 -3748 0 + -2951 -3748 0 + -2951 3750 0 + 2951 -3750 0 + 3629 -3750 0 + -3747 -3748 3749 0 + 3748 -3749 0 + 3747 -3749 0 + 3749 3750 -3751 0 + -3749 3751 0 + -3750 3751 0 + 3597 3747 -3748 0 + 3597 -3747 3748 0 + -3597 3747 3748 0 + -3597 -3747 -3748 0 + -2952 3630 3752 0 + 2952 3752 0 + 2952 3630 -3752 0 + -2952 -3752 0 + -2952 3754 0 + 2952 -3754 0 + 3630 -3754 0 + -3751 -3752 3753 0 + 3752 -3753 0 + 3751 -3753 0 + 3753 3754 -3755 0 + -3753 3755 0 + -3754 3755 0 + 3598 3751 -3752 0 + 3598 -3751 3752 0 + -3598 3751 3752 0 + -3598 -3751 -3752 0 + -2953 3631 3756 0 + 2953 3756 0 + 2953 3631 -3756 0 + -2953 -3756 0 + -2953 3758 0 + 2953 -3758 0 + 3631 -3758 0 + -3755 -3756 3757 0 + 3756 -3757 0 + 3755 -3757 0 + 3757 3758 -3759 0 + -3757 3759 0 + -3758 3759 0 + 3599 3755 -3756 0 + 3599 -3755 3756 0 + -3599 3755 3756 0 + -3599 -3755 -3756 0 + 3755 -3759 3760 0 + -3755 3759 3760 0 + 3755 3759 -3760 0 + -3755 -3759 -3760 0 + 3567 3599 3760 0 + 3567 -3599 -3760 0 + -3567 -3599 3760 0 + -3567 3599 -3760 0 + -3566 -3567 3761 0 + 3566 -3761 0 + 3567 -3761 0 + -3114 3762 0 + 3114 -3761 3762 0 + 3114 3761 -3762 0 + -2665 -3762 3763 0 + 2665 -3763 0 + 3762 -3763 0 + 2247 3766 0 + -2247 -2279 3766 0 + -2247 -3766 0 + 2247 -2279 -3766 0 + -2248 -2280 3767 0 + -2249 -2281 3768 0 + -2250 -2282 3769 0 + -2251 -2283 3770 0 + -2252 -2284 3771 0 + -2253 -2285 3772 0 + -2254 -2286 3773 0 + -2255 -2287 3774 0 + -2256 -2288 3775 0 + -2257 -2289 3776 0 + -2258 -2290 3777 0 + -2259 -2291 3778 0 + -2260 -2292 3779 0 + -2261 -2293 3780 0 + -2262 -2294 3781 0 + -2263 -2295 3782 0 + -2264 -2296 3783 0 + -2265 -2297 3784 0 + -2266 -2298 3785 0 + -2267 -2299 3786 0 + -2268 -2300 3787 0 + -2269 -2301 3788 0 + -2270 -2302 3789 0 + -2271 -2303 3790 0 + -2272 -2304 3791 0 + -2273 -2305 3792 0 + -2274 -2306 3793 0 + -2275 -2307 3794 0 + -2276 -2308 3795 0 + -2277 -2309 3796 0 + -2278 -2310 3797 0 + -3766 3798 0 + 1 -3798 0 + 3766 -3798 0 + -3798 3799 0 + 3798 -3799 0 + 3767 -3799 0 + -3799 3800 0 + 3799 -3800 0 + 3768 -3800 0 + -3800 3801 0 + 3800 -3801 0 + 3769 -3801 0 + -3801 3802 0 + 3801 -3802 0 + 3770 -3802 0 + -3802 3803 0 + 3802 -3803 0 + 3771 -3803 0 + -3803 3804 0 + 3803 -3804 0 + 3772 -3804 0 + -3804 3805 0 + 3804 -3805 0 + 3773 -3805 0 + -3805 3806 0 + 3805 -3806 0 + 3774 -3806 0 + -3806 3807 0 + 3806 -3807 0 + 3775 -3807 0 + -3807 3808 0 + 3807 -3808 0 + 3776 -3808 0 + -3808 3809 0 + 3808 -3809 0 + 3777 -3809 0 + -3809 3810 0 + 3809 -3810 0 + 3778 -3810 0 + -3810 3811 0 + 3810 -3811 0 + 3779 -3811 0 + -3811 3812 0 + 3811 -3812 0 + 3780 -3812 0 + -3812 3813 0 + 3812 -3813 0 + 3781 -3813 0 + -3813 3814 0 + 3813 -3814 0 + 3782 -3814 0 + -3814 3815 0 + 3814 -3815 0 + 3783 -3815 0 + -3815 3816 0 + 3815 -3816 0 + 3784 -3816 0 + -3816 3817 0 + 3816 -3817 0 + 3785 -3817 0 + -3817 3818 0 + 3817 -3818 0 + 3786 -3818 0 + -3818 3819 0 + 3818 -3819 0 + 3787 -3819 0 + -3819 3820 0 + 3819 -3820 0 + 3788 -3820 0 + -3820 3821 0 + 3820 -3821 0 + 3789 -3821 0 + -3821 3822 0 + 3821 -3822 0 + 3790 -3822 0 + -3822 3823 0 + 3822 -3823 0 + 3791 -3823 0 + -3823 3824 0 + 3823 -3824 0 + 3792 -3824 0 + -3824 3825 0 + 3824 -3825 0 + 3793 -3825 0 + -3825 3826 0 + 3825 -3826 0 + 3794 -3826 0 + -3826 3827 0 + 3826 -3827 0 + 3795 -3827 0 + -3827 3828 0 + 3827 -3828 0 + 3796 -3828 0 + -3828 3829 0 + 3828 -3829 0 + 3797 -3829 0 + -3765 3829 0 + 3765 -3829 0 + 3764 3765 0 + -3764 -3765 0 + -3763 -3764 3830 0 + 3764 -3830 0 + 3763 -3830 0 + 2046 3864 0 + -2046 -2142 3864 0 + -2046 -3864 0 + 2046 -2142 -3864 0 + 2047 2143 3865 0 + -2047 3865 0 + -2047 2143 -3865 0 + 2047 -3865 0 + 2048 3866 0 + -2048 -2144 3866 0 + -2048 -3866 0 + 2048 -2144 -3866 0 + 2049 3867 0 + -2049 -2145 3867 0 + -2049 -3867 0 + 2049 -2145 -3867 0 + 2050 3868 0 + -2050 -2146 3868 0 + -2050 -3868 0 + 2050 -2146 -3868 0 + 2051 3869 0 + -2051 -2147 3869 0 + -2051 -3869 0 + 2051 -2147 -3869 0 + 2052 3870 0 + -2052 -2148 3870 0 + -2052 -3870 0 + 2052 -2148 -3870 0 + 2053 3871 0 + -2053 -2149 3871 0 + -2053 -3871 0 + 2053 -2149 -3871 0 + 2054 3872 0 + -2054 -2150 3872 0 + -2054 -3872 0 + 2054 -2150 -3872 0 + 2055 3873 0 + -2055 -2151 3873 0 + -2055 -3873 0 + 2055 -2151 -3873 0 + 2056 3874 0 + -2056 -2152 3874 0 + -2056 -3874 0 + 2056 -2152 -3874 0 + 2057 3875 0 + -2057 -2153 3875 0 + -2057 -3875 0 + 2057 -2153 -3875 0 + 2058 3876 0 + -2058 -2154 3876 0 + -2058 -3876 0 + 2058 -2154 -3876 0 + 2059 3877 0 + -2059 -2155 3877 0 + -2059 -3877 0 + 2059 -2155 -3877 0 + 2060 3878 0 + -2060 -2156 3878 0 + -2060 -3878 0 + 2060 -2156 -3878 0 + 2061 3879 0 + -2061 -2157 3879 0 + -2061 -3879 0 + 2061 -2157 -3879 0 + 2062 3880 0 + -2062 -2158 3880 0 + -2062 -3880 0 + 2062 -2158 -3880 0 + 2063 3881 0 + -2063 -2159 3881 0 + -2063 -3881 0 + 2063 -2159 -3881 0 + 2064 3882 0 + -2064 -2160 3882 0 + -2064 -3882 0 + 2064 -2160 -3882 0 + 2065 3883 0 + -2065 -2161 3883 0 + -2065 -3883 0 + 2065 -2161 -3883 0 + 2066 3884 0 + -2066 -2162 3884 0 + -2066 -3884 0 + 2066 -2162 -3884 0 + 2067 3885 0 + -2067 -2163 3885 0 + -2067 -3885 0 + 2067 -2163 -3885 0 + 2068 3886 0 + -2068 -2164 3886 0 + -2068 -3886 0 + 2068 -2164 -3886 0 + 2069 3887 0 + -2069 -2165 3887 0 + -2069 -3887 0 + 2069 -2165 -3887 0 + 2070 3888 0 + -2070 -2166 3888 0 + -2070 -3888 0 + 2070 -2166 -3888 0 + 2071 3889 0 + -2071 -2167 3889 0 + -2071 -3889 0 + 2071 -2167 -3889 0 + 2072 3890 0 + -2072 -2168 3890 0 + -2072 -3890 0 + 2072 -2168 -3890 0 + 2073 3891 0 + -2073 -2169 3891 0 + -2073 -3891 0 + 2073 -2169 -3891 0 + 2074 3892 0 + -2074 -2170 3892 0 + -2074 -3892 0 + 2074 -2170 -3892 0 + 2075 3893 0 + -2075 -2171 3893 0 + -2075 -3893 0 + 2075 -2171 -3893 0 + 2076 3894 0 + -2076 -2172 3894 0 + -2076 -3894 0 + 2076 -2172 -3894 0 + 2077 3895 0 + -2077 -2173 3895 0 + -2077 -3895 0 + 2077 -2173 -3895 0 + -3864 3896 0 + 1 -3896 0 + 3864 -3896 0 + -3865 -3896 3897 0 + 3896 -3897 0 + 3865 -3897 0 + -3866 -3897 3898 0 + 3897 -3898 0 + 3866 -3898 0 + -3867 -3898 3899 0 + 3898 -3899 0 + 3867 -3899 0 + -3868 -3899 3900 0 + 3899 -3900 0 + 3868 -3900 0 + -3869 -3900 3901 0 + 3900 -3901 0 + 3869 -3901 0 + -3870 -3901 3902 0 + 3901 -3902 0 + 3870 -3902 0 + -3871 -3902 3903 0 + 3902 -3903 0 + 3871 -3903 0 + -3872 -3903 3904 0 + 3903 -3904 0 + 3872 -3904 0 + -3873 -3904 3905 0 + 3904 -3905 0 + 3873 -3905 0 + -3874 -3905 3906 0 + 3905 -3906 0 + 3874 -3906 0 + -3875 -3906 3907 0 + 3906 -3907 0 + 3875 -3907 0 + -3876 -3907 3908 0 + 3907 -3908 0 + 3876 -3908 0 + -3877 -3908 3909 0 + 3908 -3909 0 + 3877 -3909 0 + -3878 -3909 3910 0 + 3909 -3910 0 + 3878 -3910 0 + -3879 -3910 3911 0 + 3910 -3911 0 + 3879 -3911 0 + -3880 -3911 3912 0 + 3911 -3912 0 + 3880 -3912 0 + -3881 -3912 3913 0 + 3912 -3913 0 + 3881 -3913 0 + -3882 -3913 3914 0 + 3913 -3914 0 + 3882 -3914 0 + -3883 -3914 3915 0 + 3914 -3915 0 + 3883 -3915 0 + -3884 -3915 3916 0 + 3915 -3916 0 + 3884 -3916 0 + -3885 -3916 3917 0 + 3916 -3917 0 + 3885 -3917 0 + -3886 -3917 3918 0 + 3917 -3918 0 + 3886 -3918 0 + -3887 -3918 3919 0 + 3918 -3919 0 + 3887 -3919 0 + -3888 -3919 3920 0 + 3919 -3920 0 + 3888 -3920 0 + -3889 -3920 3921 0 + 3920 -3921 0 + 3889 -3921 0 + -3890 -3921 3922 0 + 3921 -3922 0 + 3890 -3922 0 + -3891 -3922 3923 0 + 3922 -3923 0 + 3891 -3923 0 + -3892 -3923 3924 0 + 3923 -3924 0 + 3892 -3924 0 + -3893 -3924 3925 0 + 3924 -3925 0 + 3893 -3925 0 + -3894 -3925 3926 0 + 3925 -3926 0 + 3894 -3926 0 + -3895 -3926 3927 0 + 3926 -3927 0 + 3895 -3927 0 + -3863 3927 0 + 3863 -3927 0 + 3863 -3928 0 + -3863 3928 0 + 3928 3961 0 + -2279 -3928 3961 0 + -3928 -3961 0 + -2279 3928 -3961 0 + -2280 -3929 3962 0 + -2281 -3930 3963 0 + -2282 -3931 3964 0 + -2283 -3932 3965 0 + -2284 -3933 3966 0 + -2285 -3934 3967 0 + -2286 -3935 3968 0 + -2287 -3936 3969 0 + -2288 -3937 3970 0 + -2289 -3938 3971 0 + -2290 -3939 3972 0 + -2291 -3940 3973 0 + -2292 -3941 3974 0 + -2293 -3942 3975 0 + -2294 -3943 3976 0 + -2295 -3944 3977 0 + -2296 -3945 3978 0 + -2297 -3946 3979 0 + -2298 -3947 3980 0 + -2299 -3948 3981 0 + -2300 -3949 3982 0 + -2301 -3950 3983 0 + -2302 -3951 3984 0 + -2303 -3952 3985 0 + -2304 -3953 3986 0 + -2305 -3954 3987 0 + -2306 -3955 3988 0 + -2307 -3956 3989 0 + -2308 -3957 3990 0 + -2309 -3958 3991 0 + -2310 -3959 3992 0 + -3961 3993 0 + 1 -3993 0 + 3961 -3993 0 + -3993 3994 0 + 3993 -3994 0 + 3962 -3994 0 + -3994 3995 0 + 3994 -3995 0 + 3963 -3995 0 + -3995 3996 0 + 3995 -3996 0 + 3964 -3996 0 + -3996 3997 0 + 3996 -3997 0 + 3965 -3997 0 + -3997 3998 0 + 3997 -3998 0 + 3966 -3998 0 + -3998 3999 0 + 3998 -3999 0 + 3967 -3999 0 + -3999 4000 0 + 3999 -4000 0 + 3968 -4000 0 + -4000 4001 0 + 4000 -4001 0 + 3969 -4001 0 + -4001 4002 0 + 4001 -4002 0 + 3970 -4002 0 + -4002 4003 0 + 4002 -4003 0 + 3971 -4003 0 + -4003 4004 0 + 4003 -4004 0 + 3972 -4004 0 + -4004 4005 0 + 4004 -4005 0 + 3973 -4005 0 + -4005 4006 0 + 4005 -4006 0 + 3974 -4006 0 + -4006 4007 0 + 4006 -4007 0 + 3975 -4007 0 + -4007 4008 0 + 4007 -4008 0 + 3976 -4008 0 + -4008 4009 0 + 4008 -4009 0 + 3977 -4009 0 + -4009 4010 0 + 4009 -4010 0 + 3978 -4010 0 + -4010 4011 0 + 4010 -4011 0 + 3979 -4011 0 + -4011 4012 0 + 4011 -4012 0 + 3980 -4012 0 + -4012 4013 0 + 4012 -4013 0 + 3981 -4013 0 + -4013 4014 0 + 4013 -4014 0 + 3982 -4014 0 + -4014 4015 0 + 4014 -4015 0 + 3983 -4015 0 + -4015 4016 0 + 4015 -4016 0 + 3984 -4016 0 + -4016 4017 0 + 4016 -4017 0 + 3985 -4017 0 + -4017 4018 0 + 4017 -4018 0 + 3986 -4018 0 + -4018 4019 0 + 4018 -4019 0 + 3987 -4019 0 + -4019 4020 0 + 4019 -4020 0 + 3988 -4020 0 + -4020 4021 0 + 4020 -4021 0 + 3989 -4021 0 + -4021 4022 0 + 4021 -4022 0 + 3990 -4022 0 + -4022 4023 0 + 4022 -4023 0 + 3991 -4023 0 + -4023 4024 0 + 4023 -4024 0 + 3992 -4024 0 + -3960 4024 0 + 3960 -4024 0 + 4025 -4041 0 + -4025 4041 0 + 4026 -4042 0 + -4026 4042 0 + 4027 -4043 0 + -4027 4043 0 + 4028 -4044 0 + -4028 4044 0 + 4029 -4045 0 + -4029 4045 0 + 4030 -4046 0 + -4030 4046 0 + 4031 -4047 0 + -4031 4047 0 + 4032 -4048 0 + -4032 4048 0 + 4033 -4049 0 + -4033 4049 0 + 4034 -4050 0 + -4034 4050 0 + 4035 -4051 0 + -4035 4051 0 + 4036 -4052 0 + -4036 4052 0 + 4037 -4053 0 + -4037 4053 0 + 4038 -4054 0 + -4038 4054 0 + 4039 -4055 0 + -4039 4055 0 + 4040 -4056 0 + -4040 4056 0 + 260 -4057 0 + -260 4057 0 + 261 -4058 0 + -261 4058 0 + 262 -4059 0 + -262 4059 0 + 263 -4060 0 + -263 4060 0 + 264 -4061 0 + -264 4061 0 + 265 -4062 0 + -265 4062 0 + 266 -4063 0 + -266 4063 0 + 267 -4064 0 + -267 4064 0 + 268 -4065 0 + -268 4065 0 + 269 -4066 0 + -269 4066 0 + 270 -4067 0 + -270 4067 0 + 271 -4068 0 + -271 4068 0 + 272 -4069 0 + -272 4069 0 + 273 -4070 0 + -273 4070 0 + 274 -4071 0 + -274 4071 0 + 275 -4072 0 + -275 4072 0 + 276 -4073 0 + -276 4073 0 + 277 -4074 0 + -277 4074 0 + 278 -4075 0 + -278 4075 0 + 279 -4076 0 + -279 4076 0 + 280 -4077 0 + -280 4077 0 + 281 -4078 0 + -281 4078 0 + 282 -4079 0 + -282 4079 0 + 283 -4080 0 + -283 4080 0 + 284 -4081 0 + -284 4081 0 + 285 -4082 0 + -285 4082 0 + 286 -4083 0 + -286 4083 0 + 287 -4084 0 + -287 4084 0 + 288 -4085 0 + -288 4085 0 + 289 -4086 0 + -289 4086 0 + 290 -4087 0 + -290 4087 0 + 291 -4088 0 + -291 4088 0 + 4025 -4089 0 + -4025 4089 0 + 4026 -4090 0 + -4026 4090 0 + 4027 -4091 0 + -4027 4091 0 + 4028 -4092 0 + -4028 4092 0 + 4029 -4093 0 + -4029 4093 0 + 4030 -4094 0 + -4030 4094 0 + 4031 -4095 0 + -4031 4095 0 + 4032 -4096 0 + -4032 4096 0 + 4033 -4097 0 + -4033 4097 0 + 4034 -4098 0 + -4034 4098 0 + 4035 -4099 0 + -4035 4099 0 + 4036 -4100 0 + -4036 4100 0 + 4037 -4101 0 + -4037 4101 0 + 4038 -4102 0 + -4038 4102 0 + 4039 -4103 0 + -4039 4103 0 + 4040 -4104 0 + -4040 4104 0 + 4040 -4105 0 + -4040 4105 0 + 4040 -4106 0 + -4040 4106 0 + 4040 -4107 0 + -4040 4107 0 + 4040 -4108 0 + -4040 4108 0 + 4040 -4109 0 + -4040 4109 0 + 4040 -4110 0 + -4040 4110 0 + 4040 -4111 0 + -4040 4111 0 + 4040 -4112 0 + -4040 4112 0 + 4040 -4113 0 + -4040 4113 0 + 4040 -4114 0 + -4040 4114 0 + 4040 -4115 0 + -4040 4115 0 + 4040 -4116 0 + -4040 4116 0 + 4040 -4117 0 + -4040 4117 0 + 4040 -4118 0 + -4040 4118 0 + 4040 -4119 0 + -4040 4119 0 + 4040 -4120 0 + -4040 4120 0 + 4089 4154 0 + -4089 -4154 0 + 4090 4155 0 + -4090 -4155 0 + 4091 4156 0 + -4091 -4156 0 + 4092 4157 0 + -4092 -4157 0 + 4093 4158 0 + -4093 -4158 0 + 4094 4159 0 + -4094 -4159 0 + 4095 4160 0 + -4095 -4160 0 + 4096 4161 0 + -4096 -4161 0 + 4097 4162 0 + -4097 -4162 0 + 4098 4163 0 + -4098 -4163 0 + 4099 4164 0 + -4099 -4164 0 + 4100 4165 0 + -4100 -4165 0 + 4101 4166 0 + -4101 -4166 0 + 4102 4167 0 + -4102 -4167 0 + 4103 4168 0 + -4103 -4168 0 + 4104 4169 0 + -4104 -4169 0 + 4105 4170 0 + -4105 -4170 0 + 4106 4171 0 + -4106 -4171 0 + 4107 4172 0 + -4107 -4172 0 + 4108 4173 0 + -4108 -4173 0 + 4109 4174 0 + -4109 -4174 0 + 4110 4175 0 + -4110 -4175 0 + 4111 4176 0 + -4111 -4176 0 + 4112 4177 0 + -4112 -4177 0 + 4113 4178 0 + -4113 -4178 0 + 4114 4179 0 + -4114 -4179 0 + 4115 4180 0 + -4115 -4180 0 + 4116 4181 0 + -4116 -4181 0 + 4117 4182 0 + -4117 -4182 0 + 4118 4183 0 + -4118 -4183 0 + 4119 4184 0 + -4119 -4184 0 + 4120 4185 0 + -4120 -4185 0 + -4057 4154 4186 0 + 4057 -4154 4186 0 + 4057 4154 -4186 0 + -4057 -4154 -4186 0 + -4057 -4154 4188 0 + 4057 -4188 0 + 4154 -4188 0 + -4186 4187 0 + 4186 -4187 0 + 1 -4187 0 + 4187 4188 -4189 0 + -4187 4189 0 + -4188 4189 0 + 1 4122 -4186 0 + 4122 4186 0 + 1 -4122 4186 0 + -4122 -4186 0 + -4058 4155 4190 0 + 4058 -4155 4190 0 + 4058 4155 -4190 0 + -4058 -4155 -4190 0 + -4058 -4155 4192 0 + 4058 -4192 0 + 4155 -4192 0 + -4189 -4190 4191 0 + 4190 -4191 0 + 4189 -4191 0 + 4191 4192 -4193 0 + -4191 4193 0 + -4192 4193 0 + 4123 4189 -4190 0 + 4123 -4189 4190 0 + -4123 4189 4190 0 + -4123 -4189 -4190 0 + -4059 4156 4194 0 + 4059 -4156 4194 0 + 4059 4156 -4194 0 + -4059 -4156 -4194 0 + -4059 -4156 4196 0 + 4059 -4196 0 + 4156 -4196 0 + -4193 -4194 4195 0 + 4194 -4195 0 + 4193 -4195 0 + 4195 4196 -4197 0 + -4195 4197 0 + -4196 4197 0 + 4124 4193 -4194 0 + 4124 -4193 4194 0 + -4124 4193 4194 0 + -4124 -4193 -4194 0 + -4060 4157 4198 0 + 4060 -4157 4198 0 + 4060 4157 -4198 0 + -4060 -4157 -4198 0 + -4060 -4157 4200 0 + 4060 -4200 0 + 4157 -4200 0 + -4197 -4198 4199 0 + 4198 -4199 0 + 4197 -4199 0 + 4199 4200 -4201 0 + -4199 4201 0 + -4200 4201 0 + 4125 4197 -4198 0 + 4125 -4197 4198 0 + -4125 4197 4198 0 + -4125 -4197 -4198 0 + -4061 4158 4202 0 + 4061 -4158 4202 0 + 4061 4158 -4202 0 + -4061 -4158 -4202 0 + -4061 -4158 4204 0 + 4061 -4204 0 + 4158 -4204 0 + -4201 -4202 4203 0 + 4202 -4203 0 + 4201 -4203 0 + 4203 4204 -4205 0 + -4203 4205 0 + -4204 4205 0 + 4126 4201 -4202 0 + 4126 -4201 4202 0 + -4126 4201 4202 0 + -4126 -4201 -4202 0 + -4062 4159 4206 0 + 4062 -4159 4206 0 + 4062 4159 -4206 0 + -4062 -4159 -4206 0 + -4062 -4159 4208 0 + 4062 -4208 0 + 4159 -4208 0 + -4205 -4206 4207 0 + 4206 -4207 0 + 4205 -4207 0 + 4207 4208 -4209 0 + -4207 4209 0 + -4208 4209 0 + 4127 4205 -4206 0 + 4127 -4205 4206 0 + -4127 4205 4206 0 + -4127 -4205 -4206 0 + -4063 4160 4210 0 + 4063 -4160 4210 0 + 4063 4160 -4210 0 + -4063 -4160 -4210 0 + -4063 -4160 4212 0 + 4063 -4212 0 + 4160 -4212 0 + -4209 -4210 4211 0 + 4210 -4211 0 + 4209 -4211 0 + 4211 4212 -4213 0 + -4211 4213 0 + -4212 4213 0 + 4128 4209 -4210 0 + 4128 -4209 4210 0 + -4128 4209 4210 0 + -4128 -4209 -4210 0 + -4064 4161 4214 0 + 4064 -4161 4214 0 + 4064 4161 -4214 0 + -4064 -4161 -4214 0 + -4064 -4161 4216 0 + 4064 -4216 0 + 4161 -4216 0 + -4213 -4214 4215 0 + 4214 -4215 0 + 4213 -4215 0 + 4215 4216 -4217 0 + -4215 4217 0 + -4216 4217 0 + 4129 4213 -4214 0 + 4129 -4213 4214 0 + -4129 4213 4214 0 + -4129 -4213 -4214 0 + -4065 4162 4218 0 + 4065 -4162 4218 0 + 4065 4162 -4218 0 + -4065 -4162 -4218 0 + -4065 -4162 4220 0 + 4065 -4220 0 + 4162 -4220 0 + -4217 -4218 4219 0 + 4218 -4219 0 + 4217 -4219 0 + 4219 4220 -4221 0 + -4219 4221 0 + -4220 4221 0 + 4130 4217 -4218 0 + 4130 -4217 4218 0 + -4130 4217 4218 0 + -4130 -4217 -4218 0 + -4066 4163 4222 0 + 4066 -4163 4222 0 + 4066 4163 -4222 0 + -4066 -4163 -4222 0 + -4066 -4163 4224 0 + 4066 -4224 0 + 4163 -4224 0 + -4221 -4222 4223 0 + 4222 -4223 0 + 4221 -4223 0 + 4223 4224 -4225 0 + -4223 4225 0 + -4224 4225 0 + 4131 4221 -4222 0 + 4131 -4221 4222 0 + -4131 4221 4222 0 + -4131 -4221 -4222 0 + -4067 4164 4226 0 + 4067 -4164 4226 0 + 4067 4164 -4226 0 + -4067 -4164 -4226 0 + -4067 -4164 4228 0 + 4067 -4228 0 + 4164 -4228 0 + -4225 -4226 4227 0 + 4226 -4227 0 + 4225 -4227 0 + 4227 4228 -4229 0 + -4227 4229 0 + -4228 4229 0 + 4132 4225 -4226 0 + 4132 -4225 4226 0 + -4132 4225 4226 0 + -4132 -4225 -4226 0 + -4068 4165 4230 0 + 4068 -4165 4230 0 + 4068 4165 -4230 0 + -4068 -4165 -4230 0 + -4068 -4165 4232 0 + 4068 -4232 0 + 4165 -4232 0 + -4229 -4230 4231 0 + 4230 -4231 0 + 4229 -4231 0 + 4231 4232 -4233 0 + -4231 4233 0 + -4232 4233 0 + 4133 4229 -4230 0 + 4133 -4229 4230 0 + -4133 4229 4230 0 + -4133 -4229 -4230 0 + -4069 4166 4234 0 + 4069 -4166 4234 0 + 4069 4166 -4234 0 + -4069 -4166 -4234 0 + -4069 -4166 4236 0 + 4069 -4236 0 + 4166 -4236 0 + -4233 -4234 4235 0 + 4234 -4235 0 + 4233 -4235 0 + 4235 4236 -4237 0 + -4235 4237 0 + -4236 4237 0 + 4134 4233 -4234 0 + 4134 -4233 4234 0 + -4134 4233 4234 0 + -4134 -4233 -4234 0 + -4070 4167 4238 0 + 4070 -4167 4238 0 + 4070 4167 -4238 0 + -4070 -4167 -4238 0 + -4070 -4167 4240 0 + 4070 -4240 0 + 4167 -4240 0 + -4237 -4238 4239 0 + 4238 -4239 0 + 4237 -4239 0 + 4239 4240 -4241 0 + -4239 4241 0 + -4240 4241 0 + 4135 4237 -4238 0 + 4135 -4237 4238 0 + -4135 4237 4238 0 + -4135 -4237 -4238 0 + -4071 4168 4242 0 + 4071 -4168 4242 0 + 4071 4168 -4242 0 + -4071 -4168 -4242 0 + -4071 -4168 4244 0 + 4071 -4244 0 + 4168 -4244 0 + -4241 -4242 4243 0 + 4242 -4243 0 + 4241 -4243 0 + 4243 4244 -4245 0 + -4243 4245 0 + -4244 4245 0 + 4136 4241 -4242 0 + 4136 -4241 4242 0 + -4136 4241 4242 0 + -4136 -4241 -4242 0 + -4072 4169 4246 0 + 4072 -4169 4246 0 + 4072 4169 -4246 0 + -4072 -4169 -4246 0 + -4072 -4169 4248 0 + 4072 -4248 0 + 4169 -4248 0 + -4245 -4246 4247 0 + 4246 -4247 0 + 4245 -4247 0 + 4247 4248 -4249 0 + -4247 4249 0 + -4248 4249 0 + 4137 4245 -4246 0 + 4137 -4245 4246 0 + -4137 4245 4246 0 + -4137 -4245 -4246 0 + -4073 4170 4250 0 + 4073 -4170 4250 0 + 4073 4170 -4250 0 + -4073 -4170 -4250 0 + -4073 -4170 4252 0 + 4073 -4252 0 + 4170 -4252 0 + -4249 -4250 4251 0 + 4250 -4251 0 + 4249 -4251 0 + 4251 4252 -4253 0 + -4251 4253 0 + -4252 4253 0 + 4138 4249 -4250 0 + 4138 -4249 4250 0 + -4138 4249 4250 0 + -4138 -4249 -4250 0 + -4074 4171 4254 0 + 4074 -4171 4254 0 + 4074 4171 -4254 0 + -4074 -4171 -4254 0 + -4074 -4171 4256 0 + 4074 -4256 0 + 4171 -4256 0 + -4253 -4254 4255 0 + 4254 -4255 0 + 4253 -4255 0 + 4255 4256 -4257 0 + -4255 4257 0 + -4256 4257 0 + 4139 4253 -4254 0 + 4139 -4253 4254 0 + -4139 4253 4254 0 + -4139 -4253 -4254 0 + -4075 4172 4258 0 + 4075 -4172 4258 0 + 4075 4172 -4258 0 + -4075 -4172 -4258 0 + -4075 -4172 4260 0 + 4075 -4260 0 + 4172 -4260 0 + -4257 -4258 4259 0 + 4258 -4259 0 + 4257 -4259 0 + 4259 4260 -4261 0 + -4259 4261 0 + -4260 4261 0 + 4140 4257 -4258 0 + 4140 -4257 4258 0 + -4140 4257 4258 0 + -4140 -4257 -4258 0 + -4076 4173 4262 0 + 4076 -4173 4262 0 + 4076 4173 -4262 0 + -4076 -4173 -4262 0 + -4076 -4173 4264 0 + 4076 -4264 0 + 4173 -4264 0 + -4261 -4262 4263 0 + 4262 -4263 0 + 4261 -4263 0 + 4263 4264 -4265 0 + -4263 4265 0 + -4264 4265 0 + 4141 4261 -4262 0 + 4141 -4261 4262 0 + -4141 4261 4262 0 + -4141 -4261 -4262 0 + -4077 4174 4266 0 + 4077 -4174 4266 0 + 4077 4174 -4266 0 + -4077 -4174 -4266 0 + -4077 -4174 4268 0 + 4077 -4268 0 + 4174 -4268 0 + -4265 -4266 4267 0 + 4266 -4267 0 + 4265 -4267 0 + 4267 4268 -4269 0 + -4267 4269 0 + -4268 4269 0 + 4142 4265 -4266 0 + 4142 -4265 4266 0 + -4142 4265 4266 0 + -4142 -4265 -4266 0 + -4078 4175 4270 0 + 4078 -4175 4270 0 + 4078 4175 -4270 0 + -4078 -4175 -4270 0 + -4078 -4175 4272 0 + 4078 -4272 0 + 4175 -4272 0 + -4269 -4270 4271 0 + 4270 -4271 0 + 4269 -4271 0 + 4271 4272 -4273 0 + -4271 4273 0 + -4272 4273 0 + 4143 4269 -4270 0 + 4143 -4269 4270 0 + -4143 4269 4270 0 + -4143 -4269 -4270 0 + -4079 4176 4274 0 + 4079 -4176 4274 0 + 4079 4176 -4274 0 + -4079 -4176 -4274 0 + -4079 -4176 4276 0 + 4079 -4276 0 + 4176 -4276 0 + -4273 -4274 4275 0 + 4274 -4275 0 + 4273 -4275 0 + 4275 4276 -4277 0 + -4275 4277 0 + -4276 4277 0 + 4144 4273 -4274 0 + 4144 -4273 4274 0 + -4144 4273 4274 0 + -4144 -4273 -4274 0 + -4080 4177 4278 0 + 4080 -4177 4278 0 + 4080 4177 -4278 0 + -4080 -4177 -4278 0 + -4080 -4177 4280 0 + 4080 -4280 0 + 4177 -4280 0 + -4277 -4278 4279 0 + 4278 -4279 0 + 4277 -4279 0 + 4279 4280 -4281 0 + -4279 4281 0 + -4280 4281 0 + 4145 4277 -4278 0 + 4145 -4277 4278 0 + -4145 4277 4278 0 + -4145 -4277 -4278 0 + -4081 4178 4282 0 + 4081 -4178 4282 0 + 4081 4178 -4282 0 + -4081 -4178 -4282 0 + -4081 -4178 4284 0 + 4081 -4284 0 + 4178 -4284 0 + -4281 -4282 4283 0 + 4282 -4283 0 + 4281 -4283 0 + 4283 4284 -4285 0 + -4283 4285 0 + -4284 4285 0 + 4146 4281 -4282 0 + 4146 -4281 4282 0 + -4146 4281 4282 0 + -4146 -4281 -4282 0 + -4082 4179 4286 0 + 4082 -4179 4286 0 + 4082 4179 -4286 0 + -4082 -4179 -4286 0 + -4082 -4179 4288 0 + 4082 -4288 0 + 4179 -4288 0 + -4285 -4286 4287 0 + 4286 -4287 0 + 4285 -4287 0 + 4287 4288 -4289 0 + -4287 4289 0 + -4288 4289 0 + 4147 4285 -4286 0 + 4147 -4285 4286 0 + -4147 4285 4286 0 + -4147 -4285 -4286 0 + -4083 4180 4290 0 + 4083 -4180 4290 0 + 4083 4180 -4290 0 + -4083 -4180 -4290 0 + -4083 -4180 4292 0 + 4083 -4292 0 + 4180 -4292 0 + -4289 -4290 4291 0 + 4290 -4291 0 + 4289 -4291 0 + 4291 4292 -4293 0 + -4291 4293 0 + -4292 4293 0 + 4148 4289 -4290 0 + 4148 -4289 4290 0 + -4148 4289 4290 0 + -4148 -4289 -4290 0 + -4084 4181 4294 0 + 4084 -4181 4294 0 + 4084 4181 -4294 0 + -4084 -4181 -4294 0 + -4084 -4181 4296 0 + 4084 -4296 0 + 4181 -4296 0 + -4293 -4294 4295 0 + 4294 -4295 0 + 4293 -4295 0 + 4295 4296 -4297 0 + -4295 4297 0 + -4296 4297 0 + 4149 4293 -4294 0 + 4149 -4293 4294 0 + -4149 4293 4294 0 + -4149 -4293 -4294 0 + -4085 4182 4298 0 + 4085 -4182 4298 0 + 4085 4182 -4298 0 + -4085 -4182 -4298 0 + -4085 -4182 4300 0 + 4085 -4300 0 + 4182 -4300 0 + -4297 -4298 4299 0 + 4298 -4299 0 + 4297 -4299 0 + 4299 4300 -4301 0 + -4299 4301 0 + -4300 4301 0 + 4150 4297 -4298 0 + 4150 -4297 4298 0 + -4150 4297 4298 0 + -4150 -4297 -4298 0 + -4086 4183 4302 0 + 4086 -4183 4302 0 + 4086 4183 -4302 0 + -4086 -4183 -4302 0 + -4086 -4183 4304 0 + 4086 -4304 0 + 4183 -4304 0 + -4301 -4302 4303 0 + 4302 -4303 0 + 4301 -4303 0 + 4303 4304 -4305 0 + -4303 4305 0 + -4304 4305 0 + 4151 4301 -4302 0 + 4151 -4301 4302 0 + -4151 4301 4302 0 + -4151 -4301 -4302 0 + -4087 4184 4306 0 + 4087 -4184 4306 0 + 4087 4184 -4306 0 + -4087 -4184 -4306 0 + -4087 -4184 4308 0 + 4087 -4308 0 + 4184 -4308 0 + -4305 -4306 4307 0 + 4306 -4307 0 + 4305 -4307 0 + 4307 4308 -4309 0 + -4307 4309 0 + -4308 4309 0 + 4152 4305 -4306 0 + 4152 -4305 4306 0 + -4152 4305 4306 0 + -4152 -4305 -4306 0 + -4088 4185 4310 0 + 4088 -4185 4310 0 + 4088 4185 -4310 0 + -4088 -4185 -4310 0 + -4088 -4185 4312 0 + 4088 -4312 0 + 4185 -4312 0 + -4309 -4310 4311 0 + 4310 -4311 0 + 4309 -4311 0 + 4311 4312 -4313 0 + -4311 4313 0 + -4312 4313 0 + 4153 4309 -4310 0 + 4153 -4309 4310 0 + -4153 4309 4310 0 + -4153 -4309 -4310 0 + 4121 4313 0 + -4121 -4313 0 + 4314 -4322 0 + -4314 4322 0 + 4315 -4323 0 + -4315 4323 0 + 4316 -4324 0 + -4316 4324 0 + 4317 -4325 0 + -4317 4325 0 + 4318 -4326 0 + -4318 4326 0 + 4319 -4327 0 + -4319 4327 0 + 4320 -4328 0 + -4320 4328 0 + 4321 -4329 0 + -4321 4329 0 + 4321 -4330 0 + -4321 4330 0 + 4321 -4331 0 + -4321 4331 0 + 4321 -4332 0 + -4321 4332 0 + 4321 -4333 0 + -4321 4333 0 + 4321 -4334 0 + -4321 4334 0 + 4321 -4335 0 + -4321 4335 0 + 4321 -4336 0 + -4321 4336 0 + 4321 -4337 0 + -4321 4337 0 + 4321 -4338 0 + -4321 4338 0 + 4321 -4339 0 + -4321 4339 0 + 4321 -4340 0 + -4321 4340 0 + 4321 -4341 0 + -4321 4341 0 + 4321 -4342 0 + -4321 4342 0 + 4321 -4343 0 + -4321 4343 0 + 4321 -4344 0 + -4321 4344 0 + 4321 -4345 0 + -4321 4345 0 + 4321 -4346 0 + -4321 4346 0 + 4321 -4347 0 + -4321 4347 0 + 4321 -4348 0 + -4321 4348 0 + 4321 -4349 0 + -4321 4349 0 + 4321 -4350 0 + -4321 4350 0 + 4321 -4351 0 + -4321 4351 0 + 4321 -4352 0 + -4321 4352 0 + 4321 -4353 0 + -4321 4353 0 + -4057 -4322 4354 0 + 4057 -4354 0 + 4322 -4354 0 + -4058 -4323 4355 0 + 4058 -4355 0 + 4323 -4355 0 + -4059 -4324 4356 0 + 4059 -4356 0 + 4324 -4356 0 + -4060 -4325 4357 0 + 4060 -4357 0 + 4325 -4357 0 + -4061 -4326 4358 0 + 4061 -4358 0 + 4326 -4358 0 + -4062 -4327 4359 0 + 4062 -4359 0 + 4327 -4359 0 + -4063 -4328 4360 0 + 4063 -4360 0 + 4328 -4360 0 + -4064 -4329 4361 0 + 4064 -4361 0 + 4329 -4361 0 + -4065 -4330 4362 0 + 4065 -4362 0 + 4330 -4362 0 + -4066 -4331 4363 0 + 4066 -4363 0 + 4331 -4363 0 + -4067 -4332 4364 0 + 4067 -4364 0 + 4332 -4364 0 + -4068 -4333 4365 0 + 4068 -4365 0 + 4333 -4365 0 + -4069 -4334 4366 0 + 4069 -4366 0 + 4334 -4366 0 + -4070 -4335 4367 0 + 4070 -4367 0 + 4335 -4367 0 + -4071 -4336 4368 0 + 4071 -4368 0 + 4336 -4368 0 + -4072 -4337 4369 0 + 4072 -4369 0 + 4337 -4369 0 + -4073 -4338 4370 0 + 4073 -4370 0 + 4338 -4370 0 + -4074 -4339 4371 0 + 4074 -4371 0 + 4339 -4371 0 + -4075 -4340 4372 0 + 4075 -4372 0 + 4340 -4372 0 + -4076 -4341 4373 0 + 4076 -4373 0 + 4341 -4373 0 + -4077 -4342 4374 0 + 4077 -4374 0 + 4342 -4374 0 + -4078 -4343 4375 0 + 4078 -4375 0 + 4343 -4375 0 + -4079 -4344 4376 0 + 4079 -4376 0 + 4344 -4376 0 + -4080 -4345 4377 0 + 4080 -4377 0 + 4345 -4377 0 + -4081 -4346 4378 0 + 4081 -4378 0 + 4346 -4378 0 + -4082 -4347 4379 0 + 4082 -4379 0 + 4347 -4379 0 + -4083 -4348 4380 0 + 4083 -4380 0 + 4348 -4380 0 + -4084 -4349 4381 0 + 4084 -4381 0 + 4349 -4381 0 + -4085 -4350 4382 0 + 4085 -4382 0 + 4350 -4382 0 + -4086 -4351 4383 0 + 4086 -4383 0 + 4351 -4383 0 + -4087 -4352 4384 0 + 4087 -4384 0 + 4352 -4384 0 + -4088 -4353 4385 0 + 4088 -4385 0 + 4353 -4385 0 + -4121 4386 0 + 3831 -4121 -4386 0 + 4121 -4354 4386 0 + 4121 4354 -4386 0 + -4121 4387 0 + 3832 -4121 -4387 0 + 4121 -4355 4387 0 + 4121 4355 -4387 0 + -4121 4388 0 + 3833 -4121 -4388 0 + 4121 -4356 4388 0 + 4121 4356 -4388 0 + -4121 4389 0 + 3834 -4121 -4389 0 + 4121 -4357 4389 0 + 4121 4357 -4389 0 + -4121 4390 0 + 3835 -4121 -4390 0 + 4121 -4358 4390 0 + 4121 4358 -4390 0 + -4121 4391 0 + 3836 -4121 -4391 0 + 4121 -4359 4391 0 + 4121 4359 -4391 0 + -4121 4392 0 + 3837 -4121 -4392 0 + 4121 -4360 4392 0 + 4121 4360 -4392 0 + -3838 -4121 4393 0 + -4121 -4393 0 + 4121 -4361 4393 0 + 4121 4361 -4393 0 + -3839 -4121 4394 0 + -4121 -4394 0 + 4121 -4362 4394 0 + 4121 4362 -4394 0 + -3840 -4121 4395 0 + -4121 -4395 0 + 4121 -4363 4395 0 + 4121 4363 -4395 0 + -3841 -4121 4396 0 + -4121 -4396 0 + 4121 -4364 4396 0 + 4121 4364 -4396 0 + -3842 -4121 4397 0 + -4121 -4397 0 + 4121 -4365 4397 0 + 4121 4365 -4397 0 + -3843 -4121 4398 0 + -4121 -4398 0 + 4121 -4366 4398 0 + 4121 4366 -4398 0 + -3844 -4121 4399 0 + -4121 -4399 0 + 4121 -4367 4399 0 + 4121 4367 -4399 0 + -3845 -4121 4400 0 + -4121 -4400 0 + 4121 -4368 4400 0 + 4121 4368 -4400 0 + -3846 -4121 4401 0 + -4121 -4401 0 + 4121 -4369 4401 0 + 4121 4369 -4401 0 + -3847 -4121 4402 0 + -4121 -4402 0 + 4121 -4370 4402 0 + 4121 4370 -4402 0 + -3848 -4121 4403 0 + -4121 -4403 0 + 4121 -4371 4403 0 + 4121 4371 -4403 0 + -3849 -4121 4404 0 + -4121 -4404 0 + 4121 -4372 4404 0 + 4121 4372 -4404 0 + -3850 -4121 4405 0 + -4121 -4405 0 + 4121 -4373 4405 0 + 4121 4373 -4405 0 + -3851 -4121 4406 0 + -4121 -4406 0 + 4121 -4374 4406 0 + 4121 4374 -4406 0 + -3852 -4121 4407 0 + -4121 -4407 0 + 4121 -4375 4407 0 + 4121 4375 -4407 0 + -3853 -4121 4408 0 + -4121 -4408 0 + 4121 -4376 4408 0 + 4121 4376 -4408 0 + -3854 -4121 4409 0 + -4121 -4409 0 + 4121 -4377 4409 0 + 4121 4377 -4409 0 + -3855 -4121 4410 0 + -4121 -4410 0 + 4121 -4378 4410 0 + 4121 4378 -4410 0 + -3856 -4121 4411 0 + -4121 -4411 0 + 4121 -4379 4411 0 + 4121 4379 -4411 0 + -3857 -4121 4412 0 + -4121 -4412 0 + 4121 -4380 4412 0 + 4121 4380 -4412 0 + -3858 -4121 4413 0 + -4121 -4413 0 + 4121 -4381 4413 0 + 4121 4381 -4413 0 + -3859 -4121 4414 0 + -4121 -4414 0 + 4121 -4382 4414 0 + 4121 4382 -4414 0 + -3860 -4121 4415 0 + -4121 -4415 0 + 4121 -4383 4415 0 + 4121 4383 -4415 0 + -3861 -4121 4416 0 + -4121 -4416 0 + 4121 -4384 4416 0 + 4121 4384 -4416 0 + -3862 -4121 4417 0 + -4121 -4417 0 + 4121 -4385 4417 0 + 4121 4385 -4417 0 + 3831 4386 4419 0 + -4386 4419 0 + 3831 -4386 -4419 0 + 4386 -4419 0 + 3832 4387 4420 0 + -4387 4420 0 + 3832 -4387 -4420 0 + 4387 -4420 0 + 3833 4388 4421 0 + -4388 4421 0 + 3833 -4388 -4421 0 + 4388 -4421 0 + 3834 4389 4422 0 + -4389 4422 0 + 3834 -4389 -4422 0 + 4389 -4422 0 + 3835 4390 4423 0 + -4390 4423 0 + 3835 -4390 -4423 0 + 4390 -4423 0 + 3836 4391 4424 0 + -4391 4424 0 + 3836 -4391 -4424 0 + 4391 -4424 0 + 3837 4392 4425 0 + -4392 4425 0 + 3837 -4392 -4425 0 + 4392 -4425 0 + 4393 4426 0 + -3838 -4393 4426 0 + -4393 -4426 0 + -3838 4393 -4426 0 + 4394 4427 0 + -3839 -4394 4427 0 + -4394 -4427 0 + -3839 4394 -4427 0 + 4395 4428 0 + -3840 -4395 4428 0 + -4395 -4428 0 + -3840 4395 -4428 0 + 4396 4429 0 + -3841 -4396 4429 0 + -4396 -4429 0 + -3841 4396 -4429 0 + 4397 4430 0 + -3842 -4397 4430 0 + -4397 -4430 0 + -3842 4397 -4430 0 + 4398 4431 0 + -3843 -4398 4431 0 + -4398 -4431 0 + -3843 4398 -4431 0 + 4399 4432 0 + -3844 -4399 4432 0 + -4399 -4432 0 + -3844 4399 -4432 0 + 4400 4433 0 + -3845 -4400 4433 0 + -4400 -4433 0 + -3845 4400 -4433 0 + 4401 4434 0 + -3846 -4401 4434 0 + -4401 -4434 0 + -3846 4401 -4434 0 + 4402 4435 0 + -3847 -4402 4435 0 + -4402 -4435 0 + -3847 4402 -4435 0 + 4403 4436 0 + -3848 -4403 4436 0 + -4403 -4436 0 + -3848 4403 -4436 0 + 4404 4437 0 + -3849 -4404 4437 0 + -4404 -4437 0 + -3849 4404 -4437 0 + 4405 4438 0 + -3850 -4405 4438 0 + -4405 -4438 0 + -3850 4405 -4438 0 + 4406 4439 0 + -3851 -4406 4439 0 + -4406 -4439 0 + -3851 4406 -4439 0 + 4407 4440 0 + -3852 -4407 4440 0 + -4407 -4440 0 + -3852 4407 -4440 0 + 4408 4441 0 + -3853 -4408 4441 0 + -4408 -4441 0 + -3853 4408 -4441 0 + 4409 4442 0 + -3854 -4409 4442 0 + -4409 -4442 0 + -3854 4409 -4442 0 + 4410 4443 0 + -3855 -4410 4443 0 + -4410 -4443 0 + -3855 4410 -4443 0 + 4411 4444 0 + -3856 -4411 4444 0 + -4411 -4444 0 + -3856 4411 -4444 0 + 4412 4445 0 + -3857 -4412 4445 0 + -4412 -4445 0 + -3857 4412 -4445 0 + 4413 4446 0 + -3858 -4413 4446 0 + -4413 -4446 0 + -3858 4413 -4446 0 + 4414 4447 0 + -3859 -4414 4447 0 + -4414 -4447 0 + -3859 4414 -4447 0 + 4415 4448 0 + -3860 -4415 4448 0 + -4415 -4448 0 + -3860 4415 -4448 0 + 4416 4449 0 + -3861 -4416 4449 0 + -4416 -4449 0 + -3861 4416 -4449 0 + 4417 4450 0 + -3862 -4417 4450 0 + -4417 -4450 0 + -3862 4417 -4450 0 + -4419 4451 0 + 1 -4451 0 + 4419 -4451 0 + -4420 -4451 4452 0 + 4451 -4452 0 + 4420 -4452 0 + -4421 -4452 4453 0 + 4452 -4453 0 + 4421 -4453 0 + -4422 -4453 4454 0 + 4453 -4454 0 + 4422 -4454 0 + -4423 -4454 4455 0 + 4454 -4455 0 + 4423 -4455 0 + -4424 -4455 4456 0 + 4455 -4456 0 + 4424 -4456 0 + -4425 -4456 4457 0 + 4456 -4457 0 + 4425 -4457 0 + -4426 -4457 4458 0 + 4457 -4458 0 + 4426 -4458 0 + -4427 -4458 4459 0 + 4458 -4459 0 + 4427 -4459 0 + -4428 -4459 4460 0 + 4459 -4460 0 + 4428 -4460 0 + -4429 -4460 4461 0 + 4460 -4461 0 + 4429 -4461 0 + -4430 -4461 4462 0 + 4461 -4462 0 + 4430 -4462 0 + -4431 -4462 4463 0 + 4462 -4463 0 + 4431 -4463 0 + -4432 -4463 4464 0 + 4463 -4464 0 + 4432 -4464 0 + -4433 -4464 4465 0 + 4464 -4465 0 + 4433 -4465 0 + -4434 -4465 4466 0 + 4465 -4466 0 + 4434 -4466 0 + -4435 -4466 4467 0 + 4466 -4467 0 + 4435 -4467 0 + -4436 -4467 4468 0 + 4467 -4468 0 + 4436 -4468 0 + -4437 -4468 4469 0 + 4468 -4469 0 + 4437 -4469 0 + -4438 -4469 4470 0 + 4469 -4470 0 + 4438 -4470 0 + -4439 -4470 4471 0 + 4470 -4471 0 + 4439 -4471 0 + -4440 -4471 4472 0 + 4471 -4472 0 + 4440 -4472 0 + -4441 -4472 4473 0 + 4472 -4473 0 + 4441 -4473 0 + -4442 -4473 4474 0 + 4473 -4474 0 + 4442 -4474 0 + -4443 -4474 4475 0 + 4474 -4475 0 + 4443 -4475 0 + -4444 -4475 4476 0 + 4475 -4476 0 + 4444 -4476 0 + -4445 -4476 4477 0 + 4476 -4477 0 + 4445 -4477 0 + -4446 -4477 4478 0 + 4477 -4478 0 + 4446 -4478 0 + -4447 -4478 4479 0 + 4478 -4479 0 + 4447 -4479 0 + -4448 -4479 4480 0 + 4479 -4480 0 + 4448 -4480 0 + -4449 -4480 4481 0 + 4480 -4481 0 + 4449 -4481 0 + -4450 -4481 4482 0 + 4481 -4482 0 + 4450 -4482 0 + -4418 4482 0 + 4418 -4482 0 + 4025 -4491 0 + -4025 4491 0 + 4026 -4492 0 + -4026 4492 0 + 4027 -4493 0 + -4027 4493 0 + 4028 -4494 0 + -4028 4494 0 + 4029 -4495 0 + -4029 4495 0 + 4030 -4496 0 + -4030 4496 0 + 4031 -4497 0 + -4031 4497 0 + 4032 -4498 0 + -4032 4498 0 + 4033 -4499 0 + -4033 4499 0 + 4034 -4500 0 + -4034 4500 0 + 4035 -4501 0 + -4035 4501 0 + 4036 -4502 0 + -4036 4502 0 + 4037 -4503 0 + -4037 4503 0 + 4038 -4504 0 + -4038 4504 0 + 4039 -4505 0 + -4039 4505 0 + 4040 -4506 0 + -4040 4506 0 + 4040 -4507 0 + -4040 4507 0 + 4040 -4508 0 + -4040 4508 0 + 4040 -4509 0 + -4040 4509 0 + 4040 -4510 0 + -4040 4510 0 + 4040 -4511 0 + -4040 4511 0 + 4040 -4512 0 + -4040 4512 0 + 4040 -4513 0 + -4040 4513 0 + 4040 -4514 0 + -4040 4514 0 + 4040 -4515 0 + -4040 4515 0 + 4040 -4516 0 + -4040 4516 0 + 4040 -4517 0 + -4040 4517 0 + 4040 -4518 0 + -4040 4518 0 + 4040 -4519 0 + -4040 4519 0 + 4040 -4520 0 + -4040 4520 0 + 4040 -4521 0 + -4040 4521 0 + 4040 -4522 0 + -4040 4522 0 + 4040 -4523 0 + -4040 4523 0 + 4040 -4524 0 + -4040 4524 0 + 4040 -4525 0 + -4040 4525 0 + 4040 -4526 0 + -4040 4526 0 + 4040 -4527 0 + -4040 4527 0 + 4040 -4528 0 + -4040 4528 0 + 4040 -4529 0 + -4040 4529 0 + 4040 -4530 0 + -4040 4530 0 + 4040 -4531 0 + -4040 4531 0 + 4040 -4532 0 + -4040 4532 0 + 4040 -4533 0 + -4040 4533 0 + 4040 -4534 0 + -4040 4534 0 + 4040 -4535 0 + -4040 4535 0 + 4040 -4536 0 + -4040 4536 0 + 4040 -4537 0 + -4040 4537 0 + 4040 -4538 0 + -4040 4538 0 + 4040 -4539 0 + -4040 4539 0 + 4040 -4540 0 + -4040 4540 0 + 4040 -4541 0 + -4040 4541 0 + 4040 -4542 0 + -4040 4542 0 + 4040 -4543 0 + -4040 4543 0 + 4040 -4544 0 + -4040 4544 0 + 4040 -4545 0 + -4040 4545 0 + 4040 -4546 0 + -4040 4546 0 + 4040 -4547 0 + -4040 4547 0 + 4040 -4548 0 + -4040 4548 0 + 4040 -4549 0 + -4040 4549 0 + 4040 -4550 0 + -4040 4550 0 + 4040 -4551 0 + -4040 4551 0 + 4040 -4552 0 + -4040 4552 0 + 4040 -4553 0 + -4040 4553 0 + 4040 -4554 0 + -4040 4554 0 + -3469 4555 0 + 35 -4555 0 + 3469 -4555 0 + -36 -3470 4556 0 + 3470 -4556 0 + -37 -3471 4557 0 + 3471 -4557 0 + -38 -3472 4558 0 + 3472 -4558 0 + -39 -3473 4559 0 + 3473 -4559 0 + -40 -3474 4560 0 + 3474 -4560 0 + -41 -3475 4561 0 + 3475 -4561 0 + -42 -3476 4562 0 + 3476 -4562 0 + -43 -3477 4563 0 + 3477 -4563 0 + -44 -3478 4564 0 + 3478 -4564 0 + -45 -3479 4565 0 + 3479 -4565 0 + -46 -3480 4566 0 + 3480 -4566 0 + -47 -3481 4567 0 + 3481 -4567 0 + -48 -3482 4568 0 + 3482 -4568 0 + -49 -3483 4569 0 + 3483 -4569 0 + -50 -3484 4570 0 + 3484 -4570 0 + -51 -3485 4571 0 + 3485 -4571 0 + -52 -3486 4572 0 + 3486 -4572 0 + -53 -3487 4573 0 + 3487 -4573 0 + -54 -3488 4574 0 + 3488 -4574 0 + -55 -3489 4575 0 + 3489 -4575 0 + -56 -3490 4576 0 + 3490 -4576 0 + -57 -3491 4577 0 + 3491 -4577 0 + -58 -3492 4578 0 + 3492 -4578 0 + -59 -3493 4579 0 + 3493 -4579 0 + -60 -3494 4580 0 + 3494 -4580 0 + -61 -3495 4581 0 + 3495 -4581 0 + -62 -3496 4582 0 + 3496 -4582 0 + -63 -3497 4583 0 + 3497 -4583 0 + -64 -3498 4584 0 + 3498 -4584 0 + -65 -3499 4585 0 + 3499 -4585 0 + -66 -3500 4586 0 + 3500 -4586 0 + 4555 4619 0 + 35 -4555 4619 0 + 35 4555 -4619 0 + -4555 -4619 0 + -4555 4621 0 + 35 -4621 0 + 4555 -4621 0 + -2 -4619 4620 0 + 4619 -4620 0 + 4621 -4622 0 + -4620 4622 0 + -4621 4622 0 + 4587 -4619 0 + -2 4587 4619 0 + -4587 4619 0 + -2 -4587 -4619 0 + -36 4623 0 + -4556 4623 0 + -36 -4556 -4623 0 + -36 -4556 4625 0 + -4622 -4623 4624 0 + 4622 -4624 0 + 4588 4622 -4623 0 + 4588 -4622 0 + -4588 4622 0 + -4588 -4622 -4623 0 + -37 4627 0 + -4557 4627 0 + -37 -4557 -4627 0 + -37 -4557 4629 0 + -4626 -4627 4628 0 + 4589 -4627 0 + 4589 -4626 0 + -4589 -4626 -4627 0 + -38 4631 0 + -4558 4631 0 + -38 -4558 -4631 0 + -38 -4558 4633 0 + -4630 -4631 4632 0 + 4590 -4631 0 + 4590 -4630 0 + -4590 -4630 -4631 0 + -39 4635 0 + -4559 4635 0 + -39 -4559 -4635 0 + -39 -4559 4637 0 + -4634 -4635 4636 0 + 4591 -4635 0 + 4591 -4634 0 + -4591 -4634 -4635 0 + -40 4639 0 + -4560 4639 0 + -40 -4560 -4639 0 + -40 -4560 4641 0 + -4638 -4639 4640 0 + 4592 -4639 0 + 4592 -4638 0 + -4592 -4638 -4639 0 + -41 4643 0 + -4561 4643 0 + -41 -4561 -4643 0 + -41 -4561 4645 0 + -4642 -4643 4644 0 + 4593 -4643 0 + 4593 -4642 0 + -4593 -4642 -4643 0 + -42 4647 0 + -4562 4647 0 + -42 -4562 -4647 0 + -42 -4562 4649 0 + -4646 -4647 4648 0 + 4594 -4647 0 + 4594 -4646 0 + -4594 -4646 -4647 0 + -43 4651 0 + -4563 4651 0 + -43 -4563 -4651 0 + -43 -4563 4653 0 + -4650 -4651 4652 0 + 4595 -4651 0 + 4595 -4650 0 + -4595 -4650 -4651 0 + -44 4655 0 + -4564 4655 0 + -44 -4564 -4655 0 + -44 -4564 4657 0 + -4654 -4655 4656 0 + 4596 -4655 0 + 4596 -4654 0 + -4596 -4654 -4655 0 + -45 4659 0 + -4565 4659 0 + -45 -4565 -4659 0 + -45 -4565 4661 0 + -4658 -4659 4660 0 + 4597 -4659 0 + 4597 -4658 0 + -4597 -4658 -4659 0 + -46 4663 0 + -4566 4663 0 + -46 -4566 -4663 0 + -46 -4566 4665 0 + -4662 -4663 4664 0 + 4598 -4663 0 + 4598 -4662 0 + -4598 -4662 -4663 0 + -47 4667 0 + -4567 4667 0 + -47 -4567 -4667 0 + -47 -4567 4669 0 + -4666 -4667 4668 0 + 4599 -4667 0 + 4599 -4666 0 + -4599 -4666 -4667 0 + -48 4671 0 + -4568 4671 0 + -48 -4568 -4671 0 + -48 -4568 4673 0 + -4670 -4671 4672 0 + 4600 -4671 0 + 4600 -4670 0 + -4600 -4670 -4671 0 + -49 4675 0 + -4569 4675 0 + -49 -4569 -4675 0 + -49 -4569 4677 0 + -4674 -4675 4676 0 + 4601 -4675 0 + 4601 -4674 0 + -4601 -4674 -4675 0 + -50 4679 0 + -4570 4679 0 + -50 -4570 -4679 0 + -50 -4570 4681 0 + -4678 -4679 4680 0 + 4602 -4679 0 + 4602 -4678 0 + -4602 -4678 -4679 0 + -51 4683 0 + -4571 4683 0 + -51 -4571 -4683 0 + -51 -4571 4685 0 + -4682 -4683 4684 0 + 4603 -4683 0 + 4603 -4682 0 + -4603 -4682 -4683 0 + -52 4687 0 + -4572 4687 0 + -52 -4572 -4687 0 + -52 -4572 4689 0 + -4686 -4687 4688 0 + 4604 -4687 0 + 4604 -4686 0 + -4604 -4686 -4687 0 + -53 4691 0 + -4573 4691 0 + -53 -4573 -4691 0 + -53 -4573 4693 0 + -4690 -4691 4692 0 + 4605 -4691 0 + 4605 -4690 0 + -4605 -4690 -4691 0 + -54 4695 0 + -4574 4695 0 + -54 -4574 -4695 0 + -54 -4574 4697 0 + -4694 -4695 4696 0 + 4606 -4695 0 + 4606 -4694 0 + -4606 -4694 -4695 0 + -55 4699 0 + -4575 4699 0 + -55 -4575 -4699 0 + -55 -4575 4701 0 + -4698 -4699 4700 0 + 4607 -4699 0 + 4607 -4698 0 + -4607 -4698 -4699 0 + -56 4703 0 + -4576 4703 0 + -56 -4576 -4703 0 + -56 -4576 4705 0 + -4702 -4703 4704 0 + 4608 -4703 0 + 4608 -4702 0 + -4608 -4702 -4703 0 + -57 4707 0 + -4577 4707 0 + -57 -4577 -4707 0 + -57 -4577 4709 0 + -4706 -4707 4708 0 + 4609 -4707 0 + 4609 -4706 0 + -4609 -4706 -4707 0 + -58 4711 0 + -4578 4711 0 + -58 -4578 -4711 0 + -58 -4578 4713 0 + -4710 -4711 4712 0 + 4610 -4711 0 + 4610 -4710 0 + -4610 -4710 -4711 0 + -59 4715 0 + -4579 4715 0 + -59 -4579 -4715 0 + -59 -4579 4717 0 + -4714 -4715 4716 0 + 4611 -4715 0 + 4611 -4714 0 + -4611 -4714 -4715 0 + -60 4719 0 + -4580 4719 0 + -60 -4580 -4719 0 + -60 -4580 4721 0 + -4718 -4719 4720 0 + 4612 -4719 0 + 4612 -4718 0 + -4612 -4718 -4719 0 + -61 4723 0 + -4581 4723 0 + -61 -4581 -4723 0 + -61 -4581 4725 0 + -4722 -4723 4724 0 + 4613 -4723 0 + 4613 -4722 0 + -4613 -4722 -4723 0 + -62 4727 0 + -4582 4727 0 + -62 -4582 -4727 0 + -62 -4582 4729 0 + -4726 -4727 4728 0 + 4614 -4727 0 + 4614 -4726 0 + -4614 -4726 -4727 0 + -63 4731 0 + -4583 4731 0 + -63 -4583 -4731 0 + -63 -4583 4733 0 + -4730 -4731 4732 0 + 4615 -4731 0 + 4615 -4730 0 + -4615 -4730 -4731 0 + -64 4735 0 + -4584 4735 0 + -64 -4584 -4735 0 + -64 -4584 4737 0 + -4734 -4735 4736 0 + 4616 -4735 0 + 4616 -4734 0 + -4616 -4734 -4735 0 + -65 4739 0 + -4585 4739 0 + -65 -4585 -4739 0 + -65 -4585 4741 0 + -4738 -4739 4740 0 + 4617 -4739 0 + 4617 -4738 0 + -4617 -4738 -4739 0 + -66 4743 0 + -4586 4743 0 + -66 -4586 -4743 0 + -66 -4586 4745 0 + -4742 -4743 4744 0 + 4618 -4743 0 + 4618 -4742 0 + -4618 -4742 -4743 0 + 4386 4587 4748 0 + -4386 -4587 4748 0 + 4386 -4587 -4748 0 + -4386 4587 -4748 0 + 4387 4588 4749 0 + -4387 -4588 4749 0 + 4387 -4588 -4749 0 + -4387 4588 -4749 0 + 4388 4750 0 + -4388 -4589 4750 0 + 4388 -4589 -4750 0 + -4388 -4750 0 + 4389 4751 0 + -4389 -4590 4751 0 + 4389 -4590 -4751 0 + -4389 -4751 0 + 4390 4752 0 + -4390 -4591 4752 0 + 4390 -4591 -4752 0 + -4390 -4752 0 + 4391 4753 0 + -4391 -4592 4753 0 + 4391 -4592 -4753 0 + -4391 -4753 0 + 4392 4754 0 + -4392 -4593 4754 0 + 4392 -4593 -4754 0 + -4392 -4754 0 + 4393 4755 0 + -4393 -4594 4755 0 + 4393 -4594 -4755 0 + -4393 -4755 0 + 4394 4756 0 + -4394 -4595 4756 0 + 4394 -4595 -4756 0 + -4394 -4756 0 + 4395 4757 0 + -4395 -4596 4757 0 + 4395 -4596 -4757 0 + -4395 -4757 0 + 4396 4758 0 + -4396 -4597 4758 0 + 4396 -4597 -4758 0 + -4396 -4758 0 + 4397 4759 0 + -4397 -4598 4759 0 + 4397 -4598 -4759 0 + -4397 -4759 0 + 4398 4760 0 + -4398 -4599 4760 0 + 4398 -4599 -4760 0 + -4398 -4760 0 + 4399 4761 0 + -4399 -4600 4761 0 + 4399 -4600 -4761 0 + -4399 -4761 0 + 4400 4762 0 + -4400 -4601 4762 0 + 4400 -4601 -4762 0 + -4400 -4762 0 + 4401 4763 0 + -4401 -4602 4763 0 + 4401 -4602 -4763 0 + -4401 -4763 0 + 4402 4764 0 + -4402 -4603 4764 0 + 4402 -4603 -4764 0 + -4402 -4764 0 + 4403 4765 0 + -4403 -4604 4765 0 + 4403 -4604 -4765 0 + -4403 -4765 0 + 4404 4766 0 + -4404 -4605 4766 0 + 4404 -4605 -4766 0 + -4404 -4766 0 + 4405 4767 0 + -4405 -4606 4767 0 + 4405 -4606 -4767 0 + -4405 -4767 0 + 4406 4768 0 + -4406 -4607 4768 0 + 4406 -4607 -4768 0 + -4406 -4768 0 + 4407 4769 0 + -4407 -4608 4769 0 + 4407 -4608 -4769 0 + -4407 -4769 0 + 4408 4770 0 + -4408 -4609 4770 0 + 4408 -4609 -4770 0 + -4408 -4770 0 + 4409 4771 0 + -4409 -4610 4771 0 + 4409 -4610 -4771 0 + -4409 -4771 0 + 4410 4772 0 + -4410 -4611 4772 0 + 4410 -4611 -4772 0 + -4410 -4772 0 + 4411 4773 0 + -4411 -4612 4773 0 + 4411 -4612 -4773 0 + -4411 -4773 0 + 4412 4774 0 + -4412 -4613 4774 0 + 4412 -4613 -4774 0 + -4412 -4774 0 + 4413 4775 0 + -4413 -4614 4775 0 + 4413 -4614 -4775 0 + -4413 -4775 0 + 4414 4776 0 + -4414 -4615 4776 0 + 4414 -4615 -4776 0 + -4414 -4776 0 + 4415 4777 0 + -4415 -4616 4777 0 + 4415 -4616 -4777 0 + -4415 -4777 0 + 4416 4778 0 + -4416 -4617 4778 0 + 4416 -4617 -4778 0 + -4416 -4778 0 + 4417 4779 0 + -4417 -4618 4779 0 + 4417 -4618 -4779 0 + -4417 -4779 0 + -4748 4780 0 + 1 -4780 0 + 4748 -4780 0 + -4749 -4780 4781 0 + 4780 -4781 0 + 4749 -4781 0 + -4750 -4781 4782 0 + 4781 -4782 0 + 4750 -4782 0 + -4751 -4782 4783 0 + 4782 -4783 0 + 4751 -4783 0 + -4752 -4783 4784 0 + 4783 -4784 0 + 4752 -4784 0 + -4753 -4784 4785 0 + 4784 -4785 0 + 4753 -4785 0 + -4754 -4785 4786 0 + 4785 -4786 0 + 4754 -4786 0 + -4755 -4786 4787 0 + 4786 -4787 0 + 4755 -4787 0 + -4756 -4787 4788 0 + 4787 -4788 0 + 4756 -4788 0 + -4757 -4788 4789 0 + 4788 -4789 0 + 4757 -4789 0 + -4758 -4789 4790 0 + 4789 -4790 0 + 4758 -4790 0 + -4759 -4790 4791 0 + 4790 -4791 0 + 4759 -4791 0 + -4760 -4791 4792 0 + 4791 -4792 0 + 4760 -4792 0 + -4761 -4792 4793 0 + 4792 -4793 0 + 4761 -4793 0 + -4762 -4793 4794 0 + 4793 -4794 0 + 4762 -4794 0 + -4763 -4794 4795 0 + 4794 -4795 0 + 4763 -4795 0 + -4764 -4795 4796 0 + 4795 -4796 0 + 4764 -4796 0 + -4765 -4796 4797 0 + 4796 -4797 0 + 4765 -4797 0 + -4766 -4797 4798 0 + 4797 -4798 0 + 4766 -4798 0 + -4767 -4798 4799 0 + 4798 -4799 0 + 4767 -4799 0 + -4768 -4799 4800 0 + 4799 -4800 0 + 4768 -4800 0 + -4769 -4800 4801 0 + 4800 -4801 0 + 4769 -4801 0 + -4770 -4801 4802 0 + 4801 -4802 0 + 4770 -4802 0 + -4771 -4802 4803 0 + 4802 -4803 0 + 4771 -4803 0 + -4772 -4803 4804 0 + 4803 -4804 0 + 4772 -4804 0 + -4773 -4804 4805 0 + 4804 -4805 0 + 4773 -4805 0 + -4774 -4805 4806 0 + 4805 -4806 0 + 4774 -4806 0 + -4775 -4806 4807 0 + 4806 -4807 0 + 4775 -4807 0 + -4776 -4807 4808 0 + 4807 -4808 0 + 4776 -4808 0 + -4777 -4808 4809 0 + 4808 -4809 0 + 4777 -4809 0 + -4778 -4809 4810 0 + 4809 -4810 0 + 4778 -4810 0 + -4779 -4810 4811 0 + 4810 -4811 0 + 4779 -4811 0 + -4747 4811 0 + 4747 -4811 0 + 4322 4812 0 + 2698 -4322 4812 0 + 2698 4322 -4812 0 + -4322 -4812 0 + 4323 4813 0 + 2699 -4323 4813 0 + 2699 4323 -4813 0 + -4323 -4813 0 + 4324 4814 0 + 2700 -4324 4814 0 + 2700 4324 -4814 0 + -4324 -4814 0 + 4325 4815 0 + 2701 -4325 4815 0 + 2701 4325 -4815 0 + -4325 -4815 0 + 4326 4816 0 + 2702 -4326 4816 0 + 2702 4326 -4816 0 + -4326 -4816 0 + 4327 4817 0 + 2703 -4327 4817 0 + 2703 4327 -4817 0 + -4327 -4817 0 + 4328 4818 0 + 2704 -4328 4818 0 + 2704 4328 -4818 0 + -4328 -4818 0 + 4329 4819 0 + 2705 -4329 4819 0 + 2705 4329 -4819 0 + -4329 -4819 0 + 4330 4820 0 + 2706 -4330 4820 0 + 2706 4330 -4820 0 + -4330 -4820 0 + 4331 4821 0 + 2707 -4331 4821 0 + 2707 4331 -4821 0 + -4331 -4821 0 + 4332 4822 0 + 2708 -4332 4822 0 + 2708 4332 -4822 0 + -4332 -4822 0 + 4333 4823 0 + 2709 -4333 4823 0 + 2709 4333 -4823 0 + -4333 -4823 0 + 4334 4824 0 + 2710 -4334 4824 0 + 2710 4334 -4824 0 + -4334 -4824 0 + 4335 4825 0 + 2711 -4335 4825 0 + 2711 4335 -4825 0 + -4335 -4825 0 + 4336 4826 0 + 2712 -4336 4826 0 + 2712 4336 -4826 0 + -4336 -4826 0 + 4337 4827 0 + 2713 -4337 4827 0 + 2713 4337 -4827 0 + -4337 -4827 0 + 4338 4828 0 + 2714 -4338 4828 0 + 2714 4338 -4828 0 + -4338 -4828 0 + 4339 4829 0 + 2715 -4339 4829 0 + 2715 4339 -4829 0 + -4339 -4829 0 + 4340 4830 0 + 2716 -4340 4830 0 + 2716 4340 -4830 0 + -4340 -4830 0 + 4341 4831 0 + 2717 -4341 4831 0 + 2717 4341 -4831 0 + -4341 -4831 0 + 4342 4832 0 + 2718 -4342 4832 0 + 2718 4342 -4832 0 + -4342 -4832 0 + 4343 4833 0 + 2719 -4343 4833 0 + 2719 4343 -4833 0 + -4343 -4833 0 + 4344 4834 0 + 2720 -4344 4834 0 + 2720 4344 -4834 0 + -4344 -4834 0 + 4345 4835 0 + 2721 -4345 4835 0 + 2721 4345 -4835 0 + -4345 -4835 0 + 4346 4836 0 + 2722 -4346 4836 0 + 2722 4346 -4836 0 + -4346 -4836 0 + 4347 4837 0 + 2723 -4347 4837 0 + 2723 4347 -4837 0 + -4347 -4837 0 + 4348 4838 0 + 2724 -4348 4838 0 + 2724 4348 -4838 0 + -4348 -4838 0 + 4349 4839 0 + 2725 -4349 4839 0 + 2725 4349 -4839 0 + -4349 -4839 0 + 4350 4840 0 + 2726 -4350 4840 0 + 2726 4350 -4840 0 + -4350 -4840 0 + 4351 4841 0 + 2727 -4351 4841 0 + 2727 4351 -4841 0 + -4351 -4841 0 + 4352 4842 0 + 2728 -4352 4842 0 + 2728 4352 -4842 0 + -4352 -4842 0 + 4353 4843 0 + 2729 -4353 4843 0 + 2729 4353 -4843 0 + -4353 -4843 0 + 4812 -4844 0 + -4812 4844 0 + 4813 -4845 0 + -4813 4845 0 + 4814 -4846 0 + -4814 4846 0 + 4815 -4847 0 + -4815 4847 0 + 4816 -4848 0 + -4816 4848 0 + 4817 -4849 0 + -4817 4849 0 + 4818 -4850 0 + -4818 4850 0 + 4819 -4851 0 + -4819 4851 0 + 4820 -4852 0 + -4820 4852 0 + 4821 -4853 0 + -4821 4853 0 + 4822 -4854 0 + -4822 4854 0 + 4823 -4855 0 + -4823 4855 0 + 4824 -4856 0 + -4824 4856 0 + 4825 -4857 0 + -4825 4857 0 + 4826 -4858 0 + -4826 4858 0 + 4827 -4859 0 + -4827 4859 0 + 4828 -4860 0 + -4828 4860 0 + 4829 -4861 0 + -4829 4861 0 + 4830 -4862 0 + -4830 4862 0 + 4831 -4863 0 + -4831 4863 0 + 4832 -4864 0 + -4832 4864 0 + 4833 -4865 0 + -4833 4865 0 + 4834 -4866 0 + -4834 4866 0 + 4835 -4867 0 + -4835 4867 0 + 4836 -4868 0 + -4836 4868 0 + 4837 -4869 0 + -4837 4869 0 + 4838 -4870 0 + -4838 4870 0 + 4839 -4871 0 + -4839 4871 0 + 4840 -4872 0 + -4840 4872 0 + 4841 -4873 0 + -4841 4873 0 + 4842 -4874 0 + -4842 4874 0 + 4843 -4875 0 + -4843 4875 0 + 4843 -4876 0 + -4843 4876 0 + 4843 -4877 0 + -4843 4877 0 + 4843 -4878 0 + -4843 4878 0 + 4843 -4879 0 + -4843 4879 0 + 4843 -4880 0 + -4843 4880 0 + 4843 -4881 0 + -4843 4881 0 + 4843 -4882 0 + -4843 4882 0 + 4843 -4883 0 + -4843 4883 0 + 4843 -4884 0 + -4843 4884 0 + 4843 -4885 0 + -4843 4885 0 + 4843 -4886 0 + -4843 4886 0 + 4843 -4887 0 + -4843 4887 0 + 4843 -4888 0 + -4843 4888 0 + 4843 -4889 0 + -4843 4889 0 + 4843 -4890 0 + -4843 4890 0 + 4843 -4891 0 + -4843 4891 0 + 4843 -4892 0 + -4843 4892 0 + 4843 -4893 0 + -4843 4893 0 + 4843 -4894 0 + -4843 4894 0 + 4843 -4895 0 + -4843 4895 0 + 4843 -4896 0 + -4843 4896 0 + 4843 -4897 0 + -4843 4897 0 + 4843 -4898 0 + -4843 4898 0 + 4843 -4899 0 + -4843 4899 0 + 4843 -4900 0 + -4843 4900 0 + 4843 -4901 0 + -4843 4901 0 + 4843 -4902 0 + -4843 4902 0 + 4843 -4903 0 + -4843 4903 0 + 4843 -4904 0 + -4843 4904 0 + 4843 -4905 0 + -4843 4905 0 + 4843 -4906 0 + -4843 4906 0 + 4843 -4907 0 + -4843 4907 0 + 4972 5108 0 + -4972 -5108 0 + -5108 5109 0 + 4908 -5109 0 + 5108 -5109 0 + -2 -4972 5110 0 + 4972 -5110 0 + -5044 5109 0 + 5044 -5109 0 + 5044 -5110 0 + 4972 5111 0 + -4972 -5111 0 + -4909 -5111 5112 0 + 5111 -5112 0 + -4972 5113 0 + 4908 -5113 0 + 4972 -5113 0 + -5045 5113 0 + 5045 -5112 0 + 5045 -5113 0 + 4972 5114 0 + -4972 -5114 0 + -4910 -5114 5115 0 + 5114 -5115 0 + -4909 -4972 5116 0 + 4972 -5116 0 + 4972 5117 0 + -4972 -5117 0 + -4911 -5117 5118 0 + 5117 -5118 0 + -4910 -4972 5119 0 + 4972 -5119 0 + 4972 5120 0 + -4972 -5120 0 + -4912 -5120 5121 0 + 5120 -5121 0 + -4911 -4972 5122 0 + 4972 -5122 0 + 4972 5123 0 + -4972 -5123 0 + -4913 -5123 5124 0 + 5123 -5124 0 + -4912 -4972 5125 0 + 4972 -5125 0 + 4972 5126 0 + -4972 -5126 0 + -4914 -5126 5127 0 + 5126 -5127 0 + -4913 -4972 5128 0 + 4972 -5128 0 + 4972 5129 0 + -4972 -5129 0 + -4915 -5129 5130 0 + 5129 -5130 0 + -4914 -4972 5131 0 + 4972 -5131 0 + 4972 5132 0 + -4972 -5132 0 + -4916 -5132 5133 0 + 5132 -5133 0 + -4915 -4972 5134 0 + 4972 -5134 0 + 4972 5135 0 + -4972 -5135 0 + -4917 -5135 5136 0 + 5135 -5136 0 + -4916 -4972 5137 0 + 4972 -5137 0 + 4972 5138 0 + -4972 -5138 0 + -4918 -5138 5139 0 + 5138 -5139 0 + -4917 -4972 5140 0 + 4972 -5140 0 + 4972 5141 0 + -4972 -5141 0 + -4919 -5141 5142 0 + 5141 -5142 0 + -4918 -4972 5143 0 + 4972 -5143 0 + 4972 5144 0 + -4972 -5144 0 + -4920 -5144 5145 0 + 5144 -5145 0 + -4919 -4972 5146 0 + 4972 -5146 0 + 4972 5147 0 + -4972 -5147 0 + -4921 -5147 5148 0 + 5147 -5148 0 + -4920 -4972 5149 0 + 4972 -5149 0 + 4972 5150 0 + -4972 -5150 0 + -4922 -5150 5151 0 + 5150 -5151 0 + -4921 -4972 5152 0 + 4972 -5152 0 + 4972 5153 0 + -4972 -5153 0 + -4923 -5153 5154 0 + 5153 -5154 0 + -4922 -4972 5155 0 + 4972 -5155 0 + 4972 5156 0 + -4972 -5156 0 + -4924 -5156 5157 0 + 5156 -5157 0 + -4923 -4972 5158 0 + 4972 -5158 0 + 4972 5159 0 + -4972 -5159 0 + -4925 -5159 5160 0 + 5159 -5160 0 + -4924 -4972 5161 0 + 4972 -5161 0 + 4972 5162 0 + -4972 -5162 0 + -4926 -5162 5163 0 + 5162 -5163 0 + -4925 -4972 5164 0 + 4972 -5164 0 + 4972 5165 0 + -4972 -5165 0 + -4927 -5165 5166 0 + 5165 -5166 0 + -4926 -4972 5167 0 + 4972 -5167 0 + 4972 5168 0 + -4972 -5168 0 + -4928 -5168 5169 0 + 5168 -5169 0 + -4927 -4972 5170 0 + 4972 -5170 0 + 4972 5171 0 + -4972 -5171 0 + -4929 -5171 5172 0 + 5171 -5172 0 + -4928 -4972 5173 0 + 4972 -5173 0 + 4972 5174 0 + -4972 -5174 0 + -4930 -5174 5175 0 + 5174 -5175 0 + -4929 -4972 5176 0 + 4972 -5176 0 + 4972 5177 0 + -4972 -5177 0 + -4931 -5177 5178 0 + 5177 -5178 0 + -4930 -4972 5179 0 + 4972 -5179 0 + 4972 5180 0 + -4972 -5180 0 + -4932 -5180 5181 0 + 5180 -5181 0 + -4931 -4972 5182 0 + 4972 -5182 0 + 4972 5183 0 + -4972 -5183 0 + -4933 -5183 5184 0 + 5183 -5184 0 + -4932 -4972 5185 0 + 4972 -5185 0 + 4972 5186 0 + -4972 -5186 0 + -4934 -5186 5187 0 + 5186 -5187 0 + -4933 -4972 5188 0 + 4972 -5188 0 + 4972 5189 0 + -4972 -5189 0 + -4935 -5189 5190 0 + 5189 -5190 0 + -4934 -4972 5191 0 + 4972 -5191 0 + 4972 5192 0 + -4972 -5192 0 + -4936 -5192 5193 0 + 5192 -5193 0 + -4935 -4972 5194 0 + 4972 -5194 0 + 4972 5195 0 + -4972 -5195 0 + -4937 -5195 5196 0 + 5195 -5196 0 + -4936 -4972 5197 0 + 4972 -5197 0 + 4972 5198 0 + -4972 -5198 0 + -4938 -5198 5199 0 + 5198 -5199 0 + -4937 -4972 5200 0 + 4972 -5200 0 + 4972 5201 0 + -4972 -5201 0 + -4939 -5201 5202 0 + 5201 -5202 0 + -4938 -4972 5203 0 + 4972 -5203 0 + 4972 5204 0 + -4972 -5204 0 + -4940 -5204 5205 0 + 5204 -5205 0 + -4939 -4972 5206 0 + 4972 -5206 0 + 4972 5207 0 + -4972 -5207 0 + -4941 -5207 5208 0 + 5207 -5208 0 + -4940 -4972 5209 0 + 4972 -5209 0 + 4972 5210 0 + -4972 -5210 0 + -4942 -5210 5211 0 + 5210 -5211 0 + -4941 -4972 5212 0 + 4972 -5212 0 + 4972 5213 0 + -4972 -5213 0 + -4943 -5213 5214 0 + 5213 -5214 0 + -4942 -4972 5215 0 + 4972 -5215 0 + 4972 5216 0 + -4972 -5216 0 + -4944 -5216 5217 0 + 5216 -5217 0 + -4943 -4972 5218 0 + 4972 -5218 0 + 4972 5219 0 + -4972 -5219 0 + -4945 -5219 5220 0 + 5219 -5220 0 + -4944 -4972 5221 0 + 4972 -5221 0 + 4972 5222 0 + -4972 -5222 0 + -4946 -5222 5223 0 + 5222 -5223 0 + -4945 -4972 5224 0 + 4972 -5224 0 + 4972 5225 0 + -4972 -5225 0 + -4947 -5225 5226 0 + 5225 -5226 0 + -4946 -4972 5227 0 + 4972 -5227 0 + 4972 5228 0 + -4972 -5228 0 + -4948 -5228 5229 0 + 5228 -5229 0 + -4947 -4972 5230 0 + 4972 -5230 0 + 4972 5231 0 + -4972 -5231 0 + -4949 -5231 5232 0 + 5231 -5232 0 + -4948 -4972 5233 0 + 4972 -5233 0 + 4972 5234 0 + -4972 -5234 0 + -4950 -5234 5235 0 + 5234 -5235 0 + -4949 -4972 5236 0 + 4972 -5236 0 + 4972 5237 0 + -4972 -5237 0 + -4951 -5237 5238 0 + 5237 -5238 0 + -4950 -4972 5239 0 + 4972 -5239 0 + 4972 5240 0 + -4972 -5240 0 + -4952 -5240 5241 0 + 5240 -5241 0 + -4951 -4972 5242 0 + 4972 -5242 0 + 4972 5243 0 + -4972 -5243 0 + -4953 -5243 5244 0 + 5243 -5244 0 + -4952 -4972 5245 0 + 4972 -5245 0 + 4972 5246 0 + -4972 -5246 0 + -4954 -5246 5247 0 + 5246 -5247 0 + -4953 -4972 5248 0 + 4972 -5248 0 + 4972 5249 0 + -4972 -5249 0 + -4955 -5249 5250 0 + 5249 -5250 0 + -4954 -4972 5251 0 + 4972 -5251 0 + 4972 5252 0 + -4972 -5252 0 + -4956 -5252 5253 0 + 5252 -5253 0 + -4955 -4972 5254 0 + 4972 -5254 0 + 4972 5255 0 + -4972 -5255 0 + -4957 -5255 5256 0 + 5255 -5256 0 + -4956 -4972 5257 0 + 4972 -5257 0 + 4972 5258 0 + -4972 -5258 0 + -4958 -5258 5259 0 + 5258 -5259 0 + -4957 -4972 5260 0 + 4972 -5260 0 + 4972 5261 0 + -4972 -5261 0 + -4959 -5261 5262 0 + 5261 -5262 0 + -4958 -4972 5263 0 + 4972 -5263 0 + 4972 5264 0 + -4972 -5264 0 + -4960 -5264 5265 0 + 5264 -5265 0 + -4959 -4972 5266 0 + 4972 -5266 0 + 4972 5267 0 + -4972 -5267 0 + -4961 -5267 5268 0 + 5267 -5268 0 + -4960 -4972 5269 0 + 4972 -5269 0 + 4972 5270 0 + -4972 -5270 0 + -4962 -5270 5271 0 + 5270 -5271 0 + -4961 -4972 5272 0 + 4972 -5272 0 + 4972 5273 0 + -4972 -5273 0 + -4963 -5273 5274 0 + 5273 -5274 0 + -4962 -4972 5275 0 + 4972 -5275 0 + 4972 5276 0 + -4972 -5276 0 + -4964 -5276 5277 0 + 5276 -5277 0 + -4963 -4972 5278 0 + 4972 -5278 0 + 4972 5279 0 + -4972 -5279 0 + -4965 -5279 5280 0 + 5279 -5280 0 + -4964 -4972 5281 0 + 4972 -5281 0 + 4972 5282 0 + -4972 -5282 0 + -4966 -5282 5283 0 + 5282 -5283 0 + -4965 -4972 5284 0 + 4972 -5284 0 + 4972 5285 0 + -4972 -5285 0 + -4967 -5285 5286 0 + 5285 -5286 0 + -4966 -4972 5287 0 + 4972 -5287 0 + 4972 5288 0 + -4972 -5288 0 + -4968 -5288 5289 0 + 5288 -5289 0 + -4967 -4972 5290 0 + 4972 -5290 0 + 4972 5291 0 + -4972 -5291 0 + -4969 -5291 5292 0 + 5291 -5292 0 + -4968 -4972 5293 0 + 4972 -5293 0 + 4972 5294 0 + -4972 -5294 0 + -4970 -5294 5295 0 + 5294 -5295 0 + -4969 -4972 5296 0 + 4972 -5296 0 + 4972 5297 0 + -4972 -5297 0 + -4971 -5297 5298 0 + 5297 -5298 0 + -4970 -4972 5299 0 + 4972 -5299 0 + 4973 5364 0 + -4973 -5364 0 + -5044 -5364 5365 0 + 5044 -5365 0 + 5364 -5365 0 + -2 -4973 5366 0 + 4973 -5366 0 + -5300 5365 0 + 5300 -5365 0 + 5300 -5366 0 + 4973 5367 0 + -4973 -5367 0 + -5045 -5367 5368 0 + 5045 -5368 0 + 5367 -5368 0 + -2 -4973 5369 0 + 4973 -5369 0 + -5301 5368 0 + 5301 -5368 0 + 5301 -5369 0 + 4973 5370 0 + -4973 -5370 0 + -5046 -5370 5371 0 + 5370 -5371 0 + -4973 -5044 5372 0 + 5044 -5372 0 + 4973 -5372 0 + -5302 5372 0 + 5302 -5371 0 + 5302 -5372 0 + 4973 5373 0 + -4973 -5373 0 + -5047 -5373 5374 0 + 5373 -5374 0 + -4973 -5045 5375 0 + 5045 -5375 0 + 4973 -5375 0 + -5303 5375 0 + 5303 -5374 0 + 5303 -5375 0 + 4973 5376 0 + -4973 -5376 0 + -5048 -5376 5377 0 + 5376 -5377 0 + -4973 -5046 5378 0 + 4973 -5378 0 + 4973 5379 0 + -4973 -5379 0 + -5049 -5379 5380 0 + 5379 -5380 0 + -4973 -5047 5381 0 + 4973 -5381 0 + 4973 5382 0 + -4973 -5382 0 + -5050 -5382 5383 0 + 5382 -5383 0 + -4973 -5048 5384 0 + 4973 -5384 0 + 4973 5385 0 + -4973 -5385 0 + -5051 -5385 5386 0 + 5385 -5386 0 + -4973 -5049 5387 0 + 4973 -5387 0 + 4973 5388 0 + -4973 -5388 0 + -5052 -5388 5389 0 + 5388 -5389 0 + -4973 -5050 5390 0 + 4973 -5390 0 + 4973 5391 0 + -4973 -5391 0 + -5053 -5391 5392 0 + 5391 -5392 0 + -4973 -5051 5393 0 + 4973 -5393 0 + 4973 5394 0 + -4973 -5394 0 + -5054 -5394 5395 0 + 5394 -5395 0 + -4973 -5052 5396 0 + 4973 -5396 0 + 4973 5397 0 + -4973 -5397 0 + -5055 -5397 5398 0 + 5397 -5398 0 + -4973 -5053 5399 0 + 4973 -5399 0 + 4973 5400 0 + -4973 -5400 0 + -5056 -5400 5401 0 + 5400 -5401 0 + -4973 -5054 5402 0 + 4973 -5402 0 + 4973 5403 0 + -4973 -5403 0 + -5057 -5403 5404 0 + 5403 -5404 0 + -4973 -5055 5405 0 + 4973 -5405 0 + 4973 5406 0 + -4973 -5406 0 + -5058 -5406 5407 0 + 5406 -5407 0 + -4973 -5056 5408 0 + 4973 -5408 0 + 4973 5409 0 + -4973 -5409 0 + -5059 -5409 5410 0 + 5409 -5410 0 + -4973 -5057 5411 0 + 4973 -5411 0 + 4973 5412 0 + -4973 -5412 0 + -5060 -5412 5413 0 + 5412 -5413 0 + -4973 -5058 5414 0 + 4973 -5414 0 + 4973 5415 0 + -4973 -5415 0 + -5061 -5415 5416 0 + 5415 -5416 0 + -4973 -5059 5417 0 + 4973 -5417 0 + 4973 5418 0 + -4973 -5418 0 + -5062 -5418 5419 0 + 5418 -5419 0 + -4973 -5060 5420 0 + 4973 -5420 0 + 4973 5421 0 + -4973 -5421 0 + -5063 -5421 5422 0 + 5421 -5422 0 + -4973 -5061 5423 0 + 4973 -5423 0 + 4973 5424 0 + -4973 -5424 0 + -5064 -5424 5425 0 + 5424 -5425 0 + -4973 -5062 5426 0 + 4973 -5426 0 + 4973 5427 0 + -4973 -5427 0 + -5065 -5427 5428 0 + 5427 -5428 0 + -4973 -5063 5429 0 + 4973 -5429 0 + 4973 5430 0 + -4973 -5430 0 + -5066 -5430 5431 0 + 5430 -5431 0 + -4973 -5064 5432 0 + 4973 -5432 0 + 4973 5433 0 + -4973 -5433 0 + -5067 -5433 5434 0 + 5433 -5434 0 + -4973 -5065 5435 0 + 4973 -5435 0 + 4973 5436 0 + -4973 -5436 0 + -5068 -5436 5437 0 + 5436 -5437 0 + -4973 -5066 5438 0 + 4973 -5438 0 + 4973 5439 0 + -4973 -5439 0 + -5069 -5439 5440 0 + 5439 -5440 0 + -4973 -5067 5441 0 + 4973 -5441 0 + 4973 5442 0 + -4973 -5442 0 + -5070 -5442 5443 0 + 5442 -5443 0 + -4973 -5068 5444 0 + 4973 -5444 0 + 4973 5445 0 + -4973 -5445 0 + -5071 -5445 5446 0 + 5445 -5446 0 + -4973 -5069 5447 0 + 4973 -5447 0 + 4973 5448 0 + -4973 -5448 0 + -5072 -5448 5449 0 + 5448 -5449 0 + -4973 -5070 5450 0 + 4973 -5450 0 + 4973 5451 0 + -4973 -5451 0 + -5073 -5451 5452 0 + 5451 -5452 0 + -4973 -5071 5453 0 + 4973 -5453 0 + 4973 5454 0 + -4973 -5454 0 + -5074 -5454 5455 0 + 5454 -5455 0 + -4973 -5072 5456 0 + 4973 -5456 0 + 4973 5457 0 + -4973 -5457 0 + -5075 -5457 5458 0 + 5457 -5458 0 + -4973 -5073 5459 0 + 4973 -5459 0 + 4973 5460 0 + -4973 -5460 0 + -5076 -5460 5461 0 + 5460 -5461 0 + -4973 -5074 5462 0 + 4973 -5462 0 + 4973 5463 0 + -4973 -5463 0 + -5077 -5463 5464 0 + 5463 -5464 0 + -4973 -5075 5465 0 + 4973 -5465 0 + 4973 5466 0 + -4973 -5466 0 + -5078 -5466 5467 0 + 5466 -5467 0 + -4973 -5076 5468 0 + 4973 -5468 0 + 4973 5469 0 + -4973 -5469 0 + -5079 -5469 5470 0 + 5469 -5470 0 + -4973 -5077 5471 0 + 4973 -5471 0 + 4973 5472 0 + -4973 -5472 0 + -5080 -5472 5473 0 + 5472 -5473 0 + -4973 -5078 5474 0 + 4973 -5474 0 + 4973 5475 0 + -4973 -5475 0 + -5081 -5475 5476 0 + 5475 -5476 0 + -4973 -5079 5477 0 + 4973 -5477 0 + 4973 5478 0 + -4973 -5478 0 + -5082 -5478 5479 0 + 5478 -5479 0 + -4973 -5080 5480 0 + 4973 -5480 0 + 4973 5481 0 + -4973 -5481 0 + -5083 -5481 5482 0 + 5481 -5482 0 + -4973 -5081 5483 0 + 4973 -5483 0 + 4973 5484 0 + -4973 -5484 0 + -5084 -5484 5485 0 + 5484 -5485 0 + -4973 -5082 5486 0 + 4973 -5486 0 + 4973 5487 0 + -4973 -5487 0 + -5085 -5487 5488 0 + 5487 -5488 0 + -4973 -5083 5489 0 + 4973 -5489 0 + 4973 5490 0 + -4973 -5490 0 + -5086 -5490 5491 0 + 5490 -5491 0 + -4973 -5084 5492 0 + 4973 -5492 0 + 4973 5493 0 + -4973 -5493 0 + -5087 -5493 5494 0 + 5493 -5494 0 + -4973 -5085 5495 0 + 4973 -5495 0 + 4973 5496 0 + -4973 -5496 0 + -5088 -5496 5497 0 + 5496 -5497 0 + -4973 -5086 5498 0 + 4973 -5498 0 + 4973 5499 0 + -4973 -5499 0 + -5089 -5499 5500 0 + 5499 -5500 0 + -4973 -5087 5501 0 + 4973 -5501 0 + 4973 5502 0 + -4973 -5502 0 + -5090 -5502 5503 0 + 5502 -5503 0 + -4973 -5088 5504 0 + 4973 -5504 0 + 4973 5505 0 + -4973 -5505 0 + -5091 -5505 5506 0 + 5505 -5506 0 + -4973 -5089 5507 0 + 4973 -5507 0 + 4973 5508 0 + -4973 -5508 0 + -5092 -5508 5509 0 + 5508 -5509 0 + -4973 -5090 5510 0 + 4973 -5510 0 + 4973 5511 0 + -4973 -5511 0 + -5093 -5511 5512 0 + 5511 -5512 0 + -4973 -5091 5513 0 + 4973 -5513 0 + 4973 5514 0 + -4973 -5514 0 + -5094 -5514 5515 0 + 5514 -5515 0 + -4973 -5092 5516 0 + 4973 -5516 0 + 4973 5517 0 + -4973 -5517 0 + -5095 -5517 5518 0 + 5517 -5518 0 + -4973 -5093 5519 0 + 4973 -5519 0 + 4973 5520 0 + -4973 -5520 0 + -5096 -5520 5521 0 + 5520 -5521 0 + -4973 -5094 5522 0 + 4973 -5522 0 + 4973 5523 0 + -4973 -5523 0 + -5097 -5523 5524 0 + 5523 -5524 0 + -4973 -5095 5525 0 + 4973 -5525 0 + 4973 5526 0 + -4973 -5526 0 + -5098 -5526 5527 0 + 5526 -5527 0 + -4973 -5096 5528 0 + 4973 -5528 0 + 4973 5529 0 + -4973 -5529 0 + -5099 -5529 5530 0 + 5529 -5530 0 + -4973 -5097 5531 0 + 4973 -5531 0 + 4973 5532 0 + -4973 -5532 0 + -5100 -5532 5533 0 + 5532 -5533 0 + -4973 -5098 5534 0 + 4973 -5534 0 + 4973 5535 0 + -4973 -5535 0 + -5101 -5535 5536 0 + 5535 -5536 0 + -4973 -5099 5537 0 + 4973 -5537 0 + 4973 5538 0 + -4973 -5538 0 + -5102 -5538 5539 0 + 5538 -5539 0 + -4973 -5100 5540 0 + 4973 -5540 0 + 4973 5541 0 + -4973 -5541 0 + -5103 -5541 5542 0 + 5541 -5542 0 + -4973 -5101 5543 0 + 4973 -5543 0 + 4973 5544 0 + -4973 -5544 0 + -5104 -5544 5545 0 + 5544 -5545 0 + -4973 -5102 5546 0 + 4973 -5546 0 + 4973 5547 0 + -4973 -5547 0 + -5105 -5547 5548 0 + 5547 -5548 0 + -4973 -5103 5549 0 + 4973 -5549 0 + 4973 5550 0 + -4973 -5550 0 + -5106 -5550 5551 0 + 5550 -5551 0 + -4973 -5104 5552 0 + 4973 -5552 0 + 4973 5553 0 + -4973 -5553 0 + -5107 -5553 5554 0 + 5553 -5554 0 + -4973 -5105 5555 0 + 4973 -5555 0 + 4974 5620 0 + -4974 -5620 0 + -5300 -5620 5621 0 + 5300 -5621 0 + 5620 -5621 0 + -2 -4974 5622 0 + 4974 -5622 0 + -5556 5621 0 + 5556 -5621 0 + 5556 -5622 0 + 4974 5623 0 + -4974 -5623 0 + -5301 -5623 5624 0 + 5301 -5624 0 + 5623 -5624 0 + -2 -4974 5625 0 + 4974 -5625 0 + -5557 5624 0 + 5557 -5624 0 + 5557 -5625 0 + 4974 5626 0 + -4974 -5626 0 + -5302 -5626 5627 0 + 5302 -5627 0 + 5626 -5627 0 + -2 -4974 5628 0 + 4974 -5628 0 + -5558 5627 0 + 5558 -5627 0 + 5558 -5628 0 + 4974 5629 0 + -4974 -5629 0 + -5303 -5629 5630 0 + 5303 -5630 0 + 5629 -5630 0 + -2 -4974 5631 0 + 4974 -5631 0 + -5559 5630 0 + 5559 -5630 0 + 5559 -5631 0 + 4974 5632 0 + -4974 -5632 0 + -5304 -5632 5633 0 + 5632 -5633 0 + -4974 -5300 5634 0 + 5300 -5634 0 + 4974 -5634 0 + -5560 5634 0 + 5560 -5633 0 + 5560 -5634 0 + 4974 5635 0 + -4974 -5635 0 + -5305 -5635 5636 0 + 5635 -5636 0 + -4974 -5301 5637 0 + 5301 -5637 0 + 4974 -5637 0 + -5561 5637 0 + 5561 -5636 0 + 5561 -5637 0 + 4974 5638 0 + -4974 -5638 0 + -5306 -5638 5639 0 + 5638 -5639 0 + -4974 -5302 5640 0 + 5302 -5640 0 + 4974 -5640 0 + -5562 5640 0 + 5562 -5639 0 + 5562 -5640 0 + 4974 5641 0 + -4974 -5641 0 + -5307 -5641 5642 0 + 5641 -5642 0 + -4974 -5303 5643 0 + 5303 -5643 0 + 4974 -5643 0 + -5563 5643 0 + 5563 -5642 0 + 5563 -5643 0 + 4974 5644 0 + -4974 -5644 0 + -5308 -5644 5645 0 + 5644 -5645 0 + -4974 -5304 5646 0 + 4974 -5646 0 + 4974 5647 0 + -4974 -5647 0 + -5309 -5647 5648 0 + 5647 -5648 0 + -4974 -5305 5649 0 + 4974 -5649 0 + 4974 5650 0 + -4974 -5650 0 + -5310 -5650 5651 0 + 5650 -5651 0 + -4974 -5306 5652 0 + 4974 -5652 0 + 4974 5653 0 + -4974 -5653 0 + -5311 -5653 5654 0 + 5653 -5654 0 + -4974 -5307 5655 0 + 4974 -5655 0 + 4974 5656 0 + -4974 -5656 0 + -5312 -5656 5657 0 + 5656 -5657 0 + -4974 -5308 5658 0 + 4974 -5658 0 + 4974 5659 0 + -4974 -5659 0 + -5313 -5659 5660 0 + 5659 -5660 0 + -4974 -5309 5661 0 + 4974 -5661 0 + 4974 5662 0 + -4974 -5662 0 + -5314 -5662 5663 0 + 5662 -5663 0 + -4974 -5310 5664 0 + 4974 -5664 0 + 4974 5665 0 + -4974 -5665 0 + -5315 -5665 5666 0 + 5665 -5666 0 + -4974 -5311 5667 0 + 4974 -5667 0 + 4974 5668 0 + -4974 -5668 0 + -5316 -5668 5669 0 + 5668 -5669 0 + -4974 -5312 5670 0 + 4974 -5670 0 + 4974 5671 0 + -4974 -5671 0 + -5317 -5671 5672 0 + 5671 -5672 0 + -4974 -5313 5673 0 + 4974 -5673 0 + 4974 5674 0 + -4974 -5674 0 + -5318 -5674 5675 0 + 5674 -5675 0 + -4974 -5314 5676 0 + 4974 -5676 0 + 4974 5677 0 + -4974 -5677 0 + -5319 -5677 5678 0 + 5677 -5678 0 + -4974 -5315 5679 0 + 4974 -5679 0 + 4974 5680 0 + -4974 -5680 0 + -5320 -5680 5681 0 + 5680 -5681 0 + -4974 -5316 5682 0 + 4974 -5682 0 + 4974 5683 0 + -4974 -5683 0 + -5321 -5683 5684 0 + 5683 -5684 0 + -4974 -5317 5685 0 + 4974 -5685 0 + 4974 5686 0 + -4974 -5686 0 + -5322 -5686 5687 0 + 5686 -5687 0 + -4974 -5318 5688 0 + 4974 -5688 0 + 4974 5689 0 + -4974 -5689 0 + -5323 -5689 5690 0 + 5689 -5690 0 + -4974 -5319 5691 0 + 4974 -5691 0 + 4974 5692 0 + -4974 -5692 0 + -5324 -5692 5693 0 + 5692 -5693 0 + -4974 -5320 5694 0 + 4974 -5694 0 + 4974 5695 0 + -4974 -5695 0 + -5325 -5695 5696 0 + 5695 -5696 0 + -4974 -5321 5697 0 + 4974 -5697 0 + 4974 5698 0 + -4974 -5698 0 + -5326 -5698 5699 0 + 5698 -5699 0 + -4974 -5322 5700 0 + 4974 -5700 0 + 4974 5701 0 + -4974 -5701 0 + -5327 -5701 5702 0 + 5701 -5702 0 + -4974 -5323 5703 0 + 4974 -5703 0 + 4974 5704 0 + -4974 -5704 0 + -5328 -5704 5705 0 + 5704 -5705 0 + -4974 -5324 5706 0 + 4974 -5706 0 + 4974 5707 0 + -4974 -5707 0 + -5329 -5707 5708 0 + 5707 -5708 0 + -4974 -5325 5709 0 + 4974 -5709 0 + 4974 5710 0 + -4974 -5710 0 + -5330 -5710 5711 0 + 5710 -5711 0 + -4974 -5326 5712 0 + 4974 -5712 0 + 4974 5713 0 + -4974 -5713 0 + -5331 -5713 5714 0 + 5713 -5714 0 + -4974 -5327 5715 0 + 4974 -5715 0 + 4974 5716 0 + -4974 -5716 0 + -5332 -5716 5717 0 + 5716 -5717 0 + -4974 -5328 5718 0 + 4974 -5718 0 + 4974 5719 0 + -4974 -5719 0 + -5333 -5719 5720 0 + 5719 -5720 0 + -4974 -5329 5721 0 + 4974 -5721 0 + 4974 5722 0 + -4974 -5722 0 + -5334 -5722 5723 0 + 5722 -5723 0 + -4974 -5330 5724 0 + 4974 -5724 0 + 4974 5725 0 + -4974 -5725 0 + -5335 -5725 5726 0 + 5725 -5726 0 + -4974 -5331 5727 0 + 4974 -5727 0 + 4974 5728 0 + -4974 -5728 0 + -5336 -5728 5729 0 + 5728 -5729 0 + -4974 -5332 5730 0 + 4974 -5730 0 + 4974 5731 0 + -4974 -5731 0 + -5337 -5731 5732 0 + 5731 -5732 0 + -4974 -5333 5733 0 + 4974 -5733 0 + 4974 5734 0 + -4974 -5734 0 + -5338 -5734 5735 0 + 5734 -5735 0 + -4974 -5334 5736 0 + 4974 -5736 0 + 4974 5737 0 + -4974 -5737 0 + -5339 -5737 5738 0 + 5737 -5738 0 + -4974 -5335 5739 0 + 4974 -5739 0 + 4974 5740 0 + -4974 -5740 0 + -5340 -5740 5741 0 + 5740 -5741 0 + -4974 -5336 5742 0 + 4974 -5742 0 + 4974 5743 0 + -4974 -5743 0 + -5341 -5743 5744 0 + 5743 -5744 0 + -4974 -5337 5745 0 + 4974 -5745 0 + 4974 5746 0 + -4974 -5746 0 + -5342 -5746 5747 0 + 5746 -5747 0 + -4974 -5338 5748 0 + 4974 -5748 0 + 4974 5749 0 + -4974 -5749 0 + -5343 -5749 5750 0 + 5749 -5750 0 + -4974 -5339 5751 0 + 4974 -5751 0 + 4974 5752 0 + -4974 -5752 0 + -5344 -5752 5753 0 + 5752 -5753 0 + -4974 -5340 5754 0 + 4974 -5754 0 + 4974 5755 0 + -4974 -5755 0 + -5345 -5755 5756 0 + 5755 -5756 0 + -4974 -5341 5757 0 + 4974 -5757 0 + 4974 5758 0 + -4974 -5758 0 + -5346 -5758 5759 0 + 5758 -5759 0 + -4974 -5342 5760 0 + 4974 -5760 0 + 4974 5761 0 + -4974 -5761 0 + -5347 -5761 5762 0 + 5761 -5762 0 + -4974 -5343 5763 0 + 4974 -5763 0 + 4974 5764 0 + -4974 -5764 0 + -5348 -5764 5765 0 + 5764 -5765 0 + -4974 -5344 5766 0 + 4974 -5766 0 + 4974 5767 0 + -4974 -5767 0 + -5349 -5767 5768 0 + 5767 -5768 0 + -4974 -5345 5769 0 + 4974 -5769 0 + 4974 5770 0 + -4974 -5770 0 + -5350 -5770 5771 0 + 5770 -5771 0 + -4974 -5346 5772 0 + 4974 -5772 0 + 4974 5773 0 + -4974 -5773 0 + -5351 -5773 5774 0 + 5773 -5774 0 + -4974 -5347 5775 0 + 4974 -5775 0 + 4974 5776 0 + -4974 -5776 0 + -5352 -5776 5777 0 + 5776 -5777 0 + -4974 -5348 5778 0 + 4974 -5778 0 + 4974 5779 0 + -4974 -5779 0 + -5353 -5779 5780 0 + 5779 -5780 0 + -4974 -5349 5781 0 + 4974 -5781 0 + 4974 5782 0 + -4974 -5782 0 + -5354 -5782 5783 0 + 5782 -5783 0 + -4974 -5350 5784 0 + 4974 -5784 0 + 4974 5785 0 + -4974 -5785 0 + -5355 -5785 5786 0 + 5785 -5786 0 + -4974 -5351 5787 0 + 4974 -5787 0 + 4974 5788 0 + -4974 -5788 0 + -5356 -5788 5789 0 + 5788 -5789 0 + -4974 -5352 5790 0 + 4974 -5790 0 + 4974 5791 0 + -4974 -5791 0 + -5357 -5791 5792 0 + 5791 -5792 0 + -4974 -5353 5793 0 + 4974 -5793 0 + 4974 5794 0 + -4974 -5794 0 + -5358 -5794 5795 0 + 5794 -5795 0 + -4974 -5354 5796 0 + 4974 -5796 0 + 4974 5797 0 + -4974 -5797 0 + -5359 -5797 5798 0 + 5797 -5798 0 + -4974 -5355 5799 0 + 4974 -5799 0 + 4974 5800 0 + -4974 -5800 0 + -5360 -5800 5801 0 + 5800 -5801 0 + -4974 -5356 5802 0 + 4974 -5802 0 + 4974 5803 0 + -4974 -5803 0 + -5361 -5803 5804 0 + 5803 -5804 0 + -4974 -5357 5805 0 + 4974 -5805 0 + 4974 5806 0 + -4974 -5806 0 + -5362 -5806 5807 0 + 5806 -5807 0 + -4974 -5358 5808 0 + 4974 -5808 0 + 4974 5809 0 + -4974 -5809 0 + -5363 -5809 5810 0 + 5809 -5810 0 + -4974 -5359 5811 0 + 4974 -5811 0 + 4975 5876 0 + -4975 -5876 0 + -5556 -5876 5877 0 + 5556 -5877 0 + 5876 -5877 0 + -2 -4975 5878 0 + 4975 -5878 0 + -5812 5877 0 + 5812 -5877 0 + 5812 -5878 0 + 4975 5879 0 + -4975 -5879 0 + -5557 -5879 5880 0 + 5557 -5880 0 + 5879 -5880 0 + -2 -4975 5881 0 + 4975 -5881 0 + -5813 5880 0 + 5813 -5880 0 + 5813 -5881 0 + 4975 5882 0 + -4975 -5882 0 + -5558 -5882 5883 0 + 5558 -5883 0 + 5882 -5883 0 + -2 -4975 5884 0 + 4975 -5884 0 + -5814 5883 0 + 5814 -5883 0 + 5814 -5884 0 + 4975 5885 0 + -4975 -5885 0 + -5559 -5885 5886 0 + 5559 -5886 0 + 5885 -5886 0 + -2 -4975 5887 0 + 4975 -5887 0 + -5815 5886 0 + 5815 -5886 0 + 5815 -5887 0 + 4975 5888 0 + -4975 -5888 0 + -5560 -5888 5889 0 + 5560 -5889 0 + 5888 -5889 0 + -2 -4975 5890 0 + 4975 -5890 0 + -5816 5889 0 + 5816 -5889 0 + 5816 -5890 0 + 4975 5891 0 + -4975 -5891 0 + -5561 -5891 5892 0 + 5561 -5892 0 + 5891 -5892 0 + -2 -4975 5893 0 + 4975 -5893 0 + -5817 5892 0 + 5817 -5892 0 + 5817 -5893 0 + 4975 5894 0 + -4975 -5894 0 + -5562 -5894 5895 0 + 5562 -5895 0 + 5894 -5895 0 + -2 -4975 5896 0 + 4975 -5896 0 + -5818 5895 0 + 5818 -5895 0 + 5818 -5896 0 + 4975 5897 0 + -4975 -5897 0 + -5563 -5897 5898 0 + 5563 -5898 0 + 5897 -5898 0 + -2 -4975 5899 0 + 4975 -5899 0 + -5819 5898 0 + 5819 -5898 0 + 5819 -5899 0 + 4975 5900 0 + -4975 -5900 0 + -5564 -5900 5901 0 + 5900 -5901 0 + -4975 -5556 5902 0 + 5556 -5902 0 + 4975 -5902 0 + -5820 5902 0 + 5820 -5901 0 + 5820 -5902 0 + 4975 5903 0 + -4975 -5903 0 + -5565 -5903 5904 0 + 5903 -5904 0 + -4975 -5557 5905 0 + 5557 -5905 0 + 4975 -5905 0 + -5821 5905 0 + 5821 -5904 0 + 5821 -5905 0 + 4975 5906 0 + -4975 -5906 0 + -5566 -5906 5907 0 + 5906 -5907 0 + -4975 -5558 5908 0 + 5558 -5908 0 + 4975 -5908 0 + -5822 5908 0 + 5822 -5907 0 + 5822 -5908 0 + 4975 5909 0 + -4975 -5909 0 + -5567 -5909 5910 0 + 5909 -5910 0 + -4975 -5559 5911 0 + 5559 -5911 0 + 4975 -5911 0 + -5823 5911 0 + 5823 -5910 0 + 5823 -5911 0 + 4975 5912 0 + -4975 -5912 0 + -5568 -5912 5913 0 + 5912 -5913 0 + -4975 -5560 5914 0 + 5560 -5914 0 + 4975 -5914 0 + -5824 5914 0 + 5824 -5913 0 + 5824 -5914 0 + 4975 5915 0 + -4975 -5915 0 + -5569 -5915 5916 0 + 5915 -5916 0 + -4975 -5561 5917 0 + 5561 -5917 0 + 4975 -5917 0 + -5825 5917 0 + 5825 -5916 0 + 5825 -5917 0 + 4975 5918 0 + -4975 -5918 0 + -5570 -5918 5919 0 + 5918 -5919 0 + -4975 -5562 5920 0 + 5562 -5920 0 + 4975 -5920 0 + -5826 5920 0 + 5826 -5919 0 + 5826 -5920 0 + 4975 5921 0 + -4975 -5921 0 + -5571 -5921 5922 0 + 5921 -5922 0 + -4975 -5563 5923 0 + 5563 -5923 0 + 4975 -5923 0 + -5827 5923 0 + 5827 -5922 0 + 5827 -5923 0 + 4975 5924 0 + -4975 -5924 0 + -5572 -5924 5925 0 + 5924 -5925 0 + -4975 -5564 5926 0 + 4975 -5926 0 + 4975 5927 0 + -4975 -5927 0 + -5573 -5927 5928 0 + 5927 -5928 0 + -4975 -5565 5929 0 + 4975 -5929 0 + 4975 5930 0 + -4975 -5930 0 + -5574 -5930 5931 0 + 5930 -5931 0 + -4975 -5566 5932 0 + 4975 -5932 0 + 4975 5933 0 + -4975 -5933 0 + -5575 -5933 5934 0 + 5933 -5934 0 + -4975 -5567 5935 0 + 4975 -5935 0 + 4975 5936 0 + -4975 -5936 0 + -5576 -5936 5937 0 + 5936 -5937 0 + -4975 -5568 5938 0 + 4975 -5938 0 + 4975 5939 0 + -4975 -5939 0 + -5577 -5939 5940 0 + 5939 -5940 0 + -4975 -5569 5941 0 + 4975 -5941 0 + 4975 5942 0 + -4975 -5942 0 + -5578 -5942 5943 0 + 5942 -5943 0 + -4975 -5570 5944 0 + 4975 -5944 0 + 4975 5945 0 + -4975 -5945 0 + -5579 -5945 5946 0 + 5945 -5946 0 + -4975 -5571 5947 0 + 4975 -5947 0 + 4975 5948 0 + -4975 -5948 0 + -5580 -5948 5949 0 + 5948 -5949 0 + -4975 -5572 5950 0 + 4975 -5950 0 + 4975 5951 0 + -4975 -5951 0 + -5581 -5951 5952 0 + 5951 -5952 0 + -4975 -5573 5953 0 + 4975 -5953 0 + 4975 5954 0 + -4975 -5954 0 + -5582 -5954 5955 0 + 5954 -5955 0 + -4975 -5574 5956 0 + 4975 -5956 0 + 4975 5957 0 + -4975 -5957 0 + -5583 -5957 5958 0 + 5957 -5958 0 + -4975 -5575 5959 0 + 4975 -5959 0 + 4975 5960 0 + -4975 -5960 0 + -5584 -5960 5961 0 + 5960 -5961 0 + -4975 -5576 5962 0 + 4975 -5962 0 + 4975 5963 0 + -4975 -5963 0 + -5585 -5963 5964 0 + 5963 -5964 0 + -4975 -5577 5965 0 + 4975 -5965 0 + 4975 5966 0 + -4975 -5966 0 + -5586 -5966 5967 0 + 5966 -5967 0 + -4975 -5578 5968 0 + 4975 -5968 0 + 4975 5969 0 + -4975 -5969 0 + -5587 -5969 5970 0 + 5969 -5970 0 + -4975 -5579 5971 0 + 4975 -5971 0 + 4975 5972 0 + -4975 -5972 0 + -5588 -5972 5973 0 + 5972 -5973 0 + -4975 -5580 5974 0 + 4975 -5974 0 + 4975 5975 0 + -4975 -5975 0 + -5589 -5975 5976 0 + 5975 -5976 0 + -4975 -5581 5977 0 + 4975 -5977 0 + 4975 5978 0 + -4975 -5978 0 + -5590 -5978 5979 0 + 5978 -5979 0 + -4975 -5582 5980 0 + 4975 -5980 0 + 4975 5981 0 + -4975 -5981 0 + -5591 -5981 5982 0 + 5981 -5982 0 + -4975 -5583 5983 0 + 4975 -5983 0 + 4975 5984 0 + -4975 -5984 0 + -5592 -5984 5985 0 + 5984 -5985 0 + -4975 -5584 5986 0 + 4975 -5986 0 + 4975 5987 0 + -4975 -5987 0 + -5593 -5987 5988 0 + 5987 -5988 0 + -4975 -5585 5989 0 + 4975 -5989 0 + 4975 5990 0 + -4975 -5990 0 + -5594 -5990 5991 0 + 5990 -5991 0 + -4975 -5586 5992 0 + 4975 -5992 0 + 4975 5993 0 + -4975 -5993 0 + -5595 -5993 5994 0 + 5993 -5994 0 + -4975 -5587 5995 0 + 4975 -5995 0 + 4975 5996 0 + -4975 -5996 0 + -5596 -5996 5997 0 + 5996 -5997 0 + -4975 -5588 5998 0 + 4975 -5998 0 + 4975 5999 0 + -4975 -5999 0 + -5597 -5999 6000 0 + 5999 -6000 0 + -4975 -5589 6001 0 + 4975 -6001 0 + 4975 6002 0 + -4975 -6002 0 + -5598 -6002 6003 0 + 6002 -6003 0 + -4975 -5590 6004 0 + 4975 -6004 0 + 4975 6005 0 + -4975 -6005 0 + -5599 -6005 6006 0 + 6005 -6006 0 + -4975 -5591 6007 0 + 4975 -6007 0 + 4975 6008 0 + -4975 -6008 0 + -5600 -6008 6009 0 + 6008 -6009 0 + -4975 -5592 6010 0 + 4975 -6010 0 + 4975 6011 0 + -4975 -6011 0 + -5601 -6011 6012 0 + 6011 -6012 0 + -4975 -5593 6013 0 + 4975 -6013 0 + 4975 6014 0 + -4975 -6014 0 + -5602 -6014 6015 0 + 6014 -6015 0 + -4975 -5594 6016 0 + 4975 -6016 0 + 4975 6017 0 + -4975 -6017 0 + -5603 -6017 6018 0 + 6017 -6018 0 + -4975 -5595 6019 0 + 4975 -6019 0 + 4975 6020 0 + -4975 -6020 0 + -5604 -6020 6021 0 + 6020 -6021 0 + -4975 -5596 6022 0 + 4975 -6022 0 + 4975 6023 0 + -4975 -6023 0 + -5605 -6023 6024 0 + 6023 -6024 0 + -4975 -5597 6025 0 + 4975 -6025 0 + 4975 6026 0 + -4975 -6026 0 + -5606 -6026 6027 0 + 6026 -6027 0 + -4975 -5598 6028 0 + 4975 -6028 0 + 4975 6029 0 + -4975 -6029 0 + -5607 -6029 6030 0 + 6029 -6030 0 + -4975 -5599 6031 0 + 4975 -6031 0 + 4975 6032 0 + -4975 -6032 0 + -5608 -6032 6033 0 + 6032 -6033 0 + -4975 -5600 6034 0 + 4975 -6034 0 + 4975 6035 0 + -4975 -6035 0 + -5609 -6035 6036 0 + 6035 -6036 0 + -4975 -5601 6037 0 + 4975 -6037 0 + 4975 6038 0 + -4975 -6038 0 + -5610 -6038 6039 0 + 6038 -6039 0 + -4975 -5602 6040 0 + 4975 -6040 0 + 4975 6041 0 + -4975 -6041 0 + -5611 -6041 6042 0 + 6041 -6042 0 + -4975 -5603 6043 0 + 4975 -6043 0 + 4975 6044 0 + -4975 -6044 0 + -5612 -6044 6045 0 + 6044 -6045 0 + -4975 -5604 6046 0 + 4975 -6046 0 + 4975 6047 0 + -4975 -6047 0 + -5613 -6047 6048 0 + 6047 -6048 0 + -4975 -5605 6049 0 + 4975 -6049 0 + 4975 6050 0 + -4975 -6050 0 + -5614 -6050 6051 0 + 6050 -6051 0 + -4975 -5606 6052 0 + 4975 -6052 0 + 4975 6053 0 + -4975 -6053 0 + -5615 -6053 6054 0 + 6053 -6054 0 + -4975 -5607 6055 0 + 4975 -6055 0 + 4975 6056 0 + -4975 -6056 0 + -5616 -6056 6057 0 + 6056 -6057 0 + -4975 -5608 6058 0 + 4975 -6058 0 + 4975 6059 0 + -4975 -6059 0 + -5617 -6059 6060 0 + 6059 -6060 0 + -4975 -5609 6061 0 + 4975 -6061 0 + 4975 6062 0 + -4975 -6062 0 + -5618 -6062 6063 0 + 6062 -6063 0 + -4975 -5610 6064 0 + 4975 -6064 0 + 4975 6065 0 + -4975 -6065 0 + -5619 -6065 6066 0 + 6065 -6066 0 + -4975 -5611 6067 0 + 4975 -6067 0 + 4976 6132 0 + -4976 -6132 0 + -5812 -6132 6133 0 + 5812 -6133 0 + 6132 -6133 0 + -2 -4976 6134 0 + 4976 -6134 0 + -6068 6133 0 + 6068 -6133 0 + 6068 -6134 0 + 4976 6135 0 + -4976 -6135 0 + -5813 -6135 6136 0 + 5813 -6136 0 + 6135 -6136 0 + -2 -4976 6137 0 + 4976 -6137 0 + -6069 6136 0 + 6069 -6136 0 + 6069 -6137 0 + 4976 6138 0 + -4976 -6138 0 + -5814 -6138 6139 0 + 5814 -6139 0 + 6138 -6139 0 + -2 -4976 6140 0 + 4976 -6140 0 + -6070 6139 0 + 6070 -6139 0 + 6070 -6140 0 + 4976 6141 0 + -4976 -6141 0 + -5815 -6141 6142 0 + 5815 -6142 0 + 6141 -6142 0 + -2 -4976 6143 0 + 4976 -6143 0 + -6071 6142 0 + 6071 -6142 0 + 6071 -6143 0 + 4976 6144 0 + -4976 -6144 0 + -5816 -6144 6145 0 + 5816 -6145 0 + 6144 -6145 0 + -2 -4976 6146 0 + 4976 -6146 0 + -6072 6145 0 + 6072 -6145 0 + 6072 -6146 0 + 4976 6147 0 + -4976 -6147 0 + -5817 -6147 6148 0 + 5817 -6148 0 + 6147 -6148 0 + -2 -4976 6149 0 + 4976 -6149 0 + -6073 6148 0 + 6073 -6148 0 + 6073 -6149 0 + 4976 6150 0 + -4976 -6150 0 + -5818 -6150 6151 0 + 5818 -6151 0 + 6150 -6151 0 + -2 -4976 6152 0 + 4976 -6152 0 + -6074 6151 0 + 6074 -6151 0 + 6074 -6152 0 + 4976 6153 0 + -4976 -6153 0 + -5819 -6153 6154 0 + 5819 -6154 0 + 6153 -6154 0 + -2 -4976 6155 0 + 4976 -6155 0 + -6075 6154 0 + 6075 -6154 0 + 6075 -6155 0 + 4976 6156 0 + -4976 -6156 0 + -5820 -6156 6157 0 + 5820 -6157 0 + 6156 -6157 0 + -2 -4976 6158 0 + 4976 -6158 0 + -6076 6157 0 + 6076 -6157 0 + 6076 -6158 0 + 4976 6159 0 + -4976 -6159 0 + -5821 -6159 6160 0 + 5821 -6160 0 + 6159 -6160 0 + -2 -4976 6161 0 + 4976 -6161 0 + -6077 6160 0 + 6077 -6160 0 + 6077 -6161 0 + 4976 6162 0 + -4976 -6162 0 + -5822 -6162 6163 0 + 5822 -6163 0 + 6162 -6163 0 + -2 -4976 6164 0 + 4976 -6164 0 + -6078 6163 0 + 6078 -6163 0 + 6078 -6164 0 + 4976 6165 0 + -4976 -6165 0 + -5823 -6165 6166 0 + 5823 -6166 0 + 6165 -6166 0 + -2 -4976 6167 0 + 4976 -6167 0 + -6079 6166 0 + 6079 -6166 0 + 6079 -6167 0 + 4976 6168 0 + -4976 -6168 0 + -5824 -6168 6169 0 + 5824 -6169 0 + 6168 -6169 0 + -2 -4976 6170 0 + 4976 -6170 0 + -6080 6169 0 + 6080 -6169 0 + 6080 -6170 0 + 4976 6171 0 + -4976 -6171 0 + -5825 -6171 6172 0 + 5825 -6172 0 + 6171 -6172 0 + -2 -4976 6173 0 + 4976 -6173 0 + -6081 6172 0 + 6081 -6172 0 + 6081 -6173 0 + 4976 6174 0 + -4976 -6174 0 + -5826 -6174 6175 0 + 5826 -6175 0 + 6174 -6175 0 + -2 -4976 6176 0 + 4976 -6176 0 + -6082 6175 0 + 6082 -6175 0 + 6082 -6176 0 + 4976 6177 0 + -4976 -6177 0 + -5827 -6177 6178 0 + 5827 -6178 0 + 6177 -6178 0 + -2 -4976 6179 0 + 4976 -6179 0 + -6083 6178 0 + 6083 -6178 0 + 6083 -6179 0 + 4976 6180 0 + -4976 -6180 0 + -5828 -6180 6181 0 + 6180 -6181 0 + -4976 -5812 6182 0 + 5812 -6182 0 + 4976 -6182 0 + -6084 6182 0 + 6084 -6181 0 + 6084 -6182 0 + 4976 6183 0 + -4976 -6183 0 + -5829 -6183 6184 0 + 6183 -6184 0 + -4976 -5813 6185 0 + 5813 -6185 0 + 4976 -6185 0 + -6085 6185 0 + 6085 -6184 0 + 6085 -6185 0 + 4976 6186 0 + -4976 -6186 0 + -5830 -6186 6187 0 + 6186 -6187 0 + -4976 -5814 6188 0 + 5814 -6188 0 + 4976 -6188 0 + -6086 6188 0 + 6086 -6187 0 + 6086 -6188 0 + 4976 6189 0 + -4976 -6189 0 + -5831 -6189 6190 0 + 6189 -6190 0 + -4976 -5815 6191 0 + 5815 -6191 0 + 4976 -6191 0 + -6087 6191 0 + 6087 -6190 0 + 6087 -6191 0 + 4976 6192 0 + -4976 -6192 0 + -5832 -6192 6193 0 + 6192 -6193 0 + -4976 -5816 6194 0 + 5816 -6194 0 + 4976 -6194 0 + -6088 6194 0 + 6088 -6193 0 + 6088 -6194 0 + 4976 6195 0 + -4976 -6195 0 + -5833 -6195 6196 0 + 6195 -6196 0 + -4976 -5817 6197 0 + 5817 -6197 0 + 4976 -6197 0 + -6089 6197 0 + 6089 -6196 0 + 6089 -6197 0 + 4976 6198 0 + -4976 -6198 0 + -5834 -6198 6199 0 + 6198 -6199 0 + -4976 -5818 6200 0 + 5818 -6200 0 + 4976 -6200 0 + -6090 6200 0 + 6090 -6199 0 + 6090 -6200 0 + 4976 6201 0 + -4976 -6201 0 + -5835 -6201 6202 0 + 6201 -6202 0 + -4976 -5819 6203 0 + 5819 -6203 0 + 4976 -6203 0 + -6091 6203 0 + 6091 -6202 0 + 6091 -6203 0 + 4976 6204 0 + -4976 -6204 0 + -5836 -6204 6205 0 + 6204 -6205 0 + -4976 -5820 6206 0 + 5820 -6206 0 + 4976 -6206 0 + -6092 6206 0 + 6092 -6205 0 + 6092 -6206 0 + 4976 6207 0 + -4976 -6207 0 + -5837 -6207 6208 0 + 6207 -6208 0 + -4976 -5821 6209 0 + 5821 -6209 0 + 4976 -6209 0 + -6093 6209 0 + 6093 -6208 0 + 6093 -6209 0 + 4976 6210 0 + -4976 -6210 0 + -5838 -6210 6211 0 + 6210 -6211 0 + -4976 -5822 6212 0 + 5822 -6212 0 + 4976 -6212 0 + -6094 6212 0 + 6094 -6211 0 + 6094 -6212 0 + 4976 6213 0 + -4976 -6213 0 + -5839 -6213 6214 0 + 6213 -6214 0 + -4976 -5823 6215 0 + 5823 -6215 0 + 4976 -6215 0 + -6095 6215 0 + 6095 -6214 0 + 6095 -6215 0 + 4976 6216 0 + -4976 -6216 0 + -5840 -6216 6217 0 + 6216 -6217 0 + -4976 -5824 6218 0 + 5824 -6218 0 + 4976 -6218 0 + -6096 6218 0 + 6096 -6217 0 + 6096 -6218 0 + 4976 6219 0 + -4976 -6219 0 + -5841 -6219 6220 0 + 6219 -6220 0 + -4976 -5825 6221 0 + 5825 -6221 0 + 4976 -6221 0 + -6097 6221 0 + 6097 -6220 0 + 6097 -6221 0 + 4976 6222 0 + -4976 -6222 0 + -5842 -6222 6223 0 + 6222 -6223 0 + -4976 -5826 6224 0 + 5826 -6224 0 + 4976 -6224 0 + -6098 6224 0 + 6098 -6223 0 + 6098 -6224 0 + 4976 6225 0 + -4976 -6225 0 + -5843 -6225 6226 0 + 6225 -6226 0 + -4976 -5827 6227 0 + 5827 -6227 0 + 4976 -6227 0 + -6099 6227 0 + 6099 -6226 0 + 6099 -6227 0 + 4976 6228 0 + -4976 -6228 0 + -5844 -6228 6229 0 + 6228 -6229 0 + -4976 -5828 6230 0 + 4976 -6230 0 + 4976 6231 0 + -4976 -6231 0 + -5845 -6231 6232 0 + 6231 -6232 0 + -4976 -5829 6233 0 + 4976 -6233 0 + 4976 6234 0 + -4976 -6234 0 + -5846 -6234 6235 0 + 6234 -6235 0 + -4976 -5830 6236 0 + 4976 -6236 0 + 4976 6237 0 + -4976 -6237 0 + -5847 -6237 6238 0 + 6237 -6238 0 + -4976 -5831 6239 0 + 4976 -6239 0 + 4976 6240 0 + -4976 -6240 0 + -5848 -6240 6241 0 + 6240 -6241 0 + -4976 -5832 6242 0 + 4976 -6242 0 + 4976 6243 0 + -4976 -6243 0 + -5849 -6243 6244 0 + 6243 -6244 0 + -4976 -5833 6245 0 + 4976 -6245 0 + 4976 6246 0 + -4976 -6246 0 + -5850 -6246 6247 0 + 6246 -6247 0 + -4976 -5834 6248 0 + 4976 -6248 0 + 4976 6249 0 + -4976 -6249 0 + -5851 -6249 6250 0 + 6249 -6250 0 + -4976 -5835 6251 0 + 4976 -6251 0 + 4976 6252 0 + -4976 -6252 0 + -5852 -6252 6253 0 + 6252 -6253 0 + -4976 -5836 6254 0 + 4976 -6254 0 + 4976 6255 0 + -4976 -6255 0 + -5853 -6255 6256 0 + 6255 -6256 0 + -4976 -5837 6257 0 + 4976 -6257 0 + 4976 6258 0 + -4976 -6258 0 + -5854 -6258 6259 0 + 6258 -6259 0 + -4976 -5838 6260 0 + 4976 -6260 0 + 4976 6261 0 + -4976 -6261 0 + -5855 -6261 6262 0 + 6261 -6262 0 + -4976 -5839 6263 0 + 4976 -6263 0 + 4976 6264 0 + -4976 -6264 0 + -5856 -6264 6265 0 + 6264 -6265 0 + -4976 -5840 6266 0 + 4976 -6266 0 + 4976 6267 0 + -4976 -6267 0 + -5857 -6267 6268 0 + 6267 -6268 0 + -4976 -5841 6269 0 + 4976 -6269 0 + 4976 6270 0 + -4976 -6270 0 + -5858 -6270 6271 0 + 6270 -6271 0 + -4976 -5842 6272 0 + 4976 -6272 0 + 4976 6273 0 + -4976 -6273 0 + -5859 -6273 6274 0 + 6273 -6274 0 + -4976 -5843 6275 0 + 4976 -6275 0 + 4976 6276 0 + -4976 -6276 0 + -5860 -6276 6277 0 + 6276 -6277 0 + -4976 -5844 6278 0 + 4976 -6278 0 + 4976 6279 0 + -4976 -6279 0 + -5861 -6279 6280 0 + 6279 -6280 0 + -4976 -5845 6281 0 + 4976 -6281 0 + 4976 6282 0 + -4976 -6282 0 + -5862 -6282 6283 0 + 6282 -6283 0 + -4976 -5846 6284 0 + 4976 -6284 0 + 4976 6285 0 + -4976 -6285 0 + -5863 -6285 6286 0 + 6285 -6286 0 + -4976 -5847 6287 0 + 4976 -6287 0 + 4976 6288 0 + -4976 -6288 0 + -5864 -6288 6289 0 + 6288 -6289 0 + -4976 -5848 6290 0 + 4976 -6290 0 + 4976 6291 0 + -4976 -6291 0 + -5865 -6291 6292 0 + 6291 -6292 0 + -4976 -5849 6293 0 + 4976 -6293 0 + 4976 6294 0 + -4976 -6294 0 + -5866 -6294 6295 0 + 6294 -6295 0 + -4976 -5850 6296 0 + 4976 -6296 0 + 4976 6297 0 + -4976 -6297 0 + -5867 -6297 6298 0 + 6297 -6298 0 + -4976 -5851 6299 0 + 4976 -6299 0 + 4976 6300 0 + -4976 -6300 0 + -5868 -6300 6301 0 + 6300 -6301 0 + -4976 -5852 6302 0 + 4976 -6302 0 + 4976 6303 0 + -4976 -6303 0 + -5869 -6303 6304 0 + 6303 -6304 0 + -4976 -5853 6305 0 + 4976 -6305 0 + 4976 6306 0 + -4976 -6306 0 + -5870 -6306 6307 0 + 6306 -6307 0 + -4976 -5854 6308 0 + 4976 -6308 0 + 4976 6309 0 + -4976 -6309 0 + -5871 -6309 6310 0 + 6309 -6310 0 + -4976 -5855 6311 0 + 4976 -6311 0 + 4976 6312 0 + -4976 -6312 0 + -5872 -6312 6313 0 + 6312 -6313 0 + -4976 -5856 6314 0 + 4976 -6314 0 + 4976 6315 0 + -4976 -6315 0 + -5873 -6315 6316 0 + 6315 -6316 0 + -4976 -5857 6317 0 + 4976 -6317 0 + 4976 6318 0 + -4976 -6318 0 + -5874 -6318 6319 0 + 6318 -6319 0 + -4976 -5858 6320 0 + 4976 -6320 0 + 4976 6321 0 + -4976 -6321 0 + -5875 -6321 6322 0 + 6321 -6322 0 + -4976 -5859 6323 0 + 4976 -6323 0 + 4977 6388 0 + -4977 -6388 0 + -6068 -6388 6389 0 + 6068 -6389 0 + 6388 -6389 0 + -2 -4977 6390 0 + 4977 -6390 0 + -6324 6389 0 + 6324 -6389 0 + 6324 -6390 0 + 4977 6391 0 + -4977 -6391 0 + -6069 -6391 6392 0 + 6069 -6392 0 + 6391 -6392 0 + -2 -4977 6393 0 + 4977 -6393 0 + -6325 6392 0 + 6325 -6392 0 + 6325 -6393 0 + 4977 6394 0 + -4977 -6394 0 + -6070 -6394 6395 0 + 6070 -6395 0 + 6394 -6395 0 + -2 -4977 6396 0 + 4977 -6396 0 + -6326 6395 0 + 6326 -6395 0 + 6326 -6396 0 + 4977 6397 0 + -4977 -6397 0 + -6071 -6397 6398 0 + 6071 -6398 0 + 6397 -6398 0 + -2 -4977 6399 0 + 4977 -6399 0 + -6327 6398 0 + 6327 -6398 0 + 6327 -6399 0 + 4977 6400 0 + -4977 -6400 0 + -6072 -6400 6401 0 + 6072 -6401 0 + 6400 -6401 0 + -2 -4977 6402 0 + 4977 -6402 0 + -6328 6401 0 + 6328 -6401 0 + 6328 -6402 0 + 4977 6403 0 + -4977 -6403 0 + -6073 -6403 6404 0 + 6073 -6404 0 + 6403 -6404 0 + -2 -4977 6405 0 + 4977 -6405 0 + -6329 6404 0 + 6329 -6404 0 + 6329 -6405 0 + 4977 6406 0 + -4977 -6406 0 + -6074 -6406 6407 0 + 6074 -6407 0 + 6406 -6407 0 + -2 -4977 6408 0 + 4977 -6408 0 + -6330 6407 0 + 6330 -6407 0 + 6330 -6408 0 + 4977 6409 0 + -4977 -6409 0 + -6075 -6409 6410 0 + 6075 -6410 0 + 6409 -6410 0 + -2 -4977 6411 0 + 4977 -6411 0 + -6331 6410 0 + 6331 -6410 0 + 6331 -6411 0 + 4977 6412 0 + -4977 -6412 0 + -6076 -6412 6413 0 + 6076 -6413 0 + 6412 -6413 0 + -2 -4977 6414 0 + 4977 -6414 0 + -6332 6413 0 + 6332 -6413 0 + 6332 -6414 0 + 4977 6415 0 + -4977 -6415 0 + -6077 -6415 6416 0 + 6077 -6416 0 + 6415 -6416 0 + -2 -4977 6417 0 + 4977 -6417 0 + -6333 6416 0 + 6333 -6416 0 + 6333 -6417 0 + 4977 6418 0 + -4977 -6418 0 + -6078 -6418 6419 0 + 6078 -6419 0 + 6418 -6419 0 + -2 -4977 6420 0 + 4977 -6420 0 + -6334 6419 0 + 6334 -6419 0 + 6334 -6420 0 + 4977 6421 0 + -4977 -6421 0 + -6079 -6421 6422 0 + 6079 -6422 0 + 6421 -6422 0 + -2 -4977 6423 0 + 4977 -6423 0 + -6335 6422 0 + 6335 -6422 0 + 6335 -6423 0 + 4977 6424 0 + -4977 -6424 0 + -6080 -6424 6425 0 + 6080 -6425 0 + 6424 -6425 0 + -2 -4977 6426 0 + 4977 -6426 0 + -6336 6425 0 + 6336 -6425 0 + 6336 -6426 0 + 4977 6427 0 + -4977 -6427 0 + -6081 -6427 6428 0 + 6081 -6428 0 + 6427 -6428 0 + -2 -4977 6429 0 + 4977 -6429 0 + -6337 6428 0 + 6337 -6428 0 + 6337 -6429 0 + 4977 6430 0 + -4977 -6430 0 + -6082 -6430 6431 0 + 6082 -6431 0 + 6430 -6431 0 + -2 -4977 6432 0 + 4977 -6432 0 + -6338 6431 0 + 6338 -6431 0 + 6338 -6432 0 + 4977 6433 0 + -4977 -6433 0 + -6083 -6433 6434 0 + 6083 -6434 0 + 6433 -6434 0 + -2 -4977 6435 0 + 4977 -6435 0 + -6339 6434 0 + 6339 -6434 0 + 6339 -6435 0 + 4977 6436 0 + -4977 -6436 0 + -6084 -6436 6437 0 + 6084 -6437 0 + 6436 -6437 0 + -2 -4977 6438 0 + 4977 -6438 0 + -6340 6437 0 + 6340 -6437 0 + 6340 -6438 0 + 4977 6439 0 + -4977 -6439 0 + -6085 -6439 6440 0 + 6085 -6440 0 + 6439 -6440 0 + -2 -4977 6441 0 + 4977 -6441 0 + -6341 6440 0 + 6341 -6440 0 + 6341 -6441 0 + 4977 6442 0 + -4977 -6442 0 + -6086 -6442 6443 0 + 6086 -6443 0 + 6442 -6443 0 + -2 -4977 6444 0 + 4977 -6444 0 + -6342 6443 0 + 6342 -6443 0 + 6342 -6444 0 + 4977 6445 0 + -4977 -6445 0 + -6087 -6445 6446 0 + 6087 -6446 0 + 6445 -6446 0 + -2 -4977 6447 0 + 4977 -6447 0 + -6343 6446 0 + 6343 -6446 0 + 6343 -6447 0 + 4977 6448 0 + -4977 -6448 0 + -6088 -6448 6449 0 + 6088 -6449 0 + 6448 -6449 0 + -2 -4977 6450 0 + 4977 -6450 0 + -6344 6449 0 + 6344 -6449 0 + 6344 -6450 0 + 4977 6451 0 + -4977 -6451 0 + -6089 -6451 6452 0 + 6089 -6452 0 + 6451 -6452 0 + -2 -4977 6453 0 + 4977 -6453 0 + -6345 6452 0 + 6345 -6452 0 + 6345 -6453 0 + 4977 6454 0 + -4977 -6454 0 + -6090 -6454 6455 0 + 6090 -6455 0 + 6454 -6455 0 + -2 -4977 6456 0 + 4977 -6456 0 + -6346 6455 0 + 6346 -6455 0 + 6346 -6456 0 + 4977 6457 0 + -4977 -6457 0 + -6091 -6457 6458 0 + 6091 -6458 0 + 6457 -6458 0 + -2 -4977 6459 0 + 4977 -6459 0 + -6347 6458 0 + 6347 -6458 0 + 6347 -6459 0 + 4977 6460 0 + -4977 -6460 0 + -6092 -6460 6461 0 + 6092 -6461 0 + 6460 -6461 0 + -2 -4977 6462 0 + 4977 -6462 0 + -6348 6461 0 + 6348 -6461 0 + 6348 -6462 0 + 4977 6463 0 + -4977 -6463 0 + -6093 -6463 6464 0 + 6093 -6464 0 + 6463 -6464 0 + -2 -4977 6465 0 + 4977 -6465 0 + -6349 6464 0 + 6349 -6464 0 + 6349 -6465 0 + 4977 6466 0 + -4977 -6466 0 + -6094 -6466 6467 0 + 6094 -6467 0 + 6466 -6467 0 + -2 -4977 6468 0 + 4977 -6468 0 + -6350 6467 0 + 6350 -6467 0 + 6350 -6468 0 + 4977 6469 0 + -4977 -6469 0 + -6095 -6469 6470 0 + 6095 -6470 0 + 6469 -6470 0 + -2 -4977 6471 0 + 4977 -6471 0 + -6351 6470 0 + 6351 -6470 0 + 6351 -6471 0 + 4977 6472 0 + -4977 -6472 0 + -6096 -6472 6473 0 + 6096 -6473 0 + 6472 -6473 0 + -2 -4977 6474 0 + 4977 -6474 0 + -6352 6473 0 + 6352 -6473 0 + 6352 -6474 0 + 4977 6475 0 + -4977 -6475 0 + -6097 -6475 6476 0 + 6097 -6476 0 + 6475 -6476 0 + -2 -4977 6477 0 + 4977 -6477 0 + -6353 6476 0 + 6353 -6476 0 + 6353 -6477 0 + 4977 6478 0 + -4977 -6478 0 + -6098 -6478 6479 0 + 6098 -6479 0 + 6478 -6479 0 + -2 -4977 6480 0 + 4977 -6480 0 + -6354 6479 0 + 6354 -6479 0 + 6354 -6480 0 + 4977 6481 0 + -4977 -6481 0 + -6099 -6481 6482 0 + 6099 -6482 0 + 6481 -6482 0 + -2 -4977 6483 0 + 4977 -6483 0 + -6355 6482 0 + 6355 -6482 0 + 6355 -6483 0 + 4977 6484 0 + -4977 -6484 0 + -6100 -6484 6485 0 + 6484 -6485 0 + -4977 -6068 6486 0 + 6068 -6486 0 + 4977 -6486 0 + -6356 6486 0 + 6356 -6485 0 + 6356 -6486 0 + 4977 6487 0 + -4977 -6487 0 + -6101 -6487 6488 0 + 6487 -6488 0 + -4977 -6069 6489 0 + 6069 -6489 0 + 4977 -6489 0 + -6357 6489 0 + 6357 -6488 0 + 6357 -6489 0 + 4977 6490 0 + -4977 -6490 0 + -6102 -6490 6491 0 + 6490 -6491 0 + -4977 -6070 6492 0 + 6070 -6492 0 + 4977 -6492 0 + -6358 6492 0 + 6358 -6491 0 + 6358 -6492 0 + 4977 6493 0 + -4977 -6493 0 + -6103 -6493 6494 0 + 6493 -6494 0 + -4977 -6071 6495 0 + 6071 -6495 0 + 4977 -6495 0 + -6359 6495 0 + 6359 -6494 0 + 6359 -6495 0 + 4977 6496 0 + -4977 -6496 0 + -6104 -6496 6497 0 + 6496 -6497 0 + -4977 -6072 6498 0 + 6072 -6498 0 + 4977 -6498 0 + -6360 6498 0 + 6360 -6497 0 + 6360 -6498 0 + 4977 6499 0 + -4977 -6499 0 + -6105 -6499 6500 0 + 6499 -6500 0 + -4977 -6073 6501 0 + 6073 -6501 0 + 4977 -6501 0 + -6361 6501 0 + 6361 -6500 0 + 6361 -6501 0 + 4977 6502 0 + -4977 -6502 0 + -6106 -6502 6503 0 + 6502 -6503 0 + -4977 -6074 6504 0 + 6074 -6504 0 + 4977 -6504 0 + -6362 6504 0 + 6362 -6503 0 + 6362 -6504 0 + 4977 6505 0 + -4977 -6505 0 + -6107 -6505 6506 0 + 6505 -6506 0 + -4977 -6075 6507 0 + 6075 -6507 0 + 4977 -6507 0 + -6363 6507 0 + 6363 -6506 0 + 6363 -6507 0 + 4977 6508 0 + -4977 -6508 0 + -6108 -6508 6509 0 + 6508 -6509 0 + -4977 -6076 6510 0 + 6076 -6510 0 + 4977 -6510 0 + -6364 6510 0 + 6364 -6509 0 + 6364 -6510 0 + 4977 6511 0 + -4977 -6511 0 + -6109 -6511 6512 0 + 6511 -6512 0 + -4977 -6077 6513 0 + 6077 -6513 0 + 4977 -6513 0 + -6365 6513 0 + 6365 -6512 0 + 6365 -6513 0 + 4977 6514 0 + -4977 -6514 0 + -6110 -6514 6515 0 + 6514 -6515 0 + -4977 -6078 6516 0 + 6078 -6516 0 + 4977 -6516 0 + -6366 6516 0 + 6366 -6515 0 + 6366 -6516 0 + 4977 6517 0 + -4977 -6517 0 + -6111 -6517 6518 0 + 6517 -6518 0 + -4977 -6079 6519 0 + 6079 -6519 0 + 4977 -6519 0 + -6367 6519 0 + 6367 -6518 0 + 6367 -6519 0 + 4977 6520 0 + -4977 -6520 0 + -6112 -6520 6521 0 + 6520 -6521 0 + -4977 -6080 6522 0 + 6080 -6522 0 + 4977 -6522 0 + -6368 6522 0 + 6368 -6521 0 + 6368 -6522 0 + 4977 6523 0 + -4977 -6523 0 + -6113 -6523 6524 0 + 6523 -6524 0 + -4977 -6081 6525 0 + 6081 -6525 0 + 4977 -6525 0 + -6369 6525 0 + 6369 -6524 0 + 6369 -6525 0 + 4977 6526 0 + -4977 -6526 0 + -6114 -6526 6527 0 + 6526 -6527 0 + -4977 -6082 6528 0 + 6082 -6528 0 + 4977 -6528 0 + -6370 6528 0 + 6370 -6527 0 + 6370 -6528 0 + 4977 6529 0 + -4977 -6529 0 + -6115 -6529 6530 0 + 6529 -6530 0 + -4977 -6083 6531 0 + 6083 -6531 0 + 4977 -6531 0 + -6371 6531 0 + 6371 -6530 0 + 6371 -6531 0 + 4977 6532 0 + -4977 -6532 0 + -6116 -6532 6533 0 + 6532 -6533 0 + -4977 -6084 6534 0 + 6084 -6534 0 + 4977 -6534 0 + -6372 6534 0 + 6372 -6533 0 + 6372 -6534 0 + 4977 6535 0 + -4977 -6535 0 + -6117 -6535 6536 0 + 6535 -6536 0 + -4977 -6085 6537 0 + 6085 -6537 0 + 4977 -6537 0 + -6373 6537 0 + 6373 -6536 0 + 6373 -6537 0 + 4977 6538 0 + -4977 -6538 0 + -6118 -6538 6539 0 + 6538 -6539 0 + -4977 -6086 6540 0 + 6086 -6540 0 + 4977 -6540 0 + -6374 6540 0 + 6374 -6539 0 + 6374 -6540 0 + 4977 6541 0 + -4977 -6541 0 + -6119 -6541 6542 0 + 6541 -6542 0 + -4977 -6087 6543 0 + 6087 -6543 0 + 4977 -6543 0 + -6375 6543 0 + 6375 -6542 0 + 6375 -6543 0 + 4977 6544 0 + -4977 -6544 0 + -6120 -6544 6545 0 + 6544 -6545 0 + -4977 -6088 6546 0 + 6088 -6546 0 + 4977 -6546 0 + -6376 6546 0 + 6376 -6545 0 + 6376 -6546 0 + 4977 6547 0 + -4977 -6547 0 + -6121 -6547 6548 0 + 6547 -6548 0 + -4977 -6089 6549 0 + 6089 -6549 0 + 4977 -6549 0 + -6377 6549 0 + 6377 -6548 0 + 6377 -6549 0 + 4977 6550 0 + -4977 -6550 0 + -6122 -6550 6551 0 + 6550 -6551 0 + -4977 -6090 6552 0 + 6090 -6552 0 + 4977 -6552 0 + -6378 6552 0 + 6378 -6551 0 + 6378 -6552 0 + 4977 6553 0 + -4977 -6553 0 + -6123 -6553 6554 0 + 6553 -6554 0 + -4977 -6091 6555 0 + 6091 -6555 0 + 4977 -6555 0 + -6379 6555 0 + 6379 -6554 0 + 6379 -6555 0 + 4977 6556 0 + -4977 -6556 0 + -6124 -6556 6557 0 + 6556 -6557 0 + -4977 -6092 6558 0 + 6092 -6558 0 + 4977 -6558 0 + -6380 6558 0 + 6380 -6557 0 + 6380 -6558 0 + 4977 6559 0 + -4977 -6559 0 + -6125 -6559 6560 0 + 6559 -6560 0 + -4977 -6093 6561 0 + 6093 -6561 0 + 4977 -6561 0 + -6381 6561 0 + 6381 -6560 0 + 6381 -6561 0 + 4977 6562 0 + -4977 -6562 0 + -6126 -6562 6563 0 + 6562 -6563 0 + -4977 -6094 6564 0 + 6094 -6564 0 + 4977 -6564 0 + -6382 6564 0 + 6382 -6563 0 + 6382 -6564 0 + 4977 6565 0 + -4977 -6565 0 + -6127 -6565 6566 0 + 6565 -6566 0 + -4977 -6095 6567 0 + 6095 -6567 0 + 4977 -6567 0 + -6383 6567 0 + 6383 -6566 0 + 6383 -6567 0 + 4977 6568 0 + -4977 -6568 0 + -6128 -6568 6569 0 + 6568 -6569 0 + -4977 -6096 6570 0 + 6096 -6570 0 + 4977 -6570 0 + -6384 6570 0 + 6384 -6569 0 + 6384 -6570 0 + 4977 6571 0 + -4977 -6571 0 + -6129 -6571 6572 0 + 6571 -6572 0 + -4977 -6097 6573 0 + 6097 -6573 0 + 4977 -6573 0 + -6385 6573 0 + 6385 -6572 0 + 6385 -6573 0 + 4977 6574 0 + -4977 -6574 0 + -6130 -6574 6575 0 + 6574 -6575 0 + -4977 -6098 6576 0 + 6098 -6576 0 + 4977 -6576 0 + -6386 6576 0 + 6386 -6575 0 + 6386 -6576 0 + 4977 6577 0 + -4977 -6577 0 + -6131 -6577 6578 0 + 6577 -6578 0 + -4977 -6099 6579 0 + 6099 -6579 0 + 4977 -6579 0 + -6387 6579 0 + 6387 -6578 0 + 6387 -6579 0 + 4978 6580 0 + -4978 -6580 0 + -6324 -6580 6581 0 + 6324 -6581 0 + 6580 -6581 0 + -2 -4978 6582 0 + 4978 -6582 0 + -4980 6581 0 + 4980 -6581 0 + 4980 -6582 0 + 4978 6583 0 + -4978 -6583 0 + -6325 -6583 6584 0 + 6325 -6584 0 + 6583 -6584 0 + -2 -4978 6585 0 + 4978 -6585 0 + -4981 6584 0 + 4981 -6584 0 + 4981 -6585 0 + 4978 6586 0 + -4978 -6586 0 + -6326 -6586 6587 0 + 6326 -6587 0 + 6586 -6587 0 + -2 -4978 6588 0 + 4978 -6588 0 + -4982 6587 0 + 4982 -6587 0 + 4982 -6588 0 + 4978 6589 0 + -4978 -6589 0 + -6327 -6589 6590 0 + 6327 -6590 0 + 6589 -6590 0 + -2 -4978 6591 0 + 4978 -6591 0 + -4983 6590 0 + 4983 -6590 0 + 4983 -6591 0 + 4978 6592 0 + -4978 -6592 0 + -6328 -6592 6593 0 + 6328 -6593 0 + 6592 -6593 0 + -2 -4978 6594 0 + 4978 -6594 0 + -4984 6593 0 + 4984 -6593 0 + 4984 -6594 0 + 4978 6595 0 + -4978 -6595 0 + -6329 -6595 6596 0 + 6329 -6596 0 + 6595 -6596 0 + -2 -4978 6597 0 + 4978 -6597 0 + -4985 6596 0 + 4985 -6596 0 + 4985 -6597 0 + 4978 6598 0 + -4978 -6598 0 + -6330 -6598 6599 0 + 6330 -6599 0 + 6598 -6599 0 + -2 -4978 6600 0 + 4978 -6600 0 + -4986 6599 0 + 4986 -6599 0 + 4986 -6600 0 + 4978 6601 0 + -4978 -6601 0 + -6331 -6601 6602 0 + 6331 -6602 0 + 6601 -6602 0 + -2 -4978 6603 0 + 4978 -6603 0 + -4987 6602 0 + 4987 -6602 0 + 4987 -6603 0 + 4978 6604 0 + -4978 -6604 0 + -6332 -6604 6605 0 + 6332 -6605 0 + 6604 -6605 0 + -2 -4978 6606 0 + 4978 -6606 0 + -4988 6605 0 + 4988 -6605 0 + 4988 -6606 0 + 4978 6607 0 + -4978 -6607 0 + -6333 -6607 6608 0 + 6333 -6608 0 + 6607 -6608 0 + -2 -4978 6609 0 + 4978 -6609 0 + -4989 6608 0 + 4989 -6608 0 + 4989 -6609 0 + 4978 6610 0 + -4978 -6610 0 + -6334 -6610 6611 0 + 6334 -6611 0 + 6610 -6611 0 + -2 -4978 6612 0 + 4978 -6612 0 + -4990 6611 0 + 4990 -6611 0 + 4990 -6612 0 + 4978 6613 0 + -4978 -6613 0 + -6335 -6613 6614 0 + 6335 -6614 0 + 6613 -6614 0 + -2 -4978 6615 0 + 4978 -6615 0 + -4991 6614 0 + 4991 -6614 0 + 4991 -6615 0 + 4978 6616 0 + -4978 -6616 0 + -6336 -6616 6617 0 + 6336 -6617 0 + 6616 -6617 0 + -2 -4978 6618 0 + 4978 -6618 0 + -4992 6617 0 + 4992 -6617 0 + 4992 -6618 0 + 4978 6619 0 + -4978 -6619 0 + -6337 -6619 6620 0 + 6337 -6620 0 + 6619 -6620 0 + -2 -4978 6621 0 + 4978 -6621 0 + -4993 6620 0 + 4993 -6620 0 + 4993 -6621 0 + 4978 6622 0 + -4978 -6622 0 + -6338 -6622 6623 0 + 6338 -6623 0 + 6622 -6623 0 + -2 -4978 6624 0 + 4978 -6624 0 + -4994 6623 0 + 4994 -6623 0 + 4994 -6624 0 + 4978 6625 0 + -4978 -6625 0 + -6339 -6625 6626 0 + 6339 -6626 0 + 6625 -6626 0 + -2 -4978 6627 0 + 4978 -6627 0 + -4995 6626 0 + 4995 -6626 0 + 4995 -6627 0 + 4978 6628 0 + -4978 -6628 0 + -6340 -6628 6629 0 + 6340 -6629 0 + 6628 -6629 0 + -2 -4978 6630 0 + 4978 -6630 0 + -4996 6629 0 + 4996 -6629 0 + 4996 -6630 0 + 4978 6631 0 + -4978 -6631 0 + -6341 -6631 6632 0 + 6341 -6632 0 + 6631 -6632 0 + -2 -4978 6633 0 + 4978 -6633 0 + -4997 6632 0 + 4997 -6632 0 + 4997 -6633 0 + 4978 6634 0 + -4978 -6634 0 + -6342 -6634 6635 0 + 6342 -6635 0 + 6634 -6635 0 + -2 -4978 6636 0 + 4978 -6636 0 + -4998 6635 0 + 4998 -6635 0 + 4998 -6636 0 + 4978 6637 0 + -4978 -6637 0 + -6343 -6637 6638 0 + 6343 -6638 0 + 6637 -6638 0 + -2 -4978 6639 0 + 4978 -6639 0 + -4999 6638 0 + 4999 -6638 0 + 4999 -6639 0 + 4978 6640 0 + -4978 -6640 0 + -6344 -6640 6641 0 + 6344 -6641 0 + 6640 -6641 0 + -2 -4978 6642 0 + 4978 -6642 0 + -5000 6641 0 + 5000 -6641 0 + 5000 -6642 0 + 4978 6643 0 + -4978 -6643 0 + -6345 -6643 6644 0 + 6345 -6644 0 + 6643 -6644 0 + -2 -4978 6645 0 + 4978 -6645 0 + -5001 6644 0 + 5001 -6644 0 + 5001 -6645 0 + 4978 6646 0 + -4978 -6646 0 + -6346 -6646 6647 0 + 6346 -6647 0 + 6646 -6647 0 + -2 -4978 6648 0 + 4978 -6648 0 + -5002 6647 0 + 5002 -6647 0 + 5002 -6648 0 + 4978 6649 0 + -4978 -6649 0 + -6347 -6649 6650 0 + 6347 -6650 0 + 6649 -6650 0 + -2 -4978 6651 0 + 4978 -6651 0 + -5003 6650 0 + 5003 -6650 0 + 5003 -6651 0 + 4978 6652 0 + -4978 -6652 0 + -6348 -6652 6653 0 + 6348 -6653 0 + 6652 -6653 0 + -2 -4978 6654 0 + 4978 -6654 0 + -5004 6653 0 + 5004 -6653 0 + 5004 -6654 0 + 4978 6655 0 + -4978 -6655 0 + -6349 -6655 6656 0 + 6349 -6656 0 + 6655 -6656 0 + -2 -4978 6657 0 + 4978 -6657 0 + -5005 6656 0 + 5005 -6656 0 + 5005 -6657 0 + 4978 6658 0 + -4978 -6658 0 + -6350 -6658 6659 0 + 6350 -6659 0 + 6658 -6659 0 + -2 -4978 6660 0 + 4978 -6660 0 + -5006 6659 0 + 5006 -6659 0 + 5006 -6660 0 + 4978 6661 0 + -4978 -6661 0 + -6351 -6661 6662 0 + 6351 -6662 0 + 6661 -6662 0 + -2 -4978 6663 0 + 4978 -6663 0 + -5007 6662 0 + 5007 -6662 0 + 5007 -6663 0 + 4978 6664 0 + -4978 -6664 0 + -6352 -6664 6665 0 + 6352 -6665 0 + 6664 -6665 0 + -2 -4978 6666 0 + 4978 -6666 0 + -5008 6665 0 + 5008 -6665 0 + 5008 -6666 0 + 4978 6667 0 + -4978 -6667 0 + -6353 -6667 6668 0 + 6353 -6668 0 + 6667 -6668 0 + -2 -4978 6669 0 + 4978 -6669 0 + -5009 6668 0 + 5009 -6668 0 + 5009 -6669 0 + 4978 6670 0 + -4978 -6670 0 + -6354 -6670 6671 0 + 6354 -6671 0 + 6670 -6671 0 + -2 -4978 6672 0 + 4978 -6672 0 + -5010 6671 0 + 5010 -6671 0 + 5010 -6672 0 + 4978 6673 0 + -4978 -6673 0 + -6355 -6673 6674 0 + 6355 -6674 0 + 6673 -6674 0 + -2 -4978 6675 0 + 4978 -6675 0 + -5011 6674 0 + 5011 -6674 0 + 5011 -6675 0 + 4978 6676 0 + -4978 -6676 0 + -6356 -6676 6677 0 + 6356 -6677 0 + 6676 -6677 0 + -2 -4978 6678 0 + 4978 -6678 0 + -5012 6677 0 + 5012 -6677 0 + 5012 -6678 0 + 4978 6679 0 + -4978 -6679 0 + -6357 -6679 6680 0 + 6357 -6680 0 + 6679 -6680 0 + -2 -4978 6681 0 + 4978 -6681 0 + -5013 6680 0 + 5013 -6680 0 + 5013 -6681 0 + 4978 6682 0 + -4978 -6682 0 + -6358 -6682 6683 0 + 6358 -6683 0 + 6682 -6683 0 + -2 -4978 6684 0 + 4978 -6684 0 + -5014 6683 0 + 5014 -6683 0 + 5014 -6684 0 + 4978 6685 0 + -4978 -6685 0 + -6359 -6685 6686 0 + 6359 -6686 0 + 6685 -6686 0 + -2 -4978 6687 0 + 4978 -6687 0 + -5015 6686 0 + 5015 -6686 0 + 5015 -6687 0 + 4978 6688 0 + -4978 -6688 0 + -6360 -6688 6689 0 + 6360 -6689 0 + 6688 -6689 0 + -2 -4978 6690 0 + 4978 -6690 0 + -5016 6689 0 + 5016 -6689 0 + 5016 -6690 0 + 4978 6691 0 + -4978 -6691 0 + -6361 -6691 6692 0 + 6361 -6692 0 + 6691 -6692 0 + -2 -4978 6693 0 + 4978 -6693 0 + -5017 6692 0 + 5017 -6692 0 + 5017 -6693 0 + 4978 6694 0 + -4978 -6694 0 + -6362 -6694 6695 0 + 6362 -6695 0 + 6694 -6695 0 + -2 -4978 6696 0 + 4978 -6696 0 + -5018 6695 0 + 5018 -6695 0 + 5018 -6696 0 + 4978 6697 0 + -4978 -6697 0 + -6363 -6697 6698 0 + 6363 -6698 0 + 6697 -6698 0 + -2 -4978 6699 0 + 4978 -6699 0 + -5019 6698 0 + 5019 -6698 0 + 5019 -6699 0 + 4978 6700 0 + -4978 -6700 0 + -6364 -6700 6701 0 + 6364 -6701 0 + 6700 -6701 0 + -2 -4978 6702 0 + 4978 -6702 0 + -5020 6701 0 + 5020 -6701 0 + 5020 -6702 0 + 4978 6703 0 + -4978 -6703 0 + -6365 -6703 6704 0 + 6365 -6704 0 + 6703 -6704 0 + -2 -4978 6705 0 + 4978 -6705 0 + -5021 6704 0 + 5021 -6704 0 + 5021 -6705 0 + 4978 6706 0 + -4978 -6706 0 + -6366 -6706 6707 0 + 6366 -6707 0 + 6706 -6707 0 + -2 -4978 6708 0 + 4978 -6708 0 + -5022 6707 0 + 5022 -6707 0 + 5022 -6708 0 + 4978 6709 0 + -4978 -6709 0 + -6367 -6709 6710 0 + 6367 -6710 0 + 6709 -6710 0 + -2 -4978 6711 0 + 4978 -6711 0 + -5023 6710 0 + 5023 -6710 0 + 5023 -6711 0 + 4978 6712 0 + -4978 -6712 0 + -6368 -6712 6713 0 + 6368 -6713 0 + 6712 -6713 0 + -2 -4978 6714 0 + 4978 -6714 0 + -5024 6713 0 + 5024 -6713 0 + 5024 -6714 0 + 4978 6715 0 + -4978 -6715 0 + -6369 -6715 6716 0 + 6369 -6716 0 + 6715 -6716 0 + -2 -4978 6717 0 + 4978 -6717 0 + -5025 6716 0 + 5025 -6716 0 + 5025 -6717 0 + 4978 6718 0 + -4978 -6718 0 + -6370 -6718 6719 0 + 6370 -6719 0 + 6718 -6719 0 + -2 -4978 6720 0 + 4978 -6720 0 + -5026 6719 0 + 5026 -6719 0 + 5026 -6720 0 + 4978 6721 0 + -4978 -6721 0 + -6371 -6721 6722 0 + 6371 -6722 0 + 6721 -6722 0 + -2 -4978 6723 0 + 4978 -6723 0 + -5027 6722 0 + 5027 -6722 0 + 5027 -6723 0 + 4978 6724 0 + -4978 -6724 0 + -6372 -6724 6725 0 + 6372 -6725 0 + 6724 -6725 0 + -2 -4978 6726 0 + 4978 -6726 0 + -5028 6725 0 + 5028 -6725 0 + 5028 -6726 0 + 4978 6727 0 + -4978 -6727 0 + -6373 -6727 6728 0 + 6373 -6728 0 + 6727 -6728 0 + -2 -4978 6729 0 + 4978 -6729 0 + -5029 6728 0 + 5029 -6728 0 + 5029 -6729 0 + 4978 6730 0 + -4978 -6730 0 + -6374 -6730 6731 0 + 6374 -6731 0 + 6730 -6731 0 + -2 -4978 6732 0 + 4978 -6732 0 + -5030 6731 0 + 5030 -6731 0 + 5030 -6732 0 + 4978 6733 0 + -4978 -6733 0 + -6375 -6733 6734 0 + 6375 -6734 0 + 6733 -6734 0 + -2 -4978 6735 0 + 4978 -6735 0 + -5031 6734 0 + 5031 -6734 0 + 5031 -6735 0 + 4978 6736 0 + -4978 -6736 0 + -6376 -6736 6737 0 + 6376 -6737 0 + 6736 -6737 0 + -2 -4978 6738 0 + 4978 -6738 0 + -5032 6737 0 + 5032 -6737 0 + 5032 -6738 0 + 4978 6739 0 + -4978 -6739 0 + -6377 -6739 6740 0 + 6377 -6740 0 + 6739 -6740 0 + -2 -4978 6741 0 + 4978 -6741 0 + -5033 6740 0 + 5033 -6740 0 + 5033 -6741 0 + 4978 6742 0 + -4978 -6742 0 + -6378 -6742 6743 0 + 6378 -6743 0 + 6742 -6743 0 + -2 -4978 6744 0 + 4978 -6744 0 + -5034 6743 0 + 5034 -6743 0 + 5034 -6744 0 + 4978 6745 0 + -4978 -6745 0 + -6379 -6745 6746 0 + 6379 -6746 0 + 6745 -6746 0 + -2 -4978 6747 0 + 4978 -6747 0 + -5035 6746 0 + 5035 -6746 0 + 5035 -6747 0 + 4978 6748 0 + -4978 -6748 0 + -6380 -6748 6749 0 + 6380 -6749 0 + 6748 -6749 0 + -2 -4978 6750 0 + 4978 -6750 0 + -5036 6749 0 + 5036 -6749 0 + 5036 -6750 0 + 4978 6751 0 + -4978 -6751 0 + -6381 -6751 6752 0 + 6381 -6752 0 + 6751 -6752 0 + -2 -4978 6753 0 + 4978 -6753 0 + -5037 6752 0 + 5037 -6752 0 + 5037 -6753 0 + 4978 6754 0 + -4978 -6754 0 + -6382 -6754 6755 0 + 6382 -6755 0 + 6754 -6755 0 + -2 -4978 6756 0 + 4978 -6756 0 + -5038 6755 0 + 5038 -6755 0 + 5038 -6756 0 + 4978 6757 0 + -4978 -6757 0 + -6383 -6757 6758 0 + 6383 -6758 0 + 6757 -6758 0 + -2 -4978 6759 0 + 4978 -6759 0 + -5039 6758 0 + 5039 -6758 0 + 5039 -6759 0 + 4978 6760 0 + -4978 -6760 0 + -6384 -6760 6761 0 + 6384 -6761 0 + 6760 -6761 0 + -2 -4978 6762 0 + 4978 -6762 0 + -5040 6761 0 + 5040 -6761 0 + 5040 -6762 0 + 4978 6763 0 + -4978 -6763 0 + -6385 -6763 6764 0 + 6385 -6764 0 + 6763 -6764 0 + -2 -4978 6765 0 + 4978 -6765 0 + -5041 6764 0 + 5041 -6764 0 + 5041 -6765 0 + 4978 6766 0 + -4978 -6766 0 + -6386 -6766 6767 0 + 6386 -6767 0 + 6766 -6767 0 + -2 -4978 6768 0 + 4978 -6768 0 + -5042 6767 0 + 5042 -6767 0 + 5042 -6768 0 + 4978 6769 0 + -4978 -6769 0 + -6387 -6769 6770 0 + 6387 -6770 0 + 6769 -6770 0 + -2 -4978 6771 0 + 4978 -6771 0 + -5043 6770 0 + 5043 -6770 0 + 5043 -6771 0 + 4491 -4980 6836 0 + -4491 4980 6836 0 + 4491 4980 -6836 0 + -4491 -4980 -6836 0 + -4491 -4980 6838 0 + 4980 -6838 0 + 4491 -6838 0 + -2 -6836 6837 0 + 6836 -6837 0 + 6838 -6839 0 + -6837 6839 0 + -6838 6839 0 + 6772 -6836 0 + -2 6772 6836 0 + -6772 6836 0 + -2 -6772 -6836 0 + 4492 -4981 6840 0 + -4492 4981 6840 0 + 4492 4981 -6840 0 + -4492 -4981 -6840 0 + -4492 -4981 6842 0 + 4981 -6842 0 + 4492 -6842 0 + -6839 -6840 6841 0 + 6840 -6841 0 + 6839 -6841 0 + 6841 6842 -6843 0 + -6841 6843 0 + -6842 6843 0 + 6773 6839 -6840 0 + 6773 -6839 6840 0 + -6773 6839 6840 0 + -6773 -6839 -6840 0 + 4493 -4982 6844 0 + -4493 4982 6844 0 + 4493 4982 -6844 0 + -4493 -4982 -6844 0 + -4493 -4982 6846 0 + 4982 -6846 0 + 4493 -6846 0 + -6843 -6844 6845 0 + 6844 -6845 0 + 6843 -6845 0 + 6845 6846 -6847 0 + -6845 6847 0 + -6846 6847 0 + 6774 6843 -6844 0 + 6774 -6843 6844 0 + -6774 6843 6844 0 + -6774 -6843 -6844 0 + 4494 -4983 6848 0 + -4494 4983 6848 0 + 4494 4983 -6848 0 + -4494 -4983 -6848 0 + -4494 -4983 6850 0 + 4983 -6850 0 + 4494 -6850 0 + -6847 -6848 6849 0 + 6848 -6849 0 + 6847 -6849 0 + 6849 6850 -6851 0 + -6849 6851 0 + -6850 6851 0 + 6775 6847 -6848 0 + 6775 -6847 6848 0 + -6775 6847 6848 0 + -6775 -6847 -6848 0 + 4495 -4984 6852 0 + -4495 4984 6852 0 + 4495 4984 -6852 0 + -4495 -4984 -6852 0 + -4495 -4984 6854 0 + 4984 -6854 0 + 4495 -6854 0 + -6851 -6852 6853 0 + 6852 -6853 0 + 6851 -6853 0 + 6853 6854 -6855 0 + -6853 6855 0 + -6854 6855 0 + 6776 6851 -6852 0 + 6776 -6851 6852 0 + -6776 6851 6852 0 + -6776 -6851 -6852 0 + 4496 -4985 6856 0 + -4496 4985 6856 0 + 4496 4985 -6856 0 + -4496 -4985 -6856 0 + -4496 -4985 6858 0 + 4985 -6858 0 + 4496 -6858 0 + -6855 -6856 6857 0 + 6856 -6857 0 + 6855 -6857 0 + 6857 6858 -6859 0 + -6857 6859 0 + -6858 6859 0 + 6777 6855 -6856 0 + 6777 -6855 6856 0 + -6777 6855 6856 0 + -6777 -6855 -6856 0 + 4497 -4986 6860 0 + -4497 4986 6860 0 + 4497 4986 -6860 0 + -4497 -4986 -6860 0 + -4497 -4986 6862 0 + 4986 -6862 0 + 4497 -6862 0 + -6859 -6860 6861 0 + 6860 -6861 0 + 6859 -6861 0 + 6861 6862 -6863 0 + -6861 6863 0 + -6862 6863 0 + 6778 6859 -6860 0 + 6778 -6859 6860 0 + -6778 6859 6860 0 + -6778 -6859 -6860 0 + 4498 -4987 6864 0 + -4498 4987 6864 0 + 4498 4987 -6864 0 + -4498 -4987 -6864 0 + -4498 -4987 6866 0 + 4987 -6866 0 + 4498 -6866 0 + -6863 -6864 6865 0 + 6864 -6865 0 + 6863 -6865 0 + 6865 6866 -6867 0 + -6865 6867 0 + -6866 6867 0 + 6779 6863 -6864 0 + 6779 -6863 6864 0 + -6779 6863 6864 0 + -6779 -6863 -6864 0 + 4499 -4988 6868 0 + -4499 4988 6868 0 + 4499 4988 -6868 0 + -4499 -4988 -6868 0 + -4499 -4988 6870 0 + 4988 -6870 0 + 4499 -6870 0 + -6867 -6868 6869 0 + 6868 -6869 0 + 6867 -6869 0 + 6869 6870 -6871 0 + -6869 6871 0 + -6870 6871 0 + 6780 6867 -6868 0 + 6780 -6867 6868 0 + -6780 6867 6868 0 + -6780 -6867 -6868 0 + 4500 -4989 6872 0 + -4500 4989 6872 0 + 4500 4989 -6872 0 + -4500 -4989 -6872 0 + -4500 -4989 6874 0 + 4989 -6874 0 + 4500 -6874 0 + -6871 -6872 6873 0 + 6872 -6873 0 + 6871 -6873 0 + 6873 6874 -6875 0 + -6873 6875 0 + -6874 6875 0 + 6781 6871 -6872 0 + 6781 -6871 6872 0 + -6781 6871 6872 0 + -6781 -6871 -6872 0 + 4501 -4990 6876 0 + -4501 4990 6876 0 + 4501 4990 -6876 0 + -4501 -4990 -6876 0 + -4501 -4990 6878 0 + 4990 -6878 0 + 4501 -6878 0 + -6875 -6876 6877 0 + 6876 -6877 0 + 6875 -6877 0 + 6877 6878 -6879 0 + -6877 6879 0 + -6878 6879 0 + 6782 6875 -6876 0 + 6782 -6875 6876 0 + -6782 6875 6876 0 + -6782 -6875 -6876 0 + 4502 -4991 6880 0 + -4502 4991 6880 0 + 4502 4991 -6880 0 + -4502 -4991 -6880 0 + -4502 -4991 6882 0 + 4991 -6882 0 + 4502 -6882 0 + -6879 -6880 6881 0 + 6880 -6881 0 + 6879 -6881 0 + 6881 6882 -6883 0 + -6881 6883 0 + -6882 6883 0 + 6783 6879 -6880 0 + 6783 -6879 6880 0 + -6783 6879 6880 0 + -6783 -6879 -6880 0 + 4503 -4992 6884 0 + -4503 4992 6884 0 + 4503 4992 -6884 0 + -4503 -4992 -6884 0 + -4503 -4992 6886 0 + 4992 -6886 0 + 4503 -6886 0 + -6883 -6884 6885 0 + 6884 -6885 0 + 6883 -6885 0 + 6885 6886 -6887 0 + -6885 6887 0 + -6886 6887 0 + 6784 6883 -6884 0 + 6784 -6883 6884 0 + -6784 6883 6884 0 + -6784 -6883 -6884 0 + 4504 -4993 6888 0 + -4504 4993 6888 0 + 4504 4993 -6888 0 + -4504 -4993 -6888 0 + -4504 -4993 6890 0 + 4993 -6890 0 + 4504 -6890 0 + -6887 -6888 6889 0 + 6888 -6889 0 + 6887 -6889 0 + 6889 6890 -6891 0 + -6889 6891 0 + -6890 6891 0 + 6785 6887 -6888 0 + 6785 -6887 6888 0 + -6785 6887 6888 0 + -6785 -6887 -6888 0 + 4505 -4994 6892 0 + -4505 4994 6892 0 + 4505 4994 -6892 0 + -4505 -4994 -6892 0 + -4505 -4994 6894 0 + 4994 -6894 0 + 4505 -6894 0 + -6891 -6892 6893 0 + 6892 -6893 0 + 6891 -6893 0 + 6893 6894 -6895 0 + -6893 6895 0 + -6894 6895 0 + 6786 6891 -6892 0 + 6786 -6891 6892 0 + -6786 6891 6892 0 + -6786 -6891 -6892 0 + 4506 -4995 6896 0 + -4506 4995 6896 0 + 4506 4995 -6896 0 + -4506 -4995 -6896 0 + -4506 -4995 6898 0 + 4995 -6898 0 + 4506 -6898 0 + -6895 -6896 6897 0 + 6896 -6897 0 + 6895 -6897 0 + 6897 6898 -6899 0 + -6897 6899 0 + -6898 6899 0 + 6787 6895 -6896 0 + 6787 -6895 6896 0 + -6787 6895 6896 0 + -6787 -6895 -6896 0 + 4507 -4996 6900 0 + -4507 4996 6900 0 + 4507 4996 -6900 0 + -4507 -4996 -6900 0 + -4507 -4996 6902 0 + 4996 -6902 0 + 4507 -6902 0 + -6899 -6900 6901 0 + 6900 -6901 0 + 6899 -6901 0 + 6901 6902 -6903 0 + -6901 6903 0 + -6902 6903 0 + 6788 6899 -6900 0 + 6788 -6899 6900 0 + -6788 6899 6900 0 + -6788 -6899 -6900 0 + 4508 -4997 6904 0 + -4508 4997 6904 0 + 4508 4997 -6904 0 + -4508 -4997 -6904 0 + -4508 -4997 6906 0 + 4997 -6906 0 + 4508 -6906 0 + -6903 -6904 6905 0 + 6904 -6905 0 + 6903 -6905 0 + 6905 6906 -6907 0 + -6905 6907 0 + -6906 6907 0 + 6789 6903 -6904 0 + 6789 -6903 6904 0 + -6789 6903 6904 0 + -6789 -6903 -6904 0 + 4509 -4998 6908 0 + -4509 4998 6908 0 + 4509 4998 -6908 0 + -4509 -4998 -6908 0 + -4509 -4998 6910 0 + 4998 -6910 0 + 4509 -6910 0 + -6907 -6908 6909 0 + 6908 -6909 0 + 6907 -6909 0 + 6909 6910 -6911 0 + -6909 6911 0 + -6910 6911 0 + 6790 6907 -6908 0 + 6790 -6907 6908 0 + -6790 6907 6908 0 + -6790 -6907 -6908 0 + 4510 -4999 6912 0 + -4510 4999 6912 0 + 4510 4999 -6912 0 + -4510 -4999 -6912 0 + -4510 -4999 6914 0 + 4999 -6914 0 + 4510 -6914 0 + -6911 -6912 6913 0 + 6912 -6913 0 + 6911 -6913 0 + 6913 6914 -6915 0 + -6913 6915 0 + -6914 6915 0 + 6791 6911 -6912 0 + 6791 -6911 6912 0 + -6791 6911 6912 0 + -6791 -6911 -6912 0 + 4511 -5000 6916 0 + -4511 5000 6916 0 + 4511 5000 -6916 0 + -4511 -5000 -6916 0 + -4511 -5000 6918 0 + 5000 -6918 0 + 4511 -6918 0 + -6915 -6916 6917 0 + 6916 -6917 0 + 6915 -6917 0 + 6917 6918 -6919 0 + -6917 6919 0 + -6918 6919 0 + 6792 6915 -6916 0 + 6792 -6915 6916 0 + -6792 6915 6916 0 + -6792 -6915 -6916 0 + 4512 -5001 6920 0 + -4512 5001 6920 0 + 4512 5001 -6920 0 + -4512 -5001 -6920 0 + -4512 -5001 6922 0 + 5001 -6922 0 + 4512 -6922 0 + -6919 -6920 6921 0 + 6920 -6921 0 + 6919 -6921 0 + 6921 6922 -6923 0 + -6921 6923 0 + -6922 6923 0 + 6793 6919 -6920 0 + 6793 -6919 6920 0 + -6793 6919 6920 0 + -6793 -6919 -6920 0 + 4513 -5002 6924 0 + -4513 5002 6924 0 + 4513 5002 -6924 0 + -4513 -5002 -6924 0 + -4513 -5002 6926 0 + 5002 -6926 0 + 4513 -6926 0 + -6923 -6924 6925 0 + 6924 -6925 0 + 6923 -6925 0 + 6925 6926 -6927 0 + -6925 6927 0 + -6926 6927 0 + 6794 6923 -6924 0 + 6794 -6923 6924 0 + -6794 6923 6924 0 + -6794 -6923 -6924 0 + 4514 -5003 6928 0 + -4514 5003 6928 0 + 4514 5003 -6928 0 + -4514 -5003 -6928 0 + -4514 -5003 6930 0 + 5003 -6930 0 + 4514 -6930 0 + -6927 -6928 6929 0 + 6928 -6929 0 + 6927 -6929 0 + 6929 6930 -6931 0 + -6929 6931 0 + -6930 6931 0 + 6795 6927 -6928 0 + 6795 -6927 6928 0 + -6795 6927 6928 0 + -6795 -6927 -6928 0 + 4515 -5004 6932 0 + -4515 5004 6932 0 + 4515 5004 -6932 0 + -4515 -5004 -6932 0 + -4515 -5004 6934 0 + 5004 -6934 0 + 4515 -6934 0 + -6931 -6932 6933 0 + 6932 -6933 0 + 6931 -6933 0 + 6933 6934 -6935 0 + -6933 6935 0 + -6934 6935 0 + 6796 6931 -6932 0 + 6796 -6931 6932 0 + -6796 6931 6932 0 + -6796 -6931 -6932 0 + 4516 -5005 6936 0 + -4516 5005 6936 0 + 4516 5005 -6936 0 + -4516 -5005 -6936 0 + -4516 -5005 6938 0 + 5005 -6938 0 + 4516 -6938 0 + -6935 -6936 6937 0 + 6936 -6937 0 + 6935 -6937 0 + 6937 6938 -6939 0 + -6937 6939 0 + -6938 6939 0 + 6797 6935 -6936 0 + 6797 -6935 6936 0 + -6797 6935 6936 0 + -6797 -6935 -6936 0 + 4517 -5006 6940 0 + -4517 5006 6940 0 + 4517 5006 -6940 0 + -4517 -5006 -6940 0 + -4517 -5006 6942 0 + 5006 -6942 0 + 4517 -6942 0 + -6939 -6940 6941 0 + 6940 -6941 0 + 6939 -6941 0 + 6941 6942 -6943 0 + -6941 6943 0 + -6942 6943 0 + 6798 6939 -6940 0 + 6798 -6939 6940 0 + -6798 6939 6940 0 + -6798 -6939 -6940 0 + 4518 -5007 6944 0 + -4518 5007 6944 0 + 4518 5007 -6944 0 + -4518 -5007 -6944 0 + -4518 -5007 6946 0 + 5007 -6946 0 + 4518 -6946 0 + -6943 -6944 6945 0 + 6944 -6945 0 + 6943 -6945 0 + 6945 6946 -6947 0 + -6945 6947 0 + -6946 6947 0 + 6799 6943 -6944 0 + 6799 -6943 6944 0 + -6799 6943 6944 0 + -6799 -6943 -6944 0 + 4519 -5008 6948 0 + -4519 5008 6948 0 + 4519 5008 -6948 0 + -4519 -5008 -6948 0 + -4519 -5008 6950 0 + 5008 -6950 0 + 4519 -6950 0 + -6947 -6948 6949 0 + 6948 -6949 0 + 6947 -6949 0 + 6949 6950 -6951 0 + -6949 6951 0 + -6950 6951 0 + 6800 6947 -6948 0 + 6800 -6947 6948 0 + -6800 6947 6948 0 + -6800 -6947 -6948 0 + 4520 -5009 6952 0 + -4520 5009 6952 0 + 4520 5009 -6952 0 + -4520 -5009 -6952 0 + -4520 -5009 6954 0 + 5009 -6954 0 + 4520 -6954 0 + -6951 -6952 6953 0 + 6952 -6953 0 + 6951 -6953 0 + 6953 6954 -6955 0 + -6953 6955 0 + -6954 6955 0 + 6801 6951 -6952 0 + 6801 -6951 6952 0 + -6801 6951 6952 0 + -6801 -6951 -6952 0 + 4521 -5010 6956 0 + -4521 5010 6956 0 + 4521 5010 -6956 0 + -4521 -5010 -6956 0 + -4521 -5010 6958 0 + 5010 -6958 0 + 4521 -6958 0 + -6955 -6956 6957 0 + 6956 -6957 0 + 6955 -6957 0 + 6957 6958 -6959 0 + -6957 6959 0 + -6958 6959 0 + 6802 6955 -6956 0 + 6802 -6955 6956 0 + -6802 6955 6956 0 + -6802 -6955 -6956 0 + 4522 -5011 6960 0 + -4522 5011 6960 0 + 4522 5011 -6960 0 + -4522 -5011 -6960 0 + -4522 -5011 6962 0 + 5011 -6962 0 + 4522 -6962 0 + -6959 -6960 6961 0 + 6960 -6961 0 + 6959 -6961 0 + 6961 6962 -6963 0 + -6961 6963 0 + -6962 6963 0 + 6803 6959 -6960 0 + 6803 -6959 6960 0 + -6803 6959 6960 0 + -6803 -6959 -6960 0 + 4523 -5012 6964 0 + -4523 5012 6964 0 + 4523 5012 -6964 0 + -4523 -5012 -6964 0 + -4523 -5012 6966 0 + 5012 -6966 0 + 4523 -6966 0 + -6963 -6964 6965 0 + 6964 -6965 0 + 6963 -6965 0 + 6965 6966 -6967 0 + -6965 6967 0 + -6966 6967 0 + 6804 6963 -6964 0 + 6804 -6963 6964 0 + -6804 6963 6964 0 + -6804 -6963 -6964 0 + 4524 -5013 6968 0 + -4524 5013 6968 0 + 4524 5013 -6968 0 + -4524 -5013 -6968 0 + -4524 -5013 6970 0 + 5013 -6970 0 + 4524 -6970 0 + -6967 -6968 6969 0 + 6968 -6969 0 + 6967 -6969 0 + 6969 6970 -6971 0 + -6969 6971 0 + -6970 6971 0 + 6805 6967 -6968 0 + 6805 -6967 6968 0 + -6805 6967 6968 0 + -6805 -6967 -6968 0 + 4525 -5014 6972 0 + -4525 5014 6972 0 + 4525 5014 -6972 0 + -4525 -5014 -6972 0 + -4525 -5014 6974 0 + 5014 -6974 0 + 4525 -6974 0 + -6971 -6972 6973 0 + 6972 -6973 0 + 6971 -6973 0 + 6973 6974 -6975 0 + -6973 6975 0 + -6974 6975 0 + 6806 6971 -6972 0 + 6806 -6971 6972 0 + -6806 6971 6972 0 + -6806 -6971 -6972 0 + 4526 -5015 6976 0 + -4526 5015 6976 0 + 4526 5015 -6976 0 + -4526 -5015 -6976 0 + -4526 -5015 6978 0 + 5015 -6978 0 + 4526 -6978 0 + -6975 -6976 6977 0 + 6976 -6977 0 + 6975 -6977 0 + 6977 6978 -6979 0 + -6977 6979 0 + -6978 6979 0 + 6807 6975 -6976 0 + 6807 -6975 6976 0 + -6807 6975 6976 0 + -6807 -6975 -6976 0 + 4527 -5016 6980 0 + -4527 5016 6980 0 + 4527 5016 -6980 0 + -4527 -5016 -6980 0 + -4527 -5016 6982 0 + 5016 -6982 0 + 4527 -6982 0 + -6979 -6980 6981 0 + 6980 -6981 0 + 6979 -6981 0 + 6981 6982 -6983 0 + -6981 6983 0 + -6982 6983 0 + 6808 6979 -6980 0 + 6808 -6979 6980 0 + -6808 6979 6980 0 + -6808 -6979 -6980 0 + 4528 -5017 6984 0 + -4528 5017 6984 0 + 4528 5017 -6984 0 + -4528 -5017 -6984 0 + -4528 -5017 6986 0 + 5017 -6986 0 + 4528 -6986 0 + -6983 -6984 6985 0 + 6984 -6985 0 + 6983 -6985 0 + 6985 6986 -6987 0 + -6985 6987 0 + -6986 6987 0 + 6809 6983 -6984 0 + 6809 -6983 6984 0 + -6809 6983 6984 0 + -6809 -6983 -6984 0 + 4529 -5018 6988 0 + -4529 5018 6988 0 + 4529 5018 -6988 0 + -4529 -5018 -6988 0 + -4529 -5018 6990 0 + 5018 -6990 0 + 4529 -6990 0 + -6987 -6988 6989 0 + 6988 -6989 0 + 6987 -6989 0 + 6989 6990 -6991 0 + -6989 6991 0 + -6990 6991 0 + 6810 6987 -6988 0 + 6810 -6987 6988 0 + -6810 6987 6988 0 + -6810 -6987 -6988 0 + 4530 -5019 6992 0 + -4530 5019 6992 0 + 4530 5019 -6992 0 + -4530 -5019 -6992 0 + -4530 -5019 6994 0 + 5019 -6994 0 + 4530 -6994 0 + -6991 -6992 6993 0 + 6992 -6993 0 + 6991 -6993 0 + 6993 6994 -6995 0 + -6993 6995 0 + -6994 6995 0 + 6811 6991 -6992 0 + 6811 -6991 6992 0 + -6811 6991 6992 0 + -6811 -6991 -6992 0 + 4531 -5020 6996 0 + -4531 5020 6996 0 + 4531 5020 -6996 0 + -4531 -5020 -6996 0 + -4531 -5020 6998 0 + 5020 -6998 0 + 4531 -6998 0 + -6995 -6996 6997 0 + 6996 -6997 0 + 6995 -6997 0 + 6997 6998 -6999 0 + -6997 6999 0 + -6998 6999 0 + 6812 6995 -6996 0 + 6812 -6995 6996 0 + -6812 6995 6996 0 + -6812 -6995 -6996 0 + 4532 -5021 7000 0 + -4532 5021 7000 0 + 4532 5021 -7000 0 + -4532 -5021 -7000 0 + -4532 -5021 7002 0 + 5021 -7002 0 + 4532 -7002 0 + -6999 -7000 7001 0 + 7000 -7001 0 + 6999 -7001 0 + 7001 7002 -7003 0 + -7001 7003 0 + -7002 7003 0 + 6813 6999 -7000 0 + 6813 -6999 7000 0 + -6813 6999 7000 0 + -6813 -6999 -7000 0 + 4533 -5022 7004 0 + -4533 5022 7004 0 + 4533 5022 -7004 0 + -4533 -5022 -7004 0 + -4533 -5022 7006 0 + 5022 -7006 0 + 4533 -7006 0 + -7003 -7004 7005 0 + 7004 -7005 0 + 7003 -7005 0 + 7005 7006 -7007 0 + -7005 7007 0 + -7006 7007 0 + 6814 7003 -7004 0 + 6814 -7003 7004 0 + -6814 7003 7004 0 + -6814 -7003 -7004 0 + 4534 -5023 7008 0 + -4534 5023 7008 0 + 4534 5023 -7008 0 + -4534 -5023 -7008 0 + -4534 -5023 7010 0 + 5023 -7010 0 + 4534 -7010 0 + -7007 -7008 7009 0 + 7008 -7009 0 + 7007 -7009 0 + 7009 7010 -7011 0 + -7009 7011 0 + -7010 7011 0 + 6815 7007 -7008 0 + 6815 -7007 7008 0 + -6815 7007 7008 0 + -6815 -7007 -7008 0 + 4535 -5024 7012 0 + -4535 5024 7012 0 + 4535 5024 -7012 0 + -4535 -5024 -7012 0 + -4535 -5024 7014 0 + 5024 -7014 0 + 4535 -7014 0 + -7011 -7012 7013 0 + 7012 -7013 0 + 7011 -7013 0 + 7013 7014 -7015 0 + -7013 7015 0 + -7014 7015 0 + 6816 7011 -7012 0 + 6816 -7011 7012 0 + -6816 7011 7012 0 + -6816 -7011 -7012 0 + 4536 -5025 7016 0 + -4536 5025 7016 0 + 4536 5025 -7016 0 + -4536 -5025 -7016 0 + -4536 -5025 7018 0 + 5025 -7018 0 + 4536 -7018 0 + -7015 -7016 7017 0 + 7016 -7017 0 + 7015 -7017 0 + 7017 7018 -7019 0 + -7017 7019 0 + -7018 7019 0 + 6817 7015 -7016 0 + 6817 -7015 7016 0 + -6817 7015 7016 0 + -6817 -7015 -7016 0 + 4537 -5026 7020 0 + -4537 5026 7020 0 + 4537 5026 -7020 0 + -4537 -5026 -7020 0 + -4537 -5026 7022 0 + 5026 -7022 0 + 4537 -7022 0 + -7019 -7020 7021 0 + 7020 -7021 0 + 7019 -7021 0 + 7021 7022 -7023 0 + -7021 7023 0 + -7022 7023 0 + 6818 7019 -7020 0 + 6818 -7019 7020 0 + -6818 7019 7020 0 + -6818 -7019 -7020 0 + 4538 -5027 7024 0 + -4538 5027 7024 0 + 4538 5027 -7024 0 + -4538 -5027 -7024 0 + -4538 -5027 7026 0 + 5027 -7026 0 + 4538 -7026 0 + -7023 -7024 7025 0 + 7024 -7025 0 + 7023 -7025 0 + 7025 7026 -7027 0 + -7025 7027 0 + -7026 7027 0 + 6819 7023 -7024 0 + 6819 -7023 7024 0 + -6819 7023 7024 0 + -6819 -7023 -7024 0 + 4539 -5028 7028 0 + -4539 5028 7028 0 + 4539 5028 -7028 0 + -4539 -5028 -7028 0 + -4539 -5028 7030 0 + 5028 -7030 0 + 4539 -7030 0 + -7027 -7028 7029 0 + 7028 -7029 0 + 7027 -7029 0 + 7029 7030 -7031 0 + -7029 7031 0 + -7030 7031 0 + 6820 7027 -7028 0 + 6820 -7027 7028 0 + -6820 7027 7028 0 + -6820 -7027 -7028 0 + 4540 -5029 7032 0 + -4540 5029 7032 0 + 4540 5029 -7032 0 + -4540 -5029 -7032 0 + -4540 -5029 7034 0 + 5029 -7034 0 + 4540 -7034 0 + -7031 -7032 7033 0 + 7032 -7033 0 + 7031 -7033 0 + 7033 7034 -7035 0 + -7033 7035 0 + -7034 7035 0 + 6821 7031 -7032 0 + 6821 -7031 7032 0 + -6821 7031 7032 0 + -6821 -7031 -7032 0 + 4541 -5030 7036 0 + -4541 5030 7036 0 + 4541 5030 -7036 0 + -4541 -5030 -7036 0 + -4541 -5030 7038 0 + 5030 -7038 0 + 4541 -7038 0 + -7035 -7036 7037 0 + 7036 -7037 0 + 7035 -7037 0 + 7037 7038 -7039 0 + -7037 7039 0 + -7038 7039 0 + 6822 7035 -7036 0 + 6822 -7035 7036 0 + -6822 7035 7036 0 + -6822 -7035 -7036 0 + 4542 -5031 7040 0 + -4542 5031 7040 0 + 4542 5031 -7040 0 + -4542 -5031 -7040 0 + -4542 -5031 7042 0 + 5031 -7042 0 + 4542 -7042 0 + -7039 -7040 7041 0 + 7040 -7041 0 + 7039 -7041 0 + 7041 7042 -7043 0 + -7041 7043 0 + -7042 7043 0 + 6823 7039 -7040 0 + 6823 -7039 7040 0 + -6823 7039 7040 0 + -6823 -7039 -7040 0 + 4543 -5032 7044 0 + -4543 5032 7044 0 + 4543 5032 -7044 0 + -4543 -5032 -7044 0 + -4543 -5032 7046 0 + 5032 -7046 0 + 4543 -7046 0 + -7043 -7044 7045 0 + 7044 -7045 0 + 7043 -7045 0 + 7045 7046 -7047 0 + -7045 7047 0 + -7046 7047 0 + 6824 7043 -7044 0 + 6824 -7043 7044 0 + -6824 7043 7044 0 + -6824 -7043 -7044 0 + 4544 -5033 7048 0 + -4544 5033 7048 0 + 4544 5033 -7048 0 + -4544 -5033 -7048 0 + -4544 -5033 7050 0 + 5033 -7050 0 + 4544 -7050 0 + -7047 -7048 7049 0 + 7048 -7049 0 + 7047 -7049 0 + 7049 7050 -7051 0 + -7049 7051 0 + -7050 7051 0 + 6825 7047 -7048 0 + 6825 -7047 7048 0 + -6825 7047 7048 0 + -6825 -7047 -7048 0 + 4545 -5034 7052 0 + -4545 5034 7052 0 + 4545 5034 -7052 0 + -4545 -5034 -7052 0 + -4545 -5034 7054 0 + 5034 -7054 0 + 4545 -7054 0 + -7051 -7052 7053 0 + 7052 -7053 0 + 7051 -7053 0 + 7053 7054 -7055 0 + -7053 7055 0 + -7054 7055 0 + 6826 7051 -7052 0 + 6826 -7051 7052 0 + -6826 7051 7052 0 + -6826 -7051 -7052 0 + 4546 -5035 7056 0 + -4546 5035 7056 0 + 4546 5035 -7056 0 + -4546 -5035 -7056 0 + -4546 -5035 7058 0 + 5035 -7058 0 + 4546 -7058 0 + -7055 -7056 7057 0 + 7056 -7057 0 + 7055 -7057 0 + 7057 7058 -7059 0 + -7057 7059 0 + -7058 7059 0 + 6827 7055 -7056 0 + 6827 -7055 7056 0 + -6827 7055 7056 0 + -6827 -7055 -7056 0 + 4547 -5036 7060 0 + -4547 5036 7060 0 + 4547 5036 -7060 0 + -4547 -5036 -7060 0 + -4547 -5036 7062 0 + 5036 -7062 0 + 4547 -7062 0 + -7059 -7060 7061 0 + 7060 -7061 0 + 7059 -7061 0 + 7061 7062 -7063 0 + -7061 7063 0 + -7062 7063 0 + 6828 7059 -7060 0 + 6828 -7059 7060 0 + -6828 7059 7060 0 + -6828 -7059 -7060 0 + 4548 -5037 7064 0 + -4548 5037 7064 0 + 4548 5037 -7064 0 + -4548 -5037 -7064 0 + -4548 -5037 7066 0 + 5037 -7066 0 + 4548 -7066 0 + -7063 -7064 7065 0 + 7064 -7065 0 + 7063 -7065 0 + 7065 7066 -7067 0 + -7065 7067 0 + -7066 7067 0 + 6829 7063 -7064 0 + 6829 -7063 7064 0 + -6829 7063 7064 0 + -6829 -7063 -7064 0 + 4549 -5038 7068 0 + -4549 5038 7068 0 + 4549 5038 -7068 0 + -4549 -5038 -7068 0 + -4549 -5038 7070 0 + 5038 -7070 0 + 4549 -7070 0 + -7067 -7068 7069 0 + 7068 -7069 0 + 7067 -7069 0 + 7069 7070 -7071 0 + -7069 7071 0 + -7070 7071 0 + 6830 7067 -7068 0 + 6830 -7067 7068 0 + -6830 7067 7068 0 + -6830 -7067 -7068 0 + 4550 -5039 7072 0 + -4550 5039 7072 0 + 4550 5039 -7072 0 + -4550 -5039 -7072 0 + -4550 -5039 7074 0 + 5039 -7074 0 + 4550 -7074 0 + -7071 -7072 7073 0 + 7072 -7073 0 + 7071 -7073 0 + 7073 7074 -7075 0 + -7073 7075 0 + -7074 7075 0 + 6831 7071 -7072 0 + 6831 -7071 7072 0 + -6831 7071 7072 0 + -6831 -7071 -7072 0 + 4551 -5040 7076 0 + -4551 5040 7076 0 + 4551 5040 -7076 0 + -4551 -5040 -7076 0 + -4551 -5040 7078 0 + 5040 -7078 0 + 4551 -7078 0 + -7075 -7076 7077 0 + 7076 -7077 0 + 7075 -7077 0 + 7077 7078 -7079 0 + -7077 7079 0 + -7078 7079 0 + 6832 7075 -7076 0 + 6832 -7075 7076 0 + -6832 7075 7076 0 + -6832 -7075 -7076 0 + 4552 -5041 7080 0 + -4552 5041 7080 0 + 4552 5041 -7080 0 + -4552 -5041 -7080 0 + -4552 -5041 7082 0 + 5041 -7082 0 + 4552 -7082 0 + -7079 -7080 7081 0 + 7080 -7081 0 + 7079 -7081 0 + 7081 7082 -7083 0 + -7081 7083 0 + -7082 7083 0 + 6833 7079 -7080 0 + 6833 -7079 7080 0 + -6833 7079 7080 0 + -6833 -7079 -7080 0 + 4553 -5042 7084 0 + -4553 5042 7084 0 + 4553 5042 -7084 0 + -4553 -5042 -7084 0 + -4553 -5042 7086 0 + 5042 -7086 0 + 4553 -7086 0 + -7083 -7084 7085 0 + 7084 -7085 0 + 7083 -7085 0 + 7085 7086 -7087 0 + -7085 7087 0 + -7086 7087 0 + 6834 7083 -7084 0 + 6834 -7083 7084 0 + -6834 7083 7084 0 + -6834 -7083 -7084 0 + 4554 -5043 7088 0 + -4554 5043 7088 0 + 4554 5043 -7088 0 + -4554 -5043 -7088 0 + -4554 -5043 7090 0 + 5043 -7090 0 + 4554 -7090 0 + -7087 -7088 7089 0 + 7088 -7089 0 + 7087 -7089 0 + 7089 7090 -7091 0 + -7089 7091 0 + -7090 7091 0 + 6835 7087 -7088 0 + 6835 -7087 7088 0 + -6835 7087 7088 0 + -6835 -7087 -7088 0 + -4844 -6772 7092 0 + 4844 -7092 0 + 6772 -7092 0 + -4845 -6773 7093 0 + 4845 -7093 0 + 6773 -7093 0 + -4846 -6774 7094 0 + 4846 -7094 0 + 6774 -7094 0 + -4847 -6775 7095 0 + 4847 -7095 0 + 6775 -7095 0 + -4848 -6776 7096 0 + 4848 -7096 0 + 6776 -7096 0 + -4849 -6777 7097 0 + 4849 -7097 0 + 6777 -7097 0 + -4850 -6778 7098 0 + 4850 -7098 0 + 6778 -7098 0 + -4851 -6779 7099 0 + 4851 -7099 0 + 6779 -7099 0 + -4852 -6780 7100 0 + 4852 -7100 0 + 6780 -7100 0 + -4853 -6781 7101 0 + 4853 -7101 0 + 6781 -7101 0 + -4854 -6782 7102 0 + 4854 -7102 0 + 6782 -7102 0 + -4855 -6783 7103 0 + 4855 -7103 0 + 6783 -7103 0 + -4856 -6784 7104 0 + 4856 -7104 0 + 6784 -7104 0 + -4857 -6785 7105 0 + 4857 -7105 0 + 6785 -7105 0 + -4858 -6786 7106 0 + 4858 -7106 0 + 6786 -7106 0 + -4859 -6787 7107 0 + 4859 -7107 0 + 6787 -7107 0 + -4860 -6788 7108 0 + 4860 -7108 0 + 6788 -7108 0 + -4861 -6789 7109 0 + 4861 -7109 0 + 6789 -7109 0 + -4862 -6790 7110 0 + 4862 -7110 0 + 6790 -7110 0 + -4863 -6791 7111 0 + 4863 -7111 0 + 6791 -7111 0 + -4864 -6792 7112 0 + 4864 -7112 0 + 6792 -7112 0 + -4865 -6793 7113 0 + 4865 -7113 0 + 6793 -7113 0 + -4866 -6794 7114 0 + 4866 -7114 0 + 6794 -7114 0 + -4867 -6795 7115 0 + 4867 -7115 0 + 6795 -7115 0 + -4868 -6796 7116 0 + 4868 -7116 0 + 6796 -7116 0 + -4869 -6797 7117 0 + 4869 -7117 0 + 6797 -7117 0 + -4870 -6798 7118 0 + 4870 -7118 0 + 6798 -7118 0 + -4871 -6799 7119 0 + 4871 -7119 0 + 6799 -7119 0 + -4872 -6800 7120 0 + 4872 -7120 0 + 6800 -7120 0 + -4873 -6801 7121 0 + 4873 -7121 0 + 6801 -7121 0 + -4874 -6802 7122 0 + 4874 -7122 0 + 6802 -7122 0 + -4875 -6803 7123 0 + 4875 -7123 0 + 6803 -7123 0 + -4876 -6804 7124 0 + 4876 -7124 0 + 6804 -7124 0 + -4877 -6805 7125 0 + 4877 -7125 0 + 6805 -7125 0 + -4878 -6806 7126 0 + 4878 -7126 0 + 6806 -7126 0 + -4879 -6807 7127 0 + 4879 -7127 0 + 6807 -7127 0 + -4880 -6808 7128 0 + 4880 -7128 0 + 6808 -7128 0 + -4881 -6809 7129 0 + 4881 -7129 0 + 6809 -7129 0 + -4882 -6810 7130 0 + 4882 -7130 0 + 6810 -7130 0 + -4883 -6811 7131 0 + 4883 -7131 0 + 6811 -7131 0 + -4884 -6812 7132 0 + 4884 -7132 0 + 6812 -7132 0 + -4885 -6813 7133 0 + 4885 -7133 0 + 6813 -7133 0 + -4886 -6814 7134 0 + 4886 -7134 0 + 6814 -7134 0 + -4887 -6815 7135 0 + 4887 -7135 0 + 6815 -7135 0 + -4888 -6816 7136 0 + 4888 -7136 0 + 6816 -7136 0 + -4889 -6817 7137 0 + 4889 -7137 0 + 6817 -7137 0 + -4890 -6818 7138 0 + 4890 -7138 0 + 6818 -7138 0 + -4891 -6819 7139 0 + 4891 -7139 0 + 6819 -7139 0 + -4892 -6820 7140 0 + 4892 -7140 0 + 6820 -7140 0 + -4893 -6821 7141 0 + 4893 -7141 0 + 6821 -7141 0 + -4894 -6822 7142 0 + 4894 -7142 0 + 6822 -7142 0 + -4895 -6823 7143 0 + 4895 -7143 0 + 6823 -7143 0 + -4896 -6824 7144 0 + 4896 -7144 0 + 6824 -7144 0 + -4897 -6825 7145 0 + 4897 -7145 0 + 6825 -7145 0 + -4898 -6826 7146 0 + 4898 -7146 0 + 6826 -7146 0 + -4899 -6827 7147 0 + 4899 -7147 0 + 6827 -7147 0 + -4900 -6828 7148 0 + 4900 -7148 0 + 6828 -7148 0 + -4901 -6829 7149 0 + 4901 -7149 0 + 6829 -7149 0 + -4902 -6830 7150 0 + 4902 -7150 0 + 6830 -7150 0 + -4903 -6831 7151 0 + 4903 -7151 0 + 6831 -7151 0 + -4904 -6832 7152 0 + 4904 -7152 0 + 6832 -7152 0 + -4905 -6833 7153 0 + 4905 -7153 0 + 6833 -7153 0 + -4906 -6834 7154 0 + 4906 -7154 0 + 6834 -7154 0 + -4907 -6835 7155 0 + 4907 -7155 0 + 6835 -7155 0 + 7092 7221 0 + -7092 -7156 7221 0 + -7092 -7221 0 + 7092 -7156 -7221 0 + 7093 7222 0 + -7093 -7157 7222 0 + -7093 -7222 0 + 7093 -7157 -7222 0 + 7094 7223 0 + -7094 -7158 7223 0 + -7094 -7223 0 + 7094 -7158 -7223 0 + 7095 7224 0 + -7095 -7159 7224 0 + -7095 -7224 0 + 7095 -7159 -7224 0 + 7096 7225 0 + -7096 -7160 7225 0 + -7096 -7225 0 + 7096 -7160 -7225 0 + 7097 7226 0 + -7097 -7161 7226 0 + -7097 -7226 0 + 7097 -7161 -7226 0 + 7098 7227 0 + -7098 -7162 7227 0 + -7098 -7227 0 + 7098 -7162 -7227 0 + 7099 7228 0 + -7099 -7163 7228 0 + -7099 -7228 0 + 7099 -7163 -7228 0 + 7100 7229 0 + -7100 -7164 7229 0 + -7100 -7229 0 + 7100 -7164 -7229 0 + 7101 7230 0 + -7101 -7165 7230 0 + -7101 -7230 0 + 7101 -7165 -7230 0 + 7102 7231 0 + -7102 -7166 7231 0 + -7102 -7231 0 + 7102 -7166 -7231 0 + 7103 7232 0 + -7103 -7167 7232 0 + -7103 -7232 0 + 7103 -7167 -7232 0 + 7104 7233 0 + -7104 -7168 7233 0 + -7104 -7233 0 + 7104 -7168 -7233 0 + 7105 7234 0 + -7105 -7169 7234 0 + -7105 -7234 0 + 7105 -7169 -7234 0 + 7106 7235 0 + -7106 -7170 7235 0 + -7106 -7235 0 + 7106 -7170 -7235 0 + 7107 7236 0 + -7107 -7171 7236 0 + -7107 -7236 0 + 7107 -7171 -7236 0 + 7108 7237 0 + -7108 -7172 7237 0 + -7108 -7237 0 + 7108 -7172 -7237 0 + 7109 7238 0 + -7109 -7173 7238 0 + -7109 -7238 0 + 7109 -7173 -7238 0 + 7110 7239 0 + -7110 -7174 7239 0 + -7110 -7239 0 + 7110 -7174 -7239 0 + 7111 7240 0 + -7111 -7175 7240 0 + -7111 -7240 0 + 7111 -7175 -7240 0 + 7112 7241 0 + -7112 -7176 7241 0 + -7112 -7241 0 + 7112 -7176 -7241 0 + 7113 7242 0 + -7113 -7177 7242 0 + -7113 -7242 0 + 7113 -7177 -7242 0 + 7114 7243 0 + -7114 -7178 7243 0 + -7114 -7243 0 + 7114 -7178 -7243 0 + 7115 7244 0 + -7115 -7179 7244 0 + -7115 -7244 0 + 7115 -7179 -7244 0 + 7116 7245 0 + -7116 -7180 7245 0 + -7116 -7245 0 + 7116 -7180 -7245 0 + 7117 7246 0 + -7117 -7181 7246 0 + -7117 -7246 0 + 7117 -7181 -7246 0 + 7118 7247 0 + -7118 -7182 7247 0 + -7118 -7247 0 + 7118 -7182 -7247 0 + 7119 7248 0 + -7119 -7183 7248 0 + -7119 -7248 0 + 7119 -7183 -7248 0 + 7120 7249 0 + -7120 -7184 7249 0 + -7120 -7249 0 + 7120 -7184 -7249 0 + 7121 7250 0 + -7121 -7185 7250 0 + -7121 -7250 0 + 7121 -7185 -7250 0 + 7122 7251 0 + -7122 -7186 7251 0 + -7122 -7251 0 + 7122 -7186 -7251 0 + 7123 7252 0 + -7123 -7187 7252 0 + -7123 -7252 0 + 7123 -7187 -7252 0 + 7124 7253 0 + -7124 -7188 7253 0 + -7124 -7253 0 + 7124 -7188 -7253 0 + 7125 7254 0 + -7125 -7189 7254 0 + -7125 -7254 0 + 7125 -7189 -7254 0 + 7126 7255 0 + -7126 -7190 7255 0 + -7126 -7255 0 + 7126 -7190 -7255 0 + 7127 7256 0 + -7127 -7191 7256 0 + -7127 -7256 0 + 7127 -7191 -7256 0 + 7128 7257 0 + -7128 -7192 7257 0 + -7128 -7257 0 + 7128 -7192 -7257 0 + 7129 7258 0 + -7129 -7193 7258 0 + -7129 -7258 0 + 7129 -7193 -7258 0 + 7130 7259 0 + -7130 -7194 7259 0 + -7130 -7259 0 + 7130 -7194 -7259 0 + 7131 7260 0 + -7131 -7195 7260 0 + -7131 -7260 0 + 7131 -7195 -7260 0 + 7132 7261 0 + -7132 -7196 7261 0 + -7132 -7261 0 + 7132 -7196 -7261 0 + 7133 7262 0 + -7133 -7197 7262 0 + -7133 -7262 0 + 7133 -7197 -7262 0 + 7134 7263 0 + -7134 -7198 7263 0 + -7134 -7263 0 + 7134 -7198 -7263 0 + 7135 7264 0 + -7135 -7199 7264 0 + -7135 -7264 0 + 7135 -7199 -7264 0 + 7136 7265 0 + -7136 -7200 7265 0 + -7136 -7265 0 + 7136 -7200 -7265 0 + 7137 7266 0 + -7137 -7201 7266 0 + -7137 -7266 0 + 7137 -7201 -7266 0 + 7138 7267 0 + -7138 -7202 7267 0 + -7138 -7267 0 + 7138 -7202 -7267 0 + 7139 7268 0 + -7139 -7203 7268 0 + -7139 -7268 0 + 7139 -7203 -7268 0 + 7140 7269 0 + -7140 -7204 7269 0 + -7140 -7269 0 + 7140 -7204 -7269 0 + 7141 7270 0 + -7141 -7205 7270 0 + -7141 -7270 0 + 7141 -7205 -7270 0 + 7142 7271 0 + -7142 -7206 7271 0 + -7142 -7271 0 + 7142 -7206 -7271 0 + 7143 7272 0 + -7143 -7207 7272 0 + -7143 -7272 0 + 7143 -7207 -7272 0 + 7144 7273 0 + -7144 -7208 7273 0 + -7144 -7273 0 + 7144 -7208 -7273 0 + 7145 7274 0 + -7145 -7209 7274 0 + -7145 -7274 0 + 7145 -7209 -7274 0 + 7146 7275 0 + -7146 -7210 7275 0 + -7146 -7275 0 + 7146 -7210 -7275 0 + 7147 7276 0 + -7147 -7211 7276 0 + -7147 -7276 0 + 7147 -7211 -7276 0 + 7148 7277 0 + -7148 -7212 7277 0 + -7148 -7277 0 + 7148 -7212 -7277 0 + 7149 7278 0 + -7149 -7213 7278 0 + -7149 -7278 0 + 7149 -7213 -7278 0 + 7150 7279 0 + -7150 -7214 7279 0 + -7150 -7279 0 + 7150 -7214 -7279 0 + 7151 7280 0 + -7151 -7215 7280 0 + -7151 -7280 0 + 7151 -7215 -7280 0 + 7152 7281 0 + -7152 -7216 7281 0 + -7152 -7281 0 + 7152 -7216 -7281 0 + 7153 7282 0 + -7153 -7217 7282 0 + -7153 -7282 0 + 7153 -7217 -7282 0 + 7154 7283 0 + -7154 -7218 7283 0 + -7154 -7283 0 + 7154 -7218 -7283 0 + 7155 7284 0 + -7155 -7219 7284 0 + -7155 -7284 0 + 7155 -7219 -7284 0 + -7221 7285 0 + 1 -7285 0 + 7221 -7285 0 + -7222 -7285 7286 0 + 7285 -7286 0 + 7222 -7286 0 + -7223 -7286 7287 0 + 7286 -7287 0 + 7223 -7287 0 + -7224 -7287 7288 0 + 7287 -7288 0 + 7224 -7288 0 + -7225 -7288 7289 0 + 7288 -7289 0 + 7225 -7289 0 + -7226 -7289 7290 0 + 7289 -7290 0 + 7226 -7290 0 + -7227 -7290 7291 0 + 7290 -7291 0 + 7227 -7291 0 + -7228 -7291 7292 0 + 7291 -7292 0 + 7228 -7292 0 + -7229 -7292 7293 0 + 7292 -7293 0 + 7229 -7293 0 + -7230 -7293 7294 0 + 7293 -7294 0 + 7230 -7294 0 + -7231 -7294 7295 0 + 7294 -7295 0 + 7231 -7295 0 + -7232 -7295 7296 0 + 7295 -7296 0 + 7232 -7296 0 + -7233 -7296 7297 0 + 7296 -7297 0 + 7233 -7297 0 + -7234 -7297 7298 0 + 7297 -7298 0 + 7234 -7298 0 + -7235 -7298 7299 0 + 7298 -7299 0 + 7235 -7299 0 + -7236 -7299 7300 0 + 7299 -7300 0 + 7236 -7300 0 + -7237 -7300 7301 0 + 7300 -7301 0 + 7237 -7301 0 + -7238 -7301 7302 0 + 7301 -7302 0 + 7238 -7302 0 + -7239 -7302 7303 0 + 7302 -7303 0 + 7239 -7303 0 + -7240 -7303 7304 0 + 7303 -7304 0 + 7240 -7304 0 + -7241 -7304 7305 0 + 7304 -7305 0 + 7241 -7305 0 + -7242 -7305 7306 0 + 7305 -7306 0 + 7242 -7306 0 + -7243 -7306 7307 0 + 7306 -7307 0 + 7243 -7307 0 + -7244 -7307 7308 0 + 7307 -7308 0 + 7244 -7308 0 + -7245 -7308 7309 0 + 7308 -7309 0 + 7245 -7309 0 + -7246 -7309 7310 0 + 7309 -7310 0 + 7246 -7310 0 + -7247 -7310 7311 0 + 7310 -7311 0 + 7247 -7311 0 + -7248 -7311 7312 0 + 7311 -7312 0 + 7248 -7312 0 + -7249 -7312 7313 0 + 7312 -7313 0 + 7249 -7313 0 + -7250 -7313 7314 0 + 7313 -7314 0 + 7250 -7314 0 + -7251 -7314 7315 0 + 7314 -7315 0 + 7251 -7315 0 + -7252 -7315 7316 0 + 7315 -7316 0 + 7252 -7316 0 + -7253 -7316 7317 0 + 7316 -7317 0 + 7253 -7317 0 + -7254 -7317 7318 0 + 7317 -7318 0 + 7254 -7318 0 + -7255 -7318 7319 0 + 7318 -7319 0 + 7255 -7319 0 + -7256 -7319 7320 0 + 7319 -7320 0 + 7256 -7320 0 + -7257 -7320 7321 0 + 7320 -7321 0 + 7257 -7321 0 + -7258 -7321 7322 0 + 7321 -7322 0 + 7258 -7322 0 + -7259 -7322 7323 0 + 7322 -7323 0 + 7259 -7323 0 + -7260 -7323 7324 0 + 7323 -7324 0 + 7260 -7324 0 + -7261 -7324 7325 0 + 7324 -7325 0 + 7261 -7325 0 + -7262 -7325 7326 0 + 7325 -7326 0 + 7262 -7326 0 + -7263 -7326 7327 0 + 7326 -7327 0 + 7263 -7327 0 + -7264 -7327 7328 0 + 7327 -7328 0 + 7264 -7328 0 + -7265 -7328 7329 0 + 7328 -7329 0 + 7265 -7329 0 + -7266 -7329 7330 0 + 7329 -7330 0 + 7266 -7330 0 + -7267 -7330 7331 0 + 7330 -7331 0 + 7267 -7331 0 + -7268 -7331 7332 0 + 7331 -7332 0 + 7268 -7332 0 + -7269 -7332 7333 0 + 7332 -7333 0 + 7269 -7333 0 + -7270 -7333 7334 0 + 7333 -7334 0 + 7270 -7334 0 + -7271 -7334 7335 0 + 7334 -7335 0 + 7271 -7335 0 + -7272 -7335 7336 0 + 7335 -7336 0 + 7272 -7336 0 + -7273 -7336 7337 0 + 7336 -7337 0 + 7273 -7337 0 + -7274 -7337 7338 0 + 7337 -7338 0 + 7274 -7338 0 + -7275 -7338 7339 0 + 7338 -7339 0 + 7275 -7339 0 + -7276 -7339 7340 0 + 7339 -7340 0 + 7276 -7340 0 + -7277 -7340 7341 0 + 7340 -7341 0 + 7277 -7341 0 + -7278 -7341 7342 0 + 7341 -7342 0 + 7278 -7342 0 + -7279 -7342 7343 0 + 7342 -7343 0 + 7279 -7343 0 + -7280 -7343 7344 0 + 7343 -7344 0 + 7280 -7344 0 + -7281 -7344 7345 0 + 7344 -7345 0 + 7281 -7345 0 + -7282 -7345 7346 0 + 7345 -7346 0 + 7282 -7346 0 + -7283 -7346 7347 0 + 7346 -7347 0 + 7283 -7347 0 + -7284 -7347 7348 0 + 7347 -7348 0 + 7284 -7348 0 + -7220 7348 0 + 7220 -7348 0 + -4980 6772 7413 0 + 4980 -6772 7413 0 + 4980 6772 -7413 0 + -4980 -6772 -7413 0 + -4980 -6772 7415 0 + 4980 -7415 0 + 6772 -7415 0 + -2 -7413 7414 0 + 7413 -7414 0 + 7415 -7416 0 + -7414 7416 0 + -7415 7416 0 + 7349 -7413 0 + -2 7349 7413 0 + -7349 7413 0 + -2 -7349 -7413 0 + -4981 6773 7417 0 + 4981 -6773 7417 0 + 4981 6773 -7417 0 + -4981 -6773 -7417 0 + -4981 -6773 7419 0 + 4981 -7419 0 + 6773 -7419 0 + -7416 -7417 7418 0 + 7417 -7418 0 + 7416 -7418 0 + 7418 7419 -7420 0 + -7418 7420 0 + -7419 7420 0 + 7350 7416 -7417 0 + 7350 -7416 7417 0 + -7350 7416 7417 0 + -7350 -7416 -7417 0 + -4982 6774 7421 0 + 4982 -6774 7421 0 + 4982 6774 -7421 0 + -4982 -6774 -7421 0 + -4982 -6774 7423 0 + 4982 -7423 0 + 6774 -7423 0 + -7420 -7421 7422 0 + 7421 -7422 0 + 7420 -7422 0 + 7422 7423 -7424 0 + -7422 7424 0 + -7423 7424 0 + 7351 7420 -7421 0 + 7351 -7420 7421 0 + -7351 7420 7421 0 + -7351 -7420 -7421 0 + -4983 6775 7425 0 + 4983 -6775 7425 0 + 4983 6775 -7425 0 + -4983 -6775 -7425 0 + -4983 -6775 7427 0 + 4983 -7427 0 + 6775 -7427 0 + -7424 -7425 7426 0 + 7425 -7426 0 + 7424 -7426 0 + 7426 7427 -7428 0 + -7426 7428 0 + -7427 7428 0 + 7352 7424 -7425 0 + 7352 -7424 7425 0 + -7352 7424 7425 0 + -7352 -7424 -7425 0 + -4984 6776 7429 0 + 4984 -6776 7429 0 + 4984 6776 -7429 0 + -4984 -6776 -7429 0 + -4984 -6776 7431 0 + 4984 -7431 0 + 6776 -7431 0 + -7428 -7429 7430 0 + 7429 -7430 0 + 7428 -7430 0 + 7430 7431 -7432 0 + -7430 7432 0 + -7431 7432 0 + 7353 7428 -7429 0 + 7353 -7428 7429 0 + -7353 7428 7429 0 + -7353 -7428 -7429 0 + -4985 6777 7433 0 + 4985 -6777 7433 0 + 4985 6777 -7433 0 + -4985 -6777 -7433 0 + -4985 -6777 7435 0 + 4985 -7435 0 + 6777 -7435 0 + -7432 -7433 7434 0 + 7433 -7434 0 + 7432 -7434 0 + 7434 7435 -7436 0 + -7434 7436 0 + -7435 7436 0 + 7354 7432 -7433 0 + 7354 -7432 7433 0 + -7354 7432 7433 0 + -7354 -7432 -7433 0 + -4986 6778 7437 0 + 4986 -6778 7437 0 + 4986 6778 -7437 0 + -4986 -6778 -7437 0 + -4986 -6778 7439 0 + 4986 -7439 0 + 6778 -7439 0 + -7436 -7437 7438 0 + 7437 -7438 0 + 7436 -7438 0 + 7438 7439 -7440 0 + -7438 7440 0 + -7439 7440 0 + 7355 7436 -7437 0 + 7355 -7436 7437 0 + -7355 7436 7437 0 + -7355 -7436 -7437 0 + -4987 6779 7441 0 + 4987 -6779 7441 0 + 4987 6779 -7441 0 + -4987 -6779 -7441 0 + -4987 -6779 7443 0 + 4987 -7443 0 + 6779 -7443 0 + -7440 -7441 7442 0 + 7441 -7442 0 + 7440 -7442 0 + 7442 7443 -7444 0 + -7442 7444 0 + -7443 7444 0 + 7356 7440 -7441 0 + 7356 -7440 7441 0 + -7356 7440 7441 0 + -7356 -7440 -7441 0 + -4988 6780 7445 0 + 4988 -6780 7445 0 + 4988 6780 -7445 0 + -4988 -6780 -7445 0 + -4988 -6780 7447 0 + 4988 -7447 0 + 6780 -7447 0 + -7444 -7445 7446 0 + 7445 -7446 0 + 7444 -7446 0 + 7446 7447 -7448 0 + -7446 7448 0 + -7447 7448 0 + 7357 7444 -7445 0 + 7357 -7444 7445 0 + -7357 7444 7445 0 + -7357 -7444 -7445 0 + -4989 6781 7449 0 + 4989 -6781 7449 0 + 4989 6781 -7449 0 + -4989 -6781 -7449 0 + -4989 -6781 7451 0 + 4989 -7451 0 + 6781 -7451 0 + -7448 -7449 7450 0 + 7449 -7450 0 + 7448 -7450 0 + 7450 7451 -7452 0 + -7450 7452 0 + -7451 7452 0 + 7358 7448 -7449 0 + 7358 -7448 7449 0 + -7358 7448 7449 0 + -7358 -7448 -7449 0 + -4990 6782 7453 0 + 4990 -6782 7453 0 + 4990 6782 -7453 0 + -4990 -6782 -7453 0 + -4990 -6782 7455 0 + 4990 -7455 0 + 6782 -7455 0 + -7452 -7453 7454 0 + 7453 -7454 0 + 7452 -7454 0 + 7454 7455 -7456 0 + -7454 7456 0 + -7455 7456 0 + 7359 7452 -7453 0 + 7359 -7452 7453 0 + -7359 7452 7453 0 + -7359 -7452 -7453 0 + -4991 6783 7457 0 + 4991 -6783 7457 0 + 4991 6783 -7457 0 + -4991 -6783 -7457 0 + -4991 -6783 7459 0 + 4991 -7459 0 + 6783 -7459 0 + -7456 -7457 7458 0 + 7457 -7458 0 + 7456 -7458 0 + 7458 7459 -7460 0 + -7458 7460 0 + -7459 7460 0 + 7360 7456 -7457 0 + 7360 -7456 7457 0 + -7360 7456 7457 0 + -7360 -7456 -7457 0 + -4992 6784 7461 0 + 4992 -6784 7461 0 + 4992 6784 -7461 0 + -4992 -6784 -7461 0 + -4992 -6784 7463 0 + 4992 -7463 0 + 6784 -7463 0 + -7460 -7461 7462 0 + 7461 -7462 0 + 7460 -7462 0 + 7462 7463 -7464 0 + -7462 7464 0 + -7463 7464 0 + 7361 7460 -7461 0 + 7361 -7460 7461 0 + -7361 7460 7461 0 + -7361 -7460 -7461 0 + -4993 6785 7465 0 + 4993 -6785 7465 0 + 4993 6785 -7465 0 + -4993 -6785 -7465 0 + -4993 -6785 7467 0 + 4993 -7467 0 + 6785 -7467 0 + -7464 -7465 7466 0 + 7465 -7466 0 + 7464 -7466 0 + 7466 7467 -7468 0 + -7466 7468 0 + -7467 7468 0 + 7362 7464 -7465 0 + 7362 -7464 7465 0 + -7362 7464 7465 0 + -7362 -7464 -7465 0 + -4994 6786 7469 0 + 4994 -6786 7469 0 + 4994 6786 -7469 0 + -4994 -6786 -7469 0 + -4994 -6786 7471 0 + 4994 -7471 0 + 6786 -7471 0 + -7468 -7469 7470 0 + 7469 -7470 0 + 7468 -7470 0 + 7470 7471 -7472 0 + -7470 7472 0 + -7471 7472 0 + 7363 7468 -7469 0 + 7363 -7468 7469 0 + -7363 7468 7469 0 + -7363 -7468 -7469 0 + -4995 6787 7473 0 + 4995 -6787 7473 0 + 4995 6787 -7473 0 + -4995 -6787 -7473 0 + -4995 -6787 7475 0 + 4995 -7475 0 + 6787 -7475 0 + -7472 -7473 7474 0 + 7473 -7474 0 + 7472 -7474 0 + 7474 7475 -7476 0 + -7474 7476 0 + -7475 7476 0 + 7364 7472 -7473 0 + 7364 -7472 7473 0 + -7364 7472 7473 0 + -7364 -7472 -7473 0 + -4996 6788 7477 0 + 4996 -6788 7477 0 + 4996 6788 -7477 0 + -4996 -6788 -7477 0 + -4996 -6788 7479 0 + 4996 -7479 0 + 6788 -7479 0 + -7476 -7477 7478 0 + 7477 -7478 0 + 7476 -7478 0 + 7478 7479 -7480 0 + -7478 7480 0 + -7479 7480 0 + 7365 7476 -7477 0 + 7365 -7476 7477 0 + -7365 7476 7477 0 + -7365 -7476 -7477 0 + -4997 6789 7481 0 + 4997 -6789 7481 0 + 4997 6789 -7481 0 + -4997 -6789 -7481 0 + -4997 -6789 7483 0 + 4997 -7483 0 + 6789 -7483 0 + -7480 -7481 7482 0 + 7481 -7482 0 + 7480 -7482 0 + 7482 7483 -7484 0 + -7482 7484 0 + -7483 7484 0 + 7366 7480 -7481 0 + 7366 -7480 7481 0 + -7366 7480 7481 0 + -7366 -7480 -7481 0 + -4998 6790 7485 0 + 4998 -6790 7485 0 + 4998 6790 -7485 0 + -4998 -6790 -7485 0 + -4998 -6790 7487 0 + 4998 -7487 0 + 6790 -7487 0 + -7484 -7485 7486 0 + 7485 -7486 0 + 7484 -7486 0 + 7486 7487 -7488 0 + -7486 7488 0 + -7487 7488 0 + 7367 7484 -7485 0 + 7367 -7484 7485 0 + -7367 7484 7485 0 + -7367 -7484 -7485 0 + -4999 6791 7489 0 + 4999 -6791 7489 0 + 4999 6791 -7489 0 + -4999 -6791 -7489 0 + -4999 -6791 7491 0 + 4999 -7491 0 + 6791 -7491 0 + -7488 -7489 7490 0 + 7489 -7490 0 + 7488 -7490 0 + 7490 7491 -7492 0 + -7490 7492 0 + -7491 7492 0 + 7368 7488 -7489 0 + 7368 -7488 7489 0 + -7368 7488 7489 0 + -7368 -7488 -7489 0 + -5000 6792 7493 0 + 5000 -6792 7493 0 + 5000 6792 -7493 0 + -5000 -6792 -7493 0 + -5000 -6792 7495 0 + 5000 -7495 0 + 6792 -7495 0 + -7492 -7493 7494 0 + 7493 -7494 0 + 7492 -7494 0 + 7494 7495 -7496 0 + -7494 7496 0 + -7495 7496 0 + 7369 7492 -7493 0 + 7369 -7492 7493 0 + -7369 7492 7493 0 + -7369 -7492 -7493 0 + -5001 6793 7497 0 + 5001 -6793 7497 0 + 5001 6793 -7497 0 + -5001 -6793 -7497 0 + -5001 -6793 7499 0 + 5001 -7499 0 + 6793 -7499 0 + -7496 -7497 7498 0 + 7497 -7498 0 + 7496 -7498 0 + 7498 7499 -7500 0 + -7498 7500 0 + -7499 7500 0 + 7370 7496 -7497 0 + 7370 -7496 7497 0 + -7370 7496 7497 0 + -7370 -7496 -7497 0 + -5002 6794 7501 0 + 5002 -6794 7501 0 + 5002 6794 -7501 0 + -5002 -6794 -7501 0 + -5002 -6794 7503 0 + 5002 -7503 0 + 6794 -7503 0 + -7500 -7501 7502 0 + 7501 -7502 0 + 7500 -7502 0 + 7502 7503 -7504 0 + -7502 7504 0 + -7503 7504 0 + 7371 7500 -7501 0 + 7371 -7500 7501 0 + -7371 7500 7501 0 + -7371 -7500 -7501 0 + -5003 6795 7505 0 + 5003 -6795 7505 0 + 5003 6795 -7505 0 + -5003 -6795 -7505 0 + -5003 -6795 7507 0 + 5003 -7507 0 + 6795 -7507 0 + -7504 -7505 7506 0 + 7505 -7506 0 + 7504 -7506 0 + 7506 7507 -7508 0 + -7506 7508 0 + -7507 7508 0 + 7372 7504 -7505 0 + 7372 -7504 7505 0 + -7372 7504 7505 0 + -7372 -7504 -7505 0 + -5004 6796 7509 0 + 5004 -6796 7509 0 + 5004 6796 -7509 0 + -5004 -6796 -7509 0 + -5004 -6796 7511 0 + 5004 -7511 0 + 6796 -7511 0 + -7508 -7509 7510 0 + 7509 -7510 0 + 7508 -7510 0 + 7510 7511 -7512 0 + -7510 7512 0 + -7511 7512 0 + 7373 7508 -7509 0 + 7373 -7508 7509 0 + -7373 7508 7509 0 + -7373 -7508 -7509 0 + -5005 6797 7513 0 + 5005 -6797 7513 0 + 5005 6797 -7513 0 + -5005 -6797 -7513 0 + -5005 -6797 7515 0 + 5005 -7515 0 + 6797 -7515 0 + -7512 -7513 7514 0 + 7513 -7514 0 + 7512 -7514 0 + 7514 7515 -7516 0 + -7514 7516 0 + -7515 7516 0 + 7374 7512 -7513 0 + 7374 -7512 7513 0 + -7374 7512 7513 0 + -7374 -7512 -7513 0 + -5006 6798 7517 0 + 5006 -6798 7517 0 + 5006 6798 -7517 0 + -5006 -6798 -7517 0 + -5006 -6798 7519 0 + 5006 -7519 0 + 6798 -7519 0 + -7516 -7517 7518 0 + 7517 -7518 0 + 7516 -7518 0 + 7518 7519 -7520 0 + -7518 7520 0 + -7519 7520 0 + 7375 7516 -7517 0 + 7375 -7516 7517 0 + -7375 7516 7517 0 + -7375 -7516 -7517 0 + -5007 6799 7521 0 + 5007 -6799 7521 0 + 5007 6799 -7521 0 + -5007 -6799 -7521 0 + -5007 -6799 7523 0 + 5007 -7523 0 + 6799 -7523 0 + -7520 -7521 7522 0 + 7521 -7522 0 + 7520 -7522 0 + 7522 7523 -7524 0 + -7522 7524 0 + -7523 7524 0 + 7376 7520 -7521 0 + 7376 -7520 7521 0 + -7376 7520 7521 0 + -7376 -7520 -7521 0 + -5008 6800 7525 0 + 5008 -6800 7525 0 + 5008 6800 -7525 0 + -5008 -6800 -7525 0 + -5008 -6800 7527 0 + 5008 -7527 0 + 6800 -7527 0 + -7524 -7525 7526 0 + 7525 -7526 0 + 7524 -7526 0 + 7526 7527 -7528 0 + -7526 7528 0 + -7527 7528 0 + 7377 7524 -7525 0 + 7377 -7524 7525 0 + -7377 7524 7525 0 + -7377 -7524 -7525 0 + -5009 6801 7529 0 + 5009 -6801 7529 0 + 5009 6801 -7529 0 + -5009 -6801 -7529 0 + -5009 -6801 7531 0 + 5009 -7531 0 + 6801 -7531 0 + -7528 -7529 7530 0 + 7529 -7530 0 + 7528 -7530 0 + 7530 7531 -7532 0 + -7530 7532 0 + -7531 7532 0 + 7378 7528 -7529 0 + 7378 -7528 7529 0 + -7378 7528 7529 0 + -7378 -7528 -7529 0 + -5010 6802 7533 0 + 5010 -6802 7533 0 + 5010 6802 -7533 0 + -5010 -6802 -7533 0 + -5010 -6802 7535 0 + 5010 -7535 0 + 6802 -7535 0 + -7532 -7533 7534 0 + 7533 -7534 0 + 7532 -7534 0 + 7534 7535 -7536 0 + -7534 7536 0 + -7535 7536 0 + 7379 7532 -7533 0 + 7379 -7532 7533 0 + -7379 7532 7533 0 + -7379 -7532 -7533 0 + -5011 6803 7537 0 + 5011 -6803 7537 0 + 5011 6803 -7537 0 + -5011 -6803 -7537 0 + -5011 -6803 7539 0 + 5011 -7539 0 + 6803 -7539 0 + -7536 -7537 7538 0 + 7537 -7538 0 + 7536 -7538 0 + 7538 7539 -7540 0 + -7538 7540 0 + -7539 7540 0 + 7380 7536 -7537 0 + 7380 -7536 7537 0 + -7380 7536 7537 0 + -7380 -7536 -7537 0 + -5012 6804 7541 0 + 5012 -6804 7541 0 + 5012 6804 -7541 0 + -5012 -6804 -7541 0 + -5012 -6804 7543 0 + 5012 -7543 0 + 6804 -7543 0 + -7540 -7541 7542 0 + 7541 -7542 0 + 7540 -7542 0 + 7542 7543 -7544 0 + -7542 7544 0 + -7543 7544 0 + 7381 7540 -7541 0 + 7381 -7540 7541 0 + -7381 7540 7541 0 + -7381 -7540 -7541 0 + -5013 6805 7545 0 + 5013 -6805 7545 0 + 5013 6805 -7545 0 + -5013 -6805 -7545 0 + -5013 -6805 7547 0 + 5013 -7547 0 + 6805 -7547 0 + -7544 -7545 7546 0 + 7545 -7546 0 + 7544 -7546 0 + 7546 7547 -7548 0 + -7546 7548 0 + -7547 7548 0 + 7382 7544 -7545 0 + 7382 -7544 7545 0 + -7382 7544 7545 0 + -7382 -7544 -7545 0 + -5014 6806 7549 0 + 5014 -6806 7549 0 + 5014 6806 -7549 0 + -5014 -6806 -7549 0 + -5014 -6806 7551 0 + 5014 -7551 0 + 6806 -7551 0 + -7548 -7549 7550 0 + 7549 -7550 0 + 7548 -7550 0 + 7550 7551 -7552 0 + -7550 7552 0 + -7551 7552 0 + 7383 7548 -7549 0 + 7383 -7548 7549 0 + -7383 7548 7549 0 + -7383 -7548 -7549 0 + -5015 6807 7553 0 + 5015 -6807 7553 0 + 5015 6807 -7553 0 + -5015 -6807 -7553 0 + -5015 -6807 7555 0 + 5015 -7555 0 + 6807 -7555 0 + -7552 -7553 7554 0 + 7553 -7554 0 + 7552 -7554 0 + 7554 7555 -7556 0 + -7554 7556 0 + -7555 7556 0 + 7384 7552 -7553 0 + 7384 -7552 7553 0 + -7384 7552 7553 0 + -7384 -7552 -7553 0 + -5016 6808 7557 0 + 5016 -6808 7557 0 + 5016 6808 -7557 0 + -5016 -6808 -7557 0 + -5016 -6808 7559 0 + 5016 -7559 0 + 6808 -7559 0 + -7556 -7557 7558 0 + 7557 -7558 0 + 7556 -7558 0 + 7558 7559 -7560 0 + -7558 7560 0 + -7559 7560 0 + 7385 7556 -7557 0 + 7385 -7556 7557 0 + -7385 7556 7557 0 + -7385 -7556 -7557 0 + -5017 6809 7561 0 + 5017 -6809 7561 0 + 5017 6809 -7561 0 + -5017 -6809 -7561 0 + -5017 -6809 7563 0 + 5017 -7563 0 + 6809 -7563 0 + -7560 -7561 7562 0 + 7561 -7562 0 + 7560 -7562 0 + 7562 7563 -7564 0 + -7562 7564 0 + -7563 7564 0 + 7386 7560 -7561 0 + 7386 -7560 7561 0 + -7386 7560 7561 0 + -7386 -7560 -7561 0 + -5018 6810 7565 0 + 5018 -6810 7565 0 + 5018 6810 -7565 0 + -5018 -6810 -7565 0 + -5018 -6810 7567 0 + 5018 -7567 0 + 6810 -7567 0 + -7564 -7565 7566 0 + 7565 -7566 0 + 7564 -7566 0 + 7566 7567 -7568 0 + -7566 7568 0 + -7567 7568 0 + 7387 7564 -7565 0 + 7387 -7564 7565 0 + -7387 7564 7565 0 + -7387 -7564 -7565 0 + -5019 6811 7569 0 + 5019 -6811 7569 0 + 5019 6811 -7569 0 + -5019 -6811 -7569 0 + -5019 -6811 7571 0 + 5019 -7571 0 + 6811 -7571 0 + -7568 -7569 7570 0 + 7569 -7570 0 + 7568 -7570 0 + 7570 7571 -7572 0 + -7570 7572 0 + -7571 7572 0 + 7388 7568 -7569 0 + 7388 -7568 7569 0 + -7388 7568 7569 0 + -7388 -7568 -7569 0 + -5020 6812 7573 0 + 5020 -6812 7573 0 + 5020 6812 -7573 0 + -5020 -6812 -7573 0 + -5020 -6812 7575 0 + 5020 -7575 0 + 6812 -7575 0 + -7572 -7573 7574 0 + 7573 -7574 0 + 7572 -7574 0 + 7574 7575 -7576 0 + -7574 7576 0 + -7575 7576 0 + 7389 7572 -7573 0 + 7389 -7572 7573 0 + -7389 7572 7573 0 + -7389 -7572 -7573 0 + -5021 6813 7577 0 + 5021 -6813 7577 0 + 5021 6813 -7577 0 + -5021 -6813 -7577 0 + -5021 -6813 7579 0 + 5021 -7579 0 + 6813 -7579 0 + -7576 -7577 7578 0 + 7577 -7578 0 + 7576 -7578 0 + 7578 7579 -7580 0 + -7578 7580 0 + -7579 7580 0 + 7390 7576 -7577 0 + 7390 -7576 7577 0 + -7390 7576 7577 0 + -7390 -7576 -7577 0 + -5022 6814 7581 0 + 5022 -6814 7581 0 + 5022 6814 -7581 0 + -5022 -6814 -7581 0 + -5022 -6814 7583 0 + 5022 -7583 0 + 6814 -7583 0 + -7580 -7581 7582 0 + 7581 -7582 0 + 7580 -7582 0 + 7582 7583 -7584 0 + -7582 7584 0 + -7583 7584 0 + 7391 7580 -7581 0 + 7391 -7580 7581 0 + -7391 7580 7581 0 + -7391 -7580 -7581 0 + -5023 6815 7585 0 + 5023 -6815 7585 0 + 5023 6815 -7585 0 + -5023 -6815 -7585 0 + -5023 -6815 7587 0 + 5023 -7587 0 + 6815 -7587 0 + -7584 -7585 7586 0 + 7585 -7586 0 + 7584 -7586 0 + 7586 7587 -7588 0 + -7586 7588 0 + -7587 7588 0 + 7392 7584 -7585 0 + 7392 -7584 7585 0 + -7392 7584 7585 0 + -7392 -7584 -7585 0 + -5024 6816 7589 0 + 5024 -6816 7589 0 + 5024 6816 -7589 0 + -5024 -6816 -7589 0 + -5024 -6816 7591 0 + 5024 -7591 0 + 6816 -7591 0 + -7588 -7589 7590 0 + 7589 -7590 0 + 7588 -7590 0 + 7590 7591 -7592 0 + -7590 7592 0 + -7591 7592 0 + 7393 7588 -7589 0 + 7393 -7588 7589 0 + -7393 7588 7589 0 + -7393 -7588 -7589 0 + -5025 6817 7593 0 + 5025 -6817 7593 0 + 5025 6817 -7593 0 + -5025 -6817 -7593 0 + -5025 -6817 7595 0 + 5025 -7595 0 + 6817 -7595 0 + -7592 -7593 7594 0 + 7593 -7594 0 + 7592 -7594 0 + 7594 7595 -7596 0 + -7594 7596 0 + -7595 7596 0 + 7394 7592 -7593 0 + 7394 -7592 7593 0 + -7394 7592 7593 0 + -7394 -7592 -7593 0 + -5026 6818 7597 0 + 5026 -6818 7597 0 + 5026 6818 -7597 0 + -5026 -6818 -7597 0 + -5026 -6818 7599 0 + 5026 -7599 0 + 6818 -7599 0 + -7596 -7597 7598 0 + 7597 -7598 0 + 7596 -7598 0 + 7598 7599 -7600 0 + -7598 7600 0 + -7599 7600 0 + 7395 7596 -7597 0 + 7395 -7596 7597 0 + -7395 7596 7597 0 + -7395 -7596 -7597 0 + -5027 6819 7601 0 + 5027 -6819 7601 0 + 5027 6819 -7601 0 + -5027 -6819 -7601 0 + -5027 -6819 7603 0 + 5027 -7603 0 + 6819 -7603 0 + -7600 -7601 7602 0 + 7601 -7602 0 + 7600 -7602 0 + 7602 7603 -7604 0 + -7602 7604 0 + -7603 7604 0 + 7396 7600 -7601 0 + 7396 -7600 7601 0 + -7396 7600 7601 0 + -7396 -7600 -7601 0 + -5028 6820 7605 0 + 5028 -6820 7605 0 + 5028 6820 -7605 0 + -5028 -6820 -7605 0 + -5028 -6820 7607 0 + 5028 -7607 0 + 6820 -7607 0 + -7604 -7605 7606 0 + 7605 -7606 0 + 7604 -7606 0 + 7606 7607 -7608 0 + -7606 7608 0 + -7607 7608 0 + 7397 7604 -7605 0 + 7397 -7604 7605 0 + -7397 7604 7605 0 + -7397 -7604 -7605 0 + -5029 6821 7609 0 + 5029 -6821 7609 0 + 5029 6821 -7609 0 + -5029 -6821 -7609 0 + -5029 -6821 7611 0 + 5029 -7611 0 + 6821 -7611 0 + -7608 -7609 7610 0 + 7609 -7610 0 + 7608 -7610 0 + 7610 7611 -7612 0 + -7610 7612 0 + -7611 7612 0 + 7398 7608 -7609 0 + 7398 -7608 7609 0 + -7398 7608 7609 0 + -7398 -7608 -7609 0 + -5030 6822 7613 0 + 5030 -6822 7613 0 + 5030 6822 -7613 0 + -5030 -6822 -7613 0 + -5030 -6822 7615 0 + 5030 -7615 0 + 6822 -7615 0 + -7612 -7613 7614 0 + 7613 -7614 0 + 7612 -7614 0 + 7614 7615 -7616 0 + -7614 7616 0 + -7615 7616 0 + 7399 7612 -7613 0 + 7399 -7612 7613 0 + -7399 7612 7613 0 + -7399 -7612 -7613 0 + -5031 6823 7617 0 + 5031 -6823 7617 0 + 5031 6823 -7617 0 + -5031 -6823 -7617 0 + -5031 -6823 7619 0 + 5031 -7619 0 + 6823 -7619 0 + -7616 -7617 7618 0 + 7617 -7618 0 + 7616 -7618 0 + 7618 7619 -7620 0 + -7618 7620 0 + -7619 7620 0 + 7400 7616 -7617 0 + 7400 -7616 7617 0 + -7400 7616 7617 0 + -7400 -7616 -7617 0 + -5032 6824 7621 0 + 5032 -6824 7621 0 + 5032 6824 -7621 0 + -5032 -6824 -7621 0 + -5032 -6824 7623 0 + 5032 -7623 0 + 6824 -7623 0 + -7620 -7621 7622 0 + 7621 -7622 0 + 7620 -7622 0 + 7622 7623 -7624 0 + -7622 7624 0 + -7623 7624 0 + 7401 7620 -7621 0 + 7401 -7620 7621 0 + -7401 7620 7621 0 + -7401 -7620 -7621 0 + -5033 6825 7625 0 + 5033 -6825 7625 0 + 5033 6825 -7625 0 + -5033 -6825 -7625 0 + -5033 -6825 7627 0 + 5033 -7627 0 + 6825 -7627 0 + -7624 -7625 7626 0 + 7625 -7626 0 + 7624 -7626 0 + 7626 7627 -7628 0 + -7626 7628 0 + -7627 7628 0 + 7402 7624 -7625 0 + 7402 -7624 7625 0 + -7402 7624 7625 0 + -7402 -7624 -7625 0 + -5034 6826 7629 0 + 5034 -6826 7629 0 + 5034 6826 -7629 0 + -5034 -6826 -7629 0 + -5034 -6826 7631 0 + 5034 -7631 0 + 6826 -7631 0 + -7628 -7629 7630 0 + 7629 -7630 0 + 7628 -7630 0 + 7630 7631 -7632 0 + -7630 7632 0 + -7631 7632 0 + 7403 7628 -7629 0 + 7403 -7628 7629 0 + -7403 7628 7629 0 + -7403 -7628 -7629 0 + -5035 6827 7633 0 + 5035 -6827 7633 0 + 5035 6827 -7633 0 + -5035 -6827 -7633 0 + -5035 -6827 7635 0 + 5035 -7635 0 + 6827 -7635 0 + -7632 -7633 7634 0 + 7633 -7634 0 + 7632 -7634 0 + 7634 7635 -7636 0 + -7634 7636 0 + -7635 7636 0 + 7404 7632 -7633 0 + 7404 -7632 7633 0 + -7404 7632 7633 0 + -7404 -7632 -7633 0 + -5036 6828 7637 0 + 5036 -6828 7637 0 + 5036 6828 -7637 0 + -5036 -6828 -7637 0 + -5036 -6828 7639 0 + 5036 -7639 0 + 6828 -7639 0 + -7636 -7637 7638 0 + 7637 -7638 0 + 7636 -7638 0 + 7638 7639 -7640 0 + -7638 7640 0 + -7639 7640 0 + 7405 7636 -7637 0 + 7405 -7636 7637 0 + -7405 7636 7637 0 + -7405 -7636 -7637 0 + -5037 6829 7641 0 + 5037 -6829 7641 0 + 5037 6829 -7641 0 + -5037 -6829 -7641 0 + -5037 -6829 7643 0 + 5037 -7643 0 + 6829 -7643 0 + -7640 -7641 7642 0 + 7641 -7642 0 + 7640 -7642 0 + 7642 7643 -7644 0 + -7642 7644 0 + -7643 7644 0 + 7406 7640 -7641 0 + 7406 -7640 7641 0 + -7406 7640 7641 0 + -7406 -7640 -7641 0 + -5038 6830 7645 0 + 5038 -6830 7645 0 + 5038 6830 -7645 0 + -5038 -6830 -7645 0 + -5038 -6830 7647 0 + 5038 -7647 0 + 6830 -7647 0 + -7644 -7645 7646 0 + 7645 -7646 0 + 7644 -7646 0 + 7646 7647 -7648 0 + -7646 7648 0 + -7647 7648 0 + 7407 7644 -7645 0 + 7407 -7644 7645 0 + -7407 7644 7645 0 + -7407 -7644 -7645 0 + -5039 6831 7649 0 + 5039 -6831 7649 0 + 5039 6831 -7649 0 + -5039 -6831 -7649 0 + -5039 -6831 7651 0 + 5039 -7651 0 + 6831 -7651 0 + -7648 -7649 7650 0 + 7649 -7650 0 + 7648 -7650 0 + 7650 7651 -7652 0 + -7650 7652 0 + -7651 7652 0 + 7408 7648 -7649 0 + 7408 -7648 7649 0 + -7408 7648 7649 0 + -7408 -7648 -7649 0 + -5040 6832 7653 0 + 5040 -6832 7653 0 + 5040 6832 -7653 0 + -5040 -6832 -7653 0 + -5040 -6832 7655 0 + 5040 -7655 0 + 6832 -7655 0 + -7652 -7653 7654 0 + 7653 -7654 0 + 7652 -7654 0 + 7654 7655 -7656 0 + -7654 7656 0 + -7655 7656 0 + 7409 7652 -7653 0 + 7409 -7652 7653 0 + -7409 7652 7653 0 + -7409 -7652 -7653 0 + -5041 6833 7657 0 + 5041 -6833 7657 0 + 5041 6833 -7657 0 + -5041 -6833 -7657 0 + -5041 -6833 7659 0 + 5041 -7659 0 + 6833 -7659 0 + -7656 -7657 7658 0 + 7657 -7658 0 + 7656 -7658 0 + 7658 7659 -7660 0 + -7658 7660 0 + -7659 7660 0 + 7410 7656 -7657 0 + 7410 -7656 7657 0 + -7410 7656 7657 0 + -7410 -7656 -7657 0 + -5042 6834 7661 0 + 5042 -6834 7661 0 + 5042 6834 -7661 0 + -5042 -6834 -7661 0 + -5042 -6834 7663 0 + 5042 -7663 0 + 6834 -7663 0 + -7660 -7661 7662 0 + 7661 -7662 0 + 7660 -7662 0 + 7662 7663 -7664 0 + -7662 7664 0 + -7663 7664 0 + 7411 7660 -7661 0 + 7411 -7660 7661 0 + -7411 7660 7661 0 + -7411 -7660 -7661 0 + -5043 6835 7665 0 + 5043 -6835 7665 0 + 5043 6835 -7665 0 + -5043 -6835 -7665 0 + -5043 -6835 7667 0 + 5043 -7667 0 + 6835 -7667 0 + -7664 -7665 7666 0 + 7665 -7666 0 + 7664 -7666 0 + 7666 7667 -7668 0 + -7666 7668 0 + -7667 7668 0 + 7412 7664 -7665 0 + 7412 -7664 7665 0 + -7412 7664 7665 0 + -7412 -7664 -7665 0 + -7220 -7349 7669 0 + -7220 7349 -7669 0 + -6772 7220 7669 0 + 6772 7220 -7669 0 + -7220 -7350 7670 0 + -7220 7350 -7670 0 + -6773 7220 7670 0 + 6773 7220 -7670 0 + -7220 -7351 7671 0 + -7220 7351 -7671 0 + -6774 7220 7671 0 + 6774 7220 -7671 0 + -7220 -7352 7672 0 + -7220 7352 -7672 0 + -6775 7220 7672 0 + 6775 7220 -7672 0 + -7220 -7353 7673 0 + -7220 7353 -7673 0 + -6776 7220 7673 0 + 6776 7220 -7673 0 + -7220 -7354 7674 0 + -7220 7354 -7674 0 + -6777 7220 7674 0 + 6777 7220 -7674 0 + -7220 -7355 7675 0 + -7220 7355 -7675 0 + -6778 7220 7675 0 + 6778 7220 -7675 0 + -7220 -7356 7676 0 + -7220 7356 -7676 0 + -6779 7220 7676 0 + 6779 7220 -7676 0 + -7220 -7357 7677 0 + -7220 7357 -7677 0 + -6780 7220 7677 0 + 6780 7220 -7677 0 + -7220 -7358 7678 0 + -7220 7358 -7678 0 + -6781 7220 7678 0 + 6781 7220 -7678 0 + -7220 -7359 7679 0 + -7220 7359 -7679 0 + -6782 7220 7679 0 + 6782 7220 -7679 0 + -7220 -7360 7680 0 + -7220 7360 -7680 0 + -6783 7220 7680 0 + 6783 7220 -7680 0 + -7220 -7361 7681 0 + -7220 7361 -7681 0 + -6784 7220 7681 0 + 6784 7220 -7681 0 + -7220 -7362 7682 0 + -7220 7362 -7682 0 + -6785 7220 7682 0 + 6785 7220 -7682 0 + -7220 -7363 7683 0 + -7220 7363 -7683 0 + -6786 7220 7683 0 + 6786 7220 -7683 0 + -7220 -7364 7684 0 + -7220 7364 -7684 0 + -6787 7220 7684 0 + 6787 7220 -7684 0 + -7220 -7365 7685 0 + -7220 7365 -7685 0 + -6788 7220 7685 0 + 6788 7220 -7685 0 + -7220 -7366 7686 0 + -7220 7366 -7686 0 + -6789 7220 7686 0 + 6789 7220 -7686 0 + -7220 -7367 7687 0 + -7220 7367 -7687 0 + -6790 7220 7687 0 + 6790 7220 -7687 0 + -7220 -7368 7688 0 + -7220 7368 -7688 0 + -6791 7220 7688 0 + 6791 7220 -7688 0 + -7220 -7369 7689 0 + -7220 7369 -7689 0 + -6792 7220 7689 0 + 6792 7220 -7689 0 + -7220 -7370 7690 0 + -7220 7370 -7690 0 + -6793 7220 7690 0 + 6793 7220 -7690 0 + -7220 -7371 7691 0 + -7220 7371 -7691 0 + -6794 7220 7691 0 + 6794 7220 -7691 0 + -7220 -7372 7692 0 + -7220 7372 -7692 0 + -6795 7220 7692 0 + 6795 7220 -7692 0 + -7220 -7373 7693 0 + -7220 7373 -7693 0 + -6796 7220 7693 0 + 6796 7220 -7693 0 + -7220 -7374 7694 0 + -7220 7374 -7694 0 + -6797 7220 7694 0 + 6797 7220 -7694 0 + -7220 -7375 7695 0 + -7220 7375 -7695 0 + -6798 7220 7695 0 + 6798 7220 -7695 0 + -7220 -7376 7696 0 + -7220 7376 -7696 0 + -6799 7220 7696 0 + 6799 7220 -7696 0 + -7220 -7377 7697 0 + -7220 7377 -7697 0 + -6800 7220 7697 0 + 6800 7220 -7697 0 + -7220 -7378 7698 0 + -7220 7378 -7698 0 + -6801 7220 7698 0 + 6801 7220 -7698 0 + -7220 -7379 7699 0 + -7220 7379 -7699 0 + -6802 7220 7699 0 + 6802 7220 -7699 0 + -7220 -7380 7700 0 + -7220 7380 -7700 0 + -6803 7220 7700 0 + 6803 7220 -7700 0 + -7220 -7381 7701 0 + -7220 7381 -7701 0 + -6804 7220 7701 0 + 6804 7220 -7701 0 + -7220 -7382 7702 0 + -7220 7382 -7702 0 + -6805 7220 7702 0 + 6805 7220 -7702 0 + -7220 -7383 7703 0 + -7220 7383 -7703 0 + -6806 7220 7703 0 + 6806 7220 -7703 0 + -7220 -7384 7704 0 + -7220 7384 -7704 0 + -6807 7220 7704 0 + 6807 7220 -7704 0 + -7220 -7385 7705 0 + -7220 7385 -7705 0 + -6808 7220 7705 0 + 6808 7220 -7705 0 + -7220 -7386 7706 0 + -7220 7386 -7706 0 + -6809 7220 7706 0 + 6809 7220 -7706 0 + -7220 -7387 7707 0 + -7220 7387 -7707 0 + -6810 7220 7707 0 + 6810 7220 -7707 0 + -7220 -7388 7708 0 + -7220 7388 -7708 0 + -6811 7220 7708 0 + 6811 7220 -7708 0 + -7220 -7389 7709 0 + -7220 7389 -7709 0 + -6812 7220 7709 0 + 6812 7220 -7709 0 + -7220 -7390 7710 0 + -7220 7390 -7710 0 + -6813 7220 7710 0 + 6813 7220 -7710 0 + -7220 -7391 7711 0 + -7220 7391 -7711 0 + -6814 7220 7711 0 + 6814 7220 -7711 0 + -7220 -7392 7712 0 + -7220 7392 -7712 0 + -6815 7220 7712 0 + 6815 7220 -7712 0 + -7220 -7393 7713 0 + -7220 7393 -7713 0 + -6816 7220 7713 0 + 6816 7220 -7713 0 + -7220 -7394 7714 0 + -7220 7394 -7714 0 + -6817 7220 7714 0 + 6817 7220 -7714 0 + -7220 -7395 7715 0 + -7220 7395 -7715 0 + -6818 7220 7715 0 + 6818 7220 -7715 0 + -7220 -7396 7716 0 + -7220 7396 -7716 0 + -6819 7220 7716 0 + 6819 7220 -7716 0 + -7220 -7397 7717 0 + -7220 7397 -7717 0 + -6820 7220 7717 0 + 6820 7220 -7717 0 + -7220 -7398 7718 0 + -7220 7398 -7718 0 + -6821 7220 7718 0 + 6821 7220 -7718 0 + -7220 -7399 7719 0 + -7220 7399 -7719 0 + -6822 7220 7719 0 + 6822 7220 -7719 0 + -7220 -7400 7720 0 + -7220 7400 -7720 0 + -6823 7220 7720 0 + 6823 7220 -7720 0 + -7220 -7401 7721 0 + -7220 7401 -7721 0 + -6824 7220 7721 0 + 6824 7220 -7721 0 + -7220 -7402 7722 0 + -7220 7402 -7722 0 + -6825 7220 7722 0 + 6825 7220 -7722 0 + -7220 -7403 7723 0 + -7220 7403 -7723 0 + -6826 7220 7723 0 + 6826 7220 -7723 0 + -7220 -7404 7724 0 + -7220 7404 -7724 0 + -6827 7220 7724 0 + 6827 7220 -7724 0 + -7220 -7405 7725 0 + -7220 7405 -7725 0 + -6828 7220 7725 0 + 6828 7220 -7725 0 + -7220 -7406 7726 0 + -7220 7406 -7726 0 + -6829 7220 7726 0 + 6829 7220 -7726 0 + -7220 -7407 7727 0 + -7220 7407 -7727 0 + -6830 7220 7727 0 + 6830 7220 -7727 0 + -7220 -7408 7728 0 + -7220 7408 -7728 0 + -6831 7220 7728 0 + 6831 7220 -7728 0 + -7220 -7409 7729 0 + -7220 7409 -7729 0 + -6832 7220 7729 0 + 6832 7220 -7729 0 + -7220 -7410 7730 0 + -7220 7410 -7730 0 + -6833 7220 7730 0 + 6833 7220 -7730 0 + -7220 -7411 7731 0 + -7220 7411 -7731 0 + -6834 7220 7731 0 + 6834 7220 -7731 0 + -7220 -7412 7732 0 + -7220 7412 -7732 0 + -6835 7220 7732 0 + 6835 7220 -7732 0 + -4491 -4747 7733 0 + 4491 -4747 -7733 0 + 4747 -7669 7733 0 + 4747 7669 -7733 0 + -4492 -4747 7734 0 + 4492 -4747 -7734 0 + 4747 -7670 7734 0 + 4747 7670 -7734 0 + -4493 -4747 7735 0 + 4493 -4747 -7735 0 + 4747 -7671 7735 0 + 4747 7671 -7735 0 + -4494 -4747 7736 0 + 4494 -4747 -7736 0 + 4747 -7672 7736 0 + 4747 7672 -7736 0 + -4495 -4747 7737 0 + 4495 -4747 -7737 0 + 4747 -7673 7737 0 + 4747 7673 -7737 0 + -4496 -4747 7738 0 + 4496 -4747 -7738 0 + 4747 -7674 7738 0 + 4747 7674 -7738 0 + -4497 -4747 7739 0 + 4497 -4747 -7739 0 + 4747 -7675 7739 0 + 4747 7675 -7739 0 + -4498 -4747 7740 0 + 4498 -4747 -7740 0 + 4747 -7676 7740 0 + 4747 7676 -7740 0 + -4499 -4747 7741 0 + 4499 -4747 -7741 0 + 4747 -7677 7741 0 + 4747 7677 -7741 0 + -4500 -4747 7742 0 + 4500 -4747 -7742 0 + 4747 -7678 7742 0 + 4747 7678 -7742 0 + -4501 -4747 7743 0 + 4501 -4747 -7743 0 + 4747 -7679 7743 0 + 4747 7679 -7743 0 + -4502 -4747 7744 0 + 4502 -4747 -7744 0 + 4747 -7680 7744 0 + 4747 7680 -7744 0 + -4503 -4747 7745 0 + 4503 -4747 -7745 0 + 4747 -7681 7745 0 + 4747 7681 -7745 0 + -4504 -4747 7746 0 + 4504 -4747 -7746 0 + 4747 -7682 7746 0 + 4747 7682 -7746 0 + -4505 -4747 7747 0 + 4505 -4747 -7747 0 + 4747 -7683 7747 0 + 4747 7683 -7747 0 + -4506 -4747 7748 0 + 4506 -4747 -7748 0 + 4747 -7684 7748 0 + 4747 7684 -7748 0 + -4507 -4747 7749 0 + 4507 -4747 -7749 0 + 4747 -7685 7749 0 + 4747 7685 -7749 0 + -4508 -4747 7750 0 + 4508 -4747 -7750 0 + 4747 -7686 7750 0 + 4747 7686 -7750 0 + -4509 -4747 7751 0 + 4509 -4747 -7751 0 + 4747 -7687 7751 0 + 4747 7687 -7751 0 + -4510 -4747 7752 0 + 4510 -4747 -7752 0 + 4747 -7688 7752 0 + 4747 7688 -7752 0 + -4511 -4747 7753 0 + 4511 -4747 -7753 0 + 4747 -7689 7753 0 + 4747 7689 -7753 0 + -4512 -4747 7754 0 + 4512 -4747 -7754 0 + 4747 -7690 7754 0 + 4747 7690 -7754 0 + -4513 -4747 7755 0 + 4513 -4747 -7755 0 + 4747 -7691 7755 0 + 4747 7691 -7755 0 + -4514 -4747 7756 0 + 4514 -4747 -7756 0 + 4747 -7692 7756 0 + 4747 7692 -7756 0 + -4515 -4747 7757 0 + 4515 -4747 -7757 0 + 4747 -7693 7757 0 + 4747 7693 -7757 0 + -4516 -4747 7758 0 + 4516 -4747 -7758 0 + 4747 -7694 7758 0 + 4747 7694 -7758 0 + -4517 -4747 7759 0 + 4517 -4747 -7759 0 + 4747 -7695 7759 0 + 4747 7695 -7759 0 + -4518 -4747 7760 0 + 4518 -4747 -7760 0 + 4747 -7696 7760 0 + 4747 7696 -7760 0 + -4519 -4747 7761 0 + 4519 -4747 -7761 0 + 4747 -7697 7761 0 + 4747 7697 -7761 0 + -4520 -4747 7762 0 + 4520 -4747 -7762 0 + 4747 -7698 7762 0 + 4747 7698 -7762 0 + -4521 -4747 7763 0 + 4521 -4747 -7763 0 + 4747 -7699 7763 0 + 4747 7699 -7763 0 + -4522 -4747 7764 0 + 4522 -4747 -7764 0 + 4747 -7700 7764 0 + 4747 7700 -7764 0 + -4523 -4747 7765 0 + 4523 -4747 -7765 0 + 4747 -7701 7765 0 + 4747 7701 -7765 0 + -4524 -4747 7766 0 + 4524 -4747 -7766 0 + 4747 -7702 7766 0 + 4747 7702 -7766 0 + -4525 -4747 7767 0 + 4525 -4747 -7767 0 + 4747 -7703 7767 0 + 4747 7703 -7767 0 + -4526 -4747 7768 0 + 4526 -4747 -7768 0 + 4747 -7704 7768 0 + 4747 7704 -7768 0 + -4527 -4747 7769 0 + 4527 -4747 -7769 0 + 4747 -7705 7769 0 + 4747 7705 -7769 0 + -4528 -4747 7770 0 + 4528 -4747 -7770 0 + 4747 -7706 7770 0 + 4747 7706 -7770 0 + -4529 -4747 7771 0 + 4529 -4747 -7771 0 + 4747 -7707 7771 0 + 4747 7707 -7771 0 + -4530 -4747 7772 0 + 4530 -4747 -7772 0 + 4747 -7708 7772 0 + 4747 7708 -7772 0 + -4531 -4747 7773 0 + 4531 -4747 -7773 0 + 4747 -7709 7773 0 + 4747 7709 -7773 0 + -4532 -4747 7774 0 + 4532 -4747 -7774 0 + 4747 -7710 7774 0 + 4747 7710 -7774 0 + -4533 -4747 7775 0 + 4533 -4747 -7775 0 + 4747 -7711 7775 0 + 4747 7711 -7775 0 + -4534 -4747 7776 0 + 4534 -4747 -7776 0 + 4747 -7712 7776 0 + 4747 7712 -7776 0 + -4535 -4747 7777 0 + 4535 -4747 -7777 0 + 4747 -7713 7777 0 + 4747 7713 -7777 0 + -4536 -4747 7778 0 + 4536 -4747 -7778 0 + 4747 -7714 7778 0 + 4747 7714 -7778 0 + -4537 -4747 7779 0 + 4537 -4747 -7779 0 + 4747 -7715 7779 0 + 4747 7715 -7779 0 + -4538 -4747 7780 0 + 4538 -4747 -7780 0 + 4747 -7716 7780 0 + 4747 7716 -7780 0 + -4539 -4747 7781 0 + 4539 -4747 -7781 0 + 4747 -7717 7781 0 + 4747 7717 -7781 0 + -4540 -4747 7782 0 + 4540 -4747 -7782 0 + 4747 -7718 7782 0 + 4747 7718 -7782 0 + -4541 -4747 7783 0 + 4541 -4747 -7783 0 + 4747 -7719 7783 0 + 4747 7719 -7783 0 + -4542 -4747 7784 0 + 4542 -4747 -7784 0 + 4747 -7720 7784 0 + 4747 7720 -7784 0 + -4543 -4747 7785 0 + 4543 -4747 -7785 0 + 4747 -7721 7785 0 + 4747 7721 -7785 0 + -4544 -4747 7786 0 + 4544 -4747 -7786 0 + 4747 -7722 7786 0 + 4747 7722 -7786 0 + -4545 -4747 7787 0 + 4545 -4747 -7787 0 + 4747 -7723 7787 0 + 4747 7723 -7787 0 + -4546 -4747 7788 0 + 4546 -4747 -7788 0 + 4747 -7724 7788 0 + 4747 7724 -7788 0 + -4547 -4747 7789 0 + 4547 -4747 -7789 0 + 4747 -7725 7789 0 + 4747 7725 -7789 0 + -4548 -4747 7790 0 + 4548 -4747 -7790 0 + 4747 -7726 7790 0 + 4747 7726 -7790 0 + -4549 -4747 7791 0 + 4549 -4747 -7791 0 + 4747 -7727 7791 0 + 4747 7727 -7791 0 + -4550 -4747 7792 0 + 4550 -4747 -7792 0 + 4747 -7728 7792 0 + 4747 7728 -7792 0 + -4551 -4747 7793 0 + 4551 -4747 -7793 0 + 4747 -7729 7793 0 + 4747 7729 -7793 0 + -4552 -4747 7794 0 + 4552 -4747 -7794 0 + 4747 -7730 7794 0 + 4747 7730 -7794 0 + -4553 -4747 7795 0 + 4553 -4747 -7795 0 + 4747 -7731 7795 0 + 4747 7731 -7795 0 + -4554 -4747 7796 0 + 4554 -4747 -7796 0 + 4747 -7732 7796 0 + 4747 7732 -7796 0 + -4418 -4491 7797 0 + -4418 4491 -7797 0 + 4418 -7733 7797 0 + 4418 7733 -7797 0 + -4418 -4492 7798 0 + -4418 4492 -7798 0 + 4418 -7734 7798 0 + 4418 7734 -7798 0 + -4418 -4493 7799 0 + -4418 4493 -7799 0 + 4418 -7735 7799 0 + 4418 7735 -7799 0 + -4418 -4494 7800 0 + -4418 4494 -7800 0 + 4418 -7736 7800 0 + 4418 7736 -7800 0 + -4418 -4495 7801 0 + -4418 4495 -7801 0 + 4418 -7737 7801 0 + 4418 7737 -7801 0 + -4418 -4496 7802 0 + -4418 4496 -7802 0 + 4418 -7738 7802 0 + 4418 7738 -7802 0 + -4418 -4497 7803 0 + -4418 4497 -7803 0 + 4418 -7739 7803 0 + 4418 7739 -7803 0 + -4418 -4498 7804 0 + -4418 4498 -7804 0 + 4418 -7740 7804 0 + 4418 7740 -7804 0 + -4418 -4499 7805 0 + -4418 4499 -7805 0 + 4418 -7741 7805 0 + 4418 7741 -7805 0 + -4418 -4500 7806 0 + -4418 4500 -7806 0 + 4418 -7742 7806 0 + 4418 7742 -7806 0 + -4418 -4501 7807 0 + -4418 4501 -7807 0 + 4418 -7743 7807 0 + 4418 7743 -7807 0 + -4418 -4502 7808 0 + -4418 4502 -7808 0 + 4418 -7744 7808 0 + 4418 7744 -7808 0 + -4418 -4503 7809 0 + -4418 4503 -7809 0 + 4418 -7745 7809 0 + 4418 7745 -7809 0 + -4418 -4504 7810 0 + -4418 4504 -7810 0 + 4418 -7746 7810 0 + 4418 7746 -7810 0 + -4418 -4505 7811 0 + -4418 4505 -7811 0 + 4418 -7747 7811 0 + 4418 7747 -7811 0 + -4418 -4506 7812 0 + -4418 4506 -7812 0 + 4418 -7748 7812 0 + 4418 7748 -7812 0 + -4418 -4507 7813 0 + -4418 4507 -7813 0 + 4418 -7749 7813 0 + 4418 7749 -7813 0 + -4418 -4508 7814 0 + -4418 4508 -7814 0 + 4418 -7750 7814 0 + 4418 7750 -7814 0 + -4418 -4509 7815 0 + -4418 4509 -7815 0 + 4418 -7751 7815 0 + 4418 7751 -7815 0 + -4418 -4510 7816 0 + -4418 4510 -7816 0 + 4418 -7752 7816 0 + 4418 7752 -7816 0 + -4418 -4511 7817 0 + -4418 4511 -7817 0 + 4418 -7753 7817 0 + 4418 7753 -7817 0 + -4418 -4512 7818 0 + -4418 4512 -7818 0 + 4418 -7754 7818 0 + 4418 7754 -7818 0 + -4418 -4513 7819 0 + -4418 4513 -7819 0 + 4418 -7755 7819 0 + 4418 7755 -7819 0 + -4418 -4514 7820 0 + -4418 4514 -7820 0 + 4418 -7756 7820 0 + 4418 7756 -7820 0 + -4418 -4515 7821 0 + -4418 4515 -7821 0 + 4418 -7757 7821 0 + 4418 7757 -7821 0 + -4418 -4516 7822 0 + -4418 4516 -7822 0 + 4418 -7758 7822 0 + 4418 7758 -7822 0 + -4418 -4517 7823 0 + -4418 4517 -7823 0 + 4418 -7759 7823 0 + 4418 7759 -7823 0 + -4418 -4518 7824 0 + -4418 4518 -7824 0 + 4418 -7760 7824 0 + 4418 7760 -7824 0 + -4418 -4519 7825 0 + -4418 4519 -7825 0 + 4418 -7761 7825 0 + 4418 7761 -7825 0 + -4418 -4520 7826 0 + -4418 4520 -7826 0 + 4418 -7762 7826 0 + 4418 7762 -7826 0 + -4418 -4521 7827 0 + -4418 4521 -7827 0 + 4418 -7763 7827 0 + 4418 7763 -7827 0 + -4418 -4522 7828 0 + -4418 4522 -7828 0 + 4418 -7764 7828 0 + 4418 7764 -7828 0 + -4418 -4523 7829 0 + -4418 4523 -7829 0 + 4418 -7765 7829 0 + 4418 7765 -7829 0 + -4418 -4524 7830 0 + -4418 4524 -7830 0 + 4418 -7766 7830 0 + 4418 7766 -7830 0 + -4418 -4525 7831 0 + -4418 4525 -7831 0 + 4418 -7767 7831 0 + 4418 7767 -7831 0 + -4418 -4526 7832 0 + -4418 4526 -7832 0 + 4418 -7768 7832 0 + 4418 7768 -7832 0 + -4418 -4527 7833 0 + -4418 4527 -7833 0 + 4418 -7769 7833 0 + 4418 7769 -7833 0 + -4418 -4528 7834 0 + -4418 4528 -7834 0 + 4418 -7770 7834 0 + 4418 7770 -7834 0 + -4418 -4529 7835 0 + -4418 4529 -7835 0 + 4418 -7771 7835 0 + 4418 7771 -7835 0 + -4418 -4530 7836 0 + -4418 4530 -7836 0 + 4418 -7772 7836 0 + 4418 7772 -7836 0 + -4418 -4531 7837 0 + -4418 4531 -7837 0 + 4418 -7773 7837 0 + 4418 7773 -7837 0 + -4418 -4532 7838 0 + -4418 4532 -7838 0 + 4418 -7774 7838 0 + 4418 7774 -7838 0 + -4418 -4533 7839 0 + -4418 4533 -7839 0 + 4418 -7775 7839 0 + 4418 7775 -7839 0 + -4418 -4534 7840 0 + -4418 4534 -7840 0 + 4418 -7776 7840 0 + 4418 7776 -7840 0 + -4418 -4535 7841 0 + -4418 4535 -7841 0 + 4418 -7777 7841 0 + 4418 7777 -7841 0 + -4418 -4536 7842 0 + -4418 4536 -7842 0 + 4418 -7778 7842 0 + 4418 7778 -7842 0 + -4418 -4537 7843 0 + -4418 4537 -7843 0 + 4418 -7779 7843 0 + 4418 7779 -7843 0 + -4418 -4538 7844 0 + -4418 4538 -7844 0 + 4418 -7780 7844 0 + 4418 7780 -7844 0 + -4418 -4539 7845 0 + -4418 4539 -7845 0 + 4418 -7781 7845 0 + 4418 7781 -7845 0 + -4418 -4540 7846 0 + -4418 4540 -7846 0 + 4418 -7782 7846 0 + 4418 7782 -7846 0 + -4418 -4541 7847 0 + -4418 4541 -7847 0 + 4418 -7783 7847 0 + 4418 7783 -7847 0 + -4418 -4542 7848 0 + -4418 4542 -7848 0 + 4418 -7784 7848 0 + 4418 7784 -7848 0 + -4418 -4543 7849 0 + -4418 4543 -7849 0 + 4418 -7785 7849 0 + 4418 7785 -7849 0 + -4418 -4544 7850 0 + -4418 4544 -7850 0 + 4418 -7786 7850 0 + 4418 7786 -7850 0 + -4418 -4545 7851 0 + -4418 4545 -7851 0 + 4418 -7787 7851 0 + 4418 7787 -7851 0 + -4418 -4546 7852 0 + -4418 4546 -7852 0 + 4418 -7788 7852 0 + 4418 7788 -7852 0 + -4418 -4547 7853 0 + -4418 4547 -7853 0 + 4418 -7789 7853 0 + 4418 7789 -7853 0 + -4418 -4548 7854 0 + -4418 4548 -7854 0 + 4418 -7790 7854 0 + 4418 7790 -7854 0 + -4418 -4549 7855 0 + -4418 4549 -7855 0 + 4418 -7791 7855 0 + 4418 7791 -7855 0 + -4418 -4550 7856 0 + -4418 4550 -7856 0 + 4418 -7792 7856 0 + 4418 7792 -7856 0 + -4418 -4551 7857 0 + -4418 4551 -7857 0 + 4418 -7793 7857 0 + 4418 7793 -7857 0 + -4418 -4552 7858 0 + -4418 4552 -7858 0 + 4418 -7794 7858 0 + 4418 7794 -7858 0 + -4418 -4553 7859 0 + -4418 4553 -7859 0 + 4418 -7795 7859 0 + 4418 7795 -7859 0 + -4418 -4554 7860 0 + -4418 4554 -7860 0 + 4418 -7796 7860 0 + 4418 7796 -7860 0 + 7797 -7869 0 + -7797 7869 0 + 7798 -7870 0 + -7798 7870 0 + 7799 -7871 0 + -7799 7871 0 + 7800 -7872 0 + -7800 7872 0 + 7801 -7873 0 + -7801 7873 0 + 7802 -7874 0 + -7802 7874 0 + 7803 -7875 0 + -7803 7875 0 + 7804 -7876 0 + -7804 7876 0 + 7805 -7877 0 + -7805 7877 0 + 7806 -7878 0 + -7806 7878 0 + 7807 -7879 0 + -7807 7879 0 + 7808 -7880 0 + -7808 7880 0 + 7809 -7881 0 + -7809 7881 0 + 7810 -7882 0 + -7810 7882 0 + 7811 -7883 0 + -7811 7883 0 + 7812 -7884 0 + -7812 7884 0 + -3960 -4041 7885 0 + -3960 4041 -7885 0 + 3960 -7869 7885 0 + 3960 7869 -7885 0 + -3960 -4042 7886 0 + -3960 4042 -7886 0 + 3960 -7870 7886 0 + 3960 7870 -7886 0 + -3960 -4043 7887 0 + -3960 4043 -7887 0 + 3960 -7871 7887 0 + 3960 7871 -7887 0 + -3960 -4044 7888 0 + -3960 4044 -7888 0 + 3960 -7872 7888 0 + 3960 7872 -7888 0 + -3960 -4045 7889 0 + -3960 4045 -7889 0 + 3960 -7873 7889 0 + 3960 7873 -7889 0 + -3960 -4046 7890 0 + -3960 4046 -7890 0 + 3960 -7874 7890 0 + 3960 7874 -7890 0 + -3960 -4047 7891 0 + -3960 4047 -7891 0 + 3960 -7875 7891 0 + 3960 7875 -7891 0 + -3960 -4048 7892 0 + -3960 4048 -7892 0 + 3960 -7876 7892 0 + 3960 7876 -7892 0 + -3960 -4049 7893 0 + -3960 4049 -7893 0 + 3960 -7877 7893 0 + 3960 7877 -7893 0 + -3960 -4050 7894 0 + -3960 4050 -7894 0 + 3960 -7878 7894 0 + 3960 7878 -7894 0 + -3960 -4051 7895 0 + -3960 4051 -7895 0 + 3960 -7879 7895 0 + 3960 7879 -7895 0 + -3960 -4052 7896 0 + -3960 4052 -7896 0 + 3960 -7880 7896 0 + 3960 7880 -7896 0 + -3960 -4053 7897 0 + -3960 4053 -7897 0 + 3960 -7881 7897 0 + 3960 7881 -7897 0 + -3960 -4054 7898 0 + -3960 4054 -7898 0 + 3960 -7882 7898 0 + 3960 7882 -7898 0 + -3960 -4055 7899 0 + -3960 4055 -7899 0 + 3960 -7883 7899 0 + 3960 7883 -7899 0 + -3960 -4056 7900 0 + -3960 4056 -7900 0 + 3960 -7884 7900 0 + 3960 7884 -7900 0 + 7885 -7901 0 + -7885 7901 0 + 7886 -7902 0 + -7886 7902 0 + 7887 -7903 0 + -7887 7903 0 + 7888 -7904 0 + -7888 7904 0 + 7889 -7905 0 + -7889 7905 0 + 7890 -7906 0 + -7890 7906 0 + 7891 -7907 0 + -7891 7907 0 + 7892 -7908 0 + -7892 7908 0 + 7893 -7909 0 + -7893 7909 0 + 7894 -7910 0 + -7894 7910 0 + 7895 -7911 0 + -7895 7911 0 + 7896 -7912 0 + -7896 7912 0 + 7897 -7913 0 + -7897 7913 0 + 7898 -7914 0 + -7898 7914 0 + 7899 -7915 0 + -7899 7915 0 + 7900 -7916 0 + -7900 7916 0 + 7900 -7917 0 + -7900 7917 0 + 7900 -7918 0 + -7900 7918 0 + 7900 -7919 0 + -7900 7919 0 + 7900 -7920 0 + -7900 7920 0 + 7900 -7921 0 + -7900 7921 0 + 7900 -7922 0 + -7900 7922 0 + 7900 -7923 0 + -7900 7923 0 + 7900 -7924 0 + -7900 7924 0 + 7900 -7925 0 + -7900 7925 0 + 7900 -7926 0 + -7900 7926 0 + 7900 -7927 0 + -7900 7927 0 + 7900 -7928 0 + -7900 7928 0 + 7900 -7929 0 + -7900 7929 0 + 7900 -7930 0 + -7900 7930 0 + 7900 -7931 0 + -7900 7931 0 + 7900 -7932 0 + -7900 7932 0 + 7901 7966 0 + -7901 -7966 0 + 7902 7967 0 + -7902 -7967 0 + 7903 7968 0 + -7903 -7968 0 + 7904 7969 0 + -7904 -7969 0 + 7905 7970 0 + -7905 -7970 0 + 7906 7971 0 + -7906 -7971 0 + 7907 7972 0 + -7907 -7972 0 + 7908 7973 0 + -7908 -7973 0 + 7909 7974 0 + -7909 -7974 0 + 7910 7975 0 + -7910 -7975 0 + 7911 7976 0 + -7911 -7976 0 + 7912 7977 0 + -7912 -7977 0 + 7913 7978 0 + -7913 -7978 0 + 7914 7979 0 + -7914 -7979 0 + 7915 7980 0 + -7915 -7980 0 + 7916 7981 0 + -7916 -7981 0 + 7917 7982 0 + -7917 -7982 0 + 7918 7983 0 + -7918 -7983 0 + 7919 7984 0 + -7919 -7984 0 + 7920 7985 0 + -7920 -7985 0 + 7921 7986 0 + -7921 -7986 0 + 7922 7987 0 + -7922 -7987 0 + 7923 7988 0 + -7923 -7988 0 + 7924 7989 0 + -7924 -7989 0 + 7925 7990 0 + -7925 -7990 0 + 7926 7991 0 + -7926 -7991 0 + 7927 7992 0 + -7927 -7992 0 + 7928 7993 0 + -7928 -7993 0 + 7929 7994 0 + -7929 -7994 0 + 7930 7995 0 + -7930 -7995 0 + 7931 7996 0 + -7931 -7996 0 + 7932 7997 0 + -7932 -7997 0 + -260 7966 7998 0 + 260 -7966 7998 0 + 260 7966 -7998 0 + -260 -7966 -7998 0 + -260 -7966 8000 0 + 260 -8000 0 + 7966 -8000 0 + -7998 7999 0 + 7998 -7999 0 + 1 -7999 0 + 7999 8000 -8001 0 + -7999 8001 0 + -8000 8001 0 + 1 7934 -7998 0 + 7934 7998 0 + 1 -7934 7998 0 + -7934 -7998 0 + -261 7967 8002 0 + 261 -7967 8002 0 + 261 7967 -8002 0 + -261 -7967 -8002 0 + -261 -7967 8004 0 + 261 -8004 0 + 7967 -8004 0 + -8001 -8002 8003 0 + 8002 -8003 0 + 8001 -8003 0 + 8003 8004 -8005 0 + -8003 8005 0 + -8004 8005 0 + 7935 8001 -8002 0 + 7935 -8001 8002 0 + -7935 8001 8002 0 + -7935 -8001 -8002 0 + -262 7968 8006 0 + 262 -7968 8006 0 + 262 7968 -8006 0 + -262 -7968 -8006 0 + -262 -7968 8008 0 + 262 -8008 0 + 7968 -8008 0 + -8005 -8006 8007 0 + 8006 -8007 0 + 8005 -8007 0 + 8007 8008 -8009 0 + -8007 8009 0 + -8008 8009 0 + 7936 8005 -8006 0 + 7936 -8005 8006 0 + -7936 8005 8006 0 + -7936 -8005 -8006 0 + -263 7969 8010 0 + 263 -7969 8010 0 + 263 7969 -8010 0 + -263 -7969 -8010 0 + -263 -7969 8012 0 + 263 -8012 0 + 7969 -8012 0 + -8009 -8010 8011 0 + 8010 -8011 0 + 8009 -8011 0 + 8011 8012 -8013 0 + -8011 8013 0 + -8012 8013 0 + 7937 8009 -8010 0 + 7937 -8009 8010 0 + -7937 8009 8010 0 + -7937 -8009 -8010 0 + -264 7970 8014 0 + 264 -7970 8014 0 + 264 7970 -8014 0 + -264 -7970 -8014 0 + -264 -7970 8016 0 + 264 -8016 0 + 7970 -8016 0 + -8013 -8014 8015 0 + 8014 -8015 0 + 8013 -8015 0 + 8015 8016 -8017 0 + -8015 8017 0 + -8016 8017 0 + 7938 8013 -8014 0 + 7938 -8013 8014 0 + -7938 8013 8014 0 + -7938 -8013 -8014 0 + -265 7971 8018 0 + 265 -7971 8018 0 + 265 7971 -8018 0 + -265 -7971 -8018 0 + -265 -7971 8020 0 + 265 -8020 0 + 7971 -8020 0 + -8017 -8018 8019 0 + 8018 -8019 0 + 8017 -8019 0 + 8019 8020 -8021 0 + -8019 8021 0 + -8020 8021 0 + 7939 8017 -8018 0 + 7939 -8017 8018 0 + -7939 8017 8018 0 + -7939 -8017 -8018 0 + -266 7972 8022 0 + 266 -7972 8022 0 + 266 7972 -8022 0 + -266 -7972 -8022 0 + -266 -7972 8024 0 + 266 -8024 0 + 7972 -8024 0 + -8021 -8022 8023 0 + 8022 -8023 0 + 8021 -8023 0 + 8023 8024 -8025 0 + -8023 8025 0 + -8024 8025 0 + 7940 8021 -8022 0 + 7940 -8021 8022 0 + -7940 8021 8022 0 + -7940 -8021 -8022 0 + -267 7973 8026 0 + 267 -7973 8026 0 + 267 7973 -8026 0 + -267 -7973 -8026 0 + -267 -7973 8028 0 + 267 -8028 0 + 7973 -8028 0 + -8025 -8026 8027 0 + 8026 -8027 0 + 8025 -8027 0 + 8027 8028 -8029 0 + -8027 8029 0 + -8028 8029 0 + 7941 8025 -8026 0 + 7941 -8025 8026 0 + -7941 8025 8026 0 + -7941 -8025 -8026 0 + -268 7974 8030 0 + 268 -7974 8030 0 + 268 7974 -8030 0 + -268 -7974 -8030 0 + -268 -7974 8032 0 + 268 -8032 0 + 7974 -8032 0 + -8029 -8030 8031 0 + 8030 -8031 0 + 8029 -8031 0 + 8031 8032 -8033 0 + -8031 8033 0 + -8032 8033 0 + 7942 8029 -8030 0 + 7942 -8029 8030 0 + -7942 8029 8030 0 + -7942 -8029 -8030 0 + -269 7975 8034 0 + 269 -7975 8034 0 + 269 7975 -8034 0 + -269 -7975 -8034 0 + -269 -7975 8036 0 + 269 -8036 0 + 7975 -8036 0 + -8033 -8034 8035 0 + 8034 -8035 0 + 8033 -8035 0 + 8035 8036 -8037 0 + -8035 8037 0 + -8036 8037 0 + 7943 8033 -8034 0 + 7943 -8033 8034 0 + -7943 8033 8034 0 + -7943 -8033 -8034 0 + -270 7976 8038 0 + 270 -7976 8038 0 + 270 7976 -8038 0 + -270 -7976 -8038 0 + -270 -7976 8040 0 + 270 -8040 0 + 7976 -8040 0 + -8037 -8038 8039 0 + 8038 -8039 0 + 8037 -8039 0 + 8039 8040 -8041 0 + -8039 8041 0 + -8040 8041 0 + 7944 8037 -8038 0 + 7944 -8037 8038 0 + -7944 8037 8038 0 + -7944 -8037 -8038 0 + -271 7977 8042 0 + 271 -7977 8042 0 + 271 7977 -8042 0 + -271 -7977 -8042 0 + -271 -7977 8044 0 + 271 -8044 0 + 7977 -8044 0 + -8041 -8042 8043 0 + 8042 -8043 0 + 8041 -8043 0 + 8043 8044 -8045 0 + -8043 8045 0 + -8044 8045 0 + 7945 8041 -8042 0 + 7945 -8041 8042 0 + -7945 8041 8042 0 + -7945 -8041 -8042 0 + -272 7978 8046 0 + 272 -7978 8046 0 + 272 7978 -8046 0 + -272 -7978 -8046 0 + -272 -7978 8048 0 + 272 -8048 0 + 7978 -8048 0 + -8045 -8046 8047 0 + 8046 -8047 0 + 8045 -8047 0 + 8047 8048 -8049 0 + -8047 8049 0 + -8048 8049 0 + 7946 8045 -8046 0 + 7946 -8045 8046 0 + -7946 8045 8046 0 + -7946 -8045 -8046 0 + -273 7979 8050 0 + 273 -7979 8050 0 + 273 7979 -8050 0 + -273 -7979 -8050 0 + -273 -7979 8052 0 + 273 -8052 0 + 7979 -8052 0 + -8049 -8050 8051 0 + 8050 -8051 0 + 8049 -8051 0 + 8051 8052 -8053 0 + -8051 8053 0 + -8052 8053 0 + 7947 8049 -8050 0 + 7947 -8049 8050 0 + -7947 8049 8050 0 + -7947 -8049 -8050 0 + -274 7980 8054 0 + 274 -7980 8054 0 + 274 7980 -8054 0 + -274 -7980 -8054 0 + -274 -7980 8056 0 + 274 -8056 0 + 7980 -8056 0 + -8053 -8054 8055 0 + 8054 -8055 0 + 8053 -8055 0 + 8055 8056 -8057 0 + -8055 8057 0 + -8056 8057 0 + 7948 8053 -8054 0 + 7948 -8053 8054 0 + -7948 8053 8054 0 + -7948 -8053 -8054 0 + -275 7981 8058 0 + 275 -7981 8058 0 + 275 7981 -8058 0 + -275 -7981 -8058 0 + -275 -7981 8060 0 + 275 -8060 0 + 7981 -8060 0 + -8057 -8058 8059 0 + 8058 -8059 0 + 8057 -8059 0 + 8059 8060 -8061 0 + -8059 8061 0 + -8060 8061 0 + 7949 8057 -8058 0 + 7949 -8057 8058 0 + -7949 8057 8058 0 + -7949 -8057 -8058 0 + -276 7982 8062 0 + 276 -7982 8062 0 + 276 7982 -8062 0 + -276 -7982 -8062 0 + -276 -7982 8064 0 + 276 -8064 0 + 7982 -8064 0 + -8061 -8062 8063 0 + 8062 -8063 0 + 8061 -8063 0 + 8063 8064 -8065 0 + -8063 8065 0 + -8064 8065 0 + 7950 8061 -8062 0 + 7950 -8061 8062 0 + -7950 8061 8062 0 + -7950 -8061 -8062 0 + -277 7983 8066 0 + 277 -7983 8066 0 + 277 7983 -8066 0 + -277 -7983 -8066 0 + -277 -7983 8068 0 + 277 -8068 0 + 7983 -8068 0 + -8065 -8066 8067 0 + 8066 -8067 0 + 8065 -8067 0 + 8067 8068 -8069 0 + -8067 8069 0 + -8068 8069 0 + 7951 8065 -8066 0 + 7951 -8065 8066 0 + -7951 8065 8066 0 + -7951 -8065 -8066 0 + -278 7984 8070 0 + 278 -7984 8070 0 + 278 7984 -8070 0 + -278 -7984 -8070 0 + -278 -7984 8072 0 + 278 -8072 0 + 7984 -8072 0 + -8069 -8070 8071 0 + 8070 -8071 0 + 8069 -8071 0 + 8071 8072 -8073 0 + -8071 8073 0 + -8072 8073 0 + 7952 8069 -8070 0 + 7952 -8069 8070 0 + -7952 8069 8070 0 + -7952 -8069 -8070 0 + -279 7985 8074 0 + 279 -7985 8074 0 + 279 7985 -8074 0 + -279 -7985 -8074 0 + -279 -7985 8076 0 + 279 -8076 0 + 7985 -8076 0 + -8073 -8074 8075 0 + 8074 -8075 0 + 8073 -8075 0 + 8075 8076 -8077 0 + -8075 8077 0 + -8076 8077 0 + 7953 8073 -8074 0 + 7953 -8073 8074 0 + -7953 8073 8074 0 + -7953 -8073 -8074 0 + -280 7986 8078 0 + 280 -7986 8078 0 + 280 7986 -8078 0 + -280 -7986 -8078 0 + -280 -7986 8080 0 + 280 -8080 0 + 7986 -8080 0 + -8077 -8078 8079 0 + 8078 -8079 0 + 8077 -8079 0 + 8079 8080 -8081 0 + -8079 8081 0 + -8080 8081 0 + 7954 8077 -8078 0 + 7954 -8077 8078 0 + -7954 8077 8078 0 + -7954 -8077 -8078 0 + -281 7987 8082 0 + 281 -7987 8082 0 + 281 7987 -8082 0 + -281 -7987 -8082 0 + -281 -7987 8084 0 + 281 -8084 0 + 7987 -8084 0 + -8081 -8082 8083 0 + 8082 -8083 0 + 8081 -8083 0 + 8083 8084 -8085 0 + -8083 8085 0 + -8084 8085 0 + 7955 8081 -8082 0 + 7955 -8081 8082 0 + -7955 8081 8082 0 + -7955 -8081 -8082 0 + -282 7988 8086 0 + 282 -7988 8086 0 + 282 7988 -8086 0 + -282 -7988 -8086 0 + -282 -7988 8088 0 + 282 -8088 0 + 7988 -8088 0 + -8085 -8086 8087 0 + 8086 -8087 0 + 8085 -8087 0 + 8087 8088 -8089 0 + -8087 8089 0 + -8088 8089 0 + 7956 8085 -8086 0 + 7956 -8085 8086 0 + -7956 8085 8086 0 + -7956 -8085 -8086 0 + -283 7989 8090 0 + 283 -7989 8090 0 + 283 7989 -8090 0 + -283 -7989 -8090 0 + -283 -7989 8092 0 + 283 -8092 0 + 7989 -8092 0 + -8089 -8090 8091 0 + 8090 -8091 0 + 8089 -8091 0 + 8091 8092 -8093 0 + -8091 8093 0 + -8092 8093 0 + 7957 8089 -8090 0 + 7957 -8089 8090 0 + -7957 8089 8090 0 + -7957 -8089 -8090 0 + -284 7990 8094 0 + 284 -7990 8094 0 + 284 7990 -8094 0 + -284 -7990 -8094 0 + -284 -7990 8096 0 + 284 -8096 0 + 7990 -8096 0 + -8093 -8094 8095 0 + 8094 -8095 0 + 8093 -8095 0 + 8095 8096 -8097 0 + -8095 8097 0 + -8096 8097 0 + 7958 8093 -8094 0 + 7958 -8093 8094 0 + -7958 8093 8094 0 + -7958 -8093 -8094 0 + -285 7991 8098 0 + 285 -7991 8098 0 + 285 7991 -8098 0 + -285 -7991 -8098 0 + -285 -7991 8100 0 + 285 -8100 0 + 7991 -8100 0 + -8097 -8098 8099 0 + 8098 -8099 0 + 8097 -8099 0 + 8099 8100 -8101 0 + -8099 8101 0 + -8100 8101 0 + 7959 8097 -8098 0 + 7959 -8097 8098 0 + -7959 8097 8098 0 + -7959 -8097 -8098 0 + -286 7992 8102 0 + 286 -7992 8102 0 + 286 7992 -8102 0 + -286 -7992 -8102 0 + -286 -7992 8104 0 + 286 -8104 0 + 7992 -8104 0 + -8101 -8102 8103 0 + 8102 -8103 0 + 8101 -8103 0 + 8103 8104 -8105 0 + -8103 8105 0 + -8104 8105 0 + 7960 8101 -8102 0 + 7960 -8101 8102 0 + -7960 8101 8102 0 + -7960 -8101 -8102 0 + -287 7993 8106 0 + 287 -7993 8106 0 + 287 7993 -8106 0 + -287 -7993 -8106 0 + -287 -7993 8108 0 + 287 -8108 0 + 7993 -8108 0 + -8105 -8106 8107 0 + 8106 -8107 0 + 8105 -8107 0 + 8107 8108 -8109 0 + -8107 8109 0 + -8108 8109 0 + 7961 8105 -8106 0 + 7961 -8105 8106 0 + -7961 8105 8106 0 + -7961 -8105 -8106 0 + -288 7994 8110 0 + 288 -7994 8110 0 + 288 7994 -8110 0 + -288 -7994 -8110 0 + -288 -7994 8112 0 + 288 -8112 0 + 7994 -8112 0 + -8109 -8110 8111 0 + 8110 -8111 0 + 8109 -8111 0 + 8111 8112 -8113 0 + -8111 8113 0 + -8112 8113 0 + 7962 8109 -8110 0 + 7962 -8109 8110 0 + -7962 8109 8110 0 + -7962 -8109 -8110 0 + -289 7995 8114 0 + 289 -7995 8114 0 + 289 7995 -8114 0 + -289 -7995 -8114 0 + -289 -7995 8116 0 + 289 -8116 0 + 7995 -8116 0 + -8113 -8114 8115 0 + 8114 -8115 0 + 8113 -8115 0 + 8115 8116 -8117 0 + -8115 8117 0 + -8116 8117 0 + 7963 8113 -8114 0 + 7963 -8113 8114 0 + -7963 8113 8114 0 + -7963 -8113 -8114 0 + -290 7996 8118 0 + 290 -7996 8118 0 + 290 7996 -8118 0 + -290 -7996 -8118 0 + -290 -7996 8120 0 + 290 -8120 0 + 7996 -8120 0 + -8117 -8118 8119 0 + 8118 -8119 0 + 8117 -8119 0 + 8119 8120 -8121 0 + -8119 8121 0 + -8120 8121 0 + 7964 8117 -8118 0 + 7964 -8117 8118 0 + -7964 8117 8118 0 + -7964 -8117 -8118 0 + -291 7997 8122 0 + 291 -7997 8122 0 + 291 7997 -8122 0 + -291 -7997 -8122 0 + -291 -7997 8124 0 + 291 -8124 0 + 7997 -8124 0 + -8121 -8122 8123 0 + 8122 -8123 0 + 8121 -8123 0 + 8123 8124 -8125 0 + -8123 8125 0 + -8124 8125 0 + 7965 8121 -8122 0 + 7965 -8121 8122 0 + -7965 8121 8122 0 + -7965 -8121 -8122 0 + 7933 8125 0 + -7933 -8125 0 + -260 -4322 8126 0 + 260 -8126 0 + 4322 -8126 0 + -261 -4323 8127 0 + 261 -8127 0 + 4323 -8127 0 + -262 -4324 8128 0 + 262 -8128 0 + 4324 -8128 0 + -263 -4325 8129 0 + 263 -8129 0 + 4325 -8129 0 + -264 -4326 8130 0 + 264 -8130 0 + 4326 -8130 0 + -265 -4327 8131 0 + 265 -8131 0 + 4327 -8131 0 + -266 -4328 8132 0 + 266 -8132 0 + 4328 -8132 0 + -267 -4329 8133 0 + 267 -8133 0 + 4329 -8133 0 + -268 -4330 8134 0 + 268 -8134 0 + 4330 -8134 0 + -269 -4331 8135 0 + 269 -8135 0 + 4331 -8135 0 + -270 -4332 8136 0 + 270 -8136 0 + 4332 -8136 0 + -271 -4333 8137 0 + 271 -8137 0 + 4333 -8137 0 + -272 -4334 8138 0 + 272 -8138 0 + 4334 -8138 0 + -273 -4335 8139 0 + 273 -8139 0 + 4335 -8139 0 + -274 -4336 8140 0 + 274 -8140 0 + 4336 -8140 0 + -275 -4337 8141 0 + 275 -8141 0 + 4337 -8141 0 + -276 -4338 8142 0 + 276 -8142 0 + 4338 -8142 0 + -277 -4339 8143 0 + 277 -8143 0 + 4339 -8143 0 + -278 -4340 8144 0 + 278 -8144 0 + 4340 -8144 0 + -279 -4341 8145 0 + 279 -8145 0 + 4341 -8145 0 + -280 -4342 8146 0 + 280 -8146 0 + 4342 -8146 0 + -281 -4343 8147 0 + 281 -8147 0 + 4343 -8147 0 + -282 -4344 8148 0 + 282 -8148 0 + 4344 -8148 0 + -283 -4345 8149 0 + 283 -8149 0 + 4345 -8149 0 + -284 -4346 8150 0 + 284 -8150 0 + 4346 -8150 0 + -285 -4347 8151 0 + 285 -8151 0 + 4347 -8151 0 + -286 -4348 8152 0 + 286 -8152 0 + 4348 -8152 0 + -287 -4349 8153 0 + 287 -8153 0 + 4349 -8153 0 + -288 -4350 8154 0 + 288 -8154 0 + 4350 -8154 0 + -289 -4351 8155 0 + 289 -8155 0 + 4351 -8155 0 + -290 -4352 8156 0 + 290 -8156 0 + 4352 -8156 0 + -291 -4353 8157 0 + 291 -8157 0 + 4353 -8157 0 + -7933 8158 0 + 3831 -7933 -8158 0 + 7933 -8126 8158 0 + 7933 8126 -8158 0 + -7933 8159 0 + 3832 -7933 -8159 0 + 7933 -8127 8159 0 + 7933 8127 -8159 0 + -7933 8160 0 + 3833 -7933 -8160 0 + 7933 -8128 8160 0 + 7933 8128 -8160 0 + -7933 8161 0 + 3834 -7933 -8161 0 + 7933 -8129 8161 0 + 7933 8129 -8161 0 + -7933 8162 0 + 3835 -7933 -8162 0 + 7933 -8130 8162 0 + 7933 8130 -8162 0 + -7933 8163 0 + 3836 -7933 -8163 0 + 7933 -8131 8163 0 + 7933 8131 -8163 0 + -7933 8164 0 + 3837 -7933 -8164 0 + 7933 -8132 8164 0 + 7933 8132 -8164 0 + -3838 -7933 8165 0 + -7933 -8165 0 + 7933 -8133 8165 0 + 7933 8133 -8165 0 + -3839 -7933 8166 0 + -7933 -8166 0 + 7933 -8134 8166 0 + 7933 8134 -8166 0 + -3840 -7933 8167 0 + -7933 -8167 0 + 7933 -8135 8167 0 + 7933 8135 -8167 0 + -3841 -7933 8168 0 + -7933 -8168 0 + 7933 -8136 8168 0 + 7933 8136 -8168 0 + -3842 -7933 8169 0 + -7933 -8169 0 + 7933 -8137 8169 0 + 7933 8137 -8169 0 + -3843 -7933 8170 0 + -7933 -8170 0 + 7933 -8138 8170 0 + 7933 8138 -8170 0 + -3844 -7933 8171 0 + -7933 -8171 0 + 7933 -8139 8171 0 + 7933 8139 -8171 0 + -3845 -7933 8172 0 + -7933 -8172 0 + 7933 -8140 8172 0 + 7933 8140 -8172 0 + -3846 -7933 8173 0 + -7933 -8173 0 + 7933 -8141 8173 0 + 7933 8141 -8173 0 + -3847 -7933 8174 0 + -7933 -8174 0 + 7933 -8142 8174 0 + 7933 8142 -8174 0 + -3848 -7933 8175 0 + -7933 -8175 0 + 7933 -8143 8175 0 + 7933 8143 -8175 0 + -3849 -7933 8176 0 + -7933 -8176 0 + 7933 -8144 8176 0 + 7933 8144 -8176 0 + -3850 -7933 8177 0 + -7933 -8177 0 + 7933 -8145 8177 0 + 7933 8145 -8177 0 + -3851 -7933 8178 0 + -7933 -8178 0 + 7933 -8146 8178 0 + 7933 8146 -8178 0 + -3852 -7933 8179 0 + -7933 -8179 0 + 7933 -8147 8179 0 + 7933 8147 -8179 0 + -3853 -7933 8180 0 + -7933 -8180 0 + 7933 -8148 8180 0 + 7933 8148 -8180 0 + -3854 -7933 8181 0 + -7933 -8181 0 + 7933 -8149 8181 0 + 7933 8149 -8181 0 + -3855 -7933 8182 0 + -7933 -8182 0 + 7933 -8150 8182 0 + 7933 8150 -8182 0 + -3856 -7933 8183 0 + -7933 -8183 0 + 7933 -8151 8183 0 + 7933 8151 -8183 0 + -3857 -7933 8184 0 + -7933 -8184 0 + 7933 -8152 8184 0 + 7933 8152 -8184 0 + -3858 -7933 8185 0 + -7933 -8185 0 + 7933 -8153 8185 0 + 7933 8153 -8185 0 + -3859 -7933 8186 0 + -7933 -8186 0 + 7933 -8154 8186 0 + 7933 8154 -8186 0 + -3860 -7933 8187 0 + -7933 -8187 0 + 7933 -8155 8187 0 + 7933 8155 -8187 0 + -3861 -7933 8188 0 + -7933 -8188 0 + 7933 -8156 8188 0 + 7933 8156 -8188 0 + -3862 -7933 8189 0 + -7933 -8189 0 + 7933 -8157 8189 0 + 7933 8157 -8189 0 + 3831 8158 8191 0 + -8158 8191 0 + 3831 -8158 -8191 0 + 8158 -8191 0 + 3832 8159 8192 0 + -8159 8192 0 + 3832 -8159 -8192 0 + 8159 -8192 0 + 3833 8160 8193 0 + -8160 8193 0 + 3833 -8160 -8193 0 + 8160 -8193 0 + 3834 8161 8194 0 + -8161 8194 0 + 3834 -8161 -8194 0 + 8161 -8194 0 + 3835 8162 8195 0 + -8162 8195 0 + 3835 -8162 -8195 0 + 8162 -8195 0 + 3836 8163 8196 0 + -8163 8196 0 + 3836 -8163 -8196 0 + 8163 -8196 0 + 3837 8164 8197 0 + -8164 8197 0 + 3837 -8164 -8197 0 + 8164 -8197 0 + 8165 8198 0 + -3838 -8165 8198 0 + -8165 -8198 0 + -3838 8165 -8198 0 + 8166 8199 0 + -3839 -8166 8199 0 + -8166 -8199 0 + -3839 8166 -8199 0 + 8167 8200 0 + -3840 -8167 8200 0 + -8167 -8200 0 + -3840 8167 -8200 0 + 8168 8201 0 + -3841 -8168 8201 0 + -8168 -8201 0 + -3841 8168 -8201 0 + 8169 8202 0 + -3842 -8169 8202 0 + -8169 -8202 0 + -3842 8169 -8202 0 + 8170 8203 0 + -3843 -8170 8203 0 + -8170 -8203 0 + -3843 8170 -8203 0 + 8171 8204 0 + -3844 -8171 8204 0 + -8171 -8204 0 + -3844 8171 -8204 0 + 8172 8205 0 + -3845 -8172 8205 0 + -8172 -8205 0 + -3845 8172 -8205 0 + 8173 8206 0 + -3846 -8173 8206 0 + -8173 -8206 0 + -3846 8173 -8206 0 + 8174 8207 0 + -3847 -8174 8207 0 + -8174 -8207 0 + -3847 8174 -8207 0 + 8175 8208 0 + -3848 -8175 8208 0 + -8175 -8208 0 + -3848 8175 -8208 0 + 8176 8209 0 + -3849 -8176 8209 0 + -8176 -8209 0 + -3849 8176 -8209 0 + 8177 8210 0 + -3850 -8177 8210 0 + -8177 -8210 0 + -3850 8177 -8210 0 + 8178 8211 0 + -3851 -8178 8211 0 + -8178 -8211 0 + -3851 8178 -8211 0 + 8179 8212 0 + -3852 -8179 8212 0 + -8179 -8212 0 + -3852 8179 -8212 0 + 8180 8213 0 + -3853 -8180 8213 0 + -8180 -8213 0 + -3853 8180 -8213 0 + 8181 8214 0 + -3854 -8181 8214 0 + -8181 -8214 0 + -3854 8181 -8214 0 + 8182 8215 0 + -3855 -8182 8215 0 + -8182 -8215 0 + -3855 8182 -8215 0 + 8183 8216 0 + -3856 -8183 8216 0 + -8183 -8216 0 + -3856 8183 -8216 0 + 8184 8217 0 + -3857 -8184 8217 0 + -8184 -8217 0 + -3857 8184 -8217 0 + 8185 8218 0 + -3858 -8185 8218 0 + -8185 -8218 0 + -3858 8185 -8218 0 + 8186 8219 0 + -3859 -8186 8219 0 + -8186 -8219 0 + -3859 8186 -8219 0 + 8187 8220 0 + -3860 -8187 8220 0 + -8187 -8220 0 + -3860 8187 -8220 0 + 8188 8221 0 + -3861 -8188 8221 0 + -8188 -8221 0 + -3861 8188 -8221 0 + 8189 8222 0 + -3862 -8189 8222 0 + -8189 -8222 0 + -3862 8189 -8222 0 + -8191 8223 0 + 1 -8223 0 + 8191 -8223 0 + -8192 -8223 8224 0 + 8223 -8224 0 + 8192 -8224 0 + -8193 -8224 8225 0 + 8224 -8225 0 + 8193 -8225 0 + -8194 -8225 8226 0 + 8225 -8226 0 + 8194 -8226 0 + -8195 -8226 8227 0 + 8226 -8227 0 + 8195 -8227 0 + -8196 -8227 8228 0 + 8227 -8228 0 + 8196 -8228 0 + -8197 -8228 8229 0 + 8228 -8229 0 + 8197 -8229 0 + -8198 -8229 8230 0 + 8229 -8230 0 + 8198 -8230 0 + -8199 -8230 8231 0 + 8230 -8231 0 + 8199 -8231 0 + -8200 -8231 8232 0 + 8231 -8232 0 + 8200 -8232 0 + -8201 -8232 8233 0 + 8232 -8233 0 + 8201 -8233 0 + -8202 -8233 8234 0 + 8233 -8234 0 + 8202 -8234 0 + -8203 -8234 8235 0 + 8234 -8235 0 + 8203 -8235 0 + -8204 -8235 8236 0 + 8235 -8236 0 + 8204 -8236 0 + -8205 -8236 8237 0 + 8236 -8237 0 + 8205 -8237 0 + -8206 -8237 8238 0 + 8237 -8238 0 + 8206 -8238 0 + -8207 -8238 8239 0 + 8238 -8239 0 + 8207 -8239 0 + -8208 -8239 8240 0 + 8239 -8240 0 + 8208 -8240 0 + -8209 -8240 8241 0 + 8240 -8241 0 + 8209 -8241 0 + -8210 -8241 8242 0 + 8241 -8242 0 + 8210 -8242 0 + -8211 -8242 8243 0 + 8242 -8243 0 + 8211 -8243 0 + -8212 -8243 8244 0 + 8243 -8244 0 + 8212 -8244 0 + -8213 -8244 8245 0 + 8244 -8245 0 + 8213 -8245 0 + -8214 -8245 8246 0 + 8245 -8246 0 + 8214 -8246 0 + -8215 -8246 8247 0 + 8246 -8247 0 + 8215 -8247 0 + -8216 -8247 8248 0 + 8247 -8248 0 + 8216 -8248 0 + -8217 -8248 8249 0 + 8248 -8249 0 + 8217 -8249 0 + -8218 -8249 8250 0 + 8249 -8250 0 + 8218 -8250 0 + -8219 -8250 8251 0 + 8250 -8251 0 + 8219 -8251 0 + -8220 -8251 8252 0 + 8251 -8252 0 + 8220 -8252 0 + -8221 -8252 8253 0 + 8252 -8253 0 + 8221 -8253 0 + -8222 -8253 8254 0 + 8253 -8254 0 + 8222 -8254 0 + -8190 8254 0 + 8190 -8254 0 + -1979 -3469 8287 0 + -1979 3469 -8287 0 + 1979 -3308 8287 0 + 1979 3308 -8287 0 + -1979 -3470 8288 0 + -1979 3470 -8288 0 + 1979 -3309 8288 0 + 1979 3309 -8288 0 + -1979 -3471 8289 0 + -1979 3471 -8289 0 + 1979 -3310 8289 0 + 1979 3310 -8289 0 + -1979 -3472 8290 0 + -1979 3472 -8290 0 + 1979 -3311 8290 0 + 1979 3311 -8290 0 + -1979 -3473 8291 0 + -1979 3473 -8291 0 + 1979 -3312 8291 0 + 1979 3312 -8291 0 + -1979 -3474 8292 0 + -1979 3474 -8292 0 + 1979 -3313 8292 0 + 1979 3313 -8292 0 + -1979 -3475 8293 0 + -1979 3475 -8293 0 + 1979 -3314 8293 0 + 1979 3314 -8293 0 + -1979 -3476 8294 0 + -1979 3476 -8294 0 + 1979 -3315 8294 0 + 1979 3315 -8294 0 + -1979 -3477 8295 0 + -1979 3477 -8295 0 + 1979 -3316 8295 0 + 1979 3316 -8295 0 + -1979 -3478 8296 0 + -1979 3478 -8296 0 + 1979 -3317 8296 0 + 1979 3317 -8296 0 + -1979 -3479 8297 0 + -1979 3479 -8297 0 + 1979 -3318 8297 0 + 1979 3318 -8297 0 + -1979 -3480 8298 0 + -1979 3480 -8298 0 + 1979 -3319 8298 0 + 1979 3319 -8298 0 + -1979 -3481 8299 0 + -1979 3481 -8299 0 + 1979 -3320 8299 0 + 1979 3320 -8299 0 + -1979 -3482 8300 0 + -1979 3482 -8300 0 + 1979 -3321 8300 0 + 1979 3321 -8300 0 + -1979 -3483 8301 0 + -1979 3483 -8301 0 + 1979 -3322 8301 0 + 1979 3322 -8301 0 + -1979 -3484 8302 0 + -1979 3484 -8302 0 + 1979 -3323 8302 0 + 1979 3323 -8302 0 + -1979 -3485 8303 0 + -1979 3485 -8303 0 + 1979 -3324 8303 0 + 1979 3324 -8303 0 + -1979 -3486 8304 0 + -1979 3486 -8304 0 + 1979 -3325 8304 0 + 1979 3325 -8304 0 + -1979 -3487 8305 0 + -1979 3487 -8305 0 + 1979 -3326 8305 0 + 1979 3326 -8305 0 + -1979 -3488 8306 0 + -1979 3488 -8306 0 + 1979 -3327 8306 0 + 1979 3327 -8306 0 + -1979 -3489 8307 0 + -1979 3489 -8307 0 + 1979 -3328 8307 0 + 1979 3328 -8307 0 + -1979 -3490 8308 0 + -1979 3490 -8308 0 + 1979 -3329 8308 0 + 1979 3329 -8308 0 + -1979 -3491 8309 0 + -1979 3491 -8309 0 + 1979 -3330 8309 0 + 1979 3330 -8309 0 + -1979 -3492 8310 0 + -1979 3492 -8310 0 + 1979 -3331 8310 0 + 1979 3331 -8310 0 + -1979 -3493 8311 0 + -1979 3493 -8311 0 + 1979 -3332 8311 0 + 1979 3332 -8311 0 + -1979 -3494 8312 0 + -1979 3494 -8312 0 + 1979 -3333 8312 0 + 1979 3333 -8312 0 + -1979 -3495 8313 0 + -1979 3495 -8313 0 + 1979 -3334 8313 0 + 1979 3334 -8313 0 + -1979 -3496 8314 0 + -1979 3496 -8314 0 + 1979 -3335 8314 0 + 1979 3335 -8314 0 + -1979 -3497 8315 0 + -1979 3497 -8315 0 + 1979 -3336 8315 0 + 1979 3336 -8315 0 + -1979 -3498 8316 0 + -1979 3498 -8316 0 + 1979 -3337 8316 0 + 1979 3337 -8316 0 + -1979 -3499 8317 0 + -1979 3499 -8317 0 + 1979 -3338 8317 0 + 1979 3338 -8317 0 + -1979 -3500 8318 0 + -1979 3500 -8318 0 + 1979 -3339 8318 0 + 1979 3339 -8318 0 + -8287 8319 0 + 35 -8319 0 + 8287 -8319 0 + -36 -8288 8320 0 + 8288 -8320 0 + -37 -8289 8321 0 + 8289 -8321 0 + -38 -8290 8322 0 + 8290 -8322 0 + -39 -8291 8323 0 + 8291 -8323 0 + -40 -8292 8324 0 + 8292 -8324 0 + -41 -8293 8325 0 + 8293 -8325 0 + -42 -8294 8326 0 + 8294 -8326 0 + -43 -8295 8327 0 + 8295 -8327 0 + -44 -8296 8328 0 + 8296 -8328 0 + -45 -8297 8329 0 + 8297 -8329 0 + -46 -8298 8330 0 + 8298 -8330 0 + -47 -8299 8331 0 + 8299 -8331 0 + -48 -8300 8332 0 + 8300 -8332 0 + -49 -8301 8333 0 + 8301 -8333 0 + -50 -8302 8334 0 + 8302 -8334 0 + -51 -8303 8335 0 + 8303 -8335 0 + -52 -8304 8336 0 + 8304 -8336 0 + -53 -8305 8337 0 + 8305 -8337 0 + -54 -8306 8338 0 + 8306 -8338 0 + -55 -8307 8339 0 + 8307 -8339 0 + -56 -8308 8340 0 + 8308 -8340 0 + -57 -8309 8341 0 + 8309 -8341 0 + -58 -8310 8342 0 + 8310 -8342 0 + -59 -8311 8343 0 + 8311 -8343 0 + -60 -8312 8344 0 + 8312 -8344 0 + -61 -8313 8345 0 + 8313 -8345 0 + -62 -8314 8346 0 + 8314 -8346 0 + -63 -8315 8347 0 + 8315 -8347 0 + -64 -8316 8348 0 + 8316 -8348 0 + -65 -8317 8349 0 + 8317 -8349 0 + -66 -8318 8350 0 + 8318 -8350 0 + 8319 8383 0 + 35 -8319 8383 0 + 35 8319 -8383 0 + -8319 -8383 0 + -8319 8385 0 + 35 -8385 0 + 8319 -8385 0 + -2 -8383 8384 0 + 8383 -8384 0 + 8385 -8386 0 + -8384 8386 0 + -8385 8386 0 + 8351 -8383 0 + -2 8351 8383 0 + -8351 8383 0 + -2 -8351 -8383 0 + -36 8387 0 + -8320 8387 0 + -36 -8320 -8387 0 + -36 -8320 8389 0 + -8386 -8387 8388 0 + 8386 -8388 0 + 8352 8386 -8387 0 + 8352 -8386 0 + -8352 8386 0 + -8352 -8386 -8387 0 + -37 8391 0 + -8321 8391 0 + -37 -8321 -8391 0 + -37 -8321 8393 0 + -8390 -8391 8392 0 + 8353 -8391 0 + 8353 -8390 0 + -8353 -8390 -8391 0 + -38 8395 0 + -8322 8395 0 + -38 -8322 -8395 0 + -38 -8322 8397 0 + -8394 -8395 8396 0 + 8354 -8395 0 + 8354 -8394 0 + -8354 -8394 -8395 0 + -39 8399 0 + -8323 8399 0 + -39 -8323 -8399 0 + -39 -8323 8401 0 + -8398 -8399 8400 0 + 8355 -8399 0 + 8355 -8398 0 + -8355 -8398 -8399 0 + -40 8403 0 + -8324 8403 0 + -40 -8324 -8403 0 + -40 -8324 8405 0 + -8402 -8403 8404 0 + 8356 -8403 0 + 8356 -8402 0 + -8356 -8402 -8403 0 + -41 8407 0 + -8325 8407 0 + -41 -8325 -8407 0 + -41 -8325 8409 0 + -8406 -8407 8408 0 + 8357 -8407 0 + 8357 -8406 0 + -8357 -8406 -8407 0 + -42 8411 0 + -8326 8411 0 + -42 -8326 -8411 0 + -42 -8326 8413 0 + -8410 -8411 8412 0 + 8358 -8411 0 + 8358 -8410 0 + -8358 -8410 -8411 0 + -43 8415 0 + -8327 8415 0 + -43 -8327 -8415 0 + -43 -8327 8417 0 + -8414 -8415 8416 0 + 8359 -8415 0 + 8359 -8414 0 + -8359 -8414 -8415 0 + -44 8419 0 + -8328 8419 0 + -44 -8328 -8419 0 + -44 -8328 8421 0 + -8418 -8419 8420 0 + 8360 -8419 0 + 8360 -8418 0 + -8360 -8418 -8419 0 + -45 8423 0 + -8329 8423 0 + -45 -8329 -8423 0 + -45 -8329 8425 0 + -8422 -8423 8424 0 + 8361 -8423 0 + 8361 -8422 0 + -8361 -8422 -8423 0 + -46 8427 0 + -8330 8427 0 + -46 -8330 -8427 0 + -46 -8330 8429 0 + -8426 -8427 8428 0 + 8362 -8427 0 + 8362 -8426 0 + -8362 -8426 -8427 0 + -47 8431 0 + -8331 8431 0 + -47 -8331 -8431 0 + -47 -8331 8433 0 + -8430 -8431 8432 0 + 8363 -8431 0 + 8363 -8430 0 + -8363 -8430 -8431 0 + -48 8435 0 + -8332 8435 0 + -48 -8332 -8435 0 + -48 -8332 8437 0 + -8434 -8435 8436 0 + 8364 -8435 0 + 8364 -8434 0 + -8364 -8434 -8435 0 + -49 8439 0 + -8333 8439 0 + -49 -8333 -8439 0 + -49 -8333 8441 0 + -8438 -8439 8440 0 + 8365 -8439 0 + 8365 -8438 0 + -8365 -8438 -8439 0 + -50 8443 0 + -8334 8443 0 + -50 -8334 -8443 0 + -50 -8334 8445 0 + -8442 -8443 8444 0 + 8366 -8443 0 + 8366 -8442 0 + -8366 -8442 -8443 0 + -51 8447 0 + -8335 8447 0 + -51 -8335 -8447 0 + -51 -8335 8449 0 + -8446 -8447 8448 0 + 8367 -8447 0 + 8367 -8446 0 + -8367 -8446 -8447 0 + -52 8451 0 + -8336 8451 0 + -52 -8336 -8451 0 + -52 -8336 8453 0 + -8450 -8451 8452 0 + 8368 -8451 0 + 8368 -8450 0 + -8368 -8450 -8451 0 + -53 8455 0 + -8337 8455 0 + -53 -8337 -8455 0 + -53 -8337 8457 0 + -8454 -8455 8456 0 + 8369 -8455 0 + 8369 -8454 0 + -8369 -8454 -8455 0 + -54 8459 0 + -8338 8459 0 + -54 -8338 -8459 0 + -54 -8338 8461 0 + -8458 -8459 8460 0 + 8370 -8459 0 + 8370 -8458 0 + -8370 -8458 -8459 0 + -55 8463 0 + -8339 8463 0 + -55 -8339 -8463 0 + -55 -8339 8465 0 + -8462 -8463 8464 0 + 8371 -8463 0 + 8371 -8462 0 + -8371 -8462 -8463 0 + -56 8467 0 + -8340 8467 0 + -56 -8340 -8467 0 + -56 -8340 8469 0 + -8466 -8467 8468 0 + 8372 -8467 0 + 8372 -8466 0 + -8372 -8466 -8467 0 + -57 8471 0 + -8341 8471 0 + -57 -8341 -8471 0 + -57 -8341 8473 0 + -8470 -8471 8472 0 + 8373 -8471 0 + 8373 -8470 0 + -8373 -8470 -8471 0 + -58 8475 0 + -8342 8475 0 + -58 -8342 -8475 0 + -58 -8342 8477 0 + -8474 -8475 8476 0 + 8374 -8475 0 + 8374 -8474 0 + -8374 -8474 -8475 0 + -59 8479 0 + -8343 8479 0 + -59 -8343 -8479 0 + -59 -8343 8481 0 + -8478 -8479 8480 0 + 8375 -8479 0 + 8375 -8478 0 + -8375 -8478 -8479 0 + -60 8483 0 + -8344 8483 0 + -60 -8344 -8483 0 + -60 -8344 8485 0 + -8482 -8483 8484 0 + 8376 -8483 0 + 8376 -8482 0 + -8376 -8482 -8483 0 + -61 8487 0 + -8345 8487 0 + -61 -8345 -8487 0 + -61 -8345 8489 0 + -8486 -8487 8488 0 + 8377 -8487 0 + 8377 -8486 0 + -8377 -8486 -8487 0 + -62 8491 0 + -8346 8491 0 + -62 -8346 -8491 0 + -62 -8346 8493 0 + -8490 -8491 8492 0 + 8378 -8491 0 + 8378 -8490 0 + -8378 -8490 -8491 0 + -63 8495 0 + -8347 8495 0 + -63 -8347 -8495 0 + -63 -8347 8497 0 + -8494 -8495 8496 0 + 8379 -8495 0 + 8379 -8494 0 + -8379 -8494 -8495 0 + -64 8499 0 + -8348 8499 0 + -64 -8348 -8499 0 + -64 -8348 8501 0 + -8498 -8499 8500 0 + 8380 -8499 0 + 8380 -8498 0 + -8380 -8498 -8499 0 + -65 8503 0 + -8349 8503 0 + -65 -8349 -8503 0 + -65 -8349 8505 0 + -8502 -8503 8504 0 + 8381 -8503 0 + 8381 -8502 0 + -8381 -8502 -8503 0 + -66 8507 0 + -8350 8507 0 + -66 -8350 -8507 0 + -66 -8350 8509 0 + -8506 -8507 8508 0 + 8382 -8507 0 + 8382 -8506 0 + -8382 -8506 -8507 0 + 8158 8351 8512 0 + -8158 -8351 8512 0 + 8158 -8351 -8512 0 + -8158 8351 -8512 0 + 8159 8352 8513 0 + -8159 -8352 8513 0 + 8159 -8352 -8513 0 + -8159 8352 -8513 0 + 8160 8514 0 + -8160 -8353 8514 0 + 8160 -8353 -8514 0 + -8160 -8514 0 + 8161 8515 0 + -8161 -8354 8515 0 + 8161 -8354 -8515 0 + -8161 -8515 0 + 8162 8516 0 + -8162 -8355 8516 0 + 8162 -8355 -8516 0 + -8162 -8516 0 + 8163 8517 0 + -8163 -8356 8517 0 + 8163 -8356 -8517 0 + -8163 -8517 0 + 8164 8518 0 + -8164 -8357 8518 0 + 8164 -8357 -8518 0 + -8164 -8518 0 + 8165 8519 0 + -8165 -8358 8519 0 + 8165 -8358 -8519 0 + -8165 -8519 0 + 8166 8520 0 + -8166 -8359 8520 0 + 8166 -8359 -8520 0 + -8166 -8520 0 + 8167 8521 0 + -8167 -8360 8521 0 + 8167 -8360 -8521 0 + -8167 -8521 0 + 8168 8522 0 + -8168 -8361 8522 0 + 8168 -8361 -8522 0 + -8168 -8522 0 + 8169 8523 0 + -8169 -8362 8523 0 + 8169 -8362 -8523 0 + -8169 -8523 0 + 8170 8524 0 + -8170 -8363 8524 0 + 8170 -8363 -8524 0 + -8170 -8524 0 + 8171 8525 0 + -8171 -8364 8525 0 + 8171 -8364 -8525 0 + -8171 -8525 0 + 8172 8526 0 + -8172 -8365 8526 0 + 8172 -8365 -8526 0 + -8172 -8526 0 + 8173 8527 0 + -8173 -8366 8527 0 + 8173 -8366 -8527 0 + -8173 -8527 0 + 8174 8528 0 + -8174 -8367 8528 0 + 8174 -8367 -8528 0 + -8174 -8528 0 + 8175 8529 0 + -8175 -8368 8529 0 + 8175 -8368 -8529 0 + -8175 -8529 0 + 8176 8530 0 + -8176 -8369 8530 0 + 8176 -8369 -8530 0 + -8176 -8530 0 + 8177 8531 0 + -8177 -8370 8531 0 + 8177 -8370 -8531 0 + -8177 -8531 0 + 8178 8532 0 + -8178 -8371 8532 0 + 8178 -8371 -8532 0 + -8178 -8532 0 + 8179 8533 0 + -8179 -8372 8533 0 + 8179 -8372 -8533 0 + -8179 -8533 0 + 8180 8534 0 + -8180 -8373 8534 0 + 8180 -8373 -8534 0 + -8180 -8534 0 + 8181 8535 0 + -8181 -8374 8535 0 + 8181 -8374 -8535 0 + -8181 -8535 0 + 8182 8536 0 + -8182 -8375 8536 0 + 8182 -8375 -8536 0 + -8182 -8536 0 + 8183 8537 0 + -8183 -8376 8537 0 + 8183 -8376 -8537 0 + -8183 -8537 0 + 8184 8538 0 + -8184 -8377 8538 0 + 8184 -8377 -8538 0 + -8184 -8538 0 + 8185 8539 0 + -8185 -8378 8539 0 + 8185 -8378 -8539 0 + -8185 -8539 0 + 8186 8540 0 + -8186 -8379 8540 0 + 8186 -8379 -8540 0 + -8186 -8540 0 + 8187 8541 0 + -8187 -8380 8541 0 + 8187 -8380 -8541 0 + -8187 -8541 0 + 8188 8542 0 + -8188 -8381 8542 0 + 8188 -8381 -8542 0 + -8188 -8542 0 + 8189 8543 0 + -8189 -8382 8543 0 + 8189 -8382 -8543 0 + -8189 -8543 0 + -8512 8544 0 + 1 -8544 0 + 8512 -8544 0 + -8513 -8544 8545 0 + 8544 -8545 0 + 8513 -8545 0 + -8514 -8545 8546 0 + 8545 -8546 0 + 8514 -8546 0 + -8515 -8546 8547 0 + 8546 -8547 0 + 8515 -8547 0 + -8516 -8547 8548 0 + 8547 -8548 0 + 8516 -8548 0 + -8517 -8548 8549 0 + 8548 -8549 0 + 8517 -8549 0 + -8518 -8549 8550 0 + 8549 -8550 0 + 8518 -8550 0 + -8519 -8550 8551 0 + 8550 -8551 0 + 8519 -8551 0 + -8520 -8551 8552 0 + 8551 -8552 0 + 8520 -8552 0 + -8521 -8552 8553 0 + 8552 -8553 0 + 8521 -8553 0 + -8522 -8553 8554 0 + 8553 -8554 0 + 8522 -8554 0 + -8523 -8554 8555 0 + 8554 -8555 0 + 8523 -8555 0 + -8524 -8555 8556 0 + 8555 -8556 0 + 8524 -8556 0 + -8525 -8556 8557 0 + 8556 -8557 0 + 8525 -8557 0 + -8526 -8557 8558 0 + 8557 -8558 0 + 8526 -8558 0 + -8527 -8558 8559 0 + 8558 -8559 0 + 8527 -8559 0 + -8528 -8559 8560 0 + 8559 -8560 0 + 8528 -8560 0 + -8529 -8560 8561 0 + 8560 -8561 0 + 8529 -8561 0 + -8530 -8561 8562 0 + 8561 -8562 0 + 8530 -8562 0 + -8531 -8562 8563 0 + 8562 -8563 0 + 8531 -8563 0 + -8532 -8563 8564 0 + 8563 -8564 0 + 8532 -8564 0 + -8533 -8564 8565 0 + 8564 -8565 0 + 8533 -8565 0 + -8534 -8565 8566 0 + 8565 -8566 0 + 8534 -8566 0 + -8535 -8566 8567 0 + 8566 -8567 0 + 8535 -8567 0 + -8536 -8567 8568 0 + 8567 -8568 0 + 8536 -8568 0 + -8537 -8568 8569 0 + 8568 -8569 0 + 8537 -8569 0 + -8538 -8569 8570 0 + 8569 -8570 0 + 8538 -8570 0 + -8539 -8570 8571 0 + 8570 -8571 0 + 8539 -8571 0 + -8540 -8571 8572 0 + 8571 -8572 0 + 8540 -8572 0 + -8541 -8572 8573 0 + 8572 -8573 0 + 8541 -8573 0 + -8542 -8573 8574 0 + 8573 -8574 0 + 8542 -8574 0 + -8543 -8574 8575 0 + 8574 -8575 0 + 8543 -8575 0 + -8511 8575 0 + 8511 -8575 0 + -1685 -8511 8608 0 + -8511 -8608 0 + 8511 -8576 8608 0 + 8511 -8608 0 + -1686 -8511 8609 0 + -8511 -8609 0 + 8511 8609 0 + 8511 8577 -8609 0 + -1687 -8511 8610 0 + -8511 -8610 0 + 8511 -8578 8610 0 + 8511 -8610 0 + -1688 -8511 8611 0 + -8511 -8611 0 + 8511 -8579 8611 0 + 8511 -8611 0 + -1689 -8511 8612 0 + -8511 -8612 0 + 8511 -8580 8612 0 + 8511 -8612 0 + -1690 -8511 8613 0 + -8511 -8613 0 + 8511 -8581 8613 0 + 8511 -8613 0 + -1691 -8511 8614 0 + -8511 -8614 0 + 8511 -8582 8614 0 + 8511 -8614 0 + -1692 -8511 8615 0 + -8511 -8615 0 + 8511 -8583 8615 0 + 8511 -8615 0 + -1693 -8511 8616 0 + -8511 -8616 0 + 8511 -8584 8616 0 + 8511 -8616 0 + -1694 -8511 8617 0 + -8511 -8617 0 + 8511 -8585 8617 0 + 8511 -8617 0 + -1695 -8511 8618 0 + -8511 -8618 0 + 8511 -8586 8618 0 + 8511 -8618 0 + -1696 -8511 8619 0 + -8511 -8619 0 + 8511 -8587 8619 0 + 8511 -8619 0 + -1697 -8511 8620 0 + -8511 -8620 0 + 8511 -8588 8620 0 + 8511 -8620 0 + -1698 -8511 8621 0 + -8511 -8621 0 + 8511 -8589 8621 0 + 8511 -8621 0 + -1699 -8511 8622 0 + -8511 -8622 0 + 8511 -8590 8622 0 + 8511 -8622 0 + -1700 -8511 8623 0 + -8511 -8623 0 + 8511 -8591 8623 0 + 8511 -8623 0 + -1701 -8511 8624 0 + -8511 -8624 0 + 8511 -8592 8624 0 + 8511 -8624 0 + -1702 -8511 8625 0 + -8511 -8625 0 + 8511 -8593 8625 0 + 8511 -8625 0 + -1703 -8511 8626 0 + -8511 -8626 0 + 8511 -8594 8626 0 + 8511 -8626 0 + -1704 -8511 8627 0 + -8511 -8627 0 + 8511 -8595 8627 0 + 8511 -8627 0 + -1705 -8511 8628 0 + -8511 -8628 0 + 8511 -8596 8628 0 + 8511 -8628 0 + -1706 -8511 8629 0 + -8511 -8629 0 + 8511 -8597 8629 0 + 8511 -8629 0 + -1707 -8511 8630 0 + -8511 -8630 0 + 8511 -8598 8630 0 + 8511 -8630 0 + -1708 -8511 8631 0 + -8511 -8631 0 + 8511 -8599 8631 0 + 8511 -8631 0 + -1709 -8511 8632 0 + -8511 -8632 0 + 8511 -8600 8632 0 + 8511 -8632 0 + -1710 -8511 8633 0 + -8511 -8633 0 + 8511 -8601 8633 0 + 8511 -8633 0 + -1711 -8511 8634 0 + -8511 -8634 0 + 8511 -8602 8634 0 + 8511 -8634 0 + -1712 -8511 8635 0 + -8511 -8635 0 + 8511 -8603 8635 0 + 8511 -8635 0 + -1713 -8511 8636 0 + -8511 -8636 0 + 8511 -8604 8636 0 + 8511 -8636 0 + -1714 -8511 8637 0 + -8511 -8637 0 + 8511 -8605 8637 0 + 8511 -8637 0 + -1715 -8511 8638 0 + -8511 -8638 0 + 8511 -8606 8638 0 + 8511 -8638 0 + -1716 -8511 8639 0 + -8511 -8639 0 + 8511 -8607 8639 0 + 8511 -8639 0 + -8190 -8255 8640 0 + -8190 8255 -8640 0 + 8190 -8608 8640 0 + 8190 8608 -8640 0 + -8190 -8256 8641 0 + -8190 8256 -8641 0 + 8190 -8609 8641 0 + 8190 8609 -8641 0 + -8190 -8257 8642 0 + -8190 8257 -8642 0 + 8190 -8610 8642 0 + 8190 8610 -8642 0 + -8190 -8258 8643 0 + -8190 8258 -8643 0 + 8190 -8611 8643 0 + 8190 8611 -8643 0 + -8190 -8259 8644 0 + -8190 8259 -8644 0 + 8190 -8612 8644 0 + 8190 8612 -8644 0 + -8190 -8260 8645 0 + -8190 8260 -8645 0 + 8190 -8613 8645 0 + 8190 8613 -8645 0 + -8190 -8261 8646 0 + -8190 8261 -8646 0 + 8190 -8614 8646 0 + 8190 8614 -8646 0 + -8190 -8262 8647 0 + -8190 8262 -8647 0 + 8190 -8615 8647 0 + 8190 8615 -8647 0 + -8190 -8263 8648 0 + -8190 8263 -8648 0 + 8190 -8616 8648 0 + 8190 8616 -8648 0 + -8190 -8264 8649 0 + -8190 8264 -8649 0 + 8190 -8617 8649 0 + 8190 8617 -8649 0 + -8190 -8265 8650 0 + -8190 8265 -8650 0 + 8190 -8618 8650 0 + 8190 8618 -8650 0 + -8190 -8266 8651 0 + -8190 8266 -8651 0 + 8190 -8619 8651 0 + 8190 8619 -8651 0 + -8190 -8267 8652 0 + -8190 8267 -8652 0 + 8190 -8620 8652 0 + 8190 8620 -8652 0 + -8190 -8268 8653 0 + -8190 8268 -8653 0 + 8190 -8621 8653 0 + 8190 8621 -8653 0 + -8190 -8269 8654 0 + -8190 8269 -8654 0 + 8190 -8622 8654 0 + 8190 8622 -8654 0 + -8190 -8270 8655 0 + -8190 8270 -8655 0 + 8190 -8623 8655 0 + 8190 8623 -8655 0 + -8190 -8271 8656 0 + -8190 8271 -8656 0 + 8190 -8624 8656 0 + 8190 8624 -8656 0 + -8190 -8272 8657 0 + -8190 8272 -8657 0 + 8190 -8625 8657 0 + 8190 8625 -8657 0 + -8190 -8273 8658 0 + -8190 8273 -8658 0 + 8190 -8626 8658 0 + 8190 8626 -8658 0 + -8190 -8274 8659 0 + -8190 8274 -8659 0 + 8190 -8627 8659 0 + 8190 8627 -8659 0 + -8190 -8275 8660 0 + -8190 8275 -8660 0 + 8190 -8628 8660 0 + 8190 8628 -8660 0 + -8190 -8276 8661 0 + -8190 8276 -8661 0 + 8190 -8629 8661 0 + 8190 8629 -8661 0 + -8190 -8277 8662 0 + -8190 8277 -8662 0 + 8190 -8630 8662 0 + 8190 8630 -8662 0 + -8190 -8278 8663 0 + -8190 8278 -8663 0 + 8190 -8631 8663 0 + 8190 8631 -8663 0 + -8190 -8279 8664 0 + -8190 8279 -8664 0 + 8190 -8632 8664 0 + 8190 8632 -8664 0 + -8190 -8280 8665 0 + -8190 8280 -8665 0 + 8190 -8633 8665 0 + 8190 8633 -8665 0 + -8190 -8281 8666 0 + -8190 8281 -8666 0 + 8190 -8634 8666 0 + 8190 8634 -8666 0 + -8190 -8282 8667 0 + -8190 8282 -8667 0 + 8190 -8635 8667 0 + 8190 8635 -8667 0 + -8190 -8283 8668 0 + -8190 8283 -8668 0 + 8190 -8636 8668 0 + 8190 8636 -8668 0 + -8190 -8284 8669 0 + -8190 8284 -8669 0 + 8190 -8637 8669 0 + 8190 8637 -8669 0 + -8190 -8285 8670 0 + -8190 8285 -8670 0 + 8190 -8638 8670 0 + 8190 8638 -8670 0 + -8190 -8286 8671 0 + -8190 8286 -8671 0 + 8190 -8639 8671 0 + 8190 8639 -8671 0 + 8640 8673 0 + -8576 -8640 8673 0 + -8640 -8673 0 + -8576 8640 -8673 0 + 8577 8641 8674 0 + -8641 8674 0 + 8577 -8641 -8674 0 + 8641 -8674 0 + 8642 8675 0 + -8578 -8642 8675 0 + -8642 -8675 0 + -8578 8642 -8675 0 + 8643 8676 0 + -8579 -8643 8676 0 + -8643 -8676 0 + -8579 8643 -8676 0 + 8644 8677 0 + -8580 -8644 8677 0 + -8644 -8677 0 + -8580 8644 -8677 0 + 8645 8678 0 + -8581 -8645 8678 0 + -8645 -8678 0 + -8581 8645 -8678 0 + 8646 8679 0 + -8582 -8646 8679 0 + -8646 -8679 0 + -8582 8646 -8679 0 + 8647 8680 0 + -8583 -8647 8680 0 + -8647 -8680 0 + -8583 8647 -8680 0 + 8648 8681 0 + -8584 -8648 8681 0 + -8648 -8681 0 + -8584 8648 -8681 0 + 8649 8682 0 + -8585 -8649 8682 0 + -8649 -8682 0 + -8585 8649 -8682 0 + 8650 8683 0 + -8586 -8650 8683 0 + -8650 -8683 0 + -8586 8650 -8683 0 + 8651 8684 0 + -8587 -8651 8684 0 + -8651 -8684 0 + -8587 8651 -8684 0 + 8652 8685 0 + -8588 -8652 8685 0 + -8652 -8685 0 + -8588 8652 -8685 0 + 8653 8686 0 + -8589 -8653 8686 0 + -8653 -8686 0 + -8589 8653 -8686 0 + 8654 8687 0 + -8590 -8654 8687 0 + -8654 -8687 0 + -8590 8654 -8687 0 + 8655 8688 0 + -8591 -8655 8688 0 + -8655 -8688 0 + -8591 8655 -8688 0 + 8656 8689 0 + -8592 -8656 8689 0 + -8656 -8689 0 + -8592 8656 -8689 0 + 8657 8690 0 + -8593 -8657 8690 0 + -8657 -8690 0 + -8593 8657 -8690 0 + 8658 8691 0 + -8594 -8658 8691 0 + -8658 -8691 0 + -8594 8658 -8691 0 + 8659 8692 0 + -8595 -8659 8692 0 + -8659 -8692 0 + -8595 8659 -8692 0 + 8660 8693 0 + -8596 -8660 8693 0 + -8660 -8693 0 + -8596 8660 -8693 0 + 8661 8694 0 + -8597 -8661 8694 0 + -8661 -8694 0 + -8597 8661 -8694 0 + 8662 8695 0 + -8598 -8662 8695 0 + -8662 -8695 0 + -8598 8662 -8695 0 + 8663 8696 0 + -8599 -8663 8696 0 + -8663 -8696 0 + -8599 8663 -8696 0 + 8664 8697 0 + -8600 -8664 8697 0 + -8664 -8697 0 + -8600 8664 -8697 0 + 8665 8698 0 + -8601 -8665 8698 0 + -8665 -8698 0 + -8601 8665 -8698 0 + 8666 8699 0 + -8602 -8666 8699 0 + -8666 -8699 0 + -8602 8666 -8699 0 + 8667 8700 0 + -8603 -8667 8700 0 + -8667 -8700 0 + -8603 8667 -8700 0 + 8668 8701 0 + -8604 -8668 8701 0 + -8668 -8701 0 + -8604 8668 -8701 0 + 8669 8702 0 + -8605 -8669 8702 0 + -8669 -8702 0 + -8605 8669 -8702 0 + 8670 8703 0 + -8606 -8670 8703 0 + -8670 -8703 0 + -8606 8670 -8703 0 + 8671 8704 0 + -8607 -8671 8704 0 + -8671 -8704 0 + -8607 8671 -8704 0 + -8673 8705 0 + 1 -8705 0 + 8673 -8705 0 + -8674 -8705 8706 0 + 8705 -8706 0 + 8674 -8706 0 + -8675 -8706 8707 0 + 8706 -8707 0 + 8675 -8707 0 + -8676 -8707 8708 0 + 8707 -8708 0 + 8676 -8708 0 + -8677 -8708 8709 0 + 8708 -8709 0 + 8677 -8709 0 + -8678 -8709 8710 0 + 8709 -8710 0 + 8678 -8710 0 + -8679 -8710 8711 0 + 8710 -8711 0 + 8679 -8711 0 + -8680 -8711 8712 0 + 8711 -8712 0 + 8680 -8712 0 + -8681 -8712 8713 0 + 8712 -8713 0 + 8681 -8713 0 + -8682 -8713 8714 0 + 8713 -8714 0 + 8682 -8714 0 + -8683 -8714 8715 0 + 8714 -8715 0 + 8683 -8715 0 + -8684 -8715 8716 0 + 8715 -8716 0 + 8684 -8716 0 + -8685 -8716 8717 0 + 8716 -8717 0 + 8685 -8717 0 + -8686 -8717 8718 0 + 8717 -8718 0 + 8686 -8718 0 + -8687 -8718 8719 0 + 8718 -8719 0 + 8687 -8719 0 + -8688 -8719 8720 0 + 8719 -8720 0 + 8688 -8720 0 + -8689 -8720 8721 0 + 8720 -8721 0 + 8689 -8721 0 + -8690 -8721 8722 0 + 8721 -8722 0 + 8690 -8722 0 + -8691 -8722 8723 0 + 8722 -8723 0 + 8691 -8723 0 + -8692 -8723 8724 0 + 8723 -8724 0 + 8692 -8724 0 + -8693 -8724 8725 0 + 8724 -8725 0 + 8693 -8725 0 + -8694 -8725 8726 0 + 8725 -8726 0 + 8694 -8726 0 + -8695 -8726 8727 0 + 8726 -8727 0 + 8695 -8727 0 + -8696 -8727 8728 0 + 8727 -8728 0 + 8696 -8728 0 + -8697 -8728 8729 0 + 8728 -8729 0 + 8697 -8729 0 + -8698 -8729 8730 0 + 8729 -8730 0 + 8698 -8730 0 + -8699 -8730 8731 0 + 8730 -8731 0 + 8699 -8731 0 + -8700 -8731 8732 0 + 8731 -8732 0 + 8700 -8732 0 + -8701 -8732 8733 0 + 8732 -8733 0 + 8701 -8733 0 + -8702 -8733 8734 0 + 8733 -8734 0 + 8702 -8734 0 + -8703 -8734 8735 0 + 8734 -8735 0 + 8703 -8735 0 + -8704 -8735 8736 0 + 8735 -8736 0 + 8704 -8736 0 + -8672 8736 0 + 8672 -8736 0 + 7901 8770 0 + -7901 -8770 0 + 7902 8771 0 + -7902 -8771 0 + 7903 8772 0 + -7903 -8772 0 + 7904 8773 0 + -7904 -8773 0 + 7905 8774 0 + -7905 -8774 0 + 7906 8775 0 + -7906 -8775 0 + 7907 8776 0 + -7907 -8776 0 + 7908 8777 0 + -7908 -8777 0 + 7909 8778 0 + -7909 -8778 0 + 7910 8779 0 + -7910 -8779 0 + 7911 8780 0 + -7911 -8780 0 + 7912 8781 0 + -7912 -8781 0 + 7913 8782 0 + -7913 -8782 0 + 7914 8783 0 + -7914 -8783 0 + 7915 8784 0 + -7915 -8784 0 + 7916 8785 0 + -7916 -8785 0 + 7917 8786 0 + -7917 -8786 0 + 7918 8787 0 + -7918 -8787 0 + 7919 8788 0 + -7919 -8788 0 + 7920 8789 0 + -7920 -8789 0 + 7921 8790 0 + -7921 -8790 0 + 7922 8791 0 + -7922 -8791 0 + 7923 8792 0 + -7923 -8792 0 + 7924 8793 0 + -7924 -8793 0 + 7925 8794 0 + -7925 -8794 0 + 7926 8795 0 + -7926 -8795 0 + 7927 8796 0 + -7927 -8796 0 + 7928 8797 0 + -7928 -8797 0 + 7929 8798 0 + -7929 -8798 0 + 7930 8799 0 + -7930 -8799 0 + 7931 8800 0 + -7931 -8800 0 + 7932 8801 0 + -7932 -8801 0 + -260 8770 8802 0 + 260 -8770 8802 0 + 260 8770 -8802 0 + -260 -8770 -8802 0 + -260 -8770 8804 0 + 260 -8804 0 + 8770 -8804 0 + -8802 8803 0 + 8802 -8803 0 + 1 -8803 0 + 8803 8804 -8805 0 + -8803 8805 0 + -8804 8805 0 + 1 8738 -8802 0 + 8738 8802 0 + 1 -8738 8802 0 + -8738 -8802 0 + -261 8771 8806 0 + 261 -8771 8806 0 + 261 8771 -8806 0 + -261 -8771 -8806 0 + -261 -8771 8808 0 + 261 -8808 0 + 8771 -8808 0 + -8805 -8806 8807 0 + 8806 -8807 0 + 8805 -8807 0 + 8807 8808 -8809 0 + -8807 8809 0 + -8808 8809 0 + 8739 8805 -8806 0 + 8739 -8805 8806 0 + -8739 8805 8806 0 + -8739 -8805 -8806 0 + -262 8772 8810 0 + 262 -8772 8810 0 + 262 8772 -8810 0 + -262 -8772 -8810 0 + -262 -8772 8812 0 + 262 -8812 0 + 8772 -8812 0 + -8809 -8810 8811 0 + 8810 -8811 0 + 8809 -8811 0 + 8811 8812 -8813 0 + -8811 8813 0 + -8812 8813 0 + 8740 8809 -8810 0 + 8740 -8809 8810 0 + -8740 8809 8810 0 + -8740 -8809 -8810 0 + -263 8773 8814 0 + 263 -8773 8814 0 + 263 8773 -8814 0 + -263 -8773 -8814 0 + -263 -8773 8816 0 + 263 -8816 0 + 8773 -8816 0 + -8813 -8814 8815 0 + 8814 -8815 0 + 8813 -8815 0 + 8815 8816 -8817 0 + -8815 8817 0 + -8816 8817 0 + 8741 8813 -8814 0 + 8741 -8813 8814 0 + -8741 8813 8814 0 + -8741 -8813 -8814 0 + -264 8774 8818 0 + 264 -8774 8818 0 + 264 8774 -8818 0 + -264 -8774 -8818 0 + -264 -8774 8820 0 + 264 -8820 0 + 8774 -8820 0 + -8817 -8818 8819 0 + 8818 -8819 0 + 8817 -8819 0 + 8819 8820 -8821 0 + -8819 8821 0 + -8820 8821 0 + 8742 8817 -8818 0 + 8742 -8817 8818 0 + -8742 8817 8818 0 + -8742 -8817 -8818 0 + -265 8775 8822 0 + 265 -8775 8822 0 + 265 8775 -8822 0 + -265 -8775 -8822 0 + -265 -8775 8824 0 + 265 -8824 0 + 8775 -8824 0 + -8821 -8822 8823 0 + 8822 -8823 0 + 8821 -8823 0 + 8823 8824 -8825 0 + -8823 8825 0 + -8824 8825 0 + 8743 8821 -8822 0 + 8743 -8821 8822 0 + -8743 8821 8822 0 + -8743 -8821 -8822 0 + -266 8776 8826 0 + 266 -8776 8826 0 + 266 8776 -8826 0 + -266 -8776 -8826 0 + -266 -8776 8828 0 + 266 -8828 0 + 8776 -8828 0 + -8825 -8826 8827 0 + 8826 -8827 0 + 8825 -8827 0 + 8827 8828 -8829 0 + -8827 8829 0 + -8828 8829 0 + 8744 8825 -8826 0 + 8744 -8825 8826 0 + -8744 8825 8826 0 + -8744 -8825 -8826 0 + -267 8777 8830 0 + 267 -8777 8830 0 + 267 8777 -8830 0 + -267 -8777 -8830 0 + -267 -8777 8832 0 + 267 -8832 0 + 8777 -8832 0 + -8829 -8830 8831 0 + 8830 -8831 0 + 8829 -8831 0 + 8831 8832 -8833 0 + -8831 8833 0 + -8832 8833 0 + 8745 8829 -8830 0 + 8745 -8829 8830 0 + -8745 8829 8830 0 + -8745 -8829 -8830 0 + -268 8778 8834 0 + 268 -8778 8834 0 + 268 8778 -8834 0 + -268 -8778 -8834 0 + -268 -8778 8836 0 + 268 -8836 0 + 8778 -8836 0 + -8833 -8834 8835 0 + 8834 -8835 0 + 8833 -8835 0 + 8835 8836 -8837 0 + -8835 8837 0 + -8836 8837 0 + 8746 8833 -8834 0 + 8746 -8833 8834 0 + -8746 8833 8834 0 + -8746 -8833 -8834 0 + -269 8779 8838 0 + 269 -8779 8838 0 + 269 8779 -8838 0 + -269 -8779 -8838 0 + -269 -8779 8840 0 + 269 -8840 0 + 8779 -8840 0 + -8837 -8838 8839 0 + 8838 -8839 0 + 8837 -8839 0 + 8839 8840 -8841 0 + -8839 8841 0 + -8840 8841 0 + 8747 8837 -8838 0 + 8747 -8837 8838 0 + -8747 8837 8838 0 + -8747 -8837 -8838 0 + -270 8780 8842 0 + 270 -8780 8842 0 + 270 8780 -8842