diff options
Diffstat (limited to 'lib/Bitcode')
-rw-r--r-- | lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp | 4 | ||||
-rw-r--r-- | lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp | 22 | ||||
-rw-r--r-- | lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h | 4 |
3 files changed, 16 insertions, 14 deletions
diff --git a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp index 923d0b2c1e..cd4a894ef0 100644 --- a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp +++ b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp @@ -227,6 +227,8 @@ static void WriteTypeTable(const NaClValueEnumerator &VE, TypeVals.push_back(cast<IntegerType>(T)->getBitWidth()); break; case Type::PointerTyID: { + if (PNaClVersion >= 2) + report_fatal_error("Pointer types are not supported in PNaCl bitcode"); PointerType *PTy = cast<PointerType>(T); // POINTER: [pointee type, address space] Code = naclbitc::TYPE_CODE_POINTER; @@ -550,7 +552,7 @@ static void EmitFnForwardTypeRef(const Value *V, VE.InsertFnForwardTypeRef(ValID)) { SmallVector<unsigned, 2> Vals; Vals.push_back(ValID); - Vals.push_back(VE.getTypeID(VE.NormalizeScalarType(V->getType()))); + Vals.push_back(VE.getTypeID(VE.NormalizeType(V->getType()))); Stream.EmitRecord(naclbitc::FUNC_CODE_INST_FORWARDTYPEREF, Vals, FUNCTION_INST_FORWARDTYPEREF_ABBREV); } diff --git a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp index cabdc420c6..f1ae2584e1 100644 --- a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp +++ b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp @@ -298,25 +298,27 @@ void NaClValueEnumerator::EnumerateValue(const Value *VIn) { } -Type *NaClValueEnumerator::NormalizeScalarType(Type *Ty) const { - // Strip pointer types. - if (Ty->isPointerTy() && PNaClVersion >= 2) - Ty = IntPtrType; - return Ty; -} - Type *NaClValueEnumerator::NormalizeType(Type *Ty) const { + if (PNaClVersion == 1) + return Ty; + + if (Ty->isPointerTy()) + return IntPtrType; if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) { SmallVector<Type *, 8> ArgTypes; for (unsigned I = 0, E = FTy->getNumParams(); I < E; ++I) - ArgTypes.push_back(NormalizeScalarType(FTy->getParamType(I))); - Ty = FunctionType::get(NormalizeScalarType(FTy->getReturnType()), - ArgTypes, false); + ArgTypes.push_back(NormalizeType(FTy->getParamType(I))); + return FunctionType::get(NormalizeType(FTy->getReturnType()), + ArgTypes, false); } return Ty; } void NaClValueEnumerator::EnumerateType(Type *Ty, bool InsideOptimizeTypes) { + // Pointer types do not need to be given type IDs. + if (Ty->isPointerTy() && PNaClVersion >= 2) + Ty = Ty->getPointerElementType(); + Ty = NormalizeType(Ty); // The label type does not need to be given a type ID. diff --git a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h index e756beb2f2..cc43c7a1e2 100644 --- a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h +++ b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h @@ -154,14 +154,12 @@ public: return T == IntPtrType; } - Type *NormalizeScalarType(Type *Ty) const; + Type *NormalizeType(Type *Ty) const; private: void OptimizeTypes(const Module *M); void OptimizeConstants(unsigned CstStart, unsigned CstEnd); - Type *NormalizeType(Type *Ty) const; - void EnumerateValue(const Value *V); void EnumerateType(Type *T, bool InsideOptimizeTypes=false); void EnumerateOperandType(const Value *V); |