Skip to content

Commit

Permalink
[TableGen] Allow 2^63-1 and 2^63-2 as int literals.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
statham-arm committed Mar 12, 2019
1 parent c965d21 commit cdb7c31
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
3 changes: 2 additions & 1 deletion llvm/lib/TableGen/Record.cpp
Expand Up @@ -32,6 +32,7 @@
#include <cassert>
#include <cstdint>
#include <memory>
#include <map>
#include <string>
#include <utility>
#include <vector>
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions llvm/test/TableGen/IntSpecialValues.td
@@ -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;
}

0 comments on commit cdb7c31

Please sign in to comment.