diff options
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/VMCore/Constants.cpp | 19 | 
3 files changed, 28 insertions, 7 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 07a4279e13c..eb18e315310 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -629,6 +629,10 @@ bool BitcodeReader::ParseConstants() {          V = ConstantFP::get(CurTy, BitsToFloat(Record[0]));        else if (CurTy == Type::DoubleTy)          V = ConstantFP::get(CurTy, BitsToDouble(Record[0])); +      // FIXME: Make long double constants work. +      else if (CurTy == Type::X86_FP80Ty || +               CurTy == Type::FP128Ty || CurTy == Type::PPC_FP128Ty) +        assert(0 && "Long double constants not handled yet.");        else          V = UndefValue::get(CurTy);        break; diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index c5be80fc508..17c14f0a0d1 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -525,11 +525,17 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,        }      } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {        Code = bitc::CST_CODE_FLOAT; -      if (CFP->getType() == Type::FloatTy) { +      const Type *Ty = CFP->getType(); +      if (Ty == Type::FloatTy) {          Record.push_back(FloatToBits((float)CFP->getValue())); -      } else { -        assert (CFP->getType() == Type::DoubleTy && "Unknown FP type!"); +      } else if (Ty == Type::DoubleTy) {          Record.push_back(DoubleToBits((double)CFP->getValue())); +      // FIXME: make long double constants work. +      } else if (Ty == Type::X86_FP80Ty || +                 Ty == Type::FP128Ty || Ty == Type::PPC_FP128Ty) { +        assert (0 && "Long double constants not handled yet."); +      } else { +        assert (0 && "Unknown FP type!");        }      } else if (isa<ConstantArray>(C) && cast<ConstantArray>(C)->isString()) {        // Emit constant strings specially. diff --git a/llvm/lib/VMCore/Constants.cpp b/llvm/lib/VMCore/Constants.cpp index e171011159c..eadfe39afa6 100644 --- a/llvm/lib/VMCore/Constants.cpp +++ b/llvm/lib/VMCore/Constants.cpp @@ -108,6 +108,9 @@ Constant *Constant::getNullValue(const Type *Ty) {      return ConstantInt::get(Ty, 0);    case Type::FloatTyID:    case Type::DoubleTyID: +  case Type::X86_FP80TyID: +  case Type::PPC_FP128TyID: +  case Type::FP128TyID:      return ConstantFP::get(Ty, 0.0);    case Type::PointerTyID:      return ConstantPointerNull::get(cast<PointerType>(Ty)); @@ -288,12 +291,17 @@ ConstantFP *ConstantFP::get(const Type *Ty, double V) {      ConstantFP *&Slot = (*FloatConstants)[std::make_pair(IntVal, Ty)];      if (Slot) return Slot;      return Slot = new ConstantFP(Ty, (float)V); -  } else { -    assert(Ty == Type::DoubleTy); +  } else if (Ty == Type::DoubleTy) {       uint64_t IntVal = DoubleToBits(V);      ConstantFP *&Slot = (*DoubleConstants)[std::make_pair(IntVal, Ty)];      if (Slot) return Slot;      return Slot = new ConstantFP(Ty, V); +  // FIXME:  Make long double constants work. +  } else if (Ty == Type::X86_FP80Ty || +             Ty == Type::PPC_FP128Ty || Ty == Type::FP128Ty) { +    assert(0 && "Long double constants not handled yet."); +  } else { +    assert(0 && "Unknown FP Type!");    }  } @@ -696,10 +704,13 @@ bool ConstantFP::isValueValidForType(const Type *Ty, double Val) {    default:      return false;         // These can't be represented as floating point! -    // TODO: Figure out how to test if a double can be cast to a float! +    // TODO: Figure out how to test if we can use a shorter type instead!    case Type::FloatTyID:    case Type::DoubleTyID: -    return true;          // This is the largest type... +  case Type::X86_FP80TyID: +  case Type::PPC_FP128TyID: +  case Type::FP128TyID: +    return true;    }  }  | 

