From rspencer at reidspencer.com Mon Jul 3 04:28:38 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 02:28:38 -0700 Subject: [hlvm-commits] r374 - hlvm/AST hlvm/Pass hlvm/Writer tools/hlvm-config tools/hlvm-gentestcase Message-ID: <200607030928.k639ScIE002714@server1.hlvm.org> Author: reid Date: 2006-07-03 02:28:38 -0700 (Mon, 03 Jul 2006) New Revision: 374 Log: Get some bugs out of the test case generator and fix bugs that it found. Modified: hlvm/AST/Bundle.cpp hlvm/Pass/Validate.cpp hlvm/Writer/XMLWriter.cpp tools/hlvm-config/hlvm-config.cpp tools/hlvm-gentestcase/Generate.cpp Modified: hlvm/AST/Bundle.cpp =================================================================== --- hlvm/AST/Bundle.cpp 2006-07-02 21:58:42 UTC (rev 373) +++ hlvm/AST/Bundle.cpp 2006-07-03 09:28:38 UTC (rev 374) @@ -60,11 +60,11 @@ void Bundle::removeChild(Node* kid) { - hlvmAssert(isa(kid) && "Can't remove that here"); - // This is sucky slow, but we probably won't be removing nodes that much. + hlvmAssert(kid && "Null child!"); if (isa(kid)) types.erase(cast(kid)->getName()); else if (isa(kid)) { + // This is sucky slow, but we probably won't be removing nodes that much. for (value_iterator I = value_begin(), E = value_end(); I != E; ++I ) if (*I == kid) { values.erase(I); break; } if (isa(kid)) Modified: hlvm/Pass/Validate.cpp =================================================================== --- hlvm/Pass/Validate.cpp 2006-07-02 21:58:42 UTC (rev 373) +++ hlvm/Pass/Validate.cpp 2006-07-03 09:28:38 UTC (rev 374) @@ -453,12 +453,36 @@ } template<> inline void +ValidateImpl::validate(ConstantAny* n) +{ + checkConstant(n,ConstantAnyID); +} + +template<> inline void ValidateImpl::validate(ConstantBoolean* n) { checkConstant(n,ConstantBooleanID); } template<> inline void +ValidateImpl::validate(ConstantCharacter* n) +{ + checkConstant(n,ConstantCharacterID); +} + +template<> inline void +ValidateImpl::validate(ConstantEnumerator* n) +{ + checkConstant(n,ConstantEnumeratorID); +} + +template<> inline void +ValidateImpl::validate(ConstantOctet* n) +{ + checkConstant(n,ConstantOctetID); +} + +template<> inline void ValidateImpl::validate(ConstantInteger* CI) { if (checkConstant(CI,ConstantIntegerID)) { @@ -909,11 +933,11 @@ } if (blk == 0) error(op,"Referent does not match name in scope"); - } else if (const Argument* ref = dyn_cast(referent)) { + } else if (const Argument* arg = dyn_cast(referent)) { Function* F = op->getContainingFunction(); if (!F) error(op,"ReferenceOp not in a function?"); - else if (F->getArgument(ref->getName()) != ref) + else if (F->getArgument(arg->getName()) != arg) error(op,"Referent does not match function argument"); } else if (const ConstantValue* cval = dyn_cast(referent)) { Bundle* B = op->getContainingBundle(); @@ -921,11 +945,11 @@ error(op,"ReferenceOp not in a bundle?"); else if (B->find_cval(cval->getName()) != cval) error(op,"Referent does not match constant value"); - } else if (const Linkable* var = dyn_cast(referent)) { + } else if (const Linkable* lnkbl = dyn_cast(referent)) { Bundle* B = op->getContainingBundle(); if (!B) error(op,"ReferenceOp not in a bundle?"); - else if (B->find_cval(cval->getName()) != cval) + else if (B->find_linkable(lnkbl->getName()) != lnkbl) error(op,"Referent does not match linkable by name"); } else { error(op,"Referent of unknown kind"); @@ -1563,7 +1587,11 @@ case PInfOpID: /*validate(cast(n)); */ break; case NInfOpID: /*validate(cast(n)); */ break; case NaNOpID: /*validate(cast(n)); */ break; + case ConstantAnyID: validate(cast(n)); break; case ConstantBooleanID: validate(cast(n)); break; + case ConstantCharacterID: validate(cast(n)); break; + case ConstantEnumeratorID: validate(cast(n)); break; + case ConstantOctetID: validate(cast(n)); break; case ConstantIntegerID: validate(cast(n)); break; case ConstantRealID: validate(cast(n)); break; case ConstantStringID: validate(cast(n)); break; Modified: hlvm/Writer/XMLWriter.cpp =================================================================== --- hlvm/Writer/XMLWriter.cpp 2006-07-02 21:58:42 UTC (rev 373) +++ hlvm/Writer/XMLWriter.cpp 2006-07-03 09:28:38 UTC (rev 374) @@ -365,6 +365,15 @@ } } + +template<> void +XMLWriterImpl::WriterPass::put(ConstantAny* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + template<> void XMLWriterImpl::WriterPass::put(ConstantBoolean* i) { @@ -378,6 +387,30 @@ endElement(); } +template<> void +XMLWriterImpl::WriterPass::put(ConstantCharacter* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantEnumerator* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantOctet* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + template<> void XMLWriterImpl::WriterPass::put(ConstantInteger* i) { @@ -417,6 +450,46 @@ } template<> void +XMLWriterImpl::WriterPass::put(ConstantPointer* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantArray* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantVector* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantStructure* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void +XMLWriterImpl::WriterPass::put(ConstantContinuation* i) +{ + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); +} + +template<> void XMLWriterImpl::WriterPass::put(Variable* v) { startElement("variable"); @@ -424,7 +497,7 @@ writeAttribute("type",v->getType()->getName()); if (v->hasInitializer()) { Constant* C = llvm::cast(v->getInitializer()); - writeAttribute("id",C->getName()); + writeAttribute("init",C->getName()); } putDoc(v); } @@ -795,74 +868,83 @@ if (mode & Pass::PreOrderTraversal) { switch (n->getID()) { - case AnyTypeID: put(cast(n)); break; - case StringTypeID: put(cast(n)); break; - case BooleanTypeID: put(cast(n)); break; - case BundleID: put(cast(n)); break; - case CharacterTypeID: put(cast(n)); break; - case IntegerTypeID: put(cast(n)); break; - case RangeTypeID: put(cast(n)); break; - case EnumerationTypeID: put(cast(n)); break; - case RealTypeID: put(cast(n)); break; - case OctetTypeID: put(cast(n)); break; - case OpaqueTypeID: put(cast(n)); break; - case PointerTypeID: put(cast(n)); break; - case ArrayTypeID: put(cast(n)); break; - case VectorTypeID: put(cast(n)); break; - case StructureTypeID: put(cast(n)); break; - case SignatureTypeID: put(cast(n)); break; - case ConstantBooleanID: put(cast(n)); break; - case ConstantIntegerID: put(cast(n)); break; - case ConstantRealID: put(cast(n)); break; - case ConstantStringID: put(cast(n)); break; - case VariableID: put(cast(n)); break; - case FunctionID: put(cast(n)); break; - case ProgramID: put(cast(n)); break; - case BlockID: put(cast(n)); break; - case AutoVarOpID: put(cast(n)); break; - case NegateOpID: put(cast(n)); break; - case ComplementOpID: put(cast(n)); break; - case PreIncrOpID: put(cast(n)); break; - case PreDecrOpID: put(cast(n)); break; - case PostIncrOpID: put(cast(n)); break; - case PostDecrOpID: put(cast(n)); break; - case AddOpID: put(cast(n)); break; - case SubtractOpID: put(cast(n)); break; - case MultiplyOpID: put(cast(n)); break; - case DivideOpID: put(cast(n)); break; - case ModuloOpID: put(cast(n)); break; - case BAndOpID: put(cast(n)); break; - case BOrOpID: put(cast(n)); break; - case BXorOpID: put(cast(n)); break; - case BNorOpID: put(cast(n)); break; - case NotOpID: put(cast(n)); break; - case AndOpID: put(cast(n)); break; - case OrOpID: put(cast(n)); break; - case XorOpID: put(cast(n)); break; - case NorOpID: put(cast(n)); break; - case EqualityOpID: put(cast(n)); break; - case InequalityOpID: put(cast(n)); break; - case LessThanOpID: put(cast(n)); break; - case GreaterThanOpID: put(cast(n)); break; - case LessEqualOpID: put(cast(n)); break; - case GreaterEqualOpID: put(cast(n)); break; - case SelectOpID: put(cast(n)); break; - case SwitchOpID: put(cast(n)); break; - case WhileOpID: put(cast(n)); break; - case UnlessOpID: put(cast(n)); break; - case UntilOpID: put(cast(n)); break; - case LoopOpID: put(cast(n)); break; - case BreakOpID: put(cast(n)); break; - case ContinueOpID: put(cast(n)); break; - case ReturnOpID: put(cast(n)); break; - case ResultOpID: put(cast(n)); break; - case CallOpID: put(cast(n)); break; - case StoreOpID: put(cast(n)); break; - case LoadOpID: put(cast(n)); break; - case ReferenceOpID: put(cast(n)); break; - case OpenOpID: put(cast(n)); break; - case CloseOpID: put(cast(n)); break; - case WriteOpID: put(cast(n)); break; + case AnyTypeID: put(cast(n)); break; + case StringTypeID: put(cast(n)); break; + case BooleanTypeID: put(cast(n)); break; + case BundleID: put(cast(n)); break; + case CharacterTypeID: put(cast(n)); break; + case IntegerTypeID: put(cast(n)); break; + case RangeTypeID: put(cast(n)); break; + case EnumerationTypeID: put(cast(n)); break; + case RealTypeID: put(cast(n)); break; + case OctetTypeID: put(cast(n)); break; + case OpaqueTypeID: put(cast(n)); break; + case PointerTypeID: put(cast(n)); break; + case ArrayTypeID: put(cast(n)); break; + case VectorTypeID: put(cast(n)); break; + case StructureTypeID: put(cast(n)); break; + case SignatureTypeID: put(cast(n)); break; + case ConstantAnyID: put(cast(n)); break; + case ConstantBooleanID: put(cast(n)); break; + case ConstantCharacterID: put(cast(n)); break; + case ConstantEnumeratorID: put(cast(n)); break; + case ConstantOctetID: put(cast(n)); break; + case ConstantIntegerID: put(cast(n)); break; + case ConstantRealID: put(cast(n)); break; + case ConstantStringID: put(cast(n)); break; + case ConstantPointerID: put(cast(n)); break; + case ConstantArrayID: put(cast(n)); break; + case ConstantVectorID: put(cast(n)); break; + case ConstantStructureID: put(cast(n)); break; + case ConstantContinuationID: put(cast(n)); break; + case VariableID: put(cast(n)); break; + case FunctionID: put(cast(n)); break; + case ProgramID: put(cast(n)); break; + case BlockID: put(cast(n)); break; + case AutoVarOpID: put(cast(n)); break; + case NegateOpID: put(cast(n)); break; + case ComplementOpID: put(cast(n)); break; + case PreIncrOpID: put(cast(n)); break; + case PreDecrOpID: put(cast(n)); break; + case PostIncrOpID: put(cast(n)); break; + case PostDecrOpID: put(cast(n)); break; + case AddOpID: put(cast(n)); break; + case SubtractOpID: put(cast(n)); break; + case MultiplyOpID: put(cast(n)); break; + case DivideOpID: put(cast(n)); break; + case ModuloOpID: put(cast(n)); break; + case BAndOpID: put(cast(n)); break; + case BOrOpID: put(cast(n)); break; + case BXorOpID: put(cast(n)); break; + case BNorOpID: put(cast(n)); break; + case NotOpID: put(cast(n)); break; + case AndOpID: put(cast(n)); break; + case OrOpID: put(cast(n)); break; + case XorOpID: put(cast(n)); break; + case NorOpID: put(cast(n)); break; + case EqualityOpID: put(cast(n)); break; + case InequalityOpID: put(cast(n)); break; + case LessThanOpID: put(cast(n)); break; + case GreaterThanOpID: put(cast(n)); break; + case LessEqualOpID: put(cast(n)); break; + case GreaterEqualOpID: put(cast(n)); break; + case SelectOpID: put(cast(n)); break; + case SwitchOpID: put(cast(n)); break; + case WhileOpID: put(cast(n)); break; + case UnlessOpID: put(cast(n)); break; + case UntilOpID: put(cast(n)); break; + case LoopOpID: put(cast(n)); break; + case BreakOpID: put(cast(n)); break; + case ContinueOpID: put(cast(n)); break; + case ReturnOpID: put(cast(n)); break; + case ResultOpID: put(cast(n)); break; + case CallOpID: put(cast(n)); break; + case StoreOpID: put(cast(n)); break; + case LoadOpID: put(cast(n)); break; + case ReferenceOpID: put(cast(n)); break; + case OpenOpID: put(cast(n)); break; + case CloseOpID: put(cast(n)); break; + case WriteOpID: put(cast(n)); break; default: hlvmDeadCode("Unknown Type"); break; Modified: tools/hlvm-config/hlvm-config.cpp =================================================================== --- tools/hlvm-config/hlvm-config.cpp 2006-07-02 21:58:42 UTC (rev 373) +++ tools/hlvm-config/hlvm-config.cpp 2006-07-03 09:28:38 UTC (rev 374) @@ -43,7 +43,7 @@ "NoType", "TreeTop", "Documentation", - "Documentable", + "NamedType", "Bundle", "Import", "BooleanType", @@ -72,7 +72,6 @@ "RealType", "RationalType", "OpaqueType", - "AliasType", "PointerType", "ArrayType", "VectorType", Modified: tools/hlvm-gentestcase/Generate.cpp =================================================================== --- tools/hlvm-gentestcase/Generate.cpp 2006-07-02 21:58:42 UTC (rev 373) +++ tools/hlvm-gentestcase/Generate.cpp 2006-07-03 09:28:38 UTC (rev 374) @@ -88,10 +88,12 @@ } hlvm::Type* -genType() +genTypeLimited(unsigned limit) { Type* result = 0; NodeIDs id = NodeIDs(randRange(FirstTypeID,LastTypeID)); + if (--limit == 0) + id = BooleanTypeID; switch (id) { case BooleanTypeID: case CharacterTypeID: @@ -111,6 +113,8 @@ case Float64TypeID: case Float80TypeID: case Float128TypeID: + return ast->getPrimitiveType(id); + case AnyTypeID: case StringTypeID: case BufferTypeID: @@ -126,7 +130,7 @@ Locator* loc = getLocator(); std::string name = "int_" + utostr(line); result = ast->new_IntegerType( - name,randRange(1,64,true),randRange(0,1,true),loc); + name,randRange(1,64,true),bool(randRange(0,1,true)),loc); break; } case RangeTypeID: @@ -158,21 +162,23 @@ { Locator* loc = getLocator(); std::string name = "ptr_" + utostr(line); - result = ast->new_PointerType(name,genType(),loc); + result = ast->new_PointerType(name,genTypeLimited(limit),loc); break; } case ArrayTypeID: { Locator* loc = getLocator(); std::string name = "array_" + utostr(line); - result = ast->new_ArrayType(name,genType(),randRange(1,Complexity),loc); + result = ast->new_ArrayType(name, + genTypeLimited(limit),randRange(1,Complexity),loc); break; } case VectorTypeID: { Locator* loc = getLocator(); std::string name = "vector_" + utostr(line); - result = ast->new_VectorType(name,genType(),randRange(1,Complexity),loc); + result = ast->new_VectorType( + name,genTypeLimited(limit),randRange(1,Complexity),loc); break; } case OpaqueTypeID: @@ -184,7 +190,8 @@ std::string name = "struct_" + utostr(line); StructureType* S = ast->new_StructureType(name,loc); for (unsigned i = 0; i < Complexity; ++i) { - Field* fld = ast->new_Field(name+"_"+utostr(i),genType(),getLocator()); + Field* fld = ast->new_Field(name+"_"+utostr(i), + genTypeLimited(limit),getLocator()); S->addField(fld); } result = S; @@ -198,6 +205,12 @@ return result; } +hlvm::Type* +genType() +{ + return genTypeLimited(Complexity); +} + hlvm::Value* genValue(const hlvm::Type* Ty, bool is_constant = false) { @@ -344,7 +357,9 @@ std::string name = "cint_" + utostr(line); const IntegerType* IntTy = llvm::cast(Ty); int64_t max = 1 << (IntTy->getBits() < 63 ? IntTy->getBits() : 63); - int64_t val = randRange(int64_t(-max),int64_t(max-1)); + int64_t val = IntTy->isSigned() ? + randRange(int64_t(-max),int64_t(max-1)) : + randRange(int64_t(0),int64_t(max)); std::string val_str( itostr(val) ); C = ast->new_ConstantInteger(name,val_str,10,Ty,loc); break; @@ -441,6 +456,7 @@ result = var; } + result->setParent(bundle); // Memoize the result values[result->getType()].push_back(result); return result; @@ -459,7 +475,10 @@ Value* V = genValue((*I)->getType()); hlvmAssert(isa(V) || isa(V)) ; Operator* O = ast->new_ReferenceOp(V,getLocator()); - args.push_back(O); + if (isa(V)) + args.push_back(O); + else + args.push_back(ast->new_UnaryOp(O,getLocator())); } return ast->new_MultiOp(args,getLocator()); } @@ -502,7 +521,10 @@ B->setParent(F); // Get the function result and return instruction - Operator* O = ast->new_ReferenceOp(genValue(F->getResultType()),getLocator()); + Value* V = genValue(F->getResultType()); + Operator* O = ast->new_ReferenceOp(V,getLocator()); + if (isa(V)) + O = ast->new_UnaryOp(O,getLocator()); ResultOp* rslt = ast->new_UnaryOp(O,getLocator()); rslt->setParent(B); From rspencer at reidspencer.com Mon Jul 3 04:29:55 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 02:29:55 -0700 Subject: [hlvm-commits] r375 - test/xml2xml Message-ID: <200607030929.k639Ttmp002731@server1.hlvm.org> Author: reid Date: 2006-07-03 02:29:55 -0700 (Mon, 03 Jul 2006) New Revision: 375 Log: Alias is no more. Removed: test/xml2xml/alias.hlx Modified: test/xml2xml/doc.hlx Deleted: test/xml2xml/alias.hlx =================================================================== --- test/xml2xml/alias.hlx 2006-07-03 09:28:38 UTC (rev 374) +++ test/xml2xml/alias.hlx 2006-07-03 09:29:55 UTC (rev 375) @@ -1,9 +0,0 @@ - - - - - - - - - Modified: test/xml2xml/doc.hlx =================================================================== --- test/xml2xml/doc.hlx 2006-07-03 09:28:38 UTC (rev 374) +++ test/xml2xml/doc.hlx 2006-07-03 09:29:55 UTC (rev 375) @@ -84,9 +84,6 @@ Vector doc - -

Alias Doc

-

Array Doc

From rspencer at reidspencer.com Mon Jul 3 13:30:48 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 11:30:48 -0700 Subject: [hlvm-commits] r376 - hlvm/AST hlvm/Pass tools/hlvm-gentestcase Message-ID: <200607031830.k63IUmlu004827@server1.hlvm.org> Author: reid Date: 2006-07-03 11:30:48 -0700 (Mon, 03 Jul 2006) New Revision: 376 Log: Fix the test case generator to produce better code. Fix validation errors identified by test case generator. Modified: hlvm/AST/AST.cpp hlvm/AST/Type.h hlvm/Pass/Validate.cpp tools/hlvm-gentestcase/Generate.cpp Modified: hlvm/AST/AST.cpp =================================================================== --- hlvm/AST/AST.cpp 2006-07-03 09:29:55 UTC (rev 375) +++ hlvm/AST/AST.cpp 2006-07-03 18:30:48 UTC (rev 376) @@ -700,7 +700,6 @@ E = vals.end(); I != E; ++I ) { hlvmAssert(STI != ST->end()); - hlvmAssert((*I)->getType() == (*STI)->getType()); result->addConstant(*I); ++STI; } Modified: hlvm/AST/Type.h =================================================================== --- hlvm/AST/Type.h 2006-07-03 09:29:55 UTC (rev 375) +++ hlvm/AST/Type.h 2006-07-03 18:30:48 UTC (rev 376) @@ -274,7 +274,7 @@ /// @brief Methods to support type inquiry via isa, cast, dyn_cast static inline bool classof(const IntegerType*) { return true; } - static inline bool classof(const Node* T) { return T->isIntegralType(); } + static inline bool classof(const Node* T) { return T->isIntegerType(); } /// @} /// @name Mutators Modified: hlvm/Pass/Validate.cpp =================================================================== --- hlvm/Pass/Validate.cpp 2006-07-03 09:29:55 UTC (rev 375) +++ hlvm/Pass/Validate.cpp 2006-07-03 18:30:48 UTC (rev 376) @@ -486,27 +486,35 @@ ValidateImpl::validate(ConstantInteger* CI) { if (checkConstant(CI,ConstantIntegerID)) { - const IntegerType* Ty = cast(CI->getType()); - // Check that it can be converted to binary const char* startp = CI->getValue().c_str(); char* endp = 0; int64_t val = strtoll(startp,&endp,CI->getBase()); + // Check that it can be converted to binary if (!endp || startp == endp || *endp != '\0') error(CI,"Invalid integer constant. Conversion failed."); - else if (val < 0 && !Ty->isSigned()) { - error(CI,"Invalid integer constant. " - "Signed value not accepted by unsigned type"); + else if (llvm::itostr(val) != CI->getValue()) + error(CI,"Invalid integer constant, not losslessly convertible"); + else if (const IntegerType* Ty = dyn_cast(CI->getType())) { + if (val < 0 && !Ty->isSigned()) { + error(CI,"Invalid integer constant. " + "Signed value not accepted by unsigned type"); + } else { + // It converted to binary okay, check that it is in range + uint64_t uval = (val < 0) ? -val : val; + unsigned leading_zeros = llvm::CountLeadingZeros_64(uval); + unsigned bits_required = (sizeof(uint64_t)*8 - leading_zeros) + + unsigned(Ty->isSigned()); + unsigned bits_allowed = Ty->getBits(); + if (bits_required > bits_allowed) + error(CI, "Invalid integer constant. Value requires " + + utostr(bits_required) + " bits, but type only holds " + + utostr(bits_allowed) + " bits."); + } + } else if (const RangeType* Ty = dyn_cast(CI->getType())) { + if (val < Ty->getMin() || val > Ty->getMax()) + error(CI, "Integer constant out of range of RangeType"); } else { - // It converted to binary okay, check that it is in range - uint64_t uval = (val < 0) ? -val : val; - unsigned leading_zeros = llvm::CountLeadingZeros_64(uval); - unsigned bits_required = (sizeof(uint64_t)*8 - leading_zeros) + - unsigned(Ty->isSigned()); - unsigned bits_allowed = Ty->getBits(); - if (bits_required > bits_allowed) - error(CI, "Invalid integer constant. Value requires " + - utostr(bits_required) + " bits, but type only holds " + - utostr(bits_allowed) + " bits."); + error(CI,"Unknown integer constant type"); } } } @@ -539,26 +547,23 @@ error(CR,"Invalid floating point type"); return; } - bool isValid = false; if (numBits <= sizeof(float)*8) { float x = val; long double x2 = x; - isValid = (val <= FLT_MAX && val >= FLT_MIN && val == x2); + if (val != x2) + error(CR,"Real constant out of range for real requiring " + + utostr(numBits) + " bits"); } else if (numBits <= sizeof(double)*8) { double x = val; long double x2 = x; - isValid = (val <= DBL_MAX && val >= DBL_MIN && val == x2); + if (val != x2) + error(CR,"Real constant out of range for real requiring " + + utostr(numBits) + " bits"); } else if (numBits > sizeof(long double)*8) - { warning(CR,"Don't know how to check range of real type > 128 bits"); - isValid = true; - } - if (!isValid) - error(CR,"Real constant out of range for real requiring " + - utostr(numBits) + " bits"); } } } Modified: tools/hlvm-gentestcase/Generate.cpp =================================================================== --- tools/hlvm-gentestcase/Generate.cpp 2006-07-03 09:29:55 UTC (rev 375) +++ tools/hlvm-gentestcase/Generate.cpp 2006-07-03 18:30:48 UTC (rev 376) @@ -78,13 +78,23 @@ inline int64_t randRange(int64_t low, int64_t high) { - return int64_t(random()) % (high-low) + low; + if (high > low) + return int64_t(random()) % (high-low) + low; + else if (low > high) + return int64_t(random()) % (low-high) + high; + else + return 1; } inline uint64_t randRange(uint64_t low, uint64_t high, bool discriminate) { - return uint64_t(random()) % (high-low) + low; + if (high > low) + return uint64_t(random()) % (high-low) + low; + else if (low > high) + return uint64_t(random()) % (low-high) + high; + else + return 1; } hlvm::Type* @@ -112,8 +122,9 @@ case Float44TypeID: case Float64TypeID: case Float80TypeID: + return ast->getPrimitiveType(id); case Float128TypeID: - return ast->getPrimitiveType(id); + return ast->getPrimitiveType(Float64TypeID); case AnyTypeID: case StringTypeID: @@ -160,9 +171,7 @@ } case PointerTypeID: { - Locator* loc = getLocator(); - std::string name = "ptr_" + utostr(line); - result = ast->new_PointerType(name,genTypeLimited(limit),loc); + result = ast->getPointerTo(genTypeLimited(limit)); break; } case ArrayTypeID: @@ -284,7 +293,7 @@ case SInt8TypeID: { int8_t val = int8_t(randRange(-128,127)); - std::string val_str(utostr(val)); + std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs8_")+utostr(line),val_str,10,Ty,loc); break; @@ -292,7 +301,7 @@ case SInt16TypeID: { int16_t val = int16_t(randRange(-32768,32767)); - std::string val_str(utostr(val)); + std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs16_")+utostr(line),val_str,10,Ty,loc); break; @@ -300,7 +309,7 @@ case SInt32TypeID: { int32_t val = int32_t(randRange(-2000000000,2000000000)); - std::string val_str(utostr(val)); + std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs32_")+utostr(line),val_str,10,Ty,loc); break; @@ -310,7 +319,7 @@ case SInt64TypeID: { int64_t val = int64_t(randRange(-2000000000,2000000000)); - std::string val_str(utostr(val)); + std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs64_")+utostr(line),val_str,10,Ty,loc); break; @@ -321,7 +330,7 @@ case Float80TypeID: case Float128TypeID: { - double val = double(randRange(-2000000000,2000000000)); + double val = double(randRange(-10000000,10000000)); std::string val_str(ftostr(val)); C = ast->new_ConstantReal( std::string("cf32_")+utostr(line),val_str,Ty,loc); @@ -386,7 +395,7 @@ } case RealTypeID: { - double val = double(randRange(-2000000000,2000000000)); + double val = double(randRange(-10000000,10000000)); std::string val_str(ftostr(val)); C = ast->new_ConstantReal( std::string("cf32_")+utostr(line),val_str,Ty,loc); @@ -562,5 +571,15 @@ call->setParent(blk); } + // Get the function result and return instruction + Value* V = genValue(program->getResultType()); + Operator* O = ast->new_ReferenceOp(V,getLocator()); + if (isa(V)) + O = ast->new_UnaryOp(O,getLocator()); + ResultOp* rslt = ast->new_UnaryOp(O,getLocator()); + rslt->setParent(blk); + + ReturnOp* ret = ast->new_NilaryOp(getLocator()); + ret->setParent(blk); return ast; } From rspencer at reidspencer.com Mon Jul 3 23:34:30 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 21:34:30 -0700 Subject: [hlvm-commits] r377 - hlvm/AST hlvm/Pass hlvm/Reader hlvm/Writer test/xml2xml tools/hlvm-gentestcase Message-ID: <200607040434.k644YU0n007095@server1.hlvm.org> Author: reid Date: 2006-07-03 21:34:30 -0700 (Mon, 03 Jul 2006) New Revision: 377 Log: Some work on literal constants: 1. Forget about "atom", just use "intrinsic" directly (schema change) 2. Implement the remaining constant literals for structs, arrays, etc. 3. Fix some bugs in the test case generator that make it almost always produce code that passes validation (not quite perfect yet, but close). Modified: hlvm/AST/AST.cpp hlvm/AST/AST.h hlvm/AST/Bundle.h hlvm/AST/Constants.h hlvm/AST/Node.h hlvm/Pass/Validate.cpp hlvm/Reader/HLVM.rng hlvm/Reader/XMLReader.cpp hlvm/Writer/XMLWriter.cpp test/xml2xml/array.hlx test/xml2xml/doc.hlx test/xml2xml/intrinsics.hlx test/xml2xml/pointer.hlx test/xml2xml/resolve.hlx test/xml2xml/signature.hlx test/xml2xml/structure.hlx tools/hlvm-gentestcase/Generate.cpp tools/hlvm-gentestcase/hlvm-gentestcase.cpp Modified: hlvm/AST/AST.cpp =================================================================== --- hlvm/AST/AST.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/AST/AST.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -630,7 +630,7 @@ ConstantPointer* AST::new_ConstantPointer( const std::string& name, - ConstantValue* referent, + Constant* referent, const Locator* loc ) { @@ -645,7 +645,7 @@ AST::new_ConstantArray( const std::string& name, const std::vector& vals, - const ArrayType* VT, + const ArrayType* AT, const Locator* loc ) { @@ -655,10 +655,9 @@ for (std::vector::const_iterator I = vals.begin(), E = vals.end(); I != E; ++I ) { - hlvmAssert((*I)->getType() == VT->getElementType()); result->addConstant(*I); } - result->setType(VT); + result->setType(AT); return result; } @@ -676,7 +675,6 @@ for (std::vector::const_iterator I = vals.begin(), E = vals.end(); I != E; ++I ) { - hlvmAssert((*I)->getType() == AT->getElementType()); result->addConstant(*I); } result->setType(AT); @@ -707,6 +705,30 @@ return result; } +ConstantContinuation* +AST::new_ConstantContinuation( + const std::string& name, + const std::vector& vals, + const ContinuationType* ST, + const Locator* loc +) +{ + ConstantContinuation* result = new ConstantContinuation(); + result->setLocator(loc); + result->setName(name); + hlvmAssert(ST->size() == vals.size()); + ContinuationType::const_iterator STI = ST->begin(); + for (std::vector::const_iterator I = vals.begin(), + E = vals.end(); I != E; ++I ) + { + hlvmAssert(STI != ST->end()); + result->addConstant(*I); + ++STI; + } + result->setType(ST); + return result; +} + Variable* AST::new_Variable(const std::string& id, const Type* Ty, const Locator* loc) { Modified: hlvm/AST/AST.h =================================================================== --- hlvm/AST/AST.h 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/AST/AST.h 2006-07-04 04:34:30 UTC (rev 377) @@ -483,7 +483,7 @@ /// Create a new ConstantPointer node. ConstantPointer* new_ConstantPointer( const std::string& name, ///< The name of the constant - ConstantValue* referent, ///< The value pointed to + Constant* referent, ///< The value pointed to const Locator* loc = 0 ///< The source locator ); /// Create a new ConstantArray node. Modified: hlvm/AST/Bundle.h =================================================================== --- hlvm/AST/Bundle.h 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/AST/Bundle.h 2006-07-04 04:34:30 UTC (rev 377) @@ -144,6 +144,7 @@ protected: std::string name; ///< The name for this bundle TypeList types; ///< The list of types + TypeList unresolvedTypes; ///< The list of forward referenced types ValueList values; ///< The list of values in insertion order CValList cvals; ///< The list of constant values LinkableList linkables; ///< The list of linkables Modified: hlvm/AST/Constants.h =================================================================== --- hlvm/AST/Constants.h 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/AST/Constants.h 2006-07-04 04:34:30 UTC (rev 377) @@ -370,7 +370,7 @@ /// @name Constructors /// @{ protected: - ConstantPointer(const ConstantValue* cv) + ConstantPointer(const Constant* cv) : ConstantValue(ConstantPointerID) { value = cv; } virtual ~ConstantPointer(); @@ -378,7 +378,7 @@ /// @name Accessors /// @{ public: - const ConstantValue* getValue() const { return value; } + const Constant* getValue() const { return value; } static inline bool classof(const ConstantPointer*) { return true; } static inline bool classof(const Node* N) { return N->is(ConstantPointerID); } @@ -387,7 +387,7 @@ /// @name Data /// @{ public: - const ConstantValue* value; + const Constant* value; /// @} friend class AST; }; Modified: hlvm/AST/Node.h =================================================================== --- hlvm/AST/Node.h 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/AST/Node.h 2006-07-04 04:34:30 UTC (rev 377) @@ -527,7 +527,8 @@ /// @{ public: /// Get the name of the node - inline Documentation* getDoc() { return doc; } + inline Documentation* getDoc() const { + return const_cast(doc); } static inline bool classof(const Documentable*) { return true; } static inline bool classof(const Node* N) { return N->isDocumentable(); } Modified: hlvm/Pass/Validate.cpp =================================================================== --- hlvm/Pass/Validate.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/Pass/Validate.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -492,8 +492,6 @@ // Check that it can be converted to binary if (!endp || startp == endp || *endp != '\0') error(CI,"Invalid integer constant. Conversion failed."); - else if (llvm::itostr(val) != CI->getValue()) - error(CI,"Invalid integer constant, not losslessly convertible"); else if (const IntegerType* Ty = dyn_cast(CI->getType())) { if (val < 0 && !Ty->isSigned()) { error(CI,"Invalid integer constant. " Modified: hlvm/Reader/HLVM.rng =================================================================== --- hlvm/Reader/HLVM.rng 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/Reader/HLVM.rng 2006-07-04 04:34:30 UTC (rev 377) @@ -233,19 +233,22 @@ - - + + + + + + + + + - + + - - - - - @@ -265,66 +268,59 @@ - - - - - - - - - - - - - - - + + + + + + - + + + + + + - - + + - - - - - - - + + + + @@ -450,6 +446,7 @@ + @@ -478,6 +475,11 @@ + + + + + @@ -539,7 +541,9 @@ - + + + Modified: hlvm/Reader/XMLReader.cpp =================================================================== --- hlvm/Reader/XMLReader.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/Reader/XMLReader.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -114,12 +114,13 @@ inline xmlNodePtr checkDoc(xmlNodePtr cur, Documentable* node); - Constant* parseLiteralConstant(xmlNodePtr& cur, const std::string& name, + ConstantValue* parseLiteralConstant(xmlNodePtr& cur, const std::string& name, const Type* Ty); Constant* parseConstant (xmlNodePtr& cur); Operator* parseOperator (xmlNodePtr& cur); void parseTree (); - Type* parseAtom (xmlNodePtr& cur); + Type* parseIntrinsic (xmlNodePtr& cur); + Type* parseInteger (xmlNodePtr& cur, bool isSigned); template OpClass* parse(xmlNodePtr& cur); @@ -388,7 +389,7 @@ return Ty; } -Constant* +ConstantValue* XMLReaderImpl::parseLiteralConstant( xmlNodePtr& cur, const std::string& name, @@ -403,7 +404,7 @@ // skip over blank text to find next element skipBlanks(cur); - Constant* C = 0; + ConstantValue* C = 0; const char* prefix = 0; std::string actualName(name); int token = getToken(cur->name); @@ -432,6 +433,17 @@ C = ast->new_ConstantBoolean(name, value, getLocator(cur)); break; } + case TKN_char: + { + hlvmAssert(Ty->is(CharacterTypeID)); + std::string buffer; + xmlNodePtr child = cur->children; + getTextContent(child,buffer); + std::string name= actualName.empty() ? + std::string("char_") + buffer : actualName; + C = ast->new_ConstantCharacter(name, buffer, getLocator(cur)); + break; + } case TKN_bin: case TKN_oct: case TKN_dec: @@ -472,6 +484,80 @@ C = ast->new_ConstantString(name,value,getLocator(cur)); break; } + case TKN_ptr: + { + std::string id = getAttribute(cur,"id"); + std::string name = actualName.empty() ? std::string("ptr_") + id : + actualName; + Constant* referent = bundle->find_cval(id); + // Didn't find a constant? Try a linkable + if (!referent) + referent = bundle->find_linkable(id); + C = ast->new_ConstantPointer(name,referent,loc); + break; + } + case TKN_arr: + { + const ArrayType* AT = llvm::cast(Ty); + const Type* ElemType = AT->getElementType(); + xmlNodePtr child = cur->children; + std::vector elems; + while (child && skipBlanks(child) && child->type == XML_ELEMENT_NODE) { + ConstantValue* elem = parseLiteralConstant(child,"",ElemType); + elems.push_back(elem); + child = child->next; + } + std::string name = actualName.empty() ? std::string("arr") : actualName; + C = ast->new_ConstantArray(name,elems,AT,getLocator(cur)); + break; + } + case TKN_vect: + { + const VectorType* VT = llvm::cast(Ty); + const Type* ElemType = VT->getElementType(); + xmlNodePtr child = cur->children; + std::vector elems; + while (child && skipBlanks(child) && child->type == XML_ELEMENT_NODE) { + ConstantValue* elem = parseLiteralConstant(child,"",ElemType); + elems.push_back(elem); + child = child->next; + } + std::string name = actualName.empty() ? std::string("vec") : actualName; + C = ast->new_ConstantVector(name,elems,VT,getLocator(cur)); + break; + } + case TKN_struct: + { + const StructureType* ST = llvm::cast(Ty); + xmlNodePtr child = cur->children; + std::vector fields; + StructureType::const_iterator I = ST->begin(); + while (child && skipBlanks(child) && child->type == XML_ELEMENT_NODE) { + ConstantValue* field = parseLiteralConstant(child,"",(*I)->getType()); + fields.push_back(field); + child = child->next; + ++I; + } + std::string name = actualName.empty() ? std::string("struct") :actualName; + C = ast->new_ConstantStructure(name,fields,ST,getLocator(cur)); + break; + } + case TKN_cont: + { + const ContinuationType* CT = llvm::cast(Ty); + xmlNodePtr child = cur->children; + std::vector fields; + ContinuationType::const_iterator I = CT->begin(); + while (child && skipBlanks(child) && child->type == XML_ELEMENT_NODE) { + ConstantValue* field = parseLiteralConstant(child,"",(*I)->getType()); + fields.push_back(field); + child = child->next; + ++I; + } + std::string name = actualName.empty() ? std::string("struct") :actualName; + C = ast->new_ConstantContinuation(name,fields,CT,getLocator(cur)); + break; + } default: hlvmAssert(!"Invalid kind of constant"); break; @@ -529,6 +615,84 @@ return child; } +Type* +XMLReaderImpl::parseIntrinsic(xmlNodePtr& cur) +{ + Locator* loc = getLocator(cur); + std::string name = getAttribute(cur,"id"); + const char* is = getAttribute(cur,"is"); + xmlNodePtr child = cur->children; + Documentation* theDoc = parse(child); + Type* result = create_builtin_type(ast,is,name,loc); + if (result) { + if (theDoc) + result->setDoc(theDoc); + } else + error(loc,"Invalid intrinsic kind"); + return result; +} + +Type* +XMLReaderImpl::parseInteger(xmlNodePtr& cur, bool isSigned) +{ + Locator* loc = getLocator(cur); + std::string name = getAttribute(cur,"id"); + const char* bits = getAttribute(cur,"bits"); + xmlNodePtr child = cur->children; + Documentation* theDoc = parse(child); + if (bits) { + uint64_t numBits = recognize_nonNegativeInteger(bits); + IntegerType* result = ast->new_IntegerType(name,numBits,isSigned,loc); + if (theDoc) + result->setDoc(theDoc); + return result; + } + error(loc,"Invalid integer specificaiton"); + return 0; +} + +template<> RangeType* +XMLReaderImpl::parse(xmlNodePtr& cur) +{ + Locator* loc = getLocator(cur); + std::string name = getAttribute(cur,"id"); + const char* min = getAttribute(cur, "min"); + const char* max = getAttribute(cur, "max"); + xmlNodePtr child = cur->children; + Documentation* theDoc = parse(child); + if (min && max) { + int64_t minVal = recognize_Integer(min); + int64_t maxVal = recognize_Integer(max); + RangeType* result = ast->new_RangeType(name,minVal,maxVal,loc); + if (theDoc) + result->setDoc(theDoc); + return result; + } + error(loc,"Invalid min/max specification"); + return 0; +} + +template<> RealType* +XMLReaderImpl::parse(xmlNodePtr& cur) +{ + Locator* loc = getLocator(cur); + std::string name = getAttribute(cur,"id"); + const char* mantissa = getAttribute(cur, "mantissa"); + const char* exponent = getAttribute(cur, "exponent"); + xmlNodePtr child = cur->children; + Documentation* theDoc = parse(child); + if (mantissa && exponent) { + int32_t mantVal = recognize_nonNegativeInteger(mantissa); + int32_t expoVal = recognize_nonNegativeInteger(exponent); + RealType* result = ast->new_RealType(name,mantVal,expoVal,loc); + if (theDoc) + result->setDoc(theDoc); + return result; + } + error(loc,"Invalid mantissa/exponent specification"); + return 0; +} + template<> EnumerationType* XMLReaderImpl::parse(xmlNodePtr& cur) { @@ -944,19 +1108,22 @@ break; } case TKN_import : { n = parse(child); break; } - case TKN_bundle : { n = parse(child); break; } - case TKN_atom : { n = parseAtom(child); break; } + case TKN_array : { n = parse(child); break; } + case TKN_constant : { n = parseConstant(child); break; } case TKN_enumeration : { n = parse(child); break; } + case TKN_function : { n = parse(child); break; } + case TKN_intrinsic : { n = parseIntrinsic(child); break; } + case TKN_opaque : { n = parse(child); break; } case TKN_pointer : { n = parse(child); break; } - case TKN_array : { n = parse(child); break; } - case TKN_vector : { n = parse(child); break; } + case TKN_program : { n = parse(child); break; } + case TKN_range : { n = parse(child); break; } + case TKN_real : { n = parse(child); break; } + case TKN_signature : { n = parse(child); break; } + case TKN_signed : { n = parseInteger(child,true); break; } case TKN_structure : { n = parse(child); break; } - case TKN_signature : { n = parse(child); break; } - case TKN_opaque : { n = parse(child); break; } - case TKN_constant : { n = parseConstant(child); break; } + case TKN_unsigned : { n = parseInteger(child,false); break; } case TKN_variable : { n = parse(child); break; } - case TKN_program : { n = parse(child); break; } - case TKN_function : { n = parse(child); break; } + case TKN_vector : { n = parse(child); break; } default: { hlvmDeadCode("Invalid content for bundle"); @@ -970,76 +1137,6 @@ return bundle; } -Type* -XMLReaderImpl::parseAtom(xmlNodePtr& cur) -{ - hlvmAssert(getToken(cur->name)==TKN_atom); - Locator* loc = getLocator(cur); - std::string name = getAttribute(cur,"id"); - xmlNodePtr child = cur->children; - Documentation* theDoc = parse(child); - child = (theDoc==0 ? child : child->next ); - Type* result = 0; - if (child && skipBlanks(child) && child->type == XML_ELEMENT_NODE) { - int tkn = getToken(child->name); - switch (tkn) { - case TKN_intrinsic: { - const char* is = getAttribute(child,"is"); - result = create_builtin_type(ast,is,name,loc); - if (!result) - error(loc,"Invalid intrinsic kind"); - break; - } - case TKN_signed: { - const char* bits = getAttribute(child,"bits"); - if (bits) { - uint64_t numBits = recognize_nonNegativeInteger(bits); - result = ast->new_IntegerType(name,numBits,/*signed=*/true,loc); - } - break; - } - case TKN_unsigned: { - const char* bits = getAttribute(child,"bits"); - if (bits) { - uint64_t numBits = recognize_nonNegativeInteger(bits); - result = ast->new_IntegerType(name,numBits,/*signed=*/false,loc); - } - break; - } - case TKN_range: { - const char* min = getAttribute(child, "min"); - const char* max = getAttribute(child, "max"); - if (min && max) { - int64_t minVal = recognize_Integer(min); - int64_t maxVal = recognize_Integer(max); - result = ast->new_RangeType(name,minVal,maxVal,loc); - } - break; - } - case TKN_real: { - const char* mantissa = getAttribute(child, "mantissa"); - const char* exponent = getAttribute(child, "exponent"); - if (mantissa && exponent) { - int32_t mantVal = recognize_nonNegativeInteger(mantissa); - int32_t expoVal = recognize_nonNegativeInteger(exponent); - result = ast->new_RealType(name,mantVal,expoVal,loc); - } - break; - } - default: - error(loc, "Invalid content for atom"); - break; - } - if (result) { - if (theDoc) - result->setDoc(theDoc); - return result; - } - } - error(loc,"Atom definition element expected"); - return 0; -} - Operator* XMLReaderImpl::parseOperator(xmlNodePtr& cur) { Modified: hlvm/Writer/XMLWriter.cpp =================================================================== --- hlvm/Writer/XMLWriter.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ hlvm/Writer/XMLWriter.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -98,11 +98,16 @@ inline void putHeader(); inline void putFooter(); - inline void putDoc(Documentable* node); + inline void putDoc(const Documentable* node); + void putConstantValue(const ConstantValue* CV,bool nested); + template - inline void put(NodeClass* nc); + inline void put(const NodeClass* nc); + template + inline void put(const NodeClass* nc, bool nested); + virtual void handle(Node* n,Pass::TraversalKinds mode); private: @@ -156,7 +161,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(Documentation* b) +XMLWriterImpl::WriterPass::put(const Documentation* b) { startElement("doc"); const std::string& data = b->getDoc(); @@ -166,7 +171,7 @@ } inline void -XMLWriterImpl::WriterPass::putDoc(Documentable* node) +XMLWriterImpl::WriterPass::putDoc(const Documentable* node) { Documentation* theDoc = node->getDoc(); if (theDoc) { @@ -175,81 +180,72 @@ } template<> void -XMLWriterImpl::WriterPass::put(AnyType* t) +XMLWriterImpl::WriterPass::put(const AnyType* t) { - startElement("atom"); + startElement("intrinsic"); writeAttribute("id",t->getName()); + writeAttribute("is","any"); putDoc(t); - startElement("intrinsic"); - writeAttribute("is","any"); - endElement(); } template<> void -XMLWriterImpl::WriterPass::put(StringType* t) +XMLWriterImpl::WriterPass::put(const StringType* t) { - startElement("atom"); + startElement("intrinsic"); writeAttribute("id",t->getName()); + writeAttribute("is","string"); putDoc(t); - startElement("intrinsic"); - writeAttribute("is","string"); - endElement(); } template<>void -XMLWriterImpl::WriterPass::put(BooleanType* t) +XMLWriterImpl::WriterPass::put(const BooleanType* t) { - startElement("atom"); + startElement("intrinsic"); writeAttribute("id",t->getName()); + writeAttribute("is","bool"); putDoc(t); - startElement("intrinsic"); - writeAttribute("is","bool"); - endElement(); } template<> void -XMLWriterImpl::WriterPass::put(CharacterType* t) +XMLWriterImpl::WriterPass::put(const CharacterType* t) { - startElement("atom"); + startElement("intrinsic"); writeAttribute("id",t->getName()); + writeAttribute("is","char"); putDoc(t); - startElement("intrinsic"); - writeAttribute("is","char"); - endElement(); } template<> void -XMLWriterImpl::WriterPass::put(IntegerType* t) +XMLWriterImpl::WriterPass::put(const IntegerType* t) { - startElement("atom"); - writeAttribute("id",t->getName()); - putDoc(t); const char* primName = t->getPrimitiveName(); if (primName) { startElement("intrinsic"); + writeAttribute("id",t->getName()); writeAttribute("is",primName); } else if (t->isSigned()) { startElement("signed"); + writeAttribute("id",t->getName()); writeAttribute("bits", llvm::utostr(t->getBits())); } else { startElement("unsigned"); + writeAttribute("id",t->getName()); writeAttribute("bits", llvm::utostr(t->getBits())); } - endElement(); + putDoc(t); } template<> void -XMLWriterImpl::WriterPass::put(RangeType* t) +XMLWriterImpl::WriterPass::put(const RangeType* t) { startElement("range"); writeAttribute("id",t->getName()); writeAttribute("min",t->getMin()); writeAttribute("max",t->getMax()); - putDoc(t); } template<> void -XMLWriterImpl::WriterPass::put(EnumerationType* t) +XMLWriterImpl::WriterPass::put(const EnumerationType* t) { startElement("enumeration"); writeAttribute("id",t->getName()); @@ -264,37 +260,33 @@ } template<> void -XMLWriterImpl::WriterPass::put(RealType* t) +XMLWriterImpl::WriterPass::put(const RealType* t) { - startElement("atom"); - writeAttribute("id",t->getName()); - putDoc(t); const char* primName = t->getPrimitiveName(); if (primName) { startElement("intrinsic"); + writeAttribute("id",t->getName()); writeAttribute("is",primName); - endElement(); } else { startElement("real"); + writeAttribute("id",t->getName()); writeAttribute("mantissa", llvm::utostr(t->getMantissa())); writeAttribute("exponent", llvm::utostr(t->getExponent())); - endElement(); } + putDoc(t); } template<> void -XMLWriterImpl::WriterPass::put(OctetType* t) +XMLWriterImpl::WriterPass::put(const OctetType* t) { - startElement("atom"); + startElement("intrinsic"); writeAttribute("id",t->getName()); + writeAttribute("is","octet"); putDoc(t); - startElement("intrinsic"); - writeAttribute("is","octet"); - endElement(); } template<> void -XMLWriterImpl::WriterPass::put(OpaqueType* op) +XMLWriterImpl::WriterPass::put(const OpaqueType* op) { startElement("opaque"); writeAttribute("id",op->getName()); @@ -302,7 +294,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(PointerType* t) +XMLWriterImpl::WriterPass::put(const PointerType* t) { startElement("pointer"); writeAttribute("id", t->getName()); @@ -311,7 +303,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(ArrayType* t) +XMLWriterImpl::WriterPass::put(const ArrayType* t) { startElement("array"); writeAttribute("id", t->getName()); @@ -321,7 +313,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(VectorType* t) +XMLWriterImpl::WriterPass::put(const VectorType* t) { startElement("vector"); writeAttribute("id", t->getName()); @@ -331,12 +323,13 @@ } template<> void -XMLWriterImpl::WriterPass::put(StructureType* t) +XMLWriterImpl::WriterPass::put(const StructureType* t) { startElement("structure"); writeAttribute("id",t->getName()); putDoc(t); - for (StructureType::iterator I = t->begin(), E = t->end(); I != E; ++I) { + for (StructureType::const_iterator I = t->begin(), E = t->end(); + I != E; ++I) { startElement("field"); Field* field = cast(*I); writeAttribute("id",field->getName()); @@ -347,7 +340,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(SignatureType* t) +XMLWriterImpl::WriterPass::put(const SignatureType* t) { startElement("signature"); writeAttribute("id",t->getName()); @@ -355,7 +348,8 @@ if (t->isVarArgs()) writeAttribute("varargs","true"); putDoc(t); - for (SignatureType::iterator I = t->begin(), E = t->end(); I != E; ++I) { + for (SignatureType::const_iterator I = t->begin(), E = t->end(); I != E; ++I) + { startElement("arg"); Parameter* param = cast(*I); writeAttribute("id",param->getName()); @@ -365,9 +359,8 @@ } } - template<> void -XMLWriterImpl::WriterPass::put(ConstantAny* i) +XMLWriterImpl::WriterPass::put(const ConstantAny* i, bool nested) { startElement("constant"); writeAttribute("id",i->getName()); @@ -375,11 +368,13 @@ } template<> void -XMLWriterImpl::WriterPass::put(ConstantBoolean* i) +XMLWriterImpl::WriterPass::put(const ConstantBoolean* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } if (i->getValue()) startElement("true"); else @@ -388,35 +383,53 @@ } template<> void -XMLWriterImpl::WriterPass::put(ConstantCharacter* i) +XMLWriterImpl::WriterPass::put(const ConstantCharacter* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("char"); + writeString(i->getValue()); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantEnumerator* i) +XMLWriterImpl::WriterPass::put(const ConstantEnumerator* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("enum"); + writeString(i->getValue()); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantOctet* i) +XMLWriterImpl::WriterPass::put(const ConstantOctet* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("octet"); + unsigned char val = i->getValue(); + writeString(llvm::utostr(val)); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantInteger* i) +XMLWriterImpl::WriterPass::put(const ConstantInteger* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } switch (i->getBase()) { case 2: startElement("bin"); break; case 8: startElement("oct"); break; @@ -428,69 +441,126 @@ } template<> void -XMLWriterImpl::WriterPass::put(ConstantReal* r) +XMLWriterImpl::WriterPass::put(const ConstantReal* r, bool nested) { - startElement("constant"); - writeAttribute("id",r->getName()); - writeAttribute("type",r->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",r->getName()); + writeAttribute("type",r->getType()->getName()); + } startElement("dbl"); writeString(r->getValue()); endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantString* t) +XMLWriterImpl::WriterPass::put(const ConstantString* t, bool nested) { - startElement("constant"); - writeAttribute("id",t->getName()); - writeAttribute("type",t->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",t->getName()); + writeAttribute("type",t->getType()->getName()); + } startElement("string"); writeString(t->getValue()); endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantPointer* i) +XMLWriterImpl::WriterPass::put(const ConstantPointer* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("ptr"); + writeAttribute("to",i->getValue()->getName()); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantArray* i) +XMLWriterImpl::WriterPass::put(const ConstantArray* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("arr"); + for (ConstantArray::const_iterator I = i->begin(), E = i->end(); I != E; ++I) + putConstantValue(*I,true); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantVector* i) +XMLWriterImpl::WriterPass::put(const ConstantVector* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("vect"); + for (ConstantArray::const_iterator I = i->begin(), E = i->end(); I != E; ++I) + putConstantValue(*I,true); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantStructure* i) +XMLWriterImpl::WriterPass::put(const ConstantStructure* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("struct"); + for (ConstantStructure::const_iterator I = i->begin(), E = i->end(); + I != E; ++I) + putConstantValue(*I,true); + endElement(); } template<> void -XMLWriterImpl::WriterPass::put(ConstantContinuation* i) +XMLWriterImpl::WriterPass::put(const ConstantContinuation* i, bool nested) { - startElement("constant"); - writeAttribute("id",i->getName()); - writeAttribute("type",i->getType()->getName()); + if (!nested) { + startElement("constant"); + writeAttribute("id",i->getName()); + writeAttribute("type",i->getType()->getName()); + } + startElement("cont"); + for (ConstantContinuation::const_iterator I = i->begin(), E = i->end(); + I != E; ++I) + putConstantValue(*I,true); + endElement(); } +inline void +XMLWriterImpl::WriterPass::putConstantValue(const ConstantValue* V, bool nstd) +{ + switch (V->getID()) { + case ConstantAnyID: put(cast(V),nstd); break; + case ConstantBooleanID: put(cast(V),nstd); break; + case ConstantCharacterID: put(cast(V),nstd); break; + case ConstantEnumeratorID: put(cast(V),nstd); break; + case ConstantOctetID: put(cast(V),nstd); break; + case ConstantIntegerID: put(cast(V),nstd); break; + case ConstantRealID: put(cast(V),nstd); break; + case ConstantStringID: put(cast(V),nstd); break; + case ConstantPointerID: put(cast(V),nstd); break; + case ConstantArrayID: put(cast(V),nstd); break; + case ConstantVectorID: put(cast(V),nstd); break; + case ConstantStructureID: put(cast(V),nstd); break; + case ConstantContinuationID: put(cast(V),nstd); break; + default: + hlvmAssert(!"Invalid ConstantValue kind"); + } +} + template<> void -XMLWriterImpl::WriterPass::put(Variable* v) +XMLWriterImpl::WriterPass::put(const Variable* v) { startElement("variable"); writeAttribute("id",v->getName()); @@ -503,7 +573,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(Function* f) +XMLWriterImpl::WriterPass::put(const Function* f) { startElement("function"); writeAttribute("id",f->getName()); @@ -513,7 +583,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(Program* p) +XMLWriterImpl::WriterPass::put(const Program* p) { startElement("program"); writeAttribute("id",p->getName()); @@ -521,7 +591,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(Block* b) +XMLWriterImpl::WriterPass::put(const Block* b) { startElement("block"); if (!b->getLabel().empty()) @@ -530,7 +600,7 @@ } template<> void -XMLWriterImpl::WriterPass::put(AutoVarOp* av) +XMLWriterImpl::WriterPass::put(const AutoVarOp* av) { startElement("autovar"); writeAttribute("id",av->getName()); @@ -543,280 +613,280 @@ } template<> void -XMLWriterImpl::WriterPass::put(NegateOp* op) +XMLWriterImpl::WriterPass::put(const NegateOp* op) { startElement("neg"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(ComplementOp* op) +XMLWriterImpl::WriterPass::put(const ComplementOp* op) { startElement("cmpl"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(PreIncrOp* op) +XMLWriterImpl::WriterPass::put(const PreIncrOp* op) { startElement("preinc"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(PreDecrOp* op) +XMLWriterImpl::WriterPass::put(const PreDecrOp* op) { startElement("predec"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(PostIncrOp* op) +XMLWriterImpl::WriterPass::put(const PostIncrOp* op) { startElement("postinc"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(PostDecrOp* op) +XMLWriterImpl::WriterPass::put(const PostDecrOp* op) { startElement("postdec"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(AddOp* op) +XMLWriterImpl::WriterPass::put(const AddOp* op) { startElement("add"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(SubtractOp* op) +XMLWriterImpl::WriterPass::put(const SubtractOp* op) { startElement("sub"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(MultiplyOp* op) +XMLWriterImpl::WriterPass::put(const MultiplyOp* op) { startElement("mul"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(DivideOp* op) +XMLWriterImpl::WriterPass::put(const DivideOp* op) { startElement("div"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(ModuloOp* op) +XMLWriterImpl::WriterPass::put(const ModuloOp* op) { startElement("mod"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(BAndOp* op) +XMLWriterImpl::WriterPass::put(const BAndOp* op) { startElement("band"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(BOrOp* op) +XMLWriterImpl::WriterPass::put(const BOrOp* op) { startElement("bor"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(BXorOp* op) +XMLWriterImpl::WriterPass::put(const BXorOp* op) { startElement("bxor"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(BNorOp* op) +XMLWriterImpl::WriterPass::put(const BNorOp* op) { startElement("bnor"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(NotOp* op) +XMLWriterImpl::WriterPass::put(const NotOp* op) { startElement("not"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(AndOp* op) +XMLWriterImpl::WriterPass::put(const AndOp* op) { startElement("and"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(OrOp* op) +XMLWriterImpl::WriterPass::put(const OrOp* op) { startElement("or"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(XorOp* op) +XMLWriterImpl::WriterPass::put(const XorOp* op) { startElement("xor"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(NorOp* op) +XMLWriterImpl::WriterPass::put(const NorOp* op) { startElement("nor"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(EqualityOp* op) +XMLWriterImpl::WriterPass::put(const EqualityOp* op) { startElement("eq"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(InequalityOp* op) +XMLWriterImpl::WriterPass::put(const InequalityOp* op) { startElement("ne"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(LessThanOp* op) +XMLWriterImpl::WriterPass::put(const LessThanOp* op) { startElement("lt"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(GreaterThanOp* op) +XMLWriterImpl::WriterPass::put(const GreaterThanOp* op) { startElement("gt"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(LessEqualOp* op) +XMLWriterImpl::WriterPass::put(const LessEqualOp* op) { startElement("le"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(GreaterEqualOp* op) +XMLWriterImpl::WriterPass::put(const GreaterEqualOp* op) { startElement("ge"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(SelectOp* op) +XMLWriterImpl::WriterPass::put(const SelectOp* op) { startElement("select"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(SwitchOp* op) +XMLWriterImpl::WriterPass::put(const SwitchOp* op) { startElement("switch"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(WhileOp* op) +XMLWriterImpl::WriterPass::put(const WhileOp* op) { startElement("while"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(UnlessOp* op) +XMLWriterImpl::WriterPass::put(const UnlessOp* op) { startElement("unless"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(UntilOp* op) +XMLWriterImpl::WriterPass::put(const UntilOp* op) { startElement("until"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(LoopOp* op) +XMLWriterImpl::WriterPass::put(const LoopOp* op) { startElement("loop"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(BreakOp* op) +XMLWriterImpl::WriterPass::put(const BreakOp* op) { startElement("break"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(ContinueOp* op) +XMLWriterImpl::WriterPass::put(const ContinueOp* op) { startElement("continue"); putDoc(op); } template<> void -XMLWriterImpl::WriterPass::put(ReturnOp* r) +XMLWriterImpl::WriterPass::put(const ReturnOp* r) { startElement("ret"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(ResultOp* r) +XMLWriterImpl::WriterPass::put(const ResultOp* r) { startElement("result"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(CallOp* r) +XMLWriterImpl::WriterPass::put(const CallOp* r) { startElement("call"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(StoreOp* r) +XMLWriterImpl::WriterPass::put(const StoreOp* r) { startElement("store"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(LoadOp* r) +XMLWriterImpl::WriterPass::put(const LoadOp* r) { startElement("load"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(ReferenceOp* r) +XMLWriterImpl::WriterPass::put(const ReferenceOp* r) { startElement("ref"); const Value* ref = r->getReferent(); @@ -834,28 +904,28 @@ } template<> void -XMLWriterImpl::WriterPass::put(OpenOp* r) +XMLWriterImpl::WriterPass::put(const OpenOp* r) { startElement("open"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(WriteOp* r) +XMLWriterImpl::WriterPass::put(const WriteOp* r) { startElement("write"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(CloseOp* r) +XMLWriterImpl::WriterPass::put(const CloseOp* r) { startElement("close"); putDoc(r); } template<> void -XMLWriterImpl::WriterPass::put(Bundle* b) +XMLWriterImpl::WriterPass::put(const Bundle* b) { startElement("bundle"); writeAttribute("id",b->getName()); @@ -884,19 +954,20 @@ case VectorTypeID: put(cast(n)); break; case StructureTypeID: put(cast(n)); break; case SignatureTypeID: put(cast(n)); break; - case ConstantAnyID: put(cast(n)); break; - case ConstantBooleanID: put(cast(n)); break; - case ConstantCharacterID: put(cast(n)); break; - case ConstantEnumeratorID: put(cast(n)); break; - case ConstantOctetID: put(cast(n)); break; - case ConstantIntegerID: put(cast(n)); break; - case ConstantRealID: put(cast(n)); break; - case ConstantStringID: put(cast(n)); break; - case ConstantPointerID: put(cast(n)); break; - case ConstantArrayID: put(cast(n)); break; - case ConstantVectorID: put(cast(n)); break; - case ConstantStructureID: put(cast(n)); break; - case ConstantContinuationID: put(cast(n)); break; + case ConstantAnyID: + case ConstantBooleanID: + case ConstantCharacterID: + case ConstantEnumeratorID: + case ConstantOctetID: + case ConstantIntegerID: + case ConstantRealID: + case ConstantStringID: + case ConstantPointerID: + case ConstantArrayID: + case ConstantVectorID: + case ConstantStructureID: + case ConstantContinuationID: + putConstantValue(cast(n),false); break; case VariableID: put(cast(n)); break; case FunctionID: put(cast(n)); break; case ProgramID: put(cast(n)); break; Modified: test/xml2xml/array.hlx =================================================================== --- test/xml2xml/array.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/array.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -2,8 +2,6 @@ - - - + Modified: test/xml2xml/doc.hlx =================================================================== --- test/xml2xml/doc.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/doc.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -2,82 +2,63 @@

This is a documentation node for a bundle element

- + Any can hold anything. It provides the dynamic typing - - - + + Signed 64 bit integer - - - + + Signed 32 bit integer - - - + + Signed 16 bit integer - - - + + Signed 8 bit integer - - - + + An 8-bit non-numerical quantity - - - + + Unsigned 128 bit integer - - - + + Unsigned 64 bit integer - - - + + Unsigned 32 bit integer - - - + + Unsigned 16 bit integer - - - + + Unsigned 8 bit integer - - - + + Obviously this is a boolean - - - + + UTF-16 character - - - + + IEEE Quad Floating Point (128 bits) - - - + + IEEE Extended Double Floating Point (80 bits) - - - + + IEEE Double Floating Point (64 bits) - - - + + IEEE Extended Single Floating Point (43 bits) - - - + + IEEE Single Floating Point (32 bits) - - - + + Signed 128 bit integer - - + A Pointer Type @@ -103,10 +84,9 @@ Doc for "arg2" - +

Atom Doc

- -
+ This is structure doc Modified: test/xml2xml/intrinsics.hlx =================================================================== --- test/xml2xml/intrinsics.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/intrinsics.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -1,62 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + Modified: test/xml2xml/pointer.hlx =================================================================== --- test/xml2xml/pointer.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/pointer.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -2,8 +2,6 @@ - - - + Modified: test/xml2xml/resolve.hlx =================================================================== --- test/xml2xml/resolve.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/resolve.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -2,9 +2,7 @@ - - - + Modified: test/xml2xml/signature.hlx =================================================================== --- test/xml2xml/signature.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/signature.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -4,12 +4,10 @@ - - - - + + Modified: test/xml2xml/structure.hlx =================================================================== --- test/xml2xml/structure.hlx 2006-07-03 18:30:48 UTC (rev 376) +++ test/xml2xml/structure.hlx 2006-07-04 04:34:30 UTC (rev 377) @@ -1,9 +1,7 @@ - - - + Modified: tools/hlvm-gentestcase/Generate.cpp =================================================================== --- tools/hlvm-gentestcase/Generate.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ tools/hlvm-gentestcase/Generate.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -53,6 +53,10 @@ cl::value_desc("num")); cl::opt + TypeComplexity("type-complexity", cl::desc("Specify complexity of types"), + cl::value_desc("0-20"), cl::init(10)); + +cl::opt Seed("seed", cl::desc("Specify random number generator seed"), cl::value_desc("num")); @@ -68,6 +72,8 @@ typedef std::vector ValueList; typedef std::map TypeValueMap; TypeValueMap values; +typedef std::vector TypeList; +TypeList types; inline hlvm::Locator* getLocator() @@ -83,7 +89,7 @@ else if (low > high) return int64_t(random()) % (low-high) + high; else - return 1; + return low; } inline @@ -94,7 +100,7 @@ else if (low > high) return uint64_t(random()) % (low-high) + high; else - return 1; + return low; } hlvm::Type* @@ -112,12 +118,16 @@ case UInt16TypeID: case UInt32TypeID: case UInt64TypeID: + return ast->getPrimitiveType(id); case UInt128TypeID: + return ast->getPrimitiveType(UInt64TypeID); case SInt8TypeID: case SInt16TypeID: case SInt32TypeID: case SInt64TypeID: + return ast->getPrimitiveType(id); case SInt128TypeID: + return ast->getPrimitiveType(UInt64TypeID); case Float32TypeID: case Float44TypeID: case Float64TypeID: @@ -148,8 +158,8 @@ { Locator* loc = getLocator(); std::string name = "range_" + utostr(line); - uint64_t limit = randRange(0,5000000000LL); - result = ast->new_RangeType(name,-int64_t(limit),int64_t(limit),loc); + int64_t limit = randRange(0LL,5000000000LL); + result = ast->new_RangeType(name,-limit,limit,loc); break; } case EnumerationTypeID: @@ -179,7 +189,7 @@ Locator* loc = getLocator(); std::string name = "array_" + utostr(line); result = ast->new_ArrayType(name, - genTypeLimited(limit),randRange(1,Complexity),loc); + genTypeLimited(limit),randRange(1,Size),loc); break; } case VectorTypeID: @@ -187,7 +197,7 @@ Locator* loc = getLocator(); std::string name = "vector_" + utostr(line); result = ast->new_VectorType( - name,genTypeLimited(limit),randRange(1,Complexity),loc); + name,genTypeLimited(limit),randRange(1,Size),loc); break; } case OpaqueTypeID: @@ -198,7 +208,8 @@ Locator* loc = getLocator(); std::string name = "struct_" + utostr(line); StructureType* S = ast->new_StructureType(name,loc); - for (unsigned i = 0; i < Complexity; ++i) { + unsigned numFields = randRange(1,Size,true); + for (unsigned i = 0; i < numFields; ++i) { Field* fld = ast->new_Field(name+"_"+utostr(i), genTypeLimited(limit),getLocator()); S->addField(fld); @@ -214,13 +225,19 @@ return result; } -hlvm::Type* +Type* genType() { - return genTypeLimited(Complexity); + bool shouldGenNewType = randRange(0,20) < TypeComplexity; + if (types.empty() || shouldGenNewType) { + Type* Ty = genTypeLimited(Complexity); + types.push_back(Ty); + return Ty; + } + return types[ randRange(0,types.size()-1) ]; } -hlvm::Value* +Value* genValue(const hlvm::Type* Ty, bool is_constant = false) { if (!is_constant && randRange(0,Complexity) < Complexity/2) { @@ -228,7 +245,10 @@ TypeValueMap::iterator VI = values.find(Ty); if (VI != values.end()) { ValueList& VL = VI->second; - return VL[ randRange(0,VL.size()-1) ]; + unsigned index = randRange(0,VL.size()-1,true); + Value* result = VL[index]; + hlvmAssert(result->getType() == Ty); + return result; } } @@ -245,8 +265,10 @@ } case CharacterTypeID: { + std::string val; + val += char(randRange(35,126)); C = ast->new_ConstantCharacter( - std::string("cchar_") + utostr(line), "a", loc); + std::string("cchar_") + utostr(line), val, loc); break; } case OctetTypeID: @@ -459,6 +481,7 @@ if (is_constant || (randRange(0,Complexity*Size) < (Complexity*Size)/2)) result = C; else { + C->setParent(bundle); Variable* var = ast->new_Variable(C->getName()+"_var",C->getType(),loc); var->setIsConstant(false); var->setInitializer(C); @@ -541,7 +564,7 @@ ret->setParent(B); // Install the function in the value map - values[resultType].push_back(F); + values[sig].push_back(F); return F; } Modified: tools/hlvm-gentestcase/hlvm-gentestcase.cpp =================================================================== --- tools/hlvm-gentestcase/hlvm-gentestcase.cpp 2006-07-03 18:30:48 UTC (rev 376) +++ tools/hlvm-gentestcase/hlvm-gentestcase.cpp 2006-07-04 04:34:30 UTC (rev 377) @@ -49,6 +49,10 @@ BundleName("bundle", cl::desc("Specify bundle name"), cl::value_desc("name")); +static cl::opt +NoValidate("no-validate",cl::desc("Disable validation of generated code"), + cl::init(false)); + extern AST* GenerateTestCase(const std::string& id, const std::string& bname); int main(int argc, char**argv) @@ -82,9 +86,10 @@ } AST* tree = GenerateTestCase(URL,BundleName); - if (!validate(tree)) { - std::cerr << argv[0] << ": Generated test case did not validate.\n"; - return 1; + if (!NoValidate) { + if (!validate(tree)) { + std::cerr << argv[0] << ": Generated test case did not validate.\n"; + } } XMLWriter* wrtr = XMLWriter::create(OutputFilename.c_str()); wrtr->write(tree); From rspencer at reidspencer.com Tue Jul 4 01:08:53 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 23:08:53 -0700 Subject: [hlvm-commits] r378 - docs Message-ID: <200607040608.k6468rSH007464@server1.hlvm.org> Author: reid Date: 2006-07-03 23:08:53 -0700 (Mon, 03 Jul 2006) New Revision: 378 Log: Update current status. Make the document a little less dense. Modified: docs/ReleasePlans.html Modified: docs/ReleasePlans.html =================================================================== --- docs/ReleasePlans.html 2006-07-04 04:34:30 UTC (rev 377) +++ docs/ReleasePlans.html 2006-07-04 06:08:53 UTC (rev 378) @@ -47,69 +47,58 @@

Release Index

-

The table below provides an index into the information for all - releases.

-
- -

Upcoming Releases

-
-

The table below provides an overview of the planned upcoming releases.

- + + + + + + + + + + + + + +
ReleaseDescriptionDescriptionStatus Links
0.1Hello World, AST Construction, Build System100%Features Status
0.2 Turing Complete, JIT Execution55% Features Status
0.3 Front End Library, Interpreted Execution1% Features
0.4 Ruby Front End0% Features
0.5 Scheme Front End0% Features
0.6 Python Front End0% Features
0.9 Quality Enhancements, Pre-Beta Touchups0% Features
-

Completed Releases

-
-

The table below provides a list of the releases already completed.

- - - - - - - - - - - -
ReleaseDescriptionLinks
0.1Hello World, AST Construction, Build SystemFeatures Status
-
-

Release Status

This section provides the status for the current and previous releases.

@@ -122,15 +111,23 @@ - - - + + + - - - + + + + + + + + + + +
FeatureFeatureFeature
Arithmetic Operators
Done.
Control Flow Operators
CallOp is done. - Select, Loop, and Switch are syntactically implemented but no code gen - yet.
Boolean Operators
Done.
Integer Arithmetic Operators
Done.
Boolean Arithmetic Operators
Done.
Floating POint Arithmetic Operators
+ Done with the exception of math library calls.
Text Operators
Not Started
Program Arguments
Not Started
JIT Compilation
Not Started
Control Flow Operators
Done.
Block Nesting
Done.
Aggregate Constants
Done.
Text Operators
Not Started.
Program Arguments
Changed to argc/argv.
JIT Compilation
Not Started.
Test Case Generator
+ 80% A few bugs remain.
@@ -232,16 +229,31 @@

Release 0.2 Features (Turing Complete)

    -
  1. Arithmetic Operators. Extend the AST - library to support all the arithmetic operators for integer and floating - point arithmetic. Provide LLVM code generation support for these +
  2. Integer Operators. Extend the AST + library to support all the integer arithmetic operators + such as add, subtract, multiply, divide, modulo, increment, decrement, + bitwise operations, etc. Provide LLVM code generation support for these operators.
  3. +
  4. Boolean Operators. Extend the AST + library to support all the boolean operators such as and, or, not, and + the six comparison operators. Provide LLVM code generation support for these + operators.
  5. +
  6. Floating Point Operators. Extend the AST + library to support all the floating point arithmetic operators such as add, + subtract, multiply, divide, etc. Also include the operators that imply + library functions or LLVM intrinsics such as sqrt, power, etc. Provide LLVM + code generation support for these operators.
  7. Control Flow Operators. Extend the AST library to support a set of control flow operators (if,while,for,switch) and provide LLVM code generation for them.
  8. -
  9. Boolean Operators. Extend the AST - library to provide boolean comparison operators and LLVM code generation for - them.
  10. +
  11. Block Nesting
    Implement correct + code generation for nested blocks, block results, function results, return + operator, control flow operators with nested blocks, etc.
  12. +
  13. Aggregate Constants
    Complete the + implementation of literal constants to include the aggregate constants for + pointers, arrays, vectors, structures and continuations. Also implement + literal constants for the missing simple types: enumerator, any, range, + octet, character, etc.
  14. Text Operators. Extend the AST library to provide a complete set of operators for manipulating strings of text and the LLVM code generation for them.
  15. @@ -251,6 +263,11 @@
  16. Program Arguments. Extend the Runtime library to correctly pass an HLVM program's arguments as an HLVM array of text.
  17. +
  18. Test Case Generator. Write a test case + generator program that randomly generates test cases based on specifications + of operator complexity, type complexity, and size. Integrate this generator + with the dejagnu test framework to check a few random cases on each run of + the "check" target.
  19. JIT Compilation. Extend the Runtime library to support just-in-time compilation and execution via LLVM's JIT facilities.
  20. From rspencer at reidspencer.com Tue Jul 4 01:28:38 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 23:28:38 -0700 Subject: [hlvm-commits] r379 - docs Message-ID: <200607040628.k646Sc4Q007740@server1.hlvm.org> Author: reid Date: 2006-07-03 23:28:38 -0700 (Mon, 03 Jul 2006) New Revision: 379 Log: Provide a few release notes. Modified: docs/ReleaseNotes.html Modified: docs/ReleaseNotes.html =================================================================== --- docs/ReleaseNotes.html 2006-07-04 06:08:53 UTC (rev 378) +++ docs/ReleaseNotes.html 2006-07-04 06:28:38 UTC (rev 379) @@ -40,15 +40,26 @@

    This is the second public release of the High Level Virtual Machine. This is a very early pre-release, version 0.2. That is, HLVM is not complete yet - and it doesn't do very much. The main goal for this release is to get HLVM - to be "Turing Complete".

    + and it doesn't do very much yet. The main goal for this release is to get + HLVM to be "Turing Complete".

    New Features In HLVM 0.2

    Here are the main things accomplished in this release:

      -
    1. Nothing yet
    2. +
    3. hlvm-gentestcase. This new tool will automatically generate XML + test cases for HLVM. This tool is incorporated into the test suite and will + randomly select 100 test cases of varying complexity and size.

    Significant Changes in HLVM 0.2

    -

    There have been no changes since the last release.

    +

    +

    Here are things that have changed since the last release:

    +
      +
    1. Aliases Removed. The original intent behind aliases was to + support some kind of "typedef" feature and provide alternate names for + types. However, since every type in HLVM is required to have an explicit + name and type identification is done by name, the alias feature was + redundant and not well aligned with the other types. Consequently it has + been removed.
    2. +

    Platform Support

    HLVM is known to work on the following platforms:

      From rspencer at reidspencer.com Tue Jul 4 01:57:23 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Mon, 3 Jul 2006 23:57:23 -0700 Subject: [hlvm-commits] r380 - hlvm/Reader Message-ID: <200607040657.k646vNVa007946@server1.hlvm.org> Author: reid Date: 2006-07-03 23:57:22 -0700 (Mon, 03 Jul 2006) New Revision: 380 Log: Implement octet type and literal constant. Implement enum literal constant. Eliminate double documentation elements. Modified: hlvm/Reader/HLVM.rng Modified: hlvm/Reader/HLVM.rng =================================================================== --- hlvm/Reader/HLVM.rng 2006-07-04 06:28:38 UTC (rev 379) +++ hlvm/Reader/HLVM.rng 2006-07-04 06:57:22 UTC (rev 380) @@ -155,6 +155,10 @@ + + + + @@ -227,7 +231,6 @@ - @@ -270,57 +273,52 @@ - - + - - + - - + - - + - - + @@ -368,26 +366,28 @@ + - - - + + + + - + @@ -404,11 +404,11 @@ - + @@ -450,6 +450,8 @@ + + @@ -475,11 +477,6 @@ - - - - - @@ -524,6 +521,20 @@ + + + + + + + + + + + + + + @@ -589,11 +600,17 @@ - + + + + + - + + + @@ -629,10 +646,10 @@ - + From rspencer at reidspencer.com Tue Jul 4 03:31:44 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 01:31:44 -0700 Subject: [hlvm-commits] r381 - hlvm/AST Message-ID: <200607040831.k648VivD008324@server1.hlvm.org> Author: reid Date: 2006-07-04 01:31:44 -0700 (Tue, 04 Jul 2006) New Revision: 381 Log: Make the getContainingBundle method available on all nodes, not just Operators. Make sure getPointerTo sets the parent for each type it creates. Modified: hlvm/AST/AST.cpp hlvm/AST/Node.cpp hlvm/AST/Node.h hlvm/AST/Operator.cpp hlvm/AST/Operator.h Modified: hlvm/AST/AST.cpp =================================================================== --- hlvm/AST/AST.cpp 2006-07-04 06:57:22 UTC (rev 380) +++ hlvm/AST/AST.cpp 2006-07-04 08:31:44 UTC (rev 381) @@ -228,6 +228,7 @@ PointerType* PT = new PointerType(); PT->setElementType(Ty); PT->setName(ptr_name); + PT->setParent(Ty->getContainingBundle()); ast->types.insert(ptr_name,Ty); return PT; } Modified: hlvm/AST/Node.cpp =================================================================== --- hlvm/AST/Node.cpp 2006-07-04 06:57:22 UTC (rev 380) +++ hlvm/AST/Node.cpp 2006-07-04 08:31:44 UTC (rev 381) @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,16 @@ return llvm::cast(last); } +Bundle* +Node::getContainingBundle() const +{ + Node* p = getParent(); + while (p && !p->is(BundleID)) p = p->getParent(); + if (!p) + return 0; + return llvm::cast(p); +} + void Node::insertChild(Node* child) { Modified: hlvm/AST/Node.h =================================================================== --- hlvm/AST/Node.h 2006-07-04 06:57:22 UTC (rev 380) +++ hlvm/AST/Node.h 2006-07-04 08:31:44 UTC (rev 381) @@ -39,6 +39,7 @@ class Type; class AST; +class Bundle; /// This enumeration is used to identify the various kinds of Abstract Syntax /// Tre nodes. Its organization is very specific and dependent on the class @@ -310,8 +311,12 @@ /// @name Accessors /// @{ public: + /// Get the AST root node that this Node is part of. inline AST* getRoot(); + /// Return the bundle that contains this Node. + Bundle* getContainingBundle() const; + /// Get the type of node inline NodeIDs getID() const { return NodeIDs(id); } Modified: hlvm/AST/Operator.cpp =================================================================== --- hlvm/AST/Operator.cpp 2006-07-04 06:57:22 UTC (rev 380) +++ hlvm/AST/Operator.cpp 2006-07-04 08:31:44 UTC (rev 381) @@ -42,18 +42,8 @@ { } -Bundle* -Operator::getContainingBundle() -{ - Node* p = getParent(); - while (p && !p->is(BundleID)) p = p->getParent(); - if (!p) - return 0; - return cast(p); -} - Function* -Operator::getContainingFunction() +Operator::getContainingFunction() const { Node* p = getParent(); while (p && !p->isFunction()) p = p->getParent(); @@ -63,7 +53,7 @@ } Block* -Operator::getContainingBlock() +Operator::getContainingBlock() const { Node* p = getParent(); while (p && !isa(p)) p = p->getParent(); @@ -73,7 +63,7 @@ } Operator* -Operator::getContainingLoop() +Operator::getContainingLoop() const { Node* p = getParent(); while (p && !p->isLoop()) p = p->getParent(); Modified: hlvm/AST/Operator.h =================================================================== --- hlvm/AST/Operator.h 2006-07-04 06:57:22 UTC (rev 380) +++ hlvm/AST/Operator.h 2006-07-04 08:31:44 UTC (rev 381) @@ -71,20 +71,16 @@ virtual Operator* getOperand(unsigned opnum) const = 0; /// Return the function containing this operator - Function* getContainingFunction(); + Function* getContainingFunction() const; /// Return the block containing this operator - Block* getContainingBlock(); + Block* getContainingBlock() const; /// Return the loop operator containing this operator. This can return /// any of the loop constructs (Loop, While, Unless, etc.) so its result /// type is Operator*. - Operator* getContainingLoop(); + Operator* getContainingLoop() const; - /// Return the bundle that contains the function that contains the block - /// that contains this operator. - Bundle* getContainingBundle(); - /// Determine if this is a classof some other type. static inline bool classof(const Operator*) { return true; } static inline bool classof(const Node* N) { return N->isOperator(); } From rspencer at reidspencer.com Tue Jul 4 03:32:30 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 01:32:30 -0700 Subject: [hlvm-commits] r382 - hlvm/Writer Message-ID: <200607040832.k648WU14008341@server1.hlvm.org> Author: reid Date: 2006-07-04 01:32:30 -0700 (Tue, 04 Jul 2006) New Revision: 382 Log: Fix a problem generating range literals. Negative values were being generated as unsigned quantities. This bug found by the test case generator. Modified: hlvm/Writer/XMLWriter.cpp Modified: hlvm/Writer/XMLWriter.cpp =================================================================== --- hlvm/Writer/XMLWriter.cpp 2006-07-04 08:31:44 UTC (rev 381) +++ hlvm/Writer/XMLWriter.cpp 2006-07-04 08:32:30 UTC (rev 382) @@ -90,6 +90,8 @@ { writeAttribute(name, t->getName()); } inline void writeAttribute(const char* name, uint64_t val) { writeAttribute(name, llvm::utostr(val)); } + inline void writeAttribute(const char* name, int64_t val) + { writeAttribute(name, llvm::itostr(val)); } inline void writeElement(const char* elem, const char* body) { xmlTextWriterWriteElement(writer, reinterpret_cast(elem), From rspencer at reidspencer.com Tue Jul 4 03:35:56 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 01:35:56 -0700 Subject: [hlvm-commits] r383 - tools/hlvm-gentestcase Message-ID: <200607040835.k648ZuRZ008368@server1.hlvm.org> Author: reid Date: 2006-07-04 01:35:56 -0700 (Tue, 04 Jul 2006) New Revision: 383 Log: Consolidate the code that dereferences a generated value into a new function, genValueOperator(). Fix range of generated values for ConstantInteger. Fix situations where random numbers in the range (0,1) were always generating 0. Modified: tools/hlvm-gentestcase/Generate.cpp Modified: tools/hlvm-gentestcase/Generate.cpp =================================================================== --- tools/hlvm-gentestcase/Generate.cpp 2006-07-04 08:32:30 UTC (rev 382) +++ tools/hlvm-gentestcase/Generate.cpp 2006-07-04 08:35:56 UTC (rev 383) @@ -53,10 +53,6 @@ cl::value_desc("num")); cl::opt - TypeComplexity("type-complexity", cl::desc("Specify complexity of types"), - cl::value_desc("0-20"), cl::init(10)); - -cl::opt Seed("seed", cl::desc("Specify random number generator seed"), cl::value_desc("num")); @@ -64,18 +60,18 @@ Size("size",cl::desc("Specify size of generated code"), cl::value_desc("num")); -hlvm::AST* ast = 0; -hlvm::URI* uri = 0; -hlvm::Bundle* bundle = 0; -hlvm::Program* program = 0; +AST* ast = 0; +URI* uri = 0; +Bundle* bundle = 0; +Program* program = 0; unsigned line = 0; -typedef std::vector ValueList; -typedef std::map TypeValueMap; +typedef std::vector ValueList; +typedef std::map TypeValueMap; TypeValueMap values; -typedef std::vector TypeList; +typedef std::vector TypeList; TypeList types; -inline hlvm::Locator* +inline Locator* getLocator() { return ast->new_Locator(uri,++line); @@ -103,8 +99,8 @@ return low; } -hlvm::Type* -genTypeLimited(unsigned limit) +Type* +genType(unsigned limit) { Type* result = 0; NodeIDs id = NodeIDs(randRange(FirstTypeID,LastTypeID)); @@ -150,15 +146,15 @@ { Locator* loc = getLocator(); std::string name = "int_" + utostr(line); - result = ast->new_IntegerType( - name,randRange(1,64,true),bool(randRange(0,1,true)),loc); + bool isSigned = randRange(0,Complexity+2,true) < (Complexity+2)/2; + result = ast->new_IntegerType(name,randRange(2,64,true),isSigned,loc); break; } case RangeTypeID: { Locator* loc = getLocator(); std::string name = "range_" + utostr(line); - int64_t limit = randRange(0LL,5000000000LL); + int64_t limit = randRange(0,8000000); result = ast->new_RangeType(name,-limit,limit,loc); break; } @@ -181,7 +177,7 @@ } case PointerTypeID: { - result = ast->getPointerTo(genTypeLimited(limit)); + result = ast->getPointerTo(genType(limit)); break; } case ArrayTypeID: @@ -189,7 +185,7 @@ Locator* loc = getLocator(); std::string name = "array_" + utostr(line); result = ast->new_ArrayType(name, - genTypeLimited(limit),randRange(1,Size),loc); + genType(limit),randRange(1,Size),loc); break; } case VectorTypeID: @@ -197,7 +193,7 @@ Locator* loc = getLocator(); std::string name = "vector_" + utostr(line); result = ast->new_VectorType( - name,genTypeLimited(limit),randRange(1,Size),loc); + name,genType(limit),randRange(1,Size),loc); break; } case OpaqueTypeID: @@ -211,7 +207,7 @@ unsigned numFields = randRange(1,Size,true); for (unsigned i = 0; i < numFields; ++i) { Field* fld = ast->new_Field(name+"_"+utostr(i), - genTypeLimited(limit),getLocator()); + genType(limit),getLocator()); S->addField(fld); } result = S; @@ -228,9 +224,9 @@ Type* genType() { - bool shouldGenNewType = randRange(0,20) < TypeComplexity; + bool shouldGenNewType = randRange(0,20) < Complexity; if (types.empty() || shouldGenNewType) { - Type* Ty = genTypeLimited(Complexity); + Type* Ty = genType(Complexity); types.push_back(Ty); return Ty; } @@ -238,7 +234,7 @@ } Value* -genValue(const hlvm::Type* Ty, bool is_constant = false) +genValue(const Type* Ty, bool is_constant = false) { if (!is_constant && randRange(0,Complexity) < Complexity/2) { // First look up an existing value in the map @@ -259,8 +255,9 @@ switch (id) { case BooleanTypeID: { + bool val = randRange(0,Complexity+2) < (Complexity+2)/2; C = ast->new_ConstantBoolean( - std::string("cbool_") + utostr(line), bool(randRange(0,1)), loc); + std::string("cbool_") + utostr(line), val, loc); break; } case CharacterTypeID: @@ -387,11 +384,16 @@ Locator* loc = getLocator(); std::string name = "cint_" + utostr(line); const IntegerType* IntTy = llvm::cast(Ty); - int64_t max = 1 << (IntTy->getBits() < 63 ? IntTy->getBits() : 63); - int64_t val = IntTy->isSigned() ? - randRange(int64_t(-max),int64_t(max-1)) : - randRange(int64_t(0),int64_t(max)); - std::string val_str( itostr(val) ); + unsigned bits = (IntTy->getBits() < 63 ? IntTy->getBits() : 63) - 1; + int64_t max = 1 << bits; + std::string val_str; + if (IntTy->isSigned()) { + int64_t val = randRange(int64_t(-max),int64_t(max-1)); + val_str = itostr(val); + } else { + uint64_t val = randRange(int64_t(0),int64_t(max),true); + val_str = utostr(val); + } C = ast->new_ConstantInteger(name,val_str,10,Ty,loc); break; } @@ -477,23 +479,37 @@ hlvmAssert(!"Invalid Type?"); } + // Give the constant a home + C->setParent(bundle); + + // Make it either an initialized variable or just the constant itself. Value* result = 0; - if (is_constant || (randRange(0,Complexity*Size) < (Complexity*Size)/2)) + if (is_constant || (randRange(0,Complexity+2) < (Complexity+2)/2)) result = C; else { - C->setParent(bundle); Variable* var = ast->new_Variable(C->getName()+"_var",C->getType(),loc); var->setIsConstant(false); var->setInitializer(C); + var->setParent(bundle); result = var; } - result->setParent(bundle); // Memoize the result values[result->getType()].push_back(result); return result; } +inline Operator* +genValueOperator(const Type *Ty, bool is_constant = false) +{ + Value* V = genValue(Ty,is_constant); + Operator* O = ast->new_ReferenceOp(V,getLocator()); + if (isa(V)) + O = ast->new_UnaryOp(O,getLocator()); + return O; +} + + CallOp* genCallTo(Function* F) { @@ -503,26 +519,18 @@ const SignatureType* sig = F->getSignature(); for (SignatureType::const_iterator I = sig->begin(), E = sig->end(); I != E; ++I) - { - Value* V = genValue((*I)->getType()); - hlvmAssert(isa(V) || isa(V)) ; - Operator* O = ast->new_ReferenceOp(V,getLocator()); - if (isa(V)) - args.push_back(O); - else - args.push_back(ast->new_UnaryOp(O,getLocator())); - } + args.push_back(genValueOperator((*I)->getType())); return ast->new_MultiOp(args,getLocator()); } -hlvm::Block* +Block* genBlock() { Block* B = ast->new_Block(getLocator()); return B; } -hlvm::Function* +Function* genFunction(Type* resultType, unsigned numArgs) { // Get the function name @@ -532,7 +540,7 @@ // Get the signature std::string sigName = name + "_type"; SignatureType* sig = ast->new_SignatureType(sigName,resultType,loc); - if (randRange(0,Complexity) <= int(Complexity/2)) + if (randRange(0,Complexity) <= int(Complexity/4)) sig->setIsVarArgs(true); for (unsigned i = 0; i < numArgs; ++i ) { @@ -540,6 +548,7 @@ Parameter* param = ast->new_Parameter(name,genType(),loc); sig->addParameter(param); } + sig->setParent(bundle); // Create the function and set its linkage LinkageKinds LK = LinkageKinds(randRange(ExternalLinkage,InternalLinkage)); @@ -553,10 +562,7 @@ B->setParent(F); // Get the function result and return instruction - Value* V = genValue(F->getResultType()); - Operator* O = ast->new_ReferenceOp(V,getLocator()); - if (isa(V)) - O = ast->new_UnaryOp(O,getLocator()); + Operator* O = genValueOperator(F->getResultType()); ResultOp* rslt = ast->new_UnaryOp(O,getLocator()); rslt->setParent(B); @@ -587,7 +593,7 @@ for (unsigned i = 0; i < Size; i++) { Type* result = genType(); Type* argTy = genType(); - unsigned numArgs = int(randRange(0,int(Complexity/5))); + unsigned numArgs = int(randRange(0,int(Complexity))); Function* F = genFunction(result,numArgs); F->setParent(bundle); CallOp* call = genCallTo(F); @@ -595,10 +601,7 @@ } // Get the function result and return instruction - Value* V = genValue(program->getResultType()); - Operator* O = ast->new_ReferenceOp(V,getLocator()); - if (isa(V)) - O = ast->new_UnaryOp(O,getLocator()); + Operator* O = genValueOperator(program->getResultType()); ResultOp* rslt = ast->new_UnaryOp(O,getLocator()); rslt->setParent(blk); From rspencer at reidspencer.com Tue Jul 4 14:07:17 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 12:07:17 -0700 Subject: [hlvm-commits] r384 - hlvm/AST Message-ID: <200607041907.k64J7HEH011916@server1.hlvm.org> Author: reid Date: 2006-07-04 12:07:16 -0700 (Tue, 04 Jul 2006) New Revision: 384 Log: Fix a nasty bug in getPointerTo where the registered type was the element type not the pointer type. This meant that no pointer types would ever be reused and caused numerous failures in the test case generator. A valuable bug to find. Modified: hlvm/AST/AST.cpp Modified: hlvm/AST/AST.cpp =================================================================== --- hlvm/AST/AST.cpp 2006-07-04 08:35:56 UTC (rev 383) +++ hlvm/AST/AST.cpp 2006-07-04 19:07:16 UTC (rev 384) @@ -229,7 +229,7 @@ PT->setElementType(Ty); PT->setName(ptr_name); PT->setParent(Ty->getContainingBundle()); - ast->types.insert(ptr_name,Ty); + ast->types.insert(ptr_name,PT); return PT; } From rspencer at reidspencer.com Tue Jul 4 14:21:59 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 12:21:59 -0700 Subject: [hlvm-commits] r385 - tools/hlvm-gentestcase Message-ID: <200607041921.k64JLx9B011974@server1.hlvm.org> Author: reid Date: 2006-07-04 12:21:59 -0700 (Tue, 04 Jul 2006) New Revision: 385 Log: Fix some problems with the range of generated integer constants. Modified: tools/hlvm-gentestcase/Generate.cpp Modified: tools/hlvm-gentestcase/Generate.cpp =================================================================== --- tools/hlvm-gentestcase/Generate.cpp 2006-07-04 19:07:16 UTC (rev 384) +++ tools/hlvm-gentestcase/Generate.cpp 2006-07-04 19:21:59 UTC (rev 385) @@ -147,7 +147,7 @@ Locator* loc = getLocator(); std::string name = "int_" + utostr(line); bool isSigned = randRange(0,Complexity+2,true) < (Complexity+2)/2; - result = ast->new_IntegerType(name,randRange(2,64,true),isSigned,loc); + result = ast->new_IntegerType(name,randRange(4,64,true),isSigned,loc); break; } case RangeTypeID: @@ -311,7 +311,7 @@ } case SInt8TypeID: { - int8_t val = int8_t(randRange(-128,127)); + int8_t val = int8_t(randRange(-127,127)); std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs8_")+utostr(line),val_str,10,Ty,loc); @@ -319,7 +319,7 @@ } case SInt16TypeID: { - int16_t val = int16_t(randRange(-32768,32767)); + int16_t val = int16_t(randRange(-32767,32767)); std::string val_str(itostr(val)); C = ast->new_ConstantInteger( std::string("cs16_")+utostr(line),val_str,10,Ty,loc); @@ -384,14 +384,14 @@ Locator* loc = getLocator(); std::string name = "cint_" + utostr(line); const IntegerType* IntTy = llvm::cast(Ty); - unsigned bits = (IntTy->getBits() < 63 ? IntTy->getBits() : 63) - 1; + unsigned bits = (IntTy->getBits() < 63 ? IntTy->getBits() : 63) - 2; int64_t max = 1 << bits; std::string val_str; if (IntTy->isSigned()) { int64_t val = randRange(int64_t(-max),int64_t(max-1)); val_str = itostr(val); } else { - uint64_t val = randRange(int64_t(0),int64_t(max),true); + uint64_t val = randRange(uint64_t(0),uint64_t(max),true); val_str = utostr(val); } C = ast->new_ConstantInteger(name,val_str,10,Ty,loc); @@ -518,8 +518,13 @@ args.push_back(O); const SignatureType* sig = F->getSignature(); for (SignatureType::const_iterator I = sig->begin(), E = sig->end(); - I != E; ++I) - args.push_back(genValueOperator((*I)->getType())); + I != E; ++I) + { + const Type* argTy = (*I)->getType(); + Operator* O = genValueOperator(argTy); + hlvmAssert(argTy == O->getType()); + args.push_back(O); + } return ast->new_MultiOp(args,getLocator()); } From rspencer at reidspencer.com Tue Jul 4 17:11:19 2006 From: rspencer at reidspencer.com (rspencer at reidspencer.com) Date: Tue, 4 Jul 2006 15:11:19 -0700 Subject