@@ -539,18 +539,19 @@ linkingt::rename(const symbol_table_baset &src_symbol_table, const irep_idt &id)
539
539
}
540
540
}
541
541
542
- bool linkingt::needs_renaming_non_type (
542
+ linkingt::renamingt linkingt::needs_renaming_non_type (
543
543
const symbolt &old_symbol,
544
544
const symbolt &new_symbol)
545
545
{
546
546
// We first take care of file-local non-type symbols.
547
547
// These are static functions, or static variables
548
548
// inside static function bodies.
549
- if (new_symbol.is_file_local ||
550
- old_symbol.is_file_local )
551
- return true ;
552
-
553
- return false ;
549
+ if (new_symbol.is_file_local )
550
+ return renamingt::RENAME_NEW;
551
+ else if (old_symbol.is_file_local )
552
+ return renamingt::RENAME_OLD;
553
+ else
554
+ return renamingt::NO_RENAMING;
554
555
}
555
556
556
557
void linkingt::duplicate_code_symbol (
@@ -839,8 +840,8 @@ void linkingt::duplicate_code_symbol(
839
840
if (old_symbol.value .is_nil ())
840
841
{
841
842
// the one with body wins!
842
- rename_symbol (new_symbol.value );
843
- rename_symbol (new_symbol.type );
843
+ rename_new_symbol (new_symbol.value );
844
+ rename_new_symbol (new_symbol.type );
844
845
old_symbol.value =new_symbol.value ;
845
846
old_symbol.type =new_symbol.type ; // for parameter identifiers
846
847
old_symbol.is_weak =new_symbol.is_weak ;
@@ -1312,45 +1313,53 @@ void linkingt::duplicate_type_symbol(
1312
1313
" unexpected difference between type symbols" );
1313
1314
}
1314
1315
1315
- bool linkingt::needs_renaming_type (
1316
+ linkingt::renamingt linkingt::needs_renaming_type (
1316
1317
const symbolt &old_symbol,
1317
1318
const symbolt &new_symbol)
1318
1319
{
1319
1320
PRECONDITION (new_symbol.is_type );
1320
1321
1321
1322
if (!old_symbol.is_type )
1322
- return true ;
1323
+ return renamingt::RENAME_NEW ;
1323
1324
1324
1325
if (old_symbol.type ==new_symbol.type )
1325
- return false ;
1326
+ return renamingt::NO_RENAMING ;
1326
1327
1327
1328
if (
1328
1329
old_symbol.type .id () == ID_struct &&
1329
1330
to_struct_type (old_symbol.type ).is_incomplete () &&
1330
1331
new_symbol.type .id () == ID_struct &&
1331
1332
!to_struct_type (new_symbol.type ).is_incomplete ())
1332
- return false ; // not different
1333
+ {
1334
+ return renamingt::NO_RENAMING; // not different
1335
+ }
1333
1336
1334
1337
if (
1335
1338
old_symbol.type .id () == ID_struct &&
1336
1339
!to_struct_type (old_symbol.type ).is_incomplete () &&
1337
1340
new_symbol.type .id () == ID_struct &&
1338
1341
to_struct_type (new_symbol.type ).is_incomplete ())
1339
- return false ; // not different
1342
+ {
1343
+ return renamingt::NO_RENAMING; // not different
1344
+ }
1340
1345
1341
1346
if (
1342
1347
old_symbol.type .id () == ID_union &&
1343
1348
to_union_type (old_symbol.type ).is_incomplete () &&
1344
1349
new_symbol.type .id () == ID_union &&
1345
1350
!to_union_type (new_symbol.type ).is_incomplete ())
1346
- return false ; // not different
1351
+ {
1352
+ return renamingt::NO_RENAMING; // not different
1353
+ }
1347
1354
1348
1355
if (
1349
1356
old_symbol.type .id () == ID_union &&
1350
1357
!to_union_type (old_symbol.type ).is_incomplete () &&
1351
1358
new_symbol.type .id () == ID_union &&
1352
1359
to_union_type (new_symbol.type ).is_incomplete ())
1353
- return false ; // not different
1360
+ {
1361
+ return renamingt::NO_RENAMING; // not different
1362
+ }
1354
1363
1355
1364
if (
1356
1365
old_symbol.type .id () == ID_array && new_symbol.type .id () == ID_array &&
@@ -1359,14 +1368,18 @@ bool linkingt::needs_renaming_type(
1359
1368
{
1360
1369
if (to_array_type (old_symbol.type ).size ().is_nil () &&
1361
1370
to_array_type (new_symbol.type ).size ().is_not_nil ())
1362
- return false ; // not different
1371
+ {
1372
+ return renamingt::NO_RENAMING; // not different
1373
+ }
1363
1374
1364
1375
if (to_array_type (new_symbol.type ).size ().is_nil () &&
1365
1376
to_array_type (old_symbol.type ).size ().is_not_nil ())
1366
- return false ; // not different
1377
+ {
1378
+ return renamingt::NO_RENAMING; // not different
1379
+ }
1367
1380
}
1368
1381
1369
- return true ; // different
1382
+ return renamingt::RENAME_NEW ; // different
1370
1383
}
1371
1384
1372
1385
static void do_type_dependencies (
@@ -1445,9 +1458,9 @@ std::unordered_map<irep_idt, irep_idt> linkingt::rename_symbols(
1445
1458
#endif
1446
1459
1447
1460
if (new_symbol.is_type )
1448
- rename_symbol .insert_type (id, new_identifier);
1461
+ rename_new_symbol .insert_type (id, new_identifier);
1449
1462
else
1450
- rename_symbol .insert_expr (id, new_identifier);
1463
+ rename_new_symbol .insert_expr (id, new_identifier);
1451
1464
}
1452
1465
1453
1466
return new_identifiers;
@@ -1463,8 +1476,8 @@ void linkingt::copy_symbols(
1463
1476
{
1464
1477
symbolt symbol=named_symbol.second ;
1465
1478
// apply the renaming
1466
- rename_symbol (symbol.type );
1467
- rename_symbol (symbol.value );
1479
+ rename_new_symbol (symbol.type );
1480
+ rename_new_symbol (symbol.value );
1468
1481
auto it = new_identifiers.find (named_symbol.first );
1469
1482
if (it != new_identifiers.end ())
1470
1483
symbol.name = it->second ;
@@ -1537,16 +1550,50 @@ bool linkingt::link(const symbol_table_baset &src_symbol_table)
1537
1550
symbol_table_baset::symbolst::const_iterator m_it =
1538
1551
main_symbol_table.symbols .find (symbol_pair.first );
1539
1552
1540
- if (
1541
- m_it != main_symbol_table.symbols .end () && // duplicate
1542
- needs_renaming (m_it->second , symbol_pair.second ))
1553
+ if (m_it != main_symbol_table.symbols .end ())
1543
1554
{
1544
- needs_to_be_renamed.insert (symbol_pair.first );
1545
- #ifdef DEBUG
1546
- messaget log {message_handler};
1547
- log .debug () << " LINKING: needs to be renamed: " << symbol_pair.first
1548
- << messaget::eom;
1555
+ // duplicate
1556
+ switch (needs_renaming (m_it->second , symbol_pair.second ))
1557
+ {
1558
+ case renamingt::NO_RENAMING:
1559
+ break ;
1560
+ case renamingt::RENAME_OLD:
1561
+ {
1562
+ symbolt renamed_symbol = m_it->second ;
1563
+ renamed_symbol.name = rename (src_symbol_table, symbol_pair.first );
1564
+ if (m_it->second .is_type )
1565
+ rename_main_symbol.insert_type (m_it->first , renamed_symbol.name );
1566
+ else
1567
+ rename_main_symbol.insert_expr (m_it->first , renamed_symbol.name );
1568
+ main_symbol_table.erase (m_it);
1569
+ main_symbol_table.insert (std::move (renamed_symbol));
1570
+ break ;
1571
+ }
1572
+ case renamingt::RENAME_NEW:
1573
+ {
1574
+ needs_to_be_renamed.insert (symbol_pair.first );
1575
+ #ifdef DEBUG
1576
+ messaget log {message_handler};
1577
+ log .debug () << " LINKING: needs to be renamed: " << symbol_pair.first
1578
+ << messaget::eom;
1549
1579
#endif
1580
+ break ;
1581
+ }
1582
+ }
1583
+ }
1584
+ }
1585
+
1586
+ // rename within main symbol table
1587
+ for (auto &symbol_pair : main_symbol_table)
1588
+ {
1589
+ symbolt tmp = symbol_pair.second ;
1590
+ bool unmodified = rename_main_symbol (tmp.value );
1591
+ unmodified &= rename_main_symbol (tmp.type );
1592
+ if (!unmodified)
1593
+ {
1594
+ symbolt *sym_ptr = main_symbol_table.get_writeable (symbol_pair.first );
1595
+ CHECK_RETURN (sym_ptr);
1596
+ *sym_ptr = std::move (tmp);
1550
1597
}
1551
1598
}
1552
1599
0 commit comments