[llvm] 3fd0d22 - AArch64AsmParser: Restore Lsym at page-offset support
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 9 23:13:11 PDT 2025
Author: Fangrui Song
Date: 2025-04-09T23:13:06-07:00
New Revision: 3fd0d22d74027c00bd2365ea1691dc530bb9709a
URL: https://github.com/llvm/llvm-project/commit/3fd0d22d74027c00bd2365ea1691dc530bb9709a
DIFF: https://github.com/llvm/llvm-project/commit/3fd0d22d74027c00bd2365ea1691dc530bb9709a.diff
LOG: AArch64AsmParser: Restore Lsym at page-offset support
https://github.com/llvm/llvm-project/pull/134202 removed support for
`sym at page-offset` in instruction operands. This change is generally
reasonable since subtracting an offset from a symbol typically doesn’t
make sense for Mach-O due to its .subsections_via_symbols mechanism, which treats
them as separate atoms.
However, BoringSSL relies on a temporary symbol with a negative offset,
which can be meaningful when the symbol and the referenced location are
within the same atom.
```
../../third_party/boringssl/src/gen/bcm/p256-armv8-asm-apple.S:1160:25: error: unexpected token in argument list
adrp x23,Lone_mont at PAGE-64
```
It's worth noting that expressions involving @ can be complex and
brittle in MCParser, and much of the Mach-O @ offsets remains
under-tested.
* Allow default argument for parsePrimaryExpr. The argument, used by the niche llvm-ml,
should not require other targets to adapt.
Added:
Modified:
llvm/include/llvm/MC/MCParser/MCAsmParser.h
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/test/MC/AArch64/arm64-diags.s
llvm/test/MC/MachO/AArch64/darwin-ARM64-reloc.s
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h
index 952cfcf77e4fc..990bd59b76926 100644
--- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h
+++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h
@@ -308,7 +308,7 @@ class MCAsmParser {
/// on error.
/// \return - False on success.
virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
- AsmTypeInfo *TypeInfo) = 0;
+ AsmTypeInfo *TypeInfo = nullptr) = 0;
/// Parse an arbitrary expression, assuming that an initial '(' has
/// already been consumed.
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 6e2f5fdebcf88..e178c5027571a 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -4483,12 +4483,16 @@ bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
if (getParser().parseAtSpecifier(ImmVal, EndLoc))
return true;
const MCExpr *Term;
- if (parseOptionalToken(AsmToken::Plus)) {
- if (getParser().parseExpression(Term, EndLoc))
- return true;
- ImmVal =
- MCBinaryExpr::create(MCBinaryExpr::Add, ImmVal, Term, getContext());
- }
+ MCBinaryExpr::Opcode Opcode;
+ if (parseOptionalToken(AsmToken::Plus))
+ Opcode = MCBinaryExpr::Add;
+ else if (parseOptionalToken(AsmToken::Minus))
+ Opcode = MCBinaryExpr::Sub;
+ else
+ return false;
+ if (getParser().parsePrimaryExpr(Term, EndLoc))
+ return true;
+ ImmVal = MCBinaryExpr::create(Opcode, ImmVal, Term, getContext());
}
return false;
@@ -5026,11 +5030,15 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
return true;
if (getParser().parseAtSpecifier(IdVal, E))
return true;
- if (parseOptionalToken(AsmToken::Plus)) {
- if (getParser().parseExpression(Term, E))
+ std::optional<MCBinaryExpr::Opcode> Opcode;
+ if (parseOptionalToken(AsmToken::Plus))
+ Opcode = MCBinaryExpr::Add;
+ else if (parseOptionalToken(AsmToken::Minus))
+ Opcode = MCBinaryExpr::Sub;
+ if (Opcode) {
+ if (getParser().parsePrimaryExpr(Term, E))
return true;
- IdVal =
- MCBinaryExpr::create(MCBinaryExpr::Add, IdVal, Term, getContext());
+ IdVal = MCBinaryExpr::create(*Opcode, IdVal, Term, getContext());
}
Operands.push_back(AArch64Operand::CreateImm(IdVal, S, E, getContext()));
diff --git a/llvm/test/MC/AArch64/arm64-diags.s b/llvm/test/MC/AArch64/arm64-diags.s
index 591ff64eb3389..bcd42d98cd5f3 100644
--- a/llvm/test/MC/AArch64/arm64-diags.s
+++ b/llvm/test/MC/AArch64/arm64-diags.s
@@ -366,6 +366,9 @@ subs x20, x30, sym at PAGEOFF
; CHECK-ERRORS: subs x20, x30, sym at PAGEOFF
; CHECK-ERRORS: ^
+add w3, w5, sym at PAGEOFF - 3-2
+; CHECK-ERRORS: [[#@LINE-1]]:28: error: unexpected token in argument list
+
tbl v0.8b, { v1 }, v0.8b
tbl v0.16b, { v1.8b, v2.8b, v3.8b }, v0.16b
tbx v3.16b, { v12.8b, v13.8b, v14.8b }, v6.8b
diff --git a/llvm/test/MC/MachO/AArch64/darwin-ARM64-reloc.s b/llvm/test/MC/MachO/AArch64/darwin-ARM64-reloc.s
index a9d988d63015d..8b1aff99043fc 100644
--- a/llvm/test/MC/MachO/AArch64/darwin-ARM64-reloc.s
+++ b/llvm/test/MC/MachO/AArch64/darwin-ARM64-reloc.s
@@ -17,9 +17,13 @@ _fred:
ldr w2, [x3, _data_ext at gotpageoff]
adrp x0, L_.str at PAGE
+ adrp x3, L1 at PAGE - 5
+ add x3, x3, L1 at pageoff - (4+1)
+
.data
_data:
.quad _foo
+L1:
.quad _foo + 4
.quad _foo - _bar
.quad _foo - _bar + 4
@@ -36,6 +40,34 @@ L_.str:
; CHECK: Relocations [
; CHECK-NEXT: Section __text {
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Offset: 0x2C
+; CHECK-NEXT: PCRel: 0
+; CHECK-NEXT: Length: 2
+; CHECK-NEXT: Type: ARM64_RELOC_ADDEND (10)
+; CHECK-NEXT: Section: __cstring (3)
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Offset: 0x2C
+; CHECK-NEXT: PCRel: 0
+; CHECK-NEXT: Length: 2
+; CHECK-NEXT: Type: ARM64_RELOC_PAGEOFF12 (4)
+; CHECK-NEXT: Symbol: _data (2)
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Offset: 0x28
+; CHECK-NEXT: PCRel: 0
+; CHECK-NEXT: Length: 2
+; CHECK-NEXT: Type: ARM64_RELOC_ADDEND (10)
+; CHECK-NEXT: Section: __cstring (3)
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Offset: 0x28
+; CHECK-NEXT: PCRel: 1
+; CHECK-NEXT: Length: 2
+; CHECK-NEXT: Type: ARM64_RELOC_PAGE21 (3)
+; CHECK-NEXT: Symbol: _data (2)
+; CHECK-NEXT: }
; CHECK-NEXT: Relocation {
; CHECK-NEXT: Offset: 0x24
; CHECK-NEXT: PCRel: 1
More information about the llvm-commits
mailing list