From e839965faa22d6ed5dd41402c80bd806eb8f6c26 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Tue, 4 Nov 2014 00:59:21 +0000 Subject: The patchpoint lowering logic would crash with live constants equal to the tombstone or empty keys of a DenseMap. This patch fixes the issue (and adds a tests case). llvm-svn: 221214 --- llvm/lib/CodeGen/StackMaps.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'llvm/lib/CodeGen/StackMaps.cpp') diff --git a/llvm/lib/CodeGen/StackMaps.cpp b/llvm/lib/CodeGen/StackMaps.cpp index 967cf751f36..d3791c3feb5 100644 --- a/llvm/lib/CodeGen/StackMaps.cpp +++ b/llvm/lib/CodeGen/StackMaps.cpp @@ -222,6 +222,16 @@ void StackMaps::recordStackMapOpers(const MachineInstr &MI, uint64_t ID, // -1 is directly encoded as .long 0xFFFFFFFF with no constant pool. if (I->LocType == Location::Constant && !isInt<32>(I->Offset)) { I->LocType = Location::ConstantIndex; + // ConstPool is intentionally a MapVector of 'uint64_t's (as + // opposed to 'int64_t's). We should never be in a situation + // where we have to insert either the tombstone or the empty + // keys into a map, and for a DenseMap these are + // (uint64_t)0 and (uint64_t)-1. They can be and are + // represented using 32 bit integers. + + assert((uint64_t)I->Offset != DenseMapInfo::getEmptyKey() && + (uint64_t)I->Offset != DenseMapInfo::getTombstoneKey() && + "empty and tombstone keys should fit in 32 bits!"); auto Result = ConstPool.insert(std::make_pair(I->Offset, I->Offset)); I->Offset = Result.first - ConstPool.begin(); } -- cgit v1.2.3