@@ -338,7 +338,7 @@ class AArch64AsmParser : public MCTargetAsmParser {
338
338
bool parsePrimaryExpr (const MCExpr *&Res, SMLoc &EndLoc) override ;
339
339
340
340
static bool classifySymbolRef (const MCExpr *Expr,
341
- AArch64MCExpr::VariantKind &ELFRefKind ,
341
+ AArch64MCExpr::Specifier &ELFSpec ,
342
342
MCSymbolRefExpr::VariantKind &DarwinRefKind,
343
343
int64_t &Addend);
344
344
};
@@ -888,30 +888,26 @@ class AArch64Operand : public MCParsedAsmOperand {
888
888
}
889
889
890
890
bool isSymbolicUImm12Offset (const MCExpr *Expr) const {
891
- AArch64MCExpr::VariantKind ELFRefKind ;
891
+ AArch64MCExpr::Specifier ELFSpec ;
892
892
MCSymbolRefExpr::VariantKind DarwinRefKind;
893
893
int64_t Addend;
894
- if (!AArch64AsmParser::classifySymbolRef (Expr, ELFRefKind , DarwinRefKind,
895
- Addend)) {
894
+ if (!AArch64AsmParser::classifySymbolRef (Expr, ELFSpec , DarwinRefKind,
895
+ Addend)) {
896
896
// If we don't understand the expression, assume the best and
897
897
// let the fixup and relocation code deal with it.
898
898
return true ;
899
899
}
900
900
901
901
if (DarwinRefKind == MCSymbolRefExpr::VK_PAGEOFF ||
902
- ELFRefKind == AArch64MCExpr::VK_LO12 ||
903
- ELFRefKind == AArch64MCExpr::VK_GOT_LO12 ||
904
- ELFRefKind == AArch64MCExpr::VK_GOT_AUTH_LO12 ||
905
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12 ||
906
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12_NC ||
907
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12 ||
908
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12_NC ||
909
- ELFRefKind == AArch64MCExpr::VK_GOTTPREL_LO12_NC ||
910
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_LO12 ||
911
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_AUTH_LO12 ||
912
- ELFRefKind == AArch64MCExpr::VK_SECREL_LO12 ||
913
- ELFRefKind == AArch64MCExpr::VK_SECREL_HI12 ||
914
- ELFRefKind == AArch64MCExpr::VK_GOT_PAGE_LO15) {
902
+ llvm::is_contained (
903
+ {AArch64MCExpr::VK_LO12, AArch64MCExpr::VK_GOT_LO12,
904
+ AArch64MCExpr::VK_GOT_AUTH_LO12, AArch64MCExpr::VK_DTPREL_LO12,
905
+ AArch64MCExpr::VK_DTPREL_LO12_NC, AArch64MCExpr::VK_TPREL_LO12,
906
+ AArch64MCExpr::VK_TPREL_LO12_NC,
907
+ AArch64MCExpr::VK_GOTTPREL_LO12_NC, AArch64MCExpr::VK_TLSDESC_LO12,
908
+ AArch64MCExpr::VK_TLSDESC_AUTH_LO12, AArch64MCExpr::VK_SECREL_LO12,
909
+ AArch64MCExpr::VK_SECREL_HI12, AArch64MCExpr::VK_GOT_PAGE_LO15},
910
+ ELFSpec)) {
915
911
// Note that we don't range-check the addend. It's adjusted modulo page
916
912
// size when converted, so there is no "out of range" condition when using
917
913
// @pageoff.
@@ -1009,26 +1005,24 @@ class AArch64Operand : public MCParsedAsmOperand {
1009
1005
Expr = getImm ();
1010
1006
}
1011
1007
1012
- AArch64MCExpr::VariantKind ELFRefKind ;
1008
+ AArch64MCExpr::Specifier ELFSpec ;
1013
1009
MCSymbolRefExpr::VariantKind DarwinRefKind;
1014
1010
int64_t Addend;
1015
- if (AArch64AsmParser::classifySymbolRef (Expr, ELFRefKind ,
1016
- DarwinRefKind, Addend)) {
1011
+ if (AArch64AsmParser::classifySymbolRef (Expr, ELFSpec, DarwinRefKind ,
1012
+ Addend)) {
1017
1013
return DarwinRefKind == MCSymbolRefExpr::VK_PAGEOFF ||
1018
1014
DarwinRefKind == MCSymbolRefExpr::VK_TLVPPAGEOFF ||
1019
1015
(DarwinRefKind == MCSymbolRefExpr::VK_GOTPAGEOFF && Addend == 0 ) ||
1020
- ELFRefKind == AArch64MCExpr::VK_LO12 ||
1021
- ELFRefKind == AArch64MCExpr::VK_GOT_AUTH_LO12 ||
1022
- ELFRefKind == AArch64MCExpr::VK_DTPREL_HI12 ||
1023
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12 ||
1024
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12_NC ||
1025
- ELFRefKind == AArch64MCExpr::VK_TPREL_HI12 ||
1026
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12 ||
1027
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12_NC ||
1028
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_LO12 ||
1029
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_AUTH_LO12 ||
1030
- ELFRefKind == AArch64MCExpr::VK_SECREL_HI12 ||
1031
- ELFRefKind == AArch64MCExpr::VK_SECREL_LO12;
1016
+ llvm::is_contained (
1017
+ {AArch64MCExpr::VK_LO12, AArch64MCExpr::VK_GOT_AUTH_LO12,
1018
+ AArch64MCExpr::VK_DTPREL_HI12, AArch64MCExpr::VK_DTPREL_LO12,
1019
+ AArch64MCExpr::VK_DTPREL_LO12_NC,
1020
+ AArch64MCExpr::VK_TPREL_HI12, AArch64MCExpr::VK_TPREL_LO12,
1021
+ AArch64MCExpr::VK_TPREL_LO12_NC,
1022
+ AArch64MCExpr::VK_TLSDESC_LO12,
1023
+ AArch64MCExpr::VK_TLSDESC_AUTH_LO12,
1024
+ AArch64MCExpr::VK_SECREL_HI12, AArch64MCExpr::VK_SECREL_LO12},
1025
+ ELFSpec);
1032
1026
}
1033
1027
1034
1028
// If it's a constant, it should be a real immediate in range.
@@ -1121,22 +1115,21 @@ class AArch64Operand : public MCParsedAsmOperand {
1121
1115
return (Val >= -((1 <<(N-1 )) << 2 ) && Val <= (((1 <<(N-1 ))-1 ) << 2 ));
1122
1116
}
1123
1117
1124
- bool
1125
- isMovWSymbol (ArrayRef<AArch64MCExpr::VariantKind> AllowedModifiers) const {
1118
+ bool isMovWSymbol (ArrayRef<AArch64MCExpr::Specifier> AllowedModifiers) const {
1126
1119
if (!isImm ())
1127
1120
return false ;
1128
1121
1129
- AArch64MCExpr::VariantKind ELFRefKind ;
1122
+ AArch64MCExpr::Specifier ELFSpec ;
1130
1123
MCSymbolRefExpr::VariantKind DarwinRefKind;
1131
1124
int64_t Addend;
1132
- if (!AArch64AsmParser::classifySymbolRef (getImm (), ELFRefKind ,
1133
- DarwinRefKind, Addend)) {
1125
+ if (!AArch64AsmParser::classifySymbolRef (getImm (), ELFSpec, DarwinRefKind ,
1126
+ Addend)) {
1134
1127
return false ;
1135
1128
}
1136
1129
if (DarwinRefKind != MCSymbolRefExpr::VK_None)
1137
1130
return false ;
1138
1131
1139
- return llvm::is_contained (AllowedModifiers, ELFRefKind );
1132
+ return llvm::is_contained (AllowedModifiers, ELFSpec );
1140
1133
}
1141
1134
1142
1135
bool isMovWSymbolG3 () const {
@@ -3303,12 +3296,12 @@ ParseStatus AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
3303
3296
if (parseSymbolicImmVal (Expr))
3304
3297
return ParseStatus::Failure;
3305
3298
3306
- AArch64MCExpr::VariantKind ELFRefKind ;
3299
+ AArch64MCExpr::Specifier ELFSpec ;
3307
3300
MCSymbolRefExpr::VariantKind DarwinRefKind;
3308
3301
int64_t Addend;
3309
- if (classifySymbolRef (Expr, ELFRefKind , DarwinRefKind, Addend)) {
3302
+ if (classifySymbolRef (Expr, ELFSpec , DarwinRefKind, Addend)) {
3310
3303
if (DarwinRefKind == MCSymbolRefExpr::VK_None &&
3311
- ELFRefKind == AArch64MCExpr::VK_INVALID) {
3304
+ ELFSpec == AArch64MCExpr::VK_INVALID) {
3312
3305
// No modifier was specified at all; this is the syntax for an ELF basic
3313
3306
// ADRP relocation (unfortunately).
3314
3307
Expr =
@@ -3320,13 +3313,13 @@ ParseStatus AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
3320
3313
} else if (DarwinRefKind != MCSymbolRefExpr::VK_PAGE &&
3321
3314
DarwinRefKind != MCSymbolRefExpr::VK_GOTPAGE &&
3322
3315
DarwinRefKind != MCSymbolRefExpr::VK_TLVPPAGE &&
3323
- ELFRefKind != AArch64MCExpr::VK_ABS_PAGE_NC &&
3324
- ELFRefKind != AArch64MCExpr::VK_GOT_PAGE &&
3325
- ELFRefKind != AArch64MCExpr::VK_GOT_AUTH_PAGE &&
3326
- ELFRefKind != AArch64MCExpr::VK_GOT_PAGE_LO15 &&
3327
- ELFRefKind != AArch64MCExpr::VK_GOTTPREL_PAGE &&
3328
- ELFRefKind != AArch64MCExpr::VK_TLSDESC_PAGE &&
3329
- ELFRefKind != AArch64MCExpr::VK_TLSDESC_AUTH_PAGE) {
3316
+ ELFSpec != AArch64MCExpr::VK_ABS_PAGE_NC &&
3317
+ ELFSpec != AArch64MCExpr::VK_GOT_PAGE &&
3318
+ ELFSpec != AArch64MCExpr::VK_GOT_AUTH_PAGE &&
3319
+ ELFSpec != AArch64MCExpr::VK_GOT_PAGE_LO15 &&
3320
+ ELFSpec != AArch64MCExpr::VK_GOTTPREL_PAGE &&
3321
+ ELFSpec != AArch64MCExpr::VK_TLSDESC_PAGE &&
3322
+ ELFSpec != AArch64MCExpr::VK_TLSDESC_AUTH_PAGE) {
3330
3323
// The operand must be an @page or @gotpage qualified symbolref.
3331
3324
return Error (S, " page or gotpage label reference expected" );
3332
3325
}
@@ -3357,16 +3350,16 @@ ParseStatus AArch64AsmParser::tryParseAdrLabel(OperandVector &Operands) {
3357
3350
if (parseSymbolicImmVal (Expr))
3358
3351
return ParseStatus::Failure;
3359
3352
3360
- AArch64MCExpr::VariantKind ELFRefKind ;
3353
+ AArch64MCExpr::Specifier ELFSpec ;
3361
3354
MCSymbolRefExpr::VariantKind DarwinRefKind;
3362
3355
int64_t Addend;
3363
- if (classifySymbolRef (Expr, ELFRefKind , DarwinRefKind, Addend)) {
3356
+ if (classifySymbolRef (Expr, ELFSpec , DarwinRefKind, Addend)) {
3364
3357
if (DarwinRefKind == MCSymbolRefExpr::VK_None &&
3365
- ELFRefKind == AArch64MCExpr::VK_INVALID) {
3358
+ ELFSpec == AArch64MCExpr::VK_INVALID) {
3366
3359
// No modifier was specified at all; this is the syntax for an ELF basic
3367
3360
// ADR relocation (unfortunately).
3368
3361
Expr = AArch64MCExpr::create (Expr, AArch64MCExpr::VK_ABS, getContext ());
3369
- } else if (ELFRefKind != AArch64MCExpr::VK_GOT_AUTH_PAGE) {
3362
+ } else if (ELFSpec != AArch64MCExpr::VK_GOT_AUTH_PAGE) {
3370
3363
// For tiny code model, we use :got_auth: operator to fill 21-bit imm of
3371
3364
// adr. It's not actually GOT entry page address but the GOT address
3372
3365
// itself - we just share the same variant kind with :got_auth: operator
@@ -4407,7 +4400,7 @@ bool AArch64AsmParser::parseRegister(OperandVector &Operands) {
4407
4400
4408
4401
bool AArch64AsmParser::parseSymbolicImmVal (const MCExpr *&ImmVal) {
4409
4402
bool HasELFModifier = false ;
4410
- AArch64MCExpr::VariantKind RefKind;
4403
+ AArch64MCExpr::Specifier RefKind;
4411
4404
4412
4405
if (parseOptionalToken (AsmToken::Colon)) {
4413
4406
HasELFModifier = true ;
@@ -4417,7 +4410,7 @@ bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
4417
4410
4418
4411
std::string LowerCase = getTok ().getIdentifier ().lower ();
4419
4412
RefKind =
4420
- StringSwitch<AArch64MCExpr::VariantKind >(LowerCase)
4413
+ StringSwitch<AArch64MCExpr::Specifier >(LowerCase)
4421
4414
.Case (" lo12" , AArch64MCExpr::VK_LO12)
4422
4415
.Case (" abs_g3" , AArch64MCExpr::VK_ABS_G3)
4423
4416
.Case (" abs_g2" , AArch64MCExpr::VK_ABS_G2)
@@ -5823,10 +5816,10 @@ bool AArch64AsmParser::validateInstruction(MCInst &Inst, SMLoc &IDLoc,
5823
5816
// some slight duplication here.
5824
5817
if (Inst.getOperand (2 ).isExpr ()) {
5825
5818
const MCExpr *Expr = Inst.getOperand (2 ).getExpr ();
5826
- AArch64MCExpr::VariantKind ELFRefKind ;
5819
+ AArch64MCExpr::Specifier ELFSpec ;
5827
5820
MCSymbolRefExpr::VariantKind DarwinRefKind;
5828
5821
int64_t Addend;
5829
- if (classifySymbolRef (Expr, ELFRefKind , DarwinRefKind, Addend)) {
5822
+ if (classifySymbolRef (Expr, ELFSpec , DarwinRefKind, Addend)) {
5830
5823
5831
5824
// Only allow these with ADDXri.
5832
5825
if ((DarwinRefKind == MCSymbolRefExpr::VK_PAGEOFF ||
@@ -5835,18 +5828,15 @@ bool AArch64AsmParser::validateInstruction(MCInst &Inst, SMLoc &IDLoc,
5835
5828
return false ;
5836
5829
5837
5830
// Only allow these with ADDXri/ADDWri
5838
- if ((ELFRefKind == AArch64MCExpr::VK_LO12 ||
5839
- ELFRefKind == AArch64MCExpr::VK_GOT_AUTH_LO12 ||
5840
- ELFRefKind == AArch64MCExpr::VK_DTPREL_HI12 ||
5841
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12 ||
5842
- ELFRefKind == AArch64MCExpr::VK_DTPREL_LO12_NC ||
5843
- ELFRefKind == AArch64MCExpr::VK_TPREL_HI12 ||
5844
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12 ||
5845
- ELFRefKind == AArch64MCExpr::VK_TPREL_LO12_NC ||
5846
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_LO12 ||
5847
- ELFRefKind == AArch64MCExpr::VK_TLSDESC_AUTH_LO12 ||
5848
- ELFRefKind == AArch64MCExpr::VK_SECREL_LO12 ||
5849
- ELFRefKind == AArch64MCExpr::VK_SECREL_HI12) &&
5831
+ if (llvm::is_contained (
5832
+ {AArch64MCExpr::VK_LO12, AArch64MCExpr::VK_GOT_AUTH_LO12,
5833
+ AArch64MCExpr::VK_DTPREL_HI12, AArch64MCExpr::VK_DTPREL_LO12,
5834
+ AArch64MCExpr::VK_DTPREL_LO12_NC, AArch64MCExpr::VK_TPREL_HI12,
5835
+ AArch64MCExpr::VK_TPREL_LO12, AArch64MCExpr::VK_TPREL_LO12_NC,
5836
+ AArch64MCExpr::VK_TLSDESC_LO12,
5837
+ AArch64MCExpr::VK_TLSDESC_AUTH_LO12,
5838
+ AArch64MCExpr::VK_SECREL_LO12, AArch64MCExpr::VK_SECREL_HI12},
5839
+ ELFSpec) &&
5850
5840
(Inst.getOpcode () == AArch64::ADDXri ||
5851
5841
Inst.getOpcode () == AArch64::ADDWri))
5852
5842
return false ;
@@ -8202,17 +8192,15 @@ bool AArch64AsmParser::parseAuthExpr(const MCExpr *&Res, SMLoc &EndLoc) {
8202
8192
return false ;
8203
8193
}
8204
8194
8205
- bool
8206
- AArch64AsmParser::classifySymbolRef (const MCExpr *Expr,
8207
- AArch64MCExpr::VariantKind &ELFRefKind,
8208
- MCSymbolRefExpr::VariantKind &DarwinRefKind,
8209
- int64_t &Addend) {
8210
- ELFRefKind = AArch64MCExpr::VK_INVALID;
8195
+ bool AArch64AsmParser::classifySymbolRef (
8196
+ const MCExpr *Expr, AArch64MCExpr::Specifier &ELFSpec,
8197
+ MCSymbolRefExpr::VariantKind &DarwinRefKind, int64_t &Addend) {
8198
+ ELFSpec = AArch64MCExpr::VK_INVALID;
8211
8199
DarwinRefKind = MCSymbolRefExpr::VK_None;
8212
8200
Addend = 0 ;
8213
8201
8214
8202
if (const AArch64MCExpr *AE = dyn_cast<AArch64MCExpr>(Expr)) {
8215
- ELFRefKind = AE->getKind ();
8203
+ ELFSpec = AE->getSpecifier ();
8216
8204
Expr = AE->getSubExpr ();
8217
8205
}
8218
8206
@@ -8229,9 +8217,9 @@ AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
8229
8217
if (!Relocatable || Res.getSymB ())
8230
8218
return false ;
8231
8219
8232
- // Treat expressions with an ELFRefKind (like ":abs_g1:3", or
8220
+ // Treat expressions with an ELFSpec (like ":abs_g1:3", or
8233
8221
// ":abs_g1:x" where x is constant) as symbolic even if there is no symbol.
8234
- if (!Res.getSymA () && ELFRefKind == AArch64MCExpr::VK_INVALID)
8222
+ if (!Res.getSymA () && ELFSpec == AArch64MCExpr::VK_INVALID)
8235
8223
return false ;
8236
8224
8237
8225
if (Res.getSymA ())
@@ -8240,7 +8228,7 @@ AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
8240
8228
8241
8229
// It's some symbol reference + a constant addend, but really
8242
8230
// shouldn't use both Darwin and ELF syntax.
8243
- return ELFRefKind == AArch64MCExpr::VK_INVALID ||
8231
+ return ELFSpec == AArch64MCExpr::VK_INVALID ||
8244
8232
DarwinRefKind == MCSymbolRefExpr::VK_None;
8245
8233
}
8246
8234
0 commit comments