From 18ab892ff7e9032914ff7fdb07685d5945c84fef Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 17 Dec 2021 20:25:32 +0100 Subject: [Bitcode] Avoid setting invalid comdat pointer (NFC) Instead track global objects with implicit comdat in a separate set. The current approach of temporarily assigning an invalid comdat pointer is incompatible with D115864. --- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp') diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 909af12..d914152 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -488,6 +488,7 @@ class BitcodeReader : public BitcodeReaderBase, public GVMaterializer { BitcodeReaderValueList ValueList; Optional MDLoader; std::vector ComdatList; + DenseSet ImplicitComdatObjects; SmallVector InstructionList; std::vector> GlobalInits; @@ -2038,14 +2039,8 @@ Expected BitcodeReader::recordValue(SmallVectorImpl &Record, return error("Invalid value name"); V->setName(NameStr); auto *GO = dyn_cast(V); - if (GO) { - if (GO->getComdat() == reinterpret_cast(1)) { - if (TT.supportsCOMDAT()) - GO->setComdat(TheModule->getOrInsertComdat(V->getName())); - else - GO->setComdat(nullptr); - } - } + if (GO && ImplicitComdatObjects.contains(GO) && TT.supportsCOMDAT()) + GO->setComdat(TheModule->getOrInsertComdat(V->getName())); return V; } @@ -3293,7 +3288,7 @@ Error BitcodeReader::parseGlobalVarRecord(ArrayRef Record) { NewGV->setComdat(ComdatList[ComdatID - 1]); } } else if (hasImplicitComdat(RawLinkage)) { - NewGV->setComdat(reinterpret_cast(1)); + ImplicitComdatObjects.insert(NewGV); } if (Record.size() > 12) { @@ -3427,7 +3422,7 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef Record) { Func->setComdat(ComdatList[ComdatID - 1]); } } else if (hasImplicitComdat(RawLinkage)) { - Func->setComdat(reinterpret_cast(1)); + ImplicitComdatObjects.insert(Func); } if (Record.size() > 13) -- cgit v1.1