[llvm] ad3b023 - [Sparc] Support relocatable expressions in the assembler

Daniel Cederman via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 10 05:54:03 PST 2021


Author: Daniel Cederman
Date: 2021-02-10T14:52:44+01:00
New Revision: ad3b023c8898b9399717e8eb45971928b5bfe4c3

URL: https://github.com/llvm/llvm-project/commit/ad3b023c8898b9399717e8eb45971928b5bfe4c3
DIFF: https://github.com/llvm/llvm-project/commit/ad3b023c8898b9399717e8eb45971928b5bfe4c3.diff

LOG: [Sparc] Support relocatable expressions in the assembler

Allow assembler expressions to start with an identifier. This allows for expressions such as
```
b symbol + 4
```
and
```
mov symEnd - symStart, %g1
```

The patch builds upon https://reviews.llvm.org/D47136.

Reviewed By: joerg

Differential Revision: https://reviews.llvm.org/D47458

Added: 
    

Modified: 
    llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
    llvm/test/MC/Sparc/sparc-assembly-exprs.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
index 5f1bf316e871..5e145b54592e 100644
--- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
+++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
@@ -1054,18 +1054,12 @@ SparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op,
   case AsmToken::Integer:
   case AsmToken::LParen:
   case AsmToken::Dot:
-    if (!getParser().parseExpression(EVal, E))
-      Op = SparcOperand::CreateImm(EVal, S, E);
-    break;
-
-  case AsmToken::Identifier: {
-    StringRef Identifier;
-    if (!getParser().parseIdentifier(Identifier)) {
-      E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
-      MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier);
+  case AsmToken::Identifier:
+    if (getParser().parseExpression(EVal, E))
+      break;
 
-      const MCExpr *Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None,
-                                                  getContext());
+    int64_t Res;
+    if (!EVal->evaluateAsAbsolute(Res)) {
       SparcMCExpr::VariantKind Kind = SparcMCExpr::VK_Sparc_13;
 
       if (getContext().getObjectFileInfo()->isPositionIndependent()) {
@@ -1074,14 +1068,11 @@ SparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op,
         else
           Kind = SparcMCExpr::VK_Sparc_GOT13;
       }
-
-      Res = SparcMCExpr::create(Kind, Res, getContext());
-
-      Op = SparcOperand::CreateImm(Res, S, E);
+      EVal = SparcMCExpr::create(Kind, EVal, getContext());
     }
+    Op = SparcOperand::CreateImm(EVal, S, E);
     break;
   }
-  }
   return (Op) ? MatchOperand_Success : MatchOperand_ParseFail;
 }
 

diff  --git a/llvm/test/MC/Sparc/sparc-assembly-exprs.s b/llvm/test/MC/Sparc/sparc-assembly-exprs.s
index 1729ee48dcf8..36cd1d55c71f 100644
--- a/llvm/test/MC/Sparc/sparc-assembly-exprs.s
+++ b/llvm/test/MC/Sparc/sparc-assembly-exprs.s
@@ -1,10 +1,43 @@
 ! RUN: llvm-mc %s -arch=sparc   -show-encoding | FileCheck %s
+! RUN: llvm-mc %s -arch=sparc -filetype=obj | llvm-objdump -r -d - | FileCheck %s --check-prefix=OBJDUMP
 
         ! CHECK: mov 1033, %o1  ! encoding: [0x92,0x10,0x24,0x09]
         mov      (0x400|9), %o1
         ! CHECK: mov 60, %o2    ! encoding: [0x94,0x10,0x20,0x3c]
         mov      ((12+3)<<2), %o2
 
+        ! CHECK:   ba      symStart+4           ! encoding: [0x10,0b10AAAAAA,A,A]
+        ! CHECK:   fixup A - offset: 0, value: symStart+4, kind: fixup_sparc_br22
+        ! OBJDUMP: ba    1
+symStart:
+        b        symStart + 4
+
+        ! CHECK:   mov     symEnd-symStart, %g1 ! encoding: [0x82,0x10,0b001AAAAA,A]
+        ! CHECK:   fixup A - offset: 0, value: symEnd-symStart, kind: fixup_sparc_13
+        ! OBJDUMP: mov	   24, %g1
+        mov      symEnd - symStart, %g1
+
+        ! CHECK:   sethi %hi(sym+10), %g2       ! encoding: [0x05,0b00AAAAAA,A,A]
+        ! CHECK:   fixup A - offset: 0, value: %hi(sym+10), kind: fixup_sparc_hi22
+        ! OBJDUMP: R_SPARC_HI22	sym+0xa
+        sethi    %hi(sym + 10), %g2
+
+        ! CHECK:   call foo+40                  ! encoding: [0b01AAAAAA,A,A,A]
+        ! CHECK:   fixup A - offset: 0, value: foo+40, kind: fixup_sparc_call30
+        ! OBJDUMP: R_SPARC_WDISP30 foo+0x28
+        call     foo + 40
+
+        ! CHECK:   add %g1, val+100, %g1        ! encoding: [0x82,0x00,0b011AAAAA,A]
+        ! CHECK:   fixup A - offset: 0, value: val+100, kind: fixup_sparc_13
+        ! OBJDUMP: R_SPARC_13 val+0x64
+        add      %g1, val + 100, %g1
+
+        ! CHECK:   add %g1, 100+val, %g2        ! encoding: [0x84,0x00,0b011AAAAA,A]
+        ! CHECK:   fixup A - offset: 0, value: 100+val, kind: fixup_sparc_13
+        ! OBJDUMP: R_SPARC_13	val+0x64
+        add      %g1, 100 + val, %g2
+symEnd:
+
 ! "." is exactly like a temporary symbol equated to the current line.
 ! RUN: llvm-mc %s -arch=sparc | FileCheck %s --check-prefix=DOTEXPR
 


        


More information about the llvm-commits mailing list