forked from OSchip/llvm-project
[TableGen] Allow 2^63-1 and 2^63-2 as int literals.
These two values correspond to the 'Empty' and 'Tombstone' special keys defined by DenseMapInfo<int64_t>, which means that neither one can be used as a key in DenseMap<int64_t, anything>. Hence, if you try to use either of those values as an int literal, IntInit::get() fails an assertion when it tries to insert them into its static cache of int-literal objects. Fixed by replacing the DenseMap with a std::map, which doesn't intrude on the space of legal values of the key type. Reviewers: nhaehnle, hfinkel, javedabsar, efriedma Reviewed By: efriedma Subscribers: fhahn, efriedma, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59016 llvm-svn: 355900
This commit is contained in:
parent
c965d21f33
commit
cdb7c31f0a
|
@ -32,6 +32,7 @@
|
|||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
@ -457,7 +458,7 @@ Init *BitsInit::resolveReferences(Resolver &R) const {
|
|||
}
|
||||
|
||||
IntInit *IntInit::get(int64_t V) {
|
||||
static DenseMap<int64_t, IntInit*> ThePool;
|
||||
static std::map<int64_t, IntInit*> ThePool;
|
||||
|
||||
IntInit *&I = ThePool[V];
|
||||
if (!I) I = new(Allocator) IntInit(V);
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: llvm-tblgen %s | FileCheck %s
|
||||
|
||||
def TestRecord {
|
||||
// CHECK: int X = 9223372036854775807;
|
||||
int X = 0x7FFFFFFFFFFFFFFF;
|
||||
// CHECK: int Y = 9223372036854775806;
|
||||
int Y = 0x7FFFFFFFFFFFFFFE;
|
||||
}
|
Loading…
Reference in New Issue