summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-07-14 23:08:30 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-07-14 23:08:30 +0000
commita24a0bb0e20886ad976ec650c92ec35d09a91eb9 (patch)
tree54dd645c15a56bd0260cd0dbabe901b000e87194 /lib
parenta7dac3db79a813e6f28bedeeafcecbba0c28115c (diff)
downloadllvm-a24a0bb0e20886ad976ec650c92ec35d09a91eb9.tar.gz
llvm-a24a0bb0e20886ad976ec650c92ec35d09a91eb9.tar.bz2
llvm-a24a0bb0e20886ad976ec650c92ec35d09a91eb9.tar.xz
Add support for writing ConstantExpr nodes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2899 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Bytecode/Writer/ConstantWriter.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/Bytecode/Writer/ConstantWriter.cpp b/lib/Bytecode/Writer/ConstantWriter.cpp
index d85ee2fe75..2091cedba3 100644
--- a/lib/Bytecode/Writer/ConstantWriter.cpp
+++ b/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<ConstantExpr>(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<const ConstantBool>(CPV)->getValue())
@@ -125,7 +146,8 @@ bool BytecodeWriter::outputConstant(const Constant *CPV) {
case Type::ArrayTyID: {
const ConstantArray *CPA = cast<const ConstantArray>(CPV);
unsigned size = CPA->getValues().size();
- assert(size == cast<ArrayType>(CPA->getType())->getNumElements() && "ConstantArray out of whack!");
+ assert(size == cast<ArrayType>(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!!");