Skip to content

Commit 1396318

Browse files
committedAug 15, 2017
Replace _symbolTypes hash table with std::map
Replaced custom hash table implementation, TR_HashTabString, with std::map for storing mappings of symbols to their corresponding types in MethodBuilder. This guarantees better type safety, alongside helping to simplify the JitBuilder interfaces. Signed-off-by: Sajid Ahmed <Syed.Sajid.Ahmed23@ibm.com>
1 parent b32e818 commit 1396318

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed
 

‎compiler/ilgen/MethodBuilder.cpp

+27-22
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "compile/Compilation.hpp"
3636
#include "compile/SymbolReferenceTable.hpp"
3737
#include "control/Recompilation.hpp"
38+
#include "infra/Assert.hpp"
3839
#include "infra/Cfg.hpp"
3940
#include "infra/HashTab.hpp"
4041
#include "infra/STLUtils.hpp"
@@ -101,7 +102,7 @@ MethodBuilder::MethodBuilder(TR::TypeDictionary *types, OMR::VirtualMachineState
101102
_numParameters(0),
102103
_symbols(new (*_memoryRegion) TR_HashTabString(_trMemory)),
103104
_parameterSlot(str_comparator, *_memoryRegion),
104-
_symbolTypes(new (*_memoryRegion) TR_HashTabString(_trMemory)),
105+
_symbolTypes(str_comparator, *_memoryRegion),
105106
_symbolNameFromSlot(new (*_memoryRegion) TR_HashTabInt(_trMemory)),
106107
_symbolIsArray(new (*_memoryRegion) TR_HashTabString(_trMemory)),
107108
_memoryLocations(new (*_memoryRegion) TR_HashTabString(_trMemory)),
@@ -155,6 +156,7 @@ MethodBuilder::~MethodBuilder()
155156
{
156157
// Cleanup allocations in _memoryRegion *before* its destroyed below (see note in constructor)
157158
_parameterSlot.clear();
159+
_symbolTypes.clear();
158160
_functions.clear();
159161

160162
_trMemory->~TR_Memory();
@@ -345,24 +347,26 @@ MethodBuilder::connectTrees()
345347
bool
346348
MethodBuilder::symbolDefined(const char *name)
347349
{
348-
TR_HashId id=0, typeID=0;
349350
// _symbols not good enough because symbol can be defined even if it has
350351
// never been stored to, but _symbolTypes will contain all symbols, even
351352
// if they have never been used. See ::DefineLocal, for example, which can
352353
// be called in a MethodBuilder contructor. In contrast, ::DefineSymbol
353354
// which inserts into _symbols, can only be called from within a MethodBuilder's
354355
// ::buildIL() method ).
355-
return (_symbolTypes->locate(name, typeID));
356+
return _symbolTypes.find(name) != _symbolTypes.end();
356357
}
357358

358359
void
359360
MethodBuilder::defineSymbol(const char *name, TR::SymbolReference *symRef)
360361
{
361-
TR_HashId id1=0, id2=0, id3;
362+
TR_HashId id1=0, id2=0;
362363

363364
_symbols->add(name, id1, (void *)symRef);
364365
_symbolNameFromSlot->add(symRef->getCPIndex(), id2, (void *)name);
365-
_symbolTypes->add(name, id3, (void *)(uintptr_t) symRef->getSymbol()->getDataType());
366+
367+
TR::IlType *type = typeDictionary()->PrimitiveType(symRef->getSymbol()->getDataType());
368+
_symbolTypes.insert(std::make_pair(name, type));
369+
366370
if (!_newSymbolsAreTemps)
367371
_methodSymbol->setFirstJitTempIndex(_methodSymbol->getTempIndex());
368372
}
@@ -376,23 +380,25 @@ MethodBuilder::lookupSymbol(const char *name)
376380
return (TR::SymbolReference *)_symbols->getData(symbolsID);
377381

378382
TR::SymbolReference *symRef;
379-
TR_HashId typesID;
380-
_symbolTypes->locate(name, typesID);
383+
SymbolTypeMap::iterator symTypesIterator = _symbolTypes.find(name);
384+
385+
TR_ASSERT_FATAL(symTypesIterator != _symbolTypes.end(), "Symbol '%s' doesn't exist", name);
381386

382-
TR::DataType type = ((TR::IlType *)(_symbolTypes->getData(typesID)))->getPrimitiveType();
387+
TR::IlType *symbolType = symTypesIterator->second;
388+
TR::DataType primitiveType = symbolType->getPrimitiveType();
383389

384-
ParameterMap::iterator it = _parameterSlot.find(name);
385-
if (it != _parameterSlot.end())
390+
ParameterMap::iterator paramSlotsIterator = _parameterSlot.find(name);
391+
if (paramSlotsIterator != _parameterSlot.end())
386392
{
387-
int32_t slot = it->second;
393+
int32_t slot = paramSlotsIterator->second;
388394
symRef = symRefTab()->findOrCreateAutoSymbol(_methodSymbol,
389395
slot,
390-
type,
396+
primitiveType,
391397
true, false, true);
392398
}
393399
else
394400
{
395-
symRef = symRefTab()->createTemporary(_methodSymbol, type);
401+
symRef = symRefTab()->createTemporary(_methodSymbol, primitiveType);
396402
symRef->getSymbol()->getAutoSymbol()->setName(name);
397403
TR_HashId nameFromSlotID;
398404
_symbolNameFromSlot->add(symRef->getCPIndex(), nameFromSlotID, (void *)name);
@@ -459,16 +465,14 @@ void
459465
MethodBuilder::DefineLocal(const char *name, TR::IlType *dt)
460466
{
461467
MB_REPLAY("DefineLocal(\"%s\", %s);", name, REPLAY_TYPE(dt));
462-
TR_HashId typesID;
463-
_symbolTypes->add(name, typesID, (void *)dt);
468+
_symbolTypes.insert(std::make_pair(name, dt));
464469
}
465470

466471
void
467472
MethodBuilder::DefineMemory(const char *name, TR::IlType *dt, void *location)
468473
{
469474
MB_REPLAY("DefineMemory(\"%s\", %s, " REPLAY_POINTER_FMT ");", name, REPLAY_TYPE(dt), REPLAY_POINTER(location, name));
470-
TR_HashId typesID;
471-
_symbolTypes->add(name, typesID, (void *) dt);
475+
_symbolTypes.insert(std::make_pair(name, dt));
472476

473477
TR_HashId locationsID;
474478
_memoryLocations->add(name, locationsID, location);
@@ -483,8 +487,7 @@ MethodBuilder::DefineParameter(const char *name, TR::IlType *dt)
483487
TR_HashId nameFromSlotID;
484488
_symbolNameFromSlot->add(_numParameters, nameFromSlotID, (void *) name);
485489

486-
TR_HashId typesID;
487-
_symbolTypes->add(name, typesID, (void *) dt);
490+
_symbolTypes.insert(std::make_pair(name, dt));
488491

489492
_numParameters++;
490493
}
@@ -585,9 +588,11 @@ MethodBuilder::getParameterTypes()
585588
_symbolNameFromSlot->locate(p, nameFromSlotID);
586589
const char *name = (const char *) _symbolNameFromSlot->getData(nameFromSlotID);
587590

588-
TR_HashId typesID;
589-
_symbolTypes->locate(name, typesID);
590-
paramTypesArray[p] = (TR::IlType *) _symbolTypes->getData(typesID);
591+
std::map<const char *, TR::IlType *, StrComparator>::iterator it = _symbolTypes.find(name);
592+
593+
TR_ASSERT_FATAL(it != _symbolTypes.end(), "No matching symbol type for parameter '%s'", name);
594+
595+
paramTypesArray[p] = it->second;
591596
}
592597

593598
_cachedParameterTypes = paramTypesArray;

‎compiler/ilgen/MethodBuilder.hpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,10 @@ class MethodBuilder : public TR::IlBuilder
196196
typedef std::map<const char *, int32_t, StrComparator, ParameterMapAllocator> ParameterMap;
197197
ParameterMap _parameterSlot;
198198

199-
TR_HashTabString * _symbolTypes;
199+
typedef TR::typed_allocator<std::pair<const char *, TR::IlType *>, TR::Region &> SymbolTypeMapAllocator;
200+
typedef std::map<const char *, TR::IlType *, StrComparator, SymbolTypeMapAllocator> SymbolTypeMap;
201+
SymbolTypeMap _symbolTypes;
202+
200203
TR_HashTabInt * _symbolNameFromSlot;
201204
TR_HashTabString * _symbolIsArray;
202205
TR_HashTabString * _memoryLocations;

0 commit comments

Comments
 (0)
Please sign in to comment.