#include "llvm/iMemory.h"
#include <list>
#include <utility> // Get definition of pair class
+#include <algorithm> // Get definition of find_if
#include <stdio.h> // This embarasment is due to our flex lexer...
int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit
}
}
+
+struct EqualsType {
+ const Type *T;
+ inline EqualsType(const Type *t) { T = t; }
+ inline bool operator()(const ConstPoolVal *CPV) const {
+ return static_cast<const ConstPoolType*>(CPV)->getValue() == T;
+ }
+};
+
+
+// checkNewType - We have to be careful to add all types referenced by the
+// program to the constant pool of the method or module. Because of this, we
+// often want to check to make sure that types used are in the constant pool,
+// and add them if they aren't. That's what this function does.
+//
+static const Type *checkNewType(const Type *Ty) {
+ ConstantPool &CP = CurMeth.CurrentMethod ?
+ CurMeth.CurrentMethod->getConstantPool() :
+ CurModule.CurrentModule->getConstantPool();
+
+ // Get the type type plane...
+ ConstantPool::PlaneType &P = CP.getPlane(Type::TypeTy);
+ ConstantPool::PlaneType::const_iterator PI = find_if(P.begin(), P.end(),
+ EqualsType(Ty));
+ if (PI == P.end()) {
+ vector<ValueList> &ValTab = CurMeth.CurrentMethod ?
+ CurMeth.Values : CurModule.Values;
+ ConstPoolVal *CPT = new ConstPoolType(Ty);
+ CP.insert(CPT);
+ InsertValue(CPT, ValTab);
+ }
+ return Ty;
+}
+
+
//===----------------------------------------------------------------------===//
// RunVMAsmParser - Define an interface to this parser
//===----------------------------------------------------------------------===//
}
-#line 337 "llvmAsmParser.y"
+#line 373 "llvmAsmParser.y"
typedef union {
Module *ModuleVal;
Method *MethodVal;
#if YYDEBUG != 0
static const short yyrline[] = { 0,
- 434, 435, 442, 443, 454, 454, 454, 454, 454, 454,
- 454, 455, 455, 455, 455, 455, 455, 455, 458, 458,
- 463, 464, 464, 464, 464, 464, 465, 465, 465, 465,
- 465, 465, 466, 466, 470, 470, 470, 470, 471, 471,
- 471, 471, 472, 472, 474, 477, 481, 486, 491, 494,
- 497, 503, 506, 519, 523, 541, 548, 556, 570, 573,
- 579, 587, 598, 603, 608, 617, 617, 619, 627, 631,
- 636, 639, 643, 670, 674, 683, 686, 689, 692, 695,
- 700, 703, 706, 713, 721, 726, 730, 733, 736, 741,
- 744, 749, 753, 758, 762, 771, 776, 785, 789, 793,
- 796, 799, 802, 807, 818, 826, 836, 844, 849, 856,
- 860, 866, 866, 868, 873, 878, 882, 885, 896, 933,
- 938, 940, 944, 949, 958, 963, 972, 978, 987, 999
+ 470, 471, 478, 479, 490, 490, 490, 490, 490, 490,
+ 490, 491, 491, 491, 491, 491, 491, 491, 494, 494,
+ 499, 500, 500, 500, 500, 500, 501, 501, 501, 501,
+ 501, 501, 502, 502, 506, 506, 506, 506, 507, 507,
+ 507, 507, 508, 508, 510, 513, 517, 522, 527, 530,
+ 533, 539, 542, 555, 559, 577, 584, 592, 606, 609,
+ 615, 623, 634, 639, 644, 653, 653, 655, 663, 667,
+ 672, 675, 679, 706, 710, 719, 722, 725, 728, 731,
+ 736, 739, 742, 749, 757, 762, 766, 769, 772, 777,
+ 780, 785, 789, 794, 798, 807, 812, 821, 825, 829,
+ 832, 835, 838, 843, 854, 862, 872, 880, 885, 892,
+ 896, 902, 902, 904, 909, 914, 918, 921, 932, 969,
+ 974, 976, 980, 983, 990, 993, 1001, 1007, 1016, 1028
};
#endif
switch (yyn) {
case 2:
-#line 435 "llvmAsmParser.y"
+#line 471 "llvmAsmParser.y"
{
if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range!
ThrowException("Value too large for type!");
;
break;}
case 4:
-#line 443 "llvmAsmParser.y"
+#line 479 "llvmAsmParser.y"
{
if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range!
ThrowException("Value too large for type!");
;
break;}
case 45:
-#line 474 "llvmAsmParser.y"
+#line 510 "llvmAsmParser.y"
{
yyval.StrVal = yyvsp[-1].StrVal;
;
break;}
case 46:
-#line 477 "llvmAsmParser.y"
+#line 513 "llvmAsmParser.y"
{
yyval.StrVal = 0;
;
break;}
case 47:
-#line 481 "llvmAsmParser.y"
+#line 517 "llvmAsmParser.y"
{ // integral constants
if (!ConstPoolSInt::isValueValidForType(yyvsp[-1].TypeVal, yyvsp[0].SInt64Val))
ThrowException("Constant value doesn't fit in type!");
;
break;}
case 48:
-#line 486 "llvmAsmParser.y"
+#line 522 "llvmAsmParser.y"
{ // integral constants
if (!ConstPoolUInt::isValueValidForType(yyvsp[-1].TypeVal, yyvsp[0].UInt64Val))
ThrowException("Constant value doesn't fit in type!");
;
break;}
case 49:
-#line 491 "llvmAsmParser.y"
+#line 527 "llvmAsmParser.y"
{ // Boolean constants
yyval.ConstVal = new ConstPoolBool(true);
;
break;}
case 50:
-#line 494 "llvmAsmParser.y"
+#line 530 "llvmAsmParser.y"
{ // Boolean constants
yyval.ConstVal = new ConstPoolBool(false);
;
break;}
case 51:
-#line 497 "llvmAsmParser.y"
+#line 533 "llvmAsmParser.y"
{ // String constants
cerr << "FIXME: TODO: String constants [sbyte] not implemented yet!\n";
abort();
;
break;}
case 52:
-#line 503 "llvmAsmParser.y"
+#line 539 "llvmAsmParser.y"
{ // Type constants
yyval.ConstVal = new ConstPoolType(yyvsp[0].TypeVal);
;
break;}
case 53:
-#line 506 "llvmAsmParser.y"
+#line 542 "llvmAsmParser.y"
{ // Nonempty array constant
// Verify all elements are correct type!
const ArrayType *AT = ArrayType::getArrayType(yyvsp[-4].TypeVal);
;
break;}
case 54:
-#line 519 "llvmAsmParser.y"
+#line 555 "llvmAsmParser.y"
{ // Empty array constant
vector<ConstPoolVal*> Empty;
yyval.ConstVal = new ConstPoolArray(ArrayType::getArrayType(yyvsp[-3].TypeVal), Empty);
;
break;}
case 55:
-#line 523 "llvmAsmParser.y"
+#line 559 "llvmAsmParser.y"
{
// Verify all elements are correct type!
const ArrayType *AT = ArrayType::getArrayType(yyvsp[-4].TypeVal, (int)yyvsp[-6].UInt64Val);
;
break;}
case 56:
-#line 541 "llvmAsmParser.y"
+#line 577 "llvmAsmParser.y"
{
if (yyvsp[-5].UInt64Val != 0)
ThrowException("Type mismatch: constant sized array initialized with 0"
;
break;}
case 57:
-#line 548 "llvmAsmParser.y"
+#line 584 "llvmAsmParser.y"
{
StructType::ElementTypes Types(yyvsp[-4].TypeList->begin(), yyvsp[-4].TypeList->end());
delete yyvsp[-4].TypeList;
;
break;}
case 58:
-#line 556 "llvmAsmParser.y"
+#line 592 "llvmAsmParser.y"
{
const StructType *St =
StructType::getStructType(StructType::ElementTypes());
;
break;}
case 59:
-#line 570 "llvmAsmParser.y"
+#line 606 "llvmAsmParser.y"
{
(yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(addConstValToConstantPool(yyvsp[0].ConstVal));
;
break;}
case 60:
-#line 573 "llvmAsmParser.y"
+#line 609 "llvmAsmParser.y"
{
yyval.ConstVector = new vector<ConstPoolVal*>();
yyval.ConstVector->push_back(addConstValToConstantPool(yyvsp[0].ConstVal));
;
break;}
case 61:
-#line 579 "llvmAsmParser.y"
+#line 615 "llvmAsmParser.y"
{
if (yyvsp[-1].StrVal) {
yyvsp[0].ConstVal->setName(yyvsp[-1].StrVal);
;
break;}
case 62:
-#line 587 "llvmAsmParser.y"
+#line 623 "llvmAsmParser.y"
{
;
break;}
case 63:
-#line 598 "llvmAsmParser.y"
+#line 634 "llvmAsmParser.y"
{
yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal;
CurModule.ModuleDone();
;
break;}
case 64:
-#line 603 "llvmAsmParser.y"
+#line 639 "llvmAsmParser.y"
{
yyvsp[-1].ModuleVal->getMethodList().push_back(yyvsp[0].MethodVal);
CurMeth.MethodDone();
;
break;}
case 65:
-#line 608 "llvmAsmParser.y"
+#line 644 "llvmAsmParser.y"
{
yyval.ModuleVal = CurModule.CurrentModule;
;
break;}
case 67:
-#line 617 "llvmAsmParser.y"
+#line 653 "llvmAsmParser.y"
{ yyval.StrVal = 0; ;
break;}
case 68:
-#line 619 "llvmAsmParser.y"
+#line 655 "llvmAsmParser.y"
{
yyval.MethArgVal = new MethodArgument(yyvsp[-1].TypeVal);
if (yyvsp[0].StrVal) { // Was the argument named?
;
break;}
case 69:
-#line 627 "llvmAsmParser.y"
+#line 663 "llvmAsmParser.y"
{
yyval.MethodArgList = yyvsp[0].MethodArgList;
yyvsp[0].MethodArgList->push_front(yyvsp[-2].MethArgVal);
;
break;}
case 70:
-#line 631 "llvmAsmParser.y"
+#line 667 "llvmAsmParser.y"
{
yyval.MethodArgList = new list<MethodArgument*>();
yyval.MethodArgList->push_front(yyvsp[0].MethArgVal);
;
break;}
case 71:
-#line 636 "llvmAsmParser.y"
+#line 672 "llvmAsmParser.y"
{
yyval.MethodArgList = yyvsp[0].MethodArgList;
;
break;}
case 72:
-#line 639 "llvmAsmParser.y"
+#line 675 "llvmAsmParser.y"
{
yyval.MethodArgList = 0;
;
break;}
case 73:
-#line 643 "llvmAsmParser.y"
+#line 679 "llvmAsmParser.y"
{
MethodType::ParamTypes ParamTypeList;
if (yyvsp[-1].MethodArgList)
;
break;}
case 74:
-#line 670 "llvmAsmParser.y"
+#line 706 "llvmAsmParser.y"
{
yyval.MethodVal = CurMeth.CurrentMethod;
;
break;}
case 75:
-#line 674 "llvmAsmParser.y"
+#line 710 "llvmAsmParser.y"
{
yyval.MethodVal = yyvsp[-1].MethodVal;
;
break;}
case 76:
-#line 683 "llvmAsmParser.y"
+#line 719 "llvmAsmParser.y"
{ // A reference to a direct constant
yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val);
;
break;}
case 77:
-#line 686 "llvmAsmParser.y"
+#line 722 "llvmAsmParser.y"
{
yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val);
;
break;}
case 78:
-#line 689 "llvmAsmParser.y"
+#line 725 "llvmAsmParser.y"
{
yyval.ValIDVal = ValID::create((int64_t)1);
;
break;}
case 79:
-#line 692 "llvmAsmParser.y"
+#line 728 "llvmAsmParser.y"
{
yyval.ValIDVal = ValID::create((int64_t)0);
;
break;}
case 80:
-#line 695 "llvmAsmParser.y"
+#line 731 "llvmAsmParser.y"
{ // Quoted strings work too... especially for methods
yyval.ValIDVal = ValID::create_conststr(yyvsp[0].StrVal);
;
break;}
case 81:
-#line 700 "llvmAsmParser.y"
+#line 736 "llvmAsmParser.y"
{ // Is it an integer reference...?
yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal);
;
break;}
case 82:
-#line 703 "llvmAsmParser.y"
+#line 739 "llvmAsmParser.y"
{ // It must be a named reference then...
yyval.ValIDVal = ValID::create(yyvsp[0].StrVal);
;
break;}
case 83:
-#line 706 "llvmAsmParser.y"
+#line 742 "llvmAsmParser.y"
{
yyval.ValIDVal = yyvsp[0].ValIDVal;
;
break;}
case 84:
-#line 713 "llvmAsmParser.y"
+#line 749 "llvmAsmParser.y"
{
Value *D = getVal(Type::TypeTy, yyvsp[0].ValIDVal, true);
if (D == 0) ThrowException("Invalid user defined type: " + yyvsp[0].ValIDVal.getName());
;
break;}
case 85:
-#line 721 "llvmAsmParser.y"
+#line 757 "llvmAsmParser.y"
{ // Method derived type?
MethodType::ParamTypes Params(yyvsp[-1].TypeList->begin(), yyvsp[-1].TypeList->end());
delete yyvsp[-1].TypeList;
- yyval.TypeVal = MethodType::getMethodType(yyvsp[-3].TypeVal, Params);
+ yyval.TypeVal = checkNewType(MethodType::getMethodType(yyvsp[-3].TypeVal, Params));
;
break;}
case 86:
-#line 726 "llvmAsmParser.y"
+#line 762 "llvmAsmParser.y"
{ // Method derived type?
MethodType::ParamTypes Params; // Empty list
- yyval.TypeVal = MethodType::getMethodType(yyvsp[-2].TypeVal, Params);
+ yyval.TypeVal = checkNewType(MethodType::getMethodType(yyvsp[-2].TypeVal, Params));
;
break;}
case 87:
-#line 730 "llvmAsmParser.y"
+#line 766 "llvmAsmParser.y"
{
- yyval.TypeVal = ArrayType::getArrayType(yyvsp[-1].TypeVal);
+ yyval.TypeVal = checkNewType(ArrayType::getArrayType(yyvsp[-1].TypeVal));
;
break;}
case 88:
-#line 733 "llvmAsmParser.y"
+#line 769 "llvmAsmParser.y"
{
- yyval.TypeVal = ArrayType::getArrayType(yyvsp[-1].TypeVal, (int)yyvsp[-3].UInt64Val);
+ yyval.TypeVal = checkNewType(ArrayType::getArrayType(yyvsp[-1].TypeVal, (int)yyvsp[-3].UInt64Val));
;
break;}
case 89:
-#line 736 "llvmAsmParser.y"
+#line 772 "llvmAsmParser.y"
{
StructType::ElementTypes Elements(yyvsp[-1].TypeList->begin(), yyvsp[-1].TypeList->end());
delete yyvsp[-1].TypeList;
- yyval.TypeVal = StructType::getStructType(Elements);
+ yyval.TypeVal = checkNewType(StructType::getStructType(Elements));
;
break;}
case 90:
-#line 741 "llvmAsmParser.y"
+#line 777 "llvmAsmParser.y"
{
- yyval.TypeVal = StructType::getStructType(StructType::ElementTypes());
+ yyval.TypeVal = checkNewType(StructType::getStructType(StructType::ElementTypes()));
;
break;}
case 91:
-#line 744 "llvmAsmParser.y"
+#line 780 "llvmAsmParser.y"
{
- yyval.TypeVal = PointerType::getPointerType(yyvsp[-1].TypeVal);
+ yyval.TypeVal = checkNewType(PointerType::getPointerType(yyvsp[-1].TypeVal));
;
break;}
case 92:
-#line 749 "llvmAsmParser.y"
+#line 785 "llvmAsmParser.y"
{
yyval.TypeList = new list<const Type*>();
yyval.TypeList->push_back(yyvsp[0].TypeVal);
;
break;}
case 93:
-#line 753 "llvmAsmParser.y"
+#line 789 "llvmAsmParser.y"
{
(yyval.TypeList=yyvsp[-2].TypeList)->push_back(yyvsp[0].TypeVal);
;
break;}
case 94:
-#line 758 "llvmAsmParser.y"
+#line 794 "llvmAsmParser.y"
{
yyvsp[-1].MethodVal->getBasicBlocks().push_back(yyvsp[0].BasicBlockVal);
yyval.MethodVal = yyvsp[-1].MethodVal;
;
break;}
case 95:
-#line 762 "llvmAsmParser.y"
+#line 798 "llvmAsmParser.y"
{ // Do not allow methods with 0 basic blocks
yyval.MethodVal = yyvsp[-1].MethodVal; // in them...
yyvsp[-1].MethodVal->getBasicBlocks().push_back(yyvsp[0].BasicBlockVal);
;
break;}
case 96:
-#line 771 "llvmAsmParser.y"
+#line 807 "llvmAsmParser.y"
{
yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal);
InsertValue(yyvsp[-1].BasicBlockVal);
;
break;}
case 97:
-#line 776 "llvmAsmParser.y"
+#line 812 "llvmAsmParser.y"
{
yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal);
yyvsp[-1].BasicBlockVal->setName(yyvsp[-2].StrVal);
;
break;}
case 98:
-#line 785 "llvmAsmParser.y"
+#line 821 "llvmAsmParser.y"
{
yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal);
yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal;
;
break;}
case 99:
-#line 789 "llvmAsmParser.y"
+#line 825 "llvmAsmParser.y"
{
yyval.BasicBlockVal = new BasicBlock();
;
break;}
case 100:
-#line 793 "llvmAsmParser.y"
+#line 829 "llvmAsmParser.y"
{ // Return with a result...
yyval.TermInstVal = new ReturnInst(getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
;
break;}
case 101:
-#line 796 "llvmAsmParser.y"
+#line 832 "llvmAsmParser.y"
{ // Return with no result...
yyval.TermInstVal = new ReturnInst();
;
break;}
case 102:
-#line 799 "llvmAsmParser.y"
+#line 835 "llvmAsmParser.y"
{ // Unconditional Branch...
yyval.TermInstVal = new BranchInst((BasicBlock*)getVal(Type::LabelTy, yyvsp[0].ValIDVal));
;
break;}
case 103:
-#line 802 "llvmAsmParser.y"
+#line 838 "llvmAsmParser.y"
{
yyval.TermInstVal = new BranchInst((BasicBlock*)getVal(Type::LabelTy, yyvsp[-3].ValIDVal),
(BasicBlock*)getVal(Type::LabelTy, yyvsp[0].ValIDVal),
;
break;}
case 104:
-#line 807 "llvmAsmParser.y"
+#line 843 "llvmAsmParser.y"
{
SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].TypeVal, yyvsp[-6].ValIDVal),
(BasicBlock*)getVal(Type::LabelTy, yyvsp[-3].ValIDVal));
;
break;}
case 105:
-#line 818 "llvmAsmParser.y"
+#line 854 "llvmAsmParser.y"
{
yyval.JumpTable = yyvsp[-5].JumpTable;
ConstPoolVal *V = (ConstPoolVal*)getVal(yyvsp[-4].TypeVal, yyvsp[-3].ValIDVal, true);
;
break;}
case 106:
-#line 826 "llvmAsmParser.y"
+#line 862 "llvmAsmParser.y"
{
yyval.JumpTable = new list<pair<ConstPoolVal*, BasicBlock*> >();
ConstPoolVal *V = (ConstPoolVal*)getVal(yyvsp[-4].TypeVal, yyvsp[-3].ValIDVal, true);
;
break;}
case 107:
-#line 836 "llvmAsmParser.y"
+#line 872 "llvmAsmParser.y"
{
if (yyvsp[-1].StrVal) // Is this definition named??
yyvsp[0].InstVal->setName(yyvsp[-1].StrVal); // if so, assign the name...
;
break;}
case 108:
-#line 844 "llvmAsmParser.y"
+#line 880 "llvmAsmParser.y"
{ // Used for PHI nodes
yyval.PHIList = new list<pair<Value*, BasicBlock*> >();
yyval.PHIList->push_back(make_pair(getVal(yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal),
;
break;}
case 109:
-#line 849 "llvmAsmParser.y"
+#line 885 "llvmAsmParser.y"
{
yyval.PHIList = yyvsp[-6].PHIList;
yyvsp[-6].PHIList->push_back(make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal),
;
break;}
case 110:
-#line 856 "llvmAsmParser.y"
+#line 892 "llvmAsmParser.y"
{ // Used for call statements...
yyval.ValueList = new list<Value*>();
yyval.ValueList->push_back(getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
;
break;}
case 111:
-#line 860 "llvmAsmParser.y"
+#line 896 "llvmAsmParser.y"
{
yyval.ValueList = yyvsp[-3].ValueList;
yyvsp[-3].ValueList->push_back(getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
;
break;}
case 113:
-#line 866 "llvmAsmParser.y"
+#line 902 "llvmAsmParser.y"
{ yyval.ValueList = 0; ;
break;}
case 114:
-#line 868 "llvmAsmParser.y"
+#line 904 "llvmAsmParser.y"
{
yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, getVal(yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), getVal(yyvsp[-3].TypeVal, yyvsp[0].ValIDVal));
if (yyval.InstVal == 0)
;
break;}
case 115:
-#line 873 "llvmAsmParser.y"
+#line 909 "llvmAsmParser.y"
{
yyval.InstVal = UnaryOperator::create(yyvsp[-2].UnaryOpVal, getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
if (yyval.InstVal == 0)
;
break;}
case 116:
-#line 878 "llvmAsmParser.y"
+#line 914 "llvmAsmParser.y"
{
if (yyvsp[-1].TypeVal != Type::UByteTy) ThrowException("Shift amount must be ubyte!");
yyval.InstVal = new ShiftInst(yyvsp[-5].OtherOpVal, getVal(yyvsp[-4].TypeVal, yyvsp[-3].ValIDVal), getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
;
break;}
case 117:
-#line 882 "llvmAsmParser.y"
+#line 918 "llvmAsmParser.y"
{
yyval.InstVal = new CastInst(getVal(yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), yyvsp[0].TypeVal);
;
break;}
case 118:
-#line 885 "llvmAsmParser.y"
+#line 921 "llvmAsmParser.y"
{
const Type *Ty = yyvsp[0].PHIList->front().first->getType();
yyval.InstVal = new PHINode(Ty);
;
break;}
case 119:
-#line 896 "llvmAsmParser.y"
+#line 932 "llvmAsmParser.y"
{
if (!yyvsp[-4].TypeVal->isMethodType())
ThrowException("Can only call methods: invalid type '" +
;
break;}
case 120:
-#line 933 "llvmAsmParser.y"
+#line 969 "llvmAsmParser.y"
{
yyval.InstVal = yyvsp[0].InstVal;
;
break;}
case 121:
-#line 938 "llvmAsmParser.y"
+#line 974 "llvmAsmParser.y"
{
yyval.ConstVector = yyvsp[0].ConstVector;
;
break;}
case 122:
-#line 940 "llvmAsmParser.y"
+#line 976 "llvmAsmParser.y"
{
yyval.ConstVector = new vector<ConstPoolVal*>();
;
break;}
case 123:
-#line 944 "llvmAsmParser.y"
+#line 980 "llvmAsmParser.y"
{
- const Type *Ty = PointerType::getPointerType(yyvsp[0].TypeVal);
- addConstValToConstantPool(new ConstPoolType(Ty));
- yyval.InstVal = new MallocInst(Ty);
+ yyval.InstVal = new MallocInst(checkNewType(PointerType::getPointerType(yyvsp[0].TypeVal)));
;
break;}
case 124:
-#line 949 "llvmAsmParser.y"
+#line 983 "llvmAsmParser.y"
{
if (!yyvsp[-3].TypeVal->isArrayType() || ((const ArrayType*)yyvsp[-3].TypeVal)->isSized())
ThrowException("Trying to allocate " + yyvsp[-3].TypeVal->getName() +
" as unsized array!");
- const Type *Ty = PointerType::getPointerType(yyvsp[-3].TypeVal);
- addConstValToConstantPool(new ConstPoolType(Ty));
- Value *ArrSize = getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal);
- yyval.InstVal = new MallocInst(Ty, ArrSize);
+ const Type *Ty = checkNewType(PointerType::getPointerType(yyvsp[-3].TypeVal));
+ yyval.InstVal = new MallocInst(Ty, getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal));
;
break;}
case 125:
-#line 958 "llvmAsmParser.y"
+#line 990 "llvmAsmParser.y"
{
- const Type *Ty = PointerType::getPointerType(yyvsp[0].TypeVal);
- addConstValToConstantPool(new ConstPoolType(Ty));
- yyval.InstVal = new AllocaInst(Ty);
+ yyval.InstVal = new AllocaInst(checkNewType(PointerType::getPointerType(yyvsp[0].TypeVal)));
;
break;}
case 126:
-#line 963 "llvmAsmParser.y"
+#line 993 "llvmAsmParser.y"
{
if (!yyvsp[-3].TypeVal->isArrayType() || ((const ArrayType*)yyvsp[-3].TypeVal)->isSized())
ThrowException("Trying to allocate " + yyvsp[-3].TypeVal->getName() +
" as unsized array!");
- const Type *Ty = PointerType::getPointerType(yyvsp[-3].TypeVal);
- addConstValToConstantPool(new ConstPoolType(Ty));
+ const Type *Ty = checkNewType(PointerType::getPointerType(yyvsp[-3].TypeVal));
Value *ArrSize = getVal(yyvsp[-1].TypeVal, yyvsp[0].ValIDVal);
yyval.InstVal = new AllocaInst(Ty, ArrSize);
;
break;}
case 127:
-#line 972 "llvmAsmParser.y"
+#line 1001 "llvmAsmParser.y"
{
if (!yyvsp[-1].TypeVal->isPointerType())
ThrowException("Trying to free nonpointer type " + yyvsp[-1].TypeVal->getName() + "!");
;
break;}
case 128:
-#line 978 "llvmAsmParser.y"
+#line 1007 "llvmAsmParser.y"
{
if (!yyvsp[-2].TypeVal->isPointerType())
ThrowException("Can't load from nonpointer type: " + yyvsp[-2].TypeVal->getName());
;
break;}
case 129:
-#line 987 "llvmAsmParser.y"
+#line 1016 "llvmAsmParser.y"
{
if (!yyvsp[-2].TypeVal->isPointerType())
ThrowException("Can't store to a nonpointer type: " + yyvsp[-2].TypeVal->getName());
;
break;}
case 130:
-#line 999 "llvmAsmParser.y"
+#line 1028 "llvmAsmParser.y"
{
if (!yyvsp[-2].TypeVal->isPointerType())
ThrowException("getelementptr insn requires pointer operand!");
ThrowException("Can't get element ptr '" + yyvsp[-2].TypeVal->getName() + "'!");
yyval.InstVal = new GetElementPtrInst(getVal(yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal), *yyvsp[0].ConstVector);
delete yyvsp[0].ConstVector;
- addConstValToConstantPool(new ConstPoolType(yyval.InstVal->getType()));
+ checkNewType(yyval.InstVal->getType());
;
break;}
}
}
return 1;
}
-#line 1009 "llvmAsmParser.y"
+#line 1038 "llvmAsmParser.y"
int yyerror(const char *ErrorMsg) {
ThrowException(string("Parse error: ") + ErrorMsg);