From a3e3986be122bd1cdebe7f7f69c3d1c4c22c4690 Mon Sep 17 00:00:00 2001 From: David Sherwood Date: Tue, 2 Jun 2020 14:44:24 +0100 Subject: [PATCH] [SVE] Fix ubsan issues in DecodeIITType In an earlier patch I removed the need for IITDescriptor::ScalableVecArgument, which involved changing DecodeIITType to pull out the last IIT_Info from the list. However, it turns out this is unsafe and causes ubsan failures. I've tried to fix this a different way by simply passing the last IIT_Info as an additional argument to DecodeIITType. Differential Revision: https://reviews.llvm.org/D81057 --- llvm/lib/IR/Function.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 1259468..972beec 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -752,14 +752,11 @@ enum IIT_Info { }; static void DecodeIITType(unsigned &NextElt, ArrayRef Infos, + IIT_Info LastInfo, SmallVectorImpl &OutputTable) { using namespace Intrinsic; - bool IsScalableVector = false; - if (NextElt > 0) { - IIT_Info LastInfo = IIT_Info(Infos[NextElt - 1]); - IsScalableVector = (LastInfo == IIT_SCALABLE_VEC); - } + bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC); IIT_Info Info = IIT_Info(Infos[NextElt++]); unsigned StructElts = 2; @@ -815,52 +812,52 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef Infos, return; case IIT_V1: OutputTable.push_back(IITDescriptor::getVector(1, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V2: OutputTable.push_back(IITDescriptor::getVector(2, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V4: OutputTable.push_back(IITDescriptor::getVector(4, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V8: OutputTable.push_back(IITDescriptor::getVector(8, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V16: OutputTable.push_back(IITDescriptor::getVector(16, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V32: OutputTable.push_back(IITDescriptor::getVector(32, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V64: OutputTable.push_back(IITDescriptor::getVector(64, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V128: OutputTable.push_back(IITDescriptor::getVector(128, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V512: OutputTable.push_back(IITDescriptor::getVector(512, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_V1024: OutputTable.push_back(IITDescriptor::getVector(1024, IsScalableVector)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_PTR: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0)); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_ANYPTR: { // [ANYPTR addrspace, subtype] OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++])); - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; } case IIT_ARG: { @@ -923,7 +920,7 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef Infos, OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct,StructElts)); for (unsigned i = 0; i != StructElts; ++i) - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; } case IIT_SUBDIVIDE2_ARG: { @@ -945,7 +942,7 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef Infos, return; } case IIT_SCALABLE_VEC: { - DecodeIITType(NextElt, Infos, OutputTable); + DecodeIITType(NextElt, Infos, Info, OutputTable); return; } case IIT_VEC_OF_BITCASTS_TO_INT: { @@ -990,9 +987,9 @@ void Intrinsic::getIntrinsicInfoTableEntries(ID id, } // Okay, decode the table into the output vector of IITDescriptors. - DecodeIITType(NextElt, IITEntries, T); + DecodeIITType(NextElt, IITEntries, IIT_Done, T); while (NextElt != IITEntries.size() && IITEntries[NextElt] != 0) - DecodeIITType(NextElt, IITEntries, T); + DecodeIITType(NextElt, IITEntries, IIT_Done, T); } static Type *DecodeFixedType(ArrayRef &Infos, -- 2.7.4