aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bitcode')
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp4
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp22
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h4
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);