@@ -1363,107 +1363,79 @@ ParseStatus PPCAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc,
1363
1363
return ParseStatus::Success;
1364
1364
}
1365
1365
1366
- // / Extract \code @l/@ha \endcode specifier from expression. Recursively scan
1367
- // / the expression and check for VK_LO/HI/HA
1368
- // / symbol variants. If all symbols with specifier use the same
1369
- // / specifier, return the corresponding PPCMCExpr::Specifier,
1370
- // / and a modified expression using the default symbol variant.
1371
- // / Otherwise, return NULL.
1366
+ // Extract the @l or @ha specifier from the expression, returning a modified
1367
+ // expression with the specifier removed. Stores the extracted specifier in
1368
+ // `Spec`. Reports an error if multiple specifiers are detected.
1372
1369
const MCExpr *PPCAsmParser::extractSpecifier (const MCExpr *E,
1373
- PPCMCExpr::Specifier &Variant ) {
1370
+ PPCMCExpr::Specifier &Spec ) {
1374
1371
MCContext &Context = getParser ().getContext ();
1375
- Variant = PPCMCExpr::VK_None;
1376
-
1377
1372
switch (E->getKind ()) {
1378
- case MCExpr::Target:
1379
1373
case MCExpr::Constant:
1380
- return nullptr ;
1374
+ break ;
1375
+ case MCExpr::Target: {
1376
+ // Detect error but do not return a modified expression.
1377
+ auto *TE = cast<PPCMCExpr>(E);
1378
+ Spec = TE->getSpecifier ();
1379
+ (void )extractSpecifier (TE->getSubExpr (), Spec);
1380
+ Spec = PPCMCExpr::VK_None;
1381
+ } break ;
1381
1382
1382
1383
case MCExpr::SymbolRef: {
1383
- const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
1384
- Variant = (PPCMCExpr::Specifier)SRE->getKind ();
1385
- switch (Variant) {
1386
- case PPCMCExpr::VK_LO:
1387
- Variant = PPCMCExpr::VK_LO;
1384
+ const auto *SRE = cast<MCSymbolRefExpr>(E);
1385
+ switch (getSpecifier (SRE)) {
1386
+ case PPCMCExpr::VK_None:
1387
+ default :
1388
1388
break ;
1389
+ case PPCMCExpr::VK_LO:
1389
1390
case PPCMCExpr::VK_HI:
1390
- Variant = PPCMCExpr::VK_HI;
1391
- break ;
1392
1391
case PPCMCExpr::VK_HA:
1393
- Variant = PPCMCExpr::VK_HA;
1394
- break ;
1395
1392
case PPCMCExpr::VK_HIGH:
1396
- Variant = PPCMCExpr::VK_HIGH;
1397
- break ;
1398
1393
case PPCMCExpr::VK_HIGHA:
1399
- Variant = PPCMCExpr::VK_HIGHA;
1400
- break ;
1401
1394
case PPCMCExpr::VK_HIGHER:
1402
- Variant = PPCMCExpr::VK_HIGHER;
1403
- break ;
1404
1395
case PPCMCExpr::VK_HIGHERA:
1405
- Variant = PPCMCExpr::VK_HIGHERA;
1406
- break ;
1407
1396
case PPCMCExpr::VK_HIGHEST:
1408
- Variant = PPCMCExpr::VK_HIGHEST;
1409
- break ;
1410
1397
case PPCMCExpr::VK_HIGHESTA:
1411
- Variant = PPCMCExpr::VK_HIGHESTA;
1412
- break ;
1413
- default :
1414
- return nullptr ;
1398
+ if (Spec == PPCMCExpr::VK_None)
1399
+ Spec = getSpecifier (SRE);
1400
+ else
1401
+ Error (E->getLoc (), " cannot contain more than one relocation specifier" );
1402
+ return MCSymbolRefExpr::create (&SRE->getSymbol (), Context);
1415
1403
}
1416
-
1417
- return MCSymbolRefExpr::create (&SRE->getSymbol (), Context);
1404
+ break ;
1418
1405
}
1419
1406
1420
1407
case MCExpr::Unary: {
1421
1408
const MCUnaryExpr *UE = cast<MCUnaryExpr>(E);
1422
- const MCExpr *Sub = extractSpecifier (UE->getSubExpr (), Variant );
1423
- if (!Sub )
1424
- return nullptr ;
1425
- return MCUnaryExpr::create (UE-> getOpcode (), Sub, Context) ;
1409
+ const MCExpr *Sub = extractSpecifier (UE->getSubExpr (), Spec );
1410
+ if (Spec != PPCMCExpr::VK_None )
1411
+ return MCUnaryExpr::create (UE-> getOpcode (), Sub, Context) ;
1412
+ break ;
1426
1413
}
1427
1414
1428
1415
case MCExpr::Binary: {
1429
1416
const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
1430
- PPCMCExpr::Specifier LHSVariant, RHSVariant;
1431
- const MCExpr *LHS = extractSpecifier (BE->getLHS (), LHSVariant);
1432
- const MCExpr *RHS = extractSpecifier (BE->getRHS (), RHSVariant);
1433
-
1434
- if (!LHS && !RHS)
1435
- return nullptr ;
1436
-
1437
- if (!LHS) LHS = BE->getLHS ();
1438
- if (!RHS) RHS = BE->getRHS ();
1439
-
1440
- if (LHSVariant == PPCMCExpr::VK_None)
1441
- Variant = RHSVariant;
1442
- else if (RHSVariant == PPCMCExpr::VK_None)
1443
- Variant = LHSVariant;
1444
- else if (LHSVariant == RHSVariant)
1445
- Variant = LHSVariant;
1446
- else
1447
- return nullptr ;
1448
-
1449
- return MCBinaryExpr::create (BE->getOpcode (), LHS, RHS, Context);
1417
+ const MCExpr *LHS = extractSpecifier (BE->getLHS (), Spec);
1418
+ const MCExpr *RHS = extractSpecifier (BE->getRHS (), Spec);
1419
+ if (Spec != PPCMCExpr::VK_None)
1420
+ return MCBinaryExpr::create (BE->getOpcode (), LHS, RHS, Context);
1421
+ break ;
1450
1422
}
1451
1423
}
1452
1424
1453
- llvm_unreachable ( " Invalid expression kind! " ) ;
1425
+ return E ;
1454
1426
}
1455
1427
1456
1428
// / This differs from the default "parseExpression" in that it handles
1457
- // / modifiers .
1429
+ // / specifiers .
1458
1430
bool PPCAsmParser::parseExpression (const MCExpr *&EVal) {
1459
1431
// (ELF Platforms)
1460
1432
// Handle \code @l/@ha \endcode
1461
1433
if (getParser ().parseExpression (EVal))
1462
1434
return true ;
1463
1435
1464
- PPCMCExpr::Specifier Spec ;
1436
+ auto Spec = PPCMCExpr::VK_None ;
1465
1437
const MCExpr *E = extractSpecifier (EVal, Spec);
1466
- if (E )
1438
+ if (Spec != PPCMCExpr::VK_None )
1467
1439
EVal = PPCMCExpr::create (Spec, E, getParser ().getContext ());
1468
1440
1469
1441
return false ;
0 commit comments