From 67bcf74b14577b33c7a149f04bae9a203e357365 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Tue, 4 Nov 2014 00:59:21 +0000 Subject: [PATCH] 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). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221214 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/StackMaps.h | 2 +- lib/CodeGen/StackMaps.cpp | 10 +++ test/CodeGen/X86/stackmap-large-constants.ll | 83 ++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/stackmap-large-constants.ll diff --git a/include/llvm/CodeGen/StackMaps.h b/include/llvm/CodeGen/StackMaps.h index 1bcd739f552..e343980d2ab 100644 --- a/include/llvm/CodeGen/StackMaps.h +++ b/include/llvm/CodeGen/StackMaps.h @@ -142,7 +142,7 @@ private: typedef SmallVector LocationVec; typedef SmallVector LiveOutVec; - typedef MapVector ConstantPool; + typedef MapVector ConstantPool; typedef MapVector FnStackSizeMap; struct CallsiteInfo { diff --git a/lib/CodeGen/StackMaps.cpp b/lib/CodeGen/StackMaps.cpp index 967cf751f36..d3791c3feb5 100644 --- a/lib/CodeGen/StackMaps.cpp +++ b/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(); } diff --git a/test/CodeGen/X86/stackmap-large-constants.ll b/test/CodeGen/X86/stackmap-large-constants.ll new file mode 100644 index 00000000000..85e7a061ca9 --- /dev/null +++ b/test/CodeGen/X86/stackmap-large-constants.ll @@ -0,0 +1,83 @@ +; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s + +; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps +; CHECK-NEXT: __LLVM_StackMaps: +; version +; CHECK-NEXT: .byte 1 +; reserved +; CHECK-NEXT: .byte 0 +; reserved +; CHECK-NEXT: .short 0 +; # functions +; CHECK-NEXT: .long 2 +; # constants +; CHECK-NEXT: .long 2 +; # records +; CHECK-NEXT: .long 2 +; function address & stack size +; CHECK-NEXT: .quad _foo +; CHECK-NEXT: .quad 8 +; function address & stack size +; CHECK-NEXT: .quad _bar +; CHECK-NEXT: .quad 8 + +; Constants Array: +; CHECK-NEXT: .quad 9223372036854775807 +; CHECK-NEXT: .quad -9223372036854775808 + +; Patchpoint ID +; CHECK-NEXT: .quad 0 +; Instruction offset +; CHECK-NEXT: .long Ltmp3-_foo +; reserved +; CHECK-NEXT: .short 0 +; # locations +; CHECK-NEXT: .short 1 +; ConstantIndex +; CHECK-NEXT: .byte 5 +; reserved +; CHECK-NEXT: .byte 8 +; Dwarf RegNum +; CHECK-NEXT: .short 0 +; Offset +; CHECK-NEXT: .long 0 +; padding +; CHECK-NEXT: .short 0 +; NumLiveOuts +; CHECK-NEXT: .short 0 + +; CHECK-NEXT: .align 3 + +declare void @llvm.experimental.stackmap(i64, i32, ...) + +define void @foo() { + tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 0, i32 0, i64 9223372036854775807) + ret void +} + +; Patchpoint ID +; CHECK-NEXT: .quad 0 +; Instruction Offset +; CHECK-NEXT: .long Ltmp7-_bar +; reserved +; CHECK-NEXT: .short 0 +; # locations +; CHECK-NEXT: .short 1 +; ConstantIndex +; CHECK-NEXT: .byte 5 +; reserved +; CHECK-NEXT: .byte 8 +; Dwarf RegNum +; CHECK-NEXT: .short 0 +; Offset +; CHECK-NEXT: .long 1 +; padding +; CHECK-NEXT: .short 0 +; NumLiveOuts +; CHECK-NEXT: .short 0 + + +define void @bar() { + tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 0, i32 0, i64 -9223372036854775808) + ret void +}