[SPIRV] Fix asan failure (#138695)
When the DataLayout is destroyed, the memory backing `Offsets` is
released. This causes a use after free.
To fix it, I added a DataLayout varible that will not be destroyed until
after Offsets is used.
Fixes asan failure caused by
https://github.com/llvm/llvm-project/pull/135789
diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
index 35ddb90..ad42c73 100644
--- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
@@ -2062,8 +2062,8 @@
void SPIRVGlobalRegistry::addStructOffsetDecorations(
Register Reg, StructType *Ty, MachineIRBuilder &MIRBuilder) {
- ArrayRef<TypeSize> Offsets =
- DataLayout().getStructLayout(Ty)->getMemberOffsets();
+ DataLayout DL;
+ ArrayRef<TypeSize> Offsets = DL.getStructLayout(Ty)->getMemberOffsets();
for (uint32_t I = 0; I < Ty->getNumElements(); ++I) {
buildOpMemberDecorate(Reg, MIRBuilder, SPIRV::Decoration::Offset, I,
{static_cast<uint32_t>(Offsets[I])});