35
35
#include " compile/Compilation.hpp"
36
36
#include " compile/SymbolReferenceTable.hpp"
37
37
#include " control/Recompilation.hpp"
38
+ #include " infra/Assert.hpp"
38
39
#include " infra/Cfg.hpp"
39
40
#include " infra/HashTab.hpp"
40
41
#include " infra/STLUtils.hpp"
@@ -101,7 +102,7 @@ MethodBuilder::MethodBuilder(TR::TypeDictionary *types, OMR::VirtualMachineState
101
102
_numParameters(0 ),
102
103
_symbols(new (*_memoryRegion) TR_HashTabString(_trMemory)),
103
104
_parameterSlot(str_comparator, *_memoryRegion),
104
- _symbolTypes(new ( *_memoryRegion) TR_HashTabString(_trMemory) ),
105
+ _symbolTypes(str_comparator, *_memoryRegion),
105
106
_symbolNameFromSlot(new (*_memoryRegion) TR_HashTabInt(_trMemory)),
106
107
_symbolIsArray(new (*_memoryRegion) TR_HashTabString(_trMemory)),
107
108
_memoryLocations(new (*_memoryRegion) TR_HashTabString(_trMemory)),
@@ -155,6 +156,7 @@ MethodBuilder::~MethodBuilder()
155
156
{
156
157
// Cleanup allocations in _memoryRegion *before* its destroyed below (see note in constructor)
157
158
_parameterSlot.clear ();
159
+ _symbolTypes.clear ();
158
160
_functions.clear ();
159
161
160
162
_trMemory->~TR_Memory ();
@@ -345,24 +347,26 @@ MethodBuilder::connectTrees()
345
347
bool
346
348
MethodBuilder::symbolDefined (const char *name)
347
349
{
348
- TR_HashId id=0 , typeID=0 ;
349
350
// _symbols not good enough because symbol can be defined even if it has
350
351
// never been stored to, but _symbolTypes will contain all symbols, even
351
352
// if they have never been used. See ::DefineLocal, for example, which can
352
353
// be called in a MethodBuilder contructor. In contrast, ::DefineSymbol
353
354
// which inserts into _symbols, can only be called from within a MethodBuilder's
354
355
// ::buildIL() method ).
355
- return ( _symbolTypes-> locate (name, typeID) );
356
+ return _symbolTypes. find (name) != _symbolTypes. end ( );
356
357
}
357
358
358
359
void
359
360
MethodBuilder::defineSymbol (const char *name, TR::SymbolReference *symRef)
360
361
{
361
- TR_HashId id1=0 , id2=0 , id3 ;
362
+ TR_HashId id1=0 , id2=0 ;
362
363
363
364
_symbols->add (name, id1, (void *)symRef);
364
365
_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
+
366
370
if (!_newSymbolsAreTemps)
367
371
_methodSymbol->setFirstJitTempIndex (_methodSymbol->getTempIndex ());
368
372
}
@@ -376,23 +380,25 @@ MethodBuilder::lookupSymbol(const char *name)
376
380
return (TR::SymbolReference *)_symbols->getData (symbolsID);
377
381
378
382
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);
381
386
382
- TR::DataType type = ((TR::IlType *)(_symbolTypes->getData (typesID)))->getPrimitiveType ();
387
+ TR::IlType *symbolType = symTypesIterator->second ;
388
+ TR::DataType primitiveType = symbolType->getPrimitiveType ();
383
389
384
- ParameterMap::iterator it = _parameterSlot.find (name);
385
- if (it != _parameterSlot.end ())
390
+ ParameterMap::iterator paramSlotsIterator = _parameterSlot.find (name);
391
+ if (paramSlotsIterator != _parameterSlot.end ())
386
392
{
387
- int32_t slot = it ->second ;
393
+ int32_t slot = paramSlotsIterator ->second ;
388
394
symRef = symRefTab ()->findOrCreateAutoSymbol (_methodSymbol,
389
395
slot,
390
- type ,
396
+ primitiveType ,
391
397
true , false , true );
392
398
}
393
399
else
394
400
{
395
- symRef = symRefTab ()->createTemporary (_methodSymbol, type );
401
+ symRef = symRefTab ()->createTemporary (_methodSymbol, primitiveType );
396
402
symRef->getSymbol ()->getAutoSymbol ()->setName (name);
397
403
TR_HashId nameFromSlotID;
398
404
_symbolNameFromSlot->add (symRef->getCPIndex (), nameFromSlotID, (void *)name);
@@ -459,16 +465,14 @@ void
459
465
MethodBuilder::DefineLocal (const char *name, TR::IlType *dt)
460
466
{
461
467
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));
464
469
}
465
470
466
471
void
467
472
MethodBuilder::DefineMemory (const char *name, TR::IlType *dt, void *location)
468
473
{
469
474
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));
472
476
473
477
TR_HashId locationsID;
474
478
_memoryLocations->add (name, locationsID, location);
@@ -483,8 +487,7 @@ MethodBuilder::DefineParameter(const char *name, TR::IlType *dt)
483
487
TR_HashId nameFromSlotID;
484
488
_symbolNameFromSlot->add (_numParameters, nameFromSlotID, (void *) name);
485
489
486
- TR_HashId typesID;
487
- _symbolTypes->add (name, typesID, (void *) dt);
490
+ _symbolTypes.insert (std::make_pair (name, dt));
488
491
489
492
_numParameters++;
490
493
}
@@ -585,9 +588,11 @@ MethodBuilder::getParameterTypes()
585
588
_symbolNameFromSlot->locate (p, nameFromSlotID);
586
589
const char *name = (const char *) _symbolNameFromSlot->getData (nameFromSlotID);
587
590
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 ;
591
596
}
592
597
593
598
_cachedParameterTypes = paramTypesArray;
0 commit comments