There is nothing exclamatory about an error message. No other compiler

or assembler uses ! at the end of every message. We shouldn't either.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33907 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer 2007-02-05 10:16:10 +00:00
parent 9a01353e73
commit f4fa590293

View File

@ -283,7 +283,7 @@ static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
} }
break; break;
default: default:
GenerateError("Internal parser error: Invalid symbol type reference!"); GenerateError("Internal parser error: Invalid symbol type reference");
return 0; return 0;
} }
@ -370,7 +370,7 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
GenerateError("Signed integral constant '" + GenerateError("Signed integral constant '" +
itostr(D.ConstPool64) + "' is invalid for type '" + itostr(D.ConstPool64) + "' is invalid for type '" +
Ty->getDescription() + "'!"); Ty->getDescription() + "'");
return 0; return 0;
} }
return ConstantInt::get(Ty, D.ConstPool64); return ConstantInt::get(Ty, D.ConstPool64);
@ -379,7 +379,7 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
GenerateError("Integral constant '" + utostr(D.UConstPool64) + GenerateError("Integral constant '" + utostr(D.UConstPool64) +
"' is invalid or out of range!"); "' is invalid or out of range");
return 0; return 0;
} else { // This is really a signed reference. Transmogrify. } else { // This is really a signed reference. Transmogrify.
return ConstantInt::get(Ty, D.ConstPool64); return ConstantInt::get(Ty, D.ConstPool64);
@ -390,14 +390,14 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
case ValID::ConstFPVal: // Is it a floating point const pool reference? case ValID::ConstFPVal: // Is it a floating point const pool reference?
if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) { if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) {
GenerateError("FP constant invalid for type!!"); GenerateError("FP constant invalid for type");
return 0; return 0;
} }
return ConstantFP::get(Ty, D.ConstPoolFP); return ConstantFP::get(Ty, D.ConstPoolFP);
case ValID::ConstNullVal: // Is it a null value? case ValID::ConstNullVal: // Is it a null value?
if (!isa<PointerType>(Ty)) { if (!isa<PointerType>(Ty)) {
GenerateError("Cannot create a a non pointer null!"); GenerateError("Cannot create a a non pointer null");
return 0; return 0;
} }
return ConstantPointerNull::get(cast<PointerType>(Ty)); return ConstantPointerNull::get(cast<PointerType>(Ty));
@ -410,7 +410,7 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
case ValID::ConstantVal: // Fully resolved constant? case ValID::ConstantVal: // Fully resolved constant?
if (D.ConstantValue->getType() != Ty) { if (D.ConstantValue->getType() != Ty) {
GenerateError("Constant expression type different from required type!"); GenerateError("Constant expression type different from required type");
return 0; return 0;
} }
return D.ConstantValue; return D.ConstantValue;
@ -420,7 +420,7 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
const FunctionType *FTy = const FunctionType *FTy =
PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0; PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0;
if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) { if (!FTy || !InlineAsm::Verify(FTy, D.IAD->Constraints)) {
GenerateError("Invalid type for asm constraint string!"); GenerateError("Invalid type for asm constraint string");
return 0; return 0;
} }
InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints, InlineAsm *IA = InlineAsm::get(FTy, D.IAD->AsmString, D.IAD->Constraints,
@ -429,11 +429,11 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
return IA; return IA;
} }
default: default:
assert(0 && "Unhandled case!"); assert(0 && "Unhandled case");
return 0; return 0;
} // End of switch } // End of switch
assert(0 && "Unhandled case!"); assert(0 && "Unhandled case");
return 0; return 0;
} }
@ -455,7 +455,7 @@ static Value *getVal(const Type *Ty, const ValID &ID) {
if (TriggerError) return 0; if (TriggerError) return 0;
if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) { if (!Ty->isFirstClassType() && !isa<OpaqueType>(Ty)) {
GenerateError("Invalid use of a composite type!"); GenerateError("Invalid use of a composite type");
return 0; return 0;
} }
@ -484,7 +484,7 @@ static Value *getVal(const Type *Ty, const ValID &ID) {
/// or may not be a forward reference. /// or may not be a forward reference.
/// ///
static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {
assert(inFunctionScope() && "Can't get basic block at global scope!"); assert(inFunctionScope() && "Can't get basic block at global scope");
std::string Name; std::string Name;
BasicBlock *BB = 0; BasicBlock *BB = 0;
@ -573,7 +573,7 @@ ResolveDefinitions(std::map<const Type*,ValueList> &LateResolvers,
std::map<Value*, std::pair<ValID, int> >::iterator PHI = std::map<Value*, std::pair<ValID, int> >::iterator PHI =
CurModule.PlaceHolderInfo.find(V); CurModule.PlaceHolderInfo.find(V);
assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error");
ValID &DID = PHI->second.first; ValID &DID = PHI->second.first;
@ -635,15 +635,15 @@ static void setValueName(Value *V, char *NameStr) {
free(NameStr); // Free old string free(NameStr); // Free old string
if (V->getType() == Type::VoidTy) { if (V->getType() == Type::VoidTy) {
GenerateError("Can't assign name '" + Name+"' to value with void type!"); GenerateError("Can't assign name '" + Name+"' to value with void type");
return; return;
} }
assert(inFunctionScope() && "Must be in function scope!"); assert(inFunctionScope() && "Must be in function scope");
SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable(); SymbolTable &ST = CurFun.CurrentFunction->getValueSymbolTable();
if (ST.lookup(V->getType(), Name)) { if (ST.lookup(V->getType(), Name)) {
GenerateError("Redefinition of value '" + Name + "' of type '" + GenerateError("Redefinition of value '" + Name + "' of type '" +
V->getType()->getDescription() + "'!"); V->getType()->getDescription() + "'");
return; return;
} }
@ -660,7 +660,7 @@ ParseGlobalVariable(char *NameStr,
bool isConstantGlobal, const Type *Ty, bool isConstantGlobal, const Type *Ty,
Constant *Initializer) { Constant *Initializer) {
if (isa<FunctionType>(Ty)) { if (isa<FunctionType>(Ty)) {
GenerateError("Cannot declare global vars of function type!"); GenerateError("Cannot declare global vars of function type");
return 0; return 0;
} }
@ -702,7 +702,7 @@ ParseGlobalVariable(char *NameStr,
// the same as the old one. // the same as the old one.
if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) {
GenerateError("Redefinition of global variable named '" + Name + GenerateError("Redefinition of global variable named '" + Name +
"' of type '" + Ty->getDescription() + "'!"); "' of type '" + Ty->getDescription() + "'");
return 0; return 0;
} }
} }
@ -724,7 +724,7 @@ ParseGlobalVariable(char *NameStr,
// allowed to be redefined in the specified context. If the name is a new name // allowed to be redefined in the specified context. If the name is a new name
// for the type plane, it is inserted and false is returned. // for the type plane, it is inserted and false is returned.
static bool setTypeName(const Type *T, char *NameStr) { static bool setTypeName(const Type *T, char *NameStr) {
assert(!inFunctionScope() && "Can't give types function-local names!"); assert(!inFunctionScope() && "Can't give types function-local names");
if (NameStr == 0) return false; if (NameStr == 0) return false;
std::string Name(NameStr); // Copy string std::string Name(NameStr); // Copy string
@ -732,7 +732,7 @@ static bool setTypeName(const Type *T, char *NameStr) {
// We don't allow assigning names to void type // We don't allow assigning names to void type
if (T == Type::VoidTy) { if (T == Type::VoidTy) {
GenerateError("Can't assign name '" + Name + "' to the void type!"); GenerateError("Can't assign name '" + Name + "' to the void type");
return false; return false;
} }
@ -759,7 +759,7 @@ static bool setTypeName(const Type *T, char *NameStr) {
// Any other kind of (non-equivalent) redefinition is an error. // Any other kind of (non-equivalent) redefinition is an error.
GenerateError("Redefinition of type named '" + Name + "' of type '" + GenerateError("Redefinition of type named '" + Name + "' of type '" +
T->getDescription() + "'!"); T->getDescription() + "'");
} }
return false; return false;
@ -1126,7 +1126,7 @@ OptCallingConv : /*empty*/ { $$ = CallingConv::C; } |
X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } | X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } |
CC_TOK EUINT64VAL { CC_TOK EUINT64VAL {
if ((unsigned)$2 != $2) if ((unsigned)$2 != $2)
GEN_ERROR("Calling conv too large!"); GEN_ERROR("Calling conv too large");
$$ = $2; $$ = $2;
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1159,14 +1159,14 @@ OptAlign : /*empty*/ { $$ = 0; } |
ALIGN EUINT64VAL { ALIGN EUINT64VAL {
$$ = $2; $$ = $2;
if ($$ != 0 && !isPowerOf2_32($$)) if ($$ != 0 && !isPowerOf2_32($$))
GEN_ERROR("Alignment must be a power of two!"); GEN_ERROR("Alignment must be a power of two");
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
OptCAlign : /*empty*/ { $$ = 0; } | OptCAlign : /*empty*/ { $$ = 0; } |
',' ALIGN EUINT64VAL { ',' ALIGN EUINT64VAL {
$$ = $3; $$ = $3;
if ($$ != 0 && !isPowerOf2_32($$)) if ($$ != 0 && !isPowerOf2_32($$))
GEN_ERROR("Alignment must be a power of two!"); GEN_ERROR("Alignment must be a power of two");
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1174,7 +1174,7 @@ OptCAlign : /*empty*/ { $$ = 0; } |
SectionString : SECTION STRINGCONSTANT { SectionString : SECTION STRINGCONSTANT {
for (unsigned i = 0, e = strlen($2); i != e; ++i) for (unsigned i = 0, e = strlen($2); i != e; ++i)
if ($2[i] == '"' || $2[i] == '\\') if ($2[i] == '"' || $2[i] == '\\')
GEN_ERROR("Invalid character in section name!"); GEN_ERROR("Invalid character in section name");
$$ = $2; $$ = $2;
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1194,7 +1194,7 @@ GlobalVarAttribute : SectionString {
} }
| ALIGN EUINT64VAL { | ALIGN EUINT64VAL {
if ($2 != 0 && !isPowerOf2_32($2)) if ($2 != 0 && !isPowerOf2_32($2))
GEN_ERROR("Alignment must be a power of two!"); GEN_ERROR("Alignment must be a power of two");
CurGV->setAlignment($2); CurGV->setAlignment($2);
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1229,7 +1229,7 @@ Types
$$ = new PATypeHolder(tmp); $$ = new PATypeHolder(tmp);
} }
| '\\' EUINT64VAL { // Type UpReference | '\\' EUINT64VAL { // Type UpReference
if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range!"); if ($2 > (uint64_t)~0U) GEN_ERROR("Value out of range");
OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder
UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector... UpRefs.push_back(UpRefRecord((unsigned)$2, OT)); // Add to vector...
$$ = new PATypeHolder(OT); $$ = new PATypeHolder(OT);
@ -1284,7 +1284,7 @@ Types
if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger()) if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger())
GEN_ERROR("Element type of a PackedType must be primitive"); GEN_ERROR("Element type of a PackedType must be primitive");
if (!isPowerOf2_32($2)) if (!isPowerOf2_32($2))
GEN_ERROR("Vector length should be a power of 2!"); GEN_ERROR("Vector length should be a power of 2");
$$ = new PATypeHolder(HandleUpRefs(PackedType::get(*$4, (unsigned)$2))); $$ = new PATypeHolder(HandleUpRefs(PackedType::get(*$4, (unsigned)$2)));
delete $4; delete $4;
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -1331,7 +1331,7 @@ ResultTypes
if (!UpRefs.empty()) if (!UpRefs.empty())
GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
if (!(*$1)->isFirstClassType()) if (!(*$1)->isFirstClassType())
GEN_ERROR("LLVM functions cannot return aggregate types!"); GEN_ERROR("LLVM functions cannot return aggregate types");
$$ = $1; $$ = $1;
} }
| VOID { | VOID {
@ -1396,7 +1396,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const ArrayType *ATy = dyn_cast<ArrayType>($1->get()); const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
if (ATy == 0) if (ATy == 0)
GEN_ERROR("Cannot make array constant with type: '" + GEN_ERROR("Cannot make array constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
const Type *ETy = ATy->getElementType(); const Type *ETy = ATy->getElementType();
int NumElements = ATy->getNumElements(); int NumElements = ATy->getNumElements();
@ -1404,7 +1404,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
if (NumElements != -1 && NumElements != (int)$3->size()) if (NumElements != -1 && NumElements != (int)$3->size())
GEN_ERROR("Type mismatch: constant sized array initialized with " + GEN_ERROR("Type mismatch: constant sized array initialized with " +
utostr($3->size()) + " arguments, but has size of " + utostr($3->size()) + " arguments, but has size of " +
itostr(NumElements) + "!"); itostr(NumElements) + "");
// Verify all elements are correct type! // Verify all elements are correct type!
for (unsigned i = 0; i < $3->size(); i++) { for (unsigned i = 0; i < $3->size(); i++) {
@ -1424,12 +1424,12 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const ArrayType *ATy = dyn_cast<ArrayType>($1->get()); const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
if (ATy == 0) if (ATy == 0)
GEN_ERROR("Cannot make array constant with type: '" + GEN_ERROR("Cannot make array constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
int NumElements = ATy->getNumElements(); int NumElements = ATy->getNumElements();
if (NumElements != -1 && NumElements != 0) if (NumElements != -1 && NumElements != 0)
GEN_ERROR("Type mismatch: constant sized array initialized with 0" GEN_ERROR("Type mismatch: constant sized array initialized with 0"
" arguments, but has size of " + itostr(NumElements) +"!"); " arguments, but has size of " + itostr(NumElements) +"");
$$ = ConstantArray::get(ATy, std::vector<Constant*>()); $$ = ConstantArray::get(ATy, std::vector<Constant*>());
delete $1; delete $1;
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -1440,7 +1440,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const ArrayType *ATy = dyn_cast<ArrayType>($1->get()); const ArrayType *ATy = dyn_cast<ArrayType>($1->get());
if (ATy == 0) if (ATy == 0)
GEN_ERROR("Cannot make array constant with type: '" + GEN_ERROR("Cannot make array constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
int NumElements = ATy->getNumElements(); int NumElements = ATy->getNumElements();
const Type *ETy = ATy->getElementType(); const Type *ETy = ATy->getElementType();
@ -1448,7 +1448,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
if (NumElements != -1 && NumElements != (EndStr-$3)) if (NumElements != -1 && NumElements != (EndStr-$3))
GEN_ERROR("Can't build string constant of size " + GEN_ERROR("Can't build string constant of size " +
itostr((int)(EndStr-$3)) + itostr((int)(EndStr-$3)) +
" when array has size " + itostr(NumElements) + "!"); " when array has size " + itostr(NumElements) + "");
std::vector<Constant*> Vals; std::vector<Constant*> Vals;
if (ETy == Type::Int8Ty) { if (ETy == Type::Int8Ty) {
for (unsigned char *C = (unsigned char *)$3; for (unsigned char *C = (unsigned char *)$3;
@ -1456,7 +1456,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
Vals.push_back(ConstantInt::get(ETy, *C)); Vals.push_back(ConstantInt::get(ETy, *C));
} else { } else {
free($3); free($3);
GEN_ERROR("Cannot build string arrays of non byte sized elements!"); GEN_ERROR("Cannot build string arrays of non byte sized elements");
} }
free($3); free($3);
$$ = ConstantArray::get(ATy, Vals); $$ = ConstantArray::get(ATy, Vals);
@ -1469,7 +1469,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const PackedType *PTy = dyn_cast<PackedType>($1->get()); const PackedType *PTy = dyn_cast<PackedType>($1->get());
if (PTy == 0) if (PTy == 0)
GEN_ERROR("Cannot make packed constant with type: '" + GEN_ERROR("Cannot make packed constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
const Type *ETy = PTy->getElementType(); const Type *ETy = PTy->getElementType();
int NumElements = PTy->getNumElements(); int NumElements = PTy->getNumElements();
@ -1477,7 +1477,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
if (NumElements != -1 && NumElements != (int)$3->size()) if (NumElements != -1 && NumElements != (int)$3->size())
GEN_ERROR("Type mismatch: constant sized packed initialized with " + GEN_ERROR("Type mismatch: constant sized packed initialized with " +
utostr($3->size()) + " arguments, but has size of " + utostr($3->size()) + " arguments, but has size of " +
itostr(NumElements) + "!"); itostr(NumElements) + "");
// Verify all elements are correct type! // Verify all elements are correct type!
for (unsigned i = 0; i < $3->size(); i++) { for (unsigned i = 0; i < $3->size(); i++) {
@ -1495,10 +1495,10 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const StructType *STy = dyn_cast<StructType>($1->get()); const StructType *STy = dyn_cast<StructType>($1->get());
if (STy == 0) if (STy == 0)
GEN_ERROR("Cannot make struct constant with type: '" + GEN_ERROR("Cannot make struct constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
if ($3->size() != STy->getNumContainedTypes()) if ($3->size() != STy->getNumContainedTypes())
GEN_ERROR("Illegal number of initializers for structure type!"); GEN_ERROR("Illegal number of initializers for structure type");
// Check to ensure that constants are compatible with the type initializer! // Check to ensure that constants are compatible with the type initializer!
for (unsigned i = 0, e = $3->size(); i != e; ++i) for (unsigned i = 0, e = $3->size(); i != e; ++i)
@ -1506,7 +1506,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
GEN_ERROR("Expected type '" + GEN_ERROR("Expected type '" +
STy->getElementType(i)->getDescription() + STy->getElementType(i)->getDescription() +
"' for element #" + utostr(i) + "' for element #" + utostr(i) +
" of structure initializer!"); " of structure initializer");
// Check to ensure that Type is not packed // Check to ensure that Type is not packed
if (STy->isPacked()) if (STy->isPacked())
@ -1522,10 +1522,10 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const StructType *STy = dyn_cast<StructType>($1->get()); const StructType *STy = dyn_cast<StructType>($1->get());
if (STy == 0) if (STy == 0)
GEN_ERROR("Cannot make struct constant with type: '" + GEN_ERROR("Cannot make struct constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
if (STy->getNumContainedTypes() != 0) if (STy->getNumContainedTypes() != 0)
GEN_ERROR("Illegal number of initializers for structure type!"); GEN_ERROR("Illegal number of initializers for structure type");
// Check to ensure that Type is not packed // Check to ensure that Type is not packed
if (STy->isPacked()) if (STy->isPacked())
@ -1539,10 +1539,10 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const StructType *STy = dyn_cast<StructType>($1->get()); const StructType *STy = dyn_cast<StructType>($1->get());
if (STy == 0) if (STy == 0)
GEN_ERROR("Cannot make struct constant with type: '" + GEN_ERROR("Cannot make struct constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
if ($4->size() != STy->getNumContainedTypes()) if ($4->size() != STy->getNumContainedTypes())
GEN_ERROR("Illegal number of initializers for structure type!"); GEN_ERROR("Illegal number of initializers for structure type");
// Check to ensure that constants are compatible with the type initializer! // Check to ensure that constants are compatible with the type initializer!
for (unsigned i = 0, e = $4->size(); i != e; ++i) for (unsigned i = 0, e = $4->size(); i != e; ++i)
@ -1550,7 +1550,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
GEN_ERROR("Expected type '" + GEN_ERROR("Expected type '" +
STy->getElementType(i)->getDescription() + STy->getElementType(i)->getDescription() +
"' for element #" + utostr(i) + "' for element #" + utostr(i) +
" of structure initializer!"); " of structure initializer");
// Check to ensure that Type is packed // Check to ensure that Type is packed
if (!STy->isPacked()) if (!STy->isPacked())
@ -1566,10 +1566,10 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const StructType *STy = dyn_cast<StructType>($1->get()); const StructType *STy = dyn_cast<StructType>($1->get());
if (STy == 0) if (STy == 0)
GEN_ERROR("Cannot make struct constant with type: '" + GEN_ERROR("Cannot make struct constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
if (STy->getNumContainedTypes() != 0) if (STy->getNumContainedTypes() != 0)
GEN_ERROR("Illegal number of initializers for structure type!"); GEN_ERROR("Illegal number of initializers for structure type");
// Check to ensure that Type is packed // Check to ensure that Type is packed
if (!STy->isPacked()) if (!STy->isPacked())
@ -1585,7 +1585,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
const PointerType *PTy = dyn_cast<PointerType>($1->get()); const PointerType *PTy = dyn_cast<PointerType>($1->get());
if (PTy == 0) if (PTy == 0)
GEN_ERROR("Cannot make null pointer constant with type: '" + GEN_ERROR("Cannot make null pointer constant with type: '" +
(*$1)->getDescription() + "'!"); (*$1)->getDescription() + "'");
$$ = ConstantPointerNull::get(PTy); $$ = ConstantPointerNull::get(PTy);
delete $1; delete $1;
@ -1603,7 +1603,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
const PointerType *Ty = dyn_cast<PointerType>($1->get()); const PointerType *Ty = dyn_cast<PointerType>($1->get());
if (Ty == 0) if (Ty == 0)
GEN_ERROR("Global const reference must be a pointer type!"); GEN_ERROR("Global const reference must be a pointer type");
// ConstExprs can exist in the body of a function, thus creating // ConstExprs can exist in the body of a function, thus creating
// GlobalValues whenever they refer to a variable. Because we are in // GlobalValues whenever they refer to a variable. Because we are in
@ -1625,7 +1625,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
// in the future with the right type of variable. // in the future with the right type of variable.
// //
if (V == 0) { if (V == 0) {
assert(isa<PointerType>(Ty) && "Globals may only be used as pointers!"); assert(isa<PointerType>(Ty) && "Globals may only be used as pointers");
const PointerType *PT = cast<PointerType>(Ty); const PointerType *PT = cast<PointerType>(Ty);
// First check to see if the forward references value is already created! // First check to see if the forward references value is already created!
@ -1679,20 +1679,20 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
const Type *Ty = $1->get(); const Type *Ty = $1->get();
if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty)) if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
GEN_ERROR("Cannot create a null initialized value of this type!"); GEN_ERROR("Cannot create a null initialized value of this type");
$$ = Constant::getNullValue(Ty); $$ = Constant::getNullValue(Ty);
delete $1; delete $1;
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| IntType ESINT64VAL { // integral constants | IntType ESINT64VAL { // integral constants
if (!ConstantInt::isValueValidForType($1, $2)) if (!ConstantInt::isValueValidForType($1, $2))
GEN_ERROR("Constant value doesn't fit in type!"); GEN_ERROR("Constant value doesn't fit in type");
$$ = ConstantInt::get($1, $2); $$ = ConstantInt::get($1, $2);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| IntType EUINT64VAL { // integral constants | IntType EUINT64VAL { // integral constants
if (!ConstantInt::isValueValidForType($1, $2)) if (!ConstantInt::isValueValidForType($1, $2))
GEN_ERROR("Constant value doesn't fit in type!"); GEN_ERROR("Constant value doesn't fit in type");
$$ = ConstantInt::get($1, $2); $$ = ConstantInt::get($1, $2);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
@ -1708,7 +1708,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
} }
| FPType FPVAL { // Float & Double constants | FPType FPVAL { // Float & Double constants
if (!ConstantFP::isValueValidForType($1, $2)) if (!ConstantFP::isValueValidForType($1, $2))
GEN_ERROR("Floating point constant invalid for type!!"); GEN_ERROR("Floating point constant invalid for type");
$$ = ConstantFP::get($1, $2); $$ = ConstantFP::get($1, $2);
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1722,25 +1722,25 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' {
if (!CastInst::castIsValid($1, $3, DestTy)) if (!CastInst::castIsValid($1, $3, DestTy))
GEN_ERROR("invalid cast opcode for cast from '" + GEN_ERROR("invalid cast opcode for cast from '" +
Val->getType()->getDescription() + "' to '" + Val->getType()->getDescription() + "' to '" +
DestTy->getDescription() + "'!"); DestTy->getDescription() + "'");
$$ = ConstantExpr::getCast($1, $3, DestTy); $$ = ConstantExpr::getCast($1, $3, DestTy);
delete $5; delete $5;
} }
| GETELEMENTPTR '(' ConstVal IndexList ')' { | GETELEMENTPTR '(' ConstVal IndexList ')' {
if (!isa<PointerType>($3->getType())) if (!isa<PointerType>($3->getType()))
GEN_ERROR("GetElementPtr requires a pointer operand!"); GEN_ERROR("GetElementPtr requires a pointer operand");
const Type *IdxTy = const Type *IdxTy =
GetElementPtrInst::getIndexedType($3->getType(), *$4, true); GetElementPtrInst::getIndexedType($3->getType(), *$4, true);
if (!IdxTy) if (!IdxTy)
GEN_ERROR("Index list invalid for constant getelementptr!"); GEN_ERROR("Index list invalid for constant getelementptr");
SmallVector<Constant*, 8> IdxVec; SmallVector<Constant*, 8> IdxVec;
for (unsigned i = 0, e = $4->size(); i != e; ++i) for (unsigned i = 0, e = $4->size(); i != e; ++i)
if (Constant *C = dyn_cast<Constant>((*$4)[i])) if (Constant *C = dyn_cast<Constant>((*$4)[i]))
IdxVec.push_back(C); IdxVec.push_back(C);
else else
GEN_ERROR("Indices to constant getelementptr must be constants!"); GEN_ERROR("Indices to constant getelementptr must be constants");
delete $4; delete $4;
@ -1749,54 +1749,54 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' {
} }
| SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' { | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
if ($3->getType() != Type::Int1Ty) if ($3->getType() != Type::Int1Ty)
GEN_ERROR("Select condition must be of boolean type!"); GEN_ERROR("Select condition must be of boolean type");
if ($5->getType() != $7->getType()) if ($5->getType() != $7->getType())
GEN_ERROR("Select operand types must match!"); GEN_ERROR("Select operand types must match");
$$ = ConstantExpr::getSelect($3, $5, $7); $$ = ConstantExpr::getSelect($3, $5, $7);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| ArithmeticOps '(' ConstVal ',' ConstVal ')' { | ArithmeticOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType()) if ($3->getType() != $5->getType())
GEN_ERROR("Binary operator types must match!"); GEN_ERROR("Binary operator types must match");
CHECK_FOR_ERROR; CHECK_FOR_ERROR;
$$ = ConstantExpr::get($1, $3, $5); $$ = ConstantExpr::get($1, $3, $5);
} }
| LogicalOps '(' ConstVal ',' ConstVal ')' { | LogicalOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType()) if ($3->getType() != $5->getType())
GEN_ERROR("Logical operator types must match!"); GEN_ERROR("Logical operator types must match");
if (!$3->getType()->isInteger()) { if (!$3->getType()->isInteger()) {
if (Instruction::isShift($1) || !isa<PackedType>($3->getType()) || if (Instruction::isShift($1) || !isa<PackedType>($3->getType()) ||
!cast<PackedType>($3->getType())->getElementType()->isInteger()) !cast<PackedType>($3->getType())->getElementType()->isInteger())
GEN_ERROR("Logical operator requires integral operands!"); GEN_ERROR("Logical operator requires integral operands");
} }
$$ = ConstantExpr::get($1, $3, $5); $$ = ConstantExpr::get($1, $3, $5);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| ICMP IPredicates '(' ConstVal ',' ConstVal ')' { | ICMP IPredicates '(' ConstVal ',' ConstVal ')' {
if ($4->getType() != $6->getType()) if ($4->getType() != $6->getType())
GEN_ERROR("icmp operand types must match!"); GEN_ERROR("icmp operand types must match");
$$ = ConstantExpr::getICmp($2, $4, $6); $$ = ConstantExpr::getICmp($2, $4, $6);
} }
| FCMP FPredicates '(' ConstVal ',' ConstVal ')' { | FCMP FPredicates '(' ConstVal ',' ConstVal ')' {
if ($4->getType() != $6->getType()) if ($4->getType() != $6->getType())
GEN_ERROR("fcmp operand types must match!"); GEN_ERROR("fcmp operand types must match");
$$ = ConstantExpr::getFCmp($2, $4, $6); $$ = ConstantExpr::getFCmp($2, $4, $6);
} }
| EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' { | EXTRACTELEMENT '(' ConstVal ',' ConstVal ')' {
if (!ExtractElementInst::isValidOperands($3, $5)) if (!ExtractElementInst::isValidOperands($3, $5))
GEN_ERROR("Invalid extractelement operands!"); GEN_ERROR("Invalid extractelement operands");
$$ = ConstantExpr::getExtractElement($3, $5); $$ = ConstantExpr::getExtractElement($3, $5);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' { | INSERTELEMENT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
if (!InsertElementInst::isValidOperands($3, $5, $7)) if (!InsertElementInst::isValidOperands($3, $5, $7))
GEN_ERROR("Invalid insertelement operands!"); GEN_ERROR("Invalid insertelement operands");
$$ = ConstantExpr::getInsertElement($3, $5, $7); $$ = ConstantExpr::getInsertElement($3, $5, $7);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' { | SHUFFLEVECTOR '(' ConstVal ',' ConstVal ',' ConstVal ')' {
if (!ShuffleVectorInst::isValidOperands($3, $5, $7)) if (!ShuffleVectorInst::isValidOperands($3, $5, $7))
GEN_ERROR("Invalid shufflevector operands!"); GEN_ERROR("Invalid shufflevector operands");
$$ = ConstantExpr::getShuffleVector($3, $5, $7); $$ = ConstantExpr::getShuffleVector($3, $5, $7);
CHECK_FOR_ERROR CHECK_FOR_ERROR
}; };
@ -1904,7 +1904,7 @@ Definition
| OptGlobalAssign GVVisibilityStyle GlobalType ConstVal { | OptGlobalAssign GVVisibilityStyle GlobalType ConstVal {
/* "Externally Visible" Linkage */ /* "Externally Visible" Linkage */
if ($4 == 0) if ($4 == 0)
GEN_ERROR("Global value initializer is not a constant!"); GEN_ERROR("Global value initializer is not a constant");
CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage, CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage,
$2, $3, $4->getType(), $4); $2, $3, $4->getType(), $4);
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -1913,7 +1913,7 @@ Definition
} }
| OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal { | OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal {
if ($5 == 0) if ($5 == 0)
GEN_ERROR("Global value initializer is not a constant!"); GEN_ERROR("Global value initializer is not a constant");
CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5); CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} GlobalVarAttributes { } GlobalVarAttributes {
@ -1985,7 +1985,7 @@ ArgListH : ArgListH ',' Types OptParamAttrs OptLocalName {
if (!UpRefs.empty()) if (!UpRefs.empty())
GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
if (*$3 == Type::VoidTy) if (*$3 == Type::VoidTy)
GEN_ERROR("void typed arguments are invalid!"); GEN_ERROR("void typed arguments are invalid");
ArgListEntry E; E.Attrs = $4; E.Ty = $3; E.Name = $5; ArgListEntry E; E.Attrs = $4; E.Ty = $3; E.Name = $5;
$$ = $1; $$ = $1;
$1->push_back(E); $1->push_back(E);
@ -1995,7 +1995,7 @@ ArgListH : ArgListH ',' Types OptParamAttrs OptLocalName {
if (!UpRefs.empty()) if (!UpRefs.empty())
GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription());
if (*$1 == Type::VoidTy) if (*$1 == Type::VoidTy)
GEN_ERROR("void typed arguments are invalid!"); GEN_ERROR("void typed arguments are invalid");
ArgListEntry E; E.Attrs = $2; E.Ty = $1; E.Name = $3; ArgListEntry E; E.Attrs = $2; E.Ty = $1; E.Name = $3;
$$ = new ArgListType; $$ = new ArgListType;
$$->push_back(E); $$->push_back(E);
@ -2082,7 +2082,7 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
// If this is the case, either we need to be a forward decl, or it needs // If this is the case, either we need to be a forward decl, or it needs
// to be. // to be.
if (!CurFun.isDeclare && !Fn->isDeclaration()) if (!CurFun.isDeclare && !Fn->isDeclaration())
GEN_ERROR("Redefinition of function '" + FunctionName + "'!"); GEN_ERROR("Redefinition of function '" + FunctionName + "'");
// Make sure to strip off any argument names so we can't get conflicts. // Make sure to strip off any argument names so we can't get conflicts.
if (Fn->isDeclaration()) if (Fn->isDeclaration())
@ -2116,7 +2116,7 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
if ($5) { // Is null if empty... if ($5) { // Is null if empty...
if (isVarArg) { // Nuke the last entry if (isVarArg) { // Nuke the last entry
assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&& assert($5->back().Ty->get() == Type::VoidTy && $5->back().Name == 0&&
"Not a varargs marker!"); "Not a varargs marker");
delete $5->back().Ty; delete $5->back().Ty;
$5->pop_back(); // Delete the last entry $5->pop_back(); // Delete the last entry
} }
@ -2377,7 +2377,7 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first)) if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
S->addCase(CI, I->second); S->addCase(CI, I->second);
else else
GEN_ERROR("Switch case is constant, but not a simple integer!"); GEN_ERROR("Switch case is constant, but not a simple integer");
} }
delete $8; delete $8;
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -2428,7 +2428,7 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
// Make sure no arguments is a good thing! // Make sure no arguments is a good thing!
if (Ty->getNumParams() != 0) if (Ty->getNumParams() != 0)
GEN_ERROR("No arguments passed to a function that " GEN_ERROR("No arguments passed to a function that "
"expects arguments!"); "expects arguments");
} else { // Has arguments? } else { // Has arguments?
// Loop through FunctionType's arguments and ensure they are specified // Loop through FunctionType's arguments and ensure they are specified
// correctly! // correctly!
@ -2439,7 +2439,7 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
for (; ArgI != ArgE && I != E; ++ArgI, ++I) { for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
if (ArgI->Val->getType() != *I) if (ArgI->Val->getType() != *I)
GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
(*I)->getDescription() + "'!"); (*I)->getDescription() + "'");
Args.push_back(ArgI->Val); Args.push_back(ArgI->Val);
} }
@ -2448,7 +2448,7 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
for (; ArgI != ArgE; ++ArgI) for (; ArgI != ArgE; ++ArgI)
Args.push_back(ArgI->Val); // push the remaining varargs Args.push_back(ArgI->Val); // push the remaining varargs
} else if (I != E || ArgI != ArgE) } else if (I != E || ArgI != ArgE)
GEN_ERROR("Invalid number of parameters detected!"); GEN_ERROR("Invalid number of parameters detected");
} }
// Create the InvokeInst // Create the InvokeInst
@ -2474,7 +2474,7 @@ JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
Constant *V = cast<Constant>(getValNonImprovising($2, $3)); Constant *V = cast<Constant>(getValNonImprovising($2, $3));
CHECK_FOR_ERROR CHECK_FOR_ERROR
if (V == 0) if (V == 0)
GEN_ERROR("May only switch on a constant pool value!"); GEN_ERROR("May only switch on a constant pool value");
BasicBlock* tmpBB = getBBVal($6); BasicBlock* tmpBB = getBBVal($6);
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -2486,7 +2486,7 @@ JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
CHECK_FOR_ERROR CHECK_FOR_ERROR
if (V == 0) if (V == 0)
GEN_ERROR("May only switch on a constant pool value!"); GEN_ERROR("May only switch on a constant pool value");
BasicBlock* tmpBB = getBBVal($5); BasicBlock* tmpBB = getBBVal($5);
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -2565,19 +2565,19 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() && if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() &&
!isa<PackedType>((*$2).get())) !isa<PackedType>((*$2).get()))
GEN_ERROR( GEN_ERROR(
"Arithmetic operator requires integer, FP, or packed operands!"); "Arithmetic operator requires integer, FP, or packed operands");
if (isa<PackedType>((*$2).get()) && if (isa<PackedType>((*$2).get()) &&
($1 == Instruction::URem || ($1 == Instruction::URem ||
$1 == Instruction::SRem || $1 == Instruction::SRem ||
$1 == Instruction::FRem)) $1 == Instruction::FRem))
GEN_ERROR("U/S/FRem not supported on packed types!"); GEN_ERROR("U/S/FRem not supported on packed types");
Value* val1 = getVal(*$2, $3); Value* val1 = getVal(*$2, $3);
CHECK_FOR_ERROR CHECK_FOR_ERROR
Value* val2 = getVal(*$2, $5); Value* val2 = getVal(*$2, $5);
CHECK_FOR_ERROR CHECK_FOR_ERROR
$$ = BinaryOperator::create($1, val1, val2); $$ = BinaryOperator::create($1, val1, val2);
if ($$ == 0) if ($$ == 0)
GEN_ERROR("binary operator returned null!"); GEN_ERROR("binary operator returned null");
delete $2; delete $2;
} }
| LogicalOps Types ValueRef ',' ValueRef { | LogicalOps Types ValueRef ',' ValueRef {
@ -2586,7 +2586,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
if (!(*$2)->isInteger()) { if (!(*$2)->isInteger()) {
if (Instruction::isShift($1) || !isa<PackedType>($2->get()) || if (Instruction::isShift($1) || !isa<PackedType>($2->get()) ||
!cast<PackedType>($2->get())->getElementType()->isInteger()) !cast<PackedType>($2->get())->getElementType()->isInteger())
GEN_ERROR("Logical operator requires integral operands!"); GEN_ERROR("Logical operator requires integral operands");
} }
Value* tmpVal1 = getVal(*$2, $3); Value* tmpVal1 = getVal(*$2, $3);
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -2594,7 +2594,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
CHECK_FOR_ERROR CHECK_FOR_ERROR
$$ = BinaryOperator::create($1, tmpVal1, tmpVal2); $$ = BinaryOperator::create($1, tmpVal1, tmpVal2);
if ($$ == 0) if ($$ == 0)
GEN_ERROR("binary operator returned null!"); GEN_ERROR("binary operator returned null");
delete $2; delete $2;
} }
| ICMP IPredicates Types ValueRef ',' ValueRef { | ICMP IPredicates Types ValueRef ',' ValueRef {
@ -2608,7 +2608,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
CHECK_FOR_ERROR CHECK_FOR_ERROR
$$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
if ($$ == 0) if ($$ == 0)
GEN_ERROR("icmp operator returned null!"); GEN_ERROR("icmp operator returned null");
} }
| FCMP FPredicates Types ValueRef ',' ValueRef { | FCMP FPredicates Types ValueRef ',' ValueRef {
if (!UpRefs.empty()) if (!UpRefs.empty())
@ -2621,7 +2621,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
CHECK_FOR_ERROR CHECK_FOR_ERROR
$$ = CmpInst::create($1, $2, tmpVal1, tmpVal2); $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
if ($$ == 0) if ($$ == 0)
GEN_ERROR("fcmp operator returned null!"); GEN_ERROR("fcmp operator returned null");
} }
| CastOps ResolvedVal TO Types { | CastOps ResolvedVal TO Types {
if (!UpRefs.empty()) if (!UpRefs.empty())
@ -2631,15 +2631,15 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
if (!CastInst::castIsValid($1, Val, DestTy)) if (!CastInst::castIsValid($1, Val, DestTy))
GEN_ERROR("invalid cast opcode for cast from '" + GEN_ERROR("invalid cast opcode for cast from '" +
Val->getType()->getDescription() + "' to '" + Val->getType()->getDescription() + "' to '" +
DestTy->getDescription() + "'!"); DestTy->getDescription() + "'");
$$ = CastInst::create($1, Val, DestTy); $$ = CastInst::create($1, Val, DestTy);
delete $4; delete $4;
} }
| SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal { | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
if ($2->getType() != Type::Int1Ty) if ($2->getType() != Type::Int1Ty)
GEN_ERROR("select condition must be boolean!"); GEN_ERROR("select condition must be boolean");
if ($4->getType() != $6->getType()) if ($4->getType() != $6->getType())
GEN_ERROR("select value types should match!"); GEN_ERROR("select value types should match");
$$ = new SelectInst($2, $4, $6); $$ = new SelectInst($2, $4, $6);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
@ -2652,31 +2652,31 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
} }
| EXTRACTELEMENT ResolvedVal ',' ResolvedVal { | EXTRACTELEMENT ResolvedVal ',' ResolvedVal {
if (!ExtractElementInst::isValidOperands($2, $4)) if (!ExtractElementInst::isValidOperands($2, $4))
GEN_ERROR("Invalid extractelement operands!"); GEN_ERROR("Invalid extractelement operands");
$$ = new ExtractElementInst($2, $4); $$ = new ExtractElementInst($2, $4);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal { | INSERTELEMENT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
if (!InsertElementInst::isValidOperands($2, $4, $6)) if (!InsertElementInst::isValidOperands($2, $4, $6))
GEN_ERROR("Invalid insertelement operands!"); GEN_ERROR("Invalid insertelement operands");
$$ = new InsertElementInst($2, $4, $6); $$ = new InsertElementInst($2, $4, $6);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal { | SHUFFLEVECTOR ResolvedVal ',' ResolvedVal ',' ResolvedVal {
if (!ShuffleVectorInst::isValidOperands($2, $4, $6)) if (!ShuffleVectorInst::isValidOperands($2, $4, $6))
GEN_ERROR("Invalid shufflevector operands!"); GEN_ERROR("Invalid shufflevector operands");
$$ = new ShuffleVectorInst($2, $4, $6); $$ = new ShuffleVectorInst($2, $4, $6);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
| PHI_TOK PHIList { | PHI_TOK PHIList {
const Type *Ty = $2->front().first->getType(); const Type *Ty = $2->front().first->getType();
if (!Ty->isFirstClassType()) if (!Ty->isFirstClassType())
GEN_ERROR("PHI node operands must be of first class type!"); GEN_ERROR("PHI node operands must be of first class type");
$$ = new PHINode(Ty); $$ = new PHINode(Ty);
((PHINode*)$$)->reserveOperandSpace($2->size()); ((PHINode*)$$)->reserveOperandSpace($2->size());
while ($2->begin() != $2->end()) { while ($2->begin() != $2->end()) {
if ($2->front().first->getType() != Ty) if ($2->front().first->getType() != Ty)
GEN_ERROR("All elements of a PHI node must be of the same type!"); GEN_ERROR("All elements of a PHI node must be of the same type");
cast<PHINode>($$)->addIncoming($2->front().first, $2->front().second); cast<PHINode>($$)->addIncoming($2->front().first, $2->front().second);
$2->pop_front(); $2->pop_front();
} }
@ -2716,7 +2716,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
// Make sure no arguments is a good thing! // Make sure no arguments is a good thing!
if (Ty->getNumParams() != 0) if (Ty->getNumParams() != 0)
GEN_ERROR("No arguments passed to a function that " GEN_ERROR("No arguments passed to a function that "
"expects arguments!"); "expects arguments");
} else { // Has arguments? } else { // Has arguments?
// Loop through FunctionType's arguments and ensure they are specified // Loop through FunctionType's arguments and ensure they are specified
// correctly! // correctly!
@ -2728,7 +2728,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
for (; ArgI != ArgE && I != E; ++ArgI, ++I) { for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
if (ArgI->Val->getType() != *I) if (ArgI->Val->getType() != *I)
GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" + GEN_ERROR("Parameter " + ArgI->Val->getName()+ " is not of type '" +
(*I)->getDescription() + "'!"); (*I)->getDescription() + "'");
Args.push_back(ArgI->Val); Args.push_back(ArgI->Val);
} }
if (Ty->isVarArg()) { if (Ty->isVarArg()) {
@ -2736,7 +2736,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
for (; ArgI != ArgE; ++ArgI) for (; ArgI != ArgE; ++ArgI)
Args.push_back(ArgI->Val); // push the remaining varargs Args.push_back(ArgI->Val); // push the remaining varargs
} else if (I != E || ArgI != ArgE) } else if (I != E || ArgI != ArgE)
GEN_ERROR("Invalid number of parameters detected!"); GEN_ERROR("Invalid number of parameters detected");
} }
// Create the call node // Create the call node
CallInst *CI = new CallInst(V, Args); CallInst *CI = new CallInst(V, Args);
@ -2796,7 +2796,7 @@ MemoryInst : MALLOC Types OptCAlign {
| FREE ResolvedVal { | FREE ResolvedVal {
if (!isa<PointerType>($2->getType())) if (!isa<PointerType>($2->getType()))
GEN_ERROR("Trying to free nonpointer type " + GEN_ERROR("Trying to free nonpointer type " +
$2->getType()->getDescription() + "!"); $2->getType()->getDescription() + "");
$$ = new FreeInst($2); $$ = new FreeInst($2);
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
@ -2825,7 +2825,7 @@ MemoryInst : MALLOC Types OptCAlign {
const Type *ElTy = PT->getElementType(); const Type *ElTy = PT->getElementType();
if (ElTy != $3->getType()) if (ElTy != $3->getType())
GEN_ERROR("Can't store '" + $3->getType()->getDescription() + GEN_ERROR("Can't store '" + $3->getType()->getDescription() +
"' into space of type '" + ElTy->getDescription() + "'!"); "' into space of type '" + ElTy->getDescription() + "'");
Value* tmpVal = getVal(*$5, $6); Value* tmpVal = getVal(*$5, $6);
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -2836,11 +2836,11 @@ MemoryInst : MALLOC Types OptCAlign {
if (!UpRefs.empty()) if (!UpRefs.empty())
GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription()); GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription());
if (!isa<PointerType>($2->get())) if (!isa<PointerType>($2->get()))
GEN_ERROR("getelementptr insn requires pointer operand!"); GEN_ERROR("getelementptr insn requires pointer operand");
if (!GetElementPtrInst::getIndexedType(*$2, *$4, true)) if (!GetElementPtrInst::getIndexedType(*$2, *$4, true))
GEN_ERROR("Invalid getelementptr indices for type '" + GEN_ERROR("Invalid getelementptr indices for type '" +
(*$2)->getDescription()+ "'!"); (*$2)->getDescription()+ "'");
Value* tmpVal = getVal(*$2, $3); Value* tmpVal = getVal(*$2, $3);
CHECK_FOR_ERROR CHECK_FOR_ERROR
$$ = new GetElementPtrInst(tmpVal, *$4); $$ = new GetElementPtrInst(tmpVal, *$4);