From 590bc74ca45b91475d2ae621d5da3b3b713d6156 Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sun, 14 Jul 2002 23:08:30 +0000 Subject: [PATCH] Add support for writing ConstantExpr nodes. llvm-svn: 2899 --- llvm/lib/Bytecode/Writer/ConstantWriter.cpp | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Bytecode/Writer/ConstantWriter.cpp b/llvm/lib/Bytecode/Writer/ConstantWriter.cpp index d85ee2fe755d..2091cedba39a 100644 --- a/llvm/lib/Bytecode/Writer/ConstantWriter.cpp +++ b/llvm/lib/Bytecode/Writer/ConstantWriter.cpp @@ -96,6 +96,27 @@ void BytecodeWriter::outputType(const Type *T) { } bool BytecodeWriter::outputConstant(const Constant *CPV) { + + // We must check for a ConstantExpr before switching by type because + // a ConstantExpr can be of any type, and has no explicit value. + // + if (const ConstantExpr* CE = dyn_cast(CPV)) { + assert(CE->getNumOperands() > 0 && "ConstantExpr with 0 operands"); + output_vbr(CE->getNumOperands(), Out); // flags as an expr + output_vbr(CE->getOpcode(), Out); // flags as an expr + + for (User::const_op_iterator OI = CE->op_begin(); OI != CE->op_end(); ++OI){ + int Slot = Table.getValSlot(*OI); + assert(Slot != -1 && "Unknown constant used in ConstantExpr!!"); + output_vbr((unsigned)Slot, Out); + Slot = Table.getValSlot((*OI)->getType()); + output_vbr((unsigned)Slot, Out); + } + return false; + } + else + output_vbr((unsigned)0, Out); // flag as not a ConstantExpr + switch (CPV->getType()->getPrimitiveID()) { case Type::BoolTyID: // Boolean Types if (cast(CPV)->getValue()) @@ -125,7 +146,8 @@ bool BytecodeWriter::outputConstant(const Constant *CPV) { case Type::ArrayTyID: { const ConstantArray *CPA = cast(CPV); unsigned size = CPA->getValues().size(); - assert(size == cast(CPA->getType())->getNumElements() && "ConstantArray out of whack!"); + assert(size == cast(CPA->getType())->getNumElements() + && "ConstantArray out of whack!"); for (unsigned i = 0; i < size; i++) { int Slot = Table.getValSlot(CPA->getOperand(i)); assert(Slot != -1 && "Constant used but not available!!");