diff options
Diffstat (limited to 'lib/Target/CBackend/Writer.cpp')
-rw-r--r-- | lib/Target/CBackend/Writer.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index c4d8c46483..bc3f839409 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -174,6 +174,7 @@ namespace { void visitUnwindInst(UnwindInst &I) { assert(0 && "Lowerinvoke pass didn't work!"); } + void visitUnreachableInst(UnreachableInst &I); void visitPHINode(PHINode &I); void visitBinaryOperator(Instruction &I); @@ -521,6 +522,9 @@ void CWriter::printConstant(Constant *CPV) { << *CE << "\n"; abort(); } + } else if (isa<UndefValue>(CPV) && CPV->getType()->isFirstClassType()) { + Out << "0"; + return; } switch (CPV->getType()->getTypeID()) { @@ -606,7 +610,7 @@ void CWriter::printConstant(Constant *CPV) { } case Type::ArrayTyID: - if (isa<ConstantAggregateZero>(CPV)) { + if (isa<ConstantAggregateZero>(CPV) || isa<UndefValue>(CPV)) { const ArrayType *AT = cast<ArrayType>(CPV->getType()); Out << "{"; if (AT->getNumElements()) { @@ -625,7 +629,7 @@ void CWriter::printConstant(Constant *CPV) { break; case Type::StructTyID: - if (isa<ConstantAggregateZero>(CPV)) { + if (isa<ConstantAggregateZero>(CPV) || isa<UndefValue>(CPV)) { const StructType *ST = cast<StructType>(CPV->getType()); Out << "{"; if (ST->getNumElements()) { @@ -1205,6 +1209,10 @@ void CWriter::visitSwitchInst(SwitchInst &SI) { Out << " }\n"; } +void CWriter::visitUnreachableInst(UnreachableInst &I) { + Out << " /*UNREACHABLE*/\n"; +} + bool CWriter::isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) { /// FIXME: This should be reenabled, but loop reordering safe!! return true; |