[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