diff options
author | David Sherwood <david.sherwood@arm.com> | 2020-06-02 14:44:24 +0100 |
---|---|---|
committer | David Sherwood <david.sherwood@arm.com> | 2020-06-04 07:58:24 +0100 |
commit | a3e3986be122bd1cdebe7f7f69c3d1c4c22c4690 (patch) | |
tree | cca006b8fb61c7682d71d698abc320b5c2c35194 /llvm/lib/IR/Function.cpp | |
parent | 8d74de9de6d6cca552d7de7d0bfd36b6dd7d58dc (diff) | |
download | llvm-a3e3986be122bd1cdebe7f7f69c3d1c4c22c4690.zip llvm-a3e3986be122bd1cdebe7f7f69c3d1c4c22c4690.tar.gz llvm-a3e3986be122bd1cdebe7f7f69c3d1c4c22c4690.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r-- | llvm/lib/IR/Function.cpp | 39 |
1 files 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<unsigned char> Infos, + IIT_Info LastInfo, SmallVectorImpl<Intrinsic::IITDescriptor> &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<unsigned char> 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<unsigned char> 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<unsigned char> 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<Intrinsic::IITDescriptor> &Infos, |